@mixin button-focus() {
    box-shadow: inset 0 0 0 $border-width $primary-bg;
    background-color: $hover-bg;
    color: $hover-fg;
}

@mixin button-hover() {
    box-shadow: inset 0 0 0 $border-width $border-color;
    background-color: $hover-bg;
    color: $hover-fg;
}

@mixin button-active() {
    box-shadow: inset 0 0 0 $border-width $border-color;
    background-image: $active-gradient;
    background-color: $primary-bg;
    color: $primary-fg;
}

@mixin button-disabled() {
    box-shadow: none;
    background-color: transparent;
    color: transparentize($fg, 0.7);
}

@mixin button($flat: false, $reactive: true, $radius: $radius, $focusable: true) {
    all: unset;
    transition: $transition;
    border-radius: $radius;
    color: $fg;

    @if $flat {
        background-color: transparent;
        background-image: none;
        box-shadow: none;
    }

    @else {
        background-color: $widget-bg;
        box-shadow: inset 0 0 0 $border-width $border-color;
    }

    @if $reactive {
        @if $focusable {
            &:focus {
                @include button-focus;
            }
        }

        &:hover {
            @include button-hover;
        }

        &:active,
        &.on,
        &.active,
        &:checked {
            @include button-active;

            &:hover {
                box-shadow: inset 0 0 0 $border-width $border-color,
                    inset 0 0 0 99px $hover-bg;
            }
        }
    }

    &:disabled {
        @include button-disabled;
    }
}
