521 lines
14 KiB
SCSS
521 lines
14 KiB
SCSS
@import '../config/import';
|
|
|
|
.crayons-btn {
|
|
--brand-apple-bg: #000;
|
|
--brand-apple-color: #fff;
|
|
--brand-apple-bg-hover: #1b1b1b;
|
|
|
|
--brand-twitter-bg: #151616;
|
|
--brand-twitter-color: #fff;
|
|
--brand-twitter-bg-hover: #323436;
|
|
|
|
--brand-github-bg: #24292e;
|
|
--brand-github-color: #fff;
|
|
--brand-github-bg-hover: #000;
|
|
|
|
--brand-facebook-bg: #4267b2;
|
|
--brand-facebook-color: #fff;
|
|
--brand-facebook-bg-hover: #476fbf;
|
|
|
|
--brand-forem-bg: #0a3e4a;
|
|
--brand-forem-color: #fff;
|
|
--brand-forem-bg-hover: #05313b;
|
|
|
|
--brand-email-bg: #24292e;
|
|
--brand-email-color: #fff;
|
|
--brand-email-bg-hover: #000;
|
|
|
|
--brand-google_oauth2-bg: #1da1f2;
|
|
--brand-google_oauth2-color: #fff;
|
|
--brand-google_oauth2-bg-hover: #0096f2;
|
|
}
|
|
|
|
// Basic styling
|
|
.crayons-btn {
|
|
// Setup
|
|
--border-width: 0px;
|
|
--shadow-color: rgba(0, 0, 0, 0.05);
|
|
--vertical-padding: var(--su-2);
|
|
--horizontal-padding: var(--su-4);
|
|
--font-size: var(--fs-base);
|
|
--with-icon-padding: var(--su-3);
|
|
--icon-margin: var(--su-2);
|
|
|
|
position: relative;
|
|
display: inline-block;
|
|
padding: calc(var(--vertical-padding) - var(--border-width))
|
|
calc(var(--horizontal-padding) - var(--border-width));
|
|
border-radius: var(--radius);
|
|
font-family: inherit;
|
|
font-size: var(--font-size);
|
|
line-height: var(--su-6); // intentionally not using $lh-* variable.
|
|
font-weight: var(--fw-medium);
|
|
text-align: center;
|
|
text-decoration: none;
|
|
cursor: pointer;
|
|
transition: all var(--transition-props);
|
|
border: var(--border-width) solid;
|
|
overflow-wrap: normal;
|
|
|
|
// Styles
|
|
--bg: var(--button-primary-bg);
|
|
--bg-hover: var(--button-primary-bg-hover);
|
|
--border: transparent;
|
|
--border-hover: transparent;
|
|
--color: var(--button-primary-color);
|
|
--color-hover: var(--button-primary-color-hover);
|
|
--shadow: 0 1px 3px var(--shadow-color);
|
|
--shadow-hover: 0 2px 5px var(--shadow-color);
|
|
--bg-inverted: var(--button-primary-inverted-bg);
|
|
--bg-inverted-hover: var(--button-primary-inverted-bg-hover);
|
|
--color-inverted: var(--button-primary-inverted-color);
|
|
--color-inverted-hover: var(--button-primary-inverted-color-hover);
|
|
|
|
background-color: var(--bg);
|
|
border-color: var(--border);
|
|
box-shadow: var(--shadow);
|
|
color: var(--color);
|
|
|
|
.js-focus-visible &.focus-visible:focus,
|
|
&:is(label):focus-within {
|
|
background-color: var(--bg-hover);
|
|
color: var(--color-hover);
|
|
z-index: var(--z-elevate);
|
|
}
|
|
|
|
.js-focus-visible &.focus-visible:focus,
|
|
&:is(label):focus-within {
|
|
box-shadow: var(--focus-ring);
|
|
outline: 0;
|
|
}
|
|
|
|
&[href]:hover,
|
|
&[href]:focus,
|
|
&:hover:enabled,
|
|
&:active:enabled {
|
|
background-color: var(--bg-hover);
|
|
border-color: var(--border-hover);
|
|
box-shadow: var(--shadow-hover);
|
|
color: var(--color-hover);
|
|
z-index: var(--z-elevate);
|
|
}
|
|
|
|
&.crayons-btn--inverted {
|
|
--bg: var(--bg-inverted);
|
|
--bg-hover: var(--bg-inverted-hover);
|
|
--border: var(--border-inverted);
|
|
--border-hover: var(--border-inverted-hover);
|
|
--color: var(--color-inverted);
|
|
--color-hover: var(--color-inverted-hover);
|
|
}
|
|
|
|
&[disabled] {
|
|
opacity: 0.6;
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
&--s {
|
|
--vertical-padding: var(--su-1);
|
|
--horizontal-padding: var(--su-3);
|
|
--font-size: var(--fs-s);
|
|
--with-icon-padding: var(--su-2);
|
|
--icon-margin: var(--su-1);
|
|
font-weight: normal;
|
|
}
|
|
|
|
&--l {
|
|
--vertical-padding: var(--su-3);
|
|
--horizontal-padding: var(--su-5);
|
|
--with-icon-padding: var(--su-3);
|
|
--icon-margin: var(--su-2);
|
|
}
|
|
|
|
&--xl {
|
|
--vertical-padding: var(--su-4);
|
|
--horizontal-padding: var(--su-6);
|
|
--font-size: var(--fs-l);
|
|
--with-icon-padding: var(--su-5);
|
|
--icon-margin: var(--su-3);
|
|
}
|
|
|
|
// This makes sure icons inside buttons don't cause problems with click handlers
|
|
// See: https://css-tricks.com/slightly-careful-sub-elements-clickable-things/
|
|
& > * {
|
|
pointer-events: none;
|
|
+ input {
|
|
pointer-events: revert;
|
|
}
|
|
}
|
|
}
|
|
|
|
.crayons-btn--secondary {
|
|
--bg: var(--button-secondary-bg);
|
|
--bg-hover: var(--button-secondary-bg-hover);
|
|
--color: var(--button-secondary-color);
|
|
--color-hover: var(--button-secondary-color-hover);
|
|
}
|
|
|
|
.crayons-btn--outlined {
|
|
--bg: var(--button-outlined-bg);
|
|
--bg-hover: var(--button-outlined-bg-hover);
|
|
--border: var(--button-outlined-border);
|
|
--border-hover: var(--button-outlined-border-hover);
|
|
--color: var(--button-outlined-color);
|
|
--color-hover: var(--button-outlined-color-hover);
|
|
|
|
--border-width: 2px;
|
|
}
|
|
|
|
.crayons-btn--danger {
|
|
--bg: var(--accent-danger);
|
|
--bg-hover: var(--accent-danger-darker);
|
|
--color: var(--base-inverted);
|
|
--color-hover: var(--base-inverted);
|
|
--bg-inverted: var(--accent-danger);
|
|
--bg-inverted-hover: var(--accent-danger-darker);
|
|
--color-inverted: var(--base-inverted);
|
|
--color-inverted-hover: var(--base-inverted);
|
|
}
|
|
|
|
.crayons-btn--success {
|
|
--bg: var(--accent-success);
|
|
--bg-hover: var(--accent-success-darker);
|
|
--color: var(--base-inverted);
|
|
--color-hover: var(--base-inverted);
|
|
--bg-inverted: var(--accent-success);
|
|
--bg-inverted-hover: var(--accent-success-darker);
|
|
--color-inverted: var(--base-inverted);
|
|
--color-inverted-hover: var(--base-inverted);
|
|
}
|
|
|
|
.crayons-btn--warning {
|
|
--bg: var(--accent-warning);
|
|
--bg-hover: var(--accent-warning-darker);
|
|
--color: var(--base-inverted);
|
|
--color-hover: var(--base-inverted);
|
|
--bg-inverted: var(--accent-warning);
|
|
--bg-inverted-hover: var(--accent-warning-darker);
|
|
--color-inverted: var(--base-inverted);
|
|
--color-inverted-hover: var(--base-inverted);
|
|
}
|
|
|
|
.crayons-btn--ghost {
|
|
--bg: var(--button-ghost-bg);
|
|
--bg-hover: var(--button-ghost-bg-hover);
|
|
--color: var(--button-ghost-color);
|
|
--color-hover: var(--button-ghost-color-hover);
|
|
--shadow: none;
|
|
--shadow-hover: none;
|
|
--bg-inverted: var(--button-ghost-inverted-bg);
|
|
--bg-inverted-hover: var(--button-ghost-inverted-bg-hover);
|
|
--color-inverted: var(--button-ghost-inverted-color);
|
|
--color-inverted-hover: var(--button-ghost-inverted-color-hover);
|
|
|
|
&-brand {
|
|
--bg: var(--button-ghost-bg);
|
|
--bg-hover: var(--button-ghost-bg-hover);
|
|
--color: var(--accent-brand);
|
|
--color-hover: var(--accent-brand-darker);
|
|
--shadow: none;
|
|
--shadow-hover: none;
|
|
}
|
|
|
|
&-dimmed {
|
|
--bg: var(--button-ghost-bg);
|
|
--bg-hover: var(--button-ghost-bg-hover);
|
|
--color: var(--button-ghost-dimmed-color);
|
|
--color-hover: var(--button-ghost-dimmed-color-hover);
|
|
--shadow: none;
|
|
--shadow-hover: none;
|
|
}
|
|
|
|
&-success {
|
|
--bg: var(--button-ghost-bg);
|
|
--bg-hover: var(--button-ghost-bg-hover);
|
|
--color: var(--accent-success);
|
|
--color-hover: var(--accent-success-darker);
|
|
--shadow: none;
|
|
--shadow-hover: none;
|
|
--bg-inverted: var(--button-ghost-inverted-bg);
|
|
--bg-inverted-hover: var(--button-ghost-inverted-bg-hover);
|
|
--color-inverted: var(--accent-success);
|
|
--color-inverted-hover: var(--accent-success-darker);
|
|
}
|
|
|
|
&-danger {
|
|
--bg: var(--button-ghost-bg);
|
|
--bg-hover: var(--button-ghost-bg-hover);
|
|
--color: var(--accent-danger);
|
|
--color-hover: var(--accent-danger-darker);
|
|
--shadow: none;
|
|
--shadow-hover: none;
|
|
}
|
|
}
|
|
|
|
.crayons-btn--brand-apple {
|
|
--bg: var(--brand-apple-bg);
|
|
--bg-hover: var(--brand-apple-bg-hover);
|
|
--color: var(--brand-apple-color);
|
|
--color-hover: var(--brand-apple-color);
|
|
--bg-inverted: var(--brand-apple-bg);
|
|
--bg-inverted-hover: var(--brand-apple-bg-hover);
|
|
--color-inverted: var(--brand-apple-color);
|
|
--color-inverted-hover: var(--brand-apple-color);
|
|
}
|
|
|
|
.crayons-btn--brand-twitter {
|
|
--bg: var(--brand-twitter-bg);
|
|
--bg-hover: var(--brand-twitter-bg-hover);
|
|
--color: var(--brand-twitter-color);
|
|
--color-hover: var(--brand-twitter-color);
|
|
--bg-inverted: var(--brand-twitter-bg);
|
|
--bg-inverted-hover: var(--brand-twitter-bg-hover);
|
|
--color-inverted: var(--brand-twitter-color);
|
|
--color-inverted-hover: var(--brand-twitter-color);
|
|
}
|
|
|
|
.crayons-btn--brand-github {
|
|
--bg: var(--brand-github-bg);
|
|
--bg-hover: var(--brand-github-bg-hover);
|
|
--color: var(--brand-github-color);
|
|
--color-hover: var(--brand-github-color);
|
|
--bg-inverted: var(--brand-github-bg);
|
|
--bg-inverted-hover: var(--brand-github-bg-hover);
|
|
--color-inverted: var(--brand-github-color);
|
|
--color-inverted-hover: var(--brand-github-color);
|
|
}
|
|
|
|
.crayons-btn--brand-facebook {
|
|
--bg: var(--brand-facebook-bg);
|
|
--bg-hover: var(--brand-facebook-bg-hover);
|
|
--color: var(--brand-facebook-color);
|
|
--color-hover: var(--brand-facebook-color);
|
|
--bg-inverted: var(--brand-facebook-bg);
|
|
--bg-inverted-hover: var(--brand-facebook-bg-hover);
|
|
--color-inverted: var(--brand-facebook-color);
|
|
--color-inverted-hover: var(--brand-facebook-color);
|
|
}
|
|
|
|
.crayons-btn--brand-forem {
|
|
--bg: var(--brand-forem-bg);
|
|
--bg-hover: var(--brand-forem-bg-hover);
|
|
--color: var(--brand-forem-color);
|
|
--color-hover: var(--brand-forem-color);
|
|
--bg-inverted: var(--brand-forem-bg);
|
|
--bg-inverted-hover: var(--brand-forem-bg-hover);
|
|
--color-inverted: var(--brand-forem-color);
|
|
--color-inverted-hover: var(--brand-forem-color);
|
|
}
|
|
|
|
.crayons-btn--brand-email {
|
|
--bg: var(--brand-email-bg);
|
|
--bg-hover: var(--brand-email-bg-hover);
|
|
--color: var(--brand-email-color);
|
|
--color-hover: var(--brand-email-color);
|
|
--bg-inverted: var(--brand-email-bg);
|
|
--bg-inverted-hover: var(--brand-email-bg-hover);
|
|
--color-inverted: var(--brand-email-color);
|
|
--color-inverted-hover: var(--brand-email-color);
|
|
}
|
|
|
|
.crayons-btn--brand-google_oauth2 {
|
|
--bg: var(--brand-google_oauth2-bg);
|
|
--bg-hover: var(--brand-google_oauth2-bg-hover);
|
|
--color: var(--brand-google_oauth2-color);
|
|
--color-hover: var(--brand-google_oauth2-color);
|
|
--bg-inverted: var(--brand-google_oauth2-bg);
|
|
--bg-inverted-hover: var(--brand-google_oauth2-bg-hover);
|
|
--color-inverted: var(--brand-google_oauth2-color);
|
|
--color-inverted-hover: var(--brand-google_oauth2-color);
|
|
}
|
|
|
|
// Icon alone
|
|
.crayons-btn--icon,
|
|
.crayons-btn--icon-rounded {
|
|
--horizontal-padding: var(--su-2);
|
|
padding-left: calc(var(--horizontal-padding) - var(--border-width));
|
|
padding-right: calc(var(--horizontal-padding) - var(--border-width));
|
|
&.crayons-btn--s {
|
|
--horizontal-padding: var(--su-1);
|
|
}
|
|
|
|
&.crayons-btn--l {
|
|
--horizontal-padding: var(--su-3);
|
|
}
|
|
|
|
&.crayons-btn--xl {
|
|
--horizontal-padding: var(--su-4);
|
|
}
|
|
}
|
|
|
|
.crayons-btn--icon-rounded {
|
|
border-radius: 1000px;
|
|
}
|
|
|
|
// Icon Left
|
|
.crayons-btn--icon-left {
|
|
padding-left: calc(var(--with-icon-padding) - var(--border-width));
|
|
|
|
.crayons-icon {
|
|
margin-right: var(--icon-margin);
|
|
}
|
|
}
|
|
|
|
// Icon Right
|
|
.crayons-btn--icon-right {
|
|
padding-right: calc(var(--with-icon-padding) - var(--border-width));
|
|
|
|
.crayons-icon {
|
|
margin-left: var(--icon-margin);
|
|
}
|
|
}
|
|
|
|
.crayons-btn-actions {
|
|
--btn-wrap-gap: var(--su-2);
|
|
display: flex;
|
|
flex-wrap: wrap;
|
|
align-items: center;
|
|
// add negative margin to correct for the bottom margin on the buttons
|
|
margin-bottom: calc(0rem - var(--btn-wrap-gap));
|
|
margin-left: calc(0rem - var(--btn-wrap-gap));
|
|
|
|
.crayons-btn {
|
|
margin-left: var(--btn-wrap-gap);
|
|
margin-bottom: var(--btn-wrap-gap);
|
|
}
|
|
}
|
|
|
|
// Grouped buttons
|
|
.crayons-btn-group {
|
|
display: flex;
|
|
|
|
.crayons-btn {
|
|
border-radius: 0;
|
|
|
|
+ .crayons-btn:not(.crayons-btn--outlined) {
|
|
box-shadow: var(--shadow), inset 1px 0 0 rgba(0, 0, 0, 0.1);
|
|
margin-left: -1px;
|
|
|
|
&:hover {
|
|
box-shadow: var(--shadow-hover), inset 0 0 0 rgba(0, 0, 0, 0.1);
|
|
}
|
|
}
|
|
|
|
+ .crayons-btn--outlined {
|
|
margin-left: calc(-1 * var(--border-width));
|
|
}
|
|
|
|
&:first-child {
|
|
border-top-left-radius: var(--radius);
|
|
border-bottom-left-radius: var(--radius);
|
|
}
|
|
|
|
&:last-child {
|
|
border-top-right-radius: var(--radius);
|
|
border-bottom-right-radius: var(--radius);
|
|
}
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////
|
|
// .c-btn //////////////////////////////////////////////////
|
|
////////////////////////////////////////////////////////////
|
|
|
|
.c-btn {
|
|
position: relative;
|
|
display: inline-block;
|
|
padding: var(--su-2) var(--su-4);
|
|
border-radius: var(--radius);
|
|
font: inherit;
|
|
text-align: center;
|
|
cursor: pointer;
|
|
border: none;
|
|
overflow-wrap: normal;
|
|
background-color: var(--bg);
|
|
color: var(--color);
|
|
|
|
&:hover:enabled,
|
|
.js-focus-visible &.focus-visible:focus,
|
|
&:is(label):focus-within {
|
|
background-color: var(--bg-hover);
|
|
color: var(--color-hover);
|
|
z-index: var(--z-elevate);
|
|
}
|
|
|
|
.js-focus-visible &.focus-visible:focus,
|
|
&:is(label):focus-within {
|
|
box-shadow: var(--focus-ring);
|
|
outline: 0;
|
|
}
|
|
|
|
&[aria-expanded='true'],
|
|
&[aria-pressed='true'] {
|
|
--bg: var(--btn-current-bg);
|
|
--color: var(--btn-current-color);
|
|
font-weight: var(--fw-bold);
|
|
}
|
|
|
|
&[disabled] {
|
|
opacity: 0.6;
|
|
cursor: not-allowed;
|
|
}
|
|
|
|
// This makes sure icons inside buttons don't cause problems with click handlers
|
|
// See: https://css-tricks.com/slightly-careful-sub-elements-clickable-things/
|
|
& > * {
|
|
pointer-events: none;
|
|
+ input {
|
|
pointer-events: revert;
|
|
}
|
|
}
|
|
}
|
|
|
|
.c-btn {
|
|
--bg: var(--btn-bg);
|
|
--bg-hover: var(--btn-bg-hover);
|
|
--color: var(--btn-color);
|
|
--color-hover: var(--btn-color-hover);
|
|
|
|
&.c-btn--destructive {
|
|
--bg: var(--btn-destructive-bg);
|
|
--bg-hover: var(--btn-destructive-bg-hover);
|
|
--color: var(--btn-destructive-color);
|
|
--color-hover: var(--btn-destructive-color-hover);
|
|
}
|
|
}
|
|
|
|
.c-btn--primary {
|
|
--bg: var(--btn-primary-bg);
|
|
--bg-hover: var(--btn-primary-bg-hover);
|
|
--color: var(--btn-primary-color);
|
|
--color-hover: var(--btn-primary-color-hover);
|
|
|
|
font-weight: var(--fw-medium);
|
|
|
|
&.c-btn--destructive {
|
|
--bg: var(--btn-primary-destructive-bg);
|
|
--bg-hover: var(--btn-primary-destructive-bg-hover);
|
|
--color: var(--btn-primary-destructive-color);
|
|
--color-hover: var(--btn-primary-destructive-color-hover);
|
|
}
|
|
}
|
|
|
|
.c-btn--secondary {
|
|
--bg: var(--btn-secondary-bg);
|
|
--bg-hover: var(--btn-secondary-bg-hover);
|
|
--color: var(--btn-secondary-color);
|
|
--color-hover: var(--btn-secondary-color-hover);
|
|
}
|
|
|
|
.c-btn--icon-alone {
|
|
padding: var(--su-2);
|
|
}
|
|
|
|
.c-btn--icon-left {
|
|
.c-btn__icon {
|
|
margin-right: var(--su-2);
|
|
margin-left: calc(var(--su-1) * -1);
|
|
}
|
|
}
|