_buttons.scss 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. @use "sass:color";
  2. //
  3. // Button
  4. //
  5. .btn {
  6. --#{$prefix}btn-icon-size: #{$input-btn-icon-size};
  7. --#{$prefix}btn-icon-color: inherit;
  8. --#{$prefix}btn-bg: var(--#{$prefix}bg-surface);
  9. --#{$prefix}btn-color: var(--#{$prefix}body-color);
  10. --#{$prefix}btn-border-color: #{$btn-border-color};
  11. --#{$prefix}btn-hover-bg: var(--#{$prefix}btn-bg);
  12. --#{$prefix}btn-hover-border-color: var(--#{$prefix}border-active-color);
  13. --#{$prefix}btn-active-color: #{$active-color};
  14. --#{$prefix}btn-active-bg: #{$active-bg};
  15. --#{$prefix}btn-active-border-color: #{$active-border-color};
  16. display: inline-flex;
  17. align-items: center;
  18. justify-content: center;
  19. white-space: nowrap;
  20. box-shadow: var(--#{$prefix}btn-box-shadow);
  21. position: relative;
  22. min-width: calc((var(--#{$prefix}btn-line-height) * 1) + (var(--#{$prefix}btn-padding-y) * 2) + (var(--#{$prefix}btn-border-width) * 2));
  23. min-height: calc((var(--#{$prefix}btn-line-height) * 1) + (var(--#{$prefix}btn-padding-y) * 2) + (var(--#{$prefix}btn-border-width) * 2));
  24. .icon {
  25. width: var(--#{$prefix}btn-icon-size);
  26. height: var(--#{$prefix}btn-icon-size);
  27. min-width: var(--#{$prefix}btn-icon-size);
  28. font-size: var(--#{$prefix}btn-icon-size);
  29. margin: 0 calc(var(--#{$prefix}btn-padding-x) / 2) 0 calc(var(--#{$prefix}btn-padding-x) / -4);
  30. vertical-align: bottom;
  31. color: var(--#{$prefix}btn-icon-color);
  32. }
  33. .avatar {
  34. width: var(--#{$prefix}btn-icon-size);
  35. height: var(--#{$prefix}btn-icon-size);
  36. margin: 0 calc(var(--#{$prefix}btn-padding-x) / 2) 0 calc(var(--#{$prefix}btn-padding-x) / -4);
  37. }
  38. .icon-right,
  39. .icon-end {
  40. margin: 0 calc(var(--#{$prefix}btn-padding-x) / -4) 0 calc(var(--#{$prefix}btn-padding-x) / 2);
  41. }
  42. .badge {
  43. top: auto;
  44. }
  45. .btn-check + &:hover {
  46. color: var(--#{$prefix}btn-hover-color);
  47. background-color: var(--#{$prefix}btn-hover-bg);
  48. border-color: var(--#{$prefix}btn-hover-border-color);
  49. }
  50. }
  51. .btn-link {
  52. color: #{color.adjust($primary, $lightness: 5%)};
  53. background-color: transparent;
  54. border-color: transparent;
  55. box-shadow: none;
  56. .icon {
  57. color: inherit;
  58. }
  59. &:hover {
  60. color: $link-hover-color;
  61. border-color: transparent;
  62. }
  63. }
  64. //
  65. // Button color variations
  66. //
  67. @each $color, $value in map-merge($theme-colors, $social-colors) {
  68. .btn-#{$color} {
  69. @if $color == "dark" {
  70. --#{$prefix}btn-border-color: var(--#{$prefix}dark-mode-border-color);
  71. --#{$prefix}btn-hover-border-color: var(--#{$prefix}dark-mode-border-active-color);
  72. --#{$prefix}btn-active-border-color: var(--#{$prefix}dark-mode-border-active-color);
  73. } @else {
  74. --#{$prefix}btn-border-color: transparent;
  75. --#{$prefix}btn-hover-border-color: transparent;
  76. --#{$prefix}btn-active-border-color: transparent;
  77. }
  78. --#{$prefix}btn-color: var(--#{$prefix}#{$color}-fg, #{$white});
  79. --#{$prefix}btn-bg: var(--#{$prefix}#{$color});
  80. --#{$prefix}btn-hover-color: var(--#{$prefix}#{$color}-fg);
  81. --#{$prefix}btn-hover-bg: var(--#{$prefix}#{$color}-darken);
  82. --#{$prefix}btn-active-color: var(--#{$prefix}#{$color}-fg);
  83. --#{$prefix}btn-active-bg: var(--#{$prefix}#{$color}-darken);
  84. --#{$prefix}btn-disabled-bg: var(--#{$prefix}#{$color});
  85. --#{$prefix}btn-disabled-color: var(--#{$prefix}#{$color}-fg);
  86. --#{$prefix}btn-box-shadow: var(--#{$prefix}shadow-input);
  87. }
  88. .btn-outline-#{$color},
  89. .btn-outline.btn-#{$color} {
  90. --#{$prefix}btn-color: var(--#{$prefix}#{$color});
  91. --#{$prefix}btn-bg: transparent;
  92. --#{$prefix}btn-border-color: var(--#{$prefix}#{$color});
  93. --#{$prefix}btn-hover-color: var(--#{$prefix}#{$color}-fg);
  94. --#{$prefix}btn-hover-border-color: transparent;
  95. --#{$prefix}btn-hover-bg: var(--#{$prefix}#{$color});
  96. --#{$prefix}btn-active-color: var(--#{$prefix}#{$color}-fg);
  97. --#{$prefix}btn-active-bg: var(--#{$prefix}#{$color});
  98. --#{$prefix}btn-active-border-color: var(--#{$prefix}#{$color});
  99. --#{$prefix}btn-disabled-color: var(--#{$prefix}#{$color});
  100. --#{$prefix}btn-disabled-border-color: var(--#{$prefix}#{$color});
  101. }
  102. .btn-ghost-#{$color},
  103. .btn-ghost.btn-#{$color} {
  104. --#{$prefix}btn-color: var(--#{$prefix}#{$color});
  105. --#{$prefix}btn-bg: transparent;
  106. --#{$prefix}btn-border-color: transparent;
  107. --#{$prefix}btn-hover-color: var(--#{$prefix}#{$color}-fg);
  108. --#{$prefix}btn-hover-bg: var(--#{$prefix}#{$color});
  109. --#{$prefix}btn-hover-border-color: var(--#{$prefix}#{$color});
  110. --#{$prefix}btn-active-color: var(--#{$prefix}#{$color}-fg);
  111. --#{$prefix}btn-active-bg: var(--#{$prefix}#{$color});
  112. --#{$prefix}btn-active-border-color: transparent;
  113. --#{$prefix}btn-active-shadow: #{$btn-active-box-shadow};
  114. --#{$prefix}btn-disabled-color: var(--#{$prefix}#{$color});
  115. --#{$prefix}btn-disabled-bg: transparent;
  116. --#{$prefix}btn-disabled-border-color: transparent;
  117. --#{$prefix}gradient: none;
  118. --#{$prefix}btn-box-shadow: none;
  119. }
  120. }
  121. //
  122. // Button sizes
  123. //
  124. .btn-sm,
  125. .btn-group-sm > .btn {
  126. --#{$prefix}btn-line-height: #{$input-btn-line-height-sm};
  127. --#{$prefix}btn-icon-size: #{$input-btn-icon-size-sm};
  128. }
  129. .btn-lg,
  130. .btn-group-lg > .btn {
  131. --#{$prefix}btn-line-height: #{$input-btn-line-height-lg};
  132. --#{$prefix}btn-icon-size: #{$input-btn-icon-size-lg};
  133. }
  134. .btn-xl,
  135. .btn-group-xl > .btn {
  136. --#{$prefix}btn-line-height: #{$input-btn-line-height-xl};
  137. --#{$prefix}btn-icon-size: #{$input-btn-icon-size-xl};
  138. --#{$prefix}btn-padding-y: #{$input-btn-padding-y-xl};
  139. --#{$prefix}btn-padding-x: #{$input-btn-padding-x-xl};
  140. --#{$prefix}btn-font-size: #{$input-btn-font-size-xl};
  141. }
  142. //
  143. // Button shapes
  144. //
  145. .btn-pill {
  146. padding-right: 1.5em;
  147. padding-left: 1.5em;
  148. border-radius: 10rem;
  149. &[class*="btn-icon"] {
  150. padding: 0.375rem 15px;
  151. }
  152. }
  153. .btn-square {
  154. border-radius: 0;
  155. }
  156. //
  157. // Icon button
  158. //
  159. .btn-icon,
  160. .btn-action {
  161. padding-left: 0;
  162. padding-right: 0;
  163. .icon {
  164. margin: calc(-1 * var(--#{$prefix}btn-padding-x));
  165. }
  166. }
  167. //
  168. // Button list
  169. //
  170. .btn-list {
  171. @include elements-list;
  172. }
  173. //
  174. // Button floating
  175. //
  176. .btn-floating {
  177. position: fixed;
  178. z-index: $zindex-fixed;
  179. bottom: 1rem;
  180. left: 1rem;
  181. box-shadow: var(--#{$prefix}shadow-dropdown);
  182. }
  183. //
  184. // Button loading
  185. //
  186. .btn-loading {
  187. position: relative;
  188. color: transparent !important;
  189. text-shadow: none !important;
  190. pointer-events: none;
  191. > * {
  192. opacity: 0;
  193. }
  194. &:after {
  195. content: "";
  196. display: inline-block;
  197. vertical-align: text-bottom;
  198. border: $spinner-border-width var(--#{$prefix}border-style) currentColor;
  199. border-right-color: transparent;
  200. border-radius: $border-radius-pill;
  201. color: var(--#{$prefix}btn-color);
  202. position: absolute;
  203. width: var(--#{$prefix}btn-icon-size);
  204. height: var(--#{$prefix}btn-icon-size);
  205. left: calc(50% - var(--#{$prefix}btn-icon-size) / 2);
  206. top: calc(50% - var(--#{$prefix}btn-icon-size) / 2);
  207. animation: spinner-border 0.75s linear infinite;
  208. }
  209. }
  210. //
  211. // Action button
  212. //
  213. .btn-action {
  214. --#{$prefix}border-color: transparent;
  215. color: var(--#{$prefix}secondary);
  216. border-radius: var(--#{$prefix}border-radius);
  217. background: transparent;
  218. box-shadow: none;
  219. &:after {
  220. content: none;
  221. }
  222. &:focus {
  223. outline: none;
  224. box-shadow: none;
  225. }
  226. &:hover,
  227. &.show {
  228. color: var(--#{$prefix}body-color);
  229. background: var(--#{$prefix}active-bg);
  230. border-color: transparent;
  231. }
  232. &.show {
  233. color: var(--#{$prefix}primary);
  234. }
  235. }
  236. .btn-actions {
  237. display: flex;
  238. }
  239. .btn-animate-icon {
  240. .icon {
  241. transition: transform 0.3s ease;
  242. }
  243. &:hover,
  244. &:focus-visible {
  245. .icon {
  246. transform: translateX(4px);
  247. }
  248. }
  249. &.btn-animate-icon-rotate {
  250. &:hover,
  251. &:focus-visible {
  252. .icon {
  253. transform: rotate(90deg);
  254. }
  255. }
  256. }
  257. &.btn-animate-icon-move-start {
  258. &:hover,
  259. &:focus-visible {
  260. .icon {
  261. transform: translateX(-4px);
  262. }
  263. }
  264. }
  265. &.btn-animate-icon-pulse {
  266. &:hover,
  267. &:focus-visible {
  268. .icon {
  269. transform: none;
  270. animation: pulse 0.9s;
  271. }
  272. }
  273. }
  274. &.btn-animate-icon-shake {
  275. &:hover,
  276. &:focus-visible {
  277. .icon {
  278. transform: none;
  279. animation: shake 0.9s;
  280. }
  281. }
  282. }
  283. &.btn-animate-icon-tada {
  284. &:hover,
  285. &:focus-visible {
  286. .icon {
  287. transform: none;
  288. animation: tada 0.9s;
  289. }
  290. }
  291. }
  292. }