UNPKG

@arco-design/web-vue

Version:

Arco Design Vue 2.0: A Vue.js 3 UI Library

193 lines (192 loc) 5.97 kB
import { defineComponent, toRefs, computed, ref, inject, 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 { configProviderInjectionKey } from "../config-provider/context.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 configCtx = inject(configProviderInjectionKey, void 0); const rtl = computed(() => { var _a; return (_a = configCtx == null ? void 0 : configCtx.rtl) != null ? _a : false; }); 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, [`${prefixCls}-rtl`]: rtl.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 };