/** * generates base style rules for both tabs and buttons * * @param {string} [$base-cls='button'] * * @param {string} [$btn-display=inline-block] * * @param {boolean} [$include-arrows=true] * * @param {boolean} [$flexbox=true] * * @member Ext.button.Button * @private */ @mixin extjs-button-base( $base-cls: 'btn', $btn-display: inline-block, $include-arrows: true, $flexbox: true ) { .#{$prefix}#{$base-cls} { display: $btn-display; outline: 0; cursor: pointer; white-space: nowrap; text-decoration: none; vertical-align: top; overflow: hidden; // buttons are position:relative because they may contain an absolutely positioned // pseudo element for imitating box-shadow in IE8 when used in a segmented button // see extjs-button-ui position: relative; > .#{$prefix}frame { height: 100%; width: 100%; } } .#{$prefix}#{$base-cls}-wrap { height: 100%; width: 100%; @if $flexbox { @include ext-box; @include ext-box-align(stretch); &.#{$prefix}btn-arrow-bottom, &.#{$prefix}btn-split-bottom { @include ext-box-orient(vertical); } @if $include-ie { .#{$prefix}ie9m & { display: table; border-spacing: 0; } } } @else { display: table; border-spacing: 0; } } .#{$prefix}#{$base-cls}-button { white-space: nowrap; line-height: 0; // this element must be position:relative so that the split line can be absolutely // positioned inside of it position: relative; @if $flexbox { @include ext-box; @include ext-box-align(center); @include ext-box-flex; &.#{$prefix}#{$base-cls}-icon-top, &.#{$prefix}#{$base-cls}-icon-bottom { @include ext-box-orient(vertical); @include ext-box-align(stretch); @include ext-box-pack(center); @if $include-ie { // Button is not correctly sized horizontally in IE10 and 11 // when icon is placed above/below .#{$prefix}ie10p & { overflow: hidden; } } } @if $include-ie { .#{$prefix}ie9m & { display: table-cell; vertical-align: middle; } } } @else { display: table-cell; vertical-align: middle; } } .#{$prefix}#{$base-cls}-inner { overflow: hidden; text-overflow: ellipsis; @if $flexbox { -ms-flex-negative: 1; display: block; @if $include-ie { .#{$prefix}ie9m & { display: inline-block; vertical-align: middle; } } } @else { display: inline-block; vertical-align: middle; } .#{$prefix}#{$base-cls}-icon.#{$prefix}#{$base-cls}-no-text > & { display: none; } } .#{$prefix}#{$base-cls}-icon-el { display: none; vertical-align: middle; text-align: center; background-position: center center; background-repeat: no-repeat; @if $flexbox { flex-shrink: 0; .#{$prefix}#{$base-cls}-icon > & { display: block; } @if $include-ie { .#{$prefix}ie9m .#{$prefix}#{$base-cls}-icon-left > &, .#{$prefix}ie9m .#{$prefix}#{$base-cls}-icon-right > & { display: inline-block; } } } @else { .#{$prefix}#{$base-cls}-icon > & { display: inline-block; } .#{$prefix}#{$base-cls}-icon-top > &, .#{$prefix}#{$base-cls}-icon-bottom > & { display: block; } } } .#{$prefix}#{$base-cls}-button-center { @if $include-ie { .#{$prefix}ie9m & { text-align: center; } } @if $flexbox { @include ext-box-pack(center); } &.#{$prefix}#{$base-cls}-icon-top, &.#{$prefix}#{$base-cls}-icon-bottom { text-align: center; } } .#{$prefix}#{$base-cls}-button-left { text-align: left; @if $flexbox { @include ext-box-pack(start); } } @if $include-rtl { .#{$prefix}rtl.#{$prefix}#{$base-cls}-button-left { text-align: right; } } .#{$prefix}#{$base-cls}-button-right { text-align: right; @if $flexbox { @include ext-box-pack(end); } } .#{$prefix}#{$base-cls}-tooltip { display: none; position: absolute; pointer-events: auto; top: 0; bottom: 0; left: 0; right: 0; .#{$prefix}btn-disabled & { display: block; } } @if $include-rtl { .#{$prefix}rtl.#{$prefix}#{$base-cls}-button-right { text-align: left; } } @if $include-arrows { .#{$prefix}#{$base-cls}-arrow:after, .#{$prefix}#{$base-cls}-split:after { display: block; background-repeat: no-repeat; content: ''; // pseudo elements don't match wildcard selectors, so ".x-border-box *" will not apply // to this element box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; -webkit-box-sizing: border-box; text-align: center; } .#{$prefix}#{$base-cls}-arrow-right:after, .#{$prefix}#{$base-cls}-split-right:after { background-position: right center; @if $flexbox { @include ext-box; @include ext-box-align(center); @include ext-box-pack(center); @if $include-ie { .#{$prefix}ie9m & { display: table-cell; vertical-align: middle; } } } @else { display: table-cell; vertical-align: middle; } } @if $include-rtl { .#{$prefix}rtl { &.#{$prefix}#{$base-cls}-arrow-right:after, &.#{$prefix}#{$base-cls}-split-right:after { background-position: left center; } } } .#{$prefix}#{$base-cls}-arrow-bottom:after, .#{$prefix}#{$base-cls}-split-bottom:after { background-position: center bottom; // when this pseudo el is display:table-row (with no table-cell inside) in needs // content other than emtpy or space in order to render in some browsers (IE8-11), // so use non-breaking space content: '\00a0'; // line-height:0 prevents the pseudo el from inheriting line-height and being // taller than specified by $icon-size. line-height: 0; @if $flexbox { @if $include-ie { .#{$prefix}ie9m & { display: table-row; } } } @else { display: table-row; } } // placeholder pseudo element for split line when line is not contained in arrow image .#{$prefix}#{$base-cls}-split-right > .#{$prefix}btn-button:after { position: absolute; display: block; top: -100%; right: 0; height: 300%; content: ''; } @if $include-rtl { .#{$prefix}rtl.#{$prefix}#{$base-cls}-split-right > .#{$prefix}btn-button:after { left: 0; right: auto; } } // placeholder pseudo element for split line when line is not contained in arrow image .#{$prefix}#{$base-cls}-split-bottom > .#{$prefix}btn-button:after { position: absolute; display: block; bottom: 0; left: -100%; font-size: 0; width: 300%; content: ''; } } .#{$prefix}#{$base-cls}-mc { // buttons and tabs can have a focus outline on the btnWrap element. The default // overflow:hidden styling of the frame body hides the outline, so override it to // overflow:visible. overflow: visible; } }