You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

334 lines
7.5 KiB

// deps-lint-skip-all
import type { CSSObject } from '@ant-design/cssinjs';
import { genComponentStyleHook, resetComponent } from '../../_util/theme';
import type { GenerateStyle, FullToken } from '../../_util/theme';
export interface ComponentToken {
carouselDotWidth: CSSObject['width'];
carouselDotHeight: CSSObject['height'];
carouselDotActiveWidth: CSSObject['width'];
}
const genCarouselStyle: GenerateStyle<FullToken<'Carousel'>> = token => {
const { componentCls, antCls } = token;
return {
[componentCls]: {
...resetComponent(token),
'.slick-slider': {
position: 'relative',
display: 'block',
boxSizing: 'border-box',
touchAction: 'pan-y',
WebkitTouchCallout: 'none',
WebkitTapHighlightColor: 'transparent',
'.slick-track, .slick-list': {
transform: 'translate3d(0, 0, 0)',
touchAction: 'pan-y',
},
},
'.slick-list': {
position: 'relative',
display: 'block',
margin: 0,
padding: 0,
overflow: 'hidden',
'&:focus': {
outline: 'none',
},
'&.dragging': {
cursor: 'pointer',
},
'.slick-slide': {
pointerEvents: 'none',
// https://github.com/ant-design/ant-design/issues/23294
[`input${antCls}-radio-input, input${antCls}-checkbox-input`]: {
visibility: 'hidden',
},
'&.slick-active': {
pointerEvents: 'auto',
[`input${antCls}-radio-input, input${antCls}-checkbox-input`]: {
visibility: 'visible',
},
},
// fix Carousel content height not match parent node
// when children is empty node
// https://github.com/ant-design/ant-design/issues/25878
'> div > div': {
verticalAlign: 'bottom',
},
},
},
'.slick-track': {
position: 'relative',
top: 0,
insetInlineStart: 0,
display: 'block',
'&::before, &::after': {
display: 'table',
content: '""',
},
'&::after': {
clear: 'both',
},
},
'.slick-slide': {
display: 'none',
float: 'left',
height: '100%',
minHeight: 1,
img: {
display: 'block',
},
'&.dragging img': {
pointerEvents: 'none',
},
},
'.slick-initialized .slick-slide': {
display: 'block',
},
'.slick-vertical .slick-slide': {
display: 'block',
height: 'auto',
},
'.slick-arrow.slick-hidden': {
display: 'none',
},
// Arrows
'.slick-prev, .slick-next': {
position: 'absolute',
top: '50%',
display: 'block',
// FIXME hardcode in v4
width: 20,
height: 20,
marginTop: -10,
padding: 0,
color: 'transparent',
fontSize: 0,
lineHeight: 0,
background: 'transparent',
border: 0,
outline: 'none',
cursor: 'pointer',
'&:hover, &:focus': {
color: 'transparent',
background: 'transparent',
outline: 'none',
'&::before': {
opacity: 1,
},
},
'&.slick-disabled::before': {
opacity: 0.25,
},
},
'.slick-prev': {
// FIXME hardcode in v4
insetInlineStart: -25,
'&::before': {
content: '"←"',
},
},
'.slick-next': {
// FIXME hardcode in v4
insetInlineEnd: -25,
'&::before': {
content: '"→"',
},
},
// Dots
'.slick-dots': {
position: 'absolute',
insetInlineEnd: 0,
bottom: 0,
insetInlineStart: 0,
zIndex: 15,
display: 'flex !important',
justifyContent: 'center',
marginInlineEnd: '15%',
marginInlineStart: '15%',
paddingInlineStart: 0,
listStyle: 'none',
'&-bottom': {
// FIXME hardcode in v4
bottom: 12,
},
'&-top': {
// FIXME hardcode in v4
top: 12,
bottom: 'auto',
},
li: {
position: 'relative',
display: 'inline-block',
flex: '0 1 auto',
boxSizing: 'content-box',
width: token.carouselDotWidth,
height: token.carouselDotHeight,
margin: '0 2px',
// FIXME hardcode in v4
marginInlineEnd: 3,
marginInlineStart: 3,
padding: 0,
textAlign: 'center',
textIndent: '-999px',
verticalAlign: 'top',
transition: `all ${token.motionDurationSlow}`,
button: {
display: 'block',
width: '100%',
height: token.carouselDotHeight,
padding: 0,
color: 'transparent',
fontSize: 0,
background: token.colorBgComponent,
border: 0,
borderRadius: 1,
outline: 'none',
cursor: 'pointer',
opacity: 0.3,
transition: `all ${token.motionDurationSlow}`,
'&: hover, &:focus': {
opacity: 0.75,
},
},
'&.slick-active': {
width: token.carouselDotActiveWidth,
'& button': {
background: token.colorBgComponent,
opacity: 1,
},
'&: hover, &:focus': {
opacity: 1,
},
},
},
},
},
};
};
const genCarouselVerticalStyle: GenerateStyle<FullToken<'Carousel'>> = token => {
const { componentCls } = token;
const reverseSizeOfDot = {
width: token.carouselDotHeight,
height: token.carouselDotWidth,
};
return {
[`${componentCls}-vertical`]: {
'.slick-dots': {
top: '50%',
bottom: 'auto',
flexDirection: 'column',
width: token.carouselDotHeight,
height: 'auto',
margin: 0,
transform: 'translateY(-50%)',
'&-left': {
insetInlineEnd: 'auto',
insetInlineStart: '12px',
},
'&-right': {
insetInlineEnd: '12px',
insetInlineStart: 'auto',
},
li: {
// reverse width and height in vertical situation
...reverseSizeOfDot,
margin: '4px 2px',
verticalAlign: 'baseline',
button: reverseSizeOfDot,
'&.slick-active': {
...reverseSizeOfDot,
button: reverseSizeOfDot,
},
},
},
},
};
};
const genCarouselRtlStyle: GenerateStyle<FullToken<'Carousel'>> = token => {
const { componentCls } = token;
return [
{
[`${componentCls}-rtl`]: {
direction: 'rtl',
// Dots
'.slick-dots': {
[`${componentCls}-rtl&`]: {
flexDirection: 'row-reverse',
},
},
},
},
{
[`${componentCls}-vertical`]: {
'.slick-dots': {
[`${componentCls}-rtl&`]: {
flexDirection: 'column',
},
},
},
},
];
};
// ============================== Export ==============================
export default genComponentStyleHook(
'Carousel',
token => [genCarouselStyle(token), genCarouselVerticalStyle(token), genCarouselRtlStyle(token)],
{
// FIXME
carouselDotWidth: 16,
carouselDotHeight: 3,
carouselDotActiveWidth: 24,
},
);