// sass-lint:disable force-pseudo-nesting force-element-nesting $button-font-family: 'Source Sans Pro', sans-serif; $button-font-weight: $luci-font-weight-semi-bold; $button-font-weight-s: $luci-font-weight-regular; $button-border-radius: $luci-border-radius-default; $button-border-width-m: 2px; $button-border-width-s: 1px; $button-color-blue: $luci-interactive-color-default; $button-color-blue-hover: $luci-interactive-color-hover; $button-color-blue-active: $luci-interactive-color-active; $button-color-white: $luci-color-white; $button-color-purple: $luci-color-purple-60; $button-color-white-hover: $luci-color-neutral-85; $button-text-color-primary: $luci-color-white; $button-background-disabled-color: $luci-color-neutral-85; $button-background-disabled-color-on-dark: $luci-color-neutral-53; $button-text-disabled-color: $luci-color-neutral-76; $button-text-disabled-color-on-dark: $luci-color-neutral-34; $button-font-size: $luci-font-size-md; $button-font-size-s: $luci-font-size-sm; $button-space-inset-m: 12px 32px; $button-space-inset-s: 8px 12px; $button-space-inline-left: 8px; $button-line-height: 1.375; $button-min-height-m: 40px; $button-min-height-s: 30px; $button-icon-size-m: $luci-icon-size-sm; $button-icon-size-s: $luci-icon-size-xs; $button-focus-shadow: 0 0 0 2px $luci-interactive-color-focus; $button-letter-spacing: .5; $variation-properties: ( primary: ( background: $button-color-blue, background-hover: $button-color-blue-hover, background-active: $button-color-blue-active, background-disabled: $button-background-disabled-color, border: solid $button-border-width-m $button-color-blue, border-color-hover: $button-color-blue-hover, border-color-active: $button-color-blue-active, border-color-checked: $button-color-blue-active, border-color-disabled: $button-background-disabled-color, color: $button-text-color-primary, color-hover: $button-text-color-primary, color-active: $button-text-color-primary, color-disabled: $button-text-disabled-color ), primary-on-dark: ( background: $button-color-white, background-hover: $button-color-white-hover, background-active: $button-color-white-hover, background-disabled: $button-background-disabled-color-on-dark, border: solid $button-border-width-m $button-color-white, border-color-hover: $button-color-white-hover, border-color-active: $button-color-white-hover, border-color-checked: $button-color-white-hover, border-color-disabled: $button-background-disabled-color-on-dark, color: $button-color-blue, color-hover: $button-color-blue-hover, color-active: $button-color-blue-active, color-disabled: $button-text-disabled-color-on-dark ), secondary: ( background: $button-color-white, background-hover: $button-color-blue, background-active: $button-color-blue-active, background-disabled: $button-color-white, background-checked: $button-color-purple, border: solid $button-border-width-m $button-color-blue, border-color-hover: $button-color-blue, border-color-active: $button-color-blue-active, border-color-checked: $button-color-purple, border-color-disabled: $button-text-disabled-color, color: $button-color-blue, color-hover: $button-color-white, color-active: $button-color-white, color-checked: $button-color-white, color-disabled: $button-text-disabled-color ) ); @mixin luci-button-styles($variation: 'secondary') { @include luci-text-crop; @include luci-box-sizing; @include luci-font-reset; background: map-get(map-get($variation-properties, $variation), 'background'); border: map-get(map-get($variation-properties, $variation), 'border'); border-radius: $button-border-radius; color: map-get(map-get($variation-properties, $variation), 'color'); cursor: pointer; font-family: $button-font-family; font-size: $button-font-size; font-style: normal; font-weight: $button-font-weight; letter-spacing: $button-letter-spacing; line-height: $button-line-height; margin: 0; padding: $button-space-inset-m; text-decoration: none; vertical-align: top; .luci-button__icon { fill: map-get(map-get($variation-properties, $variation), 'color'); } } @mixin luci-button-hover-styles($variation: 'secondary') { background-color: map-get(map-get($variation-properties, $variation), 'background-hover'); border-color: map-get(map-get($variation-properties, $variation), 'border-color-hover'); color: map-get(map-get($variation-properties, $variation), 'color-hover'); .luci-button__icon { fill: $luci-icon-color-on-interactive; } } @mixin luci-button-active-styles($variation: 'secondary') { background-color: map-get(map-get($variation-properties, $variation), 'background-active'); border-color: map-get(map-get($variation-properties, $variation), 'border-color-active'); color: map-get(map-get($variation-properties, $variation), 'color-active'); .luci-button__icon { fill: $luci-icon-color-on-interactive; } } @mixin luci-button-checked-styles($variation: 'secondary') { background-color: map-get(map-get($variation-properties, $variation), 'background-checked'); border-color: map-get(map-get($variation-properties, $variation), 'border-color-checked'); color: map-get(map-get($variation-properties, $variation), 'color-checked'); .luci-button__icon { fill: $luci-icon-color-on-interactive; } } @mixin luci-button-disabled-styles($variation: 'secondary') { background-color: map-get(map-get($variation-properties, $variation), 'background-disabled'); border-color: map-get(map-get($variation-properties, $variation), 'border-color-disabled'); color: map-get(map-get($variation-properties, $variation), 'color-disabled'); cursor: not-allowed; .luci-button__icon { fill: $luci-icon-color-disabled; } } @mixin luci-button-focus-styles() { border-color: transparent; box-shadow: $button-focus-shadow; outline: none; } ///////////////////////////////////////////// // Secondary (Default) ///////////////////////////////////////////// .luci-button:not(.luci-button--input) { // don't apply styles to input buttons, the __inner element will be styled instead @include luci-button-styles($variation: 'secondary'); display: inline-block; // Non-input buttons are display inline-block by default, input buttons are set to display: inline-flex; min-height: $button-min-height-m; &:hover, &.luci-button--hover { @include luci-button-hover-styles($variation: 'secondary'); } &:active, &.luci-button--active { @include luci-button-active-styles($variation: 'secondary'); } &:disabled, &.luci-button--disabled { @include luci-button-disabled-styles($variation: 'secondary'); } &:focus, &.luci-button--focus { @include luci-button-focus-styles; } } // Secondary input button .luci-button--input { @include luci-font-reset; background: transparent; display: inline-block; position: relative; vertical-align: top; .luci-button__inner { @include luci-button-styles($variation: 'secondary'); min-height: $button-min-height-m; } &:hover, &.luci-button--hover { .luci-button__inner { @include luci-button-hover-styles($variation: 'secondary'); } } &:active, &.luci-button--active { .luci-button__inner { @include luci-button-active-styles($variation: 'secondary'); } } .luci-button__input:checked + { .luci-button__inner { @include luci-button-checked-styles($variation: 'secondary'); } } &.luci-button--disabled, .luci-button__input:disabled + { .luci-button__inner { @include luci-button-disabled-styles($variation: 'secondary'); } } &.luci-button--focus, .luci-button__input:focus + { .luci-button__inner { @include luci-button-focus-styles; } } } ///////////////////////////////////////////// // Primary ///////////////////////////////////////////// .luci-button--primary:not(.luci-button--input) { @include luci-button-styles($variation: 'primary'); &:hover, &.luci-button--hover { @include luci-button-hover-styles($variation: 'primary'); } &:active, &.luci-button--active { @include luci-button-active-styles($variation: 'primary'); } &:disabled, &.luci-button--disabled { @include luci-button-disabled-styles($variation: 'primary'); } &:focus, &.luci-button--focus { @include luci-button-focus-styles; } } // Primary input button .luci-button--primary.luci-button--input { .luci-button__inner { @include luci-button-styles($variation: 'primary'); } &:hover, &.luci-button--hover { .luci-button__inner { @include luci-button-hover-styles($variation: 'primary'); } } // Active & Checked states are the same &:active, &.luci-button--active, .luci-button__input:checked + { .luci-button__inner { @include luci-button-active-styles($variation: 'primary'); } } &.luci-button--disabled, .luci-button__input:disabled + { .luci-button__inner { @include luci-button-disabled-styles($variation: 'primary'); } } &.luci-button--focus, .luci-button__input:focus + { .luci-button__inner { @include luci-button-focus-styles; } } } ///////////////////////////////////////////// // Primary, On Dark ///////////////////////////////////////////// .luci-button--primary-on-dark:not(.luci-button--input) { @include luci-button-styles($variation: 'primary-on-dark'); &:hover, &.luci-button--hover { @include luci-button-hover-styles($variation: 'primary-on-dark'); } &:active, &.luci-button--active { @include luci-button-active-styles($variation: 'primary-on-dark'); } &:disabled, &.luci-button--disabled { @include luci-button-disabled-styles($variation: 'primary-on-dark'); } &:focus, &.luci-button--focus { @include luci-button-focus-styles; } } // Primary input button .luci-button--primary-on-dark.luci-button--input { .luci-button__inner { @include luci-button-styles($variation: 'primary-on-dark'); } &:hover, &.luci-button--hover { .luci-button__inner { @include luci-button-hover-styles($variation: 'primary-on-dark'); } } // Active & Checked states are the same &:active, &.luci-button--active, .luci-button__input:checked + { .luci-button__inner { @include luci-button-active-styles($variation: 'primary-on-dark'); } } &.luci-button--disabled, .luci-button__input:disabled + { .luci-button__inner { @include luci-button-disabled-styles($variation: 'primary-on-dark'); } } &.luci-button--focus, .luci-button__input:focus + { .luci-button__inner { @include luci-button-focus-styles; } } } // .luci-button--icon-only:not(.luci-button--input), // .luci-button--icon-only.luci-button--input .luci-button__inner { // background: transparent; // border: 0; // .luci-button__input:checked + &, // &.luci-button--active, // &:active, // &.luci-button--hover, // &:hover { // background: green; // .luci-button__icon { // fill: $button-color-white; // } // } // } ///////////////////////////////////////////// // Icon Only ///////////////////////////////////////////// .luci-button--icon-only:not(.luci-button--input) { background: transparent; border: 0; padding: $luci-space-sm; .luci-button__icon { fill: $button-color-purple; } // Icon only buttons have unique sizes for small &.luci-button--small { padding: $luci-space-xs; } &:hover, &.luci-button--hover { background: transparent; .luci-button__icon { fill: $luci-icon-color-hover; } } &:active, &.luci-button--active { background: $button-color-purple; .luci-button__icon { fill: $luci-icon-color-on-interactive; } } &:disabled, &.luci-button--disabled { background: transparent; .luci-button__icon { fill: $luci-icon-color-disabled; } } &:focus, &.luci-button--focus { @include luci-button-focus-styles; } } // Input based icon-only buttons .luci-button--icon-only.luci-button--input { .luci-button__inner { background: transparent; border: 0; padding: $luci-space-sm; } .luci-button__icon { fill: $button-color-purple; } // Icon only buttons have unique sizes for small &.luci-button--small { .luci-button__inner { padding: $luci-space-xs; } } // Hover state is separate from Active and Checked &:hover, &.luci-button--hover { background: transparent; .luci-button__icon { fill: $luci-icon-color-hover; } } // Active and Checked states are the same &:active, &.luci-button--active, .luci-button__input:checked + { .luci-button__inner { background: $button-color-purple; } .luci-button__icon { fill: $luci-icon-color-on-interactive; } } &.luci-button--disabled, .luci-button__input:disabled + { .luci-button__icon { fill: $button-color-purple; } } &.luci-button--focus, .luci-button__input:focus + { .luci-button__inner { @include luci-button-focus-styles; } } } ///////////////////////////////////////////// // Utils across all variants ///////////////////////////////////////////// .luci-button__input { @include luci-accessibly-hidden; } .luci-button__inner { align-items: center; background: transparent; display: inline-flex; line-height: $button-line-height; vertical-align: top; } .luci-button__icon--left + .luci-button__text, .luci-button__text + .luci-button__icon--right { margin-left: $button-space-inline-left; } .luci-button__icon { // Don't allow the icon's height to affect the overall height of the button @include n-icon-height-removal; display: block; flex-shrink: 0; height: $button-icon-size-m; width: $button-icon-size-m; .luci-button--small & { height: $button-icon-size-s; width: $button-icon-size-s; } } .luci-button__text { @include luci-text-crop; background: transparent; line-height: $button-line-height; } .luci-button.luci-button--with-icons { // remove text crop from outer block since a button with icons will have text-crop applied on the button__text element &:before, &:after { display: none; } } .luci-button--small:not(.luci-button--input), .luci-button--small.luci-button--input .luci-button__inner { border-width: $button-border-width-s; font-size: $button-font-size-s; font-weight: $button-font-weight-s; letter-spacing: 0; min-height: $button-min-height-s; padding: $button-space-inset-s; }