import { css } from 'styled-components'; import { VariantOfType } from '../../variants'; export const CssFocus = css` &:focus-visible { outline: 3px solid var(--color-neutral-800); outline-offset: 0; } `; export const CssActive = css` `; export const CssDisabled = css` &:disabled, &.disabled { pointer-events: none; opacity: 0.5; } `; export const CssDefault = css` display: inline-flex; align-items: center; column-gap: 0.5em; font-size: 1em; line-height: normal; color: inherit; transition: ease 150ms; transition-property: background-color, border-color, color, opacity, text-decoration-color, text-underline-offset; cursor: pointer; ${CssFocus} ${CssActive} ${CssDisabled} `; export const CssResponsive = css` @media (max-width: 399.9px) { display: flex; justify-content: center; align-items: center; } `; export const CssSvg = css` svg { width: 1em; height: 1em; // margin: 0 0.3em; transition: transform ease-in-out 200ms; /* &:first-child { margin-left: 0; } &:last-child { margin-right: 0; } */ } // .card:hover &, &:hover, &.active { svg { transform: scale(1.1); } } `; export const CssUnderline = css` text-decoration: underline 0.1em rgba(0, 0, 0, 0); text-underline-offset: 0.1em; &:hover, &.active { text-decoration-color: currentColor; text-underline-offset: 0.3em; } `; export const CssUnderlineInverted = css` text-decoration: underline 0.1em currentColor; text-underline-offset: 0.1em; &:hover, &.active { text-decoration-color: rgba(0, 0, 0, 0); text-underline-offset: 0.3em; } `; export const CssBackgroundUnderline2 = css` &>* { display: inline; background-image: linear-gradient(90deg, var(--color-secondary-500), currentColor); background-repeat: no-repeat; background-position: bottom left; background-size: 0% 0.1em; transition: background-size 500ms cubic-bezier(0,.97,.43,1); } // .card:hover &, &:hover { &>* { background-size: 100% 0.1em; } } `; export const CssBackgroundUnderline = css` .text[data-text] { position: relative; &:after { content: attr(data-text); position: absolute; display: inline-flex; top: 0; left: 0; background: linear-gradient(to right, transparent, transparent), linear-gradient(to right, var(--color-neutral-800), var(--color-neutral-800)); background-size: 100% 0.05em, 0 0.05em; background-position: 100% 100%, 0 100%; background-repeat: no-repeat; transition: var(--transition-smooth); transition-property: background-size; color: red; } } &:hover, &:focus { .text[data-text] { &:after { background-size: 0 0.05em, 100% 0.05em; } } } `; export const CssAfter = css` &:after { content: ''; display: block; position: absolute; bottom: 0; left: 0; width: 100%; height: 1.1px; background: currentColor; transform: scale(0, 1); transform-origin: left; transition: transform 500ms cubic-bezier(0,.97,.43,1); will-change: transform; } // .card:hover &, &:hover, &.active { &:after { transform: scale(1, 1); } } `; export const CssAfterInverted = css` &:after { content: ''; display: block; position: absolute; bottom: 0; left: 0; width: 100%; height: 1.1px; background: currentColor; transform: scale(1, 1); transform-origin: left; transition: transform 500ms cubic-bezier(0,.97,.43,1); will-change: transform; } // .card:hover &, &:hover, &.active { &:after { transform: scale(0, 1); } } `; export const CssButtonDefault = css` padding: 0.4em 1em; border-radius: var(--button-border-radius); color: var(--color-primary-500); border: 2px solid var(--color-primary-100); // .card:hover &, &:hover, &.active { color: var(--color-primary-600); border-color: var(--color-primary-200); } ${CssSvg} `; export const CssButtonPrimary = css` padding: 0.4em 1em; border-radius: var(--button-border-radius); border: 2px solid transparent; border-color: var(--color-primary-500); background-color: var(--color-primary-500); color: var(--color-neutral-100); // .card:hover &, &:hover, &.active { border-color: var(--color-primary-600); background-color: var(--color-primary-600); color: var(--color-neutral-100); } ${CssSvg} ${CssResponsive} `; export const CssButtonSecondary = css` padding: 0.4em 1em; border-radius: var(--button-border-radius); border: 2px solid var(--color-primary-100); background: var(--color-primary-100); color: var(--color-primary-500); // .card:hover &, &:hover, &.active { border-color: var(--color-primary-200); background-color: var(--color-primary-200); color: var(--color-primary-600); } ${CssSvg} ${CssResponsive} `; export const CssButtonOutline = css` padding: 0.4em 1em; border-radius: var(--button-border-radius); border: 2px solid var(--color-primary-400); background: transparent; color: var(--color-primary-500); // .card:hover &, &:hover, &.active { border-color: var(--color-primary-500); background-color: transparent; color: var(--color-primary-600); } ${CssSvg} ${CssResponsive} `; export const CssButtonGhost = css` padding: 0.4em 1em; border-radius: var(--button-border-radius); border: 2px solid transparent; background: transparent; color: var(--color-neutral-700); // .card:hover &, &:hover, &.active { border-color: var(--color-neutral-300); background-color: transparent; color: var(--color-neutral-900); } ${CssSvg} ${CssResponsive} `; export const CssButtonLink = css` position: relative; color: var(--color-primary-500); // .card:hover &, &:hover, &.active { color: var(--color-primary-600); } ${CssUnderline} ${CssSvg} `; export const CssButtonUnderline = css` position: relative; color: var(--color-neutral-800); // .card:hover &, &:hover, &.active { color: var(--color-neutral-900); } ${CssUnderlineInverted} ${CssSvg} `; export const CssButtonNav = css` position: relative; ${CssUnderline} ${CssSvg} `; export const CssButtonNavInverted = css` position: relative; ${CssUnderlineInverted} ${CssSvg} `; export const CssButtonCircle = css` justify-content: center; width: 3em; height: 3em; border-radius: 50%; border: 2px solid var(--color-neutral-200); background: var(--color-neutral-200); color: var(--color-neutral-700); &>span { font-size: 0; } // .card:hover &, &:hover, &.active { border-color: var(--color-neutral-400); color: var(--color-neutral-900); } ${CssSvg} `; export const CssButtonToggle = css` &:not(.active) { opacity: 0.2; } `; export const buttonVariants = { default: CssButtonDefault, primary: CssButtonPrimary, secondary: CssButtonSecondary, outline: CssButtonOutline, ghost: CssButtonGhost, link: CssButtonLink, underline: CssButtonUnderline, nav: CssButtonNav, circle: CssButtonCircle, toggle: CssButtonToggle, }; export type IButtonVariants = VariantOfType;