import { mergeProps as _mergeProps, Fragment as _Fragment, withDirectives as _withDirectives, vShow as _vShow, resolveDirective as _resolveDirective, createVNode as _createVNode } from "vue"; /* eslint-disable complexity */ // Styles import "./VChip.css"; // Components import { VExpandXTransition } from "../transitions/index.mjs"; import { VAvatar } from "../VAvatar/index.mjs"; import { VChipGroupSymbol } from "../VChipGroup/VChipGroup.mjs"; import { VDefaultsProvider } from "../VDefaultsProvider/index.mjs"; import { VIcon } from "../VIcon/index.mjs"; // Composables import { makeBorderProps, useBorder } from "../../composables/border.mjs"; import { makeComponentProps } from "../../composables/component.mjs"; import { makeDensityProps, useDensity } from "../../composables/density.mjs"; import { makeElevationProps, useElevation } from "../../composables/elevation.mjs"; import { makeGroupItemProps, useGroupItem } from "../../composables/group.mjs"; import { IconValue } from "../../composables/icons.mjs"; import { useLocale } from "../../composables/locale.mjs"; import { useProxiedModel } from "../../composables/proxiedModel.mjs"; import { makeRoundedProps, useRounded } from "../../composables/rounded.mjs"; import { makeRouterProps, useLink } from "../../composables/router.mjs"; import { makeSizeProps, useSize } from "../../composables/size.mjs"; import { makeTagProps } from "../../composables/tag.mjs"; import { makeThemeProps, provideTheme } from "../../composables/theme.mjs"; import { genOverlays, makeVariantProps, useVariant } from "../../composables/variant.mjs"; // Directives import { Ripple } from "../../directives/ripple/index.mjs"; // Utilities import { computed } from 'vue'; import { EventProp, genericComponent, propsFactory } from "../../util/index.mjs"; // Types export const makeVChipProps = propsFactory({ activeClass: String, appendAvatar: String, appendIcon: IconValue, closable: Boolean, closeIcon: { type: IconValue, default: '$delete' }, closeLabel: { type: String, default: '$vuetify.close' }, draggable: Boolean, filter: Boolean, filterIcon: { type: String, default: '$complete' }, label: Boolean, link: { type: Boolean, default: undefined }, pill: Boolean, prependAvatar: String, prependIcon: IconValue, ripple: { type: [Boolean, Object], default: true }, text: String, modelValue: { type: Boolean, default: true }, onClick: EventProp(), onClickOnce: EventProp(), ...makeBorderProps(), ...makeComponentProps(), ...makeDensityProps(), ...makeElevationProps(), ...makeGroupItemProps(), ...makeRoundedProps(), ...makeRouterProps(), ...makeSizeProps(), ...makeTagProps({ tag: 'span' }), ...makeThemeProps(), ...makeVariantProps({ variant: 'tonal' }) }, 'VChip'); export const VChip = genericComponent()({ name: 'VChip', directives: { Ripple }, props: makeVChipProps(), emits: { 'click:close': e => true, 'update:modelValue': value => true, 'group:selected': val => true, click: e => true }, setup(props, _ref) { let { attrs, emit, slots } = _ref; const { t } = useLocale(); const { borderClasses } = useBorder(props); const { colorClasses, colorStyles, variantClasses } = useVariant(props); const { densityClasses } = useDensity(props); const { elevationClasses } = useElevation(props); const { roundedClasses } = useRounded(props); const { sizeClasses } = useSize(props); const { themeClasses } = provideTheme(props); const isActive = useProxiedModel(props, 'modelValue'); const group = useGroupItem(props, VChipGroupSymbol, false); const link = useLink(props, attrs); const isLink = computed(() => props.link !== false && link.isLink.value); const isClickable = computed(() => !props.disabled && props.link !== false && (!!group || props.link || link.isClickable.value)); const closeProps = computed(() => ({ 'aria-label': t(props.closeLabel), onClick(e) { e.stopPropagation(); isActive.value = false; emit('click:close', e); } })); function onClick(e) { emit('click', e); if (!isClickable.value) return; link.navigate?.(e); group?.toggle(); } function onKeyDown(e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick(e); } } return () => { const Tag = link.isLink.value ? 'a' : props.tag; const hasAppendMedia = !!(props.appendIcon || props.appendAvatar); const hasAppend = !!(hasAppendMedia || slots.append); const hasClose = !!(slots.close || props.closable); const hasFilter = !!(slots.filter || props.filter) && group; const hasPrependMedia = !!(props.prependIcon || props.prependAvatar); const hasPrepend = !!(hasPrependMedia || slots.prepend); const hasColor = !group || group.isSelected.value; return isActive.value && _withDirectives(_createVNode(Tag, { "class": ['v-chip', { 'v-chip--disabled': props.disabled, 'v-chip--label': props.label, 'v-chip--link': isClickable.value, 'v-chip--filter': hasFilter, 'v-chip--pill': props.pill }, themeClasses.value, borderClasses.value, hasColor ? colorClasses.value : undefined, densityClasses.value, elevationClasses.value, roundedClasses.value, sizeClasses.value, variantClasses.value, group?.selectedClass.value, props.class], "style": [hasColor ? colorStyles.value : undefined, props.style], "disabled": props.disabled || undefined, "draggable": props.draggable, "href": link.href.value, "tabindex": isClickable.value ? 0 : undefined, "onClick": onClick, "onKeydown": isClickable.value && !isLink.value && onKeyDown }, { default: () => [genOverlays(isClickable.value, 'v-chip'), hasFilter && _createVNode(VExpandXTransition, { "key": "filter" }, { default: () => [_withDirectives(_createVNode("div", { "class": "v-chip__filter" }, [!slots.filter ? _createVNode(VIcon, { "key": "filter-icon", "icon": props.filterIcon }, null) : _createVNode(VDefaultsProvider, { "key": "filter-defaults", "disabled": !props.filterIcon, "defaults": { VIcon: { icon: props.filterIcon } } }, slots.filter)]), [[_vShow, group.isSelected.value]])] }), hasPrepend && _createVNode("div", { "key": "prepend", "class": "v-chip__prepend" }, [!slots.prepend ? _createVNode(_Fragment, null, [props.prependIcon && _createVNode(VIcon, { "key": "prepend-icon", "icon": props.prependIcon, "start": true }, null), props.prependAvatar && _createVNode(VAvatar, { "key": "prepend-avatar", "image": props.prependAvatar, "start": true }, null)]) : _createVNode(VDefaultsProvider, { "key": "prepend-defaults", "disabled": !hasPrependMedia, "defaults": { VAvatar: { image: props.prependAvatar, start: true }, VIcon: { icon: props.prependIcon, start: true } } }, slots.prepend)]), _createVNode("div", { "class": "v-chip__content", "data-no-activator": "" }, [slots.default?.({ isSelected: group?.isSelected.value, selectedClass: group?.selectedClass.value, select: group?.select, toggle: group?.toggle, value: group?.value.value, disabled: props.disabled }) ?? props.text]), hasAppend && _createVNode("div", { "key": "append", "class": "v-chip__append" }, [!slots.append ? _createVNode(_Fragment, null, [props.appendIcon && _createVNode(VIcon, { "key": "append-icon", "end": true, "icon": props.appendIcon }, null), props.appendAvatar && _createVNode(VAvatar, { "key": "append-avatar", "end": true, "image": props.appendAvatar }, null)]) : _createVNode(VDefaultsProvider, { "key": "append-defaults", "disabled": !hasAppendMedia, "defaults": { VAvatar: { end: true, image: props.appendAvatar }, VIcon: { end: true, icon: props.appendIcon } } }, slots.append)]), hasClose && _createVNode("button", _mergeProps({ "key": "close", "class": "v-chip__close", "type": "button" }, closeProps.value), [!slots.close ? _createVNode(VIcon, { "key": "close-icon", "icon": props.closeIcon, "size": "x-small" }, null) : _createVNode(VDefaultsProvider, { "key": "close-defaults", "defaults": { VIcon: { icon: props.closeIcon, size: 'x-small' } } }, slots.close)])] }), [[_resolveDirective("ripple"), isClickable.value && props.ripple, null]]); }; } }); //# sourceMappingURL=VChip.mjs.map