Files
sogo/UI/WebServerResources/scss/components/button/button.scss
2015-06-12 11:45:38 -04:00

215 lines
6.0 KiB
SCSS

/// button.scss -*- Mode: text; indent-tabs-mode: nil; basic-offset: 2 -*-
@import 'extends';
// sometimes fabs get squized
.md-button.md-fab {
min-width: $button-fab-width;
}
// Buttons for the sidenav folder tree
// ------------------------------------
sg-folder-tree .md-button,
md-sidenav md-list button.md-button {
padding: 0;
outline: none;
color: inherit;
text-transform: initial;
font-size: sg-size(button);
-webkit-font-smoothing: auto;
}
.sg-folder {
text-align: left;
flex: 1;
}
.sg-active .md-button {
color: sg-color($sogoBlue, 800);
}
md-sidenav .md-button [class ^= "md-icon"] {
margin-right: 1em;
}
md-sidenav .md-button.iconButton.sg-button-navicon [class ^= "md-icon"] {
margin: 0;
}
///
/// iconButton
/// according to Material design specs:
/// @link www.google.com/design/spec/style/icons.html#icons-system-icons
/// @link www.google.com/design/spec/layout/metrics-keylines.html#metrics-keylines-touch-target-size
/// @link www.google.com/design/spec/layout/structure.html#structure-app-bar
/// @require angular-material/components/button
///
/// Buttons here defined are project-wide, so we don't use mixin but variables
/// ----------------------------------------------------------------------------
// Variables
$iconButton-size: $touch-zone-width;
$iconButton-icon-size: sg-size(title);
$iconButton-menu-size: sg-size(headline);
$iconButton-icon-padding: 2px;
$iconButton-size-cursor-coarse: $iconButton-size;
// Could be use to scale-down buttons if desktop layout suffers too much from touch-size
$iconButton-size-cursor-fine: $iconButton-size;
// convenient wrapper for padding calculation todo: write a mixin or a function for a more generic use
$iconButton-padding: ($iconButton-size - ($iconButton-icon-size + ($iconButton-icon-padding * 2))) / 2;
$iconButton-hover-scale: 1.25;
$iconButton-transition: all $swift-ease-in-duration $swift-ease-in-timing-function;
$button-fab-width: 56px;
$button-fab-height: 56px;
// Classes
.iconButton,
.md-button.md-default-theme:not([disabled]).iconButton {
// z-index provides a stacking context that prevent ripple-effect from overflowing
z-index: 1;
overflow: hidden;
padding: $iconButton-padding;
border-radius: 50%;
color: inherit;
transition: $iconButton-transition;
&:hover:not(.md-fab),
&:active {
background-color: transparent;
[class ^= md-icon],
[class *= md-icon-] {
transform: scale($iconButton-hover-scale);
}
}
[class ^= md-icon],
[class *= md-icon-] {
padding: $iconButton-icon-padding;
color: currentColor;
font-size: $iconButton-icon-size;
transition: $iconButton-transition;
}
.md-icon-arrow-back {
font-size: sg-size('headline')
}
.md-ripple-container {
border-radius: 50%;
}
}
md-toolbar .md-toolbar-tools:first-of-type .iconButton,
md-toolbar .md-toolbar-tools:first-child .iconButton,
md-toolbar .md-toolbar-tools.md-toolbar-tools-top .iconButton,
md-toolbar .md-toolbar-tools:not(.md-toolbar-tools-bottom) .iconButton {
margin-top: ($mg * -1);
}
// First button must have it's icon align to margin/padding
md-toolbar .md-toolbar-tools .iconButton:first-child,
.sg-toolbar-group-last .iconButton:first-child {
margin-left: ($mg * -1);
}
md-content.md-padding,
md-card-content {
&> .iconButton:first-child {
margin-top: ($mg * -1);
margin-left: ($mg * -1);
}
}
// Last button must have it's icon align to margin/padding
md-toolbar .md-toolbar-tools .iconButton:last-child,
.sg-toolbar-group-last .iconButton:last-child {
margin-right: ($mg * -1);
}
// Icon-bars are for iconButtons, by default they're vertical and at the right
// the modifier class is to reflect those values and leave place to other versions
.sg-icon-bar--vertical {
display: flex;
flex-direction: column;
margin: 0 ($mg * -1) 0 $mg;
font-size: $sg-font-size-3;
align-items: center;
// Containers have padding, we compensate to align according to specs
justify-content: space-between;
// for transitions
@include at(sm) {
margin-left: $iconButton-padding;
}
}
// NiceToHave: some horizontal or left hand side variant
.sg-icon-bar *.button {
display: block;
}
.md-button.iconButton.md-fab,
// angular-material is overspecifying so we are
.md-button.iconButton.md-fab.md-default-theme:not([disabled]) {
z-index: $z-index-fab;
// flex might stretch or squize fab bottons
min-width: $button-fab-width;
min-height: $button-fab-height;
// this is a temporary fix, see comment in variables
padding: $mg;
margin-right: $mg;
// this is to positioned the button on the toolbar's edge
transform: translate3d(0, -50%, 0);
&:hover {
transform: translate3d(0, -49%, 0);
[class ^= md-icon],
[class *= md-icon-] {
transform: scale($iconButton-hover-scale);
}
}
@include at(sm) {
//position: absolute;
transform: translate3d(-100%, -50%, 0);
&:hover {
transform: translate3d(-100%, -49%, 0);
}
}
i[class|="md-icon"] {
padding: 0;
font-size: sg-size('headline');
}
}
.md-button.iconButton.md-fab.md-fab--bottom {
align-self: flex-end;
// this is to positioned the button on the container's edge
transform: translate3d(-50%, -50%, 0) !important; // at this point important is not worst than long selector
&:hover {
transform: translate3d(-50%, -49%, 0) !important;
}
}
.md-button.iconButton.md-fab.md-fab--bottom-inside {
transform: translate3d(0, (($button-fab-height + $mg) * -1), 0) !important; // at this point important is not worst than long selector
// to prevent empty space at bottom of container
position: absolute;
right: 0;
&:hover {
transform: translate3d(0, (($button-fab-height + $mg - 1) * -1) 0) !important; // at this point important is not worst than long selector
}
}
.sg-button-navicon {
//top: ($mg * -1);
//margin-left: ($mg * -1);
width: $touch-zone;
height: $touch-zone;
}
// angular-material is overspecifying so we are and so we have to continue
.sg-button-navicon.iconButton span.md-icon-menu,
.sg-button-navicon.iconButton i[class|="md-icon"] {
padding: 0;
font-size: $iconButton-menu-size;
}