@arco-design/web-vue
Version:
Arco Design Vue 2.0: A Vue.js 3 UI Library
186 lines (185 loc) • 5.64 kB
JavaScript
import { defineComponent, toRefs, computed, ref, resolveComponent, openBlock, createElementBlock, normalizeClass, normalizeStyle, renderSlot, createCommentVNode, createBlock, withModifiers, withCtx, createVNode } from "vue";
import { getPrefixCls } from "../_utils/global-config.js";
import IconHover from "../_components/icon-hover.js";
import IconClose from "../icon/icon-close/index.js";
import IconLoading from "../icon/icon-loading/index.js";
import { TAG_COLORS } from "./interface.js";
import { useSize } from "../_hooks/use-size.js";
import _export_sfc from "../_virtual/plugin-vue_export-helper.js";
const _sfc_main = defineComponent({
name: "Tag",
components: {
IconHover,
IconClose,
IconLoading
},
props: {
color: {
type: String
},
size: {
type: String
},
bordered: {
type: Boolean,
default: false
},
visible: {
type: Boolean,
default: void 0
},
defaultVisible: {
type: Boolean,
default: true
},
loading: {
type: Boolean,
default: false
},
closable: {
type: Boolean,
default: false
},
checkable: {
type: Boolean,
default: false
},
checked: {
type: Boolean,
default: void 0
},
defaultChecked: {
type: Boolean,
default: true
},
nowrap: {
type: Boolean,
default: false
}
},
emits: {
"update:visible": (visible) => true,
"update:checked": (checked) => true,
"close": (ev) => true,
"check": (checked, ev) => true
},
setup(props, { emit }) {
const { size } = toRefs(props);
const prefixCls = getPrefixCls("tag");
const isBuiltInColor = computed(
() => props.color && TAG_COLORS.includes(props.color)
);
const isCustomColor = computed(
() => props.color && !TAG_COLORS.includes(props.color)
);
const _visible = ref(props.defaultVisible);
const _checked = ref(props.defaultChecked);
const computedVisible = computed(() => {
var _a;
return (_a = props.visible) != null ? _a : _visible.value;
});
const computedChecked = computed(
() => {
var _a;
return props.checkable ? (_a = props.checked) != null ? _a : _checked.value : true;
}
);
const { mergedSize: _mergedSize } = useSize(size);
const mergedSize = computed(() => {
if (_mergedSize.value === "mini") {
return "small";
}
return _mergedSize.value;
});
const handleClose = (ev) => {
_visible.value = false;
emit("update:visible", false);
emit("close", ev);
};
const handleClick = (ev) => {
if (props.checkable) {
const newChecked = !computedChecked.value;
_checked.value = newChecked;
emit("update:checked", newChecked);
emit("check", newChecked, ev);
}
};
const cls = computed(() => [
prefixCls,
`${prefixCls}-size-${mergedSize.value}`,
{
[`${prefixCls}-loading`]: props.loading,
[`${prefixCls}-hide`]: !computedVisible.value,
[`${prefixCls}-${props.color}`]: isBuiltInColor.value,
[`${prefixCls}-bordered`]: props.bordered,
[`${prefixCls}-checkable`]: props.checkable,
[`${prefixCls}-checked`]: computedChecked.value,
[`${prefixCls}-custom-color`]: isCustomColor.value
}
]);
const style = computed(() => {
if (isCustomColor.value) {
return {
backgroundColor: props.color
};
}
return void 0;
});
return {
prefixCls,
cls,
style,
computedVisible,
computedChecked,
handleClick,
handleClose
};
}
});
function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
const _component_icon_close = resolveComponent("icon-close");
const _component_icon_hover = resolveComponent("icon-hover");
const _component_icon_loading = resolveComponent("icon-loading");
return _ctx.computedVisible ? (openBlock(), createElementBlock("span", {
key: 0,
class: normalizeClass(_ctx.cls),
style: normalizeStyle(_ctx.style),
onClick: _cache[0] || (_cache[0] = (...args) => _ctx.handleClick && _ctx.handleClick(...args))
}, [
_ctx.$slots.icon ? (openBlock(), createElementBlock("span", {
key: 0,
class: normalizeClass(`${_ctx.prefixCls}-icon`)
}, [
renderSlot(_ctx.$slots, "icon")
], 2)) : createCommentVNode("v-if", true),
_ctx.nowrap ? (openBlock(), createElementBlock("span", {
key: 1,
class: normalizeClass(`${_ctx.prefixCls}-text`)
}, [
renderSlot(_ctx.$slots, "default")
], 2)) : renderSlot(_ctx.$slots, "default", { key: 2 }),
_ctx.closable ? (openBlock(), createBlock(_component_icon_hover, {
key: 3,
role: "button",
"aria-label": "Close",
prefix: _ctx.prefixCls,
class: normalizeClass(`${_ctx.prefixCls}-close-btn`),
onClick: withModifiers(_ctx.handleClose, ["stop"])
}, {
default: withCtx(() => [
renderSlot(_ctx.$slots, "close-icon", {}, () => [
createVNode(_component_icon_close)
])
]),
_: 3
}, 8, ["prefix", "class", "onClick"])) : createCommentVNode("v-if", true),
_ctx.loading ? (openBlock(), createElementBlock("span", {
key: 4,
class: normalizeClass(`${_ctx.prefixCls}-loading-icon`)
}, [
createVNode(_component_icon_loading)
], 2)) : createCommentVNode("v-if", true)
], 6)) : createCommentVNode("v-if", true);
}
var _Tag = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
export { _Tag as default };