index.js 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. import _extends from "@babel/runtime/helpers/esm/extends";
  2. import { genComponentStyleHook, mergeToken } from '../../theme/internal';
  3. import { resetComponent } from '../../style';
  4. const genCarouselStyle = token => {
  5. const {
  6. componentCls,
  7. antCls,
  8. carouselArrowSize,
  9. carouselDotOffset,
  10. marginXXS
  11. } = token;
  12. const arrowOffset = -carouselArrowSize * 1.25;
  13. const carouselDotMargin = marginXXS;
  14. return {
  15. [componentCls]: _extends(_extends({}, resetComponent(token)), {
  16. '.slick-slider': {
  17. position: 'relative',
  18. display: 'block',
  19. boxSizing: 'border-box',
  20. touchAction: 'pan-y',
  21. WebkitTouchCallout: 'none',
  22. WebkitTapHighlightColor: 'transparent',
  23. '.slick-track, .slick-list': {
  24. transform: 'translate3d(0, 0, 0)',
  25. touchAction: 'pan-y'
  26. }
  27. },
  28. '.slick-list': {
  29. position: 'relative',
  30. display: 'block',
  31. margin: 0,
  32. padding: 0,
  33. overflow: 'hidden',
  34. '&:focus': {
  35. outline: 'none'
  36. },
  37. '&.dragging': {
  38. cursor: 'pointer'
  39. },
  40. '.slick-slide': {
  41. pointerEvents: 'none',
  42. // https://github.com/ant-design/ant-design/issues/23294
  43. [`input${antCls}-radio-input, input${antCls}-checkbox-input`]: {
  44. visibility: 'hidden'
  45. },
  46. '&.slick-active': {
  47. pointerEvents: 'auto',
  48. [`input${antCls}-radio-input, input${antCls}-checkbox-input`]: {
  49. visibility: 'visible'
  50. }
  51. },
  52. // fix Carousel content height not match parent node
  53. // when children is empty node
  54. // https://github.com/ant-design/ant-design/issues/25878
  55. '> div > div': {
  56. verticalAlign: 'bottom'
  57. }
  58. }
  59. },
  60. '.slick-track': {
  61. position: 'relative',
  62. top: 0,
  63. insetInlineStart: 0,
  64. display: 'block',
  65. '&::before, &::after': {
  66. display: 'table',
  67. content: '""'
  68. },
  69. '&::after': {
  70. clear: 'both'
  71. }
  72. },
  73. '.slick-slide': {
  74. display: 'none',
  75. float: 'left',
  76. height: '100%',
  77. minHeight: 1,
  78. img: {
  79. display: 'block'
  80. },
  81. '&.dragging img': {
  82. pointerEvents: 'none'
  83. }
  84. },
  85. '.slick-initialized .slick-slide': {
  86. display: 'block'
  87. },
  88. '.slick-vertical .slick-slide': {
  89. display: 'block',
  90. height: 'auto'
  91. },
  92. '.slick-arrow.slick-hidden': {
  93. display: 'none'
  94. },
  95. // Arrows
  96. '.slick-prev, .slick-next': {
  97. position: 'absolute',
  98. top: '50%',
  99. display: 'block',
  100. width: carouselArrowSize,
  101. height: carouselArrowSize,
  102. marginTop: -carouselArrowSize / 2,
  103. padding: 0,
  104. color: 'transparent',
  105. fontSize: 0,
  106. lineHeight: 0,
  107. background: 'transparent',
  108. border: 0,
  109. outline: 'none',
  110. cursor: 'pointer',
  111. '&:hover, &:focus': {
  112. color: 'transparent',
  113. background: 'transparent',
  114. outline: 'none',
  115. '&::before': {
  116. opacity: 1
  117. }
  118. },
  119. '&.slick-disabled::before': {
  120. opacity: 0.25
  121. }
  122. },
  123. '.slick-prev': {
  124. insetInlineStart: arrowOffset,
  125. '&::before': {
  126. content: '"←"'
  127. }
  128. },
  129. '.slick-next': {
  130. insetInlineEnd: arrowOffset,
  131. '&::before': {
  132. content: '"→"'
  133. }
  134. },
  135. // Dots
  136. '.slick-dots': {
  137. position: 'absolute',
  138. insetInlineEnd: 0,
  139. bottom: 0,
  140. insetInlineStart: 0,
  141. zIndex: 15,
  142. display: 'flex !important',
  143. justifyContent: 'center',
  144. paddingInlineStart: 0,
  145. listStyle: 'none',
  146. '&-bottom': {
  147. bottom: carouselDotOffset
  148. },
  149. '&-top': {
  150. top: carouselDotOffset,
  151. bottom: 'auto'
  152. },
  153. li: {
  154. position: 'relative',
  155. display: 'inline-block',
  156. flex: '0 1 auto',
  157. boxSizing: 'content-box',
  158. width: token.dotWidth,
  159. height: token.dotHeight,
  160. marginInline: carouselDotMargin,
  161. padding: 0,
  162. textAlign: 'center',
  163. textIndent: -999,
  164. verticalAlign: 'top',
  165. transition: `all ${token.motionDurationSlow}`,
  166. button: {
  167. position: 'relative',
  168. display: 'block',
  169. width: '100%',
  170. height: token.dotHeight,
  171. padding: 0,
  172. color: 'transparent',
  173. fontSize: 0,
  174. background: token.colorBgContainer,
  175. border: 0,
  176. borderRadius: 1,
  177. outline: 'none',
  178. cursor: 'pointer',
  179. opacity: 0.3,
  180. transition: `all ${token.motionDurationSlow}`,
  181. '&: hover, &:focus': {
  182. opacity: 0.75
  183. },
  184. '&::after': {
  185. position: 'absolute',
  186. inset: -carouselDotMargin,
  187. content: '""'
  188. }
  189. },
  190. '&.slick-active': {
  191. width: token.dotWidthActive,
  192. '& button': {
  193. background: token.colorBgContainer,
  194. opacity: 1
  195. },
  196. '&: hover, &:focus': {
  197. opacity: 1
  198. }
  199. }
  200. }
  201. }
  202. })
  203. };
  204. };
  205. const genCarouselVerticalStyle = token => {
  206. const {
  207. componentCls,
  208. carouselDotOffset,
  209. marginXXS
  210. } = token;
  211. const reverseSizeOfDot = {
  212. width: token.dotHeight,
  213. height: token.dotWidth
  214. };
  215. return {
  216. [`${componentCls}-vertical`]: {
  217. '.slick-dots': {
  218. top: '50%',
  219. bottom: 'auto',
  220. flexDirection: 'column',
  221. width: token.dotHeight,
  222. height: 'auto',
  223. margin: 0,
  224. transform: 'translateY(-50%)',
  225. '&-left': {
  226. insetInlineEnd: 'auto',
  227. insetInlineStart: carouselDotOffset
  228. },
  229. '&-right': {
  230. insetInlineEnd: carouselDotOffset,
  231. insetInlineStart: 'auto'
  232. },
  233. li: _extends(_extends({}, reverseSizeOfDot), {
  234. margin: `${marginXXS}px 0`,
  235. verticalAlign: 'baseline',
  236. button: reverseSizeOfDot,
  237. '&.slick-active': _extends(_extends({}, reverseSizeOfDot), {
  238. button: reverseSizeOfDot
  239. })
  240. })
  241. }
  242. }
  243. };
  244. };
  245. const genCarouselRtlStyle = token => {
  246. const {
  247. componentCls
  248. } = token;
  249. return [{
  250. [`${componentCls}-rtl`]: {
  251. direction: 'rtl',
  252. // Dots
  253. '.slick-dots': {
  254. [`${componentCls}-rtl&`]: {
  255. flexDirection: 'row-reverse'
  256. }
  257. }
  258. }
  259. }, {
  260. [`${componentCls}-vertical`]: {
  261. '.slick-dots': {
  262. [`${componentCls}-rtl&`]: {
  263. flexDirection: 'column'
  264. }
  265. }
  266. }
  267. }];
  268. };
  269. // ============================== Export ==============================
  270. export default genComponentStyleHook('Carousel', token => {
  271. const {
  272. controlHeightLG,
  273. controlHeightSM
  274. } = token;
  275. const carouselToken = mergeToken(token, {
  276. carouselArrowSize: controlHeightLG / 2,
  277. carouselDotOffset: controlHeightSM / 2
  278. });
  279. return [genCarouselStyle(carouselToken), genCarouselVerticalStyle(carouselToken), genCarouselRtlStyle(carouselToken)];
  280. }, {
  281. dotWidth: 16,
  282. dotHeight: 3,
  283. dotWidthActive: 24
  284. });