index.less 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. @select-prefix: ~'rc-select';
  2. * {
  3. box-sizing: border-box;
  4. }
  5. .search-input-without-border() {
  6. .@{select-prefix}-selection-search-input {
  7. border: none;
  8. outline: none;
  9. background: rgba(255, 0, 0, 0.2);
  10. width: 100%;
  11. }
  12. }
  13. .@{select-prefix} {
  14. display: inline-block;
  15. font-size: 12px;
  16. width: 100px;
  17. position: relative;
  18. &-disabled {
  19. &,
  20. & input {
  21. cursor: not-allowed;
  22. }
  23. .@{select-prefix}-selector {
  24. opacity: 0.3;
  25. }
  26. }
  27. &-show-arrow&-loading {
  28. .@{select-prefix}-arrow {
  29. &-icon::after {
  30. box-sizing: border-box;
  31. width: 12px;
  32. height: 12px;
  33. border-radius: 100%;
  34. border: 2px solid #999;
  35. border-top-color: transparent;
  36. border-bottom-color: transparent;
  37. transform: none;
  38. margin-top: 4px;
  39. animation: rcSelectLoadingIcon 0.5s infinite;
  40. }
  41. }
  42. }
  43. // ============== Selector ===============
  44. .@{select-prefix}-selection-placeholder {
  45. opacity: 0.4;
  46. pointer-events: none;
  47. }
  48. // ============== Search ===============
  49. .@{select-prefix}-selection-search-input {
  50. appearance: none;
  51. &::-webkit-search-cancel-button {
  52. display: none;
  53. appearance: none;
  54. }
  55. }
  56. // --------------- Single ----------------
  57. &-single {
  58. .@{select-prefix}-selector {
  59. display: flex;
  60. position: relative;
  61. .@{select-prefix}-selection-wrap {
  62. width: 100%;
  63. position: relative;
  64. }
  65. .@{select-prefix}-selection-search {
  66. width: 100%;
  67. position: relative;
  68. &-input {
  69. width: 100%;
  70. }
  71. }
  72. .@{select-prefix}-selection-item,
  73. .@{select-prefix}-selection-placeholder {
  74. position: absolute;
  75. top: 1px;
  76. left: 3px;
  77. pointer-events: none;
  78. font-weight: normal;
  79. }
  80. }
  81. // Not customize
  82. &:not(.@{select-prefix}-customize-input) {
  83. .@{select-prefix}-selector {
  84. padding: 1px;
  85. border: 1px solid #000;
  86. .search-input-without-border();
  87. }
  88. }
  89. }
  90. // -------------- Multiple ---------------
  91. &-multiple .@{select-prefix}-selector {
  92. display: flex;
  93. padding: 1px;
  94. border: 1px solid #000;
  95. .@{select-prefix}-selection-item {
  96. flex: none;
  97. background: #bbb;
  98. border-radius: 4px;
  99. margin-right: 2px;
  100. padding: 0 8px;
  101. &-disabled {
  102. cursor: not-allowed;
  103. opacity: 0.5;
  104. }
  105. }
  106. .@{select-prefix}-selection-overflow {
  107. display: flex;
  108. flex-wrap: wrap;
  109. &-item {
  110. flex: none;
  111. max-width: 100%;
  112. }
  113. }
  114. .@{select-prefix}-selection-search {
  115. position: relative;
  116. max-width: 100%;
  117. &-input,
  118. &-mirror {
  119. padding: 1px;
  120. font-family: system-ui;
  121. }
  122. &-mirror {
  123. position: absolute;
  124. z-index: 999;
  125. white-space: nowrap;
  126. position: none;
  127. left: 0;
  128. top: 0;
  129. visibility: hidden;
  130. }
  131. }
  132. .search-input-without-border();
  133. }
  134. // ================ Icons ================
  135. &-allow-clear {
  136. &.@{select-prefix}-multiple .@{select-prefix}-selector {
  137. padding-right: 20px;
  138. }
  139. .@{select-prefix}-clear {
  140. position: absolute;
  141. right: 20px;
  142. top: 0;
  143. }
  144. }
  145. &-show-arrow {
  146. &.@{select-prefix}-multiple .@{select-prefix}-selector {
  147. padding-right: 20px;
  148. }
  149. .@{select-prefix}-arrow {
  150. pointer-events: none;
  151. position: absolute;
  152. right: 5px;
  153. top: 0;
  154. &-icon::after {
  155. content: '';
  156. border: 5px solid transparent;
  157. width: 0;
  158. height: 0;
  159. display: inline-block;
  160. border-top-color: #999;
  161. transform: translateY(5px);
  162. }
  163. }
  164. }
  165. // =============== Focused ===============
  166. &-focused {
  167. .@{select-prefix}-selector {
  168. border-color: blue !important;
  169. }
  170. }
  171. // ============== Dropdown ===============
  172. &-dropdown {
  173. border: 1px solid green;
  174. min-height: 100px;
  175. position: absolute;
  176. background: #fff;
  177. &-hidden {
  178. display: none;
  179. }
  180. }
  181. // =============== Option ================
  182. &-item {
  183. font-size: 16px;
  184. line-height: 1.5;
  185. padding: 4px 16px;
  186. // >>> Group
  187. &-group {
  188. color: #999;
  189. font-weight: bold;
  190. font-size: 80%;
  191. }
  192. // >>> Option
  193. &-option {
  194. position: relative;
  195. &-grouped {
  196. padding-left: 24px;
  197. }
  198. .@{select-prefix}-item-option-state {
  199. position: absolute;
  200. right: 0;
  201. top: 4px;
  202. pointer-events: none;
  203. }
  204. // ------- Active -------
  205. &-active {
  206. background: #ddd;
  207. }
  208. // ------ Disabled ------
  209. &-disabled {
  210. color: #999;
  211. }
  212. }
  213. // >>> Empty
  214. &-empty {
  215. text-align: center;
  216. color: #999;
  217. }
  218. }
  219. }
  220. .@{select-prefix}-selection__choice-zoom {
  221. transition: all 0.3s;
  222. }
  223. .@{select-prefix}-selection__choice-zoom-appear {
  224. opacity: 0;
  225. transform: scale(0.5);
  226. &&-active {
  227. opacity: 1;
  228. transform: scale(1);
  229. }
  230. }
  231. .@{select-prefix}-selection__choice-zoom-leave {
  232. opacity: 1;
  233. transform: scale(1);
  234. &&-active {
  235. opacity: 0;
  236. transform: scale(0.5);
  237. }
  238. }
  239. .effect() {
  240. animation-duration: 0.3s;
  241. animation-fill-mode: both;
  242. transform-origin: 0 0;
  243. }
  244. .@{select-prefix}-dropdown {
  245. &-slide-up-enter,
  246. &-slide-up-appear {
  247. .effect();
  248. opacity: 0;
  249. animation-timing-function: cubic-bezier(0.08, 0.82, 0.17, 1);
  250. animation-play-state: paused;
  251. }
  252. &-slide-up-leave {
  253. .effect();
  254. opacity: 1;
  255. animation-timing-function: cubic-bezier(0.6, 0.04, 0.98, 0.34);
  256. animation-play-state: paused;
  257. }
  258. &-slide-up-enter&-slide-up-enter-active&-placement-bottomLeft,
  259. &-slide-up-appear&-slide-up-appear-active&-placement-bottomLeft,
  260. &-slide-up-enter&-slide-up-enter-active&-placement-bottomRight,
  261. &-slide-up-appear&-slide-up-appear-active&-placement-bottomRight {
  262. animation-name: rcSelectDropdownSlideUpIn;
  263. animation-play-state: running;
  264. }
  265. &-slide-up-leave&-slide-up-leave-active&-placement-bottomLeft,
  266. &-slide-up-leave&-slide-up-leave-active&-placement-bottomRight {
  267. animation-name: rcSelectDropdownSlideUpOut;
  268. animation-play-state: running;
  269. }
  270. &-slide-up-enter&-slide-up-enter-active&-placement-topLeft,
  271. &-slide-up-appear&-slide-up-appear-active&-placement-topLeft,
  272. &-slide-up-enter&-slide-up-enter-active&-placement-topRight,
  273. &-slide-up-appear&-slide-up-appear-active&-placement-topRight {
  274. animation-name: rcSelectDropdownSlideDownIn;
  275. animation-play-state: running;
  276. }
  277. &-slide-up-leave&-slide-up-leave-active&-placement-topLeft,
  278. &-slide-up-leave&-slide-up-leave-active&-placement-topRight {
  279. animation-name: rcSelectDropdownSlideDownOut;
  280. animation-play-state: running;
  281. }
  282. }
  283. @keyframes rcSelectDropdownSlideUpIn {
  284. 0% {
  285. opacity: 0;
  286. transform-origin: 0% 0%;
  287. transform: scaleY(0);
  288. }
  289. 100% {
  290. opacity: 1;
  291. transform-origin: 0% 0%;
  292. transform: scaleY(1);
  293. }
  294. }
  295. @keyframes rcSelectDropdownSlideUpOut {
  296. 0% {
  297. opacity: 1;
  298. transform-origin: 0% 0%;
  299. transform: scaleY(1);
  300. }
  301. 100% {
  302. opacity: 0;
  303. transform-origin: 0% 0%;
  304. transform: scaleY(0);
  305. }
  306. }
  307. @keyframes rcSelectDropdownSlideDownIn {
  308. 0% {
  309. transform: scaleY(0);
  310. transform-origin: 100% 100%;
  311. opacity: 0;
  312. }
  313. 100% {
  314. transform: scaleY(1);
  315. transform-origin: 100% 100%;
  316. opacity: 1;
  317. }
  318. }
  319. @keyframes rcSelectDropdownSlideDownOut {
  320. 0% {
  321. transform: scaleY(1);
  322. transform-origin: 100% 100%;
  323. opacity: 1;
  324. }
  325. 100% {
  326. transform: scaleY(0);
  327. transform-origin: 100% 100%;
  328. opacity: 0;
  329. }
  330. }
  331. @keyframes rcSelectLoadingIcon {
  332. 0% {
  333. transform: rotate(0);
  334. }
  335. 100% {
  336. transform: rotate(360deg);
  337. }
  338. }