/*********
 ! Buttons
**********/

$shadow_strength: .3;	

@include exports("button_extends") {
	%button {
		padding: $spacing ($spacing + 2px);
		border-width: 1px;
		border-style: solid;
		border-radius: $roundness;
		transition: 150ms ease;
		outline-color: transparent;

		-GtkWidget-focus-padding: 1;
		-GtkWidget-focus-line-width: 0;

        &:focus, &:hover, &:active { transition: none; }
	}

	%linked_middle {
		border-radius: 0;
		border-left-style: none;
		border-right-style: solid;

		&:dir(rtl) {
			border-radius: 0; // needed when including %linked_middle:dir(rtl)
			border-right-style: none;
			border-left-style: solid
		}
	}

	%linked_button {
		border-width: 1px;
		border-style: solid;
		border-radius: 0;
		border-right-style: none;
		border-left-style: none;

		&:first-child {
			border-width: 1px;
			border-radius: $roundness;
			border-left-style: solid;
			border-right-style: none;
			border-top-right-radius: 0;
			border-bottom-right-radius: 0;

			&:dir(rtl) {
				border-left-style: none;
				border-right-style: solid;
			}
		}

		&:last-child {
			border-width: 1px;
			border-radius: $roundness;
			border-left-style: none;
			border-right-style: solid;
			border-top-left-radius: 0;
			border-bottom-left-radius: 0;

			&:dir(rtl) {
				border-left-style: solid;
				border-right-style: none;
			}
		}

		&:only-child, &:first-child:only-child {
			border-width: 1px;
			border-style: solid;
			border-radius: $roundness;
		}
	}
}

@mixin linked_button($bg) {
	@extend %linked_button;

	box-shadow: inset -1px 0 border_normal(rgba(0,0,0,.12)),
				0 1px 2px -1px alpha($dark_shadow, .12 + $shadow_strength);

	&:focus, &:hover {
		box-shadow: inset -1px 0 border_focus(rgba(0,0,0,.12)),
					0 1px 2px -1px alpha($dark_shadow, .32 + $shadow_strength);
	}

	&:active, &:active:hover,
	&:active:focus, &:active:hover:focus,
	&:checked, &:checked:hover,
	&:checked:focus, &:checked:hover:focus {
		box-shadow: inset -1px 0 border_active(rgba(0,0,0,.12)),
					inset 0 1px alpha($dark_shadow, .07),
					inset 0 -1px alpha($dark_shadow, .05);
	}

	&:insensitive { box-shadow: inset -1px 0 shade($bg, .8); }

	&:last-child, &:only-child { box-shadow: 0 1px 2px -1px alpha($dark_shadow, .12 + $shadow_strength); }

	&:last-child:hover, &:only-child:hover { box-shadow: 0 1px 2px -1px alpha($dark_shadow, .32 + $shadow_strength); }

	&:insensitive:last-child, &:insensitive:only-child,
	&:active:insensitive:last-child, &:active:insensitive:only-child,
	&:checked:insensitive:last-child, &:checked:insensitive:only-child { box-shadow: none; }

	&:active:last-child, &:active:last-child:focus, &:active:last-child:hover, &:active:last-child:hover:focus,
	&:checked:last-child, &:checked:last-child:focus, &:checked:last-child:hover, &:checked:last-child:hover:focus, {
		box-shadow: inset 0 1px alpha($dark_shadow, .07),
					inset -1px 0 alpha($dark_shadow, .06);
	}

	&:active:only-child, &:active:only-child:focus, &:active:only-child:hover, &:active:only-child:hover:focus,
	&:checked:only-child, &:checked:only-child:focus, &:checked:only-child:hover, &:checked:only-child:hover:focus {
		box-shadow: inset 1px 0 alpha($dark_shadow, .06),
					inset 0 1px alpha($dark_shadow, .07),
					inset -1px 0 alpha($dark_shadow, .06);
	}
}

@mixin button($bg, $fg) {
	@extend %button;
	@include linear-gradient(shade($bg, 1.3));
	@include border(rgba(0,0,0,.12));

	color: $fg;
	box-shadow: 0 1px 2px -1px alpha($dark_shadow, .12 + $shadow_strength);
	border-color: alpha($bg, 0);

	&.flat {
		border-color: alpha($bg, 0);
		background-color: alpha($bg, 0);
		background-image: none;
		box-shadow: none;
	}

	&, &.flat {
		&:focus, &:hover {
			@include linear-gradient(shade($bg, 1.4));

			border-color: alpha($bg, 0);
			box-shadow: 0 1px 2px -1px alpha($dark_shadow, .32 + $shadow_strength);
		}

		&:active, &:checked {
			@include linear-gradient(shade($bg, .9), to top);

			color: $fg;
			box-shadow: inset 1px 0 alpha($dark_shadow, .06),
						inset 0 1px alpha($dark_shadow, .07),
						inset -1px 0 alpha($dark_shadow, .06),
						inset 0 -1px alpha($dark_shadow, .05);
		}

		&:active:insensitive, &:checked:insensitive {
			@include linear-gradient(shade($bg, .8));

			color: $fg;
			box-shadow: none;
		}

        &:insensitive:insensitive {
            @if (lightness($bg) > 50) {
                @include linear-gradient(shade($bg, .95));
            } @else {
                @include linear-gradient(alpha($bg, .3));
            }

            color: mix($bg, $fg, .5);
            box-shadow: none;
        }
	}

	&.separator, .separator {
		border: 1px solid currentColor;
		color: shade($bg, ($contrast + .1));

		&:insensitive { color: shade($bg, .85); }
	}
}

