From 7e59247c78a1bc77a2f2cf171040e248f19947d6 Mon Sep 17 00:00:00 2001 From: Hossein Mehrabi Date: Thu, 23 Feb 2023 16:27:37 +0330 Subject: [PATCH] feat: implement IconButton component --- .../components/CSSBaseline/CSSBaseline.tsx | 2 + .../IconButton/IconButton.classes.ts | 12 +++++ .../IconButton/IconButton.stories.tsx | 40 ++++++++++++++++ .../IconButton/IconButton.styles.ts | 47 +++++++++++++++++++ .../src/components/IconButton/IconButton.tsx | 35 ++++++++++++++ .../src/components/IconButton/index.ts | 1 + packages/lsd-react/src/index.ts | 1 + 7 files changed, 138 insertions(+) create mode 100644 packages/lsd-react/src/components/IconButton/IconButton.classes.ts create mode 100644 packages/lsd-react/src/components/IconButton/IconButton.stories.tsx create mode 100644 packages/lsd-react/src/components/IconButton/IconButton.styles.ts create mode 100644 packages/lsd-react/src/components/IconButton/IconButton.tsx create mode 100644 packages/lsd-react/src/components/IconButton/index.ts diff --git a/packages/lsd-react/src/components/CSSBaseline/CSSBaseline.tsx b/packages/lsd-react/src/components/CSSBaseline/CSSBaseline.tsx index 630b4f1..6245707 100644 --- a/packages/lsd-react/src/components/CSSBaseline/CSSBaseline.tsx +++ b/packages/lsd-react/src/components/CSSBaseline/CSSBaseline.tsx @@ -8,6 +8,7 @@ import { CollapseStyles } from '../Collapse/Collapse.styles' import { CollapseHeaderStyles } from '../CollapseHeader/CollapseHeader.styles' import { DropdownStyles } from '../Dropdown/Dropdown.styles' import { DropdownItemStyles } from '../DropdownItem/DropdownItem.styles' +import { IconButtonStyles } from '../IconButton/IconButton.styles' import { LsdIconStyles } from '../Icons/LsdIcon/LsdIcon.styles' import { ListBoxStyles } from '../ListBox/ListBox.styles' import { QuoteStyles } from '../Quote/Quote.styles' @@ -21,6 +22,7 @@ import { TypographyStyles } from '../Typography/Typography.styles' const componentStyles: Array | SerializedStyles> = [ ButtonStyles, + IconButtonStyles, TypographyStyles, LsdIconStyles, TabItemStyles, diff --git a/packages/lsd-react/src/components/IconButton/IconButton.classes.ts b/packages/lsd-react/src/components/IconButton/IconButton.classes.ts new file mode 100644 index 0000000..aea50b7 --- /dev/null +++ b/packages/lsd-react/src/components/IconButton/IconButton.classes.ts @@ -0,0 +1,12 @@ +export const iconButtonClasses = { + root: `lsd-icon-button`, + + outlined: `lsd-icon-button--outlined`, + filled: `lsd-icon-button--filled`, + + disabled: `lsd-icon-button--disabled`, + + small: `lsd-icon-button--small`, + medium: `lsd-icon-button--medium`, + large: `lsd-icon-button--large`, +} diff --git a/packages/lsd-react/src/components/IconButton/IconButton.stories.tsx b/packages/lsd-react/src/components/IconButton/IconButton.stories.tsx new file mode 100644 index 0000000..a10bc47 --- /dev/null +++ b/packages/lsd-react/src/components/IconButton/IconButton.stories.tsx @@ -0,0 +1,40 @@ +import { Meta, Story } from '@storybook/react' +import { useStorybookIconComponent } from '../../utils/storybook.utils' +import { IconButton, IconButtonProps } from './IconButton' + +export default { + title: 'IconButton', + component: IconButton, + argTypes: { + size: { + type: { + name: 'enum', + value: ['small', 'medium', 'large'], + }, + defaultValue: 'large', + }, + icon: { + type: { + name: 'enum', + value: useStorybookIconComponent.options, + }, + defaultValue: 'FolderIcon', + }, + }, +} as Meta + +export const Root: Story = ({ + icon, + ...args +}) => { + const Icon = useStorybookIconComponent(icon) + + return {Icon && } +} + +Root.args = { + variant: 'outlined', + icon: 'FolderIcon', + size: 'large', + disabled: false, +} diff --git a/packages/lsd-react/src/components/IconButton/IconButton.styles.ts b/packages/lsd-react/src/components/IconButton/IconButton.styles.ts new file mode 100644 index 0000000..5c3846e --- /dev/null +++ b/packages/lsd-react/src/components/IconButton/IconButton.styles.ts @@ -0,0 +1,47 @@ +import { css } from '@emotion/react' +import { iconButtonClasses } from './IconButton.classes' + +export const IconButtonStyles = css` + .${iconButtonClasses.root} { + display: flex; + width: 32px; + height: 28px; + flex-direction: row; + align-items: center; + justify-content: center; + cursor: pointer; + background: none; + border: 1px solid rgb(var(--lsd-border-primary)); + } + + .${iconButtonClasses.filled} { + background-color: rgb(var(--lsd-icon-primary)); + + svg { + --lsd-icon-primary: var(--lsd-icon-secondary); + } + } + + .${iconButtonClasses.outlined} { + } + + .${iconButtonClasses.disabled} { + opacity: 0.34; + cursor: default; + } + + .${iconButtonClasses.large} { + width: 40px; + height: 40px; + } + + .${iconButtonClasses.medium} { + width: 32px; + height: 32px; + } + + .${iconButtonClasses.small} { + width: 28px; + height: 28px; + } +` diff --git a/packages/lsd-react/src/components/IconButton/IconButton.tsx b/packages/lsd-react/src/components/IconButton/IconButton.tsx new file mode 100644 index 0000000..5781076 --- /dev/null +++ b/packages/lsd-react/src/components/IconButton/IconButton.tsx @@ -0,0 +1,35 @@ +import clsx from 'clsx' +import React from 'react' +import { iconButtonClasses } from './IconButton.classes' + +export type IconButtonProps = React.ButtonHTMLAttributes & { + variant?: 'outlined' | 'filled' + size?: 'small' | 'medium' | 'large' +} + +export const IconButton: React.FC & { + classes: typeof iconButtonClasses +} = ({ + size = 'large', + disabled, + variant = 'outlined', + children, + ...props +}) => { + return ( + + ) +} + +IconButton.classes = iconButtonClasses diff --git a/packages/lsd-react/src/components/IconButton/index.ts b/packages/lsd-react/src/components/IconButton/index.ts new file mode 100644 index 0000000..a37a7fc --- /dev/null +++ b/packages/lsd-react/src/components/IconButton/index.ts @@ -0,0 +1 @@ +export * from './IconButton' diff --git a/packages/lsd-react/src/index.ts b/packages/lsd-react/src/index.ts index f4407bf..3e5a8ea 100644 --- a/packages/lsd-react/src/index.ts +++ b/packages/lsd-react/src/index.ts @@ -6,6 +6,7 @@ export * from './components/Collapse' export * from './components/CollapseHeader' export * from './components/Dropdown' export * from './components/DropdownItem' +export * from './components/IconButton' export * from './components/Icons' export * from './components/ListBox' export * from './components/Quote'