button.scss 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413
  1. @use "sass:map";
  2. @use "sass:list";
  3. @use '../helpers/baseMixin.scss';
  4. @use '../helpers/placement.scss';
  5. $btnThemeList: (
  6. (
  7. name: "primary",
  8. textColor: var(--vxe-ui-font-primary-color),
  9. btnColor: #fff,
  10. btnLightenColor: var(--vxe-ui-font-primary-lighten-color),
  11. btnDarkenColor: var(--vxe-ui-font-primary-darken-color),
  12. btnDisabledColor: var(--vxe-ui-font-primary-disabled-color)
  13. ),
  14. (
  15. name: "success",
  16. textColor: var(--vxe-ui-status-success-color),
  17. btnColor: #fff,
  18. btnLightenColor: var(--vxe-ui-status-success-lighten-color),
  19. btnDarkenColor: var(--vxe-ui-status-success-darken-color),
  20. btnDisabledColor: var(--vxe-ui-status-success-disabled-color)
  21. ),
  22. (
  23. name: "info",
  24. textColor: var(--vxe-ui-status-info-color),
  25. btnColor: #fff,
  26. btnLightenColor: var(--vxe-ui-status-info-lighten-color),
  27. btnDarkenColor: var(--vxe-ui-status-info-darken-color),
  28. btnDisabledColor: var(--vxe-ui-status-info-disabled-color)
  29. ),
  30. (
  31. name: "warning",
  32. textColor: var(--vxe-ui-status-warning-color),
  33. btnColor: #fff,
  34. btnLightenColor: var(--vxe-ui-status-warning-lighten-color),
  35. btnDarkenColor: var(--vxe-ui-status-warning-darken-color),
  36. btnDisabledColor: var(--vxe-ui-status-warning-disabled-color)
  37. ),
  38. (
  39. name: "danger",
  40. textColor: var(--vxe-ui-status-danger-color),
  41. btnColor: #fff,
  42. btnLightenColor: var(--vxe-ui-status-danger-lighten-color),
  43. btnDarkenColor: var(--vxe-ui-status-danger-darken-color),
  44. btnDisabledColor: var(--vxe-ui-status-danger-disabled-color)
  45. ),
  46. (
  47. name: "error",
  48. textColor: var(--vxe-ui-status-error-color),
  49. btnColor: #fff,
  50. btnLightenColor: var(--vxe-ui-status-error-lighten-color),
  51. btnDarkenColor: var(--vxe-ui-status-error-darken-color),
  52. btnDisabledColor: var(--vxe-ui-status-error-disabled-color)
  53. ),
  54. (
  55. name: "perfect",
  56. textColor: var(--vxe-ui-table-header-background-color),
  57. btnColor: var(--vxe-ui-font-color),
  58. btnLightenColor: var(--vxe-ui-table-header-background-color),
  59. btnDarkenColor: var(--vxe-ui-table-header-background-color),
  60. btnDisabledColor: var(--vxe-ui-table-header-background-color)
  61. )
  62. );
  63. .vxe-button {
  64. display: inline-flex;
  65. flex-direction: row;
  66. align-items: center;
  67. justify-content: center;
  68. vertical-align: middle;
  69. position: relative;
  70. background-color: var(--vxe-ui-layout-background-color);
  71. outline: 0;
  72. font-size: var(--vxe-ui-font-size-default);
  73. max-width: var(--vxe-ui-button-max-width);
  74. overflow: hidden;
  75. text-overflow: ellipsis;
  76. white-space: nowrap;
  77. white-space: nowrap;
  78. user-select: none;
  79. appearance: none;
  80. @include baseMixin.createAnimationTransition(border, .2s);
  81. &.align--left {
  82. justify-content: left;
  83. }
  84. &.align--center {
  85. justify-content: center;
  86. }
  87. &.align--right {
  88. justify-content: right;
  89. }
  90. &:not(.is--disabled) {
  91. color: var(--vxe-ui-font-color);
  92. cursor: pointer;
  93. }
  94. &.is--loading {
  95. cursor: progress;
  96. &:before {
  97. content: "";
  98. position: absolute;
  99. left: -1px;
  100. top: -1px;
  101. right: -1px;
  102. bottom: -1px;
  103. border-radius: inherit;
  104. background-color: hsla(0,0%,100%,.35);
  105. pointer-events: none;
  106. }
  107. }
  108. &.is--disabled {
  109. color: var(--vxe-ui-font-disabled-color);
  110. &:not(.is--loading) {
  111. cursor: no-drop;
  112. }
  113. }
  114. &.type--text {
  115. text-decoration: none;
  116. border: 0;
  117. padding: 0.1em 0.5em;
  118. background-color: transparent;
  119. text-decoration: none;
  120. &:not(.is--disabled) {
  121. &:focus {
  122. color: var(--vxe-ui-font-darken-color);
  123. }
  124. &:hover {
  125. color: var(--vxe-ui-font-primary-lighten-color);
  126. }
  127. &:active {
  128. color: var(--vxe-ui-font-primary-darken-color);
  129. }
  130. }
  131. @for $index from 0 to list.length($btnThemeList) {
  132. $item: list.nth($btnThemeList, $index + 1);
  133. &.theme--#{map.get($item, name)} {
  134. color: map.get($item, textColor);
  135. &:not(.is--disabled) {
  136. &:focus {
  137. color: map.get($item, btnDarkenColor);
  138. }
  139. &:hover {
  140. color: map.get($item, btnLightenColor);
  141. }
  142. &:active {
  143. color: map.get($item, btnDarkenColor);
  144. }
  145. }
  146. &.is--disabled {
  147. color: map.get($item, btnDisabledColor);
  148. }
  149. }
  150. }
  151. }
  152. &.type--button {
  153. font-family: inherit;
  154. line-height: 1;
  155. border: 1px solid var(--vxe-ui-input-border-color);
  156. text-decoration: none;
  157. &.is--round {
  158. border-radius: var(--vxe-ui-button-round-border-radius-default);
  159. }
  160. &:not(.is--round) {
  161. border-radius: var(--vxe-ui-base-border-radius);
  162. }
  163. &.is--circle {
  164. padding: 0 0.5em;
  165. text-align: center;
  166. justify-content: center;
  167. min-width: var(--vxe-ui-button-height-default);
  168. border-radius: 50%;
  169. }
  170. &:not(.is--circle) {
  171. padding: 0 1em;
  172. }
  173. &:not(.is--disabled) {
  174. &:hover {
  175. color: var(--vxe-ui-font-primary-lighten-color);
  176. }
  177. &:focus {
  178. border-color: var(--vxe-ui-font-primary-color);
  179. }
  180. &:active {
  181. color: var(--vxe-ui-font-primary-darken-color);
  182. border-color: var(--vxe-ui-font-primary-darken-color);
  183. background-color: var(--vxe-ui-layout-background-color);
  184. }
  185. }
  186. @for $index from 0 to list.length($btnThemeList) {
  187. $item: list.nth($btnThemeList, $index + 1);
  188. $textColor: map.get($item, textColor);
  189. $btnColor: map.get($item, btnColor);
  190. &.theme--#{map.get($item, name)} {
  191. color: $btnColor;
  192. &:not(.is--disabled) {
  193. border-color: $textColor;
  194. background-color: $textColor;
  195. &:hover {
  196. color: $btnColor;
  197. background-color: map.get($item, btnLightenColor);
  198. border-color: map.get($item, btnLightenColor);
  199. }
  200. &:active {
  201. color: $btnColor;
  202. background-color: map.get($item, btnDarkenColor);
  203. border-color: map.get($item, btnDarkenColor);
  204. }
  205. }
  206. &.is--disabled {
  207. border-color: map.get($item, btnDisabledColor);
  208. background-color: map.get($item, btnDisabledColor);
  209. }
  210. &.is--loading {
  211. border-color: $textColor;
  212. background-color: $textColor;
  213. }
  214. }
  215. }
  216. }
  217. &.size--medium {
  218. font-size: var(--vxe-ui-font-size-medium);
  219. &.type--button {
  220. &.is--circle {
  221. min-width: var(--vxe-ui-button-height-medium);
  222. }
  223. &.is--round {
  224. border-radius: var(--vxe-ui-button-round-border-radius-medium);
  225. }
  226. }
  227. }
  228. &.size--small {
  229. font-size: var(--vxe-ui-font-size-small);
  230. &.type--button {
  231. height: var(--vxe-ui-button-height-small);
  232. &.is--circle {
  233. min-width: var(--vxe-ui-button-height-small);
  234. }
  235. &.is--round {
  236. border-radius: var(--vxe-ui-button-round-border-radius-small);
  237. }
  238. }
  239. }
  240. &.size--mini {
  241. font-size: var(--vxe-ui-font-size-mini);
  242. &.type--button {
  243. height: var(--vxe-ui-button-height-mini);
  244. &.is--circle {
  245. min-width: var(--vxe-ui-button-height-mini);
  246. }
  247. &.is--round {
  248. border-radius: var(--vxe-ui-button-round-border-radius-mini);
  249. }
  250. }
  251. }
  252. }
  253. .vxe-button {
  254. &.type--button {
  255. height: var(--vxe-ui-button-height-default);
  256. &.size--medium {
  257. height: var(--vxe-ui-button-height-medium);
  258. }
  259. &.size--small {
  260. height: var(--vxe-ui-button-height-small);
  261. }
  262. &.size--mini {
  263. height: var(--vxe-ui-button-height-mini);
  264. }
  265. }
  266. }
  267. .vxe-button--custom-prefix-icon,
  268. .vxe-button--custom-suffix-icon {
  269. & > svg {
  270. max-width: 1em;
  271. max-height: 1em;
  272. vertical-align: middle;
  273. }
  274. }
  275. .vxe-input--prefix-icon,
  276. .vxe-input--suffix-icon {
  277. & > .vxe-button {
  278. &.type--button {
  279. height: 100%;
  280. }
  281. }
  282. }
  283. .vxe-button--item {
  284. padding: 0 0.1em;
  285. &:first-child {
  286. padding-left: 0;
  287. }
  288. &:last-child {
  289. padding-right: 0;
  290. }
  291. }
  292. .vxe-button--wrapper,
  293. .vxe-button--dropdown {
  294. display: inline-block;
  295. }
  296. .vxe-button--dropdown {
  297. position: relative;
  298. outline: 0;
  299. & > .vxe-button {
  300. &.type--button {
  301. @for $index from 0 to list.length($btnThemeList) {
  302. $item: list.nth($btnThemeList, $index + 1);
  303. $btnColor: map.get($item, btnColor);
  304. &.theme--#{map.get($item, name)} {
  305. color: $btnColor;
  306. }
  307. }
  308. }
  309. }
  310. &.is--active {
  311. & > .vxe-button {
  312. &:not(.is--disabled) {
  313. color: var(--vxe-ui-font-primary-lighten-color);
  314. }
  315. &.type--text {
  316. @for $index from 0 to list.length($btnThemeList) {
  317. $item: list.nth($btnThemeList, $index + 1);
  318. &.theme--#{map.get($item, name)} {
  319. color: map.get($item, btnLightenColor);
  320. }
  321. }
  322. }
  323. &.type--button {
  324. @for $index from 0 to list.length($btnThemeList) {
  325. $item: list.nth($btnThemeList, $index + 1);
  326. &.theme--#{map.get($item, name)} {
  327. color: map.get($item, btnColor);
  328. background-color: map.get($item, btnLightenColor);
  329. border-color: map.get($item, btnLightenColor);
  330. }
  331. }
  332. }
  333. }
  334. .vxe-button--dropdown-arrow {
  335. transform: rotate(180deg);
  336. }
  337. }
  338. }
  339. .vxe-button--dropdown-arrow {
  340. display: inline-block;
  341. font-size: 12px;
  342. margin-left: 4px;
  343. @include baseMixin.createAnimationTransition(transform, .2s);
  344. }
  345. .vxe-button--dropdown-panel {
  346. @include placement.createPlacementPanel();
  347. }
  348. .vxe-button--dropdown-wrapper {
  349. padding: 5px;
  350. background-color: var(--vxe-ui-layout-background-color);
  351. border-radius: var(--vxe-ui-base-border-radius);
  352. border: 1px solid var(--vxe-ui-input-border-color);
  353. box-shadow: 0 1px 6px rgba(0,0,0,.2);
  354. & > .vxe-button.type--text,
  355. & > .vxe-button.type--button {
  356. display: block;
  357. width: 100%;
  358. border: 0;
  359. margin: 0.4em 0 0 0;
  360. }
  361. & > .vxe-button {
  362. &.type--text {
  363. padding: 2px 8px;
  364. }
  365. &:first-child {
  366. margin-top: 0;
  367. }
  368. &:last-child {
  369. margin-bottom: 0;
  370. }
  371. }
  372. }
  373. .vxe-button.type--button,
  374. .vxe-button--dropdown {
  375. margin-right: var(--vxe-ui-base-margin-gap-default);
  376. &.size--medium {
  377. margin-right: var(--vxe-ui-base-margin-gap-medium);
  378. }
  379. &.size--small {
  380. margin-right: var(--vxe-ui-base-margin-gap-small);
  381. }
  382. &.size--mini {
  383. margin-right: var(--vxe-ui-base-margin-gap-mini);
  384. }
  385. &:last-of-type {
  386. margin-right: 0;
  387. }
  388. }
  389. .vxe-button+.vxe-button--dropdown,
  390. .vxe-button--dropdown+.vxe-button {
  391. margin-left: var(--vxe-ui-base-margin-gap-default);
  392. &.size--medium {
  393. margin-left: var(--vxe-ui-base-margin-gap-medium);
  394. }
  395. &.size--small {
  396. margin-left: var(--vxe-ui-base-margin-gap-small);
  397. }
  398. &.size--mini {
  399. margin-left: var(--vxe-ui-base-margin-gap-mini);
  400. }
  401. }