UNPKG

cirrus-ui

Version:

A lightweight UI framework written in SCSS

324 lines (271 loc) 9.96 kB
@use 'sass:map'; @use '../src/internal' as *; /* Render the x in the close button */ @mixin btn-close-x($height, $width) { background-color: var(--cirrus-bg); content: ''; display: block; left: 50%; position: absolute; top: 50%; transform: translateX(-50%) translateY(-50%) rotate(45deg); transform-origin: center center; height: $height; width: $width; } @if should-generate-classes($BUTTON) { /* BUTTONS */ /* Button styling */ /* Un-themed */ #{$button-selectors}, a.btn { line-height: 2rem; overflow: hidden; padding: 0.5rem 1rem; border: 1px solid transparent; border-radius: 0.25rem; cursor: pointer; text-align: center; transition: all var(--animation-duration); background-color: rgba(var(--btn-color), var(--bg-opacity)); border-color: rgba(var(--btn-border-color), var(--color-opacity)); color: rgba(var(--btn-fg), var(--color-opacity)); font-size: $font-size-xs; font-weight: inherit; // Reset button if used in <a> tag letter-spacing: 0.03rem; text-transform: uppercase; font-family: map.get($map: $font-families, $key: primary); min-width: 2rem; user-select: none; margin-bottom: 1rem; outline: none; --btn-color: #{hex-to-rgb(fill('gray', '000'))}; --btn-fg: #{hex-to-rgb(fill('gray', '700'))}; --btn-border-color: #{hex-to-rgb(fill('gray', '200'))}; --btn-hover-color: #{hex-to-rgb(fill('gray', '100'))}; /* Base States */ &:hover { background-color: rgba(var(--btn-hover-color), var(--bg-opacity)); transition: all var(--animation-duration); color: rgba(var(--btn-fg), var(--color-opacity)); } &:active { transition: var(--animation-duration) ease; } &:focus { outline: none; &:not([disabled]):not(.btn--disabled) { box-shadow: var(--btn-shadow); } } &:disabled, &.btn--disabled { cursor: not-allowed; opacity: 0.5; &:active { pointer-events: none; } } &.outline { --btn-color: transparent; &:hover { --btn-color: #{hex-to-rgb(fill('gray', '200'))}; } } /* Loading Button*/ /* Make the loading circle, if present, white when button is active */ &.loading:active::after { border-radius: 50%; border-right-color: transparent; border-top-color: transparent; transition: var(--animation-duration) ease; } /* Animated Button */ &.btn-animated { transition: calc(var(--animation-duration) / 2) ease; &:active { transform: scale(0.95); transition: calc(var(--animation-duration) / 2) ease; } } /* Close Button */ &.btn-close { background-color: rgba(10, 10, 10, 0.2); border: none; border-radius: 290486px; cursor: pointer; display: inline-block; flex-grow: 0; flex-shrink: 0; font-size: 0; height: 20px; margin: 0; outline: 0; position: relative; vertical-align: top; width: 20px; padding: 0; min-width: 20px; &:hover { background-color: rgba(10, 10, 10, 0.3); } &::before { @include btn-close-x(2px, 50%); } &::after { @include btn-close-x(50%, 2px); } } /* BUTTON STYLES */ /* Regular */ &.btn-transparent { --btn-color: transparent; --btn-fg: #{hex-to-rgb(fill('dark'))}; --btn-border-color: transparent; --btn-shadow: 0 0 0 0.2rem rgba(246, 249, 252, 0.5); --btn-hover-color: 0, 0, 0; &:hover { --bg-opacity: 0.1; } &.outline { --btn-fg: #{hex-to-rgb(fill('dark'))}; } } &.btn-light { --btn-color: #{hex-to-rgb(fill('light'))}; --btn-fg: #{hex-to-rgb(fill('dark'))}; --btn-border-color: #{hex-to-rgb(fill('light'))}; --btn-shadow: 0 0 0 0.2rem #{transparentize(fill('light'), 0.5)}; --btn-hover-color: #{hex-to-rgb(darken(fill('light'), 10%))}; } &.btn-black { --btn-color: 0, 0, 0; --btn-fg: #{hex-to-rgb(fill('light'))}; --btn-border-color: 0, 0, 0; --btn-shadow: 0 0 0 0.2rem #{transparentize(fill('dark'), 0.5)}; --btn-hover-color: 0, 0, 0; } @each $color, $value in $control-themes { &.btn-#{$color} { --btn-color: #{hex-to-rgb(map.get($value, bg))}; --btn-fg: #{hex-to-rgb(map.get($value, fg))}; --btn-border-color: #{hex-to-rgb(map.get($value, bg))}; --btn-shadow: 0 0 0 0.2rem #{transparentize(map.get($value, bg), 0.5)}; --btn-hover-color: #{hex-to-rgb(darken(map.get($value, bg), 10%))}; } } @each $size, $property-map in $button-sizes { &.btn--#{$size} { @include explode-properties($property-map); } } /* GLYPHS */ .fa-wrapper { // /* Override default behavior of aligning font awesome icons to the top */ FontAwesome no longer does this, no need for override // vertical-align: baseline; &.pad-right { margin-right: 0.4rem; } &.pad-left { margin-left: 0.4rem; } } /* Alternatives to pad-left and pad-right */ span:first-child { margin-right: 0.2rem; } span:last-child { margin-left: 0.2rem; } } /* Links as Buttons */ a.btn { display: inline-flex; } [class^='btn-']:not(.btn-container):not(.btn-close), [class*=' btn-']:not(.btn-container):not(.btn-close) { background-color: rgba(var(--btn-color), var(--bg-opacity)); border: 1px solid rgba(var(--btn-border-color), var(--color-opacity)); color: rgba(var(--btn-fg), var(--color-opacity)); transition: all var(--animation-duration); &:hover { background-color: rgba(var(--btn-hover-color), var(--bg-opacity)); border-color: rgba(var(--btn-border-color), var(--color-opacity)); transition: all var(--animation-duration); } /* Outline Variants */ &.outline { background-color: transparent; color: rgba(var(--btn-color), var(--color-opacity)); &:hover { background-color: rgba(var(--btn-hover-color), var(--bg-opacity)); color: rgba(var(--btn-fg), var(--color-opacity)); transition: all var(--animation-duration); } &.btn-transparent { color: #{hex-to-rgb(fill('gray', '700'))} !important; } } } /* Make the loader white so it is visible */ .loading.btn-accent:after { border: 2px solid #fff; border-right-color: transparent; border-top-color: transparent; } /* BUTTON GROUPS */ /* Will group buttons with components in a single component */ .btn-group { display: inline-flex; #{$button-selectors} { flex: 1 0 auto; margin: 0; &:first-child:not(:last-child) { /* Style the first child in group > 1 buttons */ border-top-right-radius: 0; border-bottom-right-radius: 0; } &:last-child:not(:first-child) { /* Style the last child in group > 1 buttons */ border-top-left-radius: 0; border-bottom-left-radius: 0; margin-left: -1px; } &:not(:first-child):not(:last-child) { /* Style button in middle of group */ border-radius: 0; /* Remove roundness from center buttons */ margin-left: -1px; } @include elevate-on-focus(); } &.btn-group-fill { /* Makes the button group fill the width and proportion the buttons to fill the space */ display: flex; #{$button-selectors} { flex: 1 0; /* Make the buttons fill the available width and proportion themselves */ } &:focus { z-index: 1; } } } @include screen-below($sm) { .btn-group { display: flex; flex-direction: column; #{$button-selectors} { margin-bottom: -1px; &:first-child:not(:last-child) { border-radius: 0.25rem 0.25rem 0 0; } &:not(:first-child):not(:last-child) { margin-left: 0; } &:last-child:not(:first-child) { border-radius: 0 0 0.25rem 0.25rem; margin-left: 0; } } } } }