309 lines
9.9 KiB
JavaScript
309 lines
9.9 KiB
JavaScript
|
"use strict";
|
||
|
|
||
|
Object.defineProperty(exports, "__esModule", {
|
||
|
value: true
|
||
|
});
|
||
|
exports.default = void 0;
|
||
|
var _tinycolor = require("@ctrl/tinycolor");
|
||
|
var _style = require("../../style");
|
||
|
var _internal = require("../../theme/internal");
|
||
|
const genSwitchSmallStyle = token => {
|
||
|
const {
|
||
|
componentCls,
|
||
|
trackHeightSM,
|
||
|
trackPadding,
|
||
|
trackMinWidthSM,
|
||
|
innerMinMarginSM,
|
||
|
innerMaxMarginSM,
|
||
|
handleSizeSM
|
||
|
} = token;
|
||
|
const switchInnerCls = `${componentCls}-inner`;
|
||
|
return {
|
||
|
[componentCls]: {
|
||
|
[`&${componentCls}-small`]: {
|
||
|
minWidth: trackMinWidthSM,
|
||
|
height: trackHeightSM,
|
||
|
lineHeight: `${trackHeightSM}px`,
|
||
|
[`${componentCls}-inner`]: {
|
||
|
paddingInlineStart: innerMaxMarginSM,
|
||
|
paddingInlineEnd: innerMinMarginSM,
|
||
|
[`${switchInnerCls}-checked`]: {
|
||
|
marginInlineStart: `calc(-100% + ${handleSizeSM + trackPadding * 2}px - ${innerMaxMarginSM * 2}px)`,
|
||
|
marginInlineEnd: `calc(100% - ${handleSizeSM + trackPadding * 2}px + ${innerMaxMarginSM * 2}px)`
|
||
|
},
|
||
|
[`${switchInnerCls}-unchecked`]: {
|
||
|
marginTop: -trackHeightSM,
|
||
|
marginInlineStart: 0,
|
||
|
marginInlineEnd: 0
|
||
|
}
|
||
|
},
|
||
|
[`${componentCls}-handle`]: {
|
||
|
width: handleSizeSM,
|
||
|
height: handleSizeSM
|
||
|
},
|
||
|
[`${componentCls}-loading-icon`]: {
|
||
|
top: (handleSizeSM - token.switchLoadingIconSize) / 2,
|
||
|
fontSize: token.switchLoadingIconSize
|
||
|
},
|
||
|
[`&${componentCls}-checked`]: {
|
||
|
[`${componentCls}-inner`]: {
|
||
|
paddingInlineStart: innerMinMarginSM,
|
||
|
paddingInlineEnd: innerMaxMarginSM,
|
||
|
[`${switchInnerCls}-checked`]: {
|
||
|
marginInlineStart: 0,
|
||
|
marginInlineEnd: 0
|
||
|
},
|
||
|
[`${switchInnerCls}-unchecked`]: {
|
||
|
marginInlineStart: `calc(100% - ${handleSizeSM + trackPadding * 2}px + ${innerMaxMarginSM * 2}px)`,
|
||
|
marginInlineEnd: `calc(-100% + ${handleSizeSM + trackPadding * 2}px - ${innerMaxMarginSM * 2}px)`
|
||
|
}
|
||
|
},
|
||
|
[`${componentCls}-handle`]: {
|
||
|
insetInlineStart: `calc(100% - ${handleSizeSM + trackPadding}px)`
|
||
|
}
|
||
|
},
|
||
|
[`&:not(${componentCls}-disabled):active`]: {
|
||
|
[`&:not(${componentCls}-checked) ${switchInnerCls}`]: {
|
||
|
[`${switchInnerCls}-unchecked`]: {
|
||
|
marginInlineStart: token.marginXXS / 2,
|
||
|
marginInlineEnd: -token.marginXXS / 2
|
||
|
}
|
||
|
},
|
||
|
[`&${componentCls}-checked ${switchInnerCls}`]: {
|
||
|
[`${switchInnerCls}-checked`]: {
|
||
|
marginInlineStart: -token.marginXXS / 2,
|
||
|
marginInlineEnd: token.marginXXS / 2
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
const genSwitchLoadingStyle = token => {
|
||
|
const {
|
||
|
componentCls,
|
||
|
handleSize
|
||
|
} = token;
|
||
|
return {
|
||
|
[componentCls]: {
|
||
|
[`${componentCls}-loading-icon${token.iconCls}`]: {
|
||
|
position: 'relative',
|
||
|
top: (handleSize - token.fontSize) / 2,
|
||
|
color: token.switchLoadingIconColor,
|
||
|
verticalAlign: 'top'
|
||
|
},
|
||
|
[`&${componentCls}-checked ${componentCls}-loading-icon`]: {
|
||
|
color: token.switchColor
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
const genSwitchHandleStyle = token => {
|
||
|
const {
|
||
|
componentCls,
|
||
|
motion,
|
||
|
trackPadding,
|
||
|
handleBg,
|
||
|
handleShadow,
|
||
|
handleSize
|
||
|
} = token;
|
||
|
const switchHandleCls = `${componentCls}-handle`;
|
||
|
return {
|
||
|
[componentCls]: {
|
||
|
[switchHandleCls]: {
|
||
|
position: 'absolute',
|
||
|
top: trackPadding,
|
||
|
insetInlineStart: trackPadding,
|
||
|
width: handleSize,
|
||
|
height: handleSize,
|
||
|
transition: `all ${token.switchDuration} ease-in-out`,
|
||
|
'&::before': {
|
||
|
position: 'absolute',
|
||
|
top: 0,
|
||
|
insetInlineEnd: 0,
|
||
|
bottom: 0,
|
||
|
insetInlineStart: 0,
|
||
|
backgroundColor: handleBg,
|
||
|
borderRadius: handleSize / 2,
|
||
|
boxShadow: handleShadow,
|
||
|
transition: `all ${token.switchDuration} ease-in-out`,
|
||
|
content: '""'
|
||
|
}
|
||
|
},
|
||
|
[`&${componentCls}-checked ${switchHandleCls}`]: {
|
||
|
insetInlineStart: `calc(100% - ${handleSize + trackPadding}px)`
|
||
|
},
|
||
|
[`&:not(${componentCls}-disabled):active`]: motion ? {
|
||
|
[`${switchHandleCls}::before`]: {
|
||
|
insetInlineEnd: token.switchHandleActiveInset,
|
||
|
insetInlineStart: 0
|
||
|
},
|
||
|
[`&${componentCls}-checked ${switchHandleCls}::before`]: {
|
||
|
insetInlineEnd: 0,
|
||
|
insetInlineStart: token.switchHandleActiveInset
|
||
|
}
|
||
|
} : /* istanbul ignore next */
|
||
|
{}
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
const genSwitchInnerStyle = token => {
|
||
|
const {
|
||
|
componentCls,
|
||
|
trackHeight,
|
||
|
trackPadding,
|
||
|
innerMinMargin,
|
||
|
innerMaxMargin,
|
||
|
handleSize
|
||
|
} = token;
|
||
|
const switchInnerCls = `${componentCls}-inner`;
|
||
|
return {
|
||
|
[componentCls]: {
|
||
|
[switchInnerCls]: {
|
||
|
display: 'block',
|
||
|
overflow: 'hidden',
|
||
|
borderRadius: 100,
|
||
|
height: '100%',
|
||
|
paddingInlineStart: innerMaxMargin,
|
||
|
paddingInlineEnd: innerMinMargin,
|
||
|
transition: `padding-inline-start ${token.switchDuration} ease-in-out, padding-inline-end ${token.switchDuration} ease-in-out`,
|
||
|
[`${switchInnerCls}-checked, ${switchInnerCls}-unchecked`]: {
|
||
|
display: 'block',
|
||
|
color: token.colorTextLightSolid,
|
||
|
fontSize: token.fontSizeSM,
|
||
|
transition: `margin-inline-start ${token.switchDuration} ease-in-out, margin-inline-end ${token.switchDuration} ease-in-out`,
|
||
|
pointerEvents: 'none'
|
||
|
},
|
||
|
[`${switchInnerCls}-checked`]: {
|
||
|
marginInlineStart: `calc(-100% + ${handleSize + trackPadding * 2}px - ${innerMaxMargin * 2}px)`,
|
||
|
marginInlineEnd: `calc(100% - ${handleSize + trackPadding * 2}px + ${innerMaxMargin * 2}px)`
|
||
|
},
|
||
|
[`${switchInnerCls}-unchecked`]: {
|
||
|
marginTop: -trackHeight,
|
||
|
marginInlineStart: 0,
|
||
|
marginInlineEnd: 0
|
||
|
}
|
||
|
},
|
||
|
[`&${componentCls}-checked ${switchInnerCls}`]: {
|
||
|
paddingInlineStart: innerMinMargin,
|
||
|
paddingInlineEnd: innerMaxMargin,
|
||
|
[`${switchInnerCls}-checked`]: {
|
||
|
marginInlineStart: 0,
|
||
|
marginInlineEnd: 0
|
||
|
},
|
||
|
[`${switchInnerCls}-unchecked`]: {
|
||
|
marginInlineStart: `calc(100% - ${handleSize + trackPadding * 2}px + ${innerMaxMargin * 2}px)`,
|
||
|
marginInlineEnd: `calc(-100% + ${handleSize + trackPadding * 2}px - ${innerMaxMargin * 2}px)`
|
||
|
}
|
||
|
},
|
||
|
[`&:not(${componentCls}-disabled):active`]: {
|
||
|
[`&:not(${componentCls}-checked) ${switchInnerCls}`]: {
|
||
|
[`${switchInnerCls}-unchecked`]: {
|
||
|
marginInlineStart: trackPadding * 2,
|
||
|
marginInlineEnd: -trackPadding * 2
|
||
|
}
|
||
|
},
|
||
|
[`&${componentCls}-checked ${switchInnerCls}`]: {
|
||
|
[`${switchInnerCls}-checked`]: {
|
||
|
marginInlineStart: -trackPadding * 2,
|
||
|
marginInlineEnd: trackPadding * 2
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
const genSwitchStyle = token => {
|
||
|
const {
|
||
|
componentCls,
|
||
|
trackHeight,
|
||
|
trackMinWidth
|
||
|
} = token;
|
||
|
return {
|
||
|
[componentCls]: Object.assign(Object.assign(Object.assign(Object.assign({}, (0, _style.resetComponent)(token)), {
|
||
|
position: 'relative',
|
||
|
display: 'inline-block',
|
||
|
boxSizing: 'border-box',
|
||
|
minWidth: trackMinWidth,
|
||
|
height: trackHeight,
|
||
|
lineHeight: `${trackHeight}px`,
|
||
|
verticalAlign: 'middle',
|
||
|
background: token.colorTextQuaternary,
|
||
|
border: '0',
|
||
|
borderRadius: 100,
|
||
|
cursor: 'pointer',
|
||
|
transition: `all ${token.motionDurationMid}`,
|
||
|
userSelect: 'none',
|
||
|
[`&:hover:not(${componentCls}-disabled)`]: {
|
||
|
background: token.colorTextTertiary
|
||
|
}
|
||
|
}), (0, _style.genFocusStyle)(token)), {
|
||
|
[`&${componentCls}-checked`]: {
|
||
|
background: token.switchColor,
|
||
|
[`&:hover:not(${componentCls}-disabled)`]: {
|
||
|
background: token.colorPrimaryHover
|
||
|
}
|
||
|
},
|
||
|
[`&${componentCls}-loading, &${componentCls}-disabled`]: {
|
||
|
cursor: 'not-allowed',
|
||
|
opacity: token.switchDisabledOpacity,
|
||
|
'*': {
|
||
|
boxShadow: 'none',
|
||
|
cursor: 'not-allowed'
|
||
|
}
|
||
|
},
|
||
|
// rtl style
|
||
|
[`&${componentCls}-rtl`]: {
|
||
|
direction: 'rtl'
|
||
|
}
|
||
|
})
|
||
|
};
|
||
|
};
|
||
|
// ============================== Export ==============================
|
||
|
var _default = exports.default = (0, _internal.genComponentStyleHook)('Switch', token => {
|
||
|
const switchToken = (0, _internal.mergeToken)(token, {
|
||
|
switchDuration: token.motionDurationMid,
|
||
|
switchColor: token.colorPrimary,
|
||
|
switchDisabledOpacity: token.opacityLoading,
|
||
|
switchLoadingIconSize: token.fontSizeIcon * 0.75,
|
||
|
switchLoadingIconColor: `rgba(0, 0, 0, ${token.opacityLoading})`,
|
||
|
switchHandleActiveInset: '-30%'
|
||
|
});
|
||
|
return [genSwitchStyle(switchToken),
|
||
|
// inner style
|
||
|
genSwitchInnerStyle(switchToken),
|
||
|
// handle style
|
||
|
genSwitchHandleStyle(switchToken),
|
||
|
// loading style
|
||
|
genSwitchLoadingStyle(switchToken),
|
||
|
// small style
|
||
|
genSwitchSmallStyle(switchToken)];
|
||
|
}, token => {
|
||
|
const {
|
||
|
fontSize,
|
||
|
lineHeight,
|
||
|
controlHeight,
|
||
|
colorWhite
|
||
|
} = token;
|
||
|
const height = fontSize * lineHeight;
|
||
|
const heightSM = controlHeight / 2;
|
||
|
const padding = 2; // Fixed value
|
||
|
const handleSize = height - padding * 2;
|
||
|
const handleSizeSM = heightSM - padding * 2;
|
||
|
return {
|
||
|
trackHeight: height,
|
||
|
trackHeightSM: heightSM,
|
||
|
trackMinWidth: handleSize * 2 + padding * 4,
|
||
|
trackMinWidthSM: handleSizeSM * 2 + padding * 2,
|
||
|
trackPadding: padding,
|
||
|
handleBg: colorWhite,
|
||
|
handleSize,
|
||
|
handleSizeSM,
|
||
|
handleShadow: `0 2px 4px 0 ${new _tinycolor.TinyColor('#00230b').setAlpha(0.2).toRgbString()}`,
|
||
|
innerMinMargin: handleSize / 2,
|
||
|
innerMaxMargin: handleSize + padding + padding * 2,
|
||
|
innerMinMarginSM: handleSizeSM / 2,
|
||
|
innerMaxMarginSM: handleSizeSM + padding + padding * 2
|
||
|
};
|
||
|
});
|