123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275 |
- 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: IconValue,
- 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.preventDefault();
- 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, _mergeProps({
- "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,
- [`${props.activeClass}`]: props.activeClass && link.isActive?.value
- }, 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,
- "tabindex": isClickable.value ? 0 : undefined,
- "onClick": onClick,
- "onKeydown": isClickable.value && !isLink.value && onKeyDown
- }, link.linkProps), {
- 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",
- "data-testid": "close-chip"
- }, 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
|