diff --git a/src/colors/button.ts b/src/colors/button.ts index 56527738..62bdb0d4 100644 --- a/src/colors/button.ts +++ b/src/colors/button.ts @@ -19,6 +19,10 @@ export const button = { disabled: { DEFAULT: colors.grey['50'], dark: background.subtle.dark + }, + selected: { + DEFAILT: colors.grey['100'], + dark: background.subtle.dark } }, secondary: { @@ -53,6 +57,10 @@ export const button = { disabled: { DEFAULT: border.subtle.DEFAULT, dark: border.subtle.dark + }, + selected: { + DEFAILT: colors.grey['100'], + dark: background.subtle.dark } } }, @@ -64,6 +72,10 @@ export const button = { focus: { DEFAULT: background.DEFAULT, dark: colors.blue['900'] + }, + selected: { + DEFAILT: colors.grey['100'], + dark: background.subtle.dark } }, success: { @@ -76,6 +88,10 @@ export const button = { }, disabled: { DEFAULT: colors.grey['50'] + }, + selected: { + DEFAILT: colors.grey['100'], + dark: background.subtle.dark } }, danger: { @@ -88,6 +104,10 @@ export const button = { }, disabled: { DEFAULT: colors.grey['50'] + }, + selected: { + DEFAILT: colors.grey['100'], + dark: background.subtle.dark } } } diff --git a/src/components/Button/index.tsx b/src/components/Button/index.tsx index 410b659e..a71e7e90 100644 --- a/src/components/Button/index.tsx +++ b/src/components/Button/index.tsx @@ -1,38 +1,59 @@ import * as React from 'react' -import { Slot } from '@radix-ui/react-slot' import { cva, type VariantProps } from 'class-variance-authority' import { cn } from '@/lib/utils' +const leftSideVariants = cva([ + 'inline-flex', + 'items-center', + 'justify-center', + 'text-inherit', + 'text-justify', + 'mr-3', + 'pt-2.5', + 'h-1.5', + 'w-1.5' +]) + +const rightSideVariants = cva([ + 'inline-flex', + 'items-center', + 'justify-center', + 'text-inherit', + 'text-justify', + 'ml-3', + 'pt-2.5', + 'h-1.5', + 'w-1.5' +]) + const buttonVariants = cva( [ 'inline-flex', - 'items-center', - 'justify-center', - 'whitespace-nowrap', 'rounded-lg', + 'border-4', + 'p-2', 'transition-colors', 'focus-visible:outline-none', - 'focus-visible:ring-1', - 'focus-visible:ring-ring', 'disabled:pointer-events-none', - 'border-2 ' + 'cursor-pointer', + 'disabled:cursor-default' ], { variants: { variant: { primary: [ 'bg-button-primary', - 'border-button-primary', 'text-white', + 'border-button-primary', 'hover:bg-button-primary-hover', 'hover:border-button-primary-hover', 'focus:bg-button-primary-focus', - 'focus:border-button-primary-focus', - 'focus-visible:shadow-blue', + 'focus:border-blue-200', 'disabled:bg-button-primary-disabled', 'disabled:text-foreground-subtle', - 'disabled:border-button-primary-disabled' + 'disabled:border-button-primary-disabled', + 'selected:text-foreground-selected' ], secondary: [ 'bg-white', @@ -40,8 +61,7 @@ const buttonVariants = cva( 'border-border', 'hover:bg-button-secondary-hover', 'hover:border-button-secondary-border-hover', - 'focus:border-button-secondary-border-focus', - 'focus-visible:shadow-blue', + 'focus:border-blue-200', 'disabled:bg-button-secondary-disabled', 'disabled:border-button-secondary-border-disabled', 'disabled:text-foreground-subtle' @@ -54,32 +74,29 @@ const buttonVariants = cva( 'hover:border-button-tertiary-hover', 'hover:dark:text-button-tertiary-hover-dark', 'focus:bg-button-tertiary-focus', - 'focus:border-button-tertiary-focus', - 'focus-visible:shadow-blue', + 'focus:border-blue-200', 'disabled:text-foreground-subtle' ], success: [ 'bg-button-success', - 'border-button-success', 'text-white', + 'border-button-success', 'hover:bg-button-success-hover', 'hover:border-button-success-hover', 'focus:bg-button-success-focus', - 'focus:border-button-success-focus', - 'focus-visible:shadow-green', + 'focus:border-green-200', 'disabled:bg-button-success-disabled', 'disabled:border-button-success-disabled', 'disabled:text-foreground-subtle' ], danger: [ 'bg-button-danger', - 'border-button-danger', 'text-white', + 'border-button-danger', 'hover:bg-button-danger-hover', 'hover:border-button-danger-hover', 'focus:bg-button-danger-focus', - 'focus:border-button-danger-focus', - 'focus-visible::shadow-red', + 'focus:border-red-200', 'disabled:bg-button-danger-disabled', 'disabled:border-button-danger-disabled', 'disabled:text-foreground-subtle' @@ -102,21 +119,63 @@ const buttonVariants = cva( export interface ButtonProps extends React.ButtonHTMLAttributes, VariantProps { + leftSideChild?: React.ReactNode + rightSideChild?: React.ReactNode + leftSideClassName?: string + rightSideClassName?: string + // eslint-disable-next-line @typescript-eslint/no-explicit-any + children: any asChild?: boolean + onClick?: React.MouseEventHandler | undefined } const Button = React.forwardRef( - ({ className, variant, size, asChild = false, ...props }, ref) => { - const Comp = asChild ? Slot : 'button' + ( + { + className, + variant, + children, + size, + leftSideChild, + rightSideChild, + leftSideClassName, + rightSideClassName, + disabled = false, + onClick, + ...props + }, + ref + ) => { return ( - { + if (onClick) onClick(e) + }} {...props} - /> + > + {leftSideChild ? ( +
+ {leftSideChild} +
+ ) : ( + <> + )} + {children} + {rightSideChild ? ( +
+ {rightSideChild} +
+ ) : ( + <> + )} + ) } ) + Button.displayName = 'Button' export { Button, buttonVariants } diff --git a/stories/Button/Button.stories.tsx b/stories/Button/Button.stories.tsx index 3ce06cd9..f1aead8e 100644 --- a/stories/Button/Button.stories.tsx +++ b/stories/Button/Button.stories.tsx @@ -1,5 +1,6 @@ import type { Meta, StoryObj } from '@storybook/react' import { Button } from '@/components/Button' +import { ChevronLeftOutlineIcon, ChevronRightOutlineIcon } from '@/assets' // More on how to set up stories at: https://storybook.js.org/docs/react/writing-stories/introduction#default-export const meta = { @@ -72,3 +73,23 @@ export const Danger: Story = { variant: 'danger' } } + +export const LeftIcon: Story = { + args: { + variant: 'primary', + leftSideChild: + } +} +export const RightIcon: Story = { + args: { + variant: 'success', + rightSideChild: + } +} +export const BothIcon: Story = { + args: { + variant: 'tertiary', + leftSideChild: , + rightSideChild: + } +}