bootstrap-vue-next 0.46.1 → 0.46.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.
- package/dist/{BFormSpinbutton-Bt590uT6.js → BFormSpinbutton-fkVMbQC3.js} +4 -2
- package/dist/BFormSpinbutton-fkVMbQC3.js.map +1 -0
- package/dist/{BTabs-BVcu9DPg.js → BTabs-BKmkVWrZ.js} +4 -4
- package/dist/BTabs-BKmkVWrZ.js.map +1 -0
- package/dist/bootstrap-vue-next.mjs +2 -2
- package/dist/src/components/BFormSpinbutton/index.mjs +1 -1
- package/dist/src/components/BTabs/index.mjs +1 -1
- package/dist/src/components/index.mjs +2 -2
- package/package.json +1 -1
- package/dist/BFormSpinbutton-Bt590uT6.js.map +0 -1
- package/dist/BTabs-BVcu9DPg.js.map +0 -1
|
@@ -22,6 +22,7 @@ var _hoisted_3 = [
|
|
|
22
22
|
"dir",
|
|
23
23
|
"tabindex",
|
|
24
24
|
"aria-label",
|
|
25
|
+
"aria-controls",
|
|
25
26
|
"aria-invalid",
|
|
26
27
|
"aria-required",
|
|
27
28
|
"aria-valuemin",
|
|
@@ -421,7 +422,8 @@ var BFormSpinbutton_default = /* @__PURE__ */ defineComponent({
|
|
|
421
422
|
role: "spinbutton",
|
|
422
423
|
"aria-live": "off",
|
|
423
424
|
"aria-label": unref(props).ariaLabel || void 0,
|
|
424
|
-
"aria-
|
|
425
|
+
"aria-controls": unref(props).ariaControls || void 0,
|
|
426
|
+
"aria-invalid": unref(props).state === false || modelValue.value === null && unref(props).required ? true : void 0,
|
|
425
427
|
"aria-required": unref(props).required ? true : void 0,
|
|
426
428
|
"aria-valuemin": computedMin.value,
|
|
427
429
|
"aria-valuemax": computedMax.value,
|
|
@@ -439,4 +441,4 @@ var BFormSpinbutton_default = /* @__PURE__ */ defineComponent({
|
|
|
439
441
|
//#endregion
|
|
440
442
|
export { BFormSpinbutton_default as t };
|
|
441
443
|
|
|
442
|
-
//# sourceMappingURL=BFormSpinbutton-
|
|
444
|
+
//# sourceMappingURL=BFormSpinbutton-fkVMbQC3.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BFormSpinbutton-fkVMbQC3.js","names":[],"sources":["../src/components/BFormSpinbutton/BFormSpinbutton.vue","../src/components/BFormSpinbutton/BFormSpinbutton.vue"],"sourcesContent":["<template>\n <div\n ref=\"_element\"\n class=\"b-form-spinbutton form-control\"\n :class=\"computedClasses\"\n role=\"group\"\n :lang=\"computedLocale\"\n :tabindex=\"props.disabled ? undefined : '-1'\"\n :title=\"props.ariaLabel\"\n @click=\"focused = true\"\n >\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.top.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.top.button\"\n @mousedown=\"buttons.top.handler\"\n @touchstart=\"buttons.top.handler\"\n >\n <svg v-bind=\"buttons.top.svg\">\n <path v-bind=\"buttons.top.path\" />\n </svg>\n </button>\n </slot>\n <input\n v-if=\"props.name && !props.disabled\"\n key=\"hidden\"\n type=\"hidden\"\n :name=\"props.name\"\n :form=\"props.form\"\n :value=\"valueAsFixed\"\n />\n <output\n :id=\"computedId\"\n key=\"output\"\n class=\"flex-grow-1\"\n :class=\"computedSpinClasses\"\n :dir=\"(isRtl ?? false) ? 'rtl' : 'ltr'\"\n :tabindex=\"props.disabled ? undefined : '0'\"\n role=\"spinbutton\"\n aria-live=\"off\"\n :aria-label=\"props.ariaLabel || undefined\"\n :aria-controls=\"props.ariaControls || undefined\"\n :aria-invalid=\"\n props.state === false || (modelValue === null && props.required) ? true : undefined\n \"\n :aria-required=\"props.required ? true : undefined\"\n :aria-valuemin=\"computedMin\"\n :aria-valuemax=\"computedMax\"\n :aria-valuenow=\"modelValue !== null ? modelValue : undefined\"\n :aria-valuetext=\"modelValue !== null ? computedFormatter(modelValue) : undefined\"\n >\n <bdi>\n {{ (modelValue !== null ? computedFormatter(modelValue) : props.placeholder) || '' }}\n </bdi>\n </output>\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.bottom.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.bottom.button\"\n @mousedown=\"buttons.bottom.handler\"\n @touchstart=\"buttons.bottom.handler\"\n >\n <svg v-bind=\"buttons.bottom.svg\">\n <path v-bind=\"buttons.bottom.path\" />\n </svg>\n </button>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, onUnmounted, useTemplateRef} from 'vue'\nimport {\n CODE_DOWN,\n CODE_END,\n CODE_HOME,\n CODE_PAGEDOWN,\n CODE_PAGEUP,\n CODE_UP,\n} from '../../utils/constants'\nimport {onKeyStroke, useFocus, useToNumber} from '@vueuse/core'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useRtl} from '../../composables/useRtl'\nimport type {\n BFormSpinbuttonEmits,\n BFormSpinbuttonProps,\n BFormSpinbuttonSlots,\n ButtonType,\n} from '../../types'\nimport {getSafeDocument} from '../../utils/dom'\n\nconst KEY_CODES = [CODE_UP, CODE_DOWN, CODE_HOME, CODE_END, CODE_PAGEUP, CODE_PAGEDOWN]\n\nconst _props = withDefaults(defineProps<Omit<BFormSpinbuttonProps, 'modelValue'>>(), {\n ariaControls: undefined,\n ariaLabel: undefined,\n disabled: false,\n form: undefined,\n formatterFn: undefined,\n id: undefined,\n inline: false,\n labelDecrement: 'Decrement',\n labelIncrement: 'Increment',\n locale: undefined,\n max: defaultValues.max,\n min: defaultValues.min,\n name: undefined,\n placeholder: undefined,\n readonly: false,\n repeatDelay: defaultValues.repeatDelay,\n repeatInterval: defaultValues.repeatInterval,\n repeatStepMultiplier: defaultValues.repeatMultiplier,\n repeatThreshold: defaultValues.repeatThreshold,\n required: false,\n size: undefined,\n state: null,\n step: defaultValues.step,\n vertical: false,\n wrap: false,\n})\nconst props = useDefaults(_props, 'BFormSpinbutton')\nconst emit = defineEmits<BFormSpinbuttonEmits>()\ndefineSlots<BFormSpinbuttonSlots>()\n\nconst modelValue = defineModel<Exclude<BFormSpinbuttonProps['modelValue'], undefined>>({\n default: null,\n})\n\nconst element = useTemplateRef('_element')\n\nconst {focused} = useFocus(element)\n\nconst computedId = useId(() => props.id, 'spinbutton')\n\nconst computedClasses = computed(() => ({\n 'disabled': props.disabled,\n 'readonly': props.readonly,\n 'focus': focused.value,\n 'd-inline-flex': props.inline || props.vertical,\n 'd-flex': !props.inline && !props.vertical,\n 'align-items-stretch': !props.vertical,\n 'flex-column': props.vertical,\n [`form-control-${props.size}`]: props.size !== undefined,\n}))\n\nconst computedSpinClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-self-center': !props.vertical,\n 'align-items-center': props.vertical,\n 'border-top': props.vertical,\n 'border-bottom': props.vertical,\n 'border-start': !props.vertical,\n 'border-end': !props.vertical,\n}))\n\n//non-reactive properties\nlet $_autoDelayTimer: ReturnType<typeof setTimeout> | undefined\nlet $_autoRepeatTimer: ReturnType<typeof setTimeout> | undefined\nlet $_keyIsDown = false\n\n// const computedInline = computed(() => props.inline && !props.vertical)\n\n// const computedReadonly = computed(() => props.readonly && !props.disabled)\n\nconst stepNumber = useToNumber(() => props.step)\nconst computedStep = computed(() =>\n Number.isNaN(stepNumber.value) ? defaultValues.step : stepNumber.value\n)\n\nconst minNumber = useToNumber(() => props.min)\nconst computedMin = computed(() =>\n Number.isNaN(minNumber.value) ? defaultValues.min : minNumber.value\n)\n\nconst maxNumber = useToNumber(() => props.max)\nconst computedMax = computed(() => {\n const step = computedStep.value\n const min = computedMin.value\n return Math.floor((maxNumber.value - min) / step) * step + min\n})\n\nconst repeatDelayNumber = useToNumber(() => props.repeatDelay, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedDelay = computed(() =>\n repeatDelayNumber.value > 0 ? repeatDelayNumber.value : defaultValues.repeatDelay\n)\n\nconst repeatIntervalNumber = useToNumber(() => props.repeatInterval, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedInterval = computed(() =>\n repeatIntervalNumber.value > 0 ? repeatIntervalNumber.value : defaultValues.repeatInterval\n)\n\nconst repeatThresholdNumber = useToNumber(() => props.repeatThreshold, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedThreshold = computed(() =>\n Math.max(\n Number.isNaN(repeatThresholdNumber.value)\n ? defaultValues.repeatThreshold\n : repeatThresholdNumber.value,\n 1\n )\n)\n\nconst repeatStepMultiplierNumber = useToNumber(() => props.repeatStepMultiplier, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedStepMultiplier = computed(() =>\n Math.max(\n Number.isNaN(repeatStepMultiplierNumber.value)\n ? defaultValues.repeatMultiplier\n : repeatStepMultiplierNumber.value,\n 1\n )\n)\n\nconst computedPrecision = computed(() => {\n const step = computedStep.value\n return Math.floor(step) === step ? 0 : (step.toString().split('.')[1] || '').length\n})\n\nconst computedMultiplier = computed(() => Math.pow(10, computedPrecision.value || 0))\n\nconst valueAsFixed = computed(() =>\n modelValue.value === null ? '' : modelValue.value.toFixed(computedPrecision.value)\n)\n\nconst {isRtl, locale: globalLocale} = useRtl()\n\nconst computedLocale = computed(() => {\n const loc = (props.locale ?? globalLocale?.value) || 'locale'\n const locales = [loc]\n const nf = new Intl.NumberFormat(locales)\n return nf.resolvedOptions().locale\n})\n\nconst defaultFormatter = () =>\n new Intl.NumberFormat(computedLocale.value, {\n style: 'decimal',\n useGrouping: false,\n minimumIntegerDigits: 1,\n minimumFractionDigits: computedPrecision.value,\n maximumFractionDigits: computedPrecision.value,\n notation: 'standard',\n }).format\n\nconst computedFormatter = computed(() => props.formatterFn ?? defaultFormatter())\n\nconst stepValue = (direction: number) => {\n // Sets a new incremented or decremented value, supporting optional wrapping\n // Direction is either +1 or -1 (or a multiple thereof)\n let {value} = modelValue\n if (!props.disabled && value !== null) {\n const step = computedStep.value * direction\n const min = computedMin.value\n const max = computedMax.value\n const multiplier = computedMultiplier.value\n const {wrap} = props\n // We ensure that the value steps like a native input\n value = Math.round((value - min) / step) * step + min + step\n // We ensure that precision is maintained (decimals)\n value = Math.round(value * multiplier) / multiplier\n // Handle if wrapping is enabled\n modelValue.value = value > max ? (wrap ? min : max) : value < min ? (wrap ? max : min) : value\n }\n}\n\nconst stepUp = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = computedMin.value\n return\n }\n stepValue(+1 * multiplier)\n}\n\nconst stepDown = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = props.wrap ? computedMax.value : computedMin.value\n return\n }\n stepValue(-1 * multiplier)\n}\n\nconst stopEvent = (event: Readonly<Event>) => {\n event.preventDefault()\n event.stopImmediatePropagation()\n}\n\nonKeyStroke(\n KEY_CODES,\n (event) => {\n const {code, altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n // https://w3c.github.io/aria-practices/#spinbutton\n stopEvent(event)\n if ($_keyIsDown) {\n // Keypress is already in progress\n return\n }\n\n resetTimers()\n if ([CODE_UP, CODE_DOWN].includes(code)) {\n // The following use the custom auto-repeat handling\n\n $_keyIsDown = true\n if (code === CODE_UP) {\n handleStepRepeat(event, stepUp)\n return\n }\n if (code === CODE_DOWN) {\n handleStepRepeat(event, stepDown)\n }\n return\n }\n // These use native OS key repeating\n if (code === CODE_PAGEUP) {\n stepUp(computedStepMultiplier.value)\n return\n }\n if (code === CODE_PAGEDOWN) {\n stepDown(computedStepMultiplier.value)\n return\n }\n if (code === CODE_HOME) {\n modelValue.value = computedMin.value\n return\n }\n if (code === CODE_END) {\n modelValue.value = computedMax.value\n }\n },\n {target: element, eventName: 'keydown'}\n)\n\nonKeyStroke(\n KEY_CODES,\n (event: Readonly<KeyboardEvent>) => {\n // Emit a change event when the keyup happens\n\n const {altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n stopEvent(event)\n resetTimers()\n $_keyIsDown = false\n emit('change', modelValue.value)\n },\n {target: element, eventName: 'keyup'}\n)\n\n// takes in a mount or Keyboard Event\nconst handleStepRepeat = (event: Readonly<Event>, stepper: (step: number) => void) => {\n const {type} = event || {}\n\n if (!props.disabled && !props.readonly) {\n if (isMouseEvent(event)) {\n // We only respond to left (main === 0) button clicks\n if (type === 'mousedown' && event.button) return\n }\n resetTimers()\n // Step the counter initially\n stepper(1)\n const threshold = computedThreshold.value\n const multiplier = computedStepMultiplier.value\n const delay = computedDelay.value\n const interval = computedInterval.value\n\n // Initiate the delay/repeat interval\n $_autoDelayTimer = setTimeout(() => {\n let count = 0\n $_autoRepeatTimer = setInterval(() => {\n // After N initial repeats, we increase the incrementing step amount\n // We do this to minimize screen reader announcements of the value\n // (values are announced every change, which can be chatty for SR users)\n // And to make it easer to select a value when the range is large\n stepper(count < threshold ? 1 : multiplier)\n count++\n }, interval)\n }, delay)\n }\n}\n\nconst isMouseEvent = (evt: Readonly<Event>): evt is MouseEvent =>\n evt.type === 'mouseup' || evt.type === 'mousedown'\n\nconst onMouseup: EventListener = (event: Readonly<Event>) => {\n // `<body>` listener, only enabled when mousedown starts\n\n if (isMouseEvent(event)) {\n if (event.type === 'mouseup' && event.button) {\n // Ignore non left button (main === 0) mouse button click\n return\n }\n }\n\n stopEvent(event)\n resetTimers()\n setMouseup('removeEventListener')\n // Trigger the change event\n emit('change', modelValue.value)\n}\n\nconst setMouseup = (operation: 'addEventListener' | 'removeEventListener') => {\n const doc = getSafeDocument()\n if (doc === null) return\n\n if (operation === 'addEventListener') {\n doc.body.addEventListener('mouseup', onMouseup)\n doc.body.addEventListener('touchend', onMouseup, {passive: false})\n } else {\n doc.body.removeEventListener('mouseup', onMouseup)\n doc.body.removeEventListener('touchend', onMouseup)\n }\n}\nconst resetTimers = () => {\n clearTimeout($_autoDelayTimer)\n clearInterval($_autoRepeatTimer)\n $_autoDelayTimer = undefined\n $_autoRepeatTimer = undefined\n}\n\nconst buttons = computed(() => {\n const incrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-plus',\n viewBox: '0 0 16 16',\n },\n path: {\n d: 'M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z',\n },\n } as const\n\n const decrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-dash',\n viewBox: '0 0 16 16',\n },\n path: {d: 'M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8z'},\n } as const\n\n const sharedButtonAttrs = {\n 'class': [{'py-0': !props.vertical}, 'btn', 'btn-sm', 'border-0', 'rounded-0'],\n 'tabindex': '-1',\n 'type': 'button' as ButtonType,\n 'disabled': props.disabled || props.readonly,\n 'aria-disabled': props.disabled || props.readonly ? true : undefined,\n 'aria-controls': computedId.value,\n }\n\n const sharedSvgAttrs = {\n 'aria-hidden': true,\n 'scale': focused.value ? 1.5 : 1.25,\n }\n\n const handler = (event: Readonly<Event>, stepper: (multiplier?: number) => void) => {\n if (!props.disabled && !props.readonly) {\n stopEvent(event)\n setMouseup('addEventListener')\n // Since we `preventDefault()`, we must manually focus the button\n // Though it's likely captured from the element click focus\n focused.value = true\n handleStepRepeat(event, stepper)\n }\n }\n\n const incrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelIncrement || undefined,\n 'aria-keyshortcuts': 'ArrowUp',\n },\n svg: {\n ...sharedSvgAttrs,\n ...incrementSvgAttrs.svg,\n },\n path: {\n ...incrementSvgAttrs.path,\n },\n slot: {\n name: 'increment',\n },\n handler: (e: Event) => handler(e, stepUp),\n }\n\n const decrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelDecrement || undefined,\n 'aria-keyshortcuts': 'ArrowDown',\n },\n svg: {\n ...sharedSvgAttrs,\n ...decrementSvgAttrs.svg,\n },\n path: {\n ...decrementSvgAttrs.path,\n },\n slot: {\n name: 'decrement',\n },\n handler: (e: Readonly<Event>) => handler(e, stepDown),\n }\n\n return {\n top: {\n ...(props.vertical ? incrementAttrs : decrementAttrs),\n },\n bottom: {\n ...(!props.vertical ? incrementAttrs : decrementAttrs),\n },\n }\n})\n\nonUnmounted(() => {\n // Cleanup event listeners\n setMouseup('removeEventListener')\n})\n</script>\n\n<script lang=\"ts\">\nconst defaultValues = {\n min: 1,\n max: 100,\n step: 1,\n repeatDelay: 500,\n repeatInterval: 100,\n repeatThreshold: 10,\n repeatMultiplier: 4,\n} as const\n</script>\n","<template>\n <div\n ref=\"_element\"\n class=\"b-form-spinbutton form-control\"\n :class=\"computedClasses\"\n role=\"group\"\n :lang=\"computedLocale\"\n :tabindex=\"props.disabled ? undefined : '-1'\"\n :title=\"props.ariaLabel\"\n @click=\"focused = true\"\n >\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.top.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.top.button\"\n @mousedown=\"buttons.top.handler\"\n @touchstart=\"buttons.top.handler\"\n >\n <svg v-bind=\"buttons.top.svg\">\n <path v-bind=\"buttons.top.path\" />\n </svg>\n </button>\n </slot>\n <input\n v-if=\"props.name && !props.disabled\"\n key=\"hidden\"\n type=\"hidden\"\n :name=\"props.name\"\n :form=\"props.form\"\n :value=\"valueAsFixed\"\n />\n <output\n :id=\"computedId\"\n key=\"output\"\n class=\"flex-grow-1\"\n :class=\"computedSpinClasses\"\n :dir=\"(isRtl ?? false) ? 'rtl' : 'ltr'\"\n :tabindex=\"props.disabled ? undefined : '0'\"\n role=\"spinbutton\"\n aria-live=\"off\"\n :aria-label=\"props.ariaLabel || undefined\"\n :aria-controls=\"props.ariaControls || undefined\"\n :aria-invalid=\"\n props.state === false || (modelValue === null && props.required) ? true : undefined\n \"\n :aria-required=\"props.required ? true : undefined\"\n :aria-valuemin=\"computedMin\"\n :aria-valuemax=\"computedMax\"\n :aria-valuenow=\"modelValue !== null ? modelValue : undefined\"\n :aria-valuetext=\"modelValue !== null ? computedFormatter(modelValue) : undefined\"\n >\n <bdi>\n {{ (modelValue !== null ? computedFormatter(modelValue) : props.placeholder) || '' }}\n </bdi>\n </output>\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.bottom.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.bottom.button\"\n @mousedown=\"buttons.bottom.handler\"\n @touchstart=\"buttons.bottom.handler\"\n >\n <svg v-bind=\"buttons.bottom.svg\">\n <path v-bind=\"buttons.bottom.path\" />\n </svg>\n </button>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, onUnmounted, useTemplateRef} from 'vue'\nimport {\n CODE_DOWN,\n CODE_END,\n CODE_HOME,\n CODE_PAGEDOWN,\n CODE_PAGEUP,\n CODE_UP,\n} from '../../utils/constants'\nimport {onKeyStroke, useFocus, useToNumber} from '@vueuse/core'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useRtl} from '../../composables/useRtl'\nimport type {\n BFormSpinbuttonEmits,\n BFormSpinbuttonProps,\n BFormSpinbuttonSlots,\n ButtonType,\n} from '../../types'\nimport {getSafeDocument} from '../../utils/dom'\n\nconst KEY_CODES = [CODE_UP, CODE_DOWN, CODE_HOME, CODE_END, CODE_PAGEUP, CODE_PAGEDOWN]\n\nconst _props = withDefaults(defineProps<Omit<BFormSpinbuttonProps, 'modelValue'>>(), {\n ariaControls: undefined,\n ariaLabel: undefined,\n disabled: false,\n form: undefined,\n formatterFn: undefined,\n id: undefined,\n inline: false,\n labelDecrement: 'Decrement',\n labelIncrement: 'Increment',\n locale: undefined,\n max: defaultValues.max,\n min: defaultValues.min,\n name: undefined,\n placeholder: undefined,\n readonly: false,\n repeatDelay: defaultValues.repeatDelay,\n repeatInterval: defaultValues.repeatInterval,\n repeatStepMultiplier: defaultValues.repeatMultiplier,\n repeatThreshold: defaultValues.repeatThreshold,\n required: false,\n size: undefined,\n state: null,\n step: defaultValues.step,\n vertical: false,\n wrap: false,\n})\nconst props = useDefaults(_props, 'BFormSpinbutton')\nconst emit = defineEmits<BFormSpinbuttonEmits>()\ndefineSlots<BFormSpinbuttonSlots>()\n\nconst modelValue = defineModel<Exclude<BFormSpinbuttonProps['modelValue'], undefined>>({\n default: null,\n})\n\nconst element = useTemplateRef('_element')\n\nconst {focused} = useFocus(element)\n\nconst computedId = useId(() => props.id, 'spinbutton')\n\nconst computedClasses = computed(() => ({\n 'disabled': props.disabled,\n 'readonly': props.readonly,\n 'focus': focused.value,\n 'd-inline-flex': props.inline || props.vertical,\n 'd-flex': !props.inline && !props.vertical,\n 'align-items-stretch': !props.vertical,\n 'flex-column': props.vertical,\n [`form-control-${props.size}`]: props.size !== undefined,\n}))\n\nconst computedSpinClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-self-center': !props.vertical,\n 'align-items-center': props.vertical,\n 'border-top': props.vertical,\n 'border-bottom': props.vertical,\n 'border-start': !props.vertical,\n 'border-end': !props.vertical,\n}))\n\n//non-reactive properties\nlet $_autoDelayTimer: ReturnType<typeof setTimeout> | undefined\nlet $_autoRepeatTimer: ReturnType<typeof setTimeout> | undefined\nlet $_keyIsDown = false\n\n// const computedInline = computed(() => props.inline && !props.vertical)\n\n// const computedReadonly = computed(() => props.readonly && !props.disabled)\n\nconst stepNumber = useToNumber(() => props.step)\nconst computedStep = computed(() =>\n Number.isNaN(stepNumber.value) ? defaultValues.step : stepNumber.value\n)\n\nconst minNumber = useToNumber(() => props.min)\nconst computedMin = computed(() =>\n Number.isNaN(minNumber.value) ? defaultValues.min : minNumber.value\n)\n\nconst maxNumber = useToNumber(() => props.max)\nconst computedMax = computed(() => {\n const step = computedStep.value\n const min = computedMin.value\n return Math.floor((maxNumber.value - min) / step) * step + min\n})\n\nconst repeatDelayNumber = useToNumber(() => props.repeatDelay, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedDelay = computed(() =>\n repeatDelayNumber.value > 0 ? repeatDelayNumber.value : defaultValues.repeatDelay\n)\n\nconst repeatIntervalNumber = useToNumber(() => props.repeatInterval, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedInterval = computed(() =>\n repeatIntervalNumber.value > 0 ? repeatIntervalNumber.value : defaultValues.repeatInterval\n)\n\nconst repeatThresholdNumber = useToNumber(() => props.repeatThreshold, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedThreshold = computed(() =>\n Math.max(\n Number.isNaN(repeatThresholdNumber.value)\n ? defaultValues.repeatThreshold\n : repeatThresholdNumber.value,\n 1\n )\n)\n\nconst repeatStepMultiplierNumber = useToNumber(() => props.repeatStepMultiplier, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedStepMultiplier = computed(() =>\n Math.max(\n Number.isNaN(repeatStepMultiplierNumber.value)\n ? defaultValues.repeatMultiplier\n : repeatStepMultiplierNumber.value,\n 1\n )\n)\n\nconst computedPrecision = computed(() => {\n const step = computedStep.value\n return Math.floor(step) === step ? 0 : (step.toString().split('.')[1] || '').length\n})\n\nconst computedMultiplier = computed(() => Math.pow(10, computedPrecision.value || 0))\n\nconst valueAsFixed = computed(() =>\n modelValue.value === null ? '' : modelValue.value.toFixed(computedPrecision.value)\n)\n\nconst {isRtl, locale: globalLocale} = useRtl()\n\nconst computedLocale = computed(() => {\n const loc = (props.locale ?? globalLocale?.value) || 'locale'\n const locales = [loc]\n const nf = new Intl.NumberFormat(locales)\n return nf.resolvedOptions().locale\n})\n\nconst defaultFormatter = () =>\n new Intl.NumberFormat(computedLocale.value, {\n style: 'decimal',\n useGrouping: false,\n minimumIntegerDigits: 1,\n minimumFractionDigits: computedPrecision.value,\n maximumFractionDigits: computedPrecision.value,\n notation: 'standard',\n }).format\n\nconst computedFormatter = computed(() => props.formatterFn ?? defaultFormatter())\n\nconst stepValue = (direction: number) => {\n // Sets a new incremented or decremented value, supporting optional wrapping\n // Direction is either +1 or -1 (or a multiple thereof)\n let {value} = modelValue\n if (!props.disabled && value !== null) {\n const step = computedStep.value * direction\n const min = computedMin.value\n const max = computedMax.value\n const multiplier = computedMultiplier.value\n const {wrap} = props\n // We ensure that the value steps like a native input\n value = Math.round((value - min) / step) * step + min + step\n // We ensure that precision is maintained (decimals)\n value = Math.round(value * multiplier) / multiplier\n // Handle if wrapping is enabled\n modelValue.value = value > max ? (wrap ? min : max) : value < min ? (wrap ? max : min) : value\n }\n}\n\nconst stepUp = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = computedMin.value\n return\n }\n stepValue(+1 * multiplier)\n}\n\nconst stepDown = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = props.wrap ? computedMax.value : computedMin.value\n return\n }\n stepValue(-1 * multiplier)\n}\n\nconst stopEvent = (event: Readonly<Event>) => {\n event.preventDefault()\n event.stopImmediatePropagation()\n}\n\nonKeyStroke(\n KEY_CODES,\n (event) => {\n const {code, altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n // https://w3c.github.io/aria-practices/#spinbutton\n stopEvent(event)\n if ($_keyIsDown) {\n // Keypress is already in progress\n return\n }\n\n resetTimers()\n if ([CODE_UP, CODE_DOWN].includes(code)) {\n // The following use the custom auto-repeat handling\n\n $_keyIsDown = true\n if (code === CODE_UP) {\n handleStepRepeat(event, stepUp)\n return\n }\n if (code === CODE_DOWN) {\n handleStepRepeat(event, stepDown)\n }\n return\n }\n // These use native OS key repeating\n if (code === CODE_PAGEUP) {\n stepUp(computedStepMultiplier.value)\n return\n }\n if (code === CODE_PAGEDOWN) {\n stepDown(computedStepMultiplier.value)\n return\n }\n if (code === CODE_HOME) {\n modelValue.value = computedMin.value\n return\n }\n if (code === CODE_END) {\n modelValue.value = computedMax.value\n }\n },\n {target: element, eventName: 'keydown'}\n)\n\nonKeyStroke(\n KEY_CODES,\n (event: Readonly<KeyboardEvent>) => {\n // Emit a change event when the keyup happens\n\n const {altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n stopEvent(event)\n resetTimers()\n $_keyIsDown = false\n emit('change', modelValue.value)\n },\n {target: element, eventName: 'keyup'}\n)\n\n// takes in a mount or Keyboard Event\nconst handleStepRepeat = (event: Readonly<Event>, stepper: (step: number) => void) => {\n const {type} = event || {}\n\n if (!props.disabled && !props.readonly) {\n if (isMouseEvent(event)) {\n // We only respond to left (main === 0) button clicks\n if (type === 'mousedown' && event.button) return\n }\n resetTimers()\n // Step the counter initially\n stepper(1)\n const threshold = computedThreshold.value\n const multiplier = computedStepMultiplier.value\n const delay = computedDelay.value\n const interval = computedInterval.value\n\n // Initiate the delay/repeat interval\n $_autoDelayTimer = setTimeout(() => {\n let count = 0\n $_autoRepeatTimer = setInterval(() => {\n // After N initial repeats, we increase the incrementing step amount\n // We do this to minimize screen reader announcements of the value\n // (values are announced every change, which can be chatty for SR users)\n // And to make it easer to select a value when the range is large\n stepper(count < threshold ? 1 : multiplier)\n count++\n }, interval)\n }, delay)\n }\n}\n\nconst isMouseEvent = (evt: Readonly<Event>): evt is MouseEvent =>\n evt.type === 'mouseup' || evt.type === 'mousedown'\n\nconst onMouseup: EventListener = (event: Readonly<Event>) => {\n // `<body>` listener, only enabled when mousedown starts\n\n if (isMouseEvent(event)) {\n if (event.type === 'mouseup' && event.button) {\n // Ignore non left button (main === 0) mouse button click\n return\n }\n }\n\n stopEvent(event)\n resetTimers()\n setMouseup('removeEventListener')\n // Trigger the change event\n emit('change', modelValue.value)\n}\n\nconst setMouseup = (operation: 'addEventListener' | 'removeEventListener') => {\n const doc = getSafeDocument()\n if (doc === null) return\n\n if (operation === 'addEventListener') {\n doc.body.addEventListener('mouseup', onMouseup)\n doc.body.addEventListener('touchend', onMouseup, {passive: false})\n } else {\n doc.body.removeEventListener('mouseup', onMouseup)\n doc.body.removeEventListener('touchend', onMouseup)\n }\n}\nconst resetTimers = () => {\n clearTimeout($_autoDelayTimer)\n clearInterval($_autoRepeatTimer)\n $_autoDelayTimer = undefined\n $_autoRepeatTimer = undefined\n}\n\nconst buttons = computed(() => {\n const incrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-plus',\n viewBox: '0 0 16 16',\n },\n path: {\n d: 'M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z',\n },\n } as const\n\n const decrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-dash',\n viewBox: '0 0 16 16',\n },\n path: {d: 'M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8z'},\n } as const\n\n const sharedButtonAttrs = {\n 'class': [{'py-0': !props.vertical}, 'btn', 'btn-sm', 'border-0', 'rounded-0'],\n 'tabindex': '-1',\n 'type': 'button' as ButtonType,\n 'disabled': props.disabled || props.readonly,\n 'aria-disabled': props.disabled || props.readonly ? true : undefined,\n 'aria-controls': computedId.value,\n }\n\n const sharedSvgAttrs = {\n 'aria-hidden': true,\n 'scale': focused.value ? 1.5 : 1.25,\n }\n\n const handler = (event: Readonly<Event>, stepper: (multiplier?: number) => void) => {\n if (!props.disabled && !props.readonly) {\n stopEvent(event)\n setMouseup('addEventListener')\n // Since we `preventDefault()`, we must manually focus the button\n // Though it's likely captured from the element click focus\n focused.value = true\n handleStepRepeat(event, stepper)\n }\n }\n\n const incrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelIncrement || undefined,\n 'aria-keyshortcuts': 'ArrowUp',\n },\n svg: {\n ...sharedSvgAttrs,\n ...incrementSvgAttrs.svg,\n },\n path: {\n ...incrementSvgAttrs.path,\n },\n slot: {\n name: 'increment',\n },\n handler: (e: Event) => handler(e, stepUp),\n }\n\n const decrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelDecrement || undefined,\n 'aria-keyshortcuts': 'ArrowDown',\n },\n svg: {\n ...sharedSvgAttrs,\n ...decrementSvgAttrs.svg,\n },\n path: {\n ...decrementSvgAttrs.path,\n },\n slot: {\n name: 'decrement',\n },\n handler: (e: Readonly<Event>) => handler(e, stepDown),\n }\n\n return {\n top: {\n ...(props.vertical ? incrementAttrs : decrementAttrs),\n },\n bottom: {\n ...(!props.vertical ? incrementAttrs : decrementAttrs),\n },\n }\n})\n\nonUnmounted(() => {\n // Cleanup event listeners\n setMouseup('removeEventListener')\n})\n</script>\n\n<script lang=\"ts\">\nconst defaultValues = {\n min: 1,\n max: 100,\n step: 1,\n repeatDelay: 500,\n repeatInterval: 100,\n repeatThreshold: 10,\n repeatMultiplier: 4,\n} as const\n</script>\n"],"mappings":"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"}
|
|
@@ -266,13 +266,13 @@ var BTabs_default = /* @__PURE__ */ defineComponent({
|
|
|
266
266
|
const tabElementsArray = ref([]);
|
|
267
267
|
const isChildActive = ref(false);
|
|
268
268
|
const initialIds = ref([]);
|
|
269
|
-
const
|
|
269
|
+
const selectedTabHasExplicitId = ref(false);
|
|
270
270
|
const updateTabElementsArray = () => {
|
|
271
271
|
const tabElements = flattenFragments(slots.default?.({}) ?? []);
|
|
272
272
|
tabElementsArray.value = (Array.isArray(tabElements) ? tabElements : [tabElements]).filter((tab) => tab.type === BTab_default);
|
|
273
273
|
if (initialIds.value.length === 0) {
|
|
274
274
|
initialIds.value = tabElementsArray.value.map((tab) => unref(useId$1(() => tab.props?.id, "tabpane")));
|
|
275
|
-
|
|
275
|
+
selectedTabHasExplicitId.value = activeIndex.value > -1 && tabElementsArray.value[activeIndex.value]?.props?.id !== void 0;
|
|
276
276
|
}
|
|
277
277
|
isChildActive.value = tabElementsArray.value.some((tab) => tab.props?.active !== void 0 && tab.props?.active !== false);
|
|
278
278
|
};
|
|
@@ -332,7 +332,7 @@ var BTabs_default = /* @__PURE__ */ defineComponent({
|
|
|
332
332
|
let updateInitialActiveIndex = false;
|
|
333
333
|
let updateInitialActiveId = false;
|
|
334
334
|
let delayedTabSelection = false;
|
|
335
|
-
if (activeIndex.value > -1 && !activeId.value && !
|
|
335
|
+
if (activeIndex.value > -1 && !activeId.value && !selectedTabHasExplicitId.value && tabElementsArray.value.length > 0) {
|
|
336
336
|
delayedTabSelection = true;
|
|
337
337
|
updateInitialActiveId = true;
|
|
338
338
|
} else if (activeIndex.value === -1 && activeId.value) {
|
|
@@ -594,4 +594,4 @@ var BTabs_default = /* @__PURE__ */ defineComponent({
|
|
|
594
594
|
//#endregion
|
|
595
595
|
export { BTab_default as n, BTabs_default as t };
|
|
596
596
|
|
|
597
|
-
//# sourceMappingURL=BTabs-
|
|
597
|
+
//# sourceMappingURL=BTabs-BKmkVWrZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BTabs-BKmkVWrZ.js","names":[],"sources":["../src/components/BTabs/BTab.vue","../src/components/BTabs/BTab.vue","../src/components/BTabsTabContent.vue","../src/components/BTabsTabContent.vue","../src/components/BTabs/BTabs.vue","../src/components/BTabs/BTabs.vue"],"sourcesContent":["<template>\n <component\n :is=\"props.tag\"\n :id=\"computedId\"\n ref=\"_el\"\n class=\"tab-pane\"\n :class=\"computedClasses\"\n role=\"tabpanel\"\n :aria-labelledby=\"computedButtonId\"\n v-bind=\"processedAttrs\"\n >\n <slot v-if=\"showSlot\" />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, inject, onUnmounted, ref, useAttrs, useTemplateRef, watch} from 'vue'\nimport {useId} from '../../composables/useId'\nimport {useDefaults} from '../../composables/useDefaults'\nimport type {TabType} from '../../types/Tab'\nimport type {BTabProps} from '../../types/ComponentProps'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport type {BTabSlots} from '../../types/ComponentSlots'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BTabProps, 'active'>>(), {\n buttonId: undefined,\n disabled: false,\n id: undefined,\n lazy: undefined,\n unmountLazy: undefined,\n noBody: false,\n tag: 'div',\n title: undefined,\n titleItemClass: undefined,\n titleLinkAttrs: undefined,\n titleLinkClass: undefined,\n})\nconst props = useDefaults(_props, 'BTab')\nconst slots = defineSlots<BTabSlots>()\nconst attrs = useAttrs()\n\nconst activeModel = defineModel<Exclude<BTabProps['active'], undefined>>('active', {\n default: false,\n})\n\nconst parentData = inject(tabsInjectionKey, null)\n\nconst localId = ref(props.id)\nconst internalId = useId('', 'tabpane')\nconst computedId = computed(() => props.id ?? localId.value ?? internalId.value)\nconst computedButtonId = useId(() => props.buttonId, 'tab')\n\nconst lazyRenderCompleted = ref(false)\nconst el = useTemplateRef('_el')\n\nconst processedAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {onClick: _, ...tabAttrs} = attrs\n return tabAttrs\n})\n\nfunction updateTab() {\n if (!parentData) return\n const newId = parentData.registerTab(\n computed(\n () =>\n ({\n internalId: internalId.value,\n id: computedId.value,\n active: activeModel.value,\n buttonId: computedButtonId.value,\n disabled: props.disabled,\n title: props.title,\n titleComponent: slots.title,\n titleItemClass: props.titleItemClass,\n titleLinkAttrs: props.titleLinkAttrs,\n titleLinkClass: props.titleLinkClass,\n onClick: attrs.onClick,\n el,\n }) as TabType\n )\n )\n if (newId !== localId.value) {\n localId.value = newId\n }\n}\n\nif (parentData) {\n updateTab()\n if (activeModel.value) {\n parentData.activateTab(internalId.value)\n }\n}\n\nonUnmounted(() => {\n if (!parentData) return\n parentData.unregisterTab(internalId.value)\n})\n\nconst isActive = computed(() => parentData?.activeId.value === computedId.value)\nconst show = ref(isActive.value)\n\nconst computedLazy = computed(() => !!(parentData?.lazy.value || props.lazy))\n\nconst computedActive = computed(() => isActive.value && !props.disabled)\nconst showSlot = computed(\n () =>\n computedActive.value ||\n !computedLazy.value ||\n (computedLazy.value && !props.unmountLazy && lazyRenderCompleted.value)\n)\n\nwatch(showSlot, (shown) => {\n if (shown && !lazyRenderCompleted.value) lazyRenderCompleted.value = true\n})\n\nwatch(isActive, (active) => {\n if (active) {\n activeModel.value = true\n setTimeout(() => {\n show.value = true\n }, 0)\n return\n }\n show.value = false\n activeModel.value = false\n})\n\nwatch(activeModel, (active) => {\n if (props.disabled) {\n activeModel.value = false\n return\n }\n if (!parentData) return\n if (!active) {\n if (isActive.value) {\n parentData.activateTab(undefined)\n }\n return\n }\n if (!isActive.value) {\n parentData.activateTab(internalId.value)\n }\n})\n\nconst computedClasses = computed(() => [\n {\n 'active': isActive.value,\n 'show': show.value,\n 'card-body': parentData?.card.value && props.noBody === false,\n 'fade': !parentData?.noFade.value,\n },\n show.value ? parentData?.activeTabClass.value : parentData?.inactiveTabClass.value,\n parentData?.tabClass.value,\n])\n\ndefineExpose({\n activate: () => {\n activeModel.value = true\n },\n deactivate: () => {\n activeModel.value = false\n },\n})\n</script>\n","<template>\n <component\n :is=\"props.tag\"\n :id=\"computedId\"\n ref=\"_el\"\n class=\"tab-pane\"\n :class=\"computedClasses\"\n role=\"tabpanel\"\n :aria-labelledby=\"computedButtonId\"\n v-bind=\"processedAttrs\"\n >\n <slot v-if=\"showSlot\" />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, inject, onUnmounted, ref, useAttrs, useTemplateRef, watch} from 'vue'\nimport {useId} from '../../composables/useId'\nimport {useDefaults} from '../../composables/useDefaults'\nimport type {TabType} from '../../types/Tab'\nimport type {BTabProps} from '../../types/ComponentProps'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport type {BTabSlots} from '../../types/ComponentSlots'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BTabProps, 'active'>>(), {\n buttonId: undefined,\n disabled: false,\n id: undefined,\n lazy: undefined,\n unmountLazy: undefined,\n noBody: false,\n tag: 'div',\n title: undefined,\n titleItemClass: undefined,\n titleLinkAttrs: undefined,\n titleLinkClass: undefined,\n})\nconst props = useDefaults(_props, 'BTab')\nconst slots = defineSlots<BTabSlots>()\nconst attrs = useAttrs()\n\nconst activeModel = defineModel<Exclude<BTabProps['active'], undefined>>('active', {\n default: false,\n})\n\nconst parentData = inject(tabsInjectionKey, null)\n\nconst localId = ref(props.id)\nconst internalId = useId('', 'tabpane')\nconst computedId = computed(() => props.id ?? localId.value ?? internalId.value)\nconst computedButtonId = useId(() => props.buttonId, 'tab')\n\nconst lazyRenderCompleted = ref(false)\nconst el = useTemplateRef('_el')\n\nconst processedAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {onClick: _, ...tabAttrs} = attrs\n return tabAttrs\n})\n\nfunction updateTab() {\n if (!parentData) return\n const newId = parentData.registerTab(\n computed(\n () =>\n ({\n internalId: internalId.value,\n id: computedId.value,\n active: activeModel.value,\n buttonId: computedButtonId.value,\n disabled: props.disabled,\n title: props.title,\n titleComponent: slots.title,\n titleItemClass: props.titleItemClass,\n titleLinkAttrs: props.titleLinkAttrs,\n titleLinkClass: props.titleLinkClass,\n onClick: attrs.onClick,\n el,\n }) as TabType\n )\n )\n if (newId !== localId.value) {\n localId.value = newId\n }\n}\n\nif (parentData) {\n updateTab()\n if (activeModel.value) {\n parentData.activateTab(internalId.value)\n }\n}\n\nonUnmounted(() => {\n if (!parentData) return\n parentData.unregisterTab(internalId.value)\n})\n\nconst isActive = computed(() => parentData?.activeId.value === computedId.value)\nconst show = ref(isActive.value)\n\nconst computedLazy = computed(() => !!(parentData?.lazy.value || props.lazy))\n\nconst computedActive = computed(() => isActive.value && !props.disabled)\nconst showSlot = computed(\n () =>\n computedActive.value ||\n !computedLazy.value ||\n (computedLazy.value && !props.unmountLazy && lazyRenderCompleted.value)\n)\n\nwatch(showSlot, (shown) => {\n if (shown && !lazyRenderCompleted.value) lazyRenderCompleted.value = true\n})\n\nwatch(isActive, (active) => {\n if (active) {\n activeModel.value = true\n setTimeout(() => {\n show.value = true\n }, 0)\n return\n }\n show.value = false\n activeModel.value = false\n})\n\nwatch(activeModel, (active) => {\n if (props.disabled) {\n activeModel.value = false\n return\n }\n if (!parentData) return\n if (!active) {\n if (isActive.value) {\n parentData.activateTab(undefined)\n }\n return\n }\n if (!isActive.value) {\n parentData.activateTab(internalId.value)\n }\n})\n\nconst computedClasses = computed(() => [\n {\n 'active': isActive.value,\n 'show': show.value,\n 'card-body': parentData?.card.value && props.noBody === false,\n 'fade': !parentData?.noFade.value,\n },\n show.value ? parentData?.activeTabClass.value : parentData?.inactiveTabClass.value,\n parentData?.tabClass.value,\n])\n\ndefineExpose({\n activate: () => {\n activeModel.value = true\n },\n deactivate: () => {\n activeModel.value = false\n },\n})\n</script>\n","<template>\n <div class=\"tab-content\" :class=\"contentClass\">\n <slot />\n <div v-if=\"showEmpty\" key=\"bv-empty-tab\" class=\"tab-pane active\" :class=\"{'card-body': card}\">\n <slot name=\"empty\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {ClassValue} from '../types/AnyValuedAttributes'\n\ndefineProps<{\n contentClass: ClassValue | undefined\n showEmpty: boolean\n card: boolean\n}>()\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndefineSlots<{\n default?: (props: Record<string, never>) => any\n empty?: (props: Record<string, never>) => any\n}>()\n/* eslint-enable @typescript-eslint/no-explicit-any */\n</script>\n","<template>\n <div class=\"tab-content\" :class=\"contentClass\">\n <slot />\n <div v-if=\"showEmpty\" key=\"bv-empty-tab\" class=\"tab-pane active\" :class=\"{'card-body': card}\">\n <slot name=\"empty\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {ClassValue} from '../types/AnyValuedAttributes'\n\ndefineProps<{\n contentClass: ClassValue | undefined\n showEmpty: boolean\n card: boolean\n}>()\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndefineSlots<{\n default?: (props: Record<string, never>) => any\n empty?: (props: Record<string, never>) => any\n}>()\n/* eslint-enable @typescript-eslint/no-explicit-any */\n</script>\n","<template>\n <component :is=\"props.tag\" :id=\"props.id\" class=\"tabs\" :class=\"computedClasses\">\n <BTabsTabContent v-if=\"props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n <div\n :class=\"[\n props.navWrapperClass,\n {'card-header': props.card, 'ms-auto': vertical && props.end},\n ]\"\n >\n <ul\n class=\"nav\"\n :class=\"[navTabsClasses, props.navClass]\"\n role=\"tablist\"\n :aria-orientation=\"props.vertical ? 'vertical' : 'horizontal'\"\n >\n <slot name=\"tabs-start\" />\n <li\n v-for=\"(tab, idx) in tabs\"\n :key=\"tab.id ?? tab.internalId\"\n class=\"nav-item\"\n :class=\"tab.titleItemClass\"\n role=\"presentation\"\n >\n <button\n :id=\"tab.buttonId\"\n class=\"nav-link\"\n :class=\"[tab.navItemClasses, tab.titleLinkClass, tab.active ? props.activeNavLinkClass : props.inactiveNavLinkClass]\"\n role=\"tab\"\n :aria-controls=\"tab.id\"\n :aria-selected=\"tab.active\"\n :disabled=\"tab.disabled\"\n :tabindex=\"props.noKeyNav ? undefined : tab.active ? undefined : -1\"\n type=\"button\"\n v-bind=\"tab.titleLinkAttrs\"\n @keydown.left.exact=\"!props.vertical && keynav($event, -1)\"\n @keydown.left.shift=\"!props.vertical && keynav($event, -999)\"\n @keydown.up.exact=\"props.vertical && keynav($event, -1)\"\n @keydown.up.shift=\"props.vertical && keynav($event, -999)\"\n @keydown.right.exact=\"!props.vertical && keynav($event, 1)\"\n @keydown.right.shift=\"!props.vertical && keynav($event, 999)\"\n @keydown.down.exact=\"props.vertical && keynav($event, 1)\"\n @keydown.down.shift=\"props.vertical && keynav($event, 999)\"\n @keydown.page-up=\"keynav($event, -999)\"\n @keydown.page-down=\"keynav($event, 999)\"\n @keydown.home=\"keynav($event, -999)\"\n @keydown.end=\"keynav($event, 999)\"\n @click.stop=\"(e) => handleClick(e, idx)\"\n >\n <component :is=\"tab.titleComponent\" v-if=\"tab.titleComponent\" />\n <template v-else>\n {{ tab.title }}\n </template>\n </button>\n </li>\n <slot name=\"tabs-end\" />\n </ul>\n </div>\n <BTabsTabContent v-if=\"!props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onMounted,\n provide,\n type Ref,\n ref,\n toRef,\n unref,\n type VNode,\n watch,\n} from 'vue'\nimport {BvEvent} from '../../utils/classes'\nimport {useAlignment} from '../../composables/useAlignment'\nimport {useId} from '../../composables/useId'\nimport type {TabType, BTabsProps, BTabsEmits, BTabsSlots} from '../../types'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {getSafeDocument, sortSlotElementsByPosition} from '../../utils/dom'\nimport {flattenFragments} from '../../utils/flattenFragments'\nimport BTab from './BTab.vue'\nimport BTabsTabContent from '../BTabsTabContent.vue'\n\nconst _props = withDefaults(defineProps<Omit<BTabsProps, 'modelValue' | 'activeIndex'>>(), {\n activeNavItemClass: undefined,\n activeNavLinkClass: undefined,\n activeTabClass: undefined,\n align: undefined,\n card: false,\n contentClass: undefined,\n end: false,\n fill: false,\n id: undefined,\n inactiveNavItemClass: undefined,\n inactiveNavLinkClass: undefined,\n inactiveTabClass: undefined,\n justified: false,\n lazy: false,\n navClass: undefined,\n navItemClass: undefined,\n navWrapperClass: undefined,\n noFade: false,\n noKeyNav: false,\n noNavStyle: false,\n pills: false,\n small: false,\n tag: 'div',\n tabClass: undefined,\n underline: false,\n vertical: false,\n})\nconst props = useDefaults(_props, 'BTabs')\nconst emit = defineEmits<BTabsEmits>()\nconst slots = defineSlots<BTabsSlots>()\n\nconst activeIndex = defineModel<Exclude<BTabsProps['index'], undefined>>('index', {\n default: -1,\n})\nconst activeId = defineModel<BTabsProps['modelValue']>({\n default: undefined,\n})\n\nconst tabsInternal = ref<Ref<TabType>[]>([])\n\nconst tabElementsArray = ref<VNode[]>([])\n\nconst isChildActive = ref(false)\nconst initialIds = ref<string[]>([])\nconst selectedTabHasExplicitId = ref(false)\n\nconst updateTabElementsArray = () => {\n const tabElements = flattenFragments(slots.default?.({}) ?? [])\n tabElementsArray.value = (Array.isArray(tabElements) ? tabElements : [tabElements]).filter(\n (tab) => tab.type === BTab\n )\n // only get the ids once in setup context\n if (initialIds.value.length === 0) {\n // we need to get the ids of the tabs before they are registered. After that we use the internalId for the tabpane\n initialIds.value = tabElementsArray.value.map((tab) =>\n unref(useId(() => tab.props?.id, 'tabpane'))\n )\n // Whether the *initially selected* tab carries an explicit ID.\n //\n // Only that tab matters. The delayed-selection path below exists because\n // a generated ID is not final until the child registers; an explicit ID\n // is final immediately. Asking `.some()` across every tab got this wrong\n // for a mixed list — a single ID-bearing sibling made an ID-less target\n // look safe, so the ID was read pre-mount, failed to match after\n // registration, and the selection fell back to the first tab (#2773).\n selectedTabHasExplicitId.value =\n activeIndex.value > -1 && tabElementsArray.value[activeIndex.value]?.props?.id !== undefined\n }\n isChildActive.value = tabElementsArray.value.some(\n (tab) => tab.props?.active !== undefined && tab.props?.active !== false\n )\n}\nupdateTabElementsArray()\n\nwatch(\n () => slots.default?.({}),\n () => {\n updateTabElementsArray()\n nextTick(() => {\n sortTabs()\n })\n }\n)\n\nconst tabs = computed(() => {\n if (tabsInternal.value.length === 0) {\n // fail back on the slot elements, the children haven't been registered yet\n const _activeIndex = tabElementsArray.value.findIndex(\n (tab) =>\n (tab.props?.active !== undefined &&\n (tab.props.disabled === false || tab.props.disabled === undefined)) ||\n (activeId.value && tab.props?.id === activeId.value)\n )\n return tabElementsArray.value.map((tab, index) => {\n const active =\n _activeIndex !== -1\n ? index === _activeIndex\n : activeIndex.value > -1\n ? index === activeIndex.value\n : index === 0\n return {\n id: tab.props?.id ?? initialIds.value[index],\n internalId: `premount-${index}`, // temporary id for the tab\n buttonId: tab.props?.buttonId,\n disabled: tab.props?.disabled,\n title: tab.props?.title,\n titleComponent: (tab.children as {title: unknown})?.title,\n titleItemClass: tab.props?.titleItemClass,\n titleLinkAttrs: tab.props?.titleLinkAttrs,\n titleLinkClass: tab.props?.titleLinkClass,\n onClick: tab.props?.onClick,\n active,\n navItemClasses: [\n {\n active,\n disabled: !(tab.props?.disabled === false || tab.props?.disabled === undefined),\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n }\n return tabsInternal.value.map((_tab) => {\n const tab = unref(_tab)\n const active = tab.id === activeId.value\n\n return {\n ...tab,\n active,\n navItemClasses: [\n {\n active,\n disabled: tab.disabled,\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n})\n\nlet initialized = false\nlet updateInitialActiveIndex = false\nlet updateInitialActiveId = false\nlet delayedTabSelection = false\n\n// Check if we need to delay tab selection:\n// - We have v-model:index (activeIndex) but no v-model (activeId)\n// - AND the selected tab has no explicit ID (so it will use a generated one)\n// - AND we have tabs to select from\nconst needsDelayedSelection =\n activeIndex.value > -1 &&\n !activeId.value &&\n !selectedTabHasExplicitId.value &&\n tabElementsArray.value.length > 0\n\nif (needsDelayedSelection) {\n // Delay tab selection until children register with their generated IDs\n delayedTabSelection = true\n updateInitialActiveId = true\n} else if (activeIndex.value === -1 && activeId.value) {\n if (tabs.value.findIndex((t) => t.id === activeId.value) !== -1) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n } else {\n updateInitialActiveIndex = true\n }\n} else if (activeIndex.value > -1 && !activeId.value) {\n if (tabs.value[activeIndex.value]?.id) {\n activeId.value = tabs.value[activeIndex.value]?.id\n } else {\n updateInitialActiveId = true\n }\n} else if (activeIndex.value === -1 && !activeId.value && !isChildActive.value) {\n activeIndex.value = tabs.value.findIndex((t) => t.disabled === undefined || t.disabled === false)\n activeId.value = tabs.value[activeIndex.value]?.id\n} else if (activeIndex.value === -1 && !activeId.value && isChildActive.value) {\n activeIndex.value = tabs.value.findIndex(\n (t) =>\n t.active !== undefined &&\n t.active !== false &&\n (t.disabled === undefined || t.disabled === false)\n )\n activeId.value = tabs.value[activeIndex.value]?.id\n}\n\nfunction updateInitialIndexAndId() {\n // we get the computedIds after registering the tabs\n if (updateInitialActiveIndex) {\n const index = tabs.value.findIndex((t) => t.id === activeId.value)\n if (index !== -1) {\n nextTick(() => {\n activeIndex.value = index\n updateInitialActiveIndex = false\n })\n }\n }\n if (updateInitialActiveId) {\n // Wait for tabs to be registered if we're doing delayed selection\n if (delayedTabSelection && tabsInternal.value.length === 0) {\n // Children haven't registered yet, wait\n return\n }\n if (activeIndex.value > -1 && tabs.value[activeIndex.value]?.id) {\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n updateInitialActiveId = false\n delayedTabSelection = false\n })\n }\n }\n}\n\nupdateInitialIndexAndId()\n\nconst showEmpty = computed(() => !(tabs?.value && tabs.value.length > 0))\n\nconst tabContentProps = computed(() => ({\n contentClass: props.contentClass,\n showEmpty: showEmpty.value,\n card: props.card,\n}))\n\nconst computedClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-items-start': props.vertical,\n}))\n\nconst alignment = useAlignment(() => props.align)\n\nconst navTabsClasses = computed(() => ({\n 'nav-pills': props.pills,\n 'nav-underline': props.underline,\n 'flex-column me-3': props.vertical,\n [alignment.value]: props.align !== undefined,\n 'nav-fill': props.fill,\n 'card-header-tabs': props.card && !props.pills && !props.underline,\n 'card-header-pills': props.card && props.pills,\n 'nav-justified': props.justified,\n 'nav-tabs': !props.noNavStyle && !props.pills && !props.underline,\n 'small': props.small,\n}))\n\nconst handleClick = (event: Readonly<MouseEvent>, index: number) => {\n if (\n index >= 0 &&\n !tabs.value[index]?.disabled &&\n tabs.value[index]?.onClick &&\n typeof tabs.value[index].onClick === 'function'\n ) {\n tabs.value[index].onClick?.(event)\n if (event.defaultPrevented) {\n getSafeDocument()?.getElementById(tabs.value[index].buttonId)?.blur()\n return\n }\n }\n activeIndex.value = index\n}\n\nconst keynav = (e: Event, direction: number) => {\n if (tabs.value.length <= 0 || props.noKeyNav) return\n e.preventDefault()\n e.stopPropagation()\n activeIndex.value = nextIndex(activeIndex.value + direction, direction)\n nextTick(() => {\n if (activeIndex.value >= 0) {\n getSafeDocument()?.getElementById(tabs.value[activeIndex.value]?.buttonId)?.focus()\n }\n })\n}\n\nconst nextIndex = (start: number, direction: number) => {\n let index = start\n let minIdx = -1\n let maxIdx = -1\n\n for (let i = 0; i < tabs.value.length; i++) {\n if (!tabs.value[i]?.disabled) {\n if (minIdx === -1) minIdx = i\n maxIdx = i\n }\n }\n\n while (index >= minIdx && index <= maxIdx && tabs.value[index]?.disabled) {\n index += direction\n }\n\n if (index < minIdx) index = minIdx\n if (index > maxIdx) index = maxIdx\n\n return index\n}\n\nlet previousIndex: number | undefined\nlet isReverting = false\nwatch(activeIndex, (newValue, oldValue) => {\n // Early exit if there are no tabs or all tabs are disabled\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n\n // If we're reverting due to a prevented event, don't process further\n if (isReverting) {\n isReverting = false\n return\n }\n // Calculate the next valid index\n const index = nextIndex(newValue, newValue > oldValue ? 1 : -1)\n if (index !== newValue) {\n // If the index is not the same as the new value, set the previous index to the old value\n // this is to prevent the event from being emitted twice\n previousIndex = oldValue\n activeIndex.value = index\n return\n }\n // Emit the activate-tab event\n const tabEvent = new BvEvent('activate-tab', {cancelable: true})\n emit('activate-tab', {\n newTabId: tabs.value[index]?.id,\n prevTabId: tabs.value[previousIndex ?? oldValue]?.id,\n newTabIndex: index,\n prevTabIndex: previousIndex ?? oldValue,\n event: tabEvent,\n })\n // If the event is prevented, revert to the previous index\n if (tabEvent.defaultPrevented) {\n isReverting = true\n const prev = previousIndex ?? oldValue ?? nextIndex(0, 1)\n previousIndex = undefined\n // Update the active id this will also trigger the activeId watch which will update the activeIndex\n // this is to make sure we handle case that starts with id change.\n if (activeId.value !== tabs.value[prev]?.id) {\n activeId.value = tabs.value[prev]?.id\n }\n nextTick(() => {\n if (prev >= 0) {\n getSafeDocument()?.getElementById(tabs.value[prev]?.buttonId)?.focus()\n }\n })\n return\n }\n\n // Update the active id\n if (activeId.value !== tabs.value[index]?.id) {\n activeId.value = tabs.value[index]?.id\n }\n previousIndex = undefined\n})\n\nwatch(activeId, (newValue, oldValue) => {\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n const index = tabs.value.findIndex((t) => t.id === newValue)\n // If the new tab is the same as the current tab, do nothing\n if (index === activeIndex.value) return\n const oldIndex = tabs.value.findIndex((t) => t.id === oldValue)\n // If the new tab is disabled, find the next enabled tab\n if (tabs.value[index]?.disabled) {\n // activeIndex watcher will update the activeId to the next enabled tab\n activeIndex.value = nextIndex(index, index > oldIndex ? 1 : -1)\n return\n }\n // If the new tab is not found, find the first enabled tab\n if (index === -1) {\n // activeIndex watcher will update the activeId to the first enabled tab\n activeIndex.value = nextIndex(0, 1)\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n })\n return\n }\n // change to the next tab\n activeIndex.value = index\n})\n\nconst registerTab = (tab: Ref<TabType>) => {\n const idx = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n if (idx === -1) {\n tabsInternal.value.push(tab)\n if (initialized) {\n nextTick(() => {\n sortTabs()\n })\n } else {\n // If we're doing delayed tab selection, try to update now that a tab has registered\n if (delayedTabSelection) {\n nextTick(() => {\n updateInitialIndexAndId()\n })\n }\n }\n } else {\n tabsInternal.value[idx] = tab\n if (initialized) {\n // sort just in case the tab was moved\n sortTabs()\n }\n }\n const idx2 = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n return tab.value.id ?? (!initialized ? initialIds.value[idx2] : tab.value.internalId)\n}\n\nonMounted(() => {\n updateInitialIndexAndId()\n sortTabs()\n initialized = true\n})\n\nconst sortTabs = () => {\n tabsInternal.value.sort((a, b) => sortSlotElementsByPosition(a.value.el.value, b.value.el.value))\n if (\n activeId.value &&\n activeIndex.value !== tabs.value.findIndex((t) => t.id === activeId.value)\n ) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n }\n}\n\nconst unregisterTab = (id: string) => {\n tabsInternal.value = tabsInternal.value.filter((t) => t.value.internalId !== id)\n}\n\nprovide(tabsInjectionKey, {\n lazy: toRef(() => props.lazy),\n card: toRef(() => props.card),\n noFade: toRef(() => props.noFade),\n activeTabClass: toRef(() => props.activeTabClass),\n inactiveTabClass: toRef(() => props.inactiveTabClass),\n tabClass: toRef(() => props.tabClass),\n registerTab,\n unregisterTab,\n activeId,\n activateTab: (internalId) => {\n const idx = tabs.value.findIndex((t) => t.internalId === internalId)\n if (internalId === undefined || idx === -1) {\n activeIndex.value = nextIndex(0, 1)\n return\n }\n activeIndex.value = idx\n },\n})\n</script>\n","<template>\n <component :is=\"props.tag\" :id=\"props.id\" class=\"tabs\" :class=\"computedClasses\">\n <BTabsTabContent v-if=\"props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n <div\n :class=\"[\n props.navWrapperClass,\n {'card-header': props.card, 'ms-auto': vertical && props.end},\n ]\"\n >\n <ul\n class=\"nav\"\n :class=\"[navTabsClasses, props.navClass]\"\n role=\"tablist\"\n :aria-orientation=\"props.vertical ? 'vertical' : 'horizontal'\"\n >\n <slot name=\"tabs-start\" />\n <li\n v-for=\"(tab, idx) in tabs\"\n :key=\"tab.id ?? tab.internalId\"\n class=\"nav-item\"\n :class=\"tab.titleItemClass\"\n role=\"presentation\"\n >\n <button\n :id=\"tab.buttonId\"\n class=\"nav-link\"\n :class=\"[tab.navItemClasses, tab.titleLinkClass, tab.active ? props.activeNavLinkClass : props.inactiveNavLinkClass]\"\n role=\"tab\"\n :aria-controls=\"tab.id\"\n :aria-selected=\"tab.active\"\n :disabled=\"tab.disabled\"\n :tabindex=\"props.noKeyNav ? undefined : tab.active ? undefined : -1\"\n type=\"button\"\n v-bind=\"tab.titleLinkAttrs\"\n @keydown.left.exact=\"!props.vertical && keynav($event, -1)\"\n @keydown.left.shift=\"!props.vertical && keynav($event, -999)\"\n @keydown.up.exact=\"props.vertical && keynav($event, -1)\"\n @keydown.up.shift=\"props.vertical && keynav($event, -999)\"\n @keydown.right.exact=\"!props.vertical && keynav($event, 1)\"\n @keydown.right.shift=\"!props.vertical && keynav($event, 999)\"\n @keydown.down.exact=\"props.vertical && keynav($event, 1)\"\n @keydown.down.shift=\"props.vertical && keynav($event, 999)\"\n @keydown.page-up=\"keynav($event, -999)\"\n @keydown.page-down=\"keynav($event, 999)\"\n @keydown.home=\"keynav($event, -999)\"\n @keydown.end=\"keynav($event, 999)\"\n @click.stop=\"(e) => handleClick(e, idx)\"\n >\n <component :is=\"tab.titleComponent\" v-if=\"tab.titleComponent\" />\n <template v-else>\n {{ tab.title }}\n </template>\n </button>\n </li>\n <slot name=\"tabs-end\" />\n </ul>\n </div>\n <BTabsTabContent v-if=\"!props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onMounted,\n provide,\n type Ref,\n ref,\n toRef,\n unref,\n type VNode,\n watch,\n} from 'vue'\nimport {BvEvent} from '../../utils/classes'\nimport {useAlignment} from '../../composables/useAlignment'\nimport {useId} from '../../composables/useId'\nimport type {TabType, BTabsProps, BTabsEmits, BTabsSlots} from '../../types'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {getSafeDocument, sortSlotElementsByPosition} from '../../utils/dom'\nimport {flattenFragments} from '../../utils/flattenFragments'\nimport BTab from './BTab.vue'\nimport BTabsTabContent from '../BTabsTabContent.vue'\n\nconst _props = withDefaults(defineProps<Omit<BTabsProps, 'modelValue' | 'activeIndex'>>(), {\n activeNavItemClass: undefined,\n activeNavLinkClass: undefined,\n activeTabClass: undefined,\n align: undefined,\n card: false,\n contentClass: undefined,\n end: false,\n fill: false,\n id: undefined,\n inactiveNavItemClass: undefined,\n inactiveNavLinkClass: undefined,\n inactiveTabClass: undefined,\n justified: false,\n lazy: false,\n navClass: undefined,\n navItemClass: undefined,\n navWrapperClass: undefined,\n noFade: false,\n noKeyNav: false,\n noNavStyle: false,\n pills: false,\n small: false,\n tag: 'div',\n tabClass: undefined,\n underline: false,\n vertical: false,\n})\nconst props = useDefaults(_props, 'BTabs')\nconst emit = defineEmits<BTabsEmits>()\nconst slots = defineSlots<BTabsSlots>()\n\nconst activeIndex = defineModel<Exclude<BTabsProps['index'], undefined>>('index', {\n default: -1,\n})\nconst activeId = defineModel<BTabsProps['modelValue']>({\n default: undefined,\n})\n\nconst tabsInternal = ref<Ref<TabType>[]>([])\n\nconst tabElementsArray = ref<VNode[]>([])\n\nconst isChildActive = ref(false)\nconst initialIds = ref<string[]>([])\nconst selectedTabHasExplicitId = ref(false)\n\nconst updateTabElementsArray = () => {\n const tabElements = flattenFragments(slots.default?.({}) ?? [])\n tabElementsArray.value = (Array.isArray(tabElements) ? tabElements : [tabElements]).filter(\n (tab) => tab.type === BTab\n )\n // only get the ids once in setup context\n if (initialIds.value.length === 0) {\n // we need to get the ids of the tabs before they are registered. After that we use the internalId for the tabpane\n initialIds.value = tabElementsArray.value.map((tab) =>\n unref(useId(() => tab.props?.id, 'tabpane'))\n )\n // Whether the *initially selected* tab carries an explicit ID.\n //\n // Only that tab matters. The delayed-selection path below exists because\n // a generated ID is not final until the child registers; an explicit ID\n // is final immediately. Asking `.some()` across every tab got this wrong\n // for a mixed list — a single ID-bearing sibling made an ID-less target\n // look safe, so the ID was read pre-mount, failed to match after\n // registration, and the selection fell back to the first tab (#2773).\n selectedTabHasExplicitId.value =\n activeIndex.value > -1 && tabElementsArray.value[activeIndex.value]?.props?.id !== undefined\n }\n isChildActive.value = tabElementsArray.value.some(\n (tab) => tab.props?.active !== undefined && tab.props?.active !== false\n )\n}\nupdateTabElementsArray()\n\nwatch(\n () => slots.default?.({}),\n () => {\n updateTabElementsArray()\n nextTick(() => {\n sortTabs()\n })\n }\n)\n\nconst tabs = computed(() => {\n if (tabsInternal.value.length === 0) {\n // fail back on the slot elements, the children haven't been registered yet\n const _activeIndex = tabElementsArray.value.findIndex(\n (tab) =>\n (tab.props?.active !== undefined &&\n (tab.props.disabled === false || tab.props.disabled === undefined)) ||\n (activeId.value && tab.props?.id === activeId.value)\n )\n return tabElementsArray.value.map((tab, index) => {\n const active =\n _activeIndex !== -1\n ? index === _activeIndex\n : activeIndex.value > -1\n ? index === activeIndex.value\n : index === 0\n return {\n id: tab.props?.id ?? initialIds.value[index],\n internalId: `premount-${index}`, // temporary id for the tab\n buttonId: tab.props?.buttonId,\n disabled: tab.props?.disabled,\n title: tab.props?.title,\n titleComponent: (tab.children as {title: unknown})?.title,\n titleItemClass: tab.props?.titleItemClass,\n titleLinkAttrs: tab.props?.titleLinkAttrs,\n titleLinkClass: tab.props?.titleLinkClass,\n onClick: tab.props?.onClick,\n active,\n navItemClasses: [\n {\n active,\n disabled: !(tab.props?.disabled === false || tab.props?.disabled === undefined),\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n }\n return tabsInternal.value.map((_tab) => {\n const tab = unref(_tab)\n const active = tab.id === activeId.value\n\n return {\n ...tab,\n active,\n navItemClasses: [\n {\n active,\n disabled: tab.disabled,\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n})\n\nlet initialized = false\nlet updateInitialActiveIndex = false\nlet updateInitialActiveId = false\nlet delayedTabSelection = false\n\n// Check if we need to delay tab selection:\n// - We have v-model:index (activeIndex) but no v-model (activeId)\n// - AND the selected tab has no explicit ID (so it will use a generated one)\n// - AND we have tabs to select from\nconst needsDelayedSelection =\n activeIndex.value > -1 &&\n !activeId.value &&\n !selectedTabHasExplicitId.value &&\n tabElementsArray.value.length > 0\n\nif (needsDelayedSelection) {\n // Delay tab selection until children register with their generated IDs\n delayedTabSelection = true\n updateInitialActiveId = true\n} else if (activeIndex.value === -1 && activeId.value) {\n if (tabs.value.findIndex((t) => t.id === activeId.value) !== -1) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n } else {\n updateInitialActiveIndex = true\n }\n} else if (activeIndex.value > -1 && !activeId.value) {\n if (tabs.value[activeIndex.value]?.id) {\n activeId.value = tabs.value[activeIndex.value]?.id\n } else {\n updateInitialActiveId = true\n }\n} else if (activeIndex.value === -1 && !activeId.value && !isChildActive.value) {\n activeIndex.value = tabs.value.findIndex((t) => t.disabled === undefined || t.disabled === false)\n activeId.value = tabs.value[activeIndex.value]?.id\n} else if (activeIndex.value === -1 && !activeId.value && isChildActive.value) {\n activeIndex.value = tabs.value.findIndex(\n (t) =>\n t.active !== undefined &&\n t.active !== false &&\n (t.disabled === undefined || t.disabled === false)\n )\n activeId.value = tabs.value[activeIndex.value]?.id\n}\n\nfunction updateInitialIndexAndId() {\n // we get the computedIds after registering the tabs\n if (updateInitialActiveIndex) {\n const index = tabs.value.findIndex((t) => t.id === activeId.value)\n if (index !== -1) {\n nextTick(() => {\n activeIndex.value = index\n updateInitialActiveIndex = false\n })\n }\n }\n if (updateInitialActiveId) {\n // Wait for tabs to be registered if we're doing delayed selection\n if (delayedTabSelection && tabsInternal.value.length === 0) {\n // Children haven't registered yet, wait\n return\n }\n if (activeIndex.value > -1 && tabs.value[activeIndex.value]?.id) {\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n updateInitialActiveId = false\n delayedTabSelection = false\n })\n }\n }\n}\n\nupdateInitialIndexAndId()\n\nconst showEmpty = computed(() => !(tabs?.value && tabs.value.length > 0))\n\nconst tabContentProps = computed(() => ({\n contentClass: props.contentClass,\n showEmpty: showEmpty.value,\n card: props.card,\n}))\n\nconst computedClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-items-start': props.vertical,\n}))\n\nconst alignment = useAlignment(() => props.align)\n\nconst navTabsClasses = computed(() => ({\n 'nav-pills': props.pills,\n 'nav-underline': props.underline,\n 'flex-column me-3': props.vertical,\n [alignment.value]: props.align !== undefined,\n 'nav-fill': props.fill,\n 'card-header-tabs': props.card && !props.pills && !props.underline,\n 'card-header-pills': props.card && props.pills,\n 'nav-justified': props.justified,\n 'nav-tabs': !props.noNavStyle && !props.pills && !props.underline,\n 'small': props.small,\n}))\n\nconst handleClick = (event: Readonly<MouseEvent>, index: number) => {\n if (\n index >= 0 &&\n !tabs.value[index]?.disabled &&\n tabs.value[index]?.onClick &&\n typeof tabs.value[index].onClick === 'function'\n ) {\n tabs.value[index].onClick?.(event)\n if (event.defaultPrevented) {\n getSafeDocument()?.getElementById(tabs.value[index].buttonId)?.blur()\n return\n }\n }\n activeIndex.value = index\n}\n\nconst keynav = (e: Event, direction: number) => {\n if (tabs.value.length <= 0 || props.noKeyNav) return\n e.preventDefault()\n e.stopPropagation()\n activeIndex.value = nextIndex(activeIndex.value + direction, direction)\n nextTick(() => {\n if (activeIndex.value >= 0) {\n getSafeDocument()?.getElementById(tabs.value[activeIndex.value]?.buttonId)?.focus()\n }\n })\n}\n\nconst nextIndex = (start: number, direction: number) => {\n let index = start\n let minIdx = -1\n let maxIdx = -1\n\n for (let i = 0; i < tabs.value.length; i++) {\n if (!tabs.value[i]?.disabled) {\n if (minIdx === -1) minIdx = i\n maxIdx = i\n }\n }\n\n while (index >= minIdx && index <= maxIdx && tabs.value[index]?.disabled) {\n index += direction\n }\n\n if (index < minIdx) index = minIdx\n if (index > maxIdx) index = maxIdx\n\n return index\n}\n\nlet previousIndex: number | undefined\nlet isReverting = false\nwatch(activeIndex, (newValue, oldValue) => {\n // Early exit if there are no tabs or all tabs are disabled\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n\n // If we're reverting due to a prevented event, don't process further\n if (isReverting) {\n isReverting = false\n return\n }\n // Calculate the next valid index\n const index = nextIndex(newValue, newValue > oldValue ? 1 : -1)\n if (index !== newValue) {\n // If the index is not the same as the new value, set the previous index to the old value\n // this is to prevent the event from being emitted twice\n previousIndex = oldValue\n activeIndex.value = index\n return\n }\n // Emit the activate-tab event\n const tabEvent = new BvEvent('activate-tab', {cancelable: true})\n emit('activate-tab', {\n newTabId: tabs.value[index]?.id,\n prevTabId: tabs.value[previousIndex ?? oldValue]?.id,\n newTabIndex: index,\n prevTabIndex: previousIndex ?? oldValue,\n event: tabEvent,\n })\n // If the event is prevented, revert to the previous index\n if (tabEvent.defaultPrevented) {\n isReverting = true\n const prev = previousIndex ?? oldValue ?? nextIndex(0, 1)\n previousIndex = undefined\n // Update the active id this will also trigger the activeId watch which will update the activeIndex\n // this is to make sure we handle case that starts with id change.\n if (activeId.value !== tabs.value[prev]?.id) {\n activeId.value = tabs.value[prev]?.id\n }\n nextTick(() => {\n if (prev >= 0) {\n getSafeDocument()?.getElementById(tabs.value[prev]?.buttonId)?.focus()\n }\n })\n return\n }\n\n // Update the active id\n if (activeId.value !== tabs.value[index]?.id) {\n activeId.value = tabs.value[index]?.id\n }\n previousIndex = undefined\n})\n\nwatch(activeId, (newValue, oldValue) => {\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n const index = tabs.value.findIndex((t) => t.id === newValue)\n // If the new tab is the same as the current tab, do nothing\n if (index === activeIndex.value) return\n const oldIndex = tabs.value.findIndex((t) => t.id === oldValue)\n // If the new tab is disabled, find the next enabled tab\n if (tabs.value[index]?.disabled) {\n // activeIndex watcher will update the activeId to the next enabled tab\n activeIndex.value = nextIndex(index, index > oldIndex ? 1 : -1)\n return\n }\n // If the new tab is not found, find the first enabled tab\n if (index === -1) {\n // activeIndex watcher will update the activeId to the first enabled tab\n activeIndex.value = nextIndex(0, 1)\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n })\n return\n }\n // change to the next tab\n activeIndex.value = index\n})\n\nconst registerTab = (tab: Ref<TabType>) => {\n const idx = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n if (idx === -1) {\n tabsInternal.value.push(tab)\n if (initialized) {\n nextTick(() => {\n sortTabs()\n })\n } else {\n // If we're doing delayed tab selection, try to update now that a tab has registered\n if (delayedTabSelection) {\n nextTick(() => {\n updateInitialIndexAndId()\n })\n }\n }\n } else {\n tabsInternal.value[idx] = tab\n if (initialized) {\n // sort just in case the tab was moved\n sortTabs()\n }\n }\n const idx2 = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n return tab.value.id ?? (!initialized ? initialIds.value[idx2] : tab.value.internalId)\n}\n\nonMounted(() => {\n updateInitialIndexAndId()\n sortTabs()\n initialized = true\n})\n\nconst sortTabs = () => {\n tabsInternal.value.sort((a, b) => sortSlotElementsByPosition(a.value.el.value, b.value.el.value))\n if (\n activeId.value &&\n activeIndex.value !== tabs.value.findIndex((t) => t.id === activeId.value)\n ) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n }\n}\n\nconst unregisterTab = (id: string) => {\n tabsInternal.value = tabsInternal.value.filter((t) => t.value.internalId !== id)\n}\n\nprovide(tabsInjectionKey, {\n lazy: toRef(() => props.lazy),\n card: toRef(() => props.card),\n noFade: toRef(() => props.noFade),\n activeTabClass: toRef(() => props.activeTabClass),\n inactiveTabClass: toRef(() => props.inactiveTabClass),\n tabClass: toRef(() => props.tabClass),\n registerTab,\n unregisterTab,\n activeId,\n activateTab: (internalId) => {\n const idx = tabs.value.findIndex((t) => t.internalId === internalId)\n if (internalId === undefined || idx === -1) {\n activeIndex.value = nextIndex(0, 1)\n return\n }\n activeIndex.value = idx\n },\n})\n</script>\n"],"mappings":"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"}
|
|
@@ -48,7 +48,7 @@ import { t as BFormGroup_default } from "./BFormGroup-D3R7DxxF.js";
|
|
|
48
48
|
import { n as BFormRadio_default, t as BFormRadioGroup_default } from "./BFormRadio-DRViMh6V.js";
|
|
49
49
|
import { t as BFormRating_default } from "./BFormRating-AEiF8K8T.js";
|
|
50
50
|
import { n as BFormSelectOptionGroup_default, t as BFormSelect_default } from "./BFormSelect-DdjH8482.js";
|
|
51
|
-
import { t as BFormSpinbutton_default } from "./BFormSpinbutton-
|
|
51
|
+
import { t as BFormSpinbutton_default } from "./BFormSpinbutton-fkVMbQC3.js";
|
|
52
52
|
import { t as BFormTags_default } from "./BFormTags-CUcyRTCK.js";
|
|
53
53
|
import { t as BFormTextarea_default } from "./BFormTextarea-DlDe26DL.js";
|
|
54
54
|
import { t as BInputGroupText_default } from "./BInputGroup-Bjh7zXyI.js";
|
|
@@ -64,7 +64,7 @@ import { t as BPagination_default } from "./BPagination-D_Hfk6OF.js";
|
|
|
64
64
|
import { a as BPlaceholder_default, i as BPlaceholderButton_default, n as BPlaceholderTable_default, r as BPlaceholderCard_default, t as BPlaceholderWrapper_default } from "./BPlaceholder-DvOCnqDh.js";
|
|
65
65
|
import { t as BTableSimple_default } from "./BTableSimple-2Z7ssnuG.js";
|
|
66
66
|
import { a as BTh_default, c as BTbody_default, i as BThead_default, n as BTableLite_default, o as BTfoot_default, r as BTr_default, s as BTd_default, t as BTable_default } from "./BTable-BZxX17YU.js";
|
|
67
|
-
import { n as BTab_default, t as BTabs_default } from "./BTabs-
|
|
67
|
+
import { n as BTab_default, t as BTabs_default } from "./BTabs-BKmkVWrZ.js";
|
|
68
68
|
import { t as BToast_default } from "./BToast-Di9HwBOV.js";
|
|
69
69
|
import { t as BTooltip_default } from "./BTooltip-BxaUtV4m.js";
|
|
70
70
|
import { t as components_exports } from "./src/components/index.mjs";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as BFormSpinbutton_default } from "../../../BFormSpinbutton-
|
|
1
|
+
import { t as BFormSpinbutton_default } from "../../../BFormSpinbutton-fkVMbQC3.js";
|
|
2
2
|
export { BFormSpinbutton_default as BFormSpinbutton };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { n as BTab_default, t as BTabs_default } from "../../../BTabs-
|
|
1
|
+
import { n as BTab_default, t as BTabs_default } from "../../../BTabs-BKmkVWrZ.js";
|
|
2
2
|
export { BTab_default as BTab, BTabs_default as BTabs };
|
|
@@ -42,7 +42,7 @@ import { t as BFormGroup_default } from "../../BFormGroup-D3R7DxxF.js";
|
|
|
42
42
|
import { n as BFormRadio_default, t as BFormRadioGroup_default } from "../../BFormRadio-DRViMh6V.js";
|
|
43
43
|
import { t as BFormRating_default } from "../../BFormRating-AEiF8K8T.js";
|
|
44
44
|
import { n as BFormSelectOptionGroup_default, t as BFormSelect_default } from "../../BFormSelect-DdjH8482.js";
|
|
45
|
-
import { t as BFormSpinbutton_default } from "../../BFormSpinbutton-
|
|
45
|
+
import { t as BFormSpinbutton_default } from "../../BFormSpinbutton-fkVMbQC3.js";
|
|
46
46
|
import { t as BFormTags_default } from "../../BFormTags-CUcyRTCK.js";
|
|
47
47
|
import { t as BFormTextarea_default } from "../../BFormTextarea-DlDe26DL.js";
|
|
48
48
|
import { t as BInputGroupText_default } from "../../BInputGroup-Bjh7zXyI.js";
|
|
@@ -55,7 +55,7 @@ import { t as BPagination_default } from "../../BPagination-D_Hfk6OF.js";
|
|
|
55
55
|
import { a as BPlaceholder_default, i as BPlaceholderButton_default, n as BPlaceholderTable_default, r as BPlaceholderCard_default, t as BPlaceholderWrapper_default } from "../../BPlaceholder-DvOCnqDh.js";
|
|
56
56
|
import { t as BTableSimple_default } from "../../BTableSimple-2Z7ssnuG.js";
|
|
57
57
|
import { a as BTh_default, c as BTbody_default, i as BThead_default, n as BTableLite_default, o as BTfoot_default, r as BTr_default, s as BTd_default, t as BTable_default } from "../../BTable-BZxX17YU.js";
|
|
58
|
-
import { n as BTab_default, t as BTabs_default } from "../../BTabs-
|
|
58
|
+
import { n as BTab_default, t as BTabs_default } from "../../BTabs-BKmkVWrZ.js";
|
|
59
59
|
import { t as BToast_default } from "../../BToast-Di9HwBOV.js";
|
|
60
60
|
import { t as BTooltip_default } from "../../BTooltip-BxaUtV4m.js";
|
|
61
61
|
//#region src/components/index.ts
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"name": "bootstrap-vue-next",
|
|
3
3
|
"displayName": "BootstrapVueNext",
|
|
4
4
|
"description": "Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development",
|
|
5
|
-
"version": "0.46.
|
|
5
|
+
"version": "0.46.2",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"type": "module",
|
|
8
8
|
"main": "./dist/bootstrap-vue-next.mjs",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BFormSpinbutton-Bt590uT6.js","names":[],"sources":["../src/components/BFormSpinbutton/BFormSpinbutton.vue","../src/components/BFormSpinbutton/BFormSpinbutton.vue"],"sourcesContent":["<template>\n <div\n ref=\"_element\"\n class=\"b-form-spinbutton form-control\"\n :class=\"computedClasses\"\n role=\"group\"\n :lang=\"computedLocale\"\n :tabindex=\"props.disabled ? undefined : '-1'\"\n :title=\"props.ariaLabel\"\n @click=\"focused = true\"\n >\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.top.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.top.button\"\n @mousedown=\"buttons.top.handler\"\n @touchstart=\"buttons.top.handler\"\n >\n <svg v-bind=\"buttons.top.svg\">\n <path v-bind=\"buttons.top.path\" />\n </svg>\n </button>\n </slot>\n <input\n v-if=\"props.name && !props.disabled\"\n key=\"hidden\"\n type=\"hidden\"\n :name=\"props.name\"\n :form=\"props.form\"\n :value=\"valueAsFixed\"\n />\n <output\n :id=\"computedId\"\n key=\"output\"\n class=\"flex-grow-1\"\n :class=\"computedSpinClasses\"\n :dir=\"(isRtl ?? false) ? 'rtl' : 'ltr'\"\n :tabindex=\"props.disabled ? undefined : '0'\"\n role=\"spinbutton\"\n aria-live=\"off\"\n :aria-label=\"props.ariaLabel || undefined\"\n :aria-invalid=\"\n props.state === false || (!modelValue !== null && props.required) ? true : undefined\n \"\n :aria-required=\"props.required ? true : undefined\"\n :aria-valuemin=\"computedMin\"\n :aria-valuemax=\"computedMax\"\n :aria-valuenow=\"modelValue !== null ? modelValue : undefined\"\n :aria-valuetext=\"modelValue !== null ? computedFormatter(modelValue) : undefined\"\n >\n <bdi>\n {{ (modelValue !== null ? computedFormatter(modelValue) : props.placeholder) || '' }}\n </bdi>\n </output>\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.bottom.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.bottom.button\"\n @mousedown=\"buttons.bottom.handler\"\n @touchstart=\"buttons.bottom.handler\"\n >\n <svg v-bind=\"buttons.bottom.svg\">\n <path v-bind=\"buttons.bottom.path\" />\n </svg>\n </button>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, onUnmounted, useTemplateRef} from 'vue'\nimport {\n CODE_DOWN,\n CODE_END,\n CODE_HOME,\n CODE_PAGEDOWN,\n CODE_PAGEUP,\n CODE_UP,\n} from '../../utils/constants'\nimport {onKeyStroke, useFocus, useToNumber} from '@vueuse/core'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useRtl} from '../../composables/useRtl'\nimport type {\n BFormSpinbuttonEmits,\n BFormSpinbuttonProps,\n BFormSpinbuttonSlots,\n ButtonType,\n} from '../../types'\nimport {getSafeDocument} from '../../utils/dom'\n\nconst KEY_CODES = [CODE_UP, CODE_DOWN, CODE_HOME, CODE_END, CODE_PAGEUP, CODE_PAGEDOWN]\n\nconst _props = withDefaults(defineProps<Omit<BFormSpinbuttonProps, 'modelValue'>>(), {\n ariaControls: undefined,\n ariaLabel: undefined,\n disabled: false,\n form: undefined,\n formatterFn: undefined,\n id: undefined,\n inline: false,\n labelDecrement: 'Decrement',\n labelIncrement: 'Increment',\n locale: undefined,\n max: defaultValues.max,\n min: defaultValues.min,\n name: undefined,\n placeholder: undefined,\n readonly: false,\n repeatDelay: defaultValues.repeatDelay,\n repeatInterval: defaultValues.repeatInterval,\n repeatStepMultiplier: defaultValues.repeatMultiplier,\n repeatThreshold: defaultValues.repeatThreshold,\n required: false,\n size: undefined,\n state: null,\n step: defaultValues.step,\n vertical: false,\n wrap: false,\n})\nconst props = useDefaults(_props, 'BFormSpinbutton')\nconst emit = defineEmits<BFormSpinbuttonEmits>()\ndefineSlots<BFormSpinbuttonSlots>()\n\nconst modelValue = defineModel<Exclude<BFormSpinbuttonProps['modelValue'], undefined>>({\n default: null,\n})\n\nconst element = useTemplateRef('_element')\n\nconst {focused} = useFocus(element)\n\nconst computedId = useId(() => props.id, 'spinbutton')\n\nconst computedClasses = computed(() => ({\n 'disabled': props.disabled,\n 'readonly': props.readonly,\n 'focus': focused.value,\n 'd-inline-flex': props.inline || props.vertical,\n 'd-flex': !props.inline && !props.vertical,\n 'align-items-stretch': !props.vertical,\n 'flex-column': props.vertical,\n [`form-control-${props.size}`]: props.size !== undefined,\n}))\n\nconst computedSpinClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-self-center': !props.vertical,\n 'align-items-center': props.vertical,\n 'border-top': props.vertical,\n 'border-bottom': props.vertical,\n 'border-start': !props.vertical,\n 'border-end': !props.vertical,\n}))\n\n//non-reactive properties\nlet $_autoDelayTimer: ReturnType<typeof setTimeout> | undefined\nlet $_autoRepeatTimer: ReturnType<typeof setTimeout> | undefined\nlet $_keyIsDown = false\n\n// const computedInline = computed(() => props.inline && !props.vertical)\n\n// const computedReadonly = computed(() => props.readonly && !props.disabled)\n\nconst stepNumber = useToNumber(() => props.step)\nconst computedStep = computed(() =>\n Number.isNaN(stepNumber.value) ? defaultValues.step : stepNumber.value\n)\n\nconst minNumber = useToNumber(() => props.min)\nconst computedMin = computed(() =>\n Number.isNaN(minNumber.value) ? defaultValues.min : minNumber.value\n)\n\nconst maxNumber = useToNumber(() => props.max)\nconst computedMax = computed(() => {\n const step = computedStep.value\n const min = computedMin.value\n return Math.floor((maxNumber.value - min) / step) * step + min\n})\n\nconst repeatDelayNumber = useToNumber(() => props.repeatDelay, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedDelay = computed(() =>\n repeatDelayNumber.value > 0 ? repeatDelayNumber.value : defaultValues.repeatDelay\n)\n\nconst repeatIntervalNumber = useToNumber(() => props.repeatInterval, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedInterval = computed(() =>\n repeatIntervalNumber.value > 0 ? repeatIntervalNumber.value : defaultValues.repeatInterval\n)\n\nconst repeatThresholdNumber = useToNumber(() => props.repeatThreshold, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedThreshold = computed(() =>\n Math.max(\n Number.isNaN(repeatThresholdNumber.value)\n ? defaultValues.repeatThreshold\n : repeatThresholdNumber.value,\n 1\n )\n)\n\nconst repeatStepMultiplierNumber = useToNumber(() => props.repeatStepMultiplier, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedStepMultiplier = computed(() =>\n Math.max(\n Number.isNaN(repeatStepMultiplierNumber.value)\n ? defaultValues.repeatMultiplier\n : repeatStepMultiplierNumber.value,\n 1\n )\n)\n\nconst computedPrecision = computed(() => {\n const step = computedStep.value\n return Math.floor(step) === step ? 0 : (step.toString().split('.')[1] || '').length\n})\n\nconst computedMultiplier = computed(() => Math.pow(10, computedPrecision.value || 0))\n\nconst valueAsFixed = computed(() =>\n modelValue.value === null ? '' : modelValue.value.toFixed(computedPrecision.value)\n)\n\nconst {isRtl, locale: globalLocale} = useRtl()\n\nconst computedLocale = computed(() => {\n const loc = (props.locale ?? globalLocale?.value) || 'locale'\n const locales = [loc]\n const nf = new Intl.NumberFormat(locales)\n return nf.resolvedOptions().locale\n})\n\nconst defaultFormatter = () =>\n new Intl.NumberFormat(computedLocale.value, {\n style: 'decimal',\n useGrouping: false,\n minimumIntegerDigits: 1,\n minimumFractionDigits: computedPrecision.value,\n maximumFractionDigits: computedPrecision.value,\n notation: 'standard',\n }).format\n\nconst computedFormatter = computed(() => props.formatterFn ?? defaultFormatter())\n\nconst stepValue = (direction: number) => {\n // Sets a new incremented or decremented value, supporting optional wrapping\n // Direction is either +1 or -1 (or a multiple thereof)\n let {value} = modelValue\n if (!props.disabled && value !== null) {\n const step = computedStep.value * direction\n const min = computedMin.value\n const max = computedMax.value\n const multiplier = computedMultiplier.value\n const {wrap} = props\n // We ensure that the value steps like a native input\n value = Math.round((value - min) / step) * step + min + step\n // We ensure that precision is maintained (decimals)\n value = Math.round(value * multiplier) / multiplier\n // Handle if wrapping is enabled\n modelValue.value = value > max ? (wrap ? min : max) : value < min ? (wrap ? max : min) : value\n }\n}\n\nconst stepUp = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = computedMin.value\n return\n }\n stepValue(+1 * multiplier)\n}\n\nconst stepDown = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = props.wrap ? computedMax.value : computedMin.value\n return\n }\n stepValue(-1 * multiplier)\n}\n\nconst stopEvent = (event: Readonly<Event>) => {\n event.preventDefault()\n event.stopImmediatePropagation()\n}\n\nonKeyStroke(\n KEY_CODES,\n (event) => {\n const {code, altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n // https://w3c.github.io/aria-practices/#spinbutton\n stopEvent(event)\n if ($_keyIsDown) {\n // Keypress is already in progress\n return\n }\n\n resetTimers()\n if ([CODE_UP, CODE_DOWN].includes(code)) {\n // The following use the custom auto-repeat handling\n\n $_keyIsDown = true\n if (code === CODE_UP) {\n handleStepRepeat(event, stepUp)\n return\n }\n if (code === CODE_DOWN) {\n handleStepRepeat(event, stepDown)\n }\n return\n }\n // These use native OS key repeating\n if (code === CODE_PAGEUP) {\n stepUp(computedStepMultiplier.value)\n return\n }\n if (code === CODE_PAGEDOWN) {\n stepDown(computedStepMultiplier.value)\n return\n }\n if (code === CODE_HOME) {\n modelValue.value = computedMin.value\n return\n }\n if (code === CODE_END) {\n modelValue.value = computedMax.value\n }\n },\n {target: element, eventName: 'keydown'}\n)\n\nonKeyStroke(\n KEY_CODES,\n (event: Readonly<KeyboardEvent>) => {\n // Emit a change event when the keyup happens\n\n const {altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n stopEvent(event)\n resetTimers()\n $_keyIsDown = false\n emit('change', modelValue.value)\n },\n {target: element, eventName: 'keyup'}\n)\n\n// takes in a mount or Keyboard Event\nconst handleStepRepeat = (event: Readonly<Event>, stepper: (step: number) => void) => {\n const {type} = event || {}\n\n if (!props.disabled && !props.readonly) {\n if (isMouseEvent(event)) {\n // We only respond to left (main === 0) button clicks\n if (type === 'mousedown' && event.button) return\n }\n resetTimers()\n // Step the counter initially\n stepper(1)\n const threshold = computedThreshold.value\n const multiplier = computedStepMultiplier.value\n const delay = computedDelay.value\n const interval = computedInterval.value\n\n // Initiate the delay/repeat interval\n $_autoDelayTimer = setTimeout(() => {\n let count = 0\n $_autoRepeatTimer = setInterval(() => {\n // After N initial repeats, we increase the incrementing step amount\n // We do this to minimize screen reader announcements of the value\n // (values are announced every change, which can be chatty for SR users)\n // And to make it easer to select a value when the range is large\n stepper(count < threshold ? 1 : multiplier)\n count++\n }, interval)\n }, delay)\n }\n}\n\nconst isMouseEvent = (evt: Readonly<Event>): evt is MouseEvent =>\n evt.type === 'mouseup' || evt.type === 'mousedown'\n\nconst onMouseup: EventListener = (event: Readonly<Event>) => {\n // `<body>` listener, only enabled when mousedown starts\n\n if (isMouseEvent(event)) {\n if (event.type === 'mouseup' && event.button) {\n // Ignore non left button (main === 0) mouse button click\n return\n }\n }\n\n stopEvent(event)\n resetTimers()\n setMouseup('removeEventListener')\n // Trigger the change event\n emit('change', modelValue.value)\n}\n\nconst setMouseup = (operation: 'addEventListener' | 'removeEventListener') => {\n const doc = getSafeDocument()\n if (doc === null) return\n\n if (operation === 'addEventListener') {\n doc.body.addEventListener('mouseup', onMouseup)\n doc.body.addEventListener('touchend', onMouseup, {passive: false})\n } else {\n doc.body.removeEventListener('mouseup', onMouseup)\n doc.body.removeEventListener('touchend', onMouseup)\n }\n}\nconst resetTimers = () => {\n clearTimeout($_autoDelayTimer)\n clearInterval($_autoRepeatTimer)\n $_autoDelayTimer = undefined\n $_autoRepeatTimer = undefined\n}\n\nconst buttons = computed(() => {\n const incrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-plus',\n viewBox: '0 0 16 16',\n },\n path: {\n d: 'M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z',\n },\n } as const\n\n const decrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-dash',\n viewBox: '0 0 16 16',\n },\n path: {d: 'M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8z'},\n } as const\n\n const sharedButtonAttrs = {\n 'class': [{'py-0': !props.vertical}, 'btn', 'btn-sm', 'border-0', 'rounded-0'],\n 'tabindex': '-1',\n 'type': 'button' as ButtonType,\n 'disabled': props.disabled || props.readonly,\n 'aria-disabled': props.disabled || props.readonly ? true : undefined,\n 'aria-controls': computedId.value,\n }\n\n const sharedSvgAttrs = {\n 'aria-hidden': true,\n 'scale': focused.value ? 1.5 : 1.25,\n }\n\n const handler = (event: Readonly<Event>, stepper: (multiplier?: number) => void) => {\n if (!props.disabled && !props.readonly) {\n stopEvent(event)\n setMouseup('addEventListener')\n // Since we `preventDefault()`, we must manually focus the button\n // Though it's likely captured from the element click focus\n focused.value = true\n handleStepRepeat(event, stepper)\n }\n }\n\n const incrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelIncrement || undefined,\n 'aria-keyshortcuts': 'ArrowUp',\n },\n svg: {\n ...sharedSvgAttrs,\n ...incrementSvgAttrs.svg,\n },\n path: {\n ...incrementSvgAttrs.path,\n },\n slot: {\n name: 'increment',\n },\n handler: (e: Event) => handler(e, stepUp),\n }\n\n const decrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelDecrement || undefined,\n 'aria-keyshortcuts': 'ArrowDown',\n },\n svg: {\n ...sharedSvgAttrs,\n ...decrementSvgAttrs.svg,\n },\n path: {\n ...decrementSvgAttrs.path,\n },\n slot: {\n name: 'decrement',\n },\n handler: (e: Readonly<Event>) => handler(e, stepDown),\n }\n\n return {\n top: {\n ...(props.vertical ? incrementAttrs : decrementAttrs),\n },\n bottom: {\n ...(!props.vertical ? incrementAttrs : decrementAttrs),\n },\n }\n})\n\nonUnmounted(() => {\n // Cleanup event listeners\n setMouseup('removeEventListener')\n})\n</script>\n\n<script lang=\"ts\">\nconst defaultValues = {\n min: 1,\n max: 100,\n step: 1,\n repeatDelay: 500,\n repeatInterval: 100,\n repeatThreshold: 10,\n repeatMultiplier: 4,\n} as const\n</script>\n","<template>\n <div\n ref=\"_element\"\n class=\"b-form-spinbutton form-control\"\n :class=\"computedClasses\"\n role=\"group\"\n :lang=\"computedLocale\"\n :tabindex=\"props.disabled ? undefined : '-1'\"\n :title=\"props.ariaLabel\"\n @click=\"focused = true\"\n >\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.top.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.top.button\"\n @mousedown=\"buttons.top.handler\"\n @touchstart=\"buttons.top.handler\"\n >\n <svg v-bind=\"buttons.top.svg\">\n <path v-bind=\"buttons.top.path\" />\n </svg>\n </button>\n </slot>\n <input\n v-if=\"props.name && !props.disabled\"\n key=\"hidden\"\n type=\"hidden\"\n :name=\"props.name\"\n :form=\"props.form\"\n :value=\"valueAsFixed\"\n />\n <output\n :id=\"computedId\"\n key=\"output\"\n class=\"flex-grow-1\"\n :class=\"computedSpinClasses\"\n :dir=\"(isRtl ?? false) ? 'rtl' : 'ltr'\"\n :tabindex=\"props.disabled ? undefined : '0'\"\n role=\"spinbutton\"\n aria-live=\"off\"\n :aria-label=\"props.ariaLabel || undefined\"\n :aria-invalid=\"\n props.state === false || (!modelValue !== null && props.required) ? true : undefined\n \"\n :aria-required=\"props.required ? true : undefined\"\n :aria-valuemin=\"computedMin\"\n :aria-valuemax=\"computedMax\"\n :aria-valuenow=\"modelValue !== null ? modelValue : undefined\"\n :aria-valuetext=\"modelValue !== null ? computedFormatter(modelValue) : undefined\"\n >\n <bdi>\n {{ (modelValue !== null ? computedFormatter(modelValue) : props.placeholder) || '' }}\n </bdi>\n </output>\n <!-- eslint-disable-next-line prettier/prettier -->\n <!-- prettier-ignore -->\n <slot :name=\"(buttons.bottom.slot.name as 'increment' | 'decrement')\" :has-focus=\"focused\">\n <button\n v-bind=\"buttons.bottom.button\"\n @mousedown=\"buttons.bottom.handler\"\n @touchstart=\"buttons.bottom.handler\"\n >\n <svg v-bind=\"buttons.bottom.svg\">\n <path v-bind=\"buttons.bottom.path\" />\n </svg>\n </button>\n </slot>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, onUnmounted, useTemplateRef} from 'vue'\nimport {\n CODE_DOWN,\n CODE_END,\n CODE_HOME,\n CODE_PAGEDOWN,\n CODE_PAGEUP,\n CODE_UP,\n} from '../../utils/constants'\nimport {onKeyStroke, useFocus, useToNumber} from '@vueuse/core'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useId} from '../../composables/useId'\nimport {useRtl} from '../../composables/useRtl'\nimport type {\n BFormSpinbuttonEmits,\n BFormSpinbuttonProps,\n BFormSpinbuttonSlots,\n ButtonType,\n} from '../../types'\nimport {getSafeDocument} from '../../utils/dom'\n\nconst KEY_CODES = [CODE_UP, CODE_DOWN, CODE_HOME, CODE_END, CODE_PAGEUP, CODE_PAGEDOWN]\n\nconst _props = withDefaults(defineProps<Omit<BFormSpinbuttonProps, 'modelValue'>>(), {\n ariaControls: undefined,\n ariaLabel: undefined,\n disabled: false,\n form: undefined,\n formatterFn: undefined,\n id: undefined,\n inline: false,\n labelDecrement: 'Decrement',\n labelIncrement: 'Increment',\n locale: undefined,\n max: defaultValues.max,\n min: defaultValues.min,\n name: undefined,\n placeholder: undefined,\n readonly: false,\n repeatDelay: defaultValues.repeatDelay,\n repeatInterval: defaultValues.repeatInterval,\n repeatStepMultiplier: defaultValues.repeatMultiplier,\n repeatThreshold: defaultValues.repeatThreshold,\n required: false,\n size: undefined,\n state: null,\n step: defaultValues.step,\n vertical: false,\n wrap: false,\n})\nconst props = useDefaults(_props, 'BFormSpinbutton')\nconst emit = defineEmits<BFormSpinbuttonEmits>()\ndefineSlots<BFormSpinbuttonSlots>()\n\nconst modelValue = defineModel<Exclude<BFormSpinbuttonProps['modelValue'], undefined>>({\n default: null,\n})\n\nconst element = useTemplateRef('_element')\n\nconst {focused} = useFocus(element)\n\nconst computedId = useId(() => props.id, 'spinbutton')\n\nconst computedClasses = computed(() => ({\n 'disabled': props.disabled,\n 'readonly': props.readonly,\n 'focus': focused.value,\n 'd-inline-flex': props.inline || props.vertical,\n 'd-flex': !props.inline && !props.vertical,\n 'align-items-stretch': !props.vertical,\n 'flex-column': props.vertical,\n [`form-control-${props.size}`]: props.size !== undefined,\n}))\n\nconst computedSpinClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-self-center': !props.vertical,\n 'align-items-center': props.vertical,\n 'border-top': props.vertical,\n 'border-bottom': props.vertical,\n 'border-start': !props.vertical,\n 'border-end': !props.vertical,\n}))\n\n//non-reactive properties\nlet $_autoDelayTimer: ReturnType<typeof setTimeout> | undefined\nlet $_autoRepeatTimer: ReturnType<typeof setTimeout> | undefined\nlet $_keyIsDown = false\n\n// const computedInline = computed(() => props.inline && !props.vertical)\n\n// const computedReadonly = computed(() => props.readonly && !props.disabled)\n\nconst stepNumber = useToNumber(() => props.step)\nconst computedStep = computed(() =>\n Number.isNaN(stepNumber.value) ? defaultValues.step : stepNumber.value\n)\n\nconst minNumber = useToNumber(() => props.min)\nconst computedMin = computed(() =>\n Number.isNaN(minNumber.value) ? defaultValues.min : minNumber.value\n)\n\nconst maxNumber = useToNumber(() => props.max)\nconst computedMax = computed(() => {\n const step = computedStep.value\n const min = computedMin.value\n return Math.floor((maxNumber.value - min) / step) * step + min\n})\n\nconst repeatDelayNumber = useToNumber(() => props.repeatDelay, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedDelay = computed(() =>\n repeatDelayNumber.value > 0 ? repeatDelayNumber.value : defaultValues.repeatDelay\n)\n\nconst repeatIntervalNumber = useToNumber(() => props.repeatInterval, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedInterval = computed(() =>\n repeatIntervalNumber.value > 0 ? repeatIntervalNumber.value : defaultValues.repeatInterval\n)\n\nconst repeatThresholdNumber = useToNumber(() => props.repeatThreshold, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedThreshold = computed(() =>\n Math.max(\n Number.isNaN(repeatThresholdNumber.value)\n ? defaultValues.repeatThreshold\n : repeatThresholdNumber.value,\n 1\n )\n)\n\nconst repeatStepMultiplierNumber = useToNumber(() => props.repeatStepMultiplier, {\n nanToZero: true,\n method: 'parseInt',\n})\nconst computedStepMultiplier = computed(() =>\n Math.max(\n Number.isNaN(repeatStepMultiplierNumber.value)\n ? defaultValues.repeatMultiplier\n : repeatStepMultiplierNumber.value,\n 1\n )\n)\n\nconst computedPrecision = computed(() => {\n const step = computedStep.value\n return Math.floor(step) === step ? 0 : (step.toString().split('.')[1] || '').length\n})\n\nconst computedMultiplier = computed(() => Math.pow(10, computedPrecision.value || 0))\n\nconst valueAsFixed = computed(() =>\n modelValue.value === null ? '' : modelValue.value.toFixed(computedPrecision.value)\n)\n\nconst {isRtl, locale: globalLocale} = useRtl()\n\nconst computedLocale = computed(() => {\n const loc = (props.locale ?? globalLocale?.value) || 'locale'\n const locales = [loc]\n const nf = new Intl.NumberFormat(locales)\n return nf.resolvedOptions().locale\n})\n\nconst defaultFormatter = () =>\n new Intl.NumberFormat(computedLocale.value, {\n style: 'decimal',\n useGrouping: false,\n minimumIntegerDigits: 1,\n minimumFractionDigits: computedPrecision.value,\n maximumFractionDigits: computedPrecision.value,\n notation: 'standard',\n }).format\n\nconst computedFormatter = computed(() => props.formatterFn ?? defaultFormatter())\n\nconst stepValue = (direction: number) => {\n // Sets a new incremented or decremented value, supporting optional wrapping\n // Direction is either +1 or -1 (or a multiple thereof)\n let {value} = modelValue\n if (!props.disabled && value !== null) {\n const step = computedStep.value * direction\n const min = computedMin.value\n const max = computedMax.value\n const multiplier = computedMultiplier.value\n const {wrap} = props\n // We ensure that the value steps like a native input\n value = Math.round((value - min) / step) * step + min + step\n // We ensure that precision is maintained (decimals)\n value = Math.round(value * multiplier) / multiplier\n // Handle if wrapping is enabled\n modelValue.value = value > max ? (wrap ? min : max) : value < min ? (wrap ? max : min) : value\n }\n}\n\nconst stepUp = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = computedMin.value\n return\n }\n stepValue(+1 * multiplier)\n}\n\nconst stepDown = (multiplier = 1) => {\n if (modelValue.value === null) {\n modelValue.value = props.wrap ? computedMax.value : computedMin.value\n return\n }\n stepValue(-1 * multiplier)\n}\n\nconst stopEvent = (event: Readonly<Event>) => {\n event.preventDefault()\n event.stopImmediatePropagation()\n}\n\nonKeyStroke(\n KEY_CODES,\n (event) => {\n const {code, altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n // https://w3c.github.io/aria-practices/#spinbutton\n stopEvent(event)\n if ($_keyIsDown) {\n // Keypress is already in progress\n return\n }\n\n resetTimers()\n if ([CODE_UP, CODE_DOWN].includes(code)) {\n // The following use the custom auto-repeat handling\n\n $_keyIsDown = true\n if (code === CODE_UP) {\n handleStepRepeat(event, stepUp)\n return\n }\n if (code === CODE_DOWN) {\n handleStepRepeat(event, stepDown)\n }\n return\n }\n // These use native OS key repeating\n if (code === CODE_PAGEUP) {\n stepUp(computedStepMultiplier.value)\n return\n }\n if (code === CODE_PAGEDOWN) {\n stepDown(computedStepMultiplier.value)\n return\n }\n if (code === CODE_HOME) {\n modelValue.value = computedMin.value\n return\n }\n if (code === CODE_END) {\n modelValue.value = computedMax.value\n }\n },\n {target: element, eventName: 'keydown'}\n)\n\nonKeyStroke(\n KEY_CODES,\n (event: Readonly<KeyboardEvent>) => {\n // Emit a change event when the keyup happens\n\n const {altKey, ctrlKey, metaKey} = event\n\n if (props.disabled || props.readonly || altKey || ctrlKey || metaKey) return\n\n stopEvent(event)\n resetTimers()\n $_keyIsDown = false\n emit('change', modelValue.value)\n },\n {target: element, eventName: 'keyup'}\n)\n\n// takes in a mount or Keyboard Event\nconst handleStepRepeat = (event: Readonly<Event>, stepper: (step: number) => void) => {\n const {type} = event || {}\n\n if (!props.disabled && !props.readonly) {\n if (isMouseEvent(event)) {\n // We only respond to left (main === 0) button clicks\n if (type === 'mousedown' && event.button) return\n }\n resetTimers()\n // Step the counter initially\n stepper(1)\n const threshold = computedThreshold.value\n const multiplier = computedStepMultiplier.value\n const delay = computedDelay.value\n const interval = computedInterval.value\n\n // Initiate the delay/repeat interval\n $_autoDelayTimer = setTimeout(() => {\n let count = 0\n $_autoRepeatTimer = setInterval(() => {\n // After N initial repeats, we increase the incrementing step amount\n // We do this to minimize screen reader announcements of the value\n // (values are announced every change, which can be chatty for SR users)\n // And to make it easer to select a value when the range is large\n stepper(count < threshold ? 1 : multiplier)\n count++\n }, interval)\n }, delay)\n }\n}\n\nconst isMouseEvent = (evt: Readonly<Event>): evt is MouseEvent =>\n evt.type === 'mouseup' || evt.type === 'mousedown'\n\nconst onMouseup: EventListener = (event: Readonly<Event>) => {\n // `<body>` listener, only enabled when mousedown starts\n\n if (isMouseEvent(event)) {\n if (event.type === 'mouseup' && event.button) {\n // Ignore non left button (main === 0) mouse button click\n return\n }\n }\n\n stopEvent(event)\n resetTimers()\n setMouseup('removeEventListener')\n // Trigger the change event\n emit('change', modelValue.value)\n}\n\nconst setMouseup = (operation: 'addEventListener' | 'removeEventListener') => {\n const doc = getSafeDocument()\n if (doc === null) return\n\n if (operation === 'addEventListener') {\n doc.body.addEventListener('mouseup', onMouseup)\n doc.body.addEventListener('touchend', onMouseup, {passive: false})\n } else {\n doc.body.removeEventListener('mouseup', onMouseup)\n doc.body.removeEventListener('touchend', onMouseup)\n }\n}\nconst resetTimers = () => {\n clearTimeout($_autoDelayTimer)\n clearInterval($_autoRepeatTimer)\n $_autoDelayTimer = undefined\n $_autoRepeatTimer = undefined\n}\n\nconst buttons = computed(() => {\n const incrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-plus',\n viewBox: '0 0 16 16',\n },\n path: {\n d: 'M8 4a.5.5 0 0 1 .5.5v3h3a.5.5 0 0 1 0 1h-3v3a.5.5 0 0 1-1 0v-3h-3a.5.5 0 0 1 0-1h3v-3A.5.5 0 0 1 8 4z',\n },\n } as const\n\n const decrementSvgAttrs = {\n svg: {\n xmlns: 'http://www.w3.org/2000/svg',\n width: '16',\n height: '16',\n fill: 'currentColor',\n class: 'bi bi-dash',\n viewBox: '0 0 16 16',\n },\n path: {d: 'M4 8a.5.5 0 0 1 .5-.5h7a.5.5 0 0 1 0 1h-7A.5.5 0 0 1 4 8z'},\n } as const\n\n const sharedButtonAttrs = {\n 'class': [{'py-0': !props.vertical}, 'btn', 'btn-sm', 'border-0', 'rounded-0'],\n 'tabindex': '-1',\n 'type': 'button' as ButtonType,\n 'disabled': props.disabled || props.readonly,\n 'aria-disabled': props.disabled || props.readonly ? true : undefined,\n 'aria-controls': computedId.value,\n }\n\n const sharedSvgAttrs = {\n 'aria-hidden': true,\n 'scale': focused.value ? 1.5 : 1.25,\n }\n\n const handler = (event: Readonly<Event>, stepper: (multiplier?: number) => void) => {\n if (!props.disabled && !props.readonly) {\n stopEvent(event)\n setMouseup('addEventListener')\n // Since we `preventDefault()`, we must manually focus the button\n // Though it's likely captured from the element click focus\n focused.value = true\n handleStepRepeat(event, stepper)\n }\n }\n\n const incrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelIncrement || undefined,\n 'aria-keyshortcuts': 'ArrowUp',\n },\n svg: {\n ...sharedSvgAttrs,\n ...incrementSvgAttrs.svg,\n },\n path: {\n ...incrementSvgAttrs.path,\n },\n slot: {\n name: 'increment',\n },\n handler: (e: Event) => handler(e, stepUp),\n }\n\n const decrementAttrs = {\n button: {\n ...sharedButtonAttrs,\n 'aria-label': props.labelDecrement || undefined,\n 'aria-keyshortcuts': 'ArrowDown',\n },\n svg: {\n ...sharedSvgAttrs,\n ...decrementSvgAttrs.svg,\n },\n path: {\n ...decrementSvgAttrs.path,\n },\n slot: {\n name: 'decrement',\n },\n handler: (e: Readonly<Event>) => handler(e, stepDown),\n }\n\n return {\n top: {\n ...(props.vertical ? incrementAttrs : decrementAttrs),\n },\n bottom: {\n ...(!props.vertical ? incrementAttrs : decrementAttrs),\n },\n }\n})\n\nonUnmounted(() => {\n // Cleanup event listeners\n setMouseup('removeEventListener')\n})\n</script>\n\n<script lang=\"ts\">\nconst defaultValues = {\n min: 1,\n max: 100,\n step: 1,\n repeatDelay: 500,\n repeatInterval: 100,\n repeatThreshold: 10,\n repeatMultiplier: 4,\n} as const\n</script>\n"],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BTabs-BVcu9DPg.js","names":[],"sources":["../src/components/BTabs/BTab.vue","../src/components/BTabs/BTab.vue","../src/components/BTabsTabContent.vue","../src/components/BTabsTabContent.vue","../src/components/BTabs/BTabs.vue","../src/components/BTabs/BTabs.vue"],"sourcesContent":["<template>\n <component\n :is=\"props.tag\"\n :id=\"computedId\"\n ref=\"_el\"\n class=\"tab-pane\"\n :class=\"computedClasses\"\n role=\"tabpanel\"\n :aria-labelledby=\"computedButtonId\"\n v-bind=\"processedAttrs\"\n >\n <slot v-if=\"showSlot\" />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, inject, onUnmounted, ref, useAttrs, useTemplateRef, watch} from 'vue'\nimport {useId} from '../../composables/useId'\nimport {useDefaults} from '../../composables/useDefaults'\nimport type {TabType} from '../../types/Tab'\nimport type {BTabProps} from '../../types/ComponentProps'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport type {BTabSlots} from '../../types/ComponentSlots'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BTabProps, 'active'>>(), {\n buttonId: undefined,\n disabled: false,\n id: undefined,\n lazy: undefined,\n unmountLazy: undefined,\n noBody: false,\n tag: 'div',\n title: undefined,\n titleItemClass: undefined,\n titleLinkAttrs: undefined,\n titleLinkClass: undefined,\n})\nconst props = useDefaults(_props, 'BTab')\nconst slots = defineSlots<BTabSlots>()\nconst attrs = useAttrs()\n\nconst activeModel = defineModel<Exclude<BTabProps['active'], undefined>>('active', {\n default: false,\n})\n\nconst parentData = inject(tabsInjectionKey, null)\n\nconst localId = ref(props.id)\nconst internalId = useId('', 'tabpane')\nconst computedId = computed(() => props.id ?? localId.value ?? internalId.value)\nconst computedButtonId = useId(() => props.buttonId, 'tab')\n\nconst lazyRenderCompleted = ref(false)\nconst el = useTemplateRef('_el')\n\nconst processedAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {onClick: _, ...tabAttrs} = attrs\n return tabAttrs\n})\n\nfunction updateTab() {\n if (!parentData) return\n const newId = parentData.registerTab(\n computed(\n () =>\n ({\n internalId: internalId.value,\n id: computedId.value,\n active: activeModel.value,\n buttonId: computedButtonId.value,\n disabled: props.disabled,\n title: props.title,\n titleComponent: slots.title,\n titleItemClass: props.titleItemClass,\n titleLinkAttrs: props.titleLinkAttrs,\n titleLinkClass: props.titleLinkClass,\n onClick: attrs.onClick,\n el,\n }) as TabType\n )\n )\n if (newId !== localId.value) {\n localId.value = newId\n }\n}\n\nif (parentData) {\n updateTab()\n if (activeModel.value) {\n parentData.activateTab(internalId.value)\n }\n}\n\nonUnmounted(() => {\n if (!parentData) return\n parentData.unregisterTab(internalId.value)\n})\n\nconst isActive = computed(() => parentData?.activeId.value === computedId.value)\nconst show = ref(isActive.value)\n\nconst computedLazy = computed(() => !!(parentData?.lazy.value || props.lazy))\n\nconst computedActive = computed(() => isActive.value && !props.disabled)\nconst showSlot = computed(\n () =>\n computedActive.value ||\n !computedLazy.value ||\n (computedLazy.value && !props.unmountLazy && lazyRenderCompleted.value)\n)\n\nwatch(showSlot, (shown) => {\n if (shown && !lazyRenderCompleted.value) lazyRenderCompleted.value = true\n})\n\nwatch(isActive, (active) => {\n if (active) {\n activeModel.value = true\n setTimeout(() => {\n show.value = true\n }, 0)\n return\n }\n show.value = false\n activeModel.value = false\n})\n\nwatch(activeModel, (active) => {\n if (props.disabled) {\n activeModel.value = false\n return\n }\n if (!parentData) return\n if (!active) {\n if (isActive.value) {\n parentData.activateTab(undefined)\n }\n return\n }\n if (!isActive.value) {\n parentData.activateTab(internalId.value)\n }\n})\n\nconst computedClasses = computed(() => [\n {\n 'active': isActive.value,\n 'show': show.value,\n 'card-body': parentData?.card.value && props.noBody === false,\n 'fade': !parentData?.noFade.value,\n },\n show.value ? parentData?.activeTabClass.value : parentData?.inactiveTabClass.value,\n parentData?.tabClass.value,\n])\n\ndefineExpose({\n activate: () => {\n activeModel.value = true\n },\n deactivate: () => {\n activeModel.value = false\n },\n})\n</script>\n","<template>\n <component\n :is=\"props.tag\"\n :id=\"computedId\"\n ref=\"_el\"\n class=\"tab-pane\"\n :class=\"computedClasses\"\n role=\"tabpanel\"\n :aria-labelledby=\"computedButtonId\"\n v-bind=\"processedAttrs\"\n >\n <slot v-if=\"showSlot\" />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {computed, inject, onUnmounted, ref, useAttrs, useTemplateRef, watch} from 'vue'\nimport {useId} from '../../composables/useId'\nimport {useDefaults} from '../../composables/useDefaults'\nimport type {TabType} from '../../types/Tab'\nimport type {BTabProps} from '../../types/ComponentProps'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport type {BTabSlots} from '../../types/ComponentSlots'\n\ndefineOptions({\n inheritAttrs: false,\n})\n\nconst _props = withDefaults(defineProps<Omit<BTabProps, 'active'>>(), {\n buttonId: undefined,\n disabled: false,\n id: undefined,\n lazy: undefined,\n unmountLazy: undefined,\n noBody: false,\n tag: 'div',\n title: undefined,\n titleItemClass: undefined,\n titleLinkAttrs: undefined,\n titleLinkClass: undefined,\n})\nconst props = useDefaults(_props, 'BTab')\nconst slots = defineSlots<BTabSlots>()\nconst attrs = useAttrs()\n\nconst activeModel = defineModel<Exclude<BTabProps['active'], undefined>>('active', {\n default: false,\n})\n\nconst parentData = inject(tabsInjectionKey, null)\n\nconst localId = ref(props.id)\nconst internalId = useId('', 'tabpane')\nconst computedId = computed(() => props.id ?? localId.value ?? internalId.value)\nconst computedButtonId = useId(() => props.buttonId, 'tab')\n\nconst lazyRenderCompleted = ref(false)\nconst el = useTemplateRef('_el')\n\nconst processedAttrs = computed(() => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const {onClick: _, ...tabAttrs} = attrs\n return tabAttrs\n})\n\nfunction updateTab() {\n if (!parentData) return\n const newId = parentData.registerTab(\n computed(\n () =>\n ({\n internalId: internalId.value,\n id: computedId.value,\n active: activeModel.value,\n buttonId: computedButtonId.value,\n disabled: props.disabled,\n title: props.title,\n titleComponent: slots.title,\n titleItemClass: props.titleItemClass,\n titleLinkAttrs: props.titleLinkAttrs,\n titleLinkClass: props.titleLinkClass,\n onClick: attrs.onClick,\n el,\n }) as TabType\n )\n )\n if (newId !== localId.value) {\n localId.value = newId\n }\n}\n\nif (parentData) {\n updateTab()\n if (activeModel.value) {\n parentData.activateTab(internalId.value)\n }\n}\n\nonUnmounted(() => {\n if (!parentData) return\n parentData.unregisterTab(internalId.value)\n})\n\nconst isActive = computed(() => parentData?.activeId.value === computedId.value)\nconst show = ref(isActive.value)\n\nconst computedLazy = computed(() => !!(parentData?.lazy.value || props.lazy))\n\nconst computedActive = computed(() => isActive.value && !props.disabled)\nconst showSlot = computed(\n () =>\n computedActive.value ||\n !computedLazy.value ||\n (computedLazy.value && !props.unmountLazy && lazyRenderCompleted.value)\n)\n\nwatch(showSlot, (shown) => {\n if (shown && !lazyRenderCompleted.value) lazyRenderCompleted.value = true\n})\n\nwatch(isActive, (active) => {\n if (active) {\n activeModel.value = true\n setTimeout(() => {\n show.value = true\n }, 0)\n return\n }\n show.value = false\n activeModel.value = false\n})\n\nwatch(activeModel, (active) => {\n if (props.disabled) {\n activeModel.value = false\n return\n }\n if (!parentData) return\n if (!active) {\n if (isActive.value) {\n parentData.activateTab(undefined)\n }\n return\n }\n if (!isActive.value) {\n parentData.activateTab(internalId.value)\n }\n})\n\nconst computedClasses = computed(() => [\n {\n 'active': isActive.value,\n 'show': show.value,\n 'card-body': parentData?.card.value && props.noBody === false,\n 'fade': !parentData?.noFade.value,\n },\n show.value ? parentData?.activeTabClass.value : parentData?.inactiveTabClass.value,\n parentData?.tabClass.value,\n])\n\ndefineExpose({\n activate: () => {\n activeModel.value = true\n },\n deactivate: () => {\n activeModel.value = false\n },\n})\n</script>\n","<template>\n <div class=\"tab-content\" :class=\"contentClass\">\n <slot />\n <div v-if=\"showEmpty\" key=\"bv-empty-tab\" class=\"tab-pane active\" :class=\"{'card-body': card}\">\n <slot name=\"empty\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {ClassValue} from '../types/AnyValuedAttributes'\n\ndefineProps<{\n contentClass: ClassValue | undefined\n showEmpty: boolean\n card: boolean\n}>()\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndefineSlots<{\n default?: (props: Record<string, never>) => any\n empty?: (props: Record<string, never>) => any\n}>()\n/* eslint-enable @typescript-eslint/no-explicit-any */\n</script>\n","<template>\n <div class=\"tab-content\" :class=\"contentClass\">\n <slot />\n <div v-if=\"showEmpty\" key=\"bv-empty-tab\" class=\"tab-pane active\" :class=\"{'card-body': card}\">\n <slot name=\"empty\" />\n </div>\n </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type {ClassValue} from '../types/AnyValuedAttributes'\n\ndefineProps<{\n contentClass: ClassValue | undefined\n showEmpty: boolean\n card: boolean\n}>()\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\ndefineSlots<{\n default?: (props: Record<string, never>) => any\n empty?: (props: Record<string, never>) => any\n}>()\n/* eslint-enable @typescript-eslint/no-explicit-any */\n</script>\n","<template>\n <component :is=\"props.tag\" :id=\"props.id\" class=\"tabs\" :class=\"computedClasses\">\n <BTabsTabContent v-if=\"props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n <div\n :class=\"[\n props.navWrapperClass,\n {'card-header': props.card, 'ms-auto': vertical && props.end},\n ]\"\n >\n <ul\n class=\"nav\"\n :class=\"[navTabsClasses, props.navClass]\"\n role=\"tablist\"\n :aria-orientation=\"props.vertical ? 'vertical' : 'horizontal'\"\n >\n <slot name=\"tabs-start\" />\n <li\n v-for=\"(tab, idx) in tabs\"\n :key=\"tab.id ?? tab.internalId\"\n class=\"nav-item\"\n :class=\"tab.titleItemClass\"\n role=\"presentation\"\n >\n <button\n :id=\"tab.buttonId\"\n class=\"nav-link\"\n :class=\"[tab.navItemClasses, tab.titleLinkClass, tab.active ? props.activeNavLinkClass : props.inactiveNavLinkClass]\"\n role=\"tab\"\n :aria-controls=\"tab.id\"\n :aria-selected=\"tab.active\"\n :disabled=\"tab.disabled\"\n :tabindex=\"props.noKeyNav ? undefined : tab.active ? undefined : -1\"\n type=\"button\"\n v-bind=\"tab.titleLinkAttrs\"\n @keydown.left.exact=\"!props.vertical && keynav($event, -1)\"\n @keydown.left.shift=\"!props.vertical && keynav($event, -999)\"\n @keydown.up.exact=\"props.vertical && keynav($event, -1)\"\n @keydown.up.shift=\"props.vertical && keynav($event, -999)\"\n @keydown.right.exact=\"!props.vertical && keynav($event, 1)\"\n @keydown.right.shift=\"!props.vertical && keynav($event, 999)\"\n @keydown.down.exact=\"props.vertical && keynav($event, 1)\"\n @keydown.down.shift=\"props.vertical && keynav($event, 999)\"\n @keydown.page-up=\"keynav($event, -999)\"\n @keydown.page-down=\"keynav($event, 999)\"\n @keydown.home=\"keynav($event, -999)\"\n @keydown.end=\"keynav($event, 999)\"\n @click.stop=\"(e) => handleClick(e, idx)\"\n >\n <component :is=\"tab.titleComponent\" v-if=\"tab.titleComponent\" />\n <template v-else>\n {{ tab.title }}\n </template>\n </button>\n </li>\n <slot name=\"tabs-end\" />\n </ul>\n </div>\n <BTabsTabContent v-if=\"!props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onMounted,\n provide,\n type Ref,\n ref,\n toRef,\n unref,\n type VNode,\n watch,\n} from 'vue'\nimport {BvEvent} from '../../utils/classes'\nimport {useAlignment} from '../../composables/useAlignment'\nimport {useId} from '../../composables/useId'\nimport type {TabType, BTabsProps, BTabsEmits, BTabsSlots} from '../../types'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {getSafeDocument, sortSlotElementsByPosition} from '../../utils/dom'\nimport {flattenFragments} from '../../utils/flattenFragments'\nimport BTab from './BTab.vue'\nimport BTabsTabContent from '../BTabsTabContent.vue'\n\nconst _props = withDefaults(defineProps<Omit<BTabsProps, 'modelValue' | 'activeIndex'>>(), {\n activeNavItemClass: undefined,\n activeNavLinkClass: undefined,\n activeTabClass: undefined,\n align: undefined,\n card: false,\n contentClass: undefined,\n end: false,\n fill: false,\n id: undefined,\n inactiveNavItemClass: undefined,\n inactiveNavLinkClass: undefined,\n inactiveTabClass: undefined,\n justified: false,\n lazy: false,\n navClass: undefined,\n navItemClass: undefined,\n navWrapperClass: undefined,\n noFade: false,\n noKeyNav: false,\n noNavStyle: false,\n pills: false,\n small: false,\n tag: 'div',\n tabClass: undefined,\n underline: false,\n vertical: false,\n})\nconst props = useDefaults(_props, 'BTabs')\nconst emit = defineEmits<BTabsEmits>()\nconst slots = defineSlots<BTabsSlots>()\n\nconst activeIndex = defineModel<Exclude<BTabsProps['index'], undefined>>('index', {\n default: -1,\n})\nconst activeId = defineModel<BTabsProps['modelValue']>({\n default: undefined,\n})\n\nconst tabsInternal = ref<Ref<TabType>[]>([])\n\nconst tabElementsArray = ref<VNode[]>([])\n\nconst isChildActive = ref(false)\nconst initialIds = ref<string[]>([])\nconst hasExplicitIds = ref(false)\n\nconst updateTabElementsArray = () => {\n const tabElements = flattenFragments(slots.default?.({}) ?? [])\n tabElementsArray.value = (Array.isArray(tabElements) ? tabElements : [tabElements]).filter(\n (tab) => tab.type === BTab\n )\n // only get the ids once in setup context\n if (initialIds.value.length === 0) {\n // we need to get the ids of the tabs before they are registered. After that we use the internalId for the tabpane\n initialIds.value = tabElementsArray.value.map((tab) =>\n unref(useId(() => tab.props?.id, 'tabpane'))\n )\n // Check if any tab has an explicit ID\n hasExplicitIds.value = tabElementsArray.value.some((tab) => tab.props?.id !== undefined)\n }\n isChildActive.value = tabElementsArray.value.some(\n (tab) => tab.props?.active !== undefined && tab.props?.active !== false\n )\n}\nupdateTabElementsArray()\n\nwatch(\n () => slots.default?.({}),\n () => {\n updateTabElementsArray()\n nextTick(() => {\n sortTabs()\n })\n }\n)\n\nconst tabs = computed(() => {\n if (tabsInternal.value.length === 0) {\n // fail back on the slot elements, the children haven't been registered yet\n const _activeIndex = tabElementsArray.value.findIndex(\n (tab) =>\n (tab.props?.active !== undefined &&\n (tab.props.disabled === false || tab.props.disabled === undefined)) ||\n (activeId.value && tab.props?.id === activeId.value)\n )\n return tabElementsArray.value.map((tab, index) => {\n const active =\n _activeIndex !== -1\n ? index === _activeIndex\n : activeIndex.value > -1\n ? index === activeIndex.value\n : index === 0\n return {\n id: tab.props?.id ?? initialIds.value[index],\n internalId: `premount-${index}`, // temporary id for the tab\n buttonId: tab.props?.buttonId,\n disabled: tab.props?.disabled,\n title: tab.props?.title,\n titleComponent: (tab.children as {title: unknown})?.title,\n titleItemClass: tab.props?.titleItemClass,\n titleLinkAttrs: tab.props?.titleLinkAttrs,\n titleLinkClass: tab.props?.titleLinkClass,\n onClick: tab.props?.onClick,\n active,\n navItemClasses: [\n {\n active,\n disabled: !(tab.props?.disabled === false || tab.props?.disabled === undefined),\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n }\n return tabsInternal.value.map((_tab) => {\n const tab = unref(_tab)\n const active = tab.id === activeId.value\n\n return {\n ...tab,\n active,\n navItemClasses: [\n {\n active,\n disabled: tab.disabled,\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n})\n\nlet initialized = false\nlet updateInitialActiveIndex = false\nlet updateInitialActiveId = false\nlet delayedTabSelection = false\n\n// Check if we need to delay tab selection:\n// - We have v-model:index (activeIndex) but no v-model (activeId)\n// - AND tabs don't have explicit IDs (will use generated IDs)\n// - AND we have tabs to select from\nconst needsDelayedSelection =\n activeIndex.value > -1 &&\n !activeId.value &&\n !hasExplicitIds.value &&\n tabElementsArray.value.length > 0\n\nif (needsDelayedSelection) {\n // Delay tab selection until children register with their generated IDs\n delayedTabSelection = true\n updateInitialActiveId = true\n} else if (activeIndex.value === -1 && activeId.value) {\n if (tabs.value.findIndex((t) => t.id === activeId.value) !== -1) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n } else {\n updateInitialActiveIndex = true\n }\n} else if (activeIndex.value > -1 && !activeId.value) {\n if (tabs.value[activeIndex.value]?.id) {\n activeId.value = tabs.value[activeIndex.value]?.id\n } else {\n updateInitialActiveId = true\n }\n} else if (activeIndex.value === -1 && !activeId.value && !isChildActive.value) {\n activeIndex.value = tabs.value.findIndex((t) => t.disabled === undefined || t.disabled === false)\n activeId.value = tabs.value[activeIndex.value]?.id\n} else if (activeIndex.value === -1 && !activeId.value && isChildActive.value) {\n activeIndex.value = tabs.value.findIndex(\n (t) =>\n t.active !== undefined &&\n t.active !== false &&\n (t.disabled === undefined || t.disabled === false)\n )\n activeId.value = tabs.value[activeIndex.value]?.id\n}\n\nfunction updateInitialIndexAndId() {\n // we get the computedIds after registering the tabs\n if (updateInitialActiveIndex) {\n const index = tabs.value.findIndex((t) => t.id === activeId.value)\n if (index !== -1) {\n nextTick(() => {\n activeIndex.value = index\n updateInitialActiveIndex = false\n })\n }\n }\n if (updateInitialActiveId) {\n // Wait for tabs to be registered if we're doing delayed selection\n if (delayedTabSelection && tabsInternal.value.length === 0) {\n // Children haven't registered yet, wait\n return\n }\n if (activeIndex.value > -1 && tabs.value[activeIndex.value]?.id) {\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n updateInitialActiveId = false\n delayedTabSelection = false\n })\n }\n }\n}\n\nupdateInitialIndexAndId()\n\nconst showEmpty = computed(() => !(tabs?.value && tabs.value.length > 0))\n\nconst tabContentProps = computed(() => ({\n contentClass: props.contentClass,\n showEmpty: showEmpty.value,\n card: props.card,\n}))\n\nconst computedClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-items-start': props.vertical,\n}))\n\nconst alignment = useAlignment(() => props.align)\n\nconst navTabsClasses = computed(() => ({\n 'nav-pills': props.pills,\n 'nav-underline': props.underline,\n 'flex-column me-3': props.vertical,\n [alignment.value]: props.align !== undefined,\n 'nav-fill': props.fill,\n 'card-header-tabs': props.card && !props.pills && !props.underline,\n 'card-header-pills': props.card && props.pills,\n 'nav-justified': props.justified,\n 'nav-tabs': !props.noNavStyle && !props.pills && !props.underline,\n 'small': props.small,\n}))\n\nconst handleClick = (event: Readonly<MouseEvent>, index: number) => {\n if (\n index >= 0 &&\n !tabs.value[index]?.disabled &&\n tabs.value[index]?.onClick &&\n typeof tabs.value[index].onClick === 'function'\n ) {\n tabs.value[index].onClick?.(event)\n if (event.defaultPrevented) {\n getSafeDocument()?.getElementById(tabs.value[index].buttonId)?.blur()\n return\n }\n }\n activeIndex.value = index\n}\n\nconst keynav = (e: Event, direction: number) => {\n if (tabs.value.length <= 0 || props.noKeyNav) return\n e.preventDefault()\n e.stopPropagation()\n activeIndex.value = nextIndex(activeIndex.value + direction, direction)\n nextTick(() => {\n if (activeIndex.value >= 0) {\n getSafeDocument()?.getElementById(tabs.value[activeIndex.value]?.buttonId)?.focus()\n }\n })\n}\n\nconst nextIndex = (start: number, direction: number) => {\n let index = start\n let minIdx = -1\n let maxIdx = -1\n\n for (let i = 0; i < tabs.value.length; i++) {\n if (!tabs.value[i]?.disabled) {\n if (minIdx === -1) minIdx = i\n maxIdx = i\n }\n }\n\n while (index >= minIdx && index <= maxIdx && tabs.value[index]?.disabled) {\n index += direction\n }\n\n if (index < minIdx) index = minIdx\n if (index > maxIdx) index = maxIdx\n\n return index\n}\n\nlet previousIndex: number | undefined\nlet isReverting = false\nwatch(activeIndex, (newValue, oldValue) => {\n // Early exit if there are no tabs or all tabs are disabled\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n\n // If we're reverting due to a prevented event, don't process further\n if (isReverting) {\n isReverting = false\n return\n }\n // Calculate the next valid index\n const index = nextIndex(newValue, newValue > oldValue ? 1 : -1)\n if (index !== newValue) {\n // If the index is not the same as the new value, set the previous index to the old value\n // this is to prevent the event from being emitted twice\n previousIndex = oldValue\n activeIndex.value = index\n return\n }\n // Emit the activate-tab event\n const tabEvent = new BvEvent('activate-tab', {cancelable: true})\n emit('activate-tab', {\n newTabId: tabs.value[index]?.id,\n prevTabId: tabs.value[previousIndex ?? oldValue]?.id,\n newTabIndex: index,\n prevTabIndex: previousIndex ?? oldValue,\n event: tabEvent,\n })\n // If the event is prevented, revert to the previous index\n if (tabEvent.defaultPrevented) {\n isReverting = true\n const prev = previousIndex ?? oldValue ?? nextIndex(0, 1)\n previousIndex = undefined\n // Update the active id this will also trigger the activeId watch which will update the activeIndex\n // this is to make sure we handle case that starts with id change.\n if (activeId.value !== tabs.value[prev]?.id) {\n activeId.value = tabs.value[prev]?.id\n }\n nextTick(() => {\n if (prev >= 0) {\n getSafeDocument()?.getElementById(tabs.value[prev]?.buttonId)?.focus()\n }\n })\n return\n }\n\n // Update the active id\n if (activeId.value !== tabs.value[index]?.id) {\n activeId.value = tabs.value[index]?.id\n }\n previousIndex = undefined\n})\n\nwatch(activeId, (newValue, oldValue) => {\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n const index = tabs.value.findIndex((t) => t.id === newValue)\n // If the new tab is the same as the current tab, do nothing\n if (index === activeIndex.value) return\n const oldIndex = tabs.value.findIndex((t) => t.id === oldValue)\n // If the new tab is disabled, find the next enabled tab\n if (tabs.value[index]?.disabled) {\n // activeIndex watcher will update the activeId to the next enabled tab\n activeIndex.value = nextIndex(index, index > oldIndex ? 1 : -1)\n return\n }\n // If the new tab is not found, find the first enabled tab\n if (index === -1) {\n // activeIndex watcher will update the activeId to the first enabled tab\n activeIndex.value = nextIndex(0, 1)\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n })\n return\n }\n // change to the next tab\n activeIndex.value = index\n})\n\nconst registerTab = (tab: Ref<TabType>) => {\n const idx = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n if (idx === -1) {\n tabsInternal.value.push(tab)\n if (initialized) {\n nextTick(() => {\n sortTabs()\n })\n } else {\n // If we're doing delayed tab selection, try to update now that a tab has registered\n if (delayedTabSelection) {\n nextTick(() => {\n updateInitialIndexAndId()\n })\n }\n }\n } else {\n tabsInternal.value[idx] = tab\n if (initialized) {\n // sort just in case the tab was moved\n sortTabs()\n }\n }\n const idx2 = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n return tab.value.id ?? (!initialized ? initialIds.value[idx2] : tab.value.internalId)\n}\n\nonMounted(() => {\n updateInitialIndexAndId()\n sortTabs()\n initialized = true\n})\n\nconst sortTabs = () => {\n tabsInternal.value.sort((a, b) => sortSlotElementsByPosition(a.value.el.value, b.value.el.value))\n if (\n activeId.value &&\n activeIndex.value !== tabs.value.findIndex((t) => t.id === activeId.value)\n ) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n }\n}\n\nconst unregisterTab = (id: string) => {\n tabsInternal.value = tabsInternal.value.filter((t) => t.value.internalId !== id)\n}\n\nprovide(tabsInjectionKey, {\n lazy: toRef(() => props.lazy),\n card: toRef(() => props.card),\n noFade: toRef(() => props.noFade),\n activeTabClass: toRef(() => props.activeTabClass),\n inactiveTabClass: toRef(() => props.inactiveTabClass),\n tabClass: toRef(() => props.tabClass),\n registerTab,\n unregisterTab,\n activeId,\n activateTab: (internalId) => {\n const idx = tabs.value.findIndex((t) => t.internalId === internalId)\n if (internalId === undefined || idx === -1) {\n activeIndex.value = nextIndex(0, 1)\n return\n }\n activeIndex.value = idx\n },\n})\n</script>\n","<template>\n <component :is=\"props.tag\" :id=\"props.id\" class=\"tabs\" :class=\"computedClasses\">\n <BTabsTabContent v-if=\"props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n <div\n :class=\"[\n props.navWrapperClass,\n {'card-header': props.card, 'ms-auto': vertical && props.end},\n ]\"\n >\n <ul\n class=\"nav\"\n :class=\"[navTabsClasses, props.navClass]\"\n role=\"tablist\"\n :aria-orientation=\"props.vertical ? 'vertical' : 'horizontal'\"\n >\n <slot name=\"tabs-start\" />\n <li\n v-for=\"(tab, idx) in tabs\"\n :key=\"tab.id ?? tab.internalId\"\n class=\"nav-item\"\n :class=\"tab.titleItemClass\"\n role=\"presentation\"\n >\n <button\n :id=\"tab.buttonId\"\n class=\"nav-link\"\n :class=\"[tab.navItemClasses, tab.titleLinkClass, tab.active ? props.activeNavLinkClass : props.inactiveNavLinkClass]\"\n role=\"tab\"\n :aria-controls=\"tab.id\"\n :aria-selected=\"tab.active\"\n :disabled=\"tab.disabled\"\n :tabindex=\"props.noKeyNav ? undefined : tab.active ? undefined : -1\"\n type=\"button\"\n v-bind=\"tab.titleLinkAttrs\"\n @keydown.left.exact=\"!props.vertical && keynav($event, -1)\"\n @keydown.left.shift=\"!props.vertical && keynav($event, -999)\"\n @keydown.up.exact=\"props.vertical && keynav($event, -1)\"\n @keydown.up.shift=\"props.vertical && keynav($event, -999)\"\n @keydown.right.exact=\"!props.vertical && keynav($event, 1)\"\n @keydown.right.shift=\"!props.vertical && keynav($event, 999)\"\n @keydown.down.exact=\"props.vertical && keynav($event, 1)\"\n @keydown.down.shift=\"props.vertical && keynav($event, 999)\"\n @keydown.page-up=\"keynav($event, -999)\"\n @keydown.page-down=\"keynav($event, 999)\"\n @keydown.home=\"keynav($event, -999)\"\n @keydown.end=\"keynav($event, 999)\"\n @click.stop=\"(e) => handleClick(e, idx)\"\n >\n <component :is=\"tab.titleComponent\" v-if=\"tab.titleComponent\" />\n <template v-else>\n {{ tab.title }}\n </template>\n </button>\n </li>\n <slot name=\"tabs-end\" />\n </ul>\n </div>\n <BTabsTabContent v-if=\"!props.end\" v-bind=\"tabContentProps\">\n <slot />\n <template #empty>\n <slot name=\"empty\" />\n </template>\n </BTabsTabContent>\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n computed,\n nextTick,\n onMounted,\n provide,\n type Ref,\n ref,\n toRef,\n unref,\n type VNode,\n watch,\n} from 'vue'\nimport {BvEvent} from '../../utils/classes'\nimport {useAlignment} from '../../composables/useAlignment'\nimport {useId} from '../../composables/useId'\nimport type {TabType, BTabsProps, BTabsEmits, BTabsSlots} from '../../types'\nimport {tabsInjectionKey} from '../../utils/keys'\nimport {useDefaults} from '../../composables/useDefaults'\nimport {getSafeDocument, sortSlotElementsByPosition} from '../../utils/dom'\nimport {flattenFragments} from '../../utils/flattenFragments'\nimport BTab from './BTab.vue'\nimport BTabsTabContent from '../BTabsTabContent.vue'\n\nconst _props = withDefaults(defineProps<Omit<BTabsProps, 'modelValue' | 'activeIndex'>>(), {\n activeNavItemClass: undefined,\n activeNavLinkClass: undefined,\n activeTabClass: undefined,\n align: undefined,\n card: false,\n contentClass: undefined,\n end: false,\n fill: false,\n id: undefined,\n inactiveNavItemClass: undefined,\n inactiveNavLinkClass: undefined,\n inactiveTabClass: undefined,\n justified: false,\n lazy: false,\n navClass: undefined,\n navItemClass: undefined,\n navWrapperClass: undefined,\n noFade: false,\n noKeyNav: false,\n noNavStyle: false,\n pills: false,\n small: false,\n tag: 'div',\n tabClass: undefined,\n underline: false,\n vertical: false,\n})\nconst props = useDefaults(_props, 'BTabs')\nconst emit = defineEmits<BTabsEmits>()\nconst slots = defineSlots<BTabsSlots>()\n\nconst activeIndex = defineModel<Exclude<BTabsProps['index'], undefined>>('index', {\n default: -1,\n})\nconst activeId = defineModel<BTabsProps['modelValue']>({\n default: undefined,\n})\n\nconst tabsInternal = ref<Ref<TabType>[]>([])\n\nconst tabElementsArray = ref<VNode[]>([])\n\nconst isChildActive = ref(false)\nconst initialIds = ref<string[]>([])\nconst hasExplicitIds = ref(false)\n\nconst updateTabElementsArray = () => {\n const tabElements = flattenFragments(slots.default?.({}) ?? [])\n tabElementsArray.value = (Array.isArray(tabElements) ? tabElements : [tabElements]).filter(\n (tab) => tab.type === BTab\n )\n // only get the ids once in setup context\n if (initialIds.value.length === 0) {\n // we need to get the ids of the tabs before they are registered. After that we use the internalId for the tabpane\n initialIds.value = tabElementsArray.value.map((tab) =>\n unref(useId(() => tab.props?.id, 'tabpane'))\n )\n // Check if any tab has an explicit ID\n hasExplicitIds.value = tabElementsArray.value.some((tab) => tab.props?.id !== undefined)\n }\n isChildActive.value = tabElementsArray.value.some(\n (tab) => tab.props?.active !== undefined && tab.props?.active !== false\n )\n}\nupdateTabElementsArray()\n\nwatch(\n () => slots.default?.({}),\n () => {\n updateTabElementsArray()\n nextTick(() => {\n sortTabs()\n })\n }\n)\n\nconst tabs = computed(() => {\n if (tabsInternal.value.length === 0) {\n // fail back on the slot elements, the children haven't been registered yet\n const _activeIndex = tabElementsArray.value.findIndex(\n (tab) =>\n (tab.props?.active !== undefined &&\n (tab.props.disabled === false || tab.props.disabled === undefined)) ||\n (activeId.value && tab.props?.id === activeId.value)\n )\n return tabElementsArray.value.map((tab, index) => {\n const active =\n _activeIndex !== -1\n ? index === _activeIndex\n : activeIndex.value > -1\n ? index === activeIndex.value\n : index === 0\n return {\n id: tab.props?.id ?? initialIds.value[index],\n internalId: `premount-${index}`, // temporary id for the tab\n buttonId: tab.props?.buttonId,\n disabled: tab.props?.disabled,\n title: tab.props?.title,\n titleComponent: (tab.children as {title: unknown})?.title,\n titleItemClass: tab.props?.titleItemClass,\n titleLinkAttrs: tab.props?.titleLinkAttrs,\n titleLinkClass: tab.props?.titleLinkClass,\n onClick: tab.props?.onClick,\n active,\n navItemClasses: [\n {\n active,\n disabled: !(tab.props?.disabled === false || tab.props?.disabled === undefined),\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n }\n return tabsInternal.value.map((_tab) => {\n const tab = unref(_tab)\n const active = tab.id === activeId.value\n\n return {\n ...tab,\n active,\n navItemClasses: [\n {\n active,\n disabled: tab.disabled,\n },\n active ? props.activeNavItemClass : props.inactiveNavItemClass,\n props.navItemClass,\n ],\n }\n })\n})\n\nlet initialized = false\nlet updateInitialActiveIndex = false\nlet updateInitialActiveId = false\nlet delayedTabSelection = false\n\n// Check if we need to delay tab selection:\n// - We have v-model:index (activeIndex) but no v-model (activeId)\n// - AND tabs don't have explicit IDs (will use generated IDs)\n// - AND we have tabs to select from\nconst needsDelayedSelection =\n activeIndex.value > -1 &&\n !activeId.value &&\n !hasExplicitIds.value &&\n tabElementsArray.value.length > 0\n\nif (needsDelayedSelection) {\n // Delay tab selection until children register with their generated IDs\n delayedTabSelection = true\n updateInitialActiveId = true\n} else if (activeIndex.value === -1 && activeId.value) {\n if (tabs.value.findIndex((t) => t.id === activeId.value) !== -1) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n } else {\n updateInitialActiveIndex = true\n }\n} else if (activeIndex.value > -1 && !activeId.value) {\n if (tabs.value[activeIndex.value]?.id) {\n activeId.value = tabs.value[activeIndex.value]?.id\n } else {\n updateInitialActiveId = true\n }\n} else if (activeIndex.value === -1 && !activeId.value && !isChildActive.value) {\n activeIndex.value = tabs.value.findIndex((t) => t.disabled === undefined || t.disabled === false)\n activeId.value = tabs.value[activeIndex.value]?.id\n} else if (activeIndex.value === -1 && !activeId.value && isChildActive.value) {\n activeIndex.value = tabs.value.findIndex(\n (t) =>\n t.active !== undefined &&\n t.active !== false &&\n (t.disabled === undefined || t.disabled === false)\n )\n activeId.value = tabs.value[activeIndex.value]?.id\n}\n\nfunction updateInitialIndexAndId() {\n // we get the computedIds after registering the tabs\n if (updateInitialActiveIndex) {\n const index = tabs.value.findIndex((t) => t.id === activeId.value)\n if (index !== -1) {\n nextTick(() => {\n activeIndex.value = index\n updateInitialActiveIndex = false\n })\n }\n }\n if (updateInitialActiveId) {\n // Wait for tabs to be registered if we're doing delayed selection\n if (delayedTabSelection && tabsInternal.value.length === 0) {\n // Children haven't registered yet, wait\n return\n }\n if (activeIndex.value > -1 && tabs.value[activeIndex.value]?.id) {\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n updateInitialActiveId = false\n delayedTabSelection = false\n })\n }\n }\n}\n\nupdateInitialIndexAndId()\n\nconst showEmpty = computed(() => !(tabs?.value && tabs.value.length > 0))\n\nconst tabContentProps = computed(() => ({\n contentClass: props.contentClass,\n showEmpty: showEmpty.value,\n card: props.card,\n}))\n\nconst computedClasses = computed(() => ({\n 'd-flex': props.vertical,\n 'align-items-start': props.vertical,\n}))\n\nconst alignment = useAlignment(() => props.align)\n\nconst navTabsClasses = computed(() => ({\n 'nav-pills': props.pills,\n 'nav-underline': props.underline,\n 'flex-column me-3': props.vertical,\n [alignment.value]: props.align !== undefined,\n 'nav-fill': props.fill,\n 'card-header-tabs': props.card && !props.pills && !props.underline,\n 'card-header-pills': props.card && props.pills,\n 'nav-justified': props.justified,\n 'nav-tabs': !props.noNavStyle && !props.pills && !props.underline,\n 'small': props.small,\n}))\n\nconst handleClick = (event: Readonly<MouseEvent>, index: number) => {\n if (\n index >= 0 &&\n !tabs.value[index]?.disabled &&\n tabs.value[index]?.onClick &&\n typeof tabs.value[index].onClick === 'function'\n ) {\n tabs.value[index].onClick?.(event)\n if (event.defaultPrevented) {\n getSafeDocument()?.getElementById(tabs.value[index].buttonId)?.blur()\n return\n }\n }\n activeIndex.value = index\n}\n\nconst keynav = (e: Event, direction: number) => {\n if (tabs.value.length <= 0 || props.noKeyNav) return\n e.preventDefault()\n e.stopPropagation()\n activeIndex.value = nextIndex(activeIndex.value + direction, direction)\n nextTick(() => {\n if (activeIndex.value >= 0) {\n getSafeDocument()?.getElementById(tabs.value[activeIndex.value]?.buttonId)?.focus()\n }\n })\n}\n\nconst nextIndex = (start: number, direction: number) => {\n let index = start\n let minIdx = -1\n let maxIdx = -1\n\n for (let i = 0; i < tabs.value.length; i++) {\n if (!tabs.value[i]?.disabled) {\n if (minIdx === -1) minIdx = i\n maxIdx = i\n }\n }\n\n while (index >= minIdx && index <= maxIdx && tabs.value[index]?.disabled) {\n index += direction\n }\n\n if (index < minIdx) index = minIdx\n if (index > maxIdx) index = maxIdx\n\n return index\n}\n\nlet previousIndex: number | undefined\nlet isReverting = false\nwatch(activeIndex, (newValue, oldValue) => {\n // Early exit if there are no tabs or all tabs are disabled\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n\n // If we're reverting due to a prevented event, don't process further\n if (isReverting) {\n isReverting = false\n return\n }\n // Calculate the next valid index\n const index = nextIndex(newValue, newValue > oldValue ? 1 : -1)\n if (index !== newValue) {\n // If the index is not the same as the new value, set the previous index to the old value\n // this is to prevent the event from being emitted twice\n previousIndex = oldValue\n activeIndex.value = index\n return\n }\n // Emit the activate-tab event\n const tabEvent = new BvEvent('activate-tab', {cancelable: true})\n emit('activate-tab', {\n newTabId: tabs.value[index]?.id,\n prevTabId: tabs.value[previousIndex ?? oldValue]?.id,\n newTabIndex: index,\n prevTabIndex: previousIndex ?? oldValue,\n event: tabEvent,\n })\n // If the event is prevented, revert to the previous index\n if (tabEvent.defaultPrevented) {\n isReverting = true\n const prev = previousIndex ?? oldValue ?? nextIndex(0, 1)\n previousIndex = undefined\n // Update the active id this will also trigger the activeId watch which will update the activeIndex\n // this is to make sure we handle case that starts with id change.\n if (activeId.value !== tabs.value[prev]?.id) {\n activeId.value = tabs.value[prev]?.id\n }\n nextTick(() => {\n if (prev >= 0) {\n getSafeDocument()?.getElementById(tabs.value[prev]?.buttonId)?.focus()\n }\n })\n return\n }\n\n // Update the active id\n if (activeId.value !== tabs.value[index]?.id) {\n activeId.value = tabs.value[index]?.id\n }\n previousIndex = undefined\n})\n\nwatch(activeId, (newValue, oldValue) => {\n if (tabs.value.length <= 0 || tabs.value.filter((t) => !t.disabled).length <= 0) {\n return\n }\n const index = tabs.value.findIndex((t) => t.id === newValue)\n // If the new tab is the same as the current tab, do nothing\n if (index === activeIndex.value) return\n const oldIndex = tabs.value.findIndex((t) => t.id === oldValue)\n // If the new tab is disabled, find the next enabled tab\n if (tabs.value[index]?.disabled) {\n // activeIndex watcher will update the activeId to the next enabled tab\n activeIndex.value = nextIndex(index, index > oldIndex ? 1 : -1)\n return\n }\n // If the new tab is not found, find the first enabled tab\n if (index === -1) {\n // activeIndex watcher will update the activeId to the first enabled tab\n activeIndex.value = nextIndex(0, 1)\n nextTick(() => {\n activeId.value = tabs.value[activeIndex.value]?.id\n })\n return\n }\n // change to the next tab\n activeIndex.value = index\n})\n\nconst registerTab = (tab: Ref<TabType>) => {\n const idx = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n if (idx === -1) {\n tabsInternal.value.push(tab)\n if (initialized) {\n nextTick(() => {\n sortTabs()\n })\n } else {\n // If we're doing delayed tab selection, try to update now that a tab has registered\n if (delayedTabSelection) {\n nextTick(() => {\n updateInitialIndexAndId()\n })\n }\n }\n } else {\n tabsInternal.value[idx] = tab\n if (initialized) {\n // sort just in case the tab was moved\n sortTabs()\n }\n }\n const idx2 = tabsInternal.value.findIndex((t) => t.value.internalId === tab.value.internalId)\n return tab.value.id ?? (!initialized ? initialIds.value[idx2] : tab.value.internalId)\n}\n\nonMounted(() => {\n updateInitialIndexAndId()\n sortTabs()\n initialized = true\n})\n\nconst sortTabs = () => {\n tabsInternal.value.sort((a, b) => sortSlotElementsByPosition(a.value.el.value, b.value.el.value))\n if (\n activeId.value &&\n activeIndex.value !== tabs.value.findIndex((t) => t.id === activeId.value)\n ) {\n activeIndex.value = tabs.value.findIndex((t) => t.id === activeId.value)\n }\n}\n\nconst unregisterTab = (id: string) => {\n tabsInternal.value = tabsInternal.value.filter((t) => t.value.internalId !== id)\n}\n\nprovide(tabsInjectionKey, {\n lazy: toRef(() => props.lazy),\n card: toRef(() => props.card),\n noFade: toRef(() => props.noFade),\n activeTabClass: toRef(() => props.activeTabClass),\n inactiveTabClass: toRef(() => props.inactiveTabClass),\n tabClass: toRef(() => props.tabClass),\n registerTab,\n unregisterTab,\n activeId,\n activateTab: (internalId) => {\n const idx = tabs.value.findIndex((t) => t.internalId === internalId)\n if (internalId === undefined || idx === -1) {\n activeIndex.value = nextIndex(0, 1)\n return\n }\n activeIndex.value = idx\n },\n})\n</script>\n"],"mappings":"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"}
|