now-design-atoms
Version:
Atomic UI components for now-design.
440 lines (365 loc) • 11.3 kB
CSS
/* Button Base Layout */
.button {
display: inline-flex;
min-width: 40px;
min-height: 40px;
padding: calc(var(--gapSpacing-200) * 1px);
justify-content: center;
align-items: center;
gap: calc(var(--gapSpacing-200) * 1px);
border: none;
cursor: pointer;
transition: all 0.2s ease;
font-family: inherit;
text-decoration: none;
position: relative;
outline: none;
}
/* CSS-only focus management - Only show outline for keyboard focus */
.button:focus {
outline: none;
}
.button:focus-visible {
outline: calc(var(--strokeWidth-s, 1) * 1px) solid var(--normal-border-active, #1579BE);
outline-offset: calc(var(--gapSpacing-100, 4) * 1px);
border-radius: calc(var(--cornerRadius-l, 12) * 1px);
}
/* Button Icons */
.button__icon {
display: flex;
align-items: center;
justify-content: center;
flex-shrink: 0;
width: 20px;
height: 20px;
aspect-ratio: 1/1;
fill: var(--normal-icon-action, #1579BE);
}
.button__icon--left {
order: 1;
}
.button__icon--right {
order: 3;
}
/* Button Text */
.button__text {
order: 2;
margin: 0;
white-space: nowrap;
text-align: center;
}
/* Loading State */
.button__loading {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
display: flex;
align-items: center;
justify-content: center;
}
.button__loading-spinner {
width: 16px;
height: 16px;
border: 2px solid transparent;
border-top: 2px solid currentColor;
border-radius: 50%;
animation: button-spin 1s linear infinite;
}
@keyframes button-spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
/* PRIMARY BUTTON */
.button--primary {
background: var(--normal-surface-action, #1579BE);
color: var(--normal-typography-onAction, #FFF);
text-align: center;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--primary .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--primary:hover {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
}
.button--primary:hover .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--primary:focus-visible {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border: none;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--primary:focus-visible .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--primary:disabled {
background: var(--normal-surface-disabled, #E6E6E6);
color: var(--normal-typography-onDisabled, #808080);
cursor: not-allowed;
}
.button--primary:disabled .button__icon {
fill: var(--normal-icon-onDisabled, #808080);
}
/* Primary Error State */
.button--primary.button--error {
background: var(--normal-surface-error, #FAD8D5);
color: var(--normal-typography-onError, #89251A);
}
.button--primary.button--error .button__icon {
fill: var(--normal-icon-onError, #89251A);
}
.button--primary.button--error:hover {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
}
.button--primary.button--error:hover .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--primary.button--error:focus-visible {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border: none;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--primary.button--error:focus-visible .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
/* Primary Success State */
.button--primary.button--success {
background: var(--normal-surface-success, #D5ECDB);
color: var(--normal-typography-onSuccess, #1A612E);
}
.button--primary.button--success .button__icon {
fill: var(--normal-icon-onSuccess, #1A612E);
}
.button--primary.button--success:hover {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
}
.button--primary.button--success:hover .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--primary.button--success:focus-visible {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border: none;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--primary.button--success:focus-visible .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
/* SECONDARY BUTTON */
.button--secondary {
background: transparent;
color: var(--normal-typography-action, #1579BE);
border: calc(var(--strokeWidth-s) * 1px) solid var(--normal-border-action, #1579BE);
text-align: center;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--secondary .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
.button--secondary:hover {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border-color: var(--normal-surface-actionHover, #0D4972);
}
.button--secondary:hover .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--secondary:focus-visible {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border: calc(var(--strokeWidth-s) * 1px) solid #1a1a1a;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--secondary:focus-visible .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--secondary:disabled {
background: transparent;
border: calc(var(--strokeWidth-s) * 1px) solid var(--normal-border-primary, #CCC);
color: var(--normal-typography-disabled, #B3B3B3);
cursor: not-allowed;
}
.button--secondary:disabled .button__icon {
fill: var(--normal-icon-disabled, #B3B3B3);
}
/* Secondary Error State */
.button--secondary.button--error {
background: transparent;
color: var(--normal-typography-error, #E43E2B);
border: calc(var(--strokeWidth-s) * 1px) solid var(--normal-border-error, #E43E2B);
}
.button--secondary.button--error .button__icon {
fill: var(--normal-icon-error, #E43E2B);
}
.button--secondary.button--error:hover {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border-color: var(--normal-surface-actionHover, #0D4972);
}
.button--secondary.button--error:hover .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--secondary.button--error:focus-visible {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border: calc(var(--strokeWidth-s) * 1px) solid #1a1a1a;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--secondary.button--error:focus-visible .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
/* Secondary Success State */
.button--secondary.button--success {
background: transparent;
color: var(--normal-typography-success, #2BA24C);
border: calc(var(--strokeWidth-s) * 1px) solid var(--normal-border-success, #2BA24C);
}
.button--secondary.button--success .button__icon {
fill: var(--normal-icon-success, #2BA24C);
}
.button--secondary.button--success:hover {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border-color: var(--normal-surface-actionHover, #0D4972);
}
.button--secondary.button--success:hover .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
.button--secondary.button--success:focus-visible {
background: var(--normal-surface-actionHover, #0D4972);
color: var(--normal-typography-onAction, #FFF);
border: calc(var(--strokeWidth-s) * 1px) solid #1a1a1a;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--secondary.button--success:focus-visible .button__icon {
fill: var(--normal-icon-onAction, #FFF);
}
/* TRANSPARENT BUTTON */
.button--transparent {
background: transparent;
color: var(--normal-typography-action, #1579BE);
text-align: center;
border-radius: calc(var(--cornerRadius-m) * 1px);
border: none;
}
.button--transparent .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
.button--transparent:hover {
background: var(--normal-surface-hover, #D0E4F2);
color: var(--normal-typography-action, #1579BE);
border: none;
}
.button--transparent:hover .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
.button--transparent:focus-visible {
background: var(--normal-surface-hover, #D0E4F2);
color: var(--normal-typography-action, #1579BE);
border: none;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--transparent:focus-visible .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
.button--transparent:disabled {
background: transparent;
color: var(--normal-typography-disabled, #B3B3B3);
cursor: not-allowed;
border: none;
}
.button--transparent:disabled .button__icon {
fill: var(--normal-icon-disabled, #B3B3B3);
}
/* Transparent Error State */
.button--transparent.button--error {
background: transparent;
color: var(--normal-typography-error, #E43E2B);
border: none;
}
.button--transparent.button--error .button__icon {
fill: var(--normal-icon-error, #E43E2B);
}
.button--transparent.button--error:hover {
background: var(--normal-surface-hover, #D0E4F2);
color: var(--normal-typography-action, #1579BE);
border: none;
}
.button--transparent.button--error:hover .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
.button--transparent.button--error:focus-visible {
background: var(--normal-surface-hover, #D0E4F2);
color: var(--normal-typography-action, #1579BE);
border: none;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--transparent.button--error:focus-visible .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
/* Transparent Success State */
.button--transparent.button--success {
background: transparent;
color: var(--normal-typography-success, #2BA24C);
border: none;
}
.button--transparent.button--success .button__icon {
fill: var(--normal-icon-success, #2BA24C);
}
.button--transparent.button--success:hover {
background: var(--normal-surface-hover, #D0E4F2);
color: var(--normal-typography-action, #1579BE);
border: none;
}
.button--transparent.button--success:hover .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
.button--transparent.button--success:focus-visible {
background: var(--normal-surface-hover, #D0E4F2);
color: var(--normal-typography-action, #1579BE);
border: none;
border-radius: calc(var(--cornerRadius-m) * 1px);
}
.button--transparent.button--success:focus-visible .button__icon {
fill: var(--normal-icon-action, #1579BE);
}
/* Loading State */
.button--loading {
pointer-events: none;
}
.button--loading .button__icon,
.button--loading .button__text {
opacity: 0;
}
/* Responsive adjustments */
@media (max-width: 768px) {
.button {
min-width: 36px;
min-height: 36px;
padding: calc(var(--gapSpacing-150) * 1px);
gap: calc(var(--gapSpacing-150) * 1px);
}
.button__icon {
width: 18px;
height: 18px;
}
}
@media (max-width: 480px) {
.button {
min-width: 32px;
min-height: 32px;
padding: calc(var(--gapSpacing-100) * 1px);
gap: calc(var(--gapSpacing-100) * 1px);
}
.button__icon {
width: 16px;
height: 16px;
}
}