rsuite
Version:
A suite of react components
315 lines (263 loc) • 7.61 kB
text/less
// Button base styles
.btn(base) {
display: inline-block;
margin-bottom: 0; // For input.btn
font-weight: @btn-font-weight;
text-align: center;
vertical-align: middle;
cursor: pointer;
outline: 0 ;
white-space: nowrap;
// Reset border style in all browser
border: none;
user-select: none;
.btn-md;
&:hover,
&:focus {
color: @btn-default-color;
text-decoration: none;
}
&:active,
&.@{ns}btn-active {
outline: 0;
background-image: none;
}
}
// Button full styles
.btn() {
.btn(base);
&.@{ns}btn-disabled {
cursor: @cursor-disabled ;
opacity: 0.3;
.@{ns}ripple-pond {
display: none ;
}
}
}
// When browser don't support `pointer-events`,need reset button styles.
.btn-loading-reset(@color,@background-color:transparent) {
&.@{ns}btn-loading {
&:hover,
&:not(.@{ns}btn-disabled):hover,
&:focus,
&:active,
&:hover:active {
color: @color;
background-color: @background-color;
}
}
}
// Subtle button style
.btn-subtle() {
.btn-transition;
.btn-subtle-variant(@btn-subtle-hover-bg);
.btn-loading-reset(@btn-subtle-color);
&.@{ns}btn-disabled {
&,
&:hover,
&:focus,
&:active {
// Reset Opacity;
opacity: 1;
}
}
&:focus,
&.@{ns}btn-focus,
&:hover {
color: @btn-subtle-default-hover-color;
}
&:active,
&.@{ns}btn-active,
.@{ns}open > .@{ns}dropdown-toggle& {
color: @btn-subtle-active-default-color;
background-color: @btn-subtle-active-default-bg;
background-image: none;
&:hover,
&:focus,
&.focus {
color: @btn-subtle-active-default-color;
background-color: @btn-subtle-active-default-bg;
}
}
.generate-spectrum-subtle-btns();
}
// General spectrum buttons
.generate-spectrum-primary-btns(@i:length(@spectrum)) when (@i>0) {
.generate-spectrum-primary-btns(@i - 1);
@name: extract(@spectrum, @i);
@backgroud-color: @@name;
&.@{ns}btn-@{name} {
.button-primary-variant(@btn-primary-color, @backgroud-color);
// Defalut button spectrum button need set opacity.
&.@{ns}btn-default.@{ns}btn-disabled,
.@{ns}dropdown-disabled &.@{ns}btn-default {
opacity: 0.3;
}
}
}
.generate-spectrum-link-btns(@i:length(@spectrum)) when (@i>0) {
.generate-spectrum-link-btns(@i - 1);
@name: extract(@spectrum, @i);
@base-color: @@name;
@color: color(~`palette('@{base-color}', 700) `);
&.@{ns}btn-@{name} {
.btn-link-variant(@color);
}
}
.generate-spectrum-subtle-btns(@i:length(@spectrum)) when (@i>0) {
.generate-spectrum-subtle-btns(@i - 1);
@name: extract(@spectrum, @i);
@color: @@name;
&.@{ns}btn-@{name} {
.btn-subtle-variant(@color);
}
}
.generate-spectrum-ghost-btns(@i:length(@spectrum)) when (@i>0) {
.generate-spectrum-ghost-btns(@i - 1);
@name: extract(@spectrum, @i);
@base-color: @@name;
@color: color(~`palette('@{base-color}', 700) `);
@border-color: @color;
&.@{ns}btn-@{name} {
.btn-ghost-variant(@color, @border-color);
}
}
// Base button size
.button-size(base;@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
padding: @padding-vertical @padding-horizontal;
font-size: @font-size;
line-height: @line-height;
border-radius: @border-radius;
}
// Full button size
.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {
@icon-side-length: @padding-vertical*2 + floor(@font-size* @line-height);
@ghost-icon-side-length: @icon-side-length - @btn-ghost-border-width*2;
@svg-icon-height: @font-size;
.button-size(
base; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius
);
&.@{ns}btn-ghost {
// Ghost button has 1px border
padding-top: (@padding-vertical - 1);
padding-bottom: (@padding-vertical - 1);
}
// Button icon
&.@{ns}btn-icon {
padding-left: @icon-side-length - @padding-horizontal;
height: @icon-side-length;
position: relative;
// Ghost button need minus border-width.
.@{ns}btn-ghost& {
padding-left: @icon-side-length - @padding-horizontal - @btn-ghost-border-width*2;
}
&.@{ns}btn-icon-with-text {
&.@{ns}btn-icon-placement-left {
padding-left: @icon-side-length + @padding-vertical;
}
&.@{ns}btn-icon-placement-right {
padding-left: @padding-base-input-horizontal;
padding-right: @icon-side-length + @padding-vertical;
> .@{ns}icon {
left: auto;
right: 0;
}
}
}
> .@{ns}icon {
position: absolute;
top: 0;
left: 0;
display: block;
width: @icon-side-length;
height: @icon-side-length;
padding: @padding-vertical 0;
font-size: @font-size;
line-height: @line-height;
.@{ns}btn-ghost& {
width: @ghost-icon-side-length;
height: @ghost-icon-side-length;
padding: (@padding-vertical - @btn-ghost-border-width) 0;
}
> svg {
height: @svg-icon-height;
vertical-align: middle;
}
}
}
&.@{ns}btn-icon-circle {
width: @icon-side-length;
padding: @padding-vertical;
}
}
// Base sizes
.btn-sm(base) {
.button-size(base; @padding-small-vertical; @padding-small-horizontal; @font-size-base; @line-height-base; @btn-border-radius-small);
}
.btn-md(base) {
.button-size(base; @padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);
}
.btn-xs(base) {
.button-size(base; @padding-extra-small-vertical; @padding-extra-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);
}
.btn-lg(base) {
.button-size(base; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);
}
// Full sizes
.btn-sm() {
.button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-base; @line-height-base; @btn-border-radius-small);
}
.btn-md() {
.button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);
}
.btn-xs() {
.button-size(@padding-extra-small-vertical; @padding-extra-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);
}
.btn-lg() {
.button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);
}
// Button ripple
.button-ripple(@prefix:~'@{ns}btn-') when (@button-ripple = true) {
overflow: hidden;
position: relative;
.safari-border-radius-overflow-hidden;
&:not(.@{prefix}disabled) {
.@{ns}ripple {
position: absolute;
display: block;
border-radius: 50%;
background-color: @btn-ripple-background-color;
transform: scale(0);
transition: 0s;
&-rippling {
transition: transform 0.55s cubic-bezier(0.4, 0, 0.2, 1),
opacity 1s cubic-bezier(0.4, 0, 0.2, 1);
transform: scale(1);
opacity: 0;
}
&-pond {
content: '';
display: block;
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
pointer-events: none;
}
}
}
}
// Icon Button with text
.btn-icon-with-text(@bg) {
&.@{ns}btn-icon.@{ns}btn-icon-with-text > .@{ns}icon {
background: @bg;
}
}
// Button transition
.btn-transition() {
transition: color 0.2s linear, background-color 0.3s linear;
}
.btn-transition(color) {
transition: color 0.2s linear;
}