@wwtdev/bsds-components-vue3 2.40.1 → 2.40.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"bsds-components.js","sources":["../src/components/selectors.js","../src/components/accordion/defs-accordion.js","../src/components/alert/defs-alert.js","../src/components/badge/defs-badge.js","../src/components/banner/defs-banner.js","../src/components/button/defs-button.js","../src/components/calendar/defs-calendar.js","../src/components/circle-button/defs-circle-button.js","../src/components/dropdown-option-builder/defs-dropdown-option-builder.js","../src/components/empty-state/defs-empty-state.js","../src/components/form-container/defs-form-container.js","../src/components/navigation/defs-horizontal-navigation.js","../src/components/inline-tabs/defs-inline-tab.js","../src/components/inline-tabs/defs-inline-tab-group.js","../src/components/modal/defs-modal.js","../src/components/profile/defs-profile.js","../src/components/navigation/defs-vertical-navigation.js","../src/composables/genId.js","../src/composables/deprecated.js","../src/components/accordion/BsAccordion.vue","../src/composables/buttonOrLink.js","../src/composables/clientRouter.js","../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/composables/filterAttrs.js","../src/components/calendar/BsCalendar.vue","../src/components/chart-table/BsChartTable.vue","../src/composables/keydown.js","../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/composables/clickAway.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/composables/mutationObserver.js","../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/focus-guard/BsFocusGuard.vue","../src/composables/navigationUtils.js","../src/components/navigation/NavigationLink.vue","../src/components/navigation/BsHorizontalNavigation.vue","../src/components/icon-gradient-wrapper/BsIconGradientWrapper.vue","../src/components/inline-tabs/provider-key-inline-tabs.js","../src/components/inline-tabs/BsInlineTab.vue","../src/components/inline-tabs/BsInlineTabGroup.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/provider-keys-table.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/navigation/BsVerticalNavigation.vue"],"sourcesContent":["/* 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};","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n controlled: {\n default: false,\n description: `Use with \\`openItem\\` prop. Set to \\`true\\` when several\n accordions are grouped together and only one accordion should be open at a\n time.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n headerText: {\n default: '',\n description: `Panel title text. When using the \\`header\\` slot alternative,\n do not use this prop as it will be overwritten.`,\n type: String,\n typeDef: 'string',\n },\n icon: {\n default: '',\n description: `Icon to display on the left. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`icon\\` slot\n is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n openItem: {\n default: false,\n description: `Use with \\`controlled\\` prop. Pass in \\`true\\` when this\n accordion should open. When using this prop, do not use\n \\`openItemId\\`.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n openItemId: {\n default: '',\n description: `Use with \\`controlled\\` prop. Pass in the id of the accordion\n that should be open. When using this prop, do not use\n \\`openItem\\`.`,\n type: String,\n typeDef: 'string',\n },\n stacked: {\n default: false,\n description: `Set to \\`true\\` when used in a stack of accordions\n bordering one another.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n // DEPRECATED\n headingLevel: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = {\n toggled: {\n description: `Emits the ID of the accordion when the accordion is toggled.`,\n payloadType: 'string',\n },\n}\n\nexport const slotDefinitions = {\n default: {\n description: `The content of the accordion.`\n },\n header: {\n description: `Custom header content. Alternative to the \\`headerText\\`\n prop.`,\n },\n icon: {\n description: `Custom icon to display on the left. Alternative to the\n \\`icon\\` prop.`,\n },\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n actionLabel: {\n default: '',\n description: `The label for the action button. If not provided, no action\n button will be displayed.`,\n type: String,\n typeDef: 'string',\n },\n actionLinkTo: {\n default: '',\n description: `Optionally pass in a url or router object to convert the\n action button to an anchor link.`,\n type: [String, Object],\n typeDef: 'string | object',\n },\n actionRouter: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`actionLinkTo\\` is provided).`,\n type: Object,\n typeDef: 'object',\n },\n description: {\n default: undefined,\n description: `The description text of the alert. If this prop and the\n \\`description\\` slot are both not provided, no description will be\n displayed.`,\n type: String,\n typeDef: 'string',\n },\n hideDismiss: {\n default: false,\n description: `Set to \\`true\\` to hide the dismiss button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n horizontal: {\n default: false,\n description: `Set to \\`true\\` to display the alert in a horizontal\n orientation.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n icon: {\n default: '',\n description: `Icon to display on the alert. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`icon\\` slot\n is provided. If no icon is provided, a default icon will be displayed.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n title: {\n default: '',\n description: `The title of the alert. If this prop and the \\`title\\` slot\n are both not provided, no title will be displayed.`,\n type: String,\n typeDef: 'string',\n },\n variant: {\n default: '',\n description: `Sets the visual style of the alert.`,\n type: String,\n typeDef: `'success' | 'warning' | 'negative'`,\n typeOptions: ['', 'success', 'warning', 'negative'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n },\n },\n}\n\nexport const emitDefinitions = {\n 'action-click': {\n description: `Event emitted when the action button is clicked.`,\n },\n 'close': {\n description: `Event emitted when the close button is clicked.`,\n },\n}\n\nexport const slotDefinitions = {\n description: {\n description: `The description of the alert. Overrides the \\`description\\`\n prop.`,\n },\n icon: {\n description: `The icon to be displayed in the alert. Overrides the \\`icon\\`\n prop.`,\n },\n title: {\n description: `The title of the alert. Overrides the \\`title\\` prop.`,\n },\n}","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n color: {\n default: '',\n description: `Sets the color of the badge.`,\n type: String,\n typeDef: `'red' | 'blue' | 'white'`,\n typeOptions: ['', 'red', 'blue', 'white'],\n validator: val => ['', 'red', 'blue', 'white'].includes(val)\n },\n count: {\n default: 0,\n description: `Sets the count of items. Not applicable when using the \\`dot\\`\n prop.`,\n type: Number,\n typeDef: 'number',\n },\n countMax: {\n default: 99,\n description: `Sets the count limit after which the displayed count will stop\n incrementing and a \"+\" will be appended.`,\n type: Number,\n typeDef: 'number',\n },\n dot: {\n default: false,\n description: `Pass \\`true\\` to show a simple dot indicator. Not applicable\n when using the \\`count\\` prop.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n label: {\n default: 'item',\n description: `Pass the singular name of the items that are being counted.\n e.g. if counting unread notifications, pass \\`\"unread notification\\`\";\n or if counting new messages, pass \\`\"new message\\`\". This is required\n to ensure accessibility.`,\n type: String,\n typeDef: 'string',\n },\n position: {\n default: 'right',\n description: `Sets the position of the badge in relation to the slotted\n content.`,\n type: String,\n typeDef: `'left' | 'right'`,\n typeOptions: ['', 'left', 'right'],\n validator: val => ['left', 'right'].includes(val),\n },\n showZero: {\n default: false,\n description: `Pass \\`true\\` to show the badge even when the \\`count\\` value\n is zero.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: '',\n description: `Sets the variant of the badge. Use \\`notext\\` variant when\n the badge is used as a standalone element.`,\n type: String,\n typeDef: `'notext'`,\n typeOptions: ['', 'notext'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: `The text for the badge. Not applicable when variant is set to\n \\`notext\\`.`,\n },\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n icon: {\n default: '',\n description: `Icon to display in the banner. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`icon\\` slot\n is provided. If no icon is provided, a default icon will be displayed.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n variant: {\n default: '',\n description: `Sets the color variant of the banner.`,\n type: String,\n typeDef: `'negative'`,\n typeOptions: ['', 'negative'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n },\n}\n\nexport const emitDefinitions = {\n dismiss: {\n description: `Event emitted when the banner is dismissed.`,\n },\n}\n\nexport const slotDefinitions = {\n default: {\n description: `The main content of the banner.`,\n },\n icon: {\n description: `The icon to be displayed in the banner. Overrides the \\`icon\\`\n prop.`,\n },\n}","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n disabled: {\n default: false,\n description: `Sets the disabled state of the button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n ghostBtn: {\n default: false,\n description: `Apply the ghost button style.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n linkTo: {\n default: undefined,\n description: `Pass in a url or router object to convert a button to an\n anchor tag (to enable client-side routing, pass the vue router instance\n into \\`router\\` prop).`,\n type: [String, Object],\n typeDef: 'string | object',\n },\n router: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`linkTo\\` is used).`,\n type: Object,\n typeDef: 'object',\n },\n size: {\n default: '',\n description: `Sets the size of the button. Note that the \\`xs\\` size is only\n supported for text buttons.`,\n type: String,\n typeDef: `'sm' | 'xs' | 'xxs'`,\n typeOptions: ['', 'sm', 'xs', 'xxs'],\n validator: (val) => ['', 'sm', 'xs', 'xxs'].includes(val)\n },\n textBtn: {\n default: false,\n description: `Apply the text button style.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: undefined,\n description: `Changes the variant of the button. \\'white\\' should only be\n used with ghost buttons or text buttons, on dark backgrounds. \\`negative\\`\n and \\`white\\` are the only available variants for text buttons.`,\n type: String,\n typeDef: `'primary' | 'secondary' | 'positive' | 'negative' | 'warning' | 'pink' | 'royal' | 'white'`,\n typeOptions: ['primary', 'secondary', 'positive', 'negative', 'warning', 'pink', 'royal', 'white'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n },\n // DEPRECATED\n href: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: `Button label content.`\n }\n}\n","export const propDefinitions = {\n disabled: {\n default: false,\n description: `Set to \\`true\\` to disable the calendar input.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n disabledDates: {\n default: [],\n description: `Array of dates to disable.`,\n type: Array,\n typeDef: 'Date[]',\n },\n error: {\n default: false,\n description: `Set to \\`true\\` to display an error state.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n errorMsg: {\n default: '',\n description: `Error message to display.`,\n type: String,\n typeDef: 'string',\n },\n exclusiveDates: {\n default: [],\n description: `Array of dates to exclusively enable. This prop supersedes\n \\`disabledDates\\`, \\`minDate\\`, and \\`maxDate\\`.`,\n type: Array,\n typeDef: 'Date[]',\n },\n hint: {\n default: '',\n description: `Hint text to display.`,\n type: String,\n typeDef: 'string',\n },\n inputId: {\n default: '',\n description: `Unique id for the input. Autogenerated if not passed.`,\n type: String,\n typeDef: 'string',\n },\n inputMode: {\n default: true,\n description: `Set to \\`false\\` to hide the input. Useful for using just the\n calendar as the date picker.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n isRange: {\n default: false,\n description: `Set to \\`true\\` to enable range selection. When enabled, the\n \\`modelValue\\` prop must be an object with \\`start\\` and \\`end\\`\n properties.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n label: {\n default: '',\n description: `Label text for the input. Alternatively, use the label slot.`,\n type: String,\n typeDef: 'string',\n },\n maxDate: {\n default: null,\n description: `Max date for the calendar.`,\n type: Date,\n typeDef: 'Date',\n },\n minDate: {\n default: null,\n description: `Min date for the calendar.`,\n type: Date,\n typeDef: 'Date',\n },\n /** Date | { start: Date, end: Date } */\n modelValue: {\n default: null,\n description: `Date value. Use v-model to bind to a date value. When\n \\`isRange: true\\`, use an object with \\`start\\` and \\`end\\`\n properties.`,\n type: [Date, Object],\n typeDef: `Date | { start: Date, end: Date }`,\n },\n placeholder: {\n default: 'Choose a date',\n description: `Placeholder text for the input.`,\n type: String,\n typeDef: 'string',\n },\n required: {\n default: false,\n description: `Set to \\`true\\` to mark the input as required.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n showClear: {\n default: false,\n description: `Set to \\`true\\` to show a clear button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n step: {\n default: 1,\n description: `Step for the calendar month navigation. Will force to \\`1\\` in\n mobile view or single-column view.`,\n type: Number,\n typeDef: '1 | 2',\n typeOptions: [1, 2],\n validator(value) {\n return propDefinitions.step.typeOptions.includes(value)\n }\n },\n variant: {\n default: '',\n description: `Sets the visual style of the calendar. When set to \\`2-col\\`,\n the calendar will display in a two-column layout.`,\n type: String,\n typeDef: `'2-col'`,\n typeOptions: ['', '2-col'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n }\n}\n\nexport const emitDefinitions = {\n 'clear': {\n description: `Emits \\`clear\\` event when the clear button is clicked.`,\n },\n 'update:model-value': {\n description: `Emits \\`update:modelValue\\` event when the date is selected.`,\n },\n}\nexport const slotDefinitions = {\n label: {\n description: `The label for the input. Overrides the \\`label\\` prop.`,\n },\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n disabled: {\n default: false,\n description: `Sets the disabled state on the button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n ghostBtn: {\n default: false,\n description: `Apply the ghost button style.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n hoverEffect: {\n default: false,\n description: `Set to \\`true\\` to apply hover transition effect (icon\n translates left or right).`,\n type: Boolean,\n typeDef: 'boolean',\n },\n icon: {\n default: '',\n description: `Icon to display. This can be the string name (dynamic load) or\n an actual IconComponent. Not used if the \\`icon\\` slot is provided. If\n no icon provided at all, will use a default caret icon.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n iconPosition: {\n default: 'right',\n description: `Set the position of the icon in relation to button text.`,\n type: String,\n typeDef: `''|'left'|'right'`,\n typeOptions: ['', 'left', 'right'],\n validator(value) {\n return propDefinitions.iconPosition.typeOptions.includes(value)\n }\n },\n label: {\n default: undefined,\n description: `Text to be used as \\`aria-label\\` or \\`title\\` for non-text\n buttons or links, respectively, or as the button text for text buttons.`,\n type: String,\n typeDef: 'string',\n },\n linkTo: {\n default: '',\n description: `Pass in a url or router object to convert a button to an\n anchor tag (to enable client-side routing, pass the Vue router instance\n into \\`router\\` prop).`,\n type: [String, Object],\n typeDef: 'string|Object',\n },\n router: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`linkTo\\` is provided).`,\n type: Object,\n typeDef: 'Router',\n },\n size: {\n default: '',\n description: `Sets the size of the button. Note that the \\`'xs'\\` size is\n only applicable when \\`textBtn=true\\`, and \\`'xxs'\\` is only applicable\n for color variants.`,\n type: String,\n typeDef: `''|'sm'|'xs'|'xxs'`,\n typeOptions: ['', 'sm', 'xs', 'xxs'],\n validator(value) {\n return propDefinitions.size.typeOptions.includes(value)\n }\n },\n textBtn: {\n default: false,\n description: `Set to \\`true\\` to display the label as text alongside the\n circle icon.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: '',\n description: `Color variant for the button. Note that when a variant is\n selected, \\`textBtn\\` is effectively set to \\`true\\` and \\`ghostBtn\\` is\n ignored.`,\n type: String,\n typedef: `''|'blue'|'pink'|'purple'|'orange'|'red'|'royal'|'white'`,\n typeOptions: ['', 'blue', 'pink', 'purple', 'orange', 'red', 'royal', 'white'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n },\n // DEPRECATED\n href: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = { }\n\nexport const slotDefinitions = {\n icon: {\n description: `Custom icon to be used in place of the default icon or\n \\`icon\\` prop value.`,\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n options: {\n description: `Array of objects to build out options.`,\n required: true,\n type: Array,\n typeDef: `{\n value: string | number | object,\n label?: string,\n labelHtml?: string,\n description?: string,\n negative?: boolean,\n icon?: string | IconComponent,\n profileImg?: {\n initials: string,\n src?: string,\n profileName?: string\n }\n checkbox?: {\n inputId: string,\n checked: boolean\n }\n }`\n },\n // OPTIONAL\n valueIdKey: {\n default: 'id',\n description: `For option values that are objects, pass the key to look for\n on the option's object value. Also to be used as the Option El's id\n attribute for accessibility.`,\n type: String,\n typeDef: 'string',\n },\n showNoOptions: {\n default: true,\n description: `Whether to show the 'No options' message when the options\n array is empty.`,\n type: Boolean,\n typeDef: 'boolean',\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {}\n","export const propDefinitions = {\n // REQUIRED\n title: {\n description: `Heading for the empty state.`,\n type: String,\n typeDef: 'string',\n required: true\n },\n // OPTIONAL\n description: {\n default: '',\n description: `Description can be added via prop or by using the\n \\`description\\` slot.`,\n type: String,\n typeDef: 'string'\n },\n icon: {\n default: '',\n description: `Icon to display. This can be the string name (dynamic load) or\n an actual IconComponent. Not used if the \\`icon\\` slot is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent'\n },\n size: {\n default: 'md',\n description: 'Size variant of the empty state.',\n type: String,\n typeDef: \"'xs' | 'sm' | 'md' | 'lg'\",\n typeOptions: ['xs', 'sm', 'md', 'lg'],\n validator(value) {\n return propDefinitions.size.typeOptions.includes(value)\n }\n },\n // DEPRECATED\n iconName: {\n default: '',\n description: `**DEPRECATED** - use \\`icon\\` prop instead.`,\n type: String,\n typeDef: 'string'\n },\n}\n\nexport const emitDefinitions = { }\n\nexport const slotDefinitions = {\n 'call-to-action': {\n description: `Custom call-to-action content, typically a button or link.`,\n },\n description: {\n description: `Custom description to be used in place of the \\`description\\`\n prop.`\n },\n icon: {\n description: `Custom icon to be used in place of the \\`iconName\\` prop\n value.`,\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n title: {\n required: true,\n description: `The title of the form container. This prop is required.`,\n type: String,\n typeDef: 'string',\n },\n \n // OPTIONAL\n inactive: {\n default: false,\n description: `Set to \\`true\\` to mute the form container background, \n title and subTitle.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n expanded: {\n default: true,\n description: `Set to \\`false\\` to hide the form container content.\n This can be used to create an expandable form container.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n icon: {\n default: '',\n description: `Icon prepended to the header title. This can be the string \n name (dynamic load) or an actual IconComponent. Not used if the \\`icon\\`\n slot is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n required: {\n default: false,\n description: `Set to \\`true\\` will add a red asterisk to the title`,\n type: Boolean,\n typeDef: 'boolean',\n },\n subTitle: {\n default: '',\n description: `The subTitle of the form container. This will be displayed\n below the title.`,\n type: String,\n typeDef: 'string',\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: `The content of the form container.`\n },\n 'header-actions': {\n description: `Custom actions to display on the right. This slot can be used\n to add buttons, links, etc. to the form container's header.`,\n },\n icon: {\n description: `The icon prepended to the header title. Overrides the \\`icon\\`\n prop. Slot to be used when advanced functionality is required, such as \n adding a click handler on the icon.`,\n },\n 'title-addon': {\n description: `Custom content appended to the title. This can be used\n to add additional information or controls related to the title.`,\n },\n}","export const propDefinitions = {\n hideMobileToggle: {\n default: false,\n description: `If \\`true\\`, the mobile toggle button will be hidden. Use\n the \\`mobile-open\\` prop to control the mobile navigation open state\n instead.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n mobileOpen: {\n default: false,\n description: `If \\`true\\`, the mobile navigation is open. This is only\n applicable on tablet or mobile page widths.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n mobileToggleText: {\n default: 'Menu',\n description: `The text to be displayed on the mobile toggle button.`,\n type: String,\n typeDef: 'string',\n },\n navData: {\n default: () => [],\n description: `The navigation data to be displayed.`,\n type: Array,\n typeDef: `\n Simple Structure:\n {\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n // Text to display for the nav item\n text: string,\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n to?: string | object,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }\n\n -- or --\n\n Admin Menu Builder Structure:\n {\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n metaData?: {\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n },\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n resource?: {\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n url: string\n },\n // Text to display for the nav item\n text: string,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }`,\n },\n router: {\n default: null,\n description: `Vue Router instance. This is used to highlight the active\n navigation item.`,\n type: Object,\n typeDef: `Router`,\n },\n title: {\n default: undefined,\n description: `The title to display on the desktop navigation.`,\n type: String,\n typeDef: 'string',\n },\n titleIcon: {\n default: undefined,\n description: `Icon to be display on the desktop navigation if \\`title\\` is\n not provided, or as the toggle icon for mobile navigation. This can be the\n string name (dynamically loaded) or an actual IconComponent.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n titleUrl: {\n default: undefined,\n description: `When provided, turns the desktop title into a link to the\n provided URL.`,\n type: String,\n typeDef: 'string',\n },\n}\n\nexport const emitDefinitions = {\n 'mobile-toggle': {\n description: `Emitted when the mobile toggle button is clicked. This\n should be used to control the mobile navigation open state.`\n },\n 'nav-link-clicked': {\n description: `Emitted when a navigation item is clicked. Emits the event\n (\\`ev\\`) and the navigation item (\\`payload\\`). Actual navigation is\n already done by the component, but this can be used to perform any\n additional actions on navigation.`,\n payloadType: `{ ev, payload }`,\n }\n}\n\nexport const slotDefinitions = {\n 'additional-nav-option': {\n description: `The additional navigation option to be displayed at the right\n (for desktop version) or bottom (for mobile version) of the navigation.`\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n disabled: {\n default: false,\n description: 'Disables the BsInlineTab.',\n type: Boolean,\n typeDef: 'boolean',\n },\n linkTo: {\n default: undefined,\n description: 'Pass in a url to convert a BsInlineTab into an anchor tag.',\n type: String,\n typeDef: 'string',\n },\n selected: {\n default: false,\n description: 'Selects the BsInlineTab manually. Only required when manually \\\n handling selection state, as opposed to using v-model on BsInlineTabs.',\n type: Boolean,\n typeDef: 'boolean',\n },\n type: {\n default: 'button',\n description: 'The button type attribute.',\n type: String,\n typeDef: `'button' | 'submit' | 'reset'`,\n typeOptions: ['button', 'submit', 'reset'],\n validator(val) {\n return propDefinitions.type.typeOptions.includes(val)\n }\n },\n value: {\n default: undefined,\n description: 'Required when using v-model on BsInlineTabs. The value of this \\\n BsInlineTab.',\n type: [String, Object, Number],\n typeDef: 'string | object | number',\n },\n variant: {\n default: undefined,\n description: 'Use variant=\"white\" to render the BsInlineTab with a white \\\n background. Alternatively, you can set this once at the BsInlineTabs level.',\n type: String,\n typeDef: `'' | 'white'`,\n typeOptions: ['', 'white'],\n validator(val) {\n return propDefinitions.variant.typeOptions.includes(val)\n }\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: 'Content of the tab.',\n slotProps: {\n isSelected: {\n description: 'Whether the current BsInlineTab is selected.',\n typeDef: 'boolean',\n }\n }\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n as: {\n default: 'div',\n description: 'Renders the BsInlineTabs root element as the given html tag, e.g. ul.',\n type: String,\n typeDef: 'string',\n },\n disabled: {\n default: false,\n description: 'Disables every BsInlineTab in the group.',\n type: Boolean,\n typeDef: 'boolean',\n },\n matcher: {\n default: 'id',\n description: 'Only needed when your model is an object, and that object has \\\n no \\'id\\' key (or the id key is not unique). Used to derive selection \\\n state, based on object equality. Provide either: A) the unique object key \\\n that should be used or, B) a function that receives the object and returns \\\n a value that should be used for the equality check.',\n type: [String, Function],\n typeDef: 'string | function',\n },\n multiple: {\n default: false,\n description: 'Allows multiple selections.',\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: undefined,\n description: 'Use variant=\"white\" to render every child BsInlineTab with a \\\n white background. Alternatively, you can set this on each child BsInlineTab.',\n type: String,\n typeDef: `'' | 'white'`,\n typeOptions: ['', 'white'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n },\n },\n}\n\nexport const emitDefinitions = {\n 'update:model-value': {\n description: 'Fires when v-model has been updated. Emits the current \\\n BsInlineTab selections.'\n }\n}\n\nexport const slotDefinitions = {\n default: {\n description: 'Slot in any BsInlineTab children.'\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n alert: {\n default: false,\n description: `Whether or not this is an \"alert\" type modal. Adds\n \\`role=\"alertdialog\"\\` instead of just \\`\"dialog\"\\``,\n type: Boolean,\n typeDef: 'boolean',\n },\n bodyBackgroundContrast: {\n default: false,\n description: `Whether or not to add a background to the body.\n Should only be used when also using a header and/or footer.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n closeButton: {\n default: true,\n description: `Whether or not to include a \"close\" button at the top of\n modal content.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n footerBorder: {\n default: false,\n description: `Whether or not to add a border to the footer.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n fullHeight: {\n default: false,\n description: `Removes the vertical padding from the modal content and\n removes header/footer. Essentially makes the body full-height.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n fullWidth: {\n default: false,\n description: `Removes the horizontal padding from the modal content.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n headerBorder: {\n default: false,\n description: `Whether or not to add a border to the header.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n modalId: {\n default: undefined,\n description: `Sets the \\`id\\` attribute of the modal element and this\n value is emitted when closing the modal.`,\n type: String,\n typeDef: 'string',\n },\n preloaded: {\n default: false,\n description: `If \\`true\\`, the content will always be rendered via\n \\`v-show\\` rather than \\`v-if\\`.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n shown: {\n default: true,\n description: `Whether or not the element should be visible. Acts as a\n \\`v-if\\` over the content (unless \\`preloaded\\`). Defaults to \\`true\\`\n so the transition would play on mount if desired.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n size: {\n default: 'base',\n description: `Sets the initial size and style of the modal.`,\n type: String,\n typeDef: `'' | 'base' | 'sm' | 'lg'`,\n typeOptions: ['', 'base', 'sm', 'lg'],\n validator: (value) => {\n return ['', 'base', 'sm', 'lg'].includes(value)\n },\n },\n subtitle: {\n default: undefined,\n description: `The subtitle of the modal. This will be rendered in a\n heading tag at the top of the modal below the title.`,\n type: String,\n typeDef: 'string',\n },\n title: {\n default: undefined,\n description: `The title of the modal. This will be rendered in a heading\n tag at the top of the modal. If the 'title' slot alternative is being\n used, this prop will be overwritten. **Note:** If no title is set,\n \\`aria-label\\` must be added on this component to satisfy accessibility\n requirements.`,\n type: String,\n typeDef: 'string',\n },\n // DEPRECATED\n enterControlled: {\n default: undefined,\n deprecated: true,\n },\n enterTrigger: {\n default: undefined,\n deprecated: true,\n },\n leaveTrigger: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = {\n 'close': {\n description: `Emits when the user clicks the \"close\" button, clicks the\n backdrop or presses the \"Escape\" key. The \\`modalId\\` prop is emitted\n along with this event.`,\n payloadType: 'string',\n },\n 'x-clicked-close': {\n description: `Emits when the user clicks the \"close\" button. The \\`modalId\\`\n prop is emitted along with this event.`,\n payloadType: 'string',\n },\n 'escape-pressed-close': {\n description: `Emits when the user presses the \"Escape\" key. The \\`modalId\\`\n prop is emitted along with this event.`,\n payloadType: 'string',\n },\n 'backdrop-clicked-close': {\n description: `Emits when the user clicks the backdrop outside the modal. The\n \\`modalId\\` prop is emitted along with this event.`,\n payloadType: 'string',\n },\n 'after-enter': {\n description: `Vue Transition hook. Called when the enter transition has\n finished. The element should be fully rendered by now and may be\n manipulated (e.g. setting focus). Emits the element.`,\n },\n 'after-leave': {\n description: `Vue Transition hook. Called when the leave transition has\n finished. Emits the element.`\n },\n}\n\nexport const slotDefinitions = {\n 'default': {\n description: `The default slot is used to provide the body content of the\n modal.`\n },\n 'title': {\n description: `The named slot 'title' is used to provide a custom title\n beyond just text (e.g. including an icon). Alternative to the \\`title\\`\n prop.`\n },\n 'subtitle': {\n description: `The named slot 'subtitle' is used to provide a custom subtitle\n beyond just text (e.g. including an icon). Alternative to the \\`subtitle\\`\n prop.`\n },\n 'footer': {\n description: `Provide a custom footer.`\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n action: {\n default: '',\n description: `Action section text. Not used if the \\`action\\` slot is\n provided.`,\n type: String,\n typeDef: 'string'\n },\n actionIcon: {\n default: '',\n description: `Icon to show with the action text. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`action\\` slot\n is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n company: {\n default: '',\n description: `Company name.`,\n type: String,\n typeDef: 'string'\n },\n email: {\n default: '',\n description: `Email address.`,\n type: String,\n typeDef: 'string'\n },\n imageSize: {\n default: 'lg',\n description: `Profile image size.`,\n type: String,\n typeDef: 'xs|sm|md|lg|xl',\n typeOptions: ['xs', 'sm', 'md', 'lg', 'xl'],\n validator(value) {\n return propDefinitions.imageSize.typeOptions.includes(value)\n }\n },\n imageSrc: {\n default: '',\n description: `Profile image url.`,\n type: String,\n typeDef: 'string'\n },\n initials: {\n default: '',\n description: `Initials to display if no image is provided.`,\n type: String,\n typeDef: 'string'\n },\n jobTitle: {\n default: '',\n description: `Job title.`,\n type: String,\n typeDef: 'string'\n },\n layout: {\n default: 'vertical',\n description: `Profile card layout`,\n type: String,\n typeDef: 'horizontal|vertical',\n typeOptions: ['horizontal', 'vertical'],\n validator(value) {\n return propDefinitions.layout.typeOptions.includes(value)\n }\n },\n linkTo: {\n default: '',\n description: `Pass in the profile URL (to enable client-side routing, pass\n the Vue router instance into \\`router\\` prop).`,\n type: String,\n typeDef: 'string'\n },\n miscMeta: {\n default: '',\n description: `Miscellaneous text which appears last. Not used if the\n \\`misc\\` slot is provided.`,\n type: String,\n typeDef: 'string'\n },\n miscMetaIcon: {\n default: '',\n description: `Icon to show with the misc text. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`misc\\` slot\n is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n profileName: {\n default: '',\n description: `Profile subject's name.`,\n type: String,\n typeDef: 'string'\n },\n router: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`linkTo\\` is provided).`,\n type: Object,\n typeDef: 'Router'\n },\n // DEPRECATED\n /** @DEPRECATED in favor of linkTo */\n href: {\n default: undefined,\n deprecated: true,\n }\n}\n\nexport const emitDefinitions = {\n 'action-toggled': {\n description: `Emitted when the optional action button is clicked.`\n }\n}\n\nexport const slotDefinitions = {\n action: {\n description: `Custom action section of the profile. Will replace the\n \\`actionIcon\\` and \\`action\\` props.`\n },\n misc: {\n description: `Custom misc section of the profile. Will replace the\n \\`miscMetaIcon\\` and \\`misc\\` props.`\n }\n}\n","export const propDefinitions = {\n collapsed: {\n default: false,\n description: `If \\`true\\`, the navigation is collapsed to show only icons.\n This prop can be used with v-model:collapsed for two-way binding.\n Note: This only works when variant is set to 'collapsible'.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n mobileOpen: {\n default: false,\n description: `If \\`true\\`, the mobile navigation is open. This is only\n applicable on tablet or mobile page widths.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n navData: {\n default: () => [],\n description: `The navigation data to be displayed.`,\n type: Array,\n typeDef: `\n Simple Structure:\n {\n // If true, creates a divider-only section without toggle button or title (only when navItems present)\n dividerOnly?: boolean,\n // If true, styles the nav item as app links (used on digital transformation project)\n appLinks?: boolean,\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n // Text to display for the nav item (not shown when dividerOnly is true)\n text: string,\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n to?: string | object,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }\n\n -- or --\n\n Admin Menu Builder Structure:\n {\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n metaData?: {\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n },\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n resource?: {\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n url: string\n },\n // Text to display for the nav item\n text: string,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }`,\n },\n router: {\n default: null,\n description: `Vue Router instance. This is used to highlight the active\n navigation item.`,\n type: Object,\n typeDef: `Router`,\n },\n variant: {\n default: 'wide',\n description: `The variant of the vertical navigation to be displayed.\n Note that when using \\`'narrow\\`' variant, the external links and slotted\n items will not be displayed. The \\`'collapsible'\\` variant enables the collapse\n feature with a toggle button.`,\n type: String,\n typeDef: `'wide'|'narrow'|'collapsible'`,\n validator: (value) => {\n return ['wide', 'narrow', 'collapsible'].includes(value)\n }\n },\n bgVariant: {\n default: '',\n description: `The background color variant of the vertical navigation.\n When set to \\`'bg-base'\\`, the background color will use \\`bg-base\\` instead\n of the default \\`bg-navy-base\\`. Leave empty or omit for default styling.`,\n type: String,\n typeDef: `''|'bg-base'`,\n validator: (value) => {\n return ['', 'bg-base'].includes(value)\n }\n },\n width: {\n default: '',\n description: `Custom width of the vertical navigation. This will override\n the \\`variant\\` prop.`,\n type: String,\n typeDef: 'string',\n },\n sticky: {\n default: false,\n description: `If \\`true\\`, the navigation will use sticky positioning instead\n of fixed positioning on desktop viewports (min-width: 1166px). This is primarily\n used in combination with the App Header component.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n}\n\nexport const emitDefinitions = {\n 'nav-link-clicked': {\n description: `Emitted when a navigation item is clicked. Emits the event\n (\\`ev\\`) and the navigation item (\\`payload\\`). Actual navigation is\n already done by the component, but this can be used to perform any\n additional actions on navigation.`,\n payloadType: `{ ev, payload }`,\n },\n 'update:collapsed': {\n description: `Emitted when the collapsed state changes. Used for v-model:collapsed binding.`,\n payloadType: `boolean`,\n }\n}\n\nexport const slotDefinitions = {\n 'top-content': {\n description: `Content to be displayed at the very top of the navigation list.\n Useful for adding components like inputs, selects, or other custom elements.`\n },\n 'end-items': {\n description: `Additional navigation items to be displayed at the bottom\n of the navigation.`\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 { ref, onMounted, watch, computed } from 'vue'\n\n/**\n * Notifies about the usage of a deprecated prop.\n *\n * @param {object} props Props object.\n * @param {string} propName Deprecated prop name.\n * @param {string} [newPropName] Replacement prop name. If not provided, the\n * warning will not include a suggestion for a new prop.\n * @param {string} [customMessage] Custom message to display in the warning.\n */\nexport function useDeprecatedProp(props, propName, newPropName, customMessage) {\n if (props[propName] !== undefined) {\n let warning = `[Deprecated] The prop \"${propName}\" is deprecated and will be removed in future versions.`\n if (newPropName) {\n warning += ` Please use \"${newPropName}\" instead.`\n }\n if (customMessage) {\n warning += ` ${customMessage}`\n }\n console.warn(warning)\n }\n}\n\n/**\n * Returns a computed property which returns the new or deprecated prop value.\n *\n * @param {object} props Props object.\n * @param {string} propName Deprecated prop name.\n * @param {string} newPropName Replacement prop name.\n * @returns {computed} Computed property that returns the value of the\n * deprecated prop or the new prop.\n */\nexport function useDeprecatedPropActual(props, propName, newPropName) {\n return computed(() => props[propName] || props[newPropName])\n}\n\n/**\n * Helps handle deprecated transition props.\n *\n * @param {object} props Props object.\n * @returns {ref} transition Ref that indicates the transition state.\n */\nexport function useDeprecatedTransition(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}\n","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-accordion.js'\nimport { computed, ref } from 'vue'\nimport { useGenIdAttrs } from '../../composables/genId.js'\nimport { BsIconCaretDown, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { useDeprecatedProp } from '../../composables/deprecated.js'\n\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'headingLevel', undefined, '\\'aria-level\\' and \\'role=heading\\' are no longer set on the header text.')\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\nconst containerRef = ref(null)\nconst isOpen = ref(false)\n\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\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 <BsIcon v-if=\"typeof icon === 'string'\" :name=\"icon\" />\n <component v-else :is=\"icon\" />\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","import { ref, computed, watch, unref } 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 * @returns { rootTag: import('vue').Ref<string>, attrsToBind: object, btnRef: import('vue').Ref<HTMLElement> }\n*/\nexport function useButtonOrLink(props, attrs, defaultTag = 'button') {\n const rootTag = getTag(unref(props), attrs, defaultTag)\n const btnRef = ref()\n\n const additionalAttrs = computed(() => {\n const safeProps = unref(props)\n const isButton = rootTag.value === 'button'\n const attrsRet = {}\n if (isButton) {\n attrsRet.type = attrs.type || 'button'\n attrsRet.autocomplete = \"off\"\n if (safeProps.disabled) attrsRet.disabled = true\n } else if (safeProps.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 toBind.href = hrefUrl.value\n return toBind\n })\n\n const hrefUrl = computed(() => {\n const safeProps = unref(props)\n if (safeProps.linkTo && typeof safeProps.linkTo === 'object') {\n return safeProps.router?.resolve(safeProps.linkTo)?.path || ''\n }\n return safeProps.linkTo || safeProps.href\n })\n\n watch(\n hrefUrl,\n newVal => {\n btnRef.value?.setAttribute('href', newVal)\n }\n )\n\n return { rootTag, attrsToBind, btnRef }\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 { computed, unref } from 'vue'\n\nexport function useClientRouter(props) {\n\n const propUrl = computed(() => {\n const safeProps = unref(props)\n if (safeProps.linkTo && typeof safeProps.linkTo === 'object') {\n return safeProps.router?.resolve(safeProps.linkTo)?.path || ''\n }\n return safeProps.linkTo || safeProps.href || ''\n })\n\n const hrefIsRelative = computed(() => propUrl.value?.startsWith?.('/') || false)\n\n const routeTo = computed(() => {\n const safeProps = unref(props)\n return hrefIsRelative.value && safeProps.router?.navigateTo || safeProps.router?.push || null\n })\n\n\n function onLinkClick(e) {\n const safeProps = unref(props)\n\n if (safeProps.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","<script setup>\nimport { computed, useAttrs, useSlots, unref } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\nimport { BsIcon, BsIconCaretLeft, BsIconCaretRight, BsIconSmallCaretLeft, BsIconSmallCaretRight } from '@wwtdev/bsds-icons-vue3'\nimport { useDeprecatedProp } from '../../composables/deprecated.js'\nimport { propDefinitions } from './defs-circle-button.js'\n\n// Props\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'href', 'linkTo')\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\nconst $slots = useSlots()\nconst { rootTag, attrsToBind, btnRef } = 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 if (props.icon) {\n return props.icon\n }\n\n if (props.iconPosition === 'left') {\n if (props.textBtn || props.size === 'sm') {\n return BsIconSmallCaretLeft\n } else {\n return BsIconCaretLeft\n }\n } else {\n if (props.textBtn || props.size === 'sm') {\n return BsIconSmallCaretRight\n } else {\n return BsIconCaretRight\n }\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</script>\n\n<template>\n <component\n ref=\"btnRef\"\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 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 <BsIcon v-if=\"typeof iconComputed === 'string'\" :name=\"iconComputed\" />\n <component v-else :is=\"iconComputed\" />\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 { propDefinitions, emitDefinitions } from './defs-alert.js'\nimport { BsIconCircleExclamation, BsIconClose, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport BsCaretTextButton from '../caret-text-button/BsCaretTextButton.vue'\nimport { computed } from 'vue'\n\nconst props = defineProps(propDefinitions)\n\nconst emit = defineEmits(Object.keys(emitDefinitions))\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 <template v-if=\"icon\">\n <BsIcon v-if=\"typeof icon === 'string'\" :name=\"icon\" size=\"auto\" />\n <component v-else :is=\"icon\" size=\"auto\" />\n </template>\n <BsIconCircleExclamation v-else 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 { propDefinitions } from './defs-badge.js'\nimport { ref, computed } from 'vue'\n\n// Props\nconst props = defineProps(propDefinitions)\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 { propDefinitions, emitDefinitions } from './defs-banner.js'\nimport { ref } from 'vue'\nimport { BsIconWarning, BsIconClose, BsIcon } from '@wwtdev/bsds-icons-vue3'\n\nconst props = defineProps(propDefinitions)\nconst emit = defineEmits(Object.keys(emitDefinitions))\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 <template v-if=\"icon\">\n <BsIcon v-if=\"typeof icon === 'string'\" :name=\"icon\" size=\"md\" />\n <component v-else :is=\"icon\" size=\"md\" />\n </template>\n <BsIconWarning v-else 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","<script setup>\nimport { propDefinitions } from './defs-button.js'\nimport { useAttrs } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\nimport { useDeprecatedProp } from '../../composables/deprecated.js'\n\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'href', 'linkTo')\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\nconst { rootTag, attrsToBind, btnRef } = useButtonOrLink(props, $attrs)\nconst { onLinkClick } = useClientRouter(props)\n</script>\n\n<template>\n <component\n ref=\"btnRef\"\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 v-bind=\"attrsToBind\"\n @click=\"onLinkClick\"\n >\n <slot></slot>\n </component>\n</template>\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'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n error: {\n type: Boolean,\n default: false\n },\n hintId: String,\n modelValue: [String, Number],\n value: [String, Number],\n // DEPRECATED\n inputId: { default: undefined }\n})\nuseDeprecatedProp(props, 'inputId', undefined, 'Set \\'id\\' directly on the component instead.')\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, BsIconClose } 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 showClear: {\n type: Boolean,\n default: false\n }\n})\n\nconst emit = defineEmits(['ui-focusin', 'ui-input', 'clear'])\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 <button\n v-show=\"showClear\"\n aria-label=\"Clear\"\n type=\"button\"\n class=\"bs-calendar-clear-btn\"\n @click=\"$emit('clear')\"\n >\n <BsIconClose size=\"sm\" class=\"bs-text-black\" />\n </button>\n </BsInputAddon>\n</template>","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","import { useAttrs, computed, unref } from 'vue'\n\nexport function useFilterAttrs(keysToFilter = []) {\n\n const attrs = useAttrs()\n\n const isFilterKey = key => unref(keysToFilter).includes(key)\n\n const attrEntries = computed(() => Object.entries(attrs))\n\n const filtered = computed(() => {\n return Object.fromEntries(\n attrEntries.value.filter(([key]) => isFilterKey(key))\n )\n })\n\n const remaining = computed(() => {\n return Object.fromEntries(\n attrEntries.value.filter(([key]) => !isFilterKey(key))\n )\n })\n\n return { filtered, remaining }\n}","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-calendar.js'\nimport { computed, onMounted, ref, 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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport 'v-calendar/style.css'\n\nconst MQ = '(min-width: 752px)'\n\nconst props = defineProps(propDefinitions)\nconst emit = defineEmits(Object.keys(emitDefinitions))\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 } = useFilterAttrs([\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 showClearBtn = computed(() => props.showClear && props.modelValue && !props.disabled)\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) setTimeout(setNavButtonLabels, 100)\n})\n\nwatch(() => calendar.value?.popoverRef?.isVisible, (visible) => {\n if (visible) setTimeout(setNavButtonLabels, 100)\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 :show-clear=\"showClearBtn\"\n :required=\"required\"\n @clear=\"$emit('clear')\"\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 :show-clear=\"showClearBtn\"\n :required=\"required\"\n @ui-focusin=\"showPopover\"\n @ui-input=\"showPopover\"\n @clear=\"$emit('clear')\"\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/* ------------- Clear button ------------- */\n\n.bs-calendar-clear-btn {\n cursor: pointer;\n height: 100%;\n}\n.bs-calendar-clear-btn:focus {\n border-radius: .25rem;\n box-shadow: var(--focus-border) 0px 0px 0px 1px inset;\n z-index: 1;\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, 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, 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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 /** 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 // DEPRECATED\n checkedPartially: { default: undefined },\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'checkedPartially', 'indeterminate')\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Refs & Computed Properties\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=\"filtered\"\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=\"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 </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","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","<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 BsDropdownNew from './BsDropdownNew.vue'\nimport { useDeprecatedProp, useDeprecatedTransition } from '@composables/deprecated.js'\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 width: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n // DEPRECATED\n center: {\n default: undefined\n },\n enterControlled: {\n default: undefined\n },\n enterTrigger: {\n default: undefined\n },\n leaveTrigger: {\n default: undefined\n },\n right: {\n default: undefined\n },\n toggleId: {\n default: undefined\n },\n top: {\n default: undefined\n }\n})\nuseDeprecatedProp(props, 'center', 'position')\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\nuseDeprecatedProp(props, 'right', 'position')\nuseDeprecatedProp(props, 'toggleId', 'anchorId')\nuseDeprecatedProp(props, 'top', 'position')\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 } = useDeprecatedTransition(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 { propDefinitions } from './defs-dropdown-option-builder.js'\nimport BsDropdownOption from '../dropdown-option/BsDropdownOption.vue'\nimport BsProfileImg from '../profile-img/BsProfileImg.vue'\nimport { BsIcon } from '@wwtdev/bsds-icons-vue3'\n\n// PROPS\nconst props = defineProps(propDefinitions)\n\n// METHODS\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\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 <BsIcon v-if=\"typeof option.icon === 'string'\" :name=\"option.icon\" />\n <component v-else :is=\"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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport { useDeprecatedProp } from '@composables/deprecated.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 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 // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\nconst emit = defineEmits(['clear','update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\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=\"filtered\"\n>\n <BsIconSearch v-if=\"!hideSearchIcon\" />\n <BsInput\n data-autowidth\n :disabled=\"disabled\"\n :id=\"$attrs.id || inputId\"\n :placeholder=\"placeholder\"\n :value=\"value || modelValue\"\n v-bind=\"remaining\"\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","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","<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'\nimport { useDeprecatedProp, useDeprecatedPropActual } from '@composables/deprecated.js'\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\n selectedValue: {\n default: undefined\n },\n})\nuseDeprecatedProp(props, 'selectedValue', undefined, 'Use \\'modelValue\\' (or \\'v-model\\') instead')\nconst selectedValueActual = useDeprecatedPropActual(props, 'selectedValue', 'modelValue')\n\n// EMITS\nconst emit = defineEmits([\n 'close',\n 'options-list-shift-tab',\n 'options-list-tab',\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// 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('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 aria-label=\"separator\" role=\"option\" 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 containerId: {\n type: String,\n default: '',\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 :container-id=\"containerId\"\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 { useFilterAttrs } from '@composables/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\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\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=\"filtered\">\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=\"remaining\"\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\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 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\n // DEPRECATED\n center: {\n default: undefined\n },\n enterControlled: {\n default: undefined\n },\n enterTrigger: {\n default: undefined\n },\n leaveTrigger: {\n default: undefined\n },\n right: {\n default: undefined\n },\n selectedValue: {\n default: undefined\n },\n toggleId: {\n default: undefined\n },\n top: {\n default: undefined\n },\n})\nuseDeprecatedProp(props, 'center', 'position')\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\nuseDeprecatedProp(props, 'right', 'position')\nuseDeprecatedProp(props, 'selectedValue', undefined, 'Use \\'modelValue\\' (or \\'v-model\\') instead')\nuseDeprecatedProp(props, 'toggleId', 'anchorId')\nuseDeprecatedProp(props, 'top', 'position')\n\nconst emit = defineEmits([\n 'update:modelValue',\n 'close',\n 'after-enter',\n 'after-leave'\n])\n\n// Handles enterControlled/enterTrigger/leaveTrigger backwards compatibility\nconst { transition: shownActual } = useDeprecatedTransition(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('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 { ref, computed, useSlots } from 'vue'\nimport { BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { propDefinitions } from './defs-empty-state.js'\n\nconst props = defineProps(propDefinitions)\n\nconst slots = useSlots()\n\nconst loaded = ref(false)\n\n// Handles deprecated prop\nconst iconActual = computed(() => {\n return props.iconName || props.icon\n})\nconst shouldDisplay = computed(() => {\n if (!!!slots['icon'] && typeof iconActual.value === 'string') {\n return loaded.value\n }\n\n return true\n})\n</script>\n\n<template>\n<div\n v-show=\"shouldDisplay\"\n class=\"bs-empty-state\"\n data-component=\"bs-empty-state\"\n :data-size=\"size\"\n>\n <div class=\"bs-empty-state-icon\">\n <slot name=\"icon\">\n <BsIcon\n v-if=\"typeof iconActual === 'string'\"\n :name=\"iconActual\"\n size=\"auto\"\n @loading=\"loaded = false\"\n @loaded=\"loaded = true\"\n />\n <component v-else :is=\"iconActual\" 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, onBeforeUnmount, watch, computed } from 'vue'\n\n// PROPS\nconst props = defineProps({\n active: {\n type: Boolean,\n default: true,\n },\n preventFirstShiftTab: {\n type: Boolean,\n default: false,\n },\n preventLastTab: {\n type: Boolean,\n default: false,\n },\n selectorPrefix: {\n type: String,\n default: '',\n },\n})\n\n// EMITS\nconst emit = defineEmits(['first-shift-tab', 'last-tab' ])\n\n// REFS\nconst focusGuard = ref(null)\n\n// VARIABLES / STATE\nconst FOCUSABLE_ELEMENT_TAGS = [\n 'a[href]',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'area[href]',\n 'details',\n 'summary',\n '[tabindex]',\n '[contenteditable=\"true\"]',\n]\n\n// COMPUTED\nconst selector = computed(() => {\n // Build selector\n let selector = ''\n FOCUSABLE_ELEMENT_TAGS.forEach((tag) => {\n selector += `${props.selectorPrefix}${tag}:not([disabled]):not([tabindex=\"-1\"]),`\n })\n\n // Remove trailing comma\n selector = selector.slice(0, -1)\n return selector\n})\n\n// LIFE CYCLE HOOKS\nonMounted(() => {\n if (props.active) {\n window.addEventListener('keydown', handleKeydown)\n }\n})\n\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', handleKeydown)\n})\n\n// WATCHERS\nwatch(() => props.active, (newValue) => {\n if (newValue) {\n window.addEventListener('keydown', handleKeydown)\n } else {\n window.removeEventListener('keydown', handleKeydown)\n }\n})\n\n// METHODS\nfunction handleKeydown(ev) {\n if (ev.key === 'Tab') {\n // Find all focusable elements\n // Grabbing these every time since the DOM could change\n const focusableElements = focusGuard.value.querySelectorAll(selector.value)\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n // Handle actual tabbing\n if (document.activeElement === firstElement && ev.shiftKey) {\n handleFirstShiftTab(ev, lastElement)\n } else if (document.activeElement === lastElement && !ev.shiftKey) {\n handleLastTab(ev, firstElement)\n } else if (!focusGuard.value.contains(document.activeElement)) {\n handleOutsideTab(ev, firstElement)\n }\n }\n}\n\nfunction handleFirstShiftTab(ev, lastElement) {\n ev.preventDefault()\n if (!props.preventFirstShiftTab) {\n // Wrap around to the last element\n lastElement.focus()\n }\n emit('first-shift-tab', ev)\n}\n\nfunction handleLastTab(ev, firstElement) {\n ev.preventDefault()\n if (!props.preventLastTab) {\n // Wrap around to the first element\n firstElement.focus()\n }\n emit('last-tab', ev)\n}\n\nfunction handleOutsideTab(ev, firstElement) {\n ev.preventDefault()\n // Current focus is outside the guard, so bring it in\n firstElement.focus()\n}\n</script>\n\n<template>\n<div ref=\"focusGuard\">\n <slot></slot>\n</div>\n</template>\n","import { ref, computed, toRaw } from 'vue'\n\nexport default function useNavigationUtils(props) {\n // STATE\n const collapsedSections = ref({})\n\n // COMPUTED\n const rawNavData = computed(() => toRaw(props.navData))\n\n // METHODS\n function initializeSections(initialValue) {\n rawNavData.value.forEach((item) => {\n if (item.navItems?.length > 0 && !item.dividerOnly) {\n // Only initialize collapse state for non-divider sections\n collapsedSections.value[item.id] = initialValue\n }\n })\n }\n\n function isAbsoluteTo(item) {\n const to = getTo(item)\n return typeof to === 'string' && to.startsWith('http')\n }\n\n function isActivePath(item) {\n const to = getTo(item)\n if (isAbsoluteTo(item)) {\n return window.location.href.startsWith(to)\n }\n\n if (props.router) {\n return to && props.router.resolve(to).path === props.router.currentRoute.value.path\n }\n\n return false\n }\n\n function isExpanded(item) {\n // Divider-only sections are always expanded\n if (item.dividerOnly) return true\n return !collapsedSections.value[item.id]\n }\n\n function getExpandButtonTitle(item) {\n return isExpanded(item) ? `Collapse ${item.text} Section` : `Expand ${item.text} Section`\n }\n\n function getTo(item) {\n if (item.to) {\n return item.to\n } else if (item.resource?.url) {\n return item.resource.url\n } else {\n return null\n }\n }\n\n function getTarget(item) {\n if (item.target) {\n return item.target\n } else {\n return '_self'\n }\n }\n\n return {\n collapsedSections,\n getExpandButtonTitle,\n getTarget,\n getTo,\n initializeSections,\n isAbsoluteTo,\n isActivePath,\n isExpanded,\n rawNavData,\n }\n}\n","<script setup>\nimport useNavigationUtils from '@composables/navigationUtils'\n\nconst props = defineProps({\n item: {\n type: Object,\n required: true\n },\n router: {\n type: Object,\n default: null\n }\n})\n\nconst emit = defineEmits(['nav-link-clicked'])\n\nconst { isAbsoluteTo, isActivePath, getTo, getTarget } = useNavigationUtils(props)\n</script>\n\n<template>\n<a\n v-if=\"isAbsoluteTo(item)\"\n :aria-current=\"isActivePath(item) || undefined\"\n :data-active=\"isActivePath(item)\"\n :href=\"getTo(item)\"\n :target=\"getTarget(item)\"\n @click=\"(ev) => emit('nav-link-clicked', ev)\"\n>\n <slot />\n</a>\n\n<router-link\n v-else\n :aria-current=\"isActivePath(item) || undefined\"\n :data-active=\"isActivePath(item)\"\n :to=\"getTo(item)\"\n :target=\"getTarget(item)\"\n @click=\"(ev) => emit('nav-link-clicked', ev)\"\n>\n <slot />\n</router-link>\n</template>\n","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-horizontal-navigation.js'\nimport { BsIconCaretDown, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { ref, onBeforeMount, watch, onMounted, useId } from 'vue'\nimport useNavigationUtils from '../../composables/navigationUtils'\nimport BsDropdown from '../dropdown/BsDropdown.vue'\nimport { useMatchMedia } from '@composables/matchMedia.js'\nimport NavigationLink from './NavigationLink.vue'\n\n// PROPS\nconst props = defineProps(propDefinitions)\n\n// EMIT\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\n// COMPOSABLES\nconst {\n collapsedSections,\n getExpandButtonTitle,\n initializeSections,\n isActivePath,\n isExpanded,\n rawNavData,\n} = useNavigationUtils(props)\nconst mobileId = useId()\nuseMatchMedia('(max-width: 1165px)', (ev) => {\n isTablet.value = ev.matches\n})\n\n// STATE\nconst isTablet = ref(false)\nconst mobileOpenState = ref(false)\n\n// LIFE CYCLE HOOKS\nonBeforeMount(() => {\n initializeSections(true)\n})\n\nonMounted(() => {\n mobileOpenState.value = props.mobileOpen\n})\n\n// WATCHERS\nwatch(() => props.navData, () => {\n initializeSections(true)\n})\n\nwatch(() => props.mobileOpen, (newVal) => {\n mobileOpenState.value = newVal\n})\n\nwatch(mobileOpenState, (newVal) => {\n if (newVal) {\n document.body.style.overflow = 'hidden'\n } else {\n document.body.style.overflow = ''\n }\n emit('mobile-toggle', newVal)\n})\n\nwatch(isTablet, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n mobileOpenState.value = false\n resetSections()\n }\n})\n\n// METHODS\nfunction toggleSection(sectionId) {\n collapsedSections.value[sectionId] = !collapsedSections.value[sectionId]\n // Close all other sections\n Object.keys(collapsedSections.value).forEach((key) => {\n if (key !== sectionId) {\n collapsedSections.value[key] = true\n }\n })\n}\n\nfunction getMobileToggleTitle() {\n return mobileOpenState.value ? 'Close Menu' : 'Open Menu'\n}\n\nfunction isNestedActive(item) {\n return item.navItems.some((navItem) => isActivePath(navItem))\n}\n\nfunction resetSections() {\n Object.keys(collapsedSections.value).forEach((key) => {\n collapsedSections.value[key] = true\n })\n}\n\nfunction handleNestedClick(ev, item) {\n const modifierKeyPressed = ev.ctrlKey || ev.metaKey\n if (!modifierKeyPressed) {\n toggleSection(item.id)\n }\n emit('nav-link-clicked', { ev, payload: item })\n}\n</script>\n\n<template>\n<!-- Mobile Menu -->\n<nav\n v-if=\"isTablet\"\n class=\"bs-horizontal-nav-mobile\"\n :data-shown=\"mobileOpenState\"\n :data-hide-toggle=\"hideMobileToggle\"\n>\n <button\n v-if=\"!hideMobileToggle\"\n type=\"button\"\n class=\"bs-horizontal-nav-mobile-toggle\"\n :aria-expanded=\"mobileOpen\"\n :aria-controls=\"`horizontal-nav-mobile-${mobileId}`\"\n :title=\"getMobileToggleTitle()\"\n @click=\"mobileOpenState = !mobileOpenState\"\n >\n <div class=\"bs-horizontal-nav-mobile-toggle-title\">\n <BsIcon\n v-if=\"typeof titleIcon === 'string'\"\n class=\"bs-horizontal-nav-mobile-toggle-title-icon\"\n :name=\"titleIcon\"\n />\n <component\n v-else\n :is=\"titleIcon\"\n class=\"bs-horizontal-nav-mobile-toggle-title-icon\"\n />\n <span>{{ mobileToggleText }}</span>\n </div>\n <BsIconCaretDown class=\"bs-horizontal-nav-mobile-toggle-caret\" />\n </button>\n <Transition name=\"bs-horizontal-nav-mobile\">\n <div\n v-show=\"mobileOpen\"\n class=\"bs-horizontal-nav-mobile-menu\"\n :id=\"`horizontal-nav-mobile-${mobileId}`\"\n >\n <!-- Main Links Menu -->\n <ul>\n <template v-for=\"item in rawNavData\" :key=\"item.id\">\n <!-- Nested Items -->\n <li v-if=\"item.navItems?.length > 0\" :data-expanded=\"isExpanded(item)\">\n <button\n type=\"button\"\n class=\"bs-horizontal-nav-mobile-nested-toggle\"\n :aria-expanded=\"isExpanded(item)\"\n :aria-controls=\"`${item.id}-nested-menu`\"\n :data-active=\"isNestedActive(item)\"\n :title=\"getExpandButtonTitle(item)\"\n @click=\"toggleSection(item.id)\"\n >\n <span>{{ item.text }}</span>\n <BsIconCaretDown class=\"bs-horizontal-nav-mobile-nested-toggle-caret\" />\n </button>\n <ul class=\"bs-horizontal-nav-mobile-nested-menu\">\n <li v-for=\"nestedItem in item.navItems\">\n <NavigationLink\n :item=\"nestedItem\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: nestedItem })\"\n >\n {{ nestedItem.text }}\n </NavigationLink>\n </li>\n </ul>\n </li>\n\n <!-- Single Item -->\n <li v-else>\n <NavigationLink\n :item=\"item\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: item })\"\n >\n {{ item.text }}\n </NavigationLink>\n </li>\n </template>\n </ul>\n\n <!-- End Nav Items -->\n <div v-if=\"$slots['end-items']\" class=\"bs-horizontal-nav-mobile-end-items\">\n <slot name=\"end-items\" />\n </div>\n </div>\n </Transition>\n</nav>\n\n<!-- Desktop Menu -->\n<div v-else class=\"bs-horizontal-nav\">\n <nav>\n <!-- Title Icon -->\n <template v-if=\"!title && titleIcon\">\n <BsIcon\n v-if=\"typeof titleIcon === 'string'\"\n class=\"bs-horizontal-nav-title-icon\"\n :name=\"titleIcon\"\n />\n <component\n v-else\n :is=\"titleIcon\"\n class=\"bs-horizontal-nav-title-icon\"\n />\n </template>\n\n <ul>\n <!-- Title Item -->\n <li v-if=\"title\" class=\"bs-horizontal-nav-title\">\n <router-link\n v-if=\"titleUrl\"\n :aria-current=\"isActivePath({ to: titleUrl }) || undefined\"\n :to=\"titleUrl\"\n :data-active=\"isActivePath({ to: titleUrl })\"\n @click=\"(ev) => emit('nav-link-clicked', { ev, payload: { resource: { url: titleUrl }, text: title } })\"\n >\n <span>{{ title }}</span>\n </router-link>\n\n <span v-else>{{ title }}</span>\n </li>\n\n <template v-for=\"(item, index) in rawNavData\" :key=\"item.id\">\n <!-- Nested Items -->\n <li v-if=\"item.navItems?.length > 0\">\n <!-- Nested Toggle -->\n <button\n :id=\"`${item.id}-toggle`\"\n type=\"button\"\n class=\"bs-horizontal-nav-nested-toggle\"\n :aria-expanded=\"isExpanded(item)\"\n :aria-controls=\"`${item.id}-nested-section`\"\n :data-active=\"isNestedActive(item)\"\n :data-expanded=\"isExpanded(item)\"\n :title=\"getExpandButtonTitle(item)\"\n @click=\"toggleSection(item.id)\"\n >\n <span>{{ item.text }}</span>\n <BsIconCaretDown class=\"bs-horizontal-nav-nested-toggle-caret\" />\n </button>\n <!-- Nested Menu -->\n <BsDropdown\n :id=\"`${item.id}-nested-section`\"\n class=\"bs-horizontal-nav-nested-menu\"\n :anchor-id=\"`${item.id}-toggle`\"\n position=\"right\"\n :shown=\"isExpanded(item)\"\n :use-mobile-style=\"false\"\n width=\"content\"\n @close=\"collapsedSections[item.id] = true\"\n >\n <ul>\n <li v-for=\"nestedItem in item.navItems\" :key=\"nestedItem.id\">\n <NavigationLink\n :item=\"nestedItem\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => handleNestedClick(ev, nestedItem)\"\n >\n {{ nestedItem.text }}\n </NavigationLink>\n </li>\n </ul>\n </BsDropdown>\n </li>\n\n <!-- Single Item -->\n <li v-else>\n <NavigationLink\n :item=\"item\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: item })\"\n >\n <span>{{ item.text }}</span>\n </NavigationLink>\n </li>\n </template>\n </ul>\n\n <!-- End Nav Items -->\n <div v-if=\"$slots['end-items']\" class=\"bs-horizontal-nav-end-items\">\n <slot name=\"end-items\" />\n </div>\n </nav>\n</div>\n</template>\n","<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.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","export const InlineTabsProvider = Symbol('InlineTabs')","<template>\n <component\n :is=\"rootTag\"\n ref=\"btnRef\"\n class=\"bs-inline-tab\"\n :data-variant=\"variant\"\n :data-selected=\"isSelected || undefined\"\n :aria-pressed=\"rootTag === 'button' ? isSelected : undefined\"\n v-bind=\"attrsToBind\"\n @click=\"onClick\">\n <slot :is-selected />\n </component>\n</template>\n\n<script setup>\nimport { computed, inject, useAttrs } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { InlineTabsProvider } from './provider-key-inline-tabs'\nimport { propDefinitions } from './defs-inline-tab.js'\n\nconst props = defineProps(propDefinitions)\n\n// BsInlineTabs usage is optional...inject will return null if BsInlineTab is not a child of BsInlineTabs\nconst group = inject(InlineTabsProvider, null)\n\nconst isSelected = computed(() => {\n return group?.isSelected(props.value) || props.selected\n})\n\nconst isDisabled = computed(() => {\n return group?.props.disabled || props.disabled\n})\n\nconst variant = computed(() => {\n return group?.props.variant || props.variant\n})\n\nconst modifiedProps = computed(() => ({\n ...props,\n disabled: isDisabled.value\n}))\n\nconst { rootTag, attrsToBind, btnRef } = useButtonOrLink(modifiedProps, useAttrs(), 'button')\n\n// - - - - - - - - - - - -\n\nfunction onClick(event) {\n setGroupModel()\n}\n\nfunction setGroupModel() {\n if (!group) return\n\n // don't update the model if no new selection was made (so group's @update:model-value won't fire)\n if (isSelected.value && !group.props.multiple) return\n\n group.setModel(props.value)\n}\n</script>\n","<template>\n <component\n :is=\"as\"\n class=\"bs-inline-tab-group\">\n <slot />\n </component>\n</template>\n\n<script setup>\nimport { provide } from 'vue'\nimport { InlineTabsProvider } from './provider-key-inline-tabs.js'\nimport { propDefinitions, emitDefinitions } from './defs-inline-tab-group.js'\n\nconst props = defineProps(propDefinitions)\ndefineEmits(Object.keys(emitDefinitions))\n\nconst model = defineModel({\n type: [String, Object, Number, Array],\n default: undefined,\n required: false\n})\n\nprovide(InlineTabsProvider, {\n props,\n model,\n setModel,\n isSelected\n})\n\n// - - - - - - - - - - - - - -\n\nfunction isSelected(val) {\n if (!model.value) return false\n\n // single model\n if (!props.multiple) return isMatch(model.value, val)\n\n // a little DX for multiple model, just in case...\n if (!Array.isArray(model.value)) {\n throw new Error(`[BsInlineTabs] When \"multiple\" prop is used, v-model must be an Array. Your model: ${model.value}`)\n }\n\n // multiple model\n return model.value.some(it => isMatch(it, val))\n}\n\nfunction isMatch(a, b) {\n const { matcher } = props\n\n if (isObject(a) && isObject(b)) {\n return typeof matcher === 'function'\n ? matcher(a) === matcher(b)\n : a[matcher] === b[matcher]\n }\n\n return a === b\n}\n\nfunction isObject(val) {\n return typeof val === 'object' && val !== null && !Array.isArray(val)\n}\n\nfunction setModel(val) {\n model.value = props.multiple\n ? getArrayModel(val)\n : val\n}\n\nfunction getArrayModel(val) {\n if (!model.value) return [val]\n\n return isSelected(val)\n ? model.value.filter(it => !isMatch(it, val))\n : [ ...model.value, val ]\n}\n</script>\n","<script setup>\nimport { computed } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsInput from '../input/BsInput.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 /** 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 // DEPRECATED\n hints: { default: undefined },\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'hints', undefined, 'Use \\'hint\\' and/or \\'errorMsg\\. instead.')\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\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\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\">\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=\"remaining\"\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 { useFilterAttrs } from '@composables/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\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\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=\"filtered\"\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 :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=\"remaining\"\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 breakout: {\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 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 replaceHtml = `<span style=\"color: var(--bs-blue-base)\">${filterValue}</span>`\n if (filterFunc === 'includes') {\n labelHtml = option.label.replaceAll(filterValue, replaceHtml)\n } else {\n labelHtml = option.label.replace(filterValue, replaceHtml)\n }\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 :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 :breakout=\"breakout\"\n :preloaded=\"true\"\n :shown=\"optionsShown\"\n :use-mobile-style=\"false\"\n width=\"anchor\"\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n shown: {\n type: Boolean,\n default: true,\n },\n preloaded: {\n type: Boolean,\n default: false,\n },\n // DEPRECATED\n enterControlled: {\n default: undefined,\n },\n enterTrigger: {\n default: undefined,\n },\n leaveTrigger: {\n default: undefined,\n },\n})\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\n\nconst emit = defineEmits(['after-enter', 'after-leave'])\n\nconst { transition } = useDeprecatedTransition(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 { propDefinitions, emitDefinitions } from './defs-modal.js'\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\nimport { useGenIdAttrs } from '@composables/genId'\nimport useClickAway from '../../composables/clickAway'\nimport BsFocusGuard from '../focus-guard/BsFocusGuard.vue'\n\n// PROPS\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\n\n// EMITS\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\n// REFS / VARIABLES\nconst modalRef = ref(null)\nlet isVisible = false\n\n// COMPOSABLES\nconst { transition } = useDeprecatedTransition(props)\nconst [ titleId ] = useGenIdAttrs()\nconst [ subtitleId ] = useGenIdAttrs()\nconst slots = useSlots()\nuseClickAway([modalRef], () => closeModal('backdrop-clicked-close'))\nuseKeydown(['Escape'], () => closeModal('escape-pressed-close'))\n\n// COMPUTED\nconst hasTitle = computed(() => {\n return !!(props.title || slots.title)\n})\nconst hasSubtitle = computed(() => {\n return !!(props.subtitle || slots.subtitle)\n})\nconst hasProgress = computed(() => {\n return !!slots.progress\n})\nconst hasHeader = computed(() => {\n return !props.fullHeight && hasTitle.value\n})\nconst hasFooter = computed(() => {\n return !props.fullHeight && !!slots.footer\n})\n\n// METHODS\nfunction closeModal(customEventName, checkForShownChild = true) {\n const hasShownChild = checkForShownChild && modalRef.value?.querySelector('[data-shown=\"true\"]') !== null\n if (isVisible && !hasShownChild) {\n emit('close', props.modalId)\n emit(customEventName, props.modalId)\n }\n}\n\ndefineOptions({ inheritAttrs: false })\n</script>\n\n<template>\n<BsOverlay\n :enter-controlled=\"enterControlled\"\n :enter-trigger=\"enterTrigger\"\n :leave-trigger=\"leaveTrigger\"\n :preloaded=\"preloaded\"\n :shown=\"transition\"\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 class=\"bs-modal\"\n :id=\"modalId\"\n ref=\"modalRef\"\n :aria-labelledby=\"title && !$attrs['aria-label'] ? titleId : undefined\"\n aria-modal=\"true\"\n :data-body-background-contrast=\"bodyBackgroundContrast\"\n data-component=\"bs-modal\"\n :data-footer-border=\"footerBorder\"\n :data-full-height=\"fullHeight\"\n :data-full-width=\"fullWidth\"\n :data-header-border=\"headerBorder\"\n :data-shown=\"transition\"\n :data-size=\"size\"\n :role=\"alert ? 'alertdialog' : 'dialog'\"\n v-bind=\"$attrs\"\n >\n <BsFocusGuard :active=\"transition\">\n <header v-if=\"hasHeader\" class=\"bs-modal-header-container\">\n <!-- HEADER ROW -->\n <div class=\"bs-modal-header\">\n <!-- TITLE -->\n <template v-if=\"hasTitle\">\n <slot name=\"title\">\n <span\n v-if=\"title\"\n class=\"bs-modal-title\"\n :id=\"titleId\"\n >\n {{ title }}\n </span>\n </slot>\n </template>\n\n <!-- CLOSE BUTTON (HEADER) -->\n <button\n v-if=\"closeButton\"\n class=\"bs-modal-close-button\"\n aria-label=\"Close Modal\"\n title=\"Close Modal\"\n type=\"button\"\n @click=\"closeModal('x-clicked-close', false)\"\n >\n <BsIconClose></BsIconClose>\n </button>\n </div>\n\n <!-- SUBTITLE ROW -->\n <div v-if=\"hasSubtitle\" class=\"bs-modal-subtitle\">\n <slot name=\"subtitle\">\n <span :id=\"subtitleId\">{{ subtitle }}</span>\n </slot>\n </div>\n\n <!-- PROGRESS ROW -->\n <div v-if=\"hasProgress\" class=\"bs-modal-progress\">\n <slot name=\"progress\"></slot>\n </div>\n </header>\n\n <!-- CLOSE BUTTON (FULL-HEIGHT) -->\n <button\n v-if=\"closeButton && !hasHeader\"\n class=\"bs-modal-close-button\"\n aria-label=\"Close Modal\"\n title=\"Close Modal\"\n type=\"button\"\n @click=\"closeModal('x-clicked-close', false)\"\n >\n <BsIconClose></BsIconClose>\n </button>\n\n <!-- BODY -->\n <div class=\"bs-modal-body\">\n <slot></slot>\n </div>\n\n <!-- FOOTER -->\n <footer v-if=\"hasFooter\" class=\"bs-modal-footer\">\n <slot name=\"footer\"></slot>\n </footer>\n </BsFocusGuard>\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 import { useDeprecatedProp, useDeprecatedPropActual } from '@composables/deprecated.js'\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 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 // DEPRECATED\n selection: {\n default: undefined\n },\n })\n useDeprecatedProp(props, 'selection', undefined, 'Use \\'modelValue\\' (or \\'v-model\\') instead')\n const value = useDeprecatedPropActual(props, 'selection', 'modelValue')\n\n // EMITS\n const emit = defineEmits(['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 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('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 :disabled=\"valueState === page || breakText === 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 || breakText === 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 ref=\"btnRef\"\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 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'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n active: { type : Boolean, default: false },\n disabled: { type: Boolean, default: false },\n linkTo: { type: [String, Object] },\n router: {},\n status: {\n type: String,\n validator: val => ['active', 'complete', 'disabled', '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 // DEPRECATED\n href: { default: undefined },\n})\nuseDeprecatedProp(props, 'href', 'linkTo')\n\ndefineOptions({ inheritAttrs: false })\n\nconst { onLinkClick } = useClientRouter(props)\n\nconst $attrs = useAttrs()\n\nconst { rootTag, attrsToBind, btnRef } = 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 { BsIcon } from '@wwtdev/bsds-icons-vue3'\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, Object],\n miscMeta: String,\n miscMetaIcon: [String, Object]\n})\nconst emit = defineEmits(['action-toggled'])\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 <template v-if=\"actionIcon\">\n <BsIcon\n v-if=\"typeof actionIcon === 'string'\"\n :name=\"actionIcon\"\n class=\"bs-icon\"\n />\n <component v-else :is=\"actionIcon\" class=\"bs-icon\" />\n </template>\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 <template v-if=\"miscMetaIcon\">\n <BsIcon\n v-if=\"typeof miscMetaIcon === 'string'\"\n :name=\"miscMetaIcon\"\n class=\"bs-icon\"\n />\n <component v-else :is=\"miscMetaIcon\" class=\"bs-icon\" />\n </template>\n {{ miscMeta }}\n </slot>\n </span>\n</div>\n</template>\n","<script setup>\nimport { 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'\nimport { propDefinitions, emitDefinitions } from './defs-profile.js'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'href', 'linkTo')\n\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\n\nconst { onLinkClick } = useClientRouter(props)\nconst { rootTag, attrsToBind, btnRef } = 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\n ref=\"btnRef\"\n :is=\"rootTag\"\n class=\"bs-profile\"\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 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 // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\n\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\"\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=\"remaining\"\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsSelect from '../select/BsSelect.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 /** 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 // DEPRECATED\n hints: { default: undefined },\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'hints', undefined, 'Use \\'hint\\' and/or \\'errorMsg\\. instead.')\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\">\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=\"remaining\"\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\n// PROPS\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, Number, Object ],\n default: undefined\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})\n\n// EMITS\nconst emit = defineEmits(['update:model-value'])\n\n// COMPOSABLES\nconst [ selectIdGen, optionsIdGen ] = useGenIdAttrs(2)\nconst attrs = useAttrs()\n\n// STATE\nconst isOpen = ref(false)\n\n// COMPUTED\nconst selectIdComp = computed(() => {\n return props.selectId || attrs.id || selectIdGen.value\n})\nconst optionsIdComp = computed(() => props.optionsId || optionsIdGen.value)\nconst buttonText = computed(() => {\n if (props.modelValue) {\n const matchedOption = props.options.find((option) => {\n // Object options, find a match by id\n if (option.value?.[props.valueIdKey]) {\n return option.value[props.valueIdKey] === props.modelValue?.[props.valueIdKey]\n }\n // String or Number options, find a match by value\n return option.value === props.modelValue\n })\n\n if (matchedOption) {\n return matchedOption.label\n }\n }\n\n // Default to placeholder if no match or no selected value\n return props.placeholder\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 size: {\n type: String,\n validator: (value) => value === 'sm',\n },\n modelValue: {\n type: Boolean\n },\n // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\n\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\"\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-size=\"size\"\n >\n <input\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :id=\"$attrs.id || inputIdAttr\"\n type=\"checkbox\"\n v-bind=\"remaining\"\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/genId.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()\nconst tablistEl = 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(tablistEl.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</script>\n\n<template>\n<div\n class=\"bs-tab-list\"\n ref=\"hostEl\"\n :id=\"$attrs.id || tabListAutoId\"\n data-component=\"bs-tab-list\"\n :data-resizing=\"!adaptedToWidth || undefined\"\n>\n <div\n class=\"bs-tab-list-tabs\"\n ref=\"tablistEl\"\n role=\"tablist\"\n @click=\"handleTabClick\"\n @tabClick=\"e => fireTabChange(e.detail)\"\n @keydown=\"handleTabNav\"\n >\n <slot />\n </div>\n\n <!-- \"More...\" button -->\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\n <!-- Hidden tabs dropdown -->\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 './provider-keys-table'\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 './provider-keys-table'\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>","<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.bsTableColResize === '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.bsTableColResizeId ? 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.bsTableColResizeMin?.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.bsTableColResizeId,\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(`[BsTable] BsTableCol 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('[BsTable] BsTableCol \"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('[BsTable] BsTableCol \"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(`[BsTable warn] Invalid prop: BsFrozenCols 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","<script setup>\nimport { computed } from 'vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n error: {\n type: Boolean,\n default: false\n },\n hintId: String,\n value: String,\n modelValue: String,\n // DEPECATED\n inputId: { default: undefined }\n})\nuseDeprecatedProp(props, 'inputId', undefined, 'Set \\'id\\' directly on the component instead.')\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsTextarea from '../textarea/BsTextarea.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\">\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=\"remaining\"\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 { useFilterAttrs } from '@composables/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)\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\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=\"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 <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=\"remaining\"\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\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\n enterControlled: {\n default: undefined\n },\n enterTrigger: {\n default: undefined\n },\n leaveTrigger: {\n default: undefined\n }\n})\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\n\nconst emit = defineEmits(['dismiss', 'after-enter', 'after-leave'])\n\ndefineOptions({ inheritAttrs: false })\n\nconst { transition } = useDeprecatedTransition(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","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-vertical-navigation.js'\nimport { BsIconCaretUp, BsIconCaretLeft, BsIconCaretRight, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { ref, watch, onMounted, computed } from 'vue'\nimport useNavigationUtils from '../../composables/navigationUtils'\nimport { useMatchMedia } from '@composables/matchMedia.js'\nimport NavigationLink from './NavigationLink.vue'\n\n// PROPS\nconst props = defineProps(propDefinitions)\n\n// EMITS\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\n// COMPOSABLES\nconst {\n collapsedSections,\n getExpandButtonTitle,\n initializeSections,\n isExpanded,\n rawNavData,\n} = useNavigationUtils(props)\nuseMatchMedia('(max-width: 1165px)', (ev) => {\n isTablet.value = ev.matches\n})\n\n// REFS\nconst verticalNav = ref(null)\nconst toggleButton = ref(null)\n\n// STATE\nconst isTablet = ref(false)\nconst internalCollapsed = ref(props.collapsed)\n\n// COMPUTED\nconst isNarrow = computed(() => {\n return !props.width && props.variant === 'narrow'\n})\n\nconst isCollapsible = computed(() => {\n return props.variant === 'collapsible'\n})\n\nconst isEffectivelyCollapsed = computed(() => {\n if (!isCollapsible.value || isTablet.value) return false\n return internalCollapsed.value\n})\n\n// LIFE CYCLE HOOKS\nonMounted(() => {\n initializeSections(false)\n})\n\n// WATCHERS\nwatch(() => props.navData, () => {\n initializeSections(false)\n})\n\n// Watch for button ref changes (when it mounts/unmounts due to v-if)\nwatch(toggleButton, (button) => {\n if (button && props.width) {\n button.style.setProperty('--bs-vertical-nav-width', props.width)\n }\n})\n\nwatch(() => props.collapsed, (newVal) => {\n internalCollapsed.value = newVal\n})\n\n// Set CSS variables on document body for page layout (CSS-only approach)\n// This allows page content to respond to navigation width changes without JavaScript\n// IMPORTANT: We use internalCollapsed directly (not isEffectivelyCollapsed) so hover doesn't shift layout\nwatch([() => internalCollapsed.value, isNarrow, () => props.width, isCollapsible, isTablet], \n ([collapsed, narrow, customWidth, collapsible, tablet]) => {\n // Calculate the actual width for page layout (ignoring hover state)\n let layoutWidth = '0px'\n \n // Only check collapsible state and collapsed state, ignore hover\n const isActuallyCollapsed = collapsible && !tablet && collapsed\n \n if (isActuallyCollapsed) {\n layoutWidth = '4rem' // 64px collapsed\n } else if (customWidth) {\n layoutWidth = customWidth // Use custom width as-is\n } else if (narrow) {\n layoutWidth = '4.5rem' // 72px narrow\n } else {\n layoutWidth = '9.875rem' // 158px wide\n }\n \n // Set CSS variable on body that page layout can use\n document.body.style.setProperty('--bs-page-nav-width', layoutWidth)\n}, { immediate: true })\n\nwatch(() => props.width, (newValue) => {\n if (newValue) {\n verticalNav.value.style.setProperty('--bs-vertical-nav-width', newValue)\n // Also update toggle button if it exists\n if (toggleButton.value) {\n toggleButton.value.style.setProperty('--bs-vertical-nav-width', newValue)\n }\n } else {\n verticalNav.value.style.removeProperty('--bs-vertical-nav-width')\n // Also remove from toggle button if it exists\n if (toggleButton.value) {\n toggleButton.value.style.removeProperty('--bs-vertical-nav-width')\n }\n }\n})\n\nwatch(() => props.mobileOpen, (newVal) => {\n if (newVal) {\n document.body.style.overflow = 'hidden'\n verticalNav.value.style.setProperty('visibility', 'visible')\n verticalNav.value.style.setProperty('pointer-events', 'auto')\n setTimeout(() => {\n verticalNav.value.style.setProperty('opacity', '1')\n }, 0)\n } else {\n document.body.style.overflow = ''\n verticalNav.value.style.removeProperty('opacity')\n verticalNav.value.style.setProperty('pointer-events', 'none')\n setTimeout(() => {\n verticalNav.value.style.removeProperty('visibility')\n }, 200)\n }\n})\n\n// METHODS\nfunction toggleSection(sectionId) {\n collapsedSections.value[sectionId] = !collapsedSections.value[sectionId]\n}\n\nfunction toggleCollapsed() {\n internalCollapsed.value = !internalCollapsed.value\n emit('update:collapsed', internalCollapsed.value)\n}\n</script>\n\n<template>\n <div class=\"bs-vertical-nav-wrapper\" :data-bg-variant=\"props.bgVariant || undefined\">\n <!-- Collapse Toggle Button -->\n <button\n v-if=\"isCollapsible && !isTablet\"\n ref=\"toggleButton\"\n class=\"bs-vertical-nav-toggle\"\n type=\"button\"\n :aria-expanded=\"!internalCollapsed\"\n :title=\"internalCollapsed ? 'Expand navigation' : 'Collapse navigation'\"\n :data-collapsed=\"isEffectivelyCollapsed\"\n :data-narrow=\"isNarrow\"\n @click=\"toggleCollapsed\"\n >\n <BsIconCaretRight v-if=\"internalCollapsed\" class=\"bs-vertical-nav-toggle-icon\" />\n <BsIconCaretLeft v-else class=\"bs-vertical-nav-toggle-icon\" />\n </button>\n\n <nav\n class=\"bs-vertical-nav\"\n ref=\"verticalNav\"\n :data-narrow=\"isNarrow\"\n :data-collapsed=\"isEffectivelyCollapsed\"\n :data-collapsible=\"isCollapsible\"\n :data-sticky=\"props.sticky || undefined\"\n :style=\"props.width && !isEffectivelyCollapsed ? { width: props.width } : undefined\"\n >\n <!-- Upper / Main Secondary Nav Options -->\n <ul>\n <!-- Top Content Slot -->\n <li v-if=\"$slots['top-content']\" class=\"bs-vertical-nav-top-content\">\n <slot name=\"top-content\" />\n </li>\n\n <template v-for=\"item in rawNavData\" :key=\"item.id\">\n <!-- Section (Collapsible or Divider-Only) -->\n <li\n v-if=\"item.navItems?.length > 0\"\n class=\"bs-vertical-nav-section\"\n :data-collapsed=\"!item.dividerOnly && !isExpanded(item)\"\n :data-divider-only=\"item.dividerOnly\"\n :data-app-links=\"item.appLinks\"\n >\n <!-- Toggle button (only shown if not divider-only) -->\n <button\n v-if=\"!item.dividerOnly && !isNarrow && !isEffectivelyCollapsed\"\n class=\"bs-vertical-nav-section-toggle\"\n :aria-expanded=\"isExpanded(item)\"\n :aria-controls=\"`${item.id}-nested-section`\"\n :title=\"getExpandButtonTitle(item)\"\n type=\"button\"\n @click=\"toggleSection(item.id)\"\n >\n <span v-if=\"!isEffectivelyCollapsed\">{{ item.text }}</span>\n <BsIconCaretUp class=\"bs-vertical-nav-section-toggle-caret\" />\n </button>\n\n <!-- Nested Items (always visible for divider-only sections) -->\n <ul v-show=\"item.dividerOnly || isExpanded(item) || isEffectivelyCollapsed\" :id=\"`${item.id}-nested-section`\">\n <li v-for=\"nestedItem in item.navItems\" :key=\"nestedItem.id\">\n <NavigationLink\n :item=\"nestedItem\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: nestedItem })\"\n :aria-label=\"nestedItem.text\"\n >\n <BsIcon\n v-if=\"typeof nestedItem.icon === 'string'\"\n class=\"bs-vertical-nav-link-icon\"\n :name=\"nestedItem.icon\"\n />\n <component\n v-else\n :is=\"nestedItem.icon\"\n class=\"bs-vertical-nav-link-icon\"\n />\n <span>{{ nestedItem.text }}</span>\n </NavigationLink>\n </li>\n </ul>\n </li>\n\n <!-- Single Item -->\n <li v-else>\n <NavigationLink\n :item=\"item\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: item })\"\n :aria-label=\"item.text\"\n >\n <BsIcon\n v-if=\"typeof item.icon === 'string'\"\n class=\"bs-vertical-nav-link-icon\"\n :name=\"item.icon\"\n />\n <component\n v-else\n :is=\"item.icon\"\n class=\"bs-vertical-nav-link-icon\"\n />\n <span>{{ item.text }}</span>\n </NavigationLink>\n </li>\n </template>\n </ul>\n\n <!-- End Items -->\n <div v-if=\"$slots['end-items']\" class=\"bs-vertical-nav-end-items\">\n <slot name=\"end-items\" />\n </div>\n </nav>\n </div>\n</template>\n"],"names":["bsSelectors","selectors","propDefinitions","emitDefinitions","slotDefinitions","value","val","useGenIdAttrs","quantity","ids","i","ref","useId","useDeprecatedProp","props","propName","newPropName","customMessage","warning","useDeprecatedPropActual","computed","useDeprecatedTransition","transition","onMounted","watch","__props","emit","__emit","containerRef","isOpen","containerId","contentId","headingId","openItemMatch","showContent","handleToggled","TAG_BY_PROP","useButtonOrLink","attrs","defaultTag","rootTag","getTag","unref","btnRef","additionalAttrs","safeProps","isButton","attrsRet","attrsToBind","toBind","hrefUrl","_b","_a","newVal","foundProp","key","getProp","useClientRouter","propUrl","hrefIsRelative","routeTo","onLinkClick","e","$attrs","useAttrs","$slots","useSlots","accessibleLabelAttr","isTextBtn","hoverDirection","iconComputed","BsIconSmallCaretLeft","BsIconCaretLeft","BsIconSmallCaretRight","BsIconCaretRight","textLeft","textRight","variantPrefixed","buttonVariant","hostRef","countFmt","labelFmt","base","ct","sfx","isDismissed","handleDismiss","hintMsg","aria","handleInput","debounce","func","wait","immediate","timeout","context","args","hiddenStart","hiddenEnd","dispatchRangeChange","el","ev","handleRangeChange","start","end","handleRangeChangeDebounced","handleRangeInput","startListener","endListener","useCalendarWorkaround","isNavBtn","isSpaceOrEnter","keydownWorkaround","onBeforeUnmount","useMatchMedia","query","handlerFn","watchList","mediaQuery","onBeforeMount","useFilterAttrs","keysToFilter","isFilterKey","attrEntries","filtered","remaining","MQ","calendar","columns","container","inputIdGen","hintId","steps","toChild","toRoot","disabledDatesComputed","getBlackoutDates","inputIdAttr","modifiers","showClearBtn","showFieldDetails","stepRef","variantRef","setNavButtonLabels","visible","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","useKeydown","keys","onKeydown","elRef","handler","k","onUnmounted","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","options","plugins","showTooltips","BsChartBarConfig","dataset","scaleOpts","tickFontOpts","updatedOpts","BsChartLineConfig","optionsArg","title","BarController","BarElement","CategoryScale","LinearScale","Legend","TimeScale","Tooltip","inputEl","isChecked","isModelValueChecked","isIndeterminate","isVModelArray","setIndeterminate","doVModelSimple","checked","doVModelComplex","newValue","onChange","internalContainerRef","__expose","useBreakout","createBreakout","id","position","breakoutId","breakoutStub","breakoutMounted","isPreExisting","useClickAway","elRefs","onClickAway","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","getVariant","option","variant","useAltText","profileName","label","showClear","useMutationObserver","targetRef","callback","observer","selectedValueActual","optionsRef","activeDescendantId","activeIndex","selectedIndex","optionEls","hasOverflow","registeredOptionsById","dropdownShown","refreshOptions","handleKeyboardSelect","handleKeyDown","typeToFocusKeys","typeToFocusData","typeToFocus","handleShownChange","entered","optionsLen","scrollOptionsListIntoView","scrollCurrentActiveIntoView","setCurrentActive","removeCurrentActive","handleOptionsFocus","handleShown","handleNotShown","traverse","direction","newIndex","updateCurrentActive","ttfState","matchIdx","activeIdx","withFocus","optlist","selectedLocalOptions","unselectedLocalOptions","showDivider","hasSomeOptions","refocusPending","sortSelectedUnselected","nextTick","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","slots","loaded","iconActual","shouldDisplay","flyoutRef","closeFlyout","hasShownChild","focusGuard","FOCUSABLE_ELEMENT_TAGS","selector","tag","handleKeydown","focusableElements","firstElement","lastElement","handleFirstShiftTab","handleLastTab","handleOutsideTab","useNavigationUtils","collapsedSections","rawNavData","toRaw","initializeSections","initialValue","isAbsoluteTo","to","getTo","isActivePath","isExpanded","getExpandButtonTitle","getTarget","mobileId","isTablet","mobileOpenState","oldValue","resetSections","toggleSection","sectionId","getMobileToggleTitle","isNestedActive","navItem","handleNestedClick","svgWrapperRef","viewBox","stops","uniqueId","InlineTabsProvider","group","isSelected","isDisabled","modifiedProps","onClick","event","setGroupModel","model","_useModel","setModel","isMatch","matcher","isObject","getArrayModel","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","replaceHtml","selectedOption","handleCheck","handleUncheck","setBodyScroll","modalRef","isVisible","titleId","subtitleId","closeModal","hasTitle","hasSubtitle","hasProgress","hasHeader","hasFooter","customEventName","checkForShownChild","valueState","resultsNumbers","actualPageCount","computedVariant","handleFirstNav","handlePrevNav","handleNextNav","handleLastNav","pages","pageTextDisplay","groupTextDisplay","first","last","increment","handleActionToggle","useSteps","progressStep","step","progressText","getStatus","status","selectIdGen","optionsIdGen","selectIdComp","optionsIdComp","buttonText","matchedOption","placeholderShown","hostEl","isActive","panelIdComputed","handleTabSelection","DEFAULT_TOGGLE_WIDTH","ELLIPSIS_WIDTH","TAB_GAP","adaptedToWidth","dropdownMounted","hiddenTabs","showDropdown","showDropdownToggle","tablistEl","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","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","shallowRef","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","j","getTimeString","skipOrStop","getSkipOrStop","checkConstraints","hour","minute","handleComboboxChange","formattedValue","updateWithValidation","setOptions","timePicker","STATUSES_ICONS","BsIconCircleStop","BsIconCircleCheck","BsIconCircleX","BsIconCircleEllipsis","BsIconGraphPieEmpty","BsIconCirclePlay","BsIconCirclePause","BsIconCircleExclamation","getIcon","autoDismissTimer","handleEnterEnd","isStacked","icon","BsIconWarning","BsIconThumbsUpStroke","isHoverOrFocused","isEscaped","getTooltipTextClass","cssClass","handleEnterOrFocus","handleLeaveOrFocusOut","verticalNav","toggleButton","internalCollapsed","isNarrow","isCollapsible","isEffectivelyCollapsed","button","collapsed","narrow","customWidth","collapsible","tablet","layoutWidth","toggleCollapsed"],"mappings":"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"}
1
+ {"version":3,"file":"bsds-components.js","sources":["../src/components/selectors.js","../src/components/accordion/defs-accordion.js","../src/components/alert/defs-alert.js","../src/components/badge/defs-badge.js","../src/components/banner/defs-banner.js","../src/components/button/defs-button.js","../src/components/calendar/defs-calendar.js","../src/components/circle-button/defs-circle-button.js","../src/components/dropdown-option-builder/defs-dropdown-option-builder.js","../src/components/empty-state/defs-empty-state.js","../src/components/form-container/defs-form-container.js","../src/components/navigation/defs-horizontal-navigation.js","../src/components/inline-tabs/defs-inline-tab.js","../src/components/inline-tabs/defs-inline-tab-group.js","../src/components/modal/defs-modal.js","../src/components/profile/defs-profile.js","../src/components/navigation/defs-vertical-navigation.js","../src/composables/genId.js","../src/composables/deprecated.js","../src/components/accordion/BsAccordion.vue","../src/composables/buttonOrLink.js","../src/composables/clientRouter.js","../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/composables/filterAttrs.js","../src/components/calendar/BsCalendar.vue","../src/components/chart-table/BsChartTable.vue","../src/composables/keydown.js","../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/composables/clickAway.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/composables/mutationObserver.js","../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/focus-guard/BsFocusGuard.vue","../src/composables/navigationUtils.js","../src/components/navigation/NavigationLink.vue","../src/components/navigation/BsHorizontalNavigation.vue","../src/components/icon-gradient-wrapper/BsIconGradientWrapper.vue","../src/components/inline-tabs/provider-key-inline-tabs.js","../src/components/inline-tabs/BsInlineTab.vue","../src/components/inline-tabs/BsInlineTabGroup.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/provider-keys-table.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/navigation/BsVerticalNavigation.vue"],"sourcesContent":["/* 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};","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n controlled: {\n default: false,\n description: `Use with \\`openItem\\` prop. Set to \\`true\\` when several\n accordions are grouped together and only one accordion should be open at a\n time.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n headerText: {\n default: '',\n description: `Panel title text. When using the \\`header\\` slot alternative,\n do not use this prop as it will be overwritten.`,\n type: String,\n typeDef: 'string',\n },\n icon: {\n default: '',\n description: `Icon to display on the left. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`icon\\` slot\n is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n openItem: {\n default: false,\n description: `Use with \\`controlled\\` prop. Pass in \\`true\\` when this\n accordion should open. When using this prop, do not use\n \\`openItemId\\`.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n openItemId: {\n default: '',\n description: `Use with \\`controlled\\` prop. Pass in the id of the accordion\n that should be open. When using this prop, do not use\n \\`openItem\\`.`,\n type: String,\n typeDef: 'string',\n },\n stacked: {\n default: false,\n description: `Set to \\`true\\` when used in a stack of accordions\n bordering one another.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n // DEPRECATED\n headingLevel: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = {\n toggled: {\n description: `Emits the ID of the accordion when the accordion is toggled.`,\n payloadType: 'string',\n },\n}\n\nexport const slotDefinitions = {\n default: {\n description: `The content of the accordion.`\n },\n header: {\n description: `Custom header content. Alternative to the \\`headerText\\`\n prop.`,\n },\n icon: {\n description: `Custom icon to display on the left. Alternative to the\n \\`icon\\` prop.`,\n },\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n actionLabel: {\n default: '',\n description: `The label for the action button. If not provided, no action\n button will be displayed.`,\n type: String,\n typeDef: 'string',\n },\n actionLinkTo: {\n default: '',\n description: `Optionally pass in a url or router object to convert the\n action button to an anchor link.`,\n type: [String, Object],\n typeDef: 'string | object',\n },\n actionRouter: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`actionLinkTo\\` is provided).`,\n type: Object,\n typeDef: 'object',\n },\n description: {\n default: undefined,\n description: `The description text of the alert. If this prop and the\n \\`description\\` slot are both not provided, no description will be\n displayed.`,\n type: String,\n typeDef: 'string',\n },\n hideDismiss: {\n default: false,\n description: `Set to \\`true\\` to hide the dismiss button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n horizontal: {\n default: false,\n description: `Set to \\`true\\` to display the alert in a horizontal\n orientation.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n icon: {\n default: '',\n description: `Icon to display on the alert. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`icon\\` slot\n is provided. If no icon is provided, a default icon will be displayed.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n title: {\n default: '',\n description: `The title of the alert. If this prop and the \\`title\\` slot\n are both not provided, no title will be displayed.`,\n type: String,\n typeDef: 'string',\n },\n variant: {\n default: '',\n description: `Sets the visual style of the alert.`,\n type: String,\n typeDef: `'success' | 'warning' | 'negative'`,\n typeOptions: ['', 'success', 'warning', 'negative'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n },\n },\n}\n\nexport const emitDefinitions = {\n 'action-click': {\n description: `Event emitted when the action button is clicked.`,\n },\n 'close': {\n description: `Event emitted when the close button is clicked.`,\n },\n}\n\nexport const slotDefinitions = {\n description: {\n description: `The description of the alert. Overrides the \\`description\\`\n prop.`,\n },\n icon: {\n description: `The icon to be displayed in the alert. Overrides the \\`icon\\`\n prop.`,\n },\n title: {\n description: `The title of the alert. Overrides the \\`title\\` prop.`,\n },\n}","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n color: {\n default: '',\n description: `Sets the color of the badge.`,\n type: String,\n typeDef: `'red' | 'blue' | 'white'`,\n typeOptions: ['', 'red', 'blue', 'white'],\n validator: val => ['', 'red', 'blue', 'white'].includes(val)\n },\n count: {\n default: 0,\n description: `Sets the count of items. Not applicable when using the \\`dot\\`\n prop.`,\n type: Number,\n typeDef: 'number',\n },\n countMax: {\n default: 99,\n description: `Sets the count limit after which the displayed count will stop\n incrementing and a \"+\" will be appended.`,\n type: Number,\n typeDef: 'number',\n },\n dot: {\n default: false,\n description: `Pass \\`true\\` to show a simple dot indicator. Not applicable\n when using the \\`count\\` prop.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n label: {\n default: 'item',\n description: `Pass the singular name of the items that are being counted.\n e.g. if counting unread notifications, pass \\`\"unread notification\\`\";\n or if counting new messages, pass \\`\"new message\\`\". This is required\n to ensure accessibility.`,\n type: String,\n typeDef: 'string',\n },\n position: {\n default: 'right',\n description: `Sets the position of the badge in relation to the slotted\n content.`,\n type: String,\n typeDef: `'left' | 'right'`,\n typeOptions: ['', 'left', 'right'],\n validator: val => ['left', 'right'].includes(val),\n },\n showZero: {\n default: false,\n description: `Pass \\`true\\` to show the badge even when the \\`count\\` value\n is zero.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: '',\n description: `Sets the variant of the badge. Use \\`notext\\` variant when\n the badge is used as a standalone element.`,\n type: String,\n typeDef: `'notext'`,\n typeOptions: ['', 'notext'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: `The text for the badge. Not applicable when variant is set to\n \\`notext\\`.`,\n },\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n icon: {\n default: '',\n description: `Icon to display in the banner. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`icon\\` slot\n is provided. If no icon is provided, a default icon will be displayed.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n variant: {\n default: '',\n description: `Sets the color variant of the banner.`,\n type: String,\n typeDef: `'negative'`,\n typeOptions: ['', 'negative'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n },\n}\n\nexport const emitDefinitions = {\n dismiss: {\n description: `Event emitted when the banner is dismissed.`,\n },\n}\n\nexport const slotDefinitions = {\n default: {\n description: `The main content of the banner.`,\n },\n icon: {\n description: `The icon to be displayed in the banner. Overrides the \\`icon\\`\n prop.`,\n },\n}","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n disabled: {\n default: false,\n description: `Sets the disabled state of the button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n ghostBtn: {\n default: false,\n description: `Apply the ghost button style.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n linkTo: {\n default: undefined,\n description: `Pass in a url or router object to convert a button to an\n anchor tag (to enable client-side routing, pass the vue router instance\n into \\`router\\` prop).`,\n type: [String, Object],\n typeDef: 'string | object',\n },\n router: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`linkTo\\` is used).`,\n type: Object,\n typeDef: 'object',\n },\n size: {\n default: '',\n description: `Sets the size of the button. Note that the \\`xs\\` size is only\n supported for text buttons.`,\n type: String,\n typeDef: `'sm' | 'xs' | 'xxs'`,\n typeOptions: ['', 'sm', 'xs', 'xxs'],\n validator: (val) => ['', 'sm', 'xs', 'xxs'].includes(val)\n },\n textBtn: {\n default: false,\n description: `Apply the text button style.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: undefined,\n description: `Changes the variant of the button. \\'white\\' should only be\n used with ghost buttons or text buttons, on dark backgrounds. \\`negative\\`\n and \\`white\\` are the only available variants for text buttons.`,\n type: String,\n typeDef: `'primary' | 'secondary' | 'positive' | 'negative' | 'warning' | 'pink' | 'royal' | 'white'`,\n typeOptions: ['primary', 'secondary', 'positive', 'negative', 'warning', 'pink', 'royal', 'white'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n },\n // DEPRECATED\n href: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: `Button label content.`\n }\n}\n","export const propDefinitions = {\n disabled: {\n default: false,\n description: `Set to \\`true\\` to disable the calendar input.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n disabledDates: {\n default: [],\n description: `Array of dates to disable.`,\n type: Array,\n typeDef: 'Date[]',\n },\n error: {\n default: false,\n description: `Set to \\`true\\` to display an error state.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n errorMsg: {\n default: '',\n description: `Error message to display.`,\n type: String,\n typeDef: 'string',\n },\n exclusiveDates: {\n default: [],\n description: `Array of dates to exclusively enable. This prop supersedes\n \\`disabledDates\\`, \\`minDate\\`, and \\`maxDate\\`.`,\n type: Array,\n typeDef: 'Date[]',\n },\n hint: {\n default: '',\n description: `Hint text to display.`,\n type: String,\n typeDef: 'string',\n },\n inputId: {\n default: '',\n description: `Unique id for the input. Autogenerated if not passed.`,\n type: String,\n typeDef: 'string',\n },\n inputMode: {\n default: true,\n description: `Set to \\`false\\` to hide the input. Useful for using just the\n calendar as the date picker.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n isRange: {\n default: false,\n description: `Set to \\`true\\` to enable range selection. When enabled, the\n \\`modelValue\\` prop must be an object with \\`start\\` and \\`end\\`\n properties.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n label: {\n default: '',\n description: `Label text for the input. Alternatively, use the label slot.`,\n type: String,\n typeDef: 'string',\n },\n maxDate: {\n default: null,\n description: `Max date for the calendar.`,\n type: Date,\n typeDef: 'Date',\n },\n minDate: {\n default: null,\n description: `Min date for the calendar.`,\n type: Date,\n typeDef: 'Date',\n },\n /** Date | { start: Date, end: Date } */\n modelValue: {\n default: null,\n description: `Date value. Use v-model to bind to a date value. When\n \\`isRange: true\\`, use an object with \\`start\\` and \\`end\\`\n properties.`,\n type: [Date, Object],\n typeDef: `Date | { start: Date, end: Date }`,\n },\n placeholder: {\n default: 'Choose a date',\n description: `Placeholder text for the input.`,\n type: String,\n typeDef: 'string',\n },\n required: {\n default: false,\n description: `Set to \\`true\\` to mark the input as required.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n showClear: {\n default: false,\n description: `Set to \\`true\\` to show a clear button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n step: {\n default: 1,\n description: `Step for the calendar month navigation. Will force to \\`1\\` in\n mobile view or single-column view.`,\n type: Number,\n typeDef: '1 | 2',\n typeOptions: [1, 2],\n validator(value) {\n return propDefinitions.step.typeOptions.includes(value)\n }\n },\n variant: {\n default: '',\n description: `Sets the visual style of the calendar. When set to \\`2-col\\`,\n the calendar will display in a two-column layout.`,\n type: String,\n typeDef: `'2-col'`,\n typeOptions: ['', '2-col'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n }\n}\n\nexport const emitDefinitions = {\n 'clear': {\n description: `Emits \\`clear\\` event when the clear button is clicked.`,\n },\n 'update:model-value': {\n description: `Emits \\`update:modelValue\\` event when the date is selected.`,\n },\n}\nexport const slotDefinitions = {\n label: {\n description: `The label for the input. Overrides the \\`label\\` prop.`,\n },\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n disabled: {\n default: false,\n description: `Sets the disabled state on the button.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n ghostBtn: {\n default: false,\n description: `Apply the ghost button style.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n hoverEffect: {\n default: false,\n description: `Set to \\`true\\` to apply hover transition effect (icon\n translates left or right).`,\n type: Boolean,\n typeDef: 'boolean',\n },\n icon: {\n default: '',\n description: `Icon to display. This can be the string name (dynamic load) or\n an actual IconComponent. Not used if the \\`icon\\` slot is provided. If\n no icon provided at all, will use a default caret icon.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n iconPosition: {\n default: 'right',\n description: `Set the position of the icon in relation to button text.`,\n type: String,\n typeDef: `''|'left'|'right'`,\n typeOptions: ['', 'left', 'right'],\n validator(value) {\n return propDefinitions.iconPosition.typeOptions.includes(value)\n }\n },\n label: {\n default: undefined,\n description: `Text to be used as \\`aria-label\\` or \\`title\\` for non-text\n buttons or links, respectively, or as the button text for text buttons.`,\n type: String,\n typeDef: 'string',\n },\n linkTo: {\n default: '',\n description: `Pass in a url or router object to convert a button to an\n anchor tag (to enable client-side routing, pass the Vue router instance\n into \\`router\\` prop).`,\n type: [String, Object],\n typeDef: 'string|Object',\n },\n router: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`linkTo\\` is provided).`,\n type: Object,\n typeDef: 'Router',\n },\n size: {\n default: '',\n description: `Sets the size of the button. Note that the \\`'xs'\\` size is\n only applicable when \\`textBtn=true\\`, and \\`'xxs'\\` is only applicable\n for color variants.`,\n type: String,\n typeDef: `''|'sm'|'xs'|'xxs'`,\n typeOptions: ['', 'sm', 'xs', 'xxs'],\n validator(value) {\n return propDefinitions.size.typeOptions.includes(value)\n }\n },\n textBtn: {\n default: false,\n description: `Set to \\`true\\` to display the label as text alongside the\n circle icon.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: '',\n description: `Color variant for the button. Note that when a variant is\n selected, \\`textBtn\\` is effectively set to \\`true\\` and \\`ghostBtn\\` is\n ignored.`,\n type: String,\n typedef: `''|'blue'|'pink'|'purple'|'orange'|'red'|'royal'|'white'`,\n typeOptions: ['', 'blue', 'pink', 'purple', 'orange', 'red', 'royal', 'white'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n }\n },\n // DEPRECATED\n href: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = { }\n\nexport const slotDefinitions = {\n icon: {\n description: `Custom icon to be used in place of the default icon or\n \\`icon\\` prop value.`,\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n options: {\n description: `Array of objects to build out options.`,\n required: true,\n type: Array,\n typeDef: `{\n value: string | number | object,\n label?: string,\n labelHtml?: string,\n description?: string,\n negative?: boolean,\n icon?: string | IconComponent,\n profileImg?: {\n initials: string,\n src?: string,\n profileName?: string\n }\n checkbox?: {\n inputId: string,\n checked: boolean\n }\n }`\n },\n // OPTIONAL\n valueIdKey: {\n default: 'id',\n description: `For option values that are objects, pass the key to look for\n on the option's object value. Also to be used as the Option El's id\n attribute for accessibility.`,\n type: String,\n typeDef: 'string',\n },\n showNoOptions: {\n default: true,\n description: `Whether to show the 'No options' message when the options\n array is empty.`,\n type: Boolean,\n typeDef: 'boolean',\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {}\n","export const propDefinitions = {\n // REQUIRED\n title: {\n description: `Heading for the empty state.`,\n type: String,\n typeDef: 'string',\n required: true\n },\n // OPTIONAL\n description: {\n default: '',\n description: `Description can be added via prop or by using the\n \\`description\\` slot.`,\n type: String,\n typeDef: 'string'\n },\n icon: {\n default: '',\n description: `Icon to display. This can be the string name (dynamic load) or\n an actual IconComponent. Not used if the \\`icon\\` slot is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent'\n },\n size: {\n default: 'md',\n description: 'Size variant of the empty state.',\n type: String,\n typeDef: \"'xs' | 'sm' | 'md' | 'lg'\",\n typeOptions: ['xs', 'sm', 'md', 'lg'],\n validator(value) {\n return propDefinitions.size.typeOptions.includes(value)\n }\n },\n // DEPRECATED\n iconName: {\n default: '',\n description: `**DEPRECATED** - use \\`icon\\` prop instead.`,\n type: String,\n typeDef: 'string'\n },\n}\n\nexport const emitDefinitions = { }\n\nexport const slotDefinitions = {\n 'call-to-action': {\n description: `Custom call-to-action content, typically a button or link.`,\n },\n description: {\n description: `Custom description to be used in place of the \\`description\\`\n prop.`\n },\n icon: {\n description: `Custom icon to be used in place of the \\`iconName\\` prop\n value.`,\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n title: {\n required: true,\n description: `The title of the form container. This prop is required.`,\n type: String,\n typeDef: 'string',\n },\n \n // OPTIONAL\n inactive: {\n default: false,\n description: `Set to \\`true\\` to mute the form container background, \n title and subTitle.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n expanded: {\n default: true,\n description: `Set to \\`false\\` to hide the form container content.\n This can be used to create an expandable form container.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n icon: {\n default: '',\n description: `Icon prepended to the header title. This can be the string \n name (dynamic load) or an actual IconComponent. Not used if the \\`icon\\`\n slot is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n required: {\n default: false,\n description: `Set to \\`true\\` will add a red asterisk to the title`,\n type: Boolean,\n typeDef: 'boolean',\n },\n subTitle: {\n default: '',\n description: `The subTitle of the form container. This will be displayed\n below the title.`,\n type: String,\n typeDef: 'string',\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: `The content of the form container.`\n },\n 'header-actions': {\n description: `Custom actions to display on the right. This slot can be used\n to add buttons, links, etc. to the form container's header.`,\n },\n icon: {\n description: `The icon prepended to the header title. Overrides the \\`icon\\`\n prop. Slot to be used when advanced functionality is required, such as \n adding a click handler on the icon.`,\n },\n 'title-addon': {\n description: `Custom content appended to the title. This can be used\n to add additional information or controls related to the title.`,\n },\n}","export const propDefinitions = {\n hideMobileToggle: {\n default: false,\n description: `If \\`true\\`, the mobile toggle button will be hidden. Use\n the \\`mobile-open\\` prop to control the mobile navigation open state\n instead.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n mobileOpen: {\n default: false,\n description: `If \\`true\\`, the mobile navigation is open. This is only\n applicable on tablet or mobile page widths.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n mobileToggleText: {\n default: 'Menu',\n description: `The text to be displayed on the mobile toggle button.`,\n type: String,\n typeDef: 'string',\n },\n navData: {\n default: () => [],\n description: `The navigation data to be displayed.`,\n type: Array,\n typeDef: `\n Simple Structure:\n {\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n // Text to display for the nav item\n text: string,\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n to?: string | object,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }\n\n -- or --\n\n Admin Menu Builder Structure:\n {\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n metaData?: {\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n },\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n resource?: {\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n url: string\n },\n // Text to display for the nav item\n text: string,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }`,\n },\n router: {\n default: null,\n description: `Vue Router instance. This is used to highlight the active\n navigation item.`,\n type: Object,\n typeDef: `Router`,\n },\n title: {\n default: undefined,\n description: `The title to display on the desktop navigation.`,\n type: String,\n typeDef: 'string',\n },\n titleIcon: {\n default: undefined,\n description: `Icon to be display on the desktop navigation if \\`title\\` is\n not provided, or as the toggle icon for mobile navigation. This can be the\n string name (dynamically loaded) or an actual IconComponent.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n titleUrl: {\n default: undefined,\n description: `When provided, turns the desktop title into a link to the\n provided URL.`,\n type: String,\n typeDef: 'string',\n },\n}\n\nexport const emitDefinitions = {\n 'mobile-toggle': {\n description: `Emitted when the mobile toggle button is clicked. This\n should be used to control the mobile navigation open state.`\n },\n 'nav-link-clicked': {\n description: `Emitted when a navigation item is clicked. Emits the event\n (\\`ev\\`) and the navigation item (\\`payload\\`). Actual navigation is\n already done by the component, but this can be used to perform any\n additional actions on navigation.`,\n payloadType: `{ ev, payload }`,\n }\n}\n\nexport const slotDefinitions = {\n 'additional-nav-option': {\n description: `The additional navigation option to be displayed at the right\n (for desktop version) or bottom (for mobile version) of the navigation.`\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n disabled: {\n default: false,\n description: 'Disables the BsInlineTab.',\n type: Boolean,\n typeDef: 'boolean',\n },\n linkTo: {\n default: undefined,\n description: 'Pass in a url to convert a BsInlineTab into an anchor tag.',\n type: String,\n typeDef: 'string',\n },\n selected: {\n default: false,\n description: 'Selects the BsInlineTab manually. Only required when manually \\\n handling selection state, as opposed to using v-model on BsInlineTabs.',\n type: Boolean,\n typeDef: 'boolean',\n },\n type: {\n default: 'button',\n description: 'The button type attribute.',\n type: String,\n typeDef: `'button' | 'submit' | 'reset'`,\n typeOptions: ['button', 'submit', 'reset'],\n validator(val) {\n return propDefinitions.type.typeOptions.includes(val)\n }\n },\n value: {\n default: undefined,\n description: 'Required when using v-model on BsInlineTabs. The value of this \\\n BsInlineTab.',\n type: [String, Object, Number],\n typeDef: 'string | object | number',\n },\n variant: {\n default: undefined,\n description: 'Use variant=\"white\" to render the BsInlineTab with a white \\\n background. Alternatively, you can set this once at the BsInlineTabs level.',\n type: String,\n typeDef: `'' | 'white'`,\n typeOptions: ['', 'white'],\n validator(val) {\n return propDefinitions.variant.typeOptions.includes(val)\n }\n }\n}\n\nexport const emitDefinitions = {}\n\nexport const slotDefinitions = {\n default: {\n description: 'Content of the tab.',\n slotProps: {\n isSelected: {\n description: 'Whether the current BsInlineTab is selected.',\n typeDef: 'boolean',\n }\n }\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n as: {\n default: 'div',\n description: 'Renders the BsInlineTabs root element as the given html tag, e.g. ul.',\n type: String,\n typeDef: 'string',\n },\n disabled: {\n default: false,\n description: 'Disables every BsInlineTab in the group.',\n type: Boolean,\n typeDef: 'boolean',\n },\n matcher: {\n default: 'id',\n description: 'Only needed when your model is an object, and that object has \\\n no \\'id\\' key (or the id key is not unique). Used to derive selection \\\n state, based on object equality. Provide either: A) the unique object key \\\n that should be used or, B) a function that receives the object and returns \\\n a value that should be used for the equality check.',\n type: [String, Function],\n typeDef: 'string | function',\n },\n multiple: {\n default: false,\n description: 'Allows multiple selections.',\n type: Boolean,\n typeDef: 'boolean',\n },\n variant: {\n default: undefined,\n description: 'Use variant=\"white\" to render every child BsInlineTab with a \\\n white background. Alternatively, you can set this on each child BsInlineTab.',\n type: String,\n typeDef: `'' | 'white'`,\n typeOptions: ['', 'white'],\n validator(value) {\n return propDefinitions.variant.typeOptions.includes(value)\n },\n },\n}\n\nexport const emitDefinitions = {\n 'update:model-value': {\n description: 'Fires when v-model has been updated. Emits the current \\\n BsInlineTab selections.'\n }\n}\n\nexport const slotDefinitions = {\n default: {\n description: 'Slot in any BsInlineTab children.'\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n alert: {\n default: false,\n description: `Whether or not this is an \"alert\" type modal. Adds\n \\`role=\"alertdialog\"\\` instead of just \\`\"dialog\"\\``,\n type: Boolean,\n typeDef: 'boolean',\n },\n bodyBackgroundContrast: {\n default: false,\n description: `Whether or not to add a background to the body.\n Should only be used when also using a header and/or footer.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n closeButton: {\n default: true,\n description: `Whether or not to include a \"close\" button at the top of\n modal content.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n footerBorder: {\n default: false,\n description: `Whether or not to add a border to the footer.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n fullHeight: {\n default: false,\n description: `Removes the vertical padding from the modal content and\n removes header/footer. Essentially makes the body full-height.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n fullWidth: {\n default: false,\n description: `Removes the horizontal padding from the modal content.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n headerBorder: {\n default: false,\n description: `Whether or not to add a border to the header.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n modalId: {\n default: undefined,\n description: `Sets the \\`id\\` attribute of the modal element and this\n value is emitted when closing the modal.`,\n type: String,\n typeDef: 'string',\n },\n preloaded: {\n default: false,\n description: `If \\`true\\`, the content will always be rendered via\n \\`v-show\\` rather than \\`v-if\\`.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n shown: {\n default: true,\n description: `Whether or not the element should be visible. Acts as a\n \\`v-if\\` over the content (unless \\`preloaded\\`). Defaults to \\`true\\`\n so the transition would play on mount if desired.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n size: {\n default: 'base',\n description: `Sets the initial size and style of the modal.`,\n type: String,\n typeDef: `'' | 'base' | 'sm' | 'lg'`,\n typeOptions: ['', 'base', 'sm', 'lg'],\n validator: (value) => {\n return ['', 'base', 'sm', 'lg'].includes(value)\n },\n },\n subtitle: {\n default: undefined,\n description: `The subtitle of the modal. This will be rendered in a\n heading tag at the top of the modal below the title.`,\n type: String,\n typeDef: 'string',\n },\n title: {\n default: undefined,\n description: `The title of the modal. This will be rendered in a heading\n tag at the top of the modal. If the 'title' slot alternative is being\n used, this prop will be overwritten. **Note:** If no title is set,\n \\`aria-label\\` must be added on this component to satisfy accessibility\n requirements.`,\n type: String,\n typeDef: 'string',\n },\n // DEPRECATED\n enterControlled: {\n default: undefined,\n deprecated: true,\n },\n enterTrigger: {\n default: undefined,\n deprecated: true,\n },\n leaveTrigger: {\n default: undefined,\n deprecated: true,\n },\n}\n\nexport const emitDefinitions = {\n 'close': {\n description: `Emits when the user clicks the \"close\" button, clicks the\n backdrop or presses the \"Escape\" key. The \\`modalId\\` prop is emitted\n along with this event.`,\n payloadType: 'string',\n },\n 'x-clicked-close': {\n description: `Emits when the user clicks the \"close\" button. The \\`modalId\\`\n prop is emitted along with this event.`,\n payloadType: 'string',\n },\n 'escape-pressed-close': {\n description: `Emits when the user presses the \"Escape\" key. The \\`modalId\\`\n prop is emitted along with this event.`,\n payloadType: 'string',\n },\n 'backdrop-clicked-close': {\n description: `Emits when the user clicks the backdrop outside the modal. The\n \\`modalId\\` prop is emitted along with this event.`,\n payloadType: 'string',\n },\n 'after-enter': {\n description: `Vue Transition hook. Called when the enter transition has\n finished. The element should be fully rendered by now and may be\n manipulated (e.g. setting focus). Emits the element.`,\n },\n 'after-leave': {\n description: `Vue Transition hook. Called when the leave transition has\n finished. Emits the element.`\n },\n}\n\nexport const slotDefinitions = {\n 'default': {\n description: `The default slot is used to provide the body content of the\n modal.`\n },\n 'title': {\n description: `The named slot 'title' is used to provide a custom title\n beyond just text (e.g. including an icon). Alternative to the \\`title\\`\n prop.`\n },\n 'subtitle': {\n description: `The named slot 'subtitle' is used to provide a custom subtitle\n beyond just text (e.g. including an icon). Alternative to the \\`subtitle\\`\n prop.`\n },\n 'footer': {\n description: `Provide a custom footer.`\n }\n}\n","export const propDefinitions = {\n // REQUIRED\n // none\n // OPTIONAL\n action: {\n default: '',\n description: `Action section text. Not used if the \\`action\\` slot is\n provided.`,\n type: String,\n typeDef: 'string'\n },\n actionIcon: {\n default: '',\n description: `Icon to show with the action text. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`action\\` slot\n is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n company: {\n default: '',\n description: `Company name.`,\n type: String,\n typeDef: 'string'\n },\n email: {\n default: '',\n description: `Email address.`,\n type: String,\n typeDef: 'string'\n },\n imageSize: {\n default: 'lg',\n description: `Profile image size.`,\n type: String,\n typeDef: 'xs|sm|md|lg|xl',\n typeOptions: ['xs', 'sm', 'md', 'lg', 'xl'],\n validator(value) {\n return propDefinitions.imageSize.typeOptions.includes(value)\n }\n },\n imageSrc: {\n default: '',\n description: `Profile image url.`,\n type: String,\n typeDef: 'string'\n },\n initials: {\n default: '',\n description: `Initials to display if no image is provided.`,\n type: String,\n typeDef: 'string'\n },\n jobTitle: {\n default: '',\n description: `Job title.`,\n type: String,\n typeDef: 'string'\n },\n layout: {\n default: 'vertical',\n description: `Profile card layout`,\n type: String,\n typeDef: 'horizontal|vertical',\n typeOptions: ['horizontal', 'vertical'],\n validator(value) {\n return propDefinitions.layout.typeOptions.includes(value)\n }\n },\n linkTo: {\n default: '',\n description: `Pass in the profile URL (to enable client-side routing, pass\n the Vue router instance into \\`router\\` prop).`,\n type: String,\n typeDef: 'string'\n },\n miscMeta: {\n default: '',\n description: `Miscellaneous text which appears last. Not used if the\n \\`misc\\` slot is provided.`,\n type: String,\n typeDef: 'string'\n },\n miscMetaIcon: {\n default: '',\n description: `Icon to show with the misc text. This can be the string name\n (dynamic load) or an actual IconComponent. Not used if the \\`misc\\` slot\n is provided.`,\n type: [String, Object],\n typeDef: 'string|IconComponent',\n },\n profileName: {\n default: '',\n description: `Profile subject's name.`,\n type: String,\n typeDef: 'string'\n },\n router: {\n default: undefined,\n description: `Pass in the Vue router instance to enable client-side routing\n (applicable only when \\`linkTo\\` is provided).`,\n type: Object,\n typeDef: 'Router'\n },\n // DEPRECATED\n /** @DEPRECATED in favor of linkTo */\n href: {\n default: undefined,\n deprecated: true,\n }\n}\n\nexport const emitDefinitions = {\n 'action-toggled': {\n description: `Emitted when the optional action button is clicked.`\n }\n}\n\nexport const slotDefinitions = {\n action: {\n description: `Custom action section of the profile. Will replace the\n \\`actionIcon\\` and \\`action\\` props.`\n },\n misc: {\n description: `Custom misc section of the profile. Will replace the\n \\`miscMetaIcon\\` and \\`misc\\` props.`\n }\n}\n","export const propDefinitions = {\n collapsed: {\n default: false,\n description: `If \\`true\\`, the navigation is collapsed to show only icons.\n This prop can be used with v-model:collapsed for two-way binding.\n Note: This only works when variant is set to 'collapsible'.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n mobileOpen: {\n default: false,\n description: `If \\`true\\`, the mobile navigation is open. This is only\n applicable on tablet or mobile page widths.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n navData: {\n default: () => [],\n description: `The navigation data to be displayed.`,\n type: Array,\n typeDef: `\n Simple Structure:\n {\n // If true, creates a divider-only section without toggle button or title (only when navItems present)\n dividerOnly?: boolean,\n // If true, styles the nav item as app links (used on digital transformation project)\n appLinks?: boolean,\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n // Text to display for the nav item (not shown when dividerOnly is true)\n text: string,\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n to?: string | object,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }\n\n -- or --\n\n Admin Menu Builder Structure:\n {\n // Name of the icon (dynamically loaded) or IconComponent itself\n icon?: string | IconComponent,\n // Unique ID for the nav item\n id: string,\n metaData?: {\n // If true, positions the nav item at the end (right for horizontal, bottom for vertical) and treats as an external link\n external?: boolean,\n },\n // Nested nav items. Only one level deep is supported\n navItems?: NavItem[],\n resource?: {\n // Router path, Router object, or absolute URL. When navItems are present, this is ignored.\n url: string\n },\n // Text to display for the nav item\n text: string,\n // Set the desired behavior of a link. _self, _blank, _parent, _top can be used.\n target?: string\n }`,\n },\n router: {\n default: null,\n description: `Vue Router instance. This is used to highlight the active\n navigation item.`,\n type: Object,\n typeDef: `Router`,\n },\n variant: {\n default: 'wide',\n description: `The variant of the vertical navigation to be displayed.\n Note that when using \\`'narrow\\`' variant, the external links and slotted\n items will not be displayed. The \\`'collapsible'\\` variant enables the collapse\n feature with a toggle button.`,\n type: String,\n typeDef: `'wide'|'narrow'|'collapsible'`,\n validator: (value) => {\n return ['wide', 'narrow', 'collapsible'].includes(value)\n }\n },\n bgVariant: {\n default: '',\n description: `The background color variant of the vertical navigation.\n When set to \\`'bg-base'\\`, the background color will use \\`bg-base\\` instead\n of the default \\`bg-navy-base\\`. Leave empty or omit for default styling.`,\n type: String,\n typeDef: `''|'bg-base'`,\n validator: (value) => {\n return ['', 'bg-base'].includes(value)\n }\n },\n width: {\n default: '',\n description: `Custom width of the vertical navigation. This will override\n the \\`variant\\` prop.`,\n type: String,\n typeDef: 'string',\n },\n sticky: {\n default: false,\n description: `If \\`true\\`, the navigation will use sticky positioning instead\n of fixed positioning on desktop viewports (min-width: 1166px). This is primarily\n used in combination with the App Header component.`,\n type: Boolean,\n typeDef: 'boolean',\n },\n}\n\nexport const emitDefinitions = {\n 'nav-link-clicked': {\n description: `Emitted when a navigation item is clicked. Emits the event\n (\\`ev\\`) and the navigation item (\\`payload\\`). Actual navigation is\n already done by the component, but this can be used to perform any\n additional actions on navigation.`,\n payloadType: `{ ev, payload }`,\n },\n 'update:collapsed': {\n description: `Emitted when the collapsed state changes. Used for v-model:collapsed binding.`,\n payloadType: `boolean`,\n }\n}\n\nexport const slotDefinitions = {\n 'top-content': {\n description: `Content to be displayed at the very top of the navigation list.\n Useful for adding components like inputs, selects, or other custom elements.`\n },\n 'end-items': {\n description: `Additional navigation items to be displayed at the bottom\n of the navigation.`\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 { ref, onMounted, watch, computed } from 'vue'\n\n/**\n * Notifies about the usage of a deprecated prop.\n *\n * @param {object} props Props object.\n * @param {string} propName Deprecated prop name.\n * @param {string} [newPropName] Replacement prop name. If not provided, the\n * warning will not include a suggestion for a new prop.\n * @param {string} [customMessage] Custom message to display in the warning.\n */\nexport function useDeprecatedProp(props, propName, newPropName, customMessage) {\n if (props[propName] !== undefined) {\n let warning = `[Deprecated] The prop \"${propName}\" is deprecated and will be removed in future versions.`\n if (newPropName) {\n warning += ` Please use \"${newPropName}\" instead.`\n }\n if (customMessage) {\n warning += ` ${customMessage}`\n }\n console.warn(warning)\n }\n}\n\n/**\n * Returns a computed property which returns the new or deprecated prop value.\n *\n * @param {object} props Props object.\n * @param {string} propName Deprecated prop name.\n * @param {string} newPropName Replacement prop name.\n * @returns {computed} Computed property that returns the value of the\n * deprecated prop or the new prop.\n */\nexport function useDeprecatedPropActual(props, propName, newPropName) {\n return computed(() => props[propName] || props[newPropName])\n}\n\n/**\n * Helps handle deprecated transition props.\n *\n * @param {object} props Props object.\n * @returns {ref} transition Ref that indicates the transition state.\n */\nexport function useDeprecatedTransition(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}\n","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-accordion.js'\nimport { computed, ref } from 'vue'\nimport { useGenIdAttrs } from '../../composables/genId.js'\nimport { BsIconCaretDown, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { useDeprecatedProp } from '../../composables/deprecated.js'\n\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'headingLevel', undefined, '\\'aria-level\\' and \\'role=heading\\' are no longer set on the header text.')\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\nconst containerRef = ref(null)\nconst isOpen = ref(false)\n\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\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 <BsIcon v-if=\"typeof icon === 'string'\" :name=\"icon\" />\n <component v-else :is=\"icon\" />\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","import { ref, computed, watch, unref } 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 * @returns { rootTag: import('vue').Ref<string>, attrsToBind: object, btnRef: import('vue').Ref<HTMLElement> }\n*/\nexport function useButtonOrLink(props, attrs, defaultTag = 'button') {\n const rootTag = getTag(unref(props), attrs, defaultTag)\n const btnRef = ref()\n\n const additionalAttrs = computed(() => {\n const safeProps = unref(props)\n const isButton = rootTag.value === 'button'\n const attrsRet = {}\n if (isButton) {\n attrsRet.type = attrs.type || 'button'\n attrsRet.autocomplete = \"off\"\n if (safeProps.disabled) attrsRet.disabled = true\n } else if (safeProps.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 toBind.href = hrefUrl.value\n return toBind\n })\n\n const hrefUrl = computed(() => {\n const safeProps = unref(props)\n if (safeProps.linkTo && typeof safeProps.linkTo === 'object') {\n return safeProps.router?.resolve(safeProps.linkTo)?.path || ''\n }\n return safeProps.linkTo || safeProps.href\n })\n\n watch(\n hrefUrl,\n newVal => {\n btnRef.value?.setAttribute('href', newVal)\n }\n )\n\n return { rootTag, attrsToBind, btnRef }\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 { computed, unref } from 'vue'\n\nexport function useClientRouter(props) {\n\n const propUrl = computed(() => {\n const safeProps = unref(props)\n if (safeProps.linkTo && typeof safeProps.linkTo === 'object') {\n return safeProps.router?.resolve(safeProps.linkTo)?.path || ''\n }\n return safeProps.linkTo || safeProps.href || ''\n })\n\n const hrefIsRelative = computed(() => propUrl.value?.startsWith?.('/') || false)\n\n const routeTo = computed(() => {\n const safeProps = unref(props)\n return hrefIsRelative.value && safeProps.router?.navigateTo || safeProps.router?.push || null\n })\n\n\n function onLinkClick(e) {\n const safeProps = unref(props)\n\n if (safeProps.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","<script setup>\nimport { computed, useAttrs, useSlots, unref } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\nimport { BsIcon, BsIconCaretLeft, BsIconCaretRight, BsIconSmallCaretLeft, BsIconSmallCaretRight } from '@wwtdev/bsds-icons-vue3'\nimport { useDeprecatedProp } from '../../composables/deprecated.js'\nimport { propDefinitions } from './defs-circle-button.js'\n\n// Props\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'href', 'linkTo')\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\nconst $slots = useSlots()\nconst { rootTag, attrsToBind, btnRef } = 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 if (props.icon) {\n return props.icon\n }\n\n if (props.iconPosition === 'left') {\n if (props.textBtn || props.size === 'sm') {\n return BsIconSmallCaretLeft\n } else {\n return BsIconCaretLeft\n }\n } else {\n if (props.textBtn || props.size === 'sm') {\n return BsIconSmallCaretRight\n } else {\n return BsIconCaretRight\n }\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</script>\n\n<template>\n <component\n ref=\"btnRef\"\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 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 <BsIcon v-if=\"typeof iconComputed === 'string'\" :name=\"iconComputed\" />\n <component v-else :is=\"iconComputed\" />\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 { propDefinitions, emitDefinitions } from './defs-alert.js'\nimport { BsIconCircleExclamation, BsIconClose, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport BsCaretTextButton from '../caret-text-button/BsCaretTextButton.vue'\nimport { computed } from 'vue'\n\nconst props = defineProps(propDefinitions)\n\nconst emit = defineEmits(Object.keys(emitDefinitions))\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 <template v-if=\"icon\">\n <BsIcon v-if=\"typeof icon === 'string'\" :name=\"icon\" size=\"auto\" />\n <component v-else :is=\"icon\" size=\"auto\" />\n </template>\n <BsIconCircleExclamation v-else 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 { propDefinitions } from './defs-badge.js'\nimport { ref, computed } from 'vue'\n\n// Props\nconst props = defineProps(propDefinitions)\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 { propDefinitions, emitDefinitions } from './defs-banner.js'\nimport { ref } from 'vue'\nimport { BsIconWarning, BsIconClose, BsIcon } from '@wwtdev/bsds-icons-vue3'\n\nconst props = defineProps(propDefinitions)\nconst emit = defineEmits(Object.keys(emitDefinitions))\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 <template v-if=\"icon\">\n <BsIcon v-if=\"typeof icon === 'string'\" :name=\"icon\" size=\"md\" />\n <component v-else :is=\"icon\" size=\"md\" />\n </template>\n <BsIconWarning v-else 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","<script setup>\nimport { propDefinitions } from './defs-button.js'\nimport { useAttrs } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { useClientRouter } from '../../composables/clientRouter.js'\nimport { useDeprecatedProp } from '../../composables/deprecated.js'\n\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'href', 'linkTo')\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\nconst { rootTag, attrsToBind, btnRef } = useButtonOrLink(props, $attrs)\nconst { onLinkClick } = useClientRouter(props)\n</script>\n\n<template>\n <component\n ref=\"btnRef\"\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 v-bind=\"attrsToBind\"\n @click=\"onLinkClick\"\n >\n <slot></slot>\n </component>\n</template>\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'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n error: {\n type: Boolean,\n default: false\n },\n hintId: String,\n modelValue: [String, Number],\n value: [String, Number],\n // DEPRECATED\n inputId: { default: undefined }\n})\nuseDeprecatedProp(props, 'inputId', undefined, 'Set \\'id\\' directly on the component instead.')\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, BsIconClose } 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 showClear: {\n type: Boolean,\n default: false\n }\n})\n\nconst emit = defineEmits(['ui-focusin', 'ui-input', 'clear'])\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 <button\n v-show=\"showClear\"\n aria-label=\"Clear\"\n type=\"button\"\n class=\"bs-calendar-clear-btn\"\n @click=\"$emit('clear')\"\n >\n <BsIconClose size=\"sm\" class=\"bs-text-black\" />\n </button>\n </BsInputAddon>\n</template>","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","import { useAttrs, computed, unref } from 'vue'\n\nexport function useFilterAttrs(keysToFilter = []) {\n\n const attrs = useAttrs()\n\n const isFilterKey = key => unref(keysToFilter).includes(key)\n\n const attrEntries = computed(() => Object.entries(attrs))\n\n const filtered = computed(() => {\n return Object.fromEntries(\n attrEntries.value.filter(([key]) => isFilterKey(key))\n )\n })\n\n const remaining = computed(() => {\n return Object.fromEntries(\n attrEntries.value.filter(([key]) => !isFilterKey(key))\n )\n })\n\n return { filtered, remaining }\n}","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-calendar.js'\nimport { computed, onMounted, ref, 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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport 'v-calendar/style.css'\n\nconst MQ = '(min-width: 752px)'\n\nconst props = defineProps(propDefinitions)\nconst emit = defineEmits(Object.keys(emitDefinitions))\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 } = useFilterAttrs([\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 showClearBtn = computed(() => props.showClear && props.modelValue && !props.disabled)\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) setTimeout(setNavButtonLabels, 100)\n})\n\nwatch(() => calendar.value?.popoverRef?.isVisible, (visible) => {\n if (visible) setTimeout(setNavButtonLabels, 100)\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 :show-clear=\"showClearBtn\"\n :required=\"required\"\n @clear=\"$emit('clear')\"\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 :show-clear=\"showClearBtn\"\n :required=\"required\"\n @ui-focusin=\"showPopover\"\n @ui-input=\"showPopover\"\n @clear=\"$emit('clear')\"\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/* ------------- Clear button ------------- */\n\n.bs-calendar-clear-btn {\n cursor: pointer;\n height: 100%;\n}\n.bs-calendar-clear-btn:focus {\n border-radius: .25rem;\n box-shadow: var(--focus-border) 0px 0px 0px 1px inset;\n z-index: 1;\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, 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, 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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 /** 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 // DEPRECATED\n checkedPartially: { default: undefined },\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'checkedPartially', 'indeterminate')\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Refs & Computed Properties\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=\"filtered\"\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=\"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 </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","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","<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 BsDropdownNew from './BsDropdownNew.vue'\nimport { useDeprecatedProp, useDeprecatedTransition } from '@composables/deprecated.js'\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 width: {\n type: String,\n default: undefined,\n validator: (value) => {\n return ['', 'sm', 'md', 'lg', 'content', 'anchor'].includes(value)\n },\n },\n // DEPRECATED\n center: {\n default: undefined\n },\n enterControlled: {\n default: undefined\n },\n enterTrigger: {\n default: undefined\n },\n leaveTrigger: {\n default: undefined\n },\n right: {\n default: undefined\n },\n toggleId: {\n default: undefined\n },\n top: {\n default: undefined\n }\n})\nuseDeprecatedProp(props, 'center', 'position')\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\nuseDeprecatedProp(props, 'right', 'position')\nuseDeprecatedProp(props, 'toggleId', 'anchorId')\nuseDeprecatedProp(props, 'top', 'position')\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 } = useDeprecatedTransition(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 { propDefinitions } from './defs-dropdown-option-builder.js'\nimport BsDropdownOption from '../dropdown-option/BsDropdownOption.vue'\nimport BsProfileImg from '../profile-img/BsProfileImg.vue'\nimport { BsIcon } from '@wwtdev/bsds-icons-vue3'\n\n// PROPS\nconst props = defineProps(propDefinitions)\n\n// METHODS\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\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 <BsIcon v-if=\"typeof option.icon === 'string'\" :name=\"option.icon\" />\n <component v-else :is=\"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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport { useDeprecatedProp } from '@composables/deprecated.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 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 // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\nconst emit = defineEmits(['clear','update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\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=\"filtered\"\n>\n <BsIconSearch v-if=\"!hideSearchIcon\" />\n <BsInput\n data-autowidth\n :disabled=\"disabled\"\n :id=\"$attrs.id || inputId\"\n :placeholder=\"placeholder\"\n :value=\"value || modelValue\"\n v-bind=\"remaining\"\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","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","<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'\nimport { useDeprecatedProp, useDeprecatedPropActual } from '@composables/deprecated.js'\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\n selectedValue: {\n default: undefined\n },\n})\nuseDeprecatedProp(props, 'selectedValue', undefined, 'Use \\'modelValue\\' (or \\'v-model\\') instead')\nconst selectedValueActual = useDeprecatedPropActual(props, 'selectedValue', 'modelValue')\n\n// EMITS\nconst emit = defineEmits([\n 'close',\n 'options-list-shift-tab',\n 'options-list-tab',\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// 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('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 aria-label=\"separator\" role=\"option\" 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 containerId: {\n type: String,\n default: '',\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 :container-id=\"containerId\"\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 { useFilterAttrs } from '@composables/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\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\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=\"filtered\">\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=\"remaining\"\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\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 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\n // DEPRECATED\n center: {\n default: undefined\n },\n enterControlled: {\n default: undefined\n },\n enterTrigger: {\n default: undefined\n },\n leaveTrigger: {\n default: undefined\n },\n right: {\n default: undefined\n },\n selectedValue: {\n default: undefined\n },\n toggleId: {\n default: undefined\n },\n top: {\n default: undefined\n },\n})\nuseDeprecatedProp(props, 'center', 'position')\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\nuseDeprecatedProp(props, 'right', 'position')\nuseDeprecatedProp(props, 'selectedValue', undefined, 'Use \\'modelValue\\' (or \\'v-model\\') instead')\nuseDeprecatedProp(props, 'toggleId', 'anchorId')\nuseDeprecatedProp(props, 'top', 'position')\n\nconst emit = defineEmits([\n 'update:modelValue',\n 'close',\n 'after-enter',\n 'after-leave'\n])\n\n// Handles enterControlled/enterTrigger/leaveTrigger backwards compatibility\nconst { transition: shownActual } = useDeprecatedTransition(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('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 { ref, computed, useSlots } from 'vue'\nimport { BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { propDefinitions } from './defs-empty-state.js'\n\nconst props = defineProps(propDefinitions)\n\nconst slots = useSlots()\n\nconst loaded = ref(false)\n\n// Handles deprecated prop\nconst iconActual = computed(() => {\n return props.iconName || props.icon\n})\nconst shouldDisplay = computed(() => {\n if (!!!slots['icon'] && typeof iconActual.value === 'string') {\n return loaded.value\n }\n\n return true\n})\n</script>\n\n<template>\n<div\n v-show=\"shouldDisplay\"\n class=\"bs-empty-state\"\n data-component=\"bs-empty-state\"\n :data-size=\"size\"\n>\n <div class=\"bs-empty-state-icon\">\n <slot name=\"icon\">\n <BsIcon\n v-if=\"typeof iconActual === 'string'\"\n :name=\"iconActual\"\n size=\"auto\"\n @loading=\"loaded = false\"\n @loaded=\"loaded = true\"\n />\n <component v-else :is=\"iconActual\" 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, onBeforeUnmount, watch, computed } from 'vue'\n\n// PROPS\nconst props = defineProps({\n active: {\n type: Boolean,\n default: true,\n },\n preventFirstShiftTab: {\n type: Boolean,\n default: false,\n },\n preventLastTab: {\n type: Boolean,\n default: false,\n },\n selectorPrefix: {\n type: String,\n default: '',\n },\n})\n\n// EMITS\nconst emit = defineEmits(['first-shift-tab', 'last-tab' ])\n\n// REFS\nconst focusGuard = ref(null)\n\n// VARIABLES / STATE\nconst FOCUSABLE_ELEMENT_TAGS = [\n 'a[href]',\n 'button',\n 'input',\n 'textarea',\n 'select',\n 'area[href]',\n 'details',\n 'summary',\n '[tabindex]',\n '[contenteditable=\"true\"]',\n]\n\n// COMPUTED\nconst selector = computed(() => {\n // Build selector\n let selector = ''\n FOCUSABLE_ELEMENT_TAGS.forEach((tag) => {\n selector += `${props.selectorPrefix}${tag}:not([disabled]):not([tabindex=\"-1\"]),`\n })\n\n // Remove trailing comma\n selector = selector.slice(0, -1)\n return selector\n})\n\n// LIFE CYCLE HOOKS\nonMounted(() => {\n if (props.active) {\n window.addEventListener('keydown', handleKeydown)\n }\n})\n\nonBeforeUnmount(() => {\n window.removeEventListener('keydown', handleKeydown)\n})\n\n// WATCHERS\nwatch(() => props.active, (newValue) => {\n if (newValue) {\n window.addEventListener('keydown', handleKeydown)\n } else {\n window.removeEventListener('keydown', handleKeydown)\n }\n})\n\n// METHODS\nfunction handleKeydown(ev) {\n if (ev.key === 'Tab') {\n // Find all focusable elements\n // Grabbing these every time since the DOM could change\n const focusableElements = focusGuard.value.querySelectorAll(selector.value)\n const firstElement = focusableElements[0]\n const lastElement = focusableElements[focusableElements.length - 1]\n\n // Handle actual tabbing\n if (document.activeElement === firstElement && ev.shiftKey) {\n handleFirstShiftTab(ev, lastElement)\n } else if (document.activeElement === lastElement && !ev.shiftKey) {\n handleLastTab(ev, firstElement)\n } else if (!focusGuard.value.contains(document.activeElement)) {\n handleOutsideTab(ev, firstElement)\n }\n }\n}\n\nfunction handleFirstShiftTab(ev, lastElement) {\n ev.preventDefault()\n if (!props.preventFirstShiftTab) {\n // Wrap around to the last element\n lastElement.focus()\n }\n emit('first-shift-tab', ev)\n}\n\nfunction handleLastTab(ev, firstElement) {\n ev.preventDefault()\n if (!props.preventLastTab) {\n // Wrap around to the first element\n firstElement.focus()\n }\n emit('last-tab', ev)\n}\n\nfunction handleOutsideTab(ev, firstElement) {\n ev.preventDefault()\n // Current focus is outside the guard, so bring it in\n firstElement.focus()\n}\n</script>\n\n<template>\n<div ref=\"focusGuard\">\n <slot></slot>\n</div>\n</template>\n","import { ref, computed, toRaw } from 'vue'\n\nexport default function useNavigationUtils(props) {\n // STATE\n const collapsedSections = ref({})\n\n // COMPUTED\n const rawNavData = computed(() => toRaw(props.navData))\n\n // METHODS\n function initializeSections(initialValue) {\n rawNavData.value.forEach((item) => {\n if (item.navItems?.length > 0 && !item.dividerOnly) {\n // Only initialize collapse state for non-divider sections\n collapsedSections.value[item.id] = initialValue\n }\n })\n }\n\n function isAbsoluteTo(item) {\n const to = getTo(item)\n return typeof to === 'string' && to.startsWith('http')\n }\n\n function isActivePath(item) {\n const to = getTo(item)\n if (isAbsoluteTo(item)) {\n return window.location.href.startsWith(to)\n }\n\n if (props.router) {\n return to && props.router.resolve(to).path === props.router.currentRoute.value.path\n }\n\n return false\n }\n\n function isExpanded(item) {\n // Divider-only sections are always expanded\n if (item.dividerOnly) return true\n return !collapsedSections.value[item.id]\n }\n\n function getExpandButtonTitle(item) {\n return isExpanded(item) ? `Collapse ${item.text} Section` : `Expand ${item.text} Section`\n }\n\n function getTo(item) {\n if (item.to) {\n return item.to\n } else if (item.resource?.url) {\n return item.resource.url\n } else {\n return null\n }\n }\n\n function getTarget(item) {\n if (item.target) {\n return item.target\n } else {\n return '_self'\n }\n }\n\n return {\n collapsedSections,\n getExpandButtonTitle,\n getTarget,\n getTo,\n initializeSections,\n isAbsoluteTo,\n isActivePath,\n isExpanded,\n rawNavData,\n }\n}\n","<script setup>\nimport useNavigationUtils from '@composables/navigationUtils'\n\nconst props = defineProps({\n item: {\n type: Object,\n required: true\n },\n router: {\n type: Object,\n default: null\n }\n})\n\nconst emit = defineEmits(['nav-link-clicked'])\n\nconst { isAbsoluteTo, isActivePath, getTo, getTarget } = useNavigationUtils(props)\n</script>\n\n<template>\n<a\n v-if=\"isAbsoluteTo(item)\"\n :aria-current=\"isActivePath(item) || undefined\"\n :data-active=\"isActivePath(item)\"\n :href=\"getTo(item)\"\n :target=\"getTarget(item)\"\n @click=\"(ev) => emit('nav-link-clicked', ev)\"\n>\n <slot />\n</a>\n\n<router-link\n v-else\n :aria-current=\"isActivePath(item) || undefined\"\n :data-active=\"isActivePath(item)\"\n :to=\"getTo(item)\"\n :target=\"getTarget(item)\"\n @click=\"(ev) => emit('nav-link-clicked', ev)\"\n>\n <slot />\n</router-link>\n</template>\n","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-horizontal-navigation.js'\nimport { BsIconCaretDown, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { ref, onBeforeMount, watch, onMounted, useId } from 'vue'\nimport useNavigationUtils from '../../composables/navigationUtils'\nimport BsDropdown from '../dropdown/BsDropdown.vue'\nimport { useMatchMedia } from '@composables/matchMedia.js'\nimport NavigationLink from './NavigationLink.vue'\n\n// PROPS\nconst props = defineProps(propDefinitions)\n\n// EMIT\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\n// COMPOSABLES\nconst {\n collapsedSections,\n getExpandButtonTitle,\n initializeSections,\n isActivePath,\n isExpanded,\n rawNavData,\n} = useNavigationUtils(props)\nconst mobileId = useId()\nuseMatchMedia('(max-width: 1165px)', (ev) => {\n isTablet.value = ev.matches\n})\n\n// STATE\nconst isTablet = ref(false)\nconst mobileOpenState = ref(false)\n\n// LIFE CYCLE HOOKS\nonBeforeMount(() => {\n initializeSections(true)\n})\n\nonMounted(() => {\n mobileOpenState.value = props.mobileOpen\n})\n\n// WATCHERS\nwatch(() => props.navData, () => {\n initializeSections(true)\n})\n\nwatch(() => props.mobileOpen, (newVal) => {\n mobileOpenState.value = newVal\n})\n\nwatch(mobileOpenState, (newVal) => {\n if (newVal) {\n document.body.style.overflow = 'hidden'\n } else {\n document.body.style.overflow = ''\n }\n emit('mobile-toggle', newVal)\n})\n\nwatch(isTablet, (newValue, oldValue) => {\n if (newValue !== oldValue) {\n mobileOpenState.value = false\n resetSections()\n }\n})\n\n// METHODS\nfunction toggleSection(sectionId) {\n collapsedSections.value[sectionId] = !collapsedSections.value[sectionId]\n // Close all other sections\n Object.keys(collapsedSections.value).forEach((key) => {\n if (key !== sectionId) {\n collapsedSections.value[key] = true\n }\n })\n}\n\nfunction getMobileToggleTitle() {\n return mobileOpenState.value ? 'Close Menu' : 'Open Menu'\n}\n\nfunction isNestedActive(item) {\n return item.navItems.some((navItem) => isActivePath(navItem))\n}\n\nfunction resetSections() {\n Object.keys(collapsedSections.value).forEach((key) => {\n collapsedSections.value[key] = true\n })\n}\n\nfunction handleNestedClick(ev, item) {\n const modifierKeyPressed = ev.ctrlKey || ev.metaKey\n if (!modifierKeyPressed) {\n toggleSection(item.id)\n }\n emit('nav-link-clicked', { ev, payload: item })\n}\n</script>\n\n<template>\n<!-- Mobile Menu -->\n<nav\n v-if=\"isTablet\"\n class=\"bs-horizontal-nav-mobile\"\n :data-shown=\"mobileOpenState\"\n :data-hide-toggle=\"hideMobileToggle\"\n>\n <button\n v-if=\"!hideMobileToggle\"\n type=\"button\"\n class=\"bs-horizontal-nav-mobile-toggle\"\n :aria-expanded=\"mobileOpen\"\n :aria-controls=\"`horizontal-nav-mobile-${mobileId}`\"\n :title=\"getMobileToggleTitle()\"\n @click=\"mobileOpenState = !mobileOpenState\"\n >\n <div class=\"bs-horizontal-nav-mobile-toggle-title\">\n <BsIcon\n v-if=\"typeof titleIcon === 'string'\"\n class=\"bs-horizontal-nav-mobile-toggle-title-icon\"\n :name=\"titleIcon\"\n />\n <component\n v-else\n :is=\"titleIcon\"\n class=\"bs-horizontal-nav-mobile-toggle-title-icon\"\n />\n <span>{{ mobileToggleText }}</span>\n </div>\n <BsIconCaretDown class=\"bs-horizontal-nav-mobile-toggle-caret\" />\n </button>\n <Transition name=\"bs-horizontal-nav-mobile\">\n <div\n v-show=\"mobileOpen\"\n class=\"bs-horizontal-nav-mobile-menu\"\n :id=\"`horizontal-nav-mobile-${mobileId}`\"\n >\n <!-- Main Links Menu -->\n <ul>\n <template v-for=\"item in rawNavData\" :key=\"item.id\">\n <!-- Nested Items -->\n <li v-if=\"item.navItems?.length > 0\" :data-expanded=\"isExpanded(item)\">\n <button\n type=\"button\"\n class=\"bs-horizontal-nav-mobile-nested-toggle\"\n :aria-expanded=\"isExpanded(item)\"\n :aria-controls=\"`${item.id}-nested-menu`\"\n :data-active=\"isNestedActive(item)\"\n :title=\"getExpandButtonTitle(item)\"\n @click=\"toggleSection(item.id)\"\n >\n <span>{{ item.text }}</span>\n <BsIconCaretDown class=\"bs-horizontal-nav-mobile-nested-toggle-caret\" />\n </button>\n <ul class=\"bs-horizontal-nav-mobile-nested-menu\">\n <li v-for=\"nestedItem in item.navItems\">\n <NavigationLink\n :item=\"nestedItem\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: nestedItem })\"\n >\n {{ nestedItem.text }}\n </NavigationLink>\n </li>\n </ul>\n </li>\n\n <!-- Single Item -->\n <li v-else>\n <NavigationLink\n :item=\"item\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: item })\"\n >\n {{ item.text }}\n </NavigationLink>\n </li>\n </template>\n </ul>\n\n <!-- End Nav Items -->\n <div v-if=\"$slots['end-items']\" class=\"bs-horizontal-nav-mobile-end-items\">\n <slot name=\"end-items\" />\n </div>\n </div>\n </Transition>\n</nav>\n\n<!-- Desktop Menu -->\n<div v-else class=\"bs-horizontal-nav\">\n <nav>\n <!-- Title Icon -->\n <template v-if=\"!title && titleIcon\">\n <BsIcon\n v-if=\"typeof titleIcon === 'string'\"\n class=\"bs-horizontal-nav-title-icon\"\n :name=\"titleIcon\"\n />\n <component\n v-else\n :is=\"titleIcon\"\n class=\"bs-horizontal-nav-title-icon\"\n />\n </template>\n\n <ul>\n <!-- Title Item -->\n <li v-if=\"title\" class=\"bs-horizontal-nav-title\">\n <router-link\n v-if=\"titleUrl\"\n :aria-current=\"isActivePath({ to: titleUrl }) || undefined\"\n :to=\"titleUrl\"\n :data-active=\"isActivePath({ to: titleUrl })\"\n @click=\"(ev) => emit('nav-link-clicked', { ev, payload: { resource: { url: titleUrl }, text: title } })\"\n >\n <span>{{ title }}</span>\n </router-link>\n\n <span v-else>{{ title }}</span>\n </li>\n\n <template v-for=\"(item, index) in rawNavData\" :key=\"item.id\">\n <!-- Nested Items -->\n <li v-if=\"item.navItems?.length > 0\">\n <!-- Nested Toggle -->\n <button\n :id=\"`${item.id}-toggle`\"\n type=\"button\"\n class=\"bs-horizontal-nav-nested-toggle\"\n :aria-expanded=\"isExpanded(item)\"\n :aria-controls=\"`${item.id}-nested-section`\"\n :data-active=\"isNestedActive(item)\"\n :data-expanded=\"isExpanded(item)\"\n :title=\"getExpandButtonTitle(item)\"\n @click=\"toggleSection(item.id)\"\n >\n <span>{{ item.text }}</span>\n <BsIconCaretDown class=\"bs-horizontal-nav-nested-toggle-caret\" />\n </button>\n <!-- Nested Menu -->\n <BsDropdown\n :id=\"`${item.id}-nested-section`\"\n class=\"bs-horizontal-nav-nested-menu\"\n :anchor-id=\"`${item.id}-toggle`\"\n position=\"right\"\n :shown=\"isExpanded(item)\"\n :use-mobile-style=\"false\"\n width=\"content\"\n @close=\"collapsedSections[item.id] = true\"\n >\n <ul>\n <li v-for=\"nestedItem in item.navItems\" :key=\"nestedItem.id\">\n <NavigationLink\n :item=\"nestedItem\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => handleNestedClick(ev, nestedItem)\"\n >\n {{ nestedItem.text }}\n </NavigationLink>\n </li>\n </ul>\n </BsDropdown>\n </li>\n\n <!-- Single Item -->\n <li v-else>\n <NavigationLink\n :item=\"item\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: item })\"\n >\n <span>{{ item.text }}</span>\n </NavigationLink>\n </li>\n </template>\n </ul>\n\n <!-- End Nav Items -->\n <div v-if=\"$slots['end-items']\" class=\"bs-horizontal-nav-end-items\">\n <slot name=\"end-items\" />\n </div>\n </nav>\n</div>\n</template>\n","<script setup>\nimport { ref, onMounted } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.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","export const InlineTabsProvider = Symbol('InlineTabs')","<template>\n <component\n :is=\"rootTag\"\n ref=\"btnRef\"\n class=\"bs-inline-tab\"\n :data-variant=\"variant\"\n :data-selected=\"isSelected || undefined\"\n :aria-pressed=\"rootTag === 'button' ? isSelected : undefined\"\n v-bind=\"attrsToBind\"\n @click=\"onClick\">\n <slot :is-selected />\n </component>\n</template>\n\n<script setup>\nimport { computed, inject, useAttrs } from 'vue'\nimport { useButtonOrLink } from '../../composables/buttonOrLink.js'\nimport { InlineTabsProvider } from './provider-key-inline-tabs'\nimport { propDefinitions } from './defs-inline-tab.js'\n\nconst props = defineProps(propDefinitions)\n\n// BsInlineTabs usage is optional...inject will return null if BsInlineTab is not a child of BsInlineTabs\nconst group = inject(InlineTabsProvider, null)\n\nconst isSelected = computed(() => {\n return group?.isSelected(props.value) || props.selected\n})\n\nconst isDisabled = computed(() => {\n return group?.props.disabled || props.disabled\n})\n\nconst variant = computed(() => {\n return group?.props.variant || props.variant\n})\n\nconst modifiedProps = computed(() => ({\n ...props,\n disabled: isDisabled.value\n}))\n\nconst { rootTag, attrsToBind, btnRef } = useButtonOrLink(modifiedProps, useAttrs(), 'button')\n\n// - - - - - - - - - - - -\n\nfunction onClick(event) {\n setGroupModel()\n}\n\nfunction setGroupModel() {\n if (!group) return\n\n // don't update the model if no new selection was made (so group's @update:model-value won't fire)\n if (isSelected.value && !group.props.multiple) return\n\n group.setModel(props.value)\n}\n</script>\n","<template>\n <component\n :is=\"as\"\n class=\"bs-inline-tab-group\">\n <slot />\n </component>\n</template>\n\n<script setup>\nimport { provide } from 'vue'\nimport { InlineTabsProvider } from './provider-key-inline-tabs.js'\nimport { propDefinitions, emitDefinitions } from './defs-inline-tab-group.js'\n\nconst props = defineProps(propDefinitions)\ndefineEmits(Object.keys(emitDefinitions))\n\nconst model = defineModel({\n type: [String, Object, Number, Array],\n default: undefined,\n required: false\n})\n\nprovide(InlineTabsProvider, {\n props,\n model,\n setModel,\n isSelected\n})\n\n// - - - - - - - - - - - - - -\n\nfunction isSelected(val) {\n if (!model.value) return false\n\n // single model\n if (!props.multiple) return isMatch(model.value, val)\n\n // a little DX for multiple model, just in case...\n if (!Array.isArray(model.value)) {\n throw new Error(`[BsInlineTabs] When \"multiple\" prop is used, v-model must be an Array. Your model: ${model.value}`)\n }\n\n // multiple model\n return model.value.some(it => isMatch(it, val))\n}\n\nfunction isMatch(a, b) {\n const { matcher } = props\n\n if (isObject(a) && isObject(b)) {\n return typeof matcher === 'function'\n ? matcher(a) === matcher(b)\n : a[matcher] === b[matcher]\n }\n\n return a === b\n}\n\nfunction isObject(val) {\n return typeof val === 'object' && val !== null && !Array.isArray(val)\n}\n\nfunction setModel(val) {\n model.value = props.multiple\n ? getArrayModel(val)\n : val\n}\n\nfunction getArrayModel(val) {\n if (!model.value) return [val]\n\n return isSelected(val)\n ? model.value.filter(it => !isMatch(it, val))\n : [ ...model.value, val ]\n}\n</script>\n","<script setup>\nimport { computed } from 'vue'\nimport { useGenIdAttrs } from '@composables/genId.js'\nimport { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsInput from '../input/BsInput.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 /** 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 // DEPRECATED\n hints: { default: undefined },\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'hints', undefined, 'Use \\'hint\\' and/or \\'errorMsg\\. instead.')\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\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\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\">\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=\"remaining\"\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 { useFilterAttrs } from '@composables/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\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\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=\"filtered\"\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 :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=\"remaining\"\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 breakout: {\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 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 replaceHtml = `<span style=\"color: var(--bs-blue-base)\">${filterValue}</span>`\n if (filterFunc === 'includes') {\n labelHtml = option.label.replaceAll(filterValue, replaceHtml)\n } else {\n labelHtml = option.label.replace(filterValue, replaceHtml)\n }\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 :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 :breakout=\"breakout\"\n :preloaded=\"true\"\n :shown=\"optionsShown\"\n :use-mobile-style=\"false\"\n width=\"anchor\"\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n shown: {\n type: Boolean,\n default: true,\n },\n preloaded: {\n type: Boolean,\n default: false,\n },\n // DEPRECATED\n enterControlled: {\n default: undefined,\n },\n enterTrigger: {\n default: undefined,\n },\n leaveTrigger: {\n default: undefined,\n },\n})\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\n\nconst emit = defineEmits(['after-enter', 'after-leave'])\n\nconst { transition } = useDeprecatedTransition(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 { propDefinitions, emitDefinitions } from './defs-modal.js'\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\nimport { useGenIdAttrs } from '@composables/genId'\nimport useClickAway from '../../composables/clickAway'\nimport BsFocusGuard from '../focus-guard/BsFocusGuard.vue'\n\n// PROPS\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\n\n// EMITS\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\n// REFS / VARIABLES\nconst modalRef = ref(null)\nlet isVisible = false\n\n// COMPOSABLES\nconst { transition } = useDeprecatedTransition(props)\nconst [ titleId ] = useGenIdAttrs()\nconst [ subtitleId ] = useGenIdAttrs()\nconst slots = useSlots()\nuseClickAway([modalRef], () => closeModal('backdrop-clicked-close'))\nuseKeydown(['Escape'], () => closeModal('escape-pressed-close'))\n\n// COMPUTED\nconst hasTitle = computed(() => {\n return !!(props.title || slots.title)\n})\nconst hasSubtitle = computed(() => {\n return !!(props.subtitle || slots.subtitle)\n})\nconst hasProgress = computed(() => {\n return !!slots.progress\n})\nconst hasHeader = computed(() => {\n return !props.fullHeight && hasTitle.value\n})\nconst hasFooter = computed(() => {\n return !props.fullHeight && !!slots.footer\n})\n\n// METHODS\nfunction closeModal(customEventName, checkForShownChild = true) {\n const hasShownChild = checkForShownChild && modalRef.value?.querySelector('[data-shown=\"true\"]') !== null\n if (isVisible && !hasShownChild) {\n emit('close', props.modalId)\n emit(customEventName, props.modalId)\n }\n}\n\ndefineOptions({ inheritAttrs: false })\n</script>\n\n<template>\n<BsOverlay\n :enter-controlled=\"enterControlled\"\n :enter-trigger=\"enterTrigger\"\n :leave-trigger=\"leaveTrigger\"\n :preloaded=\"preloaded\"\n :shown=\"transition\"\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 class=\"bs-modal\"\n :id=\"modalId\"\n ref=\"modalRef\"\n :aria-labelledby=\"title && !$attrs['aria-label'] ? titleId : undefined\"\n aria-modal=\"true\"\n :data-body-background-contrast=\"bodyBackgroundContrast\"\n data-component=\"bs-modal\"\n :data-footer-border=\"footerBorder\"\n :data-full-height=\"fullHeight\"\n :data-full-width=\"fullWidth\"\n :data-header-border=\"headerBorder\"\n :data-shown=\"transition\"\n :data-size=\"size\"\n :role=\"alert ? 'alertdialog' : 'dialog'\"\n v-bind=\"$attrs\"\n >\n <BsFocusGuard :active=\"transition\">\n <header v-if=\"hasHeader\" class=\"bs-modal-header-container\">\n <!-- HEADER ROW -->\n <div class=\"bs-modal-header\">\n <!-- TITLE -->\n <template v-if=\"hasTitle\">\n <slot name=\"title\">\n <span\n v-if=\"title\"\n class=\"bs-modal-title\"\n :id=\"titleId\"\n >\n {{ title }}\n </span>\n </slot>\n </template>\n\n <!-- CLOSE BUTTON (HEADER) -->\n <button\n v-if=\"closeButton\"\n class=\"bs-modal-close-button\"\n aria-label=\"Close Modal\"\n title=\"Close Modal\"\n type=\"button\"\n @click=\"closeModal('x-clicked-close', false)\"\n >\n <BsIconClose></BsIconClose>\n </button>\n </div>\n\n <!-- SUBTITLE ROW -->\n <div v-if=\"hasSubtitle\" class=\"bs-modal-subtitle\">\n <slot name=\"subtitle\">\n <span :id=\"subtitleId\">{{ subtitle }}</span>\n </slot>\n </div>\n\n <!-- PROGRESS ROW -->\n <div v-if=\"hasProgress\" class=\"bs-modal-progress\">\n <slot name=\"progress\"></slot>\n </div>\n </header>\n\n <!-- CLOSE BUTTON (FULL-HEIGHT) -->\n <button\n v-if=\"closeButton && !hasHeader\"\n class=\"bs-modal-close-button\"\n aria-label=\"Close Modal\"\n title=\"Close Modal\"\n type=\"button\"\n @click=\"closeModal('x-clicked-close', false)\"\n >\n <BsIconClose></BsIconClose>\n </button>\n\n <!-- BODY -->\n <div class=\"bs-modal-body\">\n <slot></slot>\n </div>\n\n <!-- FOOTER -->\n <footer v-if=\"hasFooter\" class=\"bs-modal-footer\">\n <slot name=\"footer\"></slot>\n </footer>\n </BsFocusGuard>\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 import { useDeprecatedProp, useDeprecatedPropActual } from '@composables/deprecated.js'\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 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 // DEPRECATED\n selection: {\n default: undefined\n },\n })\n useDeprecatedProp(props, 'selection', undefined, 'Use \\'modelValue\\' (or \\'v-model\\') instead')\n const value = useDeprecatedPropActual(props, 'selection', 'modelValue')\n\n // EMITS\n const emit = defineEmits(['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 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('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 :disabled=\"valueState === page || breakText === 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 || breakText === 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 ref=\"btnRef\"\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 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'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n active: { type : Boolean, default: false },\n disabled: { type: Boolean, default: false },\n linkTo: { type: [String, Object] },\n router: {},\n status: {\n type: String,\n validator: val => ['active', 'complete', 'disabled', '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 // DEPRECATED\n href: { default: undefined },\n})\nuseDeprecatedProp(props, 'href', 'linkTo')\n\ndefineOptions({ inheritAttrs: false })\n\nconst { onLinkClick } = useClientRouter(props)\n\nconst $attrs = useAttrs()\n\nconst { rootTag, attrsToBind, btnRef } = 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 { BsIcon } from '@wwtdev/bsds-icons-vue3'\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, Object],\n miscMeta: String,\n miscMetaIcon: [String, Object]\n})\nconst emit = defineEmits(['action-toggled'])\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 <template v-if=\"actionIcon\">\n <BsIcon\n v-if=\"typeof actionIcon === 'string'\"\n :name=\"actionIcon\"\n class=\"bs-icon\"\n />\n <component v-else :is=\"actionIcon\" class=\"bs-icon\" />\n </template>\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 <template v-if=\"miscMetaIcon\">\n <BsIcon\n v-if=\"typeof miscMetaIcon === 'string'\"\n :name=\"miscMetaIcon\"\n class=\"bs-icon\"\n />\n <component v-else :is=\"miscMetaIcon\" class=\"bs-icon\" />\n </template>\n {{ miscMeta }}\n </slot>\n </span>\n</div>\n</template>\n","<script setup>\nimport { 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'\nimport { propDefinitions, emitDefinitions } from './defs-profile.js'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps(propDefinitions)\nuseDeprecatedProp(props, 'href', 'linkTo')\n\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\ndefineOptions({ inheritAttrs: false })\nconst $attrs = useAttrs()\n\nconst { onLinkClick } = useClientRouter(props)\nconst { rootTag, attrsToBind, btnRef } = 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\n ref=\"btnRef\"\n :is=\"rootTag\"\n class=\"bs-profile\"\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 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 // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\n\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\"\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=\"remaining\"\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsSelect from '../select/BsSelect.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 /** 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 // DEPRECATED\n hints: { default: undefined },\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'hints', undefined, 'Use \\'hint\\' and/or \\'errorMsg\\. instead.')\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\">\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=\"remaining\"\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\n// PROPS\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, Number, Object ],\n default: undefined\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})\n\n// EMITS\nconst emit = defineEmits(['update:model-value'])\n\n// COMPOSABLES\nconst [ selectIdGen, optionsIdGen ] = useGenIdAttrs(2)\nconst attrs = useAttrs()\n\n// STATE\nconst isOpen = ref(false)\n\n// COMPUTED\nconst selectIdComp = computed(() => {\n return props.selectId || attrs.id || selectIdGen.value\n})\nconst optionsIdComp = computed(() => props.optionsId || optionsIdGen.value)\nconst buttonText = computed(() => {\n if (props.modelValue) {\n const matchedOption = props.options.find((option) => {\n // Object options, find a match by id\n if (option.value?.[props.valueIdKey]) {\n return option.value[props.valueIdKey] === props.modelValue?.[props.valueIdKey]\n }\n // String or Number options, find a match by value\n return option.value === props.modelValue\n })\n\n if (matchedOption) {\n return matchedOption.label\n }\n }\n\n // Default to placeholder if no match or no selected value\n return props.placeholder\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsLabel from '../label/BsLabel.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 size: {\n type: String,\n validator: (value) => value === 'sm',\n },\n modelValue: {\n type: Boolean\n },\n // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\n\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen ] = useGenIdAttrs()\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\"\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-size=\"size\"\n >\n <input\n :checked=\"isChecked\"\n :disabled=\"disabled\"\n :id=\"$attrs.id || inputIdAttr\"\n type=\"checkbox\"\n v-bind=\"remaining\"\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/genId.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()\nconst tablistEl = 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(tablistEl.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</script>\n\n<template>\n<div\n class=\"bs-tab-list\"\n ref=\"hostEl\"\n :id=\"$attrs.id || tabListAutoId\"\n data-component=\"bs-tab-list\"\n :data-resizing=\"!adaptedToWidth || undefined\"\n>\n <div\n class=\"bs-tab-list-tabs\"\n ref=\"tablistEl\"\n role=\"tablist\"\n @click=\"handleTabClick\"\n @tabClick=\"e => fireTabChange(e.detail)\"\n @keydown=\"handleTabNav\"\n >\n <slot />\n </div>\n\n <!-- \"More...\" button -->\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\n <!-- Hidden tabs dropdown -->\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 './provider-keys-table'\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 './provider-keys-table'\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>","<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.bsTableColResize === '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.bsTableColResizeId ? 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.bsTableColResizeMin?.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.bsTableColResizeId,\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(`[BsTable] BsTableCol 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('[BsTable] BsTableCol \"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('[BsTable] BsTableCol \"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(`[BsTable warn] Invalid prop: BsFrozenCols 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","<script setup>\nimport { computed } from 'vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\n\nconst props = defineProps({\n error: {\n type: Boolean,\n default: false\n },\n hintId: String,\n value: String,\n modelValue: String,\n // DEPECATED\n inputId: { default: undefined }\n})\nuseDeprecatedProp(props, 'inputId', undefined, 'Set \\'id\\' directly on the component instead.')\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 { useFilterAttrs } from '@composables/filterAttrs.js'\nimport BsFieldDetails from '../field-details/BsFieldDetails.vue'\nimport BsLabel from '../label/BsLabel.vue'\nimport BsTextarea from '../textarea/BsTextarea.vue'\nimport { useDeprecatedProp } from '@composables/deprecated.js'\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 /** 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 // DEPRECATED\n passAttrs: { default: undefined },\n})\nuseDeprecatedProp(props, 'passAttrs', undefined, 'Use Vue\\'s native fallthrough attributes instead.')\nconst emit = defineEmits(['update:modelValue'])\n\n// allocate attributes to root and/or child elements\ndefineOptions({ inheritAttrs: false })\nconst [ inputIdGen, hintId ] = useGenIdAttrs(2)\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\n// Computed Properties\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=\"filtered\">\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=\"remaining\"\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 { useFilterAttrs } from '@composables/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)\n\nconst { filtered, remaining } = useFilterAttrs(['class', 'style'])\n\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=\"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 <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=\"remaining\"\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 { useDeprecatedTransition, useDeprecatedProp } from '@composables/deprecated.js'\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\n enterControlled: {\n default: undefined\n },\n enterTrigger: {\n default: undefined\n },\n leaveTrigger: {\n default: undefined\n }\n})\nuseDeprecatedProp(props, 'enterControlled', 'preloaded')\nuseDeprecatedProp(props, 'enterTrigger', 'shown')\nuseDeprecatedProp(props, 'leaveTrigger', 'shown')\n\nconst emit = defineEmits(['dismiss', 'after-enter', 'after-leave'])\n\ndefineOptions({ inheritAttrs: false })\n\nconst { transition } = useDeprecatedTransition(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","<script setup>\nimport { propDefinitions, emitDefinitions } from './defs-vertical-navigation.js'\nimport { BsIconCaretUp, BsIconCaretLeft, BsIconCaretRight, BsIcon } from '@wwtdev/bsds-icons-vue3'\nimport { ref, watch, onMounted, computed } from 'vue'\nimport useNavigationUtils from '../../composables/navigationUtils'\nimport { useMatchMedia } from '@composables/matchMedia.js'\nimport NavigationLink from './NavigationLink.vue'\n\n// PROPS\nconst props = defineProps(propDefinitions)\n\n// EMITS\nconst emit = defineEmits(Object.keys(emitDefinitions))\n\n// COMPOSABLES\nconst {\n collapsedSections,\n getExpandButtonTitle,\n initializeSections,\n isExpanded,\n rawNavData,\n} = useNavigationUtils(props)\nuseMatchMedia('(max-width: 1165px)', (ev) => {\n isTablet.value = ev.matches\n})\n\n// REFS\nconst verticalNav = ref(null)\nconst toggleButton = ref(null)\n\n// STATE\nconst isTablet = ref(false)\nconst internalCollapsed = ref(props.collapsed)\n\n// COMPUTED\nconst isNarrow = computed(() => {\n return !props.width && props.variant === 'narrow'\n})\n\nconst isCollapsible = computed(() => {\n return props.variant === 'collapsible'\n})\n\nconst isEffectivelyCollapsed = computed(() => {\n if (!isCollapsible.value || isTablet.value) return false\n return internalCollapsed.value\n})\n\n// LIFE CYCLE HOOKS\nonMounted(() => {\n initializeSections(false)\n})\n\n// WATCHERS\nwatch(() => props.navData, () => {\n initializeSections(false)\n})\n\n// Watch for button ref changes (when it mounts/unmounts due to v-if)\nwatch(toggleButton, (button) => {\n if (button && props.width) {\n button.style.setProperty('--bs-vertical-nav-width', props.width)\n }\n})\n\nwatch(() => props.collapsed, (newVal) => {\n internalCollapsed.value = newVal\n})\n\n// Set CSS variables on document body for page layout (CSS-only approach)\n// This allows page content to respond to navigation width changes without JavaScript\n// IMPORTANT: We use internalCollapsed directly (not isEffectivelyCollapsed) so hover doesn't shift layout\nwatch([() => internalCollapsed.value, isNarrow, () => props.width, isCollapsible, isTablet], \n ([collapsed, narrow, customWidth, collapsible, tablet]) => {\n // Calculate the actual width for page layout (ignoring hover state)\n let layoutWidth = '0px'\n \n // Only check collapsible state and collapsed state, ignore hover\n const isActuallyCollapsed = collapsible && !tablet && collapsed\n \n if (isActuallyCollapsed) {\n layoutWidth = '4rem' // 64px collapsed\n } else if (customWidth) {\n layoutWidth = customWidth // Use custom width as-is\n } else if (narrow) {\n layoutWidth = '4.5rem' // 72px narrow\n } else {\n layoutWidth = '9.875rem' // 158px wide\n }\n \n // Set CSS variable on body that page layout can use\n document.body.style.setProperty('--bs-page-nav-width', layoutWidth)\n}, { immediate: true })\n\nwatch(() => props.width, (newValue) => {\n if (newValue) {\n verticalNav.value.style.setProperty('--bs-vertical-nav-width', newValue)\n // Also update toggle button if it exists\n if (toggleButton.value) {\n toggleButton.value.style.setProperty('--bs-vertical-nav-width', newValue)\n }\n } else {\n verticalNav.value.style.removeProperty('--bs-vertical-nav-width')\n // Also remove from toggle button if it exists\n if (toggleButton.value) {\n toggleButton.value.style.removeProperty('--bs-vertical-nav-width')\n }\n }\n})\n\nwatch(() => props.mobileOpen, (newVal) => {\n if (newVal) {\n document.body.style.overflow = 'hidden'\n verticalNav.value.style.setProperty('visibility', 'visible')\n verticalNav.value.style.setProperty('pointer-events', 'auto')\n setTimeout(() => {\n verticalNav.value.style.setProperty('opacity', '1')\n }, 0)\n } else {\n document.body.style.overflow = ''\n verticalNav.value.style.removeProperty('opacity')\n verticalNav.value.style.removeProperty('pointer-events')\n setTimeout(() => {\n verticalNav.value.style.removeProperty('visibility')\n }, 200)\n }\n})\n\n// METHODS\nfunction toggleSection(sectionId) {\n collapsedSections.value[sectionId] = !collapsedSections.value[sectionId]\n}\n\nfunction toggleCollapsed() {\n internalCollapsed.value = !internalCollapsed.value\n emit('update:collapsed', internalCollapsed.value)\n}\n</script>\n\n<template>\n <div class=\"bs-vertical-nav-wrapper\" :data-bg-variant=\"props.bgVariant || undefined\">\n <!-- Collapse Toggle Button -->\n <button\n v-if=\"isCollapsible && !isTablet\"\n ref=\"toggleButton\"\n class=\"bs-vertical-nav-toggle\"\n type=\"button\"\n :aria-expanded=\"!internalCollapsed\"\n :title=\"internalCollapsed ? 'Expand navigation' : 'Collapse navigation'\"\n :data-collapsed=\"isEffectivelyCollapsed\"\n :data-narrow=\"isNarrow\"\n @click=\"toggleCollapsed\"\n >\n <BsIconCaretRight v-if=\"internalCollapsed\" class=\"bs-vertical-nav-toggle-icon\" />\n <BsIconCaretLeft v-else class=\"bs-vertical-nav-toggle-icon\" />\n </button>\n\n <nav\n class=\"bs-vertical-nav\"\n ref=\"verticalNav\"\n :data-narrow=\"isNarrow\"\n :data-collapsed=\"isEffectivelyCollapsed\"\n :data-collapsible=\"isCollapsible\"\n :data-sticky=\"props.sticky || undefined\"\n :style=\"props.width && !isEffectivelyCollapsed ? { width: props.width } : undefined\"\n >\n <!-- Upper / Main Secondary Nav Options -->\n <ul>\n <!-- Top Content Slot -->\n <li v-if=\"$slots['top-content']\" class=\"bs-vertical-nav-top-content\">\n <slot name=\"top-content\" />\n </li>\n\n <template v-for=\"item in rawNavData\" :key=\"item.id\">\n <!-- Section (Collapsible or Divider-Only) -->\n <li\n v-if=\"item.navItems?.length > 0\"\n class=\"bs-vertical-nav-section\"\n :data-collapsed=\"!item.dividerOnly && !isExpanded(item)\"\n :data-divider-only=\"item.dividerOnly\"\n :data-app-links=\"item.appLinks\"\n >\n <!-- Toggle button (only shown if not divider-only) -->\n <button\n v-if=\"!item.dividerOnly && !isNarrow && !isEffectivelyCollapsed\"\n class=\"bs-vertical-nav-section-toggle\"\n :aria-expanded=\"isExpanded(item)\"\n :aria-controls=\"`${item.id}-nested-section`\"\n :title=\"getExpandButtonTitle(item)\"\n type=\"button\"\n @click=\"toggleSection(item.id)\"\n >\n <span v-if=\"!isEffectivelyCollapsed\">{{ item.text }}</span>\n <BsIconCaretUp class=\"bs-vertical-nav-section-toggle-caret\" />\n </button>\n\n <!-- Nested Items (always visible for divider-only sections) -->\n <ul v-show=\"item.dividerOnly || isExpanded(item) || isEffectivelyCollapsed\" :id=\"`${item.id}-nested-section`\">\n <li v-for=\"nestedItem in item.navItems\" :key=\"nestedItem.id\">\n <NavigationLink\n :item=\"nestedItem\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: nestedItem })\"\n :aria-label=\"nestedItem.text\"\n >\n <BsIcon\n v-if=\"typeof nestedItem.icon === 'string'\"\n class=\"bs-vertical-nav-link-icon\"\n :name=\"nestedItem.icon\"\n />\n <component\n v-else\n :is=\"nestedItem.icon\"\n class=\"bs-vertical-nav-link-icon\"\n />\n <span>{{ nestedItem.text }}</span>\n </NavigationLink>\n </li>\n </ul>\n </li>\n\n <!-- Single Item -->\n <li v-else>\n <NavigationLink\n :item=\"item\"\n :router=\"router\"\n @nav-link-clicked=\"(ev) => emit('nav-link-clicked', { ev, payload: item })\"\n :aria-label=\"item.text\"\n >\n <BsIcon\n v-if=\"typeof item.icon === 'string'\"\n class=\"bs-vertical-nav-link-icon\"\n :name=\"item.icon\"\n />\n <component\n v-else\n :is=\"item.icon\"\n class=\"bs-vertical-nav-link-icon\"\n />\n <span>{{ item.text }}</span>\n </NavigationLink>\n </li>\n </template>\n </ul>\n\n <!-- End Items -->\n <div v-if=\"$slots['end-items']\" class=\"bs-vertical-nav-end-items\">\n <slot name=\"end-items\" />\n </div>\n </nav>\n </div>\n</template>\n"],"names":["bsSelectors","selectors","propDefinitions","emitDefinitions","slotDefinitions","value","val","useGenIdAttrs","quantity","ids","i","ref","useId","useDeprecatedProp","props","propName","newPropName","customMessage","warning","useDeprecatedPropActual","computed","useDeprecatedTransition","transition","onMounted","watch","__props","emit","__emit","containerRef","isOpen","containerId","contentId","headingId","openItemMatch","showContent","handleToggled","TAG_BY_PROP","useButtonOrLink","attrs","defaultTag","rootTag","getTag","unref","btnRef","additionalAttrs","safeProps","isButton","attrsRet","attrsToBind","toBind","hrefUrl","_b","_a","newVal","foundProp","key","getProp","useClientRouter","propUrl","hrefIsRelative","routeTo","onLinkClick","e","$attrs","useAttrs","$slots","useSlots","accessibleLabelAttr","isTextBtn","hoverDirection","iconComputed","BsIconSmallCaretLeft","BsIconCaretLeft","BsIconSmallCaretRight","BsIconCaretRight","textLeft","textRight","variantPrefixed","buttonVariant","hostRef","countFmt","labelFmt","base","ct","sfx","isDismissed","handleDismiss","hintMsg","aria","handleInput","debounce","func","wait","immediate","timeout","context","args","hiddenStart","hiddenEnd","dispatchRangeChange","el","ev","handleRangeChange","start","end","handleRangeChangeDebounced","handleRangeInput","startListener","endListener","useCalendarWorkaround","isNavBtn","isSpaceOrEnter","keydownWorkaround","onBeforeUnmount","useMatchMedia","query","handlerFn","watchList","mediaQuery","onBeforeMount","useFilterAttrs","keysToFilter","isFilterKey","attrEntries","filtered","remaining","MQ","calendar","columns","container","inputIdGen","hintId","steps","toChild","toRoot","disabledDatesComputed","getBlackoutDates","inputIdAttr","modifiers","showClearBtn","showFieldDetails","stepRef","variantRef","setNavButtonLabels","visible","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","useKeydown","keys","onKeydown","elRef","handler","k","onUnmounted","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","options","plugins","showTooltips","BsChartBarConfig","dataset","scaleOpts","tickFontOpts","updatedOpts","BsChartLineConfig","optionsArg","title","BarController","BarElement","CategoryScale","LinearScale","Legend","TimeScale","Tooltip","inputEl","isChecked","isModelValueChecked","isIndeterminate","isVModelArray","setIndeterminate","doVModelSimple","checked","doVModelComplex","newValue","onChange","internalContainerRef","__expose","useBreakout","createBreakout","id","position","breakoutId","breakoutStub","breakoutMounted","isPreExisting","useClickAway","elRefs","onClickAway","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","getVariant","option","variant","useAltText","profileName","label","showClear","useMutationObserver","targetRef","callback","observer","selectedValueActual","optionsRef","activeDescendantId","activeIndex","selectedIndex","optionEls","hasOverflow","registeredOptionsById","dropdownShown","refreshOptions","handleKeyboardSelect","handleKeyDown","typeToFocusKeys","typeToFocusData","typeToFocus","handleShownChange","entered","optionsLen","scrollOptionsListIntoView","scrollCurrentActiveIntoView","setCurrentActive","removeCurrentActive","handleOptionsFocus","handleShown","handleNotShown","traverse","direction","newIndex","updateCurrentActive","ttfState","matchIdx","activeIdx","withFocus","optlist","selectedLocalOptions","unselectedLocalOptions","showDivider","hasSomeOptions","refocusPending","sortSelectedUnselected","nextTick","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","slots","loaded","iconActual","shouldDisplay","flyoutRef","closeFlyout","hasShownChild","focusGuard","FOCUSABLE_ELEMENT_TAGS","selector","tag","handleKeydown","focusableElements","firstElement","lastElement","handleFirstShiftTab","handleLastTab","handleOutsideTab","useNavigationUtils","collapsedSections","rawNavData","toRaw","initializeSections","initialValue","isAbsoluteTo","to","getTo","isActivePath","isExpanded","getExpandButtonTitle","getTarget","mobileId","isTablet","mobileOpenState","oldValue","resetSections","toggleSection","sectionId","getMobileToggleTitle","isNestedActive","navItem","handleNestedClick","svgWrapperRef","viewBox","stops","uniqueId","InlineTabsProvider","group","isSelected","isDisabled","modifiedProps","onClick","event","setGroupModel","model","_useModel","setModel","isMatch","matcher","isObject","getArrayModel","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","replaceHtml","selectedOption","handleCheck","handleUncheck","setBodyScroll","modalRef","isVisible","titleId","subtitleId","closeModal","hasTitle","hasSubtitle","hasProgress","hasHeader","hasFooter","customEventName","checkForShownChild","valueState","resultsNumbers","actualPageCount","computedVariant","handleFirstNav","handlePrevNav","handleNextNav","handleLastNav","pages","pageTextDisplay","groupTextDisplay","first","last","increment","handleActionToggle","useSteps","progressStep","step","progressText","getStatus","status","selectIdGen","optionsIdGen","selectIdComp","optionsIdComp","buttonText","matchedOption","placeholderShown","hostEl","isActive","panelIdComputed","handleTabSelection","DEFAULT_TOGGLE_WIDTH","ELLIPSIS_WIDTH","TAB_GAP","adaptedToWidth","dropdownMounted","hiddenTabs","showDropdown","showDropdownToggle","tablistEl","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","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","shallowRef","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","j","getTimeString","skipOrStop","getSkipOrStop","checkConstraints","hour","minute","handleComboboxChange","formattedValue","updateWithValidation","setOptions","timePicker","STATUSES_ICONS","BsIconCircleStop","BsIconCircleCheck","BsIconCircleX","BsIconCircleEllipsis","BsIconGraphPieEmpty","BsIconCirclePlay","BsIconCirclePause","BsIconCircleExclamation","getIcon","autoDismissTimer","handleEnterEnd","isStacked","icon","BsIconWarning","BsIconThumbsUpStroke","isHoverOrFocused","isEscaped","getTooltipTextClass","cssClass","handleEnterOrFocus","handleLeaveOrFocusOut","verticalNav","toggleButton","internalCollapsed","isNarrow","isCollapsible","isEffectivelyCollapsed","button","collapsed","narrow","customWidth","collapsible","tablet","layoutWidth","toggleCollapsed"],"mappings":"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"}