@use 'sass:math'
@use 'sass:map'
@use '../../styles/settings'
@use '../../styles/tools'
@use './mixins' as *
@use './variables' as *

.v-btn
  align-items: center
  border-radius: $button-border-radius
  display: inline-grid
  grid-template-areas: "prepend content append"
  grid-template-columns: max-content auto max-content
  font-weight: $button-font-weight
  justify-content: center
  letter-spacing: $button-text-letter-spacing
  line-height: $button-line-height
  max-width: $button-max-width
  outline: none
  position: relative
  text-decoration: none
  text-indent: $button-text-letter-spacing
  text-transform: $button-text-transform
  transition-property: $button-transition-property
  transition-duration: 0.28s
  transition-timing-function: settings.$standard-easing
  user-select: none
  vertical-align: $button-vertical-align
  flex-shrink: 0

  @at-root
    @include button-sizes()
    @include button-density('height', $button-density)

  @include tools.border($button-border...)
  @include tools.position($button-positions)
  @include tools.states('.v-btn__overlay')
  @include tools.variant($button-variants...)

  @supports selector(:focus-visible)
    &::after
      @include tools.absolute(true)
      pointer-events: none
      border: 2px solid currentColor
      border-radius: inherit
      opacity: 0
      transition: opacity .2s ease-in-out

    &:focus-visible::after
      opacity: calc(.25 * var(--v-theme-overlay-multiplier))

  &--icon
    border-radius: $button-icon-border-radius
    min-width: 0
    padding: 0

    // ensure that default
    // v-icon size is 24px
    &.v-btn--size-default
      font-size: $button-icon-font-size

    @at-root &
      @include button-density(('width', 'height'), $button-icon-density)

  &--elevated
    &:hover,
    &:focus
      +tools.elevation(map.get($button-elevation, 'hover'))

    &:active
      +tools.elevation(map.get($button-elevation, 'active'))

  &--flat
    box-shadow: none

  &--block
    display: flex
    flex: 1 0 auto
    min-width: 100%

  &--disabled
    pointer-events: none

    @if ($button-colored-disabled)
      opacity: $button-disabled-opacity
    @else
      opacity: 1
      &.v-btn
        // specificity has to be higher to override theme !important
        color: rgba(var(--v-theme-on-surface), $button-disabled-opacity) !important

    &.v-btn--variant-elevated,
    &.v-btn--variant-flat
      box-shadow: none

      @if ($button-colored-disabled)
        opacity: 1
        color: rgba(var(--v-theme-on-surface), $button-disabled-opacity)
        background: rgb(var(--v-theme-surface))
      @else
        background: rgb(var(--v-theme-surface)) !important

      .v-btn__overlay
        // __overlay uses currentColor, so we need to divide
        // by the text opacity to get the correct value
        opacity: math.div($button-disabled-overlay, $button-disabled-opacity)

  &--loading
    pointer-events: none

    .v-btn__content,
    .v-btn__prepend,
    .v-btn__append
      opacity: 0

  &--stacked
    grid-template-areas: "prepend" "content" "append"
    grid-template-columns: auto
    grid-template-rows: max-content max-content max-content
    justify-items: center
    align-content: center

    .v-btn__content
      flex-direction: column
      line-height: $button-stacked-line-height

    .v-btn__prepend,
    .v-btn__append,
    .v-btn__content > .v-icon--start,
    .v-btn__content > .v-icon--end
      margin-inline-start: 0
      margin-inline-end: 0

    .v-btn__prepend,
    .v-btn__content > .v-icon--start
      margin-bottom: $button-stacked-icon-margin

    .v-btn__append,
    .v-btn__content > .v-icon--end
      margin-top: $button-stacked-icon-margin

    @at-root
      @include button-sizes($button-stacked-sizes, true)
      @include button-density('height', $button-stacked-density)

  &--rounded
    @include tools.rounded($button-rounded-border-radius)

  .v-icon
    --v-icon-size-multiplier: #{calc(18/21)}

  &--icon
    .v-icon
      --v-icon-size-multiplier: 1

  &--stacked
    .v-icon
      --v-icon-size-multiplier: #{calc(24/21)}

.v-btn__loader
  align-items: center
  display: flex
  height: 100%
  justify-content: center
  left: 0
  position: absolute
  top: 0
  width: 100%

.v-btn__content,
.v-btn__prepend,
.v-btn__append
  align-items: center
  display: flex
  transition: $button-content-transition

.v-btn__prepend
  grid-area: prepend
  margin-inline-start: $button-margin-start
  margin-inline-end: $button-margin-end

.v-btn__append
  grid-area: append
  margin-inline-start: $button-margin-end
  margin-inline-end: $button-margin-start

.v-btn__content
  grid-area: content
  justify-content: center
  white-space: $button-white-space

  > .v-icon--start
    margin-inline-start: $button-margin-start
    margin-inline-end: $button-margin-end

  > .v-icon--end
    margin-inline-start: $button-margin-end
    margin-inline-end: $button-margin-start

  .v-btn--stacked &
    white-space: normal

.v-btn__overlay
  background-color: currentColor
  border-radius: inherit
  opacity: 0
  transition: opacity .2s ease-in-out

.v-btn__overlay,
.v-btn__underlay
  @include tools.absolute()
  pointer-events: none

// VAppBar
.v-btn
  .v-app-bar &
    @include tools.elevation($button-app-bar-elevation)

// VCard
.v-btn
  .v-card-actions &
    padding: $button-card-actions-padding

    @include tools.elevation($button-card-actions-elevation)

  ~ .v-btn
    .v-card-actions &
      margin-inline-start: $button-card-actions-margin

// VBanner
.v-btn
  .v-banner-actions &
    padding: $button-banner-actions-padding

// VPagination
.v-btn
  .v-pagination &
    @include tools.rounded($button-pagination-border-radius)

  &__overlay
    transition: none

    .v-pagination__item--is-active &
      opacity: $button-pagination-active-overlay-opacity

// VSnackbar
.v-btn
  .v-snackbar-actions &
    padding: $button-snackbar-action-padding
