bootstrap-vue-next 0.46.1 → 0.46.3
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/{BAutocomplete-DGvKY7-D.js → BAutocomplete-BFbbKtpz.js} +2 -2
- package/dist/{BAutocomplete-DGvKY7-D.js.map → BAutocomplete-BFbbKtpz.js.map} +1 -1
- package/dist/{BFormInput-BwvdFGDu.js → BFormInput-_AkAy6Wk.js} +4 -4
- package/dist/BFormInput-_AkAy6Wk.js.map +1 -0
- package/dist/{BFormOtp-I1t8dqPS.js → BFormOtp-C3vmDnzs.js} +2 -2
- package/dist/{BFormOtp-I1t8dqPS.js.map → BFormOtp-C3vmDnzs.js.map} +1 -1
- package/dist/{BFormSpinbutton-Bt590uT6.js → BFormSpinbutton-fkVMbQC3.js} +4 -2
- package/dist/BFormSpinbutton-fkVMbQC3.js.map +1 -0
- package/dist/{BFormTextarea-DlDe26DL.js → BFormTextarea-CBBlEcrV.js} +4 -4
- package/dist/BFormTextarea-CBBlEcrV.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 +6 -6
- package/dist/composables/useFormInput.d.mts +1 -0
- package/dist/composables/useFormInput.d.ts +1 -0
- package/dist/src/components/BAutocomplete/index.mjs +1 -1
- package/dist/src/components/BFormInput/index.mjs +1 -1
- package/dist/src/components/BFormOtp/index.mjs +1 -1
- package/dist/src/components/BFormSpinbutton/index.mjs +1 -1
- package/dist/src/components/BFormTextarea/index.mjs +1 -1
- package/dist/src/components/BTabs/index.mjs +1 -1
- package/dist/src/components/index.mjs +6 -6
- package/dist/{useFormInput-DZ_3ZH1o.js → useFormInput-C-iXRxog.js} +18 -4
- package/dist/useFormInput-C-iXRxog.js.map +1 -0
- package/package.json +1 -1
- package/dist/BFormInput-BwvdFGDu.js.map +0 -1
- package/dist/BFormSpinbutton-Bt590uT6.js.map +0 -1
- package/dist/BFormTextarea-DlDe26DL.js.map +0 -1
- package/dist/BTabs-BVcu9DPg.js.map +0 -1
- package/dist/useFormInput-DZ_3ZH1o.js.map +0 -1
|
@@ -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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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useFormInput-DZ_3ZH1o.js","names":[],"sources":["../src/utils/normalizeInput.ts","../src/composables/useFormInput.ts"],"sourcesContent":["import type {Numberish} from '../types/CommonTypes'\n\nexport const normalizeInput = (\n v: Numberish | null,\n modelModifiers: Record<'number' | 'lazy' | 'trim', true | undefined>\n) => {\n if (v === null) return\n let update = v\n if (modelModifiers.number && typeof update === 'string' && update !== '') {\n const parsed = Number.parseFloat(update)\n update = Number.isNaN(parsed) ? update : parsed\n }\n return update\n}\n","import type {Numberish} from '../types/CommonTypes'\nimport {computed, inject, nextTick, onActivated, onMounted, type Ref, type ShallowRef} from 'vue'\nimport {useAriaInvalid} from './useAriaInvalid'\nimport {useId} from './useId'\nimport {useFocus, useToNumber} from '@vueuse/core'\nimport type {CommonInputProps} from '../types/FormCommonInputProps'\nimport {formGroupKey} from '../utils/keys'\nimport {useDebounceFn} from '../utils/debounce'\nimport {useStateClass} from './useStateClass'\n\nexport const useFormInput = (\n props: Readonly<CommonInputProps>,\n input:\n | Readonly<ShallowRef<HTMLInputElement | null>>\n | Readonly<ShallowRef<HTMLTextAreaElement | null>>,\n modelValue: Ref<Numberish | null>,\n modelModifiers: Record<'number' | 'lazy' | 'trim', true | undefined>\n) => {\n const computedId = useId(() => props.id, 'input')\n const debounceNumber = useToNumber(() => props.debounce ?? 0, {nanToZero: true})\n const debounceMaxWaitNumber = useToNumber(() => props.debounceMaxWait ?? Number.NaN)\n\n // This automatically adds the appropriate \"for\" attribute to a BFormGroup label\n const formGroupData = inject(formGroupKey, null)?.()\n formGroupData?.track(computedId)\n const computedState = computed(() =>\n props.state !== undefined ? props.state : (formGroupData?.state.value ?? null)\n )\n const isDisabled = computed(() => props.disabled || (formGroupData?.disabled.value ?? false))\n const computedAriaInvalid = useAriaInvalid(() => props.ariaInvalid, computedState)\n const stateClass = useStateClass(computedState)\n\n const internalUpdateModelValue = useDebounceFn(\n (value: Numberish) => {\n modelValue.value = value\n },\n () => (modelModifiers.lazy === true ? 0 : debounceNumber.value),\n {maxWait: () => (modelModifiers.lazy === true ? Number.NaN : debounceMaxWaitNumber.value)}\n )\n\n const updateModelValue = (value: Numberish, force = false, immediate = false) => {\n if (modelModifiers.lazy === true && force === false) return\n if (immediate) {\n modelValue.value = value\n } else {\n internalUpdateModelValue(value)\n }\n }\n\n const {focused} = useFocus(input, {\n initialValue: props.autofocus,\n })\n\n const _formatValue = (value: string, evt: Readonly<Event>, force = false) => {\n if (props.formatter !== undefined && (!props.lazyFormatter || force)) {\n return props.formatter(value, evt)\n }\n return value\n }\n onMounted(() => {\n if (input.value) {\n input.value.value = modelValue.value?.toString() ?? ''\n }\n })\n\n onActivated(() => {\n nextTick(() => {\n if (props.autofocus) {\n focused.value = true\n }\n })\n })\n\n const syncDisplayedValue = (nextValue: string) => {\n if (input.value && input.value.value !== nextValue) {\n input.value.value = nextValue\n }\n }\n\n const onInput = (evt: Readonly<Event>) => {\n const {value} = evt.target as HTMLInputElement\n const formattedValue = _formatValue(value, evt)\n if (evt.defaultPrevented) {\n evt.preventDefault()\n return\n }\n\n const nextModel = formattedValue\n\n updateModelValue(nextModel)\n // If the formatter changed the value, directly update the input's visual value\n // to keep the displayed text in sync with the model. Without this, if the\n // formatted value equals the previous model value, Vue's reactivity won't\n // re-render the input and the raw (unformatted) text remains visible.\n if (formattedValue !== value) {\n syncDisplayedValue(formattedValue)\n }\n }\n\n const onChange = (evt: Readonly<Event>) => {\n const {value} = evt.target as HTMLInputElement\n const formattedValue = _formatValue(value, evt)\n if (evt.defaultPrevented) {\n evt.preventDefault()\n return\n }\n\n const nextModel = formattedValue\n if (modelValue.value !== nextModel) {\n updateModelValue(formattedValue, true)\n }\n }\n\n const onBlur = (evt: Readonly<FocusEvent>) => {\n if (\n !modelModifiers.lazy &&\n !props.lazyFormatter &&\n !modelModifiers.trim &&\n debounceNumber.value <= 0\n )\n return\n\n const {value} = evt.target as HTMLInputElement\n const formattedValue = _formatValue(value, evt, true)\n\n const nextModel = modelModifiers.trim ? formattedValue.trim() : formattedValue\n\n // Cancel before modelValue.value comparison and update\n internalUpdateModelValue.cancel()\n if (modelValue.value !== nextModel) {\n updateModelValue(nextModel, true, true)\n }\n\n // If the formatter or trim changed the displayed text, directly sync the DOM.\n // This handles the case where lazyFormatter defers formatting to blur and the\n // formatted value equals the current model (so Vue's reactivity won't re-render).\n if (nextModel !== value) {\n syncDisplayedValue(nextModel)\n }\n }\n\n const focus = () => {\n if (!isDisabled.value) {\n focused.value = true\n }\n }\n\n const blur = () => {\n if (!isDisabled.value) {\n focused.value = false\n }\n }\n\n return {\n input,\n computedId,\n computedAriaInvalid,\n onInput,\n onChange,\n onBlur,\n focus,\n blur,\n stateClass,\n isDisabled,\n }\n}\n"],"mappings":"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"}
|