VBtn.sass 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. @use 'sass:math'
  2. @use 'sass:map'
  3. @use '../../styles/settings'
  4. @use '../../styles/tools'
  5. @use './mixins' as *
  6. @use './variables' as *
  7. @include tools.layer('components')
  8. .v-btn
  9. align-items: center
  10. border-radius: $button-border-radius
  11. display: inline-grid
  12. grid-template-areas: "prepend content append"
  13. grid-template-columns: max-content auto max-content
  14. font-weight: $button-font-weight
  15. justify-content: center
  16. letter-spacing: $button-text-letter-spacing
  17. line-height: $button-line-height
  18. max-width: $button-max-width
  19. outline: none
  20. position: relative
  21. text-decoration: none
  22. text-indent: $button-text-letter-spacing
  23. text-transform: $button-text-transform
  24. transition-property: $button-transition-property
  25. transition-duration: 0.28s
  26. transition-timing-function: settings.$standard-easing
  27. user-select: none
  28. vertical-align: $button-vertical-align
  29. flex-shrink: 0
  30. @at-root
  31. @include button-sizes()
  32. @include button-density('height', $button-density)
  33. @include tools.border($button-border...)
  34. @include tools.position($button-positions)
  35. @include tools.states('.v-btn__overlay')
  36. @include tools.variant($button-variants...)
  37. @supports selector(:focus-visible)
  38. &::after
  39. pointer-events: none
  40. border: 2px solid currentColor
  41. border-radius: inherit
  42. opacity: 0
  43. transition: opacity .2s ease-in-out
  44. @include tools.absolute(true)
  45. &:focus-visible::after
  46. opacity: calc(.25 * var(--v-theme-overlay-multiplier))
  47. &--icon
  48. border-radius: $button-icon-border-radius
  49. min-width: 0
  50. padding: 0
  51. // ensure that default
  52. // v-icon size is 24px
  53. &.v-btn--size-default
  54. --v-btn-size: #{$button-icon-font-size}
  55. @at-root &
  56. @include button-density(('width', 'height'), $button-icon-density)
  57. &--elevated
  58. &:hover,
  59. &:focus
  60. @include tools.elevation(map.get($button-elevation, 'hover'))
  61. &:active
  62. @include tools.elevation(map.get($button-elevation, 'active'))
  63. &--flat
  64. box-shadow: none
  65. &--block
  66. display: flex
  67. flex: 1 0 auto
  68. min-width: 100%
  69. &--disabled
  70. pointer-events: none
  71. @if ($button-colored-disabled)
  72. opacity: $button-disabled-opacity
  73. &:hover
  74. opacity: $button-disabled-opacity
  75. @else
  76. opacity: 1
  77. &.v-btn
  78. // specificity has to be higher to override theme !important
  79. color: rgba(var(--v-theme-on-surface), $button-disabled-opacity) !important
  80. &.v-btn--variant-elevated,
  81. &.v-btn--variant-flat
  82. box-shadow: none
  83. @if ($button-colored-disabled)
  84. opacity: 1
  85. color: rgba(var(--v-theme-on-surface), $button-disabled-opacity)
  86. background: rgb(var(--v-theme-surface))
  87. @else
  88. background: rgb(var(--v-theme-surface)) !important
  89. .v-btn__overlay
  90. // __overlay uses currentColor, so we need to divide
  91. // by the text opacity to get the correct value
  92. opacity: math.div($button-disabled-overlay, $button-disabled-opacity)
  93. &--loading
  94. pointer-events: none
  95. .v-btn__content,
  96. .v-btn__prepend,
  97. .v-btn__append
  98. opacity: 0
  99. &--stacked
  100. grid-template-areas: "prepend" "content" "append"
  101. grid-template-columns: auto
  102. grid-template-rows: max-content max-content max-content
  103. justify-items: center
  104. align-content: center
  105. .v-btn__content
  106. flex-direction: column
  107. line-height: $button-stacked-line-height
  108. .v-btn__prepend,
  109. .v-btn__append,
  110. .v-btn__content > .v-icon--start,
  111. .v-btn__content > .v-icon--end
  112. margin-inline: 0
  113. .v-btn__prepend,
  114. .v-btn__content > .v-icon--start
  115. margin-bottom: $button-stacked-icon-margin
  116. .v-btn__append,
  117. .v-btn__content > .v-icon--end
  118. margin-top: $button-stacked-icon-margin
  119. @at-root
  120. @include button-sizes($button-stacked-sizes, true)
  121. @include button-density('height', $button-stacked-density)
  122. &--slim
  123. padding: $button-slim-padding
  124. &--readonly
  125. pointer-events: none
  126. &--rounded
  127. @include tools.rounded($button-rounded-border-radius)
  128. &.v-btn--icon
  129. @include tools.rounded($button-border-radius)
  130. .v-icon
  131. --v-icon-size-multiplier: #{calc(18/21)}
  132. &--icon
  133. .v-icon
  134. --v-icon-size-multiplier: 1
  135. &--stacked
  136. .v-icon
  137. --v-icon-size-multiplier: #{calc(24/21)}
  138. &.v-btn--block
  139. min-width: 100%
  140. .v-btn__loader
  141. align-items: center
  142. display: flex
  143. height: 100%
  144. justify-content: center
  145. left: 0
  146. position: absolute
  147. top: 0
  148. width: 100%
  149. > .v-progress-circular
  150. width: $button-loader-size
  151. height: $button-loader-size
  152. .v-btn__content,
  153. .v-btn__prepend,
  154. .v-btn__append
  155. align-items: center
  156. display: flex
  157. transition: $button-content-transition
  158. .v-btn__prepend
  159. grid-area: prepend
  160. margin-inline: $button-margin-start $button-margin-end
  161. .v-btn--slim &
  162. margin-inline-start: 0
  163. .v-btn__append
  164. grid-area: append
  165. margin-inline: $button-margin-end $button-margin-start
  166. .v-btn--slim &
  167. margin-inline-end: 0
  168. .v-btn__content
  169. grid-area: content
  170. justify-content: center
  171. white-space: $button-white-space
  172. > .v-icon--start
  173. margin-inline: $button-margin-start $button-margin-end
  174. > .v-icon--end
  175. margin-inline: $button-margin-end $button-margin-start
  176. .v-btn--stacked &
  177. white-space: normal
  178. .v-btn__overlay
  179. background-color: currentColor
  180. border-radius: inherit
  181. opacity: 0
  182. transition: opacity .2s ease-in-out
  183. .v-btn__overlay,
  184. .v-btn__underlay
  185. pointer-events: none
  186. @include tools.absolute()
  187. // VPagination
  188. .v-pagination
  189. .v-btn
  190. @include tools.rounded($button-pagination-border-radius)
  191. &--rounded
  192. @include tools.rounded($button-pagination-rounded-border-radius)
  193. &__overlay
  194. transition: none
  195. .v-pagination__item--is-active .v-btn__overlay
  196. opacity: $button-pagination-active-overlay-opacity