mldong-flow-designer-plus
Version:
本项目包含了作者为B站课堂视频[《工作流设计器开发最佳实践》](https://www.bilibili.com/cheese/play/ss24484)的过程源码。教程中开发的组件也可用于实际生产环境中。以下是和使用文档和课程章节说明。 ## 实战项目 [演示地址](https://flow-pro.mldong.com/)
1,123 lines (1,122 loc) • 34.6 kB
JavaScript
import { g as genComponentStyleHook, o as objectType, K as findDOMNode, u as useConfigInject, c as classNames, P as PropTypes, A as eventType, _ as _extends, m as merge, M as genFocusStyle, p as useToken, D as flattenChildren, C as useInjectDisabled, b as _objectSpread2 } from "./index-DMN4aeBG.js";
import { defineComponent, shallowRef, onMounted, onBeforeUnmount, createVNode, Transition, render, getCurrentInstance, computed, watch, nextTick, reactive, watchEffect, onUpdated, Text } from "vue";
import { i as isVisible } from "./isVisible-syGnHoil.js";
import { u as useState, g as genCompactItemStyle } from "./compact-item-D3gx52qf.js";
import { w as wrapperRaf, i as initDefaultProps } from "./raf-CdH7hL42.js";
import { d as devWarning, c as createContext } from "./createContext-DWMub_ig.js";
import { L as LoadingOutlined } from "./LoadingOutlined-Cy6fW-HN.js";
import { u as useCompactItemContext } from "./Compact--Cq-knDy.js";
const genWaveStyle = (token) => {
const {
componentCls,
colorPrimary
} = token;
return {
[componentCls]: {
position: "absolute",
background: "transparent",
pointerEvents: "none",
boxSizing: "border-box",
color: `var(--wave-color, ${colorPrimary})`,
boxShadow: `0 0 0 0 currentcolor`,
opacity: 0.2,
// =================== Motion ===================
"&.wave-motion-appear": {
transition: [`box-shadow 0.4s ${token.motionEaseOutCirc}`, `opacity 2s ${token.motionEaseOutCirc}`].join(","),
"&-active": {
boxShadow: `0 0 0 6px currentcolor`,
opacity: 0
}
}
}
};
};
const useStyle$1 = genComponentStyleHook("Wave", (token) => [genWaveStyle(token)]);
function isNotGrey(color) {
const match = (color || "").match(/rgba?\((\d*), (\d*), (\d*)(, [\d.]*)?\)/);
if (match && match[1] && match[2] && match[3]) {
return !(match[1] === match[2] && match[2] === match[3]);
}
return true;
}
function isValidWaveColor(color) {
return color && color !== "#fff" && color !== "#ffffff" && color !== "rgb(255, 255, 255)" && color !== "rgba(255, 255, 255, 1)" && isNotGrey(color) && !/rgba\((?:\d*, ){3}0\)/.test(color) && // any transparent rgba color
color !== "transparent";
}
function getTargetWaveColor(node) {
const {
borderTopColor,
borderColor,
backgroundColor
} = getComputedStyle(node);
if (isValidWaveColor(borderTopColor)) {
return borderTopColor;
}
if (isValidWaveColor(borderColor)) {
return borderColor;
}
if (isValidWaveColor(backgroundColor)) {
return backgroundColor;
}
return null;
}
function validateNum(value) {
return Number.isNaN(value) ? 0 : value;
}
const WaveEffect = defineComponent({
props: {
target: objectType(),
className: String
},
setup(props) {
const divRef = shallowRef(null);
const [color, setWaveColor] = useState(null);
const [borderRadius, setBorderRadius] = useState([]);
const [left, setLeft] = useState(0);
const [top, setTop] = useState(0);
const [width, setWidth] = useState(0);
const [height, setHeight] = useState(0);
const [enabled, setEnabled] = useState(false);
function syncPos() {
const {
target
} = props;
const nodeStyle = getComputedStyle(target);
setWaveColor(getTargetWaveColor(target));
const isStatic = nodeStyle.position === "static";
const {
borderLeftWidth,
borderTopWidth
} = nodeStyle;
setLeft(isStatic ? target.offsetLeft : validateNum(-parseFloat(borderLeftWidth)));
setTop(isStatic ? target.offsetTop : validateNum(-parseFloat(borderTopWidth)));
setWidth(target.offsetWidth);
setHeight(target.offsetHeight);
const {
borderTopLeftRadius,
borderTopRightRadius,
borderBottomLeftRadius,
borderBottomRightRadius
} = nodeStyle;
setBorderRadius([borderTopLeftRadius, borderTopRightRadius, borderBottomRightRadius, borderBottomLeftRadius].map((radius) => validateNum(parseFloat(radius))));
}
let resizeObserver;
let rafId;
let timeoutId;
const clear = () => {
clearTimeout(timeoutId);
wrapperRaf.cancel(rafId);
resizeObserver === null || resizeObserver === void 0 ? void 0 : resizeObserver.disconnect();
};
const removeDom = () => {
var _a;
const holder = (_a = divRef.value) === null || _a === void 0 ? void 0 : _a.parentElement;
if (holder) {
render(null, holder);
if (holder.parentElement) {
holder.parentElement.removeChild(holder);
}
}
};
onMounted(() => {
clear();
timeoutId = setTimeout(() => {
removeDom();
}, 5e3);
const {
target
} = props;
if (target) {
rafId = wrapperRaf(() => {
syncPos();
setEnabled(true);
});
if (typeof ResizeObserver !== "undefined") {
resizeObserver = new ResizeObserver(syncPos);
resizeObserver.observe(target);
}
}
});
onBeforeUnmount(() => {
clear();
});
const onTransitionend = (e) => {
if (e.propertyName === "opacity") {
removeDom();
}
};
return () => {
if (!enabled.value) {
return null;
}
const waveStyle = {
left: `${left.value}px`,
top: `${top.value}px`,
width: `${width.value}px`,
height: `${height.value}px`,
borderRadius: borderRadius.value.map((radius) => `${radius}px`).join(" ")
};
if (color) {
waveStyle["--wave-color"] = color.value;
}
return createVNode(Transition, {
"appear": true,
"name": "wave-motion",
"appearFromClass": "wave-motion-appear",
"appearActiveClass": "wave-motion-appear",
"appearToClass": "wave-motion-appear wave-motion-appear-active"
}, {
default: () => [createVNode("div", {
"ref": divRef,
"class": props.className,
"style": waveStyle,
"onTransitionend": onTransitionend
}, null)]
});
};
}
});
function showWaveEffect(node, className) {
const holder = document.createElement("div");
holder.style.position = "absolute";
holder.style.left = `0px`;
holder.style.top = `0px`;
node === null || node === void 0 ? void 0 : node.insertBefore(holder, node === null || node === void 0 ? void 0 : node.firstChild);
render(createVNode(WaveEffect, {
"target": node,
"className": className
}, null), holder);
return () => {
render(null, holder);
if (holder.parentElement) {
holder.parentElement.removeChild(holder);
}
};
}
function useWave(className, wave) {
const instance = getCurrentInstance();
let stopWave;
function showWave() {
var _a;
const node = findDOMNode(instance);
stopWave === null || stopWave === void 0 ? void 0 : stopWave();
if (((_a = wave === null || wave === void 0 ? void 0 : wave.value) === null || _a === void 0 ? void 0 : _a.disabled) || !node) {
return;
}
stopWave = showWaveEffect(node, className.value);
}
onBeforeUnmount(() => {
stopWave === null || stopWave === void 0 ? void 0 : stopWave();
});
return showWave;
}
const Wave = defineComponent({
compatConfig: {
MODE: 3
},
name: "Wave",
props: {
disabled: Boolean
},
setup(props, _ref) {
let {
slots
} = _ref;
const instance = getCurrentInstance();
const {
prefixCls,
wave
} = useConfigInject("wave", props);
const [, hashId] = useStyle$1(prefixCls);
const showWave = useWave(computed(() => classNames(prefixCls.value, hashId.value)), wave);
let onClick;
const clear = () => {
const node = findDOMNode(instance);
node.removeEventListener("click", onClick, true);
};
onMounted(() => {
watch(() => props.disabled, () => {
clear();
nextTick(() => {
const node = findDOMNode(instance);
node === null || node === void 0 ? void 0 : node.removeEventListener("click", onClick, true);
if (!node || node.nodeType !== 1 || props.disabled) {
return;
}
onClick = (e) => {
if (e.target.tagName === "INPUT" || !isVisible(e.target) || // No need wave
!node.getAttribute || node.getAttribute("disabled") || node.disabled || node.className.includes("disabled") || node.className.includes("-leave")) {
return;
}
showWave();
};
node.addEventListener("click", onClick, true);
});
}, {
immediate: true,
flush: "post"
});
});
onBeforeUnmount(() => {
clear();
});
return () => {
var _a;
const children = (_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots)[0];
return children;
};
}
});
function convertLegacyProps(type) {
if (type === "danger") {
return {
danger: true
};
}
return {
type
};
}
const buttonProps = () => ({
prefixCls: String,
type: String,
htmlType: {
type: String,
default: "button"
},
shape: {
type: String
},
size: {
type: String
},
loading: {
type: [Boolean, Object],
default: () => false
},
disabled: {
type: Boolean,
default: void 0
},
ghost: {
type: Boolean,
default: void 0
},
block: {
type: Boolean,
default: void 0
},
danger: {
type: Boolean,
default: void 0
},
icon: PropTypes.any,
href: String,
target: String,
title: String,
onClick: eventType(),
onMousedown: eventType()
});
const getCollapsedWidth = (node) => {
if (node) {
node.style.width = "0px";
node.style.opacity = "0";
node.style.transform = "scale(0)";
}
};
const getRealWidth = (node) => {
nextTick(() => {
if (node) {
node.style.width = `${node.scrollWidth}px`;
node.style.opacity = "1";
node.style.transform = "scale(1)";
}
});
};
const resetStyle = (node) => {
if (node && node.style) {
node.style.width = null;
node.style.opacity = null;
node.style.transform = null;
}
};
const LoadingIcon = defineComponent({
compatConfig: {
MODE: 3
},
name: "LoadingIcon",
props: {
prefixCls: String,
loading: [Boolean, Object],
existIcon: Boolean
},
setup(props) {
return () => {
const {
existIcon,
prefixCls,
loading
} = props;
if (existIcon) {
return createVNode("span", {
"class": `${prefixCls}-loading-icon`
}, [createVNode(LoadingOutlined, null, null)]);
}
const visible = !!loading;
return createVNode(Transition, {
"name": `${prefixCls}-loading-icon-motion`,
"onBeforeEnter": getCollapsedWidth,
"onEnter": getRealWidth,
"onAfterEnter": resetStyle,
"onBeforeLeave": getRealWidth,
"onLeave": (node) => {
setTimeout(() => {
getCollapsedWidth(node);
});
},
"onAfterLeave": resetStyle
}, {
default: () => [visible ? createVNode("span", {
"class": `${prefixCls}-loading-icon`
}, [createVNode(LoadingOutlined, null, null)]) : null]
});
};
}
});
const genButtonBorderStyle = (buttonTypeCls, borderColor) => ({
// Border
[`> span, > ${buttonTypeCls}`]: {
"&:not(:last-child)": {
[`&, & > ${buttonTypeCls}`]: {
"&:not(:disabled)": {
borderInlineEndColor: borderColor
}
}
},
"&:not(:first-child)": {
[`&, & > ${buttonTypeCls}`]: {
"&:not(:disabled)": {
borderInlineStartColor: borderColor
}
}
}
}
});
const genGroupStyle = (token) => {
const {
componentCls,
fontSize,
lineWidth,
colorPrimaryHover,
colorErrorHover
} = token;
return {
[`${componentCls}-group`]: [
{
position: "relative",
display: "inline-flex",
// Border
[`> span, > ${componentCls}`]: {
"&:not(:last-child)": {
[`&, & > ${componentCls}`]: {
borderStartEndRadius: 0,
borderEndEndRadius: 0
}
},
"&:not(:first-child)": {
marginInlineStart: -lineWidth,
[`&, & > ${componentCls}`]: {
borderStartStartRadius: 0,
borderEndStartRadius: 0
}
}
},
[componentCls]: {
position: "relative",
zIndex: 1,
[`&:hover,
&:focus,
&:active`]: {
zIndex: 2
},
"&[disabled]": {
zIndex: 0
}
},
[`${componentCls}-icon-only`]: {
fontSize
}
},
// Border Color
genButtonBorderStyle(`${componentCls}-primary`, colorPrimaryHover),
genButtonBorderStyle(`${componentCls}-danger`, colorErrorHover)
]
};
};
function compactItemVerticalBorder(token, parentCls) {
return {
// border collapse
[`&-item:not(${parentCls}-last-item)`]: {
marginBottom: -token.lineWidth
},
"&-item": {
"&:hover,&:focus,&:active": {
zIndex: 2
},
"&[disabled]": {
zIndex: 0
}
}
};
}
function compactItemBorderVerticalRadius(prefixCls, parentCls) {
return {
[`&-item:not(${parentCls}-first-item):not(${parentCls}-last-item)`]: {
borderRadius: 0
},
[`&-item${parentCls}-first-item:not(${parentCls}-last-item)`]: {
[`&, &${prefixCls}-sm, &${prefixCls}-lg`]: {
borderEndEndRadius: 0,
borderEndStartRadius: 0
}
},
[`&-item${parentCls}-last-item:not(${parentCls}-first-item)`]: {
[`&, &${prefixCls}-sm, &${prefixCls}-lg`]: {
borderStartStartRadius: 0,
borderStartEndRadius: 0
}
}
};
}
function genCompactItemVerticalStyle(token) {
const compactCls = `${token.componentCls}-compact-vertical`;
return {
[compactCls]: _extends(_extends({}, compactItemVerticalBorder(token, compactCls)), compactItemBorderVerticalRadius(token.componentCls, compactCls))
};
}
const genSharedButtonStyle = (token) => {
const {
componentCls,
iconCls
} = token;
return {
[componentCls]: {
outline: "none",
position: "relative",
display: "inline-block",
fontWeight: 400,
whiteSpace: "nowrap",
textAlign: "center",
backgroundImage: "none",
backgroundColor: "transparent",
border: `${token.lineWidth}px ${token.lineType} transparent`,
cursor: "pointer",
transition: `all ${token.motionDurationMid} ${token.motionEaseInOut}`,
userSelect: "none",
touchAction: "manipulation",
lineHeight: token.lineHeight,
color: token.colorText,
"> span": {
display: "inline-block"
},
// Leave a space between icon and text.
[`> ${iconCls} + span, > span + ${iconCls}`]: {
marginInlineStart: token.marginXS
},
"> a": {
color: "currentColor"
},
"&:not(:disabled)": _extends({}, genFocusStyle(token)),
// make `btn-icon-only` not too narrow
[`&-icon-only${componentCls}-compact-item`]: {
flex: "none"
},
// Special styles for Primary Button
[`&-compact-item${componentCls}-primary`]: {
[`&:not([disabled]) + ${componentCls}-compact-item${componentCls}-primary:not([disabled])`]: {
position: "relative",
"&:before": {
position: "absolute",
top: -token.lineWidth,
insetInlineStart: -token.lineWidth,
display: "inline-block",
width: token.lineWidth,
height: `calc(100% + ${token.lineWidth * 2}px)`,
backgroundColor: token.colorPrimaryHover,
content: '""'
}
}
},
// Special styles for Primary Button
"&-compact-vertical-item": {
[`&${componentCls}-primary`]: {
[`&:not([disabled]) + ${componentCls}-compact-vertical-item${componentCls}-primary:not([disabled])`]: {
position: "relative",
"&:before": {
position: "absolute",
top: -token.lineWidth,
insetInlineStart: -token.lineWidth,
display: "inline-block",
width: `calc(100% + ${token.lineWidth * 2}px)`,
height: token.lineWidth,
backgroundColor: token.colorPrimaryHover,
content: '""'
}
}
}
}
}
};
};
const genHoverActiveButtonStyle = (hoverStyle, activeStyle) => ({
"&:not(:disabled)": {
"&:hover": hoverStyle,
"&:active": activeStyle
}
});
const genCircleButtonStyle = (token) => ({
minWidth: token.controlHeight,
paddingInlineStart: 0,
paddingInlineEnd: 0,
borderRadius: "50%"
});
const genRoundButtonStyle = (token) => ({
borderRadius: token.controlHeight,
paddingInlineStart: token.controlHeight / 2,
paddingInlineEnd: token.controlHeight / 2
});
const genDisabledStyle = (token) => ({
cursor: "not-allowed",
borderColor: token.colorBorder,
color: token.colorTextDisabled,
backgroundColor: token.colorBgContainerDisabled,
boxShadow: "none"
});
const genGhostButtonStyle = (btnCls, textColor, borderColor, textColorDisabled, borderColorDisabled, hoverStyle, activeStyle) => ({
[`&${btnCls}-background-ghost`]: _extends(_extends({
color: textColor || void 0,
backgroundColor: "transparent",
borderColor: borderColor || void 0,
boxShadow: "none"
}, genHoverActiveButtonStyle(_extends({
backgroundColor: "transparent"
}, hoverStyle), _extends({
backgroundColor: "transparent"
}, activeStyle))), {
"&:disabled": {
cursor: "not-allowed",
color: textColorDisabled || void 0,
borderColor: borderColorDisabled || void 0
}
})
});
const genSolidDisabledButtonStyle = (token) => ({
"&:disabled": _extends({}, genDisabledStyle(token))
});
const genSolidButtonStyle = (token) => _extends({}, genSolidDisabledButtonStyle(token));
const genPureDisabledButtonStyle = (token) => ({
"&:disabled": {
cursor: "not-allowed",
color: token.colorTextDisabled
}
});
const genDefaultButtonStyle = (token) => _extends(_extends(_extends(_extends(_extends({}, genSolidButtonStyle(token)), {
backgroundColor: token.colorBgContainer,
borderColor: token.colorBorder,
boxShadow: `0 ${token.controlOutlineWidth}px 0 ${token.controlTmpOutline}`
}), genHoverActiveButtonStyle({
color: token.colorPrimaryHover,
borderColor: token.colorPrimaryHover
}, {
color: token.colorPrimaryActive,
borderColor: token.colorPrimaryActive
})), genGhostButtonStyle(token.componentCls, token.colorBgContainer, token.colorBgContainer, token.colorTextDisabled, token.colorBorder)), {
[`&${token.componentCls}-dangerous`]: _extends(_extends(_extends({
color: token.colorError,
borderColor: token.colorError
}, genHoverActiveButtonStyle({
color: token.colorErrorHover,
borderColor: token.colorErrorBorderHover
}, {
color: token.colorErrorActive,
borderColor: token.colorErrorActive
})), genGhostButtonStyle(token.componentCls, token.colorError, token.colorError, token.colorTextDisabled, token.colorBorder)), genSolidDisabledButtonStyle(token))
});
const genPrimaryButtonStyle = (token) => _extends(_extends(_extends(_extends(_extends({}, genSolidButtonStyle(token)), {
color: token.colorTextLightSolid,
backgroundColor: token.colorPrimary,
boxShadow: `0 ${token.controlOutlineWidth}px 0 ${token.controlOutline}`
}), genHoverActiveButtonStyle({
color: token.colorTextLightSolid,
backgroundColor: token.colorPrimaryHover
}, {
color: token.colorTextLightSolid,
backgroundColor: token.colorPrimaryActive
})), genGhostButtonStyle(token.componentCls, token.colorPrimary, token.colorPrimary, token.colorTextDisabled, token.colorBorder, {
color: token.colorPrimaryHover,
borderColor: token.colorPrimaryHover
}, {
color: token.colorPrimaryActive,
borderColor: token.colorPrimaryActive
})), {
[`&${token.componentCls}-dangerous`]: _extends(_extends(_extends({
backgroundColor: token.colorError,
boxShadow: `0 ${token.controlOutlineWidth}px 0 ${token.colorErrorOutline}`
}, genHoverActiveButtonStyle({
backgroundColor: token.colorErrorHover
}, {
backgroundColor: token.colorErrorActive
})), genGhostButtonStyle(token.componentCls, token.colorError, token.colorError, token.colorTextDisabled, token.colorBorder, {
color: token.colorErrorHover,
borderColor: token.colorErrorHover
}, {
color: token.colorErrorActive,
borderColor: token.colorErrorActive
})), genSolidDisabledButtonStyle(token))
});
const genDashedButtonStyle = (token) => _extends(_extends({}, genDefaultButtonStyle(token)), {
borderStyle: "dashed"
});
const genLinkButtonStyle = (token) => _extends(_extends(_extends({
color: token.colorLink
}, genHoverActiveButtonStyle({
color: token.colorLinkHover
}, {
color: token.colorLinkActive
})), genPureDisabledButtonStyle(token)), {
[`&${token.componentCls}-dangerous`]: _extends(_extends({
color: token.colorError
}, genHoverActiveButtonStyle({
color: token.colorErrorHover
}, {
color: token.colorErrorActive
})), genPureDisabledButtonStyle(token))
});
const genTextButtonStyle = (token) => _extends(_extends(_extends({}, genHoverActiveButtonStyle({
color: token.colorText,
backgroundColor: token.colorBgTextHover
}, {
color: token.colorText,
backgroundColor: token.colorBgTextActive
})), genPureDisabledButtonStyle(token)), {
[`&${token.componentCls}-dangerous`]: _extends(_extends({
color: token.colorError
}, genPureDisabledButtonStyle(token)), genHoverActiveButtonStyle({
color: token.colorErrorHover,
backgroundColor: token.colorErrorBg
}, {
color: token.colorErrorHover,
backgroundColor: token.colorErrorBg
}))
});
const genDisabledButtonStyle = (token) => _extends(_extends({}, genDisabledStyle(token)), {
[`&${token.componentCls}:hover`]: _extends({}, genDisabledStyle(token))
});
const genTypeButtonStyle = (token) => {
const {
componentCls
} = token;
return {
[`${componentCls}-default`]: genDefaultButtonStyle(token),
[`${componentCls}-primary`]: genPrimaryButtonStyle(token),
[`${componentCls}-dashed`]: genDashedButtonStyle(token),
[`${componentCls}-link`]: genLinkButtonStyle(token),
[`${componentCls}-text`]: genTextButtonStyle(token),
[`${componentCls}-disabled`]: genDisabledButtonStyle(token)
};
};
const genSizeButtonStyle = function(token) {
let sizePrefixCls = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : "";
const {
componentCls,
iconCls,
controlHeight,
fontSize,
lineHeight,
lineWidth,
borderRadius,
buttonPaddingHorizontal
} = token;
const paddingVertical = Math.max(0, (controlHeight - fontSize * lineHeight) / 2 - lineWidth);
const paddingHorizontal = buttonPaddingHorizontal - lineWidth;
const iconOnlyCls = `${componentCls}-icon-only`;
return [
// Size
{
[`${componentCls}${sizePrefixCls}`]: {
fontSize,
height: controlHeight,
padding: `${paddingVertical}px ${paddingHorizontal}px`,
borderRadius,
[`&${iconOnlyCls}`]: {
width: controlHeight,
paddingInlineStart: 0,
paddingInlineEnd: 0,
[`&${componentCls}-round`]: {
width: "auto"
},
"> span": {
transform: "scale(1.143)"
// 14px -> 16px
}
},
// Loading
[`&${componentCls}-loading`]: {
opacity: token.opacityLoading,
cursor: "default"
},
[`${componentCls}-loading-icon`]: {
transition: `width ${token.motionDurationSlow} ${token.motionEaseInOut}, opacity ${token.motionDurationSlow} ${token.motionEaseInOut}`
},
[`&:not(${iconOnlyCls}) ${componentCls}-loading-icon > ${iconCls}`]: {
marginInlineEnd: token.marginXS
}
}
},
// Shape - patch prefixCls again to override solid border radius style
{
[`${componentCls}${componentCls}-circle${sizePrefixCls}`]: genCircleButtonStyle(token)
},
{
[`${componentCls}${componentCls}-round${sizePrefixCls}`]: genRoundButtonStyle(token)
}
];
};
const genSizeBaseButtonStyle = (token) => genSizeButtonStyle(token);
const genSizeSmallButtonStyle = (token) => {
const smallToken = merge(token, {
controlHeight: token.controlHeightSM,
padding: token.paddingXS,
buttonPaddingHorizontal: 8,
borderRadius: token.borderRadiusSM
});
return genSizeButtonStyle(smallToken, `${token.componentCls}-sm`);
};
const genSizeLargeButtonStyle = (token) => {
const largeToken = merge(token, {
controlHeight: token.controlHeightLG,
fontSize: token.fontSizeLG,
borderRadius: token.borderRadiusLG
});
return genSizeButtonStyle(largeToken, `${token.componentCls}-lg`);
};
const genBlockButtonStyle = (token) => {
const {
componentCls
} = token;
return {
[componentCls]: {
[`&${componentCls}-block`]: {
width: "100%"
}
}
};
};
const useStyle = genComponentStyleHook("Button", (token) => {
const {
controlTmpOutline,
paddingContentHorizontal
} = token;
const buttonToken = merge(token, {
colorOutlineDefault: controlTmpOutline,
buttonPaddingHorizontal: paddingContentHorizontal
});
return [
// Shared
genSharedButtonStyle(buttonToken),
// Size
genSizeSmallButtonStyle(buttonToken),
genSizeBaseButtonStyle(buttonToken),
genSizeLargeButtonStyle(buttonToken),
// Block
genBlockButtonStyle(buttonToken),
// Group (type, ghost, danger, disabled, loading)
genTypeButtonStyle(buttonToken),
// Button Group
genGroupStyle(buttonToken),
// Space Compact
genCompactItemStyle(token, {
focus: false
}),
genCompactItemVerticalStyle(token)
];
});
const buttonGroupProps = () => ({
prefixCls: String,
size: {
type: String
}
});
const GroupSizeContext = createContext();
const ButtonGroup = defineComponent({
compatConfig: {
MODE: 3
},
name: "AButtonGroup",
props: buttonGroupProps(),
setup(props, _ref) {
let {
slots
} = _ref;
const {
prefixCls,
direction
} = useConfigInject("btn-group", props);
const [, , hashId] = useToken();
GroupSizeContext.useProvide(reactive({
size: computed(() => props.size)
}));
const classes = computed(() => {
const {
size
} = props;
let sizeCls = "";
switch (size) {
case "large":
sizeCls = "lg";
break;
case "small":
sizeCls = "sm";
break;
case "middle":
case void 0:
break;
default:
devWarning(!size, "Button.Group", "Invalid prop `size`.");
}
return {
[`${prefixCls.value}`]: true,
[`${prefixCls.value}-${sizeCls}`]: sizeCls,
[`${prefixCls.value}-rtl`]: direction.value === "rtl",
[hashId.value]: true
};
});
return () => {
var _a;
return createVNode("div", {
"class": classes.value
}, [flattenChildren((_a = slots.default) === null || _a === void 0 ? void 0 : _a.call(slots))]);
};
}
});
const rxTwoCNChar = /^[\u4e00-\u9fa5]{2}$/;
const isTwoCNChar = rxTwoCNChar.test.bind(rxTwoCNChar);
function isUnBorderedButtonType(type) {
return type === "text" || type === "link";
}
const Button = defineComponent({
compatConfig: {
MODE: 3
},
name: "AButton",
inheritAttrs: false,
__ANT_BUTTON: true,
props: initDefaultProps(buttonProps(), {
type: "default"
}),
slots: Object,
// emits: ['click', 'mousedown'],
setup(props, _ref) {
let {
slots,
attrs,
emit,
expose
} = _ref;
const {
prefixCls,
autoInsertSpaceInButton,
direction,
size
} = useConfigInject("btn", props);
const [wrapSSR, hashId] = useStyle(prefixCls);
const groupSizeContext = GroupSizeContext.useInject();
const disabledContext = useInjectDisabled();
const mergedDisabled = computed(() => {
var _a;
return (_a = props.disabled) !== null && _a !== void 0 ? _a : disabledContext.value;
});
const buttonNodeRef = shallowRef(null);
const delayTimeoutRef = shallowRef(void 0);
let isNeedInserted = false;
const innerLoading = shallowRef(false);
const hasTwoCNChar = shallowRef(false);
const autoInsertSpace = computed(() => autoInsertSpaceInButton.value !== false);
const {
compactSize,
compactItemClassnames
} = useCompactItemContext(prefixCls, direction);
const loadingOrDelay = computed(() => typeof props.loading === "object" && props.loading.delay ? props.loading.delay || true : !!props.loading);
watch(loadingOrDelay, (val) => {
clearTimeout(delayTimeoutRef.value);
if (typeof loadingOrDelay.value === "number") {
delayTimeoutRef.value = setTimeout(() => {
innerLoading.value = val;
}, loadingOrDelay.value);
} else {
innerLoading.value = val;
}
}, {
immediate: true
});
const classes = computed(() => {
const {
type,
shape = "default",
ghost,
block,
danger
} = props;
const pre = prefixCls.value;
const sizeClassNameMap = {
large: "lg",
small: "sm",
middle: void 0
};
const sizeFullname = compactSize.value || (groupSizeContext === null || groupSizeContext === void 0 ? void 0 : groupSizeContext.size) || size.value;
const sizeCls = sizeFullname ? sizeClassNameMap[sizeFullname] || "" : "";
return [compactItemClassnames.value, {
[hashId.value]: true,
[`${pre}`]: true,
[`${pre}-${shape}`]: shape !== "default" && shape,
[`${pre}-${type}`]: type,
[`${pre}-${sizeCls}`]: sizeCls,
[`${pre}-loading`]: innerLoading.value,
[`${pre}-background-ghost`]: ghost && !isUnBorderedButtonType(type),
[`${pre}-two-chinese-chars`]: hasTwoCNChar.value && autoInsertSpace.value,
[`${pre}-block`]: block,
[`${pre}-dangerous`]: !!danger,
[`${pre}-rtl`]: direction.value === "rtl"
}];
});
const fixTwoCNChar = () => {
const node = buttonNodeRef.value;
if (!node || autoInsertSpaceInButton.value === false) {
return;
}
const buttonText = node.textContent;
if (isNeedInserted && isTwoCNChar(buttonText)) {
if (!hasTwoCNChar.value) {
hasTwoCNChar.value = true;
}
} else if (hasTwoCNChar.value) {
hasTwoCNChar.value = false;
}
};
const handleClick = (event) => {
if (innerLoading.value || mergedDisabled.value) {
event.preventDefault();
return;
}
emit("click", event);
};
const handleMousedown = (event) => {
emit("mousedown", event);
};
const insertSpace = (child, needInserted) => {
const SPACE = needInserted ? " " : "";
if (child.type === Text) {
let text = child.children.trim();
if (isTwoCNChar(text)) {
text = text.split("").join(SPACE);
}
return createVNode("span", null, [text]);
}
return child;
};
watchEffect(() => {
devWarning(!(props.ghost && isUnBorderedButtonType(props.type)), "Button", "`link` or `text` button can't be a `ghost` button.");
});
onMounted(fixTwoCNChar);
onUpdated(fixTwoCNChar);
onBeforeUnmount(() => {
delayTimeoutRef.value && clearTimeout(delayTimeoutRef.value);
});
const focus = () => {
var _a;
(_a = buttonNodeRef.value) === null || _a === void 0 ? void 0 : _a.focus();
};
const blur = () => {
var _a;
(_a = buttonNodeRef.value) === null || _a === void 0 ? void 0 : _a.blur();
};
expose({
focus,
blur
});
return () => {
var _a, _b;
const {
icon = (_a = slots.icon) === null || _a === void 0 ? void 0 : _a.call(slots)
} = props;
const children = flattenChildren((_b = slots.default) === null || _b === void 0 ? void 0 : _b.call(slots));
isNeedInserted = children.length === 1 && !icon && !isUnBorderedButtonType(props.type);
const {
type,
htmlType,
href,
title,
target
} = props;
const iconType = innerLoading.value ? "loading" : icon;
const buttonProps2 = _extends(_extends({}, attrs), {
title,
disabled: mergedDisabled.value,
class: [classes.value, attrs.class, {
[`${prefixCls.value}-icon-only`]: children.length === 0 && !!iconType
}],
onClick: handleClick,
onMousedown: handleMousedown
});
if (!mergedDisabled.value) {
delete buttonProps2.disabled;
}
const iconNode = icon && !innerLoading.value ? icon : createVNode(LoadingIcon, {
"existIcon": !!icon,
"prefixCls": prefixCls.value,
"loading": !!innerLoading.value
}, null);
const kids = children.map((child) => insertSpace(child, isNeedInserted && autoInsertSpace.value));
if (href !== void 0) {
return wrapSSR(createVNode("a", _objectSpread2(_objectSpread2({}, buttonProps2), {}, {
"href": href,
"target": target,
"ref": buttonNodeRef
}), [iconNode, kids]));
}
let buttonNode = createVNode("button", _objectSpread2(_objectSpread2({}, buttonProps2), {}, {
"ref": buttonNodeRef,
"type": htmlType
}), [iconNode, kids]);
if (!isUnBorderedButtonType(type)) {
const _buttonNode = /* @__PURE__ */ function() {
return buttonNode;
}();
buttonNode = createVNode(Wave, {
"ref": "wave",
"disabled": !!innerLoading.value
}, {
default: () => [_buttonNode]
});
}
return wrapSSR(buttonNode);
};
}
});
Button.Group = ButtonGroup;
Button.install = function(app) {
app.component(Button.name, Button);
app.component(ButtonGroup.name, ButtonGroup);
return app;
};
const index = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
__proto__: null,
ButtonGroup,
default: Button
}, Symbol.toStringTag, { value: "Module" }));
export {
Button as B,
convertLegacyProps as c,
index as i
};
//# sourceMappingURL=index-B4bfD6sn.js.map