diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-05-24 19:35:12 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2022-05-24 19:35:12 +0200 |
| commit | c85ab5ad43ccf52881ee224672c41ec30021cf48 (patch) | |
| tree | 8058808d9bfca19383f120c46b34d99ff2f89f63 /src/components/Buttons | |
| parent | 52404177c07a2aab7fc894362fb3060dff2431a0 (diff) | |
| parent | 11b9de44a4b2f305a6a484187805e429b2767118 (diff) | |
refactor: use storybook and atomic design (#16)
BREAKING CHANGE: rewrite most of the Typescript types, so the content format (the meta in particular) needs to be updated.
Diffstat (limited to 'src/components/Buttons')
| -rw-r--r-- | src/components/Buttons/Button/Button.tsx | 35 | ||||
| -rw-r--r-- | src/components/Buttons/ButtonHelp/ButtonHelp.module.scss | 52 | ||||
| -rw-r--r-- | src/components/Buttons/ButtonHelp/ButtonHelp.tsx | 42 | ||||
| -rw-r--r-- | src/components/Buttons/ButtonLink/ButtonLink.tsx | 30 | ||||
| -rw-r--r-- | src/components/Buttons/ButtonSubmit/ButtonSubmit.tsx | 22 | ||||
| -rw-r--r-- | src/components/Buttons/ButtonToolbar/ButtonToolbar.tsx | 72 | ||||
| -rw-r--r-- | src/components/Buttons/Buttons.module.scss | 289 | ||||
| -rw-r--r-- | src/components/Buttons/index.tsx | 7 |
8 files changed, 0 insertions, 549 deletions
diff --git a/src/components/Buttons/Button/Button.tsx b/src/components/Buttons/Button/Button.tsx deleted file mode 100644 index ada23fe..0000000 --- a/src/components/Buttons/Button/Button.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { ButtonKind, ButtonPosition } from '@ts/types/app'; -import { ReactNode } from 'react'; -import styles from '../Buttons.module.scss'; - -const Button = ({ - children, - clickHandler, - kind = 'secondary', - position = 'left', - spacing = false, - isDisabled = false, -}: { - children: ReactNode; - clickHandler: any; - kind?: ButtonKind; - position?: ButtonPosition; - spacing?: boolean; - isDisabled?: boolean; -}) => { - const spacingClass = spacing ? styles.spacing : ''; - const classes = `${styles.btn} ${styles[position]} ${styles[kind]} ${spacingClass}`; - - return ( - <button - className={classes} - type="button" - disabled={isDisabled} - onClick={clickHandler} - > - {children} - </button> - ); -}; - -export default Button; diff --git a/src/components/Buttons/ButtonHelp/ButtonHelp.module.scss b/src/components/Buttons/ButtonHelp/ButtonHelp.module.scss deleted file mode 100644 index b2a05d7..0000000 --- a/src/components/Buttons/ButtonHelp/ButtonHelp.module.scss +++ /dev/null @@ -1,52 +0,0 @@ -@use "@styles/abstracts/functions" as fun; -@use "@styles/abstracts/mixins" as mix; - -.icon { - color: var(--color-primary-dark); - font-weight: 600; -} - -.active { - .icon { - color: var(--color-fg-inverted); - } -} - -.wrapper { - width: fun.convert-px(44); - height: fun.convert-px(44); - background: var(--color-bg); - border: fun.convert-px(3) solid var(--color-primary-dark); - border-radius: 50%; - box-shadow: fun.convert-px(1) fun.convert-px(1) 0 0 var(--color-shadow); - transition: all 0.3s ease-in-out 0s; - - @include mix.pointer("fine") { - width: fun.convert-px(30); - height: fun.convert-px(30); - line-height: 1; - } - - &:hover, - &:focus { - border-color: var(--color-primary-light); - color: var(--color-primary-light); - box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) - var(--color-shadow-light), - fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2) - var(--color-shadow-light), - fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4) - var(--color-shadow-light), - fun.convert-px(7) fun.convert-px(10) fun.convert-px(12) fun.convert-px(-3) - var(--color-shadow-light); - transform: scale(1.1); - - .icon { - transform: scale(1.1); - } - } - - &.active { - background: var(--color-primary); - } -} diff --git a/src/components/Buttons/ButtonHelp/ButtonHelp.tsx b/src/components/Buttons/ButtonHelp/ButtonHelp.tsx deleted file mode 100644 index 2616a8f..0000000 --- a/src/components/Buttons/ButtonHelp/ButtonHelp.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { SetStateAction } from 'react'; -import { useIntl } from 'react-intl'; -import styles from './ButtonHelp.module.scss'; - -const ButtonHelp = ({ - showHelp, - setShowHelp, - title, -}: { - showHelp: boolean; - setShowHelp: (value: SetStateAction<boolean>) => void; - title?: string; -}) => { - const intl = useIntl(); - - const handleClick = () => { - setShowHelp((prev) => !prev); - }; - - const activeModifier = showHelp ? styles.active : ''; - - return ( - <button - onClick={handleClick} - title={title} - className={`${styles.wrapper} ${activeModifier}`} - > - <span className={styles.icon} aria-hidden="true"> - ? - </span> - <span className="screen-reader-text"> - {intl.formatMessage({ - defaultMessage: 'Help', - description: 'ButtonHelp: screen reader text', - id: 'oPf+XA', - })} - </span> - </button> - ); -}; - -export default ButtonHelp; diff --git a/src/components/Buttons/ButtonLink/ButtonLink.tsx b/src/components/Buttons/ButtonLink/ButtonLink.tsx deleted file mode 100644 index 179c686..0000000 --- a/src/components/Buttons/ButtonLink/ButtonLink.tsx +++ /dev/null @@ -1,30 +0,0 @@ -import { ButtonPosition } from '@ts/types/app'; -import Link from 'next/link'; -import { ReactNode } from 'react'; -import styles from '../Buttons.module.scss'; - -const ButtonLink = ({ - children, - target, - position = 'left', - isExternal = false, -}: { - children: ReactNode; - target: string; - position?: ButtonPosition; - isExternal?: boolean; -}) => { - const classes = `${styles.btn} ${styles[position]} ${styles.tertiary}`; - - return isExternal ? ( - <a className={classes} href={target}> - {children} - </a> - ) : ( - <Link href={target}> - <a className={classes}>{children}</a> - </Link> - ); -}; - -export default ButtonLink; diff --git a/src/components/Buttons/ButtonSubmit/ButtonSubmit.tsx b/src/components/Buttons/ButtonSubmit/ButtonSubmit.tsx deleted file mode 100644 index 4725cad..0000000 --- a/src/components/Buttons/ButtonSubmit/ButtonSubmit.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { ReactNode } from 'react'; -import styles from '../Buttons.module.scss'; - -type Modifier = 'search' | 'submit'; - -const ButtonSubmit = ({ - children, - modifier = 'submit', -}: { - children: ReactNode; - modifier?: Modifier; -}) => { - const withModifier = modifier === 'search' ? styles.search : styles.primary; - - return ( - <button type="submit" className={`${styles.btn} ${withModifier}`}> - {children} - </button> - ); -}; - -export default ButtonSubmit; diff --git a/src/components/Buttons/ButtonToolbar/ButtonToolbar.tsx b/src/components/Buttons/ButtonToolbar/ButtonToolbar.tsx deleted file mode 100644 index 7ceb70d..0000000 --- a/src/components/Buttons/ButtonToolbar/ButtonToolbar.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import { CloseIcon, CogIcon, SearchIcon } from '@components/Icons'; -import { ForwardedRef, forwardRef, SetStateAction } from 'react'; -import { useIntl } from 'react-intl'; -import styles from '../Buttons.module.scss'; - -type ButtonType = 'search' | 'settings'; - -const ButtonToolbar = ( - { - type, - isActivated, - setIsActivated, - }: { - type: ButtonType; - isActivated: boolean; - setIsActivated: (value: SetStateAction<boolean>) => void; - }, - ref: ForwardedRef<HTMLButtonElement> -) => { - const intl = useIntl(); - const ButtonIcon = () => (type === 'search' ? <SearchIcon /> : <CogIcon />); - const btnClasses = isActivated - ? `${styles.toolbar} ${styles['toolbar--activated']}` - : styles.toolbar; - - return ( - <button - ref={ref} - className={btnClasses} - type="button" - onClick={() => setIsActivated(!isActivated)} - > - <span className={styles.icon}> - <span className={styles.front}> - <ButtonIcon /> - </span> - <span className={styles.back}> - <CloseIcon /> - </span> - </span> - {isActivated ? ( - <span className="screen-reader-text"> - {intl.formatMessage( - { - defaultMessage: 'Close {type}', - description: 'ButtonToolbar: Close button', - id: 'SWq8a4', - }, - { - type, - } - )} - </span> - ) : ( - <span className="screen-reader-text"> - {intl.formatMessage( - { - defaultMessage: 'Open {type}', - description: 'ButtonToolbar: Open button', - id: 'Z1eSIz', - }, - { - type, - } - )} - </span> - )} - </button> - ); -}; - -export default forwardRef(ButtonToolbar); diff --git a/src/components/Buttons/Buttons.module.scss b/src/components/Buttons/Buttons.module.scss deleted file mode 100644 index 0ea9289..0000000 --- a/src/components/Buttons/Buttons.module.scss +++ /dev/null @@ -1,289 +0,0 @@ -@use "@styles/abstracts/functions" as fun; -@use "@styles/abstracts/mixins" as mix; -@use "@styles/abstracts/placeholders"; - -.btn { - display: block; - border: none; - font-size: var(--font-size-md); -} - -.left { - margin-right: auto; -} - -.right { - margin-left: auto; -} - -.center { - margin-left: auto; - margin-right: auto; -} - -.primary { - margin: auto; - padding: var(--spacing-2xs) var(--spacing-md); - background: var(--color-primary); - border: fun.convert-px(2) solid var(--color-bg); - border-radius: fun.convert-px(5); - box-shadow: 0 0 0 fun.convert-px(2) var(--color-primary), - 0 0 0 fun.convert-px(3) var(--color-primary-darker), - fun.convert-px(2) fun.convert-px(2) 0 fun.convert-px(3) - var(--color-primary-dark); - color: var(--color-fg-inverted); - font-weight: 600; - text-shadow: fun.convert-px(2) fun.convert-px(2) 0 var(--color-shadow); - transition: all 0.25s ease-in-out 0s; - - &:hover, - &:focus { - background: var(--color-primary-light); - box-shadow: 0 0 0 fun.convert-px(2) var(--color-primary-light), - 0 0 0 fun.convert-px(3) var(--color-primary-darker), - fun.convert-px(7) fun.convert-px(7) 0 fun.convert-px(2) - var(--color-primary-dark); - transform: translateX(#{fun.convert-px(-4)}) - translateY(#{fun.convert-px(-4)}); - } - - &:focus { - text-decoration: underline solid var(--color-fg-inverted) fun.convert-px(2); - } - - &:active { - background: var(--color-primary-dark); - box-shadow: 0 0 0 fun.convert-px(2) var(--color-primary), - 0 0 0 fun.convert-px(3) var(--color-primary-darker), - 0 0 0 0 var(--color-primary-dark); - text-decoration: none; - transform: translateX(#{fun.convert-px(4)}) translateY(#{fun.convert-px(4)}); - } -} - -.secondary { - padding: var(--spacing-2xs) var(--spacing-md); - background: var(--color-bg); - border: fun.convert-px(3) solid var(--color-primary); - border-radius: fun.convert-px(5); - box-shadow: fun.convert-px(2) fun.convert-px(2) 0 0 var(--color-bg), - fun.convert-px(3) fun.convert-px(3) 0 0 var(--color-primary-dark), - fun.convert-px(5) fun.convert-px(5) 0 0 var(--color-bg), - fun.convert-px(6) fun.convert-px(6) 0 0 var(--color-primary-dark); - color: var(--color-primary); - font-weight: 600; - transition: all 0.35s ease-out 0s; - - &:disabled { - color: var(--color-fg-light); - border-color: var(--color-border-dark); - box-shadow: fun.convert-px(2) fun.convert-px(2) 0 0 var(--color-bg), - fun.convert-px(3) fun.convert-px(3) 0 0 var(--color-primary-darker), - fun.convert-px(5) fun.convert-px(5) 0 0 var(--color-bg), - fun.convert-px(6) fun.convert-px(6) 0 0 var(--color-primary-darker); - cursor: wait; - } - - &:not(:disabled) { - &:hover, - &:focus { - transform: translateX(#{fun.convert-px(-3)}) - translateY(#{fun.convert-px(-5)}); - border-color: var(--color-primary-light); - box-shadow: fun.convert-px(2) fun.convert-px(3) 0 0 var(--color-bg), - fun.convert-px(4) fun.convert-px(5) 0 0 var(--color-primary), - fun.convert-px(6) fun.convert-px(8) 0 0 var(--color-bg), - fun.convert-px(8) fun.convert-px(10) 0 0 var(--color-primary), - fun.convert-px(10) fun.convert-px(12) fun.convert-px(1) 0 - var(--color-shadow-light), - fun.convert-px(10) fun.convert-px(12) fun.convert-px(5) - fun.convert-px(1) var(--color-shadow-light); - color: var(--color-primary-light); - } - - &:focus { - text-decoration: underline var(--color-primary) fun.convert-px(2); - } - - &:active { - text-decoration: none; - transform: translateX(#{fun.convert-px(5)}) - translateY(#{fun.convert-px(6)}); - box-shadow: 0 0 0 0 var(--color-shadow); - } - } -} - -.tertiary { - display: flex; - flex-flow: row wrap; - place-items: center; - gap: var(--spacing-2xs); - width: max-content; - padding: var(--spacing-2xs) var(--spacing-sm); - position: relative; - background: var(--color-bg); - border: fun.convert-px(3) solid var(--color-primary); - border-radius: fun.convert-px(5); - box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) - var(--color-shadow), - fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2) - var(--color-shadow), - fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4) - var(--color-shadow); - color: var(--color-primary); - font-weight: 600; - text-decoration: underline transparent 0; - transition: all 0.3s ease-in-out 0s, text-decoration 0.35s ease-in-out 0s; - - &:hover, - &:focus { - border-color: var(--color-primary-light); - color: var(--color-primary-light); - box-shadow: fun.convert-px(1) fun.convert-px(1) fun.convert-px(1) - var(--color-shadow-light), - fun.convert-px(1) fun.convert-px(2) fun.convert-px(2) fun.convert-px(-2) - var(--color-shadow-light), - fun.convert-px(3) fun.convert-px(4) fun.convert-px(5) fun.convert-px(-4) - var(--color-shadow-light), - fun.convert-px(7) fun.convert-px(10) fun.convert-px(12) fun.convert-px(-3) - var(--color-shadow-light); - transform: scale(1.1); - } - - &:focus { - text-decoration: underline var(--color-primary-light) fun.convert-px(3); - } - - &:active { - border-color: var(--color-primary-dark); - color: var(--color-primary-dark); - box-shadow: 0 0 0 0 var(--color-shadow); - text-decoration: underline transparent 0; - transform: scale(0.94); - } -} - -:global { - [data-theme="dark"] { - :local { - .tertiary { - img[src*="png"] { - background: none; - } - } - } - } -} - -.toolbar { - --draw-border-thickness: #{fun.convert-px(4)}; - --icon-size: 100%; - - display: flex; - flex-flow: row nowrap; - place-items: center; - width: var(--btn-size, 100%); - height: var(--btn-size, 100%); - padding: var(--spacing-2xs); - background: none; - border: none; - font-size: var(--font-size-md); - - &:hover, - &:focus { - --draw-border-color1: var(--color-primary-light); - --draw-border-color2: var(--color-primary-lighter); - - @extend %draw-borders; - } - - @include mix.media("screen") { - @include mix.dimensions("md") { - border-radius: 8%; - } - } -} - -.icon { - display: block; - width: 100%; - height: 100%; - position: relative; - transform-style: preserve-3d; - transform: translate3d(0, 0, 0); - transition: all 0.5s ease-in-out 0s; -} - -.front, -.back { - display: flex; - place-content: center; - width: var(--icon-size); - height: var(--icon-size); - position: absolute; - top: 0; - right: 0; - transition: all 0.6s ease-in 0s; - backface-visibility: hidden; -} - -.front { - transform: scale(1); - z-index: 20; -} - -.back { - transform: scale(0.2) rotateY(180deg); - z-index: 10; -} - -.toolbar--activated { - .icon { - transform: rotateY(180deg); - } - - .front { - transform: scale(0.2); - } - - .back { - transform: scale(1) rotateY(180deg); - } -} - -.search { - background: transparent; - margin-left: calc(var(--btn-size) * -1); - z-index: 5; - transition: all 0.3s ease-in-out 0s; - - svg { - transform: scale(0.85); - transition: all 0.3s ease-in-out 0s; - } - - &:hover, - &:focus { - svg { - transform: scale(0.85) rotate(20deg) translateY(#{fun.convert-px(3)}); - } - } - - &:focus { - outline: var(--color-primary-light) solid fun.convert-px(3); - } - - &:active { - outline: none; - - svg { - transform: scale(0.7); - } - } -} - -.spacing { - margin-top: var(--spacing-md); - margin-bottom: var(--spacing-md); -} diff --git a/src/components/Buttons/index.tsx b/src/components/Buttons/index.tsx deleted file mode 100644 index 9b4b756..0000000 --- a/src/components/Buttons/index.tsx +++ /dev/null @@ -1,7 +0,0 @@ -import Button from './Button/Button'; -import ButtonLink from './ButtonLink/ButtonLink'; -import ButtonToolbar from './ButtonToolbar/ButtonToolbar'; -import ButtonSubmit from './ButtonSubmit/ButtonSubmit'; -import ButtonHelp from './ButtonHelp/ButtonHelp'; - -export { Button, ButtonHelp, ButtonLink, ButtonToolbar, ButtonSubmit }; |
