From 58005ad6ca761309eb8a92d2489030a7b1bad523 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Fri, 1 Apr 2022 11:39:37 +0200 Subject: chore: add a Hamburger icon component --- src/components/atoms/icons/hamburger.module.scss | 57 ++++++++++++++++++++++++ src/components/atoms/icons/hamburger.stories.tsx | 25 +++++++++++ src/components/atoms/icons/hamburger.test.tsx | 9 ++++ src/components/atoms/icons/hamburger.tsx | 20 +++++++++ 4 files changed, 111 insertions(+) create mode 100644 src/components/atoms/icons/hamburger.module.scss create mode 100644 src/components/atoms/icons/hamburger.stories.tsx create mode 100644 src/components/atoms/icons/hamburger.test.tsx create mode 100644 src/components/atoms/icons/hamburger.tsx (limited to 'src') diff --git a/src/components/atoms/icons/hamburger.module.scss b/src/components/atoms/icons/hamburger.module.scss new file mode 100644 index 0000000..09e7e30 --- /dev/null +++ b/src/components/atoms/icons/hamburger.module.scss @@ -0,0 +1,57 @@ +@use "@styles/abstracts/functions" as fun; + +.icon { + display: block; + width: var(--icon-size, #{fun.convert-px(50)}); + height: var(--icon-size, #{fun.convert-px(50)}); + position: relative; + + &, + &::before, + &::after { + display: block; + height: fun.convert-px(7); + background: var(--color-primary-lighter); + background-image: linear-gradient( + to right, + var(--color-primary-light) 0%, + var(--color-primary-lighter) 100% + ); + border: fun.convert-px(1) solid var(--color-primary-darker); + border-radius: fun.convert-px(3); + transition: all 0.25s ease-in-out 0s, transform 0.4s ease-in 0s; + } + + &::before, + &::after { + content: ""; + position: absolute; + left: fun.convert-px(-1); + right: fun.convert-px(-1); + } + + &::before { + bottom: fun.convert-px(15); + } + + &::after { + top: fun.convert-px(15); + } + + &--active { + background: transparent; + border: transparent; + + &::before { + bottom: 0; + transform-origin: 50% 50%; + transform: rotate(45deg); + } + + &::after { + top: 0; + transform-origin: 50% 50%; + transform: rotate(-45deg); + } + } +} diff --git a/src/components/atoms/icons/hamburger.stories.tsx b/src/components/atoms/icons/hamburger.stories.tsx new file mode 100644 index 0000000..c145daf --- /dev/null +++ b/src/components/atoms/icons/hamburger.stories.tsx @@ -0,0 +1,25 @@ +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import HamburgerIcon from './hamburger'; + +export default { + title: 'Atoms/Icons', + component: HamburgerIcon, + argTypes: { + isActive: { + control: { + type: 'boolean', + }, + description: 'Transform hamburger into a cross when state is active.', + type: { + name: 'boolean', + required: true, + }, + }, + }, +} as ComponentMeta; + +const Template: ComponentStory = (args) => ( + +); + +export const Hamburger = Template.bind({}); diff --git a/src/components/atoms/icons/hamburger.test.tsx b/src/components/atoms/icons/hamburger.test.tsx new file mode 100644 index 0000000..f8a3c04 --- /dev/null +++ b/src/components/atoms/icons/hamburger.test.tsx @@ -0,0 +1,9 @@ +import { render } from '@test-utils'; +import Hamburger from './hamburger'; + +describe('Hamburger', () => { + it('renders a Hamburger icon', () => { + const { container } = render(); + expect(container).toBeDefined(); + }); +}); diff --git a/src/components/atoms/icons/hamburger.tsx b/src/components/atoms/icons/hamburger.tsx new file mode 100644 index 0000000..f081bf7 --- /dev/null +++ b/src/components/atoms/icons/hamburger.tsx @@ -0,0 +1,20 @@ +import { FC } from 'react'; +import styles from './hamburger.module.scss'; + +type HamburgerProps = { + isActive: boolean; +}; + +/** + * Hamburger component + * + * Render a Hamburger icon. + */ +const Hamburger: FC = ({ isActive }) => { + const stateClass = isActive ? `${styles['icon--active']}` : ''; + const iconClasses = `${styles.icon} ${stateClass}`; + + return ; +}; + +export default Hamburger; -- cgit v1.2.3