cirrus-ui
Version:
A lightweight UI framework written in SCSS
324 lines (271 loc) • 9.96 kB
Plain Text
@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;
}
}
}
}
}