@wfrog/vc
Version:
`自用` 的基于 `element-plus` 二次封装的 `vue3` 组件库。追求在业务场景中,尽可能使用更少的代码量来实现需求。 因此在组件封装上,以 `方便` 为主,打包仅 `esm` 模式。
323 lines (312 loc) • 14.4 kB
JavaScript
import './index.css'
// vue-script:D:\project\_my\vc\src\components\image\index.vue?type=script
import { defineComponent as _defineComponent2 } from "vue";
import { unref as _unref2, createCommentVNode as _createCommentVNode2, normalizeClass as _normalizeClass3, createVNode as _createVNode, withCtx as _withCtx3, openBlock as _openBlock3, createBlock as _createBlock3, renderSlot as _renderSlot2, toDisplayString as _toDisplayString2, createTextVNode as _createTextVNode2, createElementVNode as _createElementVNode2, createElementBlock as _createElementBlock2, normalizeStyle as _normalizeStyle2, Fragment as _Fragment } from "vue";
import { computed as computed2, ref as ref2, useSlots } from "vue";
import { ElImage, ElTooltip as ElTooltip2 } from "element-plus";
import { defaultWindow } from "@wfrog/utils";
// vue-script:D:\project\_my\vc\src\components\el-icon\index.vue?type=script
import { defineComponent } from "vue";
import { ElIcon } from "element-plus";
import * as Icons from "@element-plus/icons-vue";
var el_icon_default = defineComponent({
components: { ...Icons, ElIcon },
props: {
name: { type: String, required: true },
color: { type: String, default: "" },
size: { type: [Number, String], default: "" }
}
});
// vue-template:D:\project\_my\vc\src\components\el-icon\index.vue?type=template
import { resolveDynamicComponent as _resolveDynamicComponent, openBlock as _openBlock, createBlock as _createBlock, resolveComponent as _resolveComponent, normalizeClass as _normalizeClass, withCtx as _withCtx } from "vue";
function render(_ctx, _cache) {
const _component_ElIcon = _resolveComponent("ElIcon");
return _openBlock(), _createBlock(_component_ElIcon, {
size: _ctx.size,
color: _ctx.color,
class: _normalizeClass(_ctx.$style.icon)
}, {
default: _withCtx(() => [
(_openBlock(), _createBlock(_resolveDynamicComponent(_ctx.name)))
]),
_: 1
}, 8, ["size", "color", "class"]);
}
// vue-style:D:\project\_my\vc\src\components\el-icon\index.vue?type=style&index=0&isModule=true&isNameImport=true
var el_icon_default2 = { icon: "_icon_1iurh_1" };
// src/components/el-icon/index.vue
el_icon_default.render = render;
var cssModules = {};
el_icon_default.__cssModules = cssModules = {};
cssModules["$style"] = el_icon_default2;
var el_icon_default3 = el_icon_default;
// vue-script:D:\project\_my\vc\src\components\text-ellipsis\index.vue?type=script
import { defineComponent as _defineComponent } from "vue";
import { unref as _unref, createCommentVNode as _createCommentVNode, renderSlot as _renderSlot, toDisplayString as _toDisplayString, createTextVNode as _createTextVNode, normalizeClass as _normalizeClass2, normalizeStyle as _normalizeStyle, createElementVNode as _createElementVNode, withCtx as _withCtx2, openBlock as _openBlock2, createBlock as _createBlock2, createElementBlock as _createElementBlock } from "vue";
import { ElTooltip } from "element-plus";
import { computed, nextTick, onMounted, ref, watch } from "vue";
var text_ellipsis_default = /* @__PURE__ */ _defineComponent({
__name: "index",
props: {
type: { type: String, default: "single" },
effect: { type: String, default: "dark" },
placement: { type: String, default: "top" },
content: { type: String, default: "" },
popperOptions: { type: Object, default: () => ({ boundariesElement: "body", gpuAcceleration: false }) },
popperClass: { type: String, default: "" },
enterable: { type: Boolean, default: true },
maxWidth: { type: Number, default: 0 },
showTooltip: { type: Boolean, default: true }
},
setup(__props, { expose }) {
const props = __props;
const tipsVisible = ref(false);
const textVisible = ref(false);
const realWidth = ref(0);
const eleMain = ref();
const eleText = ref();
const eleEllipsis = ref();
const mainStyle = computed(() => props.maxWidth ? { width: `${props.maxWidth}px` } : {});
const fixStyle = computed(() => ({ width: `${realWidth.value}px` }));
const isOverflow = () => new Promise((resolve) => {
tipsVisible.value = true;
textVisible.value = true;
nextTick(() => {
if (eleText.value && eleEllipsis.value) {
const originWidth = eleText.value?.offsetWidth;
const ellipsisWidth = props.maxWidth || eleEllipsis.value?.offsetWidth;
resolve(originWidth > ellipsisWidth);
} else {
resolve(false);
}
});
});
const update = async () => {
const isOverflowX = await isOverflow();
tipsVisible.value = isOverflowX;
textVisible.value = !isOverflowX;
realWidth.value = eleMain.value?.clientWidth || 0;
};
const watchData = computed(() => `${props.content}${props.maxWidth}${props.popperClass}`);
watch(watchData, () => update(), { immediate: true });
watch(realWidth, () => update());
onMounted(() => nextTick(() => update()));
expose({ tipsVisible });
return (_ctx, _cache) => {
return _openBlock2(), _createElementBlock("div", {
ref_key: "eleMain",
ref: eleMain,
class: _normalizeClass2(_ctx.$style.main),
style: _normalizeStyle(_unref(mainStyle))
}, [
_createCommentVNode(" \u663E\u793Atooltip\u5E76\u4E14tips\u53EF\u89C1\uFF0C\u4E0D\u7528disable\u53EF\u4EE5\u907F\u514D\u6E32\u67D3tooltip "),
tipsVisible.value && __props.showTooltip ? (_openBlock2(), _createBlock2(_unref(ElTooltip), {
key: 0,
effect: __props.effect,
placement: __props.placement,
"popper-class": __props.popperClass,
"popper-options": __props.popperOptions,
enterable: __props.enterable
}, {
content: _withCtx2(() => [
_renderSlot(_ctx.$slots, "default", {}, () => [
_createTextVNode(_toDisplayString(__props.content), 1)
])
]),
default: _withCtx2(() => [
_createElementVNode("div", {
ref_key: "eleEllipsis",
ref: eleEllipsis,
class: _normalizeClass2(_ctx.$style.ellipsis),
style: _normalizeStyle(_unref(fixStyle))
}, [
_renderSlot(_ctx.$slots, "default", {}, () => [
_createTextVNode(_toDisplayString(__props.content), 1)
])
], 6)
]),
_: 3
}, 8, ["effect", "placement", "popper-class", "popper-options", "enterable"])) : _createCommentVNode("v-if", true),
_createCommentVNode(" \u663E\u793Atooltip\u5E76\u4E14tips\u4E0D\u53EF\u89C1\uFF0C\u4EC5\u663E\u793A\u6587\u6848 "),
tipsVisible.value && !__props.showTooltip ? (_openBlock2(), _createElementBlock("div", {
key: 1,
ref_key: "eleEllipsis",
ref: eleEllipsis,
class: _normalizeClass2(_ctx.$style.ellipsis),
style: _normalizeStyle(_unref(fixStyle))
}, [
_renderSlot(_ctx.$slots, "default", {}, () => [
_createTextVNode(_toDisplayString(__props.content), 1)
])
], 6)) : _createCommentVNode("v-if", true),
textVisible.value ? (_openBlock2(), _createElementBlock("div", {
key: 2,
ref_key: "eleText",
ref: eleText,
class: _normalizeClass2(_ctx.$style.text)
}, [
_renderSlot(_ctx.$slots, "default", {}, () => [
_createTextVNode(_toDisplayString(__props.content), 1)
])
], 2)) : _createCommentVNode("v-if", true)
], 6);
};
}
});
// vue-style:D:\project\_my\vc\src\components\text-ellipsis\index.vue?type=style&index=0&isModule=true&isNameImport=true
var text_ellipsis_default2 = { main: "_main_eqh40_1", ellipsis: "_ellipsis_eqh40_7", text: "_text_eqh40_13" };
// src/components/text-ellipsis/index.vue
var cssModules2 = {};
text_ellipsis_default.__cssModules = cssModules2 = {};
cssModules2["$style"] = text_ellipsis_default2;
var text_ellipsis_default3 = text_ellipsis_default;
// vue-script:D:\project\_my\vc\src\components\image\index.vue?type=script
var image_default = /* @__PURE__ */ _defineComponent2({
__name: "index",
props: {
type: { type: String, default: "image" },
text: { type: String, default: "" },
src: { type: String, default: "" },
previewSrcList: { type: Array, default: () => [] },
width: { type: String, default: "160px" },
height: { type: String, default: "90px" },
fit: { type: String, default: "cover" },
textMaxWidth: { type: Number, default: 0 },
showTooltip: { type: Boolean, default: true },
effect: { type: String, default: "dark" },
placement: { type: String, default: "top" },
popperClass: { type: String, default: "" },
enterable: { type: Boolean, default: true }
},
setup(__props) {
const props = __props;
const slots = useSlots();
const fixWidth = 5;
const eleText = ref2();
const eleTextWrapper = ref2();
const eleEllipsis = ref2();
const isImageType = computed2(() => props.type === "image");
const isTextType = computed2(() => props.type === "text");
const mySrc = computed2(() => {
if (!defaultWindow) {
return "";
}
if (props.type === "text" && eleText.value) {
const canvas = document.createElement("canvas");
canvas.width = eleText.value.offsetWidth + fixWidth;
canvas.height = parseInt(defaultWindow.getComputedStyle(eleText.value).lineHeight, 10);
return canvas.toDataURL("image/png");
}
return props.src || props.previewSrcList[0];
});
const myMaxWidth = computed2(() => props.textMaxWidth || eleTextWrapper.value?.offsetWidth || 0);
const imageStyle = computed2(() => {
if (isImageType.value) {
return {
width: props.width,
height: props.height
};
}
return {};
});
const combineText = computed2(() => {
if (!isTextType.value) {
return "";
}
let slotText = "";
if (slots.default) {
const [slot] = slots.default();
slotText = slot.children?.toString() || "";
}
return props.text || slotText;
});
const mySrcList = computed2(() => props.previewSrcList.length === 0 ? [props.src] : props.previewSrcList);
const tipsVisible = computed2(() => eleEllipsis.value?.tipsVisible ?? false);
return (_ctx, _cache) => {
return _openBlock3(), _createElementBlock2(_Fragment, null, [
_unref2(isTextType) ? (_openBlock3(), _createElementBlock2("div", {
key: 0,
ref_key: "eleTextWrapper",
ref: eleTextWrapper,
class: _normalizeClass3(_ctx.$style["text-wrapper"])
}, [
_createCommentVNode2(" \u6709tooltip\u4E14\u5F00\u542Ftooltip\u5219\u6E32\u67D3\uFF0C\u4E0D\u7528disable\u53EF\u4EE5\u907F\u514D\u6E32\u67D3tooltip "),
_createCommentVNode2(" \u8FD9\u91CC\u4F3C\u4E4E\u6709bug\uFF0C\u5728table\u4E0B\u4F1A\u88AB\u6E32\u67D3\u4E24\u6B21tooltip "),
_unref2(tipsVisible) && __props.showTooltip ? (_openBlock3(), _createBlock3(_unref2(ElTooltip2), {
key: 0,
effect: __props.effect,
placement: __props.placement,
"popper-class": __props.popperClass,
enterable: __props.enterable,
content: _unref2(combineText)
}, {
default: _withCtx3(() => [
_createVNode(_unref2(ElImage), {
src: _unref2(mySrc),
"preview-src-list": _unref2(mySrcList),
class: _normalizeClass3(_ctx.$style.image),
lazy: "",
"preview-teleported": ""
}, null, 8, ["src", "preview-src-list", "class"])
]),
_: 1
}, 8, ["effect", "placement", "popper-class", "enterable", "content"])) : _createCommentVNode2("v-if", true),
_createCommentVNode2(" \u65E0tooltip\u6216\u8005\u5173\u95EDtooltip\u5219\u76F4\u63A5\u6E32\u67D3 "),
!_unref2(tipsVisible) || !__props.showTooltip ? (_openBlock3(), _createBlock3(_unref2(ElImage), {
key: 1,
src: _unref2(mySrc),
"preview-src-list": _unref2(mySrcList),
class: _normalizeClass3(_ctx.$style.image),
lazy: "",
"preview-teleported": ""
}, null, 8, ["src", "preview-src-list", "class"])) : _createCommentVNode2("v-if", true),
_createCommentVNode2(" \u8FD9\u91CC\u6E32\u67D3\u6587\u5B57 "),
_createElementVNode2("span", {
ref_key: "eleText",
ref: eleText,
class: _normalizeClass3(_ctx.$style.text)
}, [
_createVNode(el_icon_default3, {
name: "Picture",
class: _normalizeClass3(_ctx.$style.icon)
}, null, 8, ["class"]),
_createVNode(text_ellipsis_default3, {
ref_key: "eleEllipsis",
ref: eleEllipsis,
placement: "top-start",
"max-width": _unref2(myMaxWidth),
"show-tooltip": false
}, {
default: _withCtx3(() => [
_renderSlot2(_ctx.$slots, "default", {}, () => [
_createTextVNode2(_toDisplayString2(__props.text), 1)
])
]),
_: 3
}, 8, ["max-width"])
], 2)
], 2)) : _createCommentVNode2("v-if", true),
_unref2(isImageType) ? (_openBlock3(), _createBlock3(_unref2(ElImage), {
key: 1,
src: _unref2(mySrc),
"preview-src-list": _unref2(mySrcList),
style: _normalizeStyle2(_unref2(imageStyle)),
fit: __props.fit,
class: _normalizeClass3(_ctx.$style["image-wrapper"]),
lazy: "",
"preview-teleported": ""
}, null, 8, ["src", "preview-src-list", "style", "fit", "class"])) : _createCommentVNode2("v-if", true)
], 64);
};
}
});
// vue-style:D:\project\_my\vc\src\components\image\index.vue?type=style&index=0&isModule=true&isNameImport=true
var image_default2 = { "text-wrapper": "_text-wrapper_1toev_1", image: "_image_1toev_4", text: "_text_1toev_1", icon: "_icon_1toev_12", "image-wrapper": "_image-wrapper_1toev_18" };
// src/components/image/index.vue
var cssModules3 = {};
image_default.__cssModules = cssModules3 = {};
cssModules3["$style"] = image_default2;
var image_default3 = image_default;
export {
image_default3 as default
};