@include exports("button") {
	* {
		-GtkButton-child-displacement-x: 0;
		-GtkButton-child-displacement-y: 0;
		-GtkButton-default-border: 0;
		-GtkButton-image-spacing: 0;
		-GtkButton-inner-border: 1;
		-GtkButton-interior-focus: true;
		-GtkButtonBox-child-min-height: 24;
		-GtkButtonBox-child-internal-pad-y: 1;
		-GtkToolButton-icon-spacing: 6;
	}

	%close_button {
		border: 1px solid transparent;
		background-color: transparent;
		background-image: none;
		box-shadow: none;

		&:focus, &:hover {
			border: 1px solid alpha(black, .3);
			background-color: alpha(white, .2);
			background-image: none;
			box-shadow: none;
		}

		&:active, &:checked, &:active:hover, &:checked:hover  {
			border: 1px solid alpha(black, .3);
			background-color: alpha(black, .1);
			background-image: none;
			box-shadow: none;
		}
	}

	.button {
		@include button($bg_color, $fg_color);

		&.default { @include button($selected_bg_color, $selected_fg_color); }

		&.linked, .linked & { @include linked_button(shade($bg_color, 1.2)); }

		.spinbutton & {
			color: mix($text_color, $base_color, .4);
			padding: $spacing ($spacing * 2);
			border: none;
			border-radius: 0;
			border-style: none;
			background-color: transparent;
			background-image: none;
			box-shadow: inset 1px 0 shade($base_color, .9);

			&:insensitive {
				color: mix($text_color, $base_color, .7);
				box-shadow: inset 1px 0 shade($base_color, .85);
			}

			&:active, &:checked, &:hover { color: $text_color; }

			&:first-child {
				border-radius: $roundness 0 0 $roundness;
				box-shadow: none;
			}

			&:last-child { border-radius: 0 $roundness $roundness 0; }

			&:dir(rtl) { box-shadow: inset -1px 0 shade($base_color, .9); }
		}

		.spinbutton.vertical & {
			border: 1px solid shade($bg_color, .8);
			border-radius: $roundness;
			background-color: shade($bg_color, 1.08);
			background-image: none;
			color: $fg_color;
			box-shadow: none;

			&:hover {
				border-color: shade($bg_color, .7);
				background-color: shade($bg_color, 1.1);
				background-image: none;
			}

			&:active, &:checked {
				border-color: shade($bg_color, .8);
				background-color: shade($bg_color, .95);
				background-image: none;
			}

			&:active:hover, &:checked:hover {
				border-color: shade($bg_color, .7);
			}

			&:focus, &:hover:focus, &:active:focus, &:active:hover:focus { border-color: shade($bg_color, .7); }

			&:insensitive {
				border-color: shade($bg_color, .85);
				background-color: shade($bg_color, .9);
				background-image: none;
			}

			&:first-child {
				border-width: 1px;
				border-bottom-width: 0;
				border-bottom-right-radius: 0;
				border-bottom-left-radius: 0;
			}

			&:last-child {
				border-width: 1px;
				border-top-width: 0;
				border-top-left-radius: 0;
				border-top-right-radius: 0;
			}
		}

		.spinbutton.vertical.entry {
			border-width: 1px;
			border-style: solid;
			border-radius: 0;
		}
	}
}


/******************
! ComboBoxes *
*******************/

@include exports("combobox") {
	GtkComboBox {
		> .button {
			padding: ($spacing - 2px) ($spacing + 1px);

			-GtkComboBox-arrow-scaling: .5;
			-GtkComboBox-shadow-type: none;
		}

		&.combobox-entry {
			.entry, .button { @extend %linked_button; }
		}

		.separator {
			/* always disable separators */
			-GtkWidget-wide-separators: true;
			-GtkWidget-horizontal-separator: 0;
			-GtkWidget-vertical-separator: 0;

			border-style: none;
		}
	}

	.linked > GtkComboBox {
		> .button {
			// the combo is a composite widget so the way we do button linked doesn't
			// work, special case needed. See
			// https://bugzilla.gnome.org/show_bug.cgi?id=733979
			&:dir(ltr) { @extend %linked_middle; } // specificity bump
			&:dir(rtl) { @extend %linked_middle:dir(rtl); }
		}

		&:first-child > .button { @extend %linked_button:first-child; }

		&:last-child > .button { @extend %linked_button:last-child; }

		&:only-child > .button { @extend %linked_button:only-child; }
	}
}