UNPKG

bootstrap-vue-next

Version:

Seamless integration of Vue 3, Bootstrap 5, and TypeScript for modern, type-safe UI development

1 lines 19.9 kB
{"version":3,"file":"BLink-DoYZ8dBl.mjs","names":[],"sources":["../src/utils/isLink.ts","../src/composables/useBLinkHelper.ts","../src/composables/useLinkClasses.ts","../src/components/BLink/BLink.vue","../src/components/BLink/BLink.vue"],"sourcesContent":["import type {RouteLocationRaw} from 'vue-router'\n\nexport const isLink = (props: Readonly<{href?: string; to?: RouteLocationRaw}>): boolean =>\n !!(props.href || props.to)\n","import {\n type Component,\n computed,\n getCurrentInstance,\n type MaybeRefOrGetter,\n readonly,\n resolveDynamicComponent,\n toRef,\n toValue,\n} from 'vue'\nimport {isLink} from '../utils/isLink'\nimport {pick} from '../utils/object'\nimport type {RouteLocationRaw, RouterLink} from 'vue-router'\nimport {toPascalCase} from '../utils/stringUtils'\n\nexport const useBLinkHelper = <\n T extends Record<string, unknown>,\n const B extends ReadonlyArray<PropertyKey>,\n>(\n props: MaybeRefOrGetter<T>,\n pickProps?: MaybeRefOrGetter<B | (keyof T)[]>\n) => {\n const pickPropsResolved = readonly(toRef(pickProps))\n const resolvedProps = readonly(toRef(props))\n\n const computedLink = computed(() => isLink(resolvedProps.value))\n const computedLinkProps = computed(() =>\n computedLink.value\n ? pick(\n resolvedProps.value,\n pickPropsResolved.value ?? [\n 'active',\n 'activeClass',\n 'disabled',\n 'exactActiveClass',\n 'href',\n 'icon',\n 'noRel',\n 'opacity',\n 'opacityHover',\n 'noPrefetch',\n 'prefetch',\n 'prefetchOn',\n 'prefetchedClass',\n 'rel',\n 'replace',\n 'routerComponentName',\n 'routerTag',\n 'stretched',\n 'target',\n 'to',\n 'underlineOffset',\n 'underlineOffsetHover',\n 'underlineOpacity',\n 'underlineOpacityHover',\n 'underlineVariant',\n 'variant',\n ]\n )\n : {}\n )\n\n return {computedLink, computedLinkProps}\n}\n\nexport const useBLinkTagResolver = ({\n to,\n disabled,\n href,\n replace,\n routerComponentName,\n}: {\n routerComponentName: MaybeRefOrGetter<string | Component>\n disabled: MaybeRefOrGetter<boolean>\n to: MaybeRefOrGetter<RouteLocationRaw | undefined>\n href: MaybeRefOrGetter<string | undefined>\n replace: MaybeRefOrGetter<boolean>\n}) => {\n // Getting instance\n const instance = getCurrentInstance()\n const router = instance?.appContext?.app?.config?.globalProperties?.$router\n const route = instance?.appContext?.app?.config?.globalProperties?.$route\n\n // resolvedynamiccomponent will return a string if the component is not found\n const RouterLinkComponent = resolveDynamicComponent('RouterLink') as typeof RouterLink | string\n\n // Resolving props\n const resolvedTo = computed(() => toValue(to) || '')\n const resolvedReplace = readonly(toRef(replace))\n\n const routerName = computed(() => {\n const routerComponent = toValue(routerComponentName)\n if (typeof routerComponent === 'string') {\n return toPascalCase(routerComponent)\n }\n return routerComponent\n })\n const useLink = (\n typeof routerName.value !== 'string' && 'useLink' in routerName.value\n ? routerName.value.useLink\n : typeof RouterLinkComponent !== 'string' && 'useLink' in RouterLinkComponent\n ? RouterLinkComponent.useLink\n : null\n ) as (typeof RouterLink)['useLink'] | null\n\n const isNuxtLink = computed(\n // @ts-expect-error we're doing an explicit check for Nuxt, so we can safely ignore this\n () => typeof instance?.appContext?.app?.$nuxt !== 'undefined'\n )\n const isRouterLink = computed(() => routerName.value === 'RouterLink')\n\n const tag = computed(() => {\n // If is disabled or there is no `to` prop, render a simple `<a>` tag\n if (toValue(disabled) || !resolvedTo.value) {\n return 'a'\n }\n\n // Is it actually a component? Use that\n if (typeof routerName.value !== 'string') {\n return routerName.value\n }\n // Check if is router link second\n if (isRouterLink.value && typeof RouterLinkComponent !== 'string') {\n return RouterLinkComponent\n }\n\n // routerName is a string, but we need to check if it's a component first\n // return the component from the app context if it exists, otherwise fallback to 'a'\n return instance?.appContext?.app?.component(routerName.value) || 'a'\n })\n\n const isNonStandardTag = computed(\n () => tag.value !== 'a' && !isRouterLink.value && !isNuxtLink.value\n )\n const isOfRouterType = computed(() => isRouterLink.value || isNuxtLink.value)\n const linkProps = computed(() => ({\n to: resolvedTo.value,\n replace: resolvedReplace.value,\n }))\n\n const _link = useLink?.({\n to: resolvedTo,\n replace: resolvedReplace,\n })\n const link = computed(() => (isOfRouterType.value && toValue(to) ? _link : null))\n\n const computedHref = computed(() => {\n if (link.value?.href.value && resolvedTo.value) return link.value.href.value\n\n const toFallback = '#'\n const resolvedHref = toValue(href)\n if (resolvedHref) return resolvedHref\n\n if (typeof resolvedTo.value === 'string') return resolvedTo.value || toFallback\n\n // Stabilize the `to` prop for the callback functions\n const stableTo = resolvedTo.value\n\n if (stableTo !== undefined && 'path' in stableTo) {\n const path = stableTo.path || ''\n const query = stableTo.query\n ? `?${Object.keys(stableTo.query)\n .map((e) => `${e}=${stableTo.query?.[e]}`)\n .join('=')}`\n : ''\n const hash =\n !stableTo.hash || stableTo.hash.charAt(0) === '#'\n ? stableTo.hash || ''\n : `#${stableTo.hash}`\n return `${path}${query}${hash}` || toFallback\n }\n // There is no resolver for `RouteLocationNamedRaw`. Which, I'm not sure there can be one in this context.\n\n return toFallback\n })\n\n return {\n isNonStandardTag,\n tag,\n isRouterLink,\n isNuxtLink,\n computedHref,\n routerName,\n router,\n route,\n link,\n linkProps,\n }\n}\n","import {computed, type MaybeRefOrGetter, toValue} from 'vue'\nimport type {\n LinkIconProps,\n LinkOpacityProps,\n LinkUnderlineProps,\n LinkVariantProps,\n} from '../types/ComponentProps'\n\nexport const useLinkClasses = (\n linkProps: MaybeRefOrGetter<\n LinkUnderlineProps & LinkOpacityProps & LinkIconProps & LinkVariantProps\n >\n) =>\n computed(() => {\n const props = toValue(linkProps)\n return {\n [`link-${props.variant}`]: props.variant !== null,\n [`link-opacity-${props.opacity}`]: props.opacity !== undefined,\n [`link-opacity-${props.opacityHover}-hover`]: props.opacityHover !== undefined,\n [`link-underline-${props.underlineVariant}`]: props.underlineVariant !== null,\n [`link-offset-${props.underlineOffset}`]: props.underlineOffset !== undefined,\n [`link-offset-${props.underlineOffsetHover}-hover`]: props.underlineOffsetHover !== undefined,\n ['link-underline']:\n props.underlineVariant === null &&\n (props.underlineOpacity !== undefined || props.underlineOpacityHover !== undefined),\n [`link-underline-opacity-${props.underlineOpacity}`]: props.underlineOpacity !== undefined,\n [`link-underline-opacity-${props.underlineOpacityHover}-hover`]:\n props.underlineOpacityHover !== undefined,\n 'icon-link': props.icon === true,\n }\n })\n","<template>\n <component\n :is=\"tag\"\n :class=\"computedClasses\"\n :target=\"props.target\"\n :href=\"computedHref\"\n :rel=\"computedRel\"\n :tabindex=\"computedTabIndex\"\n :aria-disabled=\"props.disabled ? true : null\"\n v-bind=\"computedSpecificProps\"\n @click=\"\n (e: MouseEvent) => {\n clicked(e)\n link?.navigate(e)\n }\n \"\n >\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useLinkClasses} from '../../composables/useLinkClasses'\nimport {collapseInjectionKey, navbarInjectionKey} from '../../utils/keys'\nimport {computed, inject, useAttrs} from 'vue'\nimport {useBLinkTagResolver} from '../../composables/useBLinkHelper'\nimport type {BLinkEmits, BLinkProps, BLinkSlots} from '../../types'\n\nconst defaultActiveClass = 'active'\n\nconst _props = withDefaults(defineProps<BLinkProps>(), {\n active: undefined,\n activeClass: 'router-link-active',\n disabled: false,\n exactActiveClass: 'router-link-exact-active',\n href: undefined,\n icon: false,\n opacity: undefined,\n opacityHover: undefined,\n noPrefetch: undefined,\n prefetchOn: undefined,\n noRel: false,\n prefetchedClass: undefined,\n prefetch: undefined,\n rel: undefined,\n replace: false,\n routerComponentName: 'router-link',\n routerTag: 'a',\n stretched: false,\n target: undefined,\n to: undefined,\n underlineOffset: undefined,\n underlineOffsetHover: undefined,\n underlineOpacity: undefined,\n underlineOpacityHover: undefined,\n underlineVariant: null,\n variant: null,\n})\nconst props = useDefaults(_props, 'BLink')\nconst emit = defineEmits<BLinkEmits>()\ndefineSlots<BLinkSlots>()\nconst attrs = useAttrs()\n\nconst {computedHref, tag, link, isNuxtLink, isRouterLink, linkProps, isNonStandardTag} =\n useBLinkTagResolver({\n routerComponentName: () => props.routerComponentName,\n disabled: () => props.disabled,\n to: () => props.to,\n replace: () => props.replace,\n href: () => props.href,\n })\n\nconst collapseData = inject(collapseInjectionKey, null)\nconst navbarData = inject(navbarInjectionKey, null)\n\n/**\n * Not to be confused with computedLinkClasses\n */\nconst linkValueClasses = useLinkClasses(props)\nconst computedClasses = computed(() => [\n linkValueClasses.value,\n attrs.class,\n computedLinkClasses.value,\n {\n [defaultActiveClass]: props.active,\n [props.activeClass]: link.value?.isActive.value || false,\n [props.exactActiveClass]: link.value?.isExactActive.value || false,\n 'stretched-link': props.stretched,\n },\n])\nconst computedLinkClasses = computed(() => ({\n [defaultActiveClass]: props.active,\n disabled: props.disabled,\n}))\n\nconst clicked = (e: Readonly<MouseEvent>): void => {\n if (props.disabled) {\n e.preventDefault()\n e.stopImmediatePropagation()\n return\n }\n\n if (\n (collapseData?.isNav?.value === true && navbarData === null) ||\n (navbarData !== null && navbarData.noAutoClose?.value !== true)\n ) {\n collapseData?.hide?.()\n }\n\n emit('click', e)\n}\n\nconst computedRel = computed(() =>\n props.target === '_blank' ? (!props.rel && props.noRel ? 'noopener' : props.rel) : undefined\n)\nconst computedTabIndex = computed(() =>\n props.disabled ? '-1' : typeof attrs.tabindex === 'undefined' ? null : attrs.tabindex\n)\n\nconst nuxtSpecificProps = computed(() => ({\n ...(props.noPrefetch ? {noPrefetch: props.noPrefetch} : {prefetch: props.prefetch}),\n prefetchOn: props.prefetchOn,\n prefetchedClass: props.prefetchedClass,\n ...linkProps.value,\n}))\nconst computedSpecificProps = computed(() => ({\n ...(isRouterLink.value ? linkProps.value : undefined),\n // In addition to being Nuxt specific, we add these values if it's some non-standard tag. We don't know what it is,\n // So we just add it anyways. It will be made as an attr if it's unused so it's fine\n ...(isNuxtLink.value || isNonStandardTag.value ? nuxtSpecificProps.value : undefined),\n}))\n</script>\n","<template>\n <component\n :is=\"tag\"\n :class=\"computedClasses\"\n :target=\"props.target\"\n :href=\"computedHref\"\n :rel=\"computedRel\"\n :tabindex=\"computedTabIndex\"\n :aria-disabled=\"props.disabled ? true : null\"\n v-bind=\"computedSpecificProps\"\n @click=\"\n (e: MouseEvent) => {\n clicked(e)\n link?.navigate(e)\n }\n \"\n >\n <slot />\n </component>\n</template>\n\n<script setup lang=\"ts\">\nimport {useDefaults} from '../../composables/useDefaults'\nimport {useLinkClasses} from '../../composables/useLinkClasses'\nimport {collapseInjectionKey, navbarInjectionKey} from '../../utils/keys'\nimport {computed, inject, useAttrs} from 'vue'\nimport {useBLinkTagResolver} from '../../composables/useBLinkHelper'\nimport type {BLinkEmits, BLinkProps, BLinkSlots} from '../../types'\n\nconst defaultActiveClass = 'active'\n\nconst _props = withDefaults(defineProps<BLinkProps>(), {\n active: undefined,\n activeClass: 'router-link-active',\n disabled: false,\n exactActiveClass: 'router-link-exact-active',\n href: undefined,\n icon: false,\n opacity: undefined,\n opacityHover: undefined,\n noPrefetch: undefined,\n prefetchOn: undefined,\n noRel: false,\n prefetchedClass: undefined,\n prefetch: undefined,\n rel: undefined,\n replace: false,\n routerComponentName: 'router-link',\n routerTag: 'a',\n stretched: false,\n target: undefined,\n to: undefined,\n underlineOffset: undefined,\n underlineOffsetHover: undefined,\n underlineOpacity: undefined,\n underlineOpacityHover: undefined,\n underlineVariant: null,\n variant: null,\n})\nconst props = useDefaults(_props, 'BLink')\nconst emit = defineEmits<BLinkEmits>()\ndefineSlots<BLinkSlots>()\nconst attrs = useAttrs()\n\nconst {computedHref, tag, link, isNuxtLink, isRouterLink, linkProps, isNonStandardTag} =\n useBLinkTagResolver({\n routerComponentName: () => props.routerComponentName,\n disabled: () => props.disabled,\n to: () => props.to,\n replace: () => props.replace,\n href: () => props.href,\n })\n\nconst collapseData = inject(collapseInjectionKey, null)\nconst navbarData = inject(navbarInjectionKey, null)\n\n/**\n * Not to be confused with computedLinkClasses\n */\nconst linkValueClasses = useLinkClasses(props)\nconst computedClasses = computed(() => [\n linkValueClasses.value,\n attrs.class,\n computedLinkClasses.value,\n {\n [defaultActiveClass]: props.active,\n [props.activeClass]: link.value?.isActive.value || false,\n [props.exactActiveClass]: link.value?.isExactActive.value || false,\n 'stretched-link': props.stretched,\n },\n])\nconst computedLinkClasses = computed(() => ({\n [defaultActiveClass]: props.active,\n disabled: props.disabled,\n}))\n\nconst clicked = (e: Readonly<MouseEvent>): void => {\n if (props.disabled) {\n e.preventDefault()\n e.stopImmediatePropagation()\n return\n }\n\n if (\n (collapseData?.isNav?.value === true && navbarData === null) ||\n (navbarData !== null && navbarData.noAutoClose?.value !== true)\n ) {\n collapseData?.hide?.()\n }\n\n emit('click', e)\n}\n\nconst computedRel = computed(() =>\n props.target === '_blank' ? (!props.rel && props.noRel ? 'noopener' : props.rel) : undefined\n)\nconst computedTabIndex = computed(() =>\n props.disabled ? '-1' : typeof attrs.tabindex === 'undefined' ? null : attrs.tabindex\n)\n\nconst nuxtSpecificProps = computed(() => ({\n ...(props.noPrefetch ? {noPrefetch: props.noPrefetch} : {prefetch: props.prefetch}),\n prefetchOn: props.prefetchOn,\n prefetchedClass: props.prefetchedClass,\n ...linkProps.value,\n}))\nconst computedSpecificProps = computed(() => ({\n ...(isRouterLink.value ? linkProps.value : undefined),\n // In addition to being Nuxt specific, we add these values if it's some non-standard tag. We don't know what it is,\n // So we just add it anyways. It will be made as an attr if it's unused so it's fine\n ...(isNuxtLink.value || isNonStandardTag.value ? nuxtSpecificProps.value : undefined),\n}))\n</script>\n"],"mappings":"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"}