Switch icon button from aria button to regular button (#592)

* f icon button

* f press

* Create hungry-bulldogs-glow.md

* f type

* f types
This commit is contained in:
Jakub Kotula 2024-10-09 17:49:16 +02:00 committed by GitHub
parent a0a107126b
commit 15c9640ae1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 38 additions and 17 deletions

View File

@ -0,0 +1,5 @@
---
"@status-im/components": patch
---
Switch icon button from aria button to regular button

View File

@ -14,7 +14,7 @@ type Variants = VariantProps<typeof styles>
type Props = { type Props = {
size?: Variants['size'] size?: Variants['size']
variant?: Variants['variant'] variant?: Variants['variant']
onPress?: () => void onPress?: (event: React.MouseEvent<HTMLButtonElement>) => void
} & ( } & (
| { | {
children: React.ReactNode children: React.ReactNode

View File

@ -1,4 +1,5 @@
import { BoldIcon } from '@status-im/icons/20' import { BoldIcon } from '@status-im/icons/20'
import { action } from '@storybook/addon-actions'
import { IconButton } from './icon-button' import { IconButton } from './icon-button'
@ -10,7 +11,13 @@ const sizes = ['40', '32', '24'] as const
const renderVariant = (variant: string) => (props: any) => ( const renderVariant = (variant: string) => (props: any) => (
<div className="flex items-center gap-4"> <div className="flex items-center gap-4">
{sizes.map(size => ( {sizes.map(size => (
<IconButton {...props} key={size} variant={variant} icon={BoldIcon} /> <IconButton
{...props}
key={size}
variant={variant}
icon={<BoldIcon />}
onPress={action('press')}
/>
))} ))}
</div> </div>
) )
@ -19,7 +26,7 @@ const meta = {
component: IconButton, component: IconButton,
title: 'Components/Icon Button', title: 'Components/Icon Button',
args: { args: {
isDisabled: false, disabled: false,
}, },
parameters: { parameters: {

View File

@ -3,27 +3,36 @@
import { forwardRef } from 'react' import { forwardRef } from 'react'
import { cva } from 'cva' import { cva } from 'cva'
import { Button as AriaButton } from 'react-aria-components'
import type { IconElement } from '../types' import type { IconElement } from '../types'
import type { VariantProps } from 'cva' import type { VariantProps } from 'cva'
import type { Ref } from 'react' import type { Ref } from 'react'
import type { ButtonProps as AriaButtonProps } from 'react-aria-components'
type Variants = VariantProps<typeof styles> type Variants = VariantProps<typeof styles>
type Props = AriaButtonProps & { type Props = {
variant?: Variants['variant'] variant?: Variants['variant']
icon: IconElement icon: IconElement
onPress?: (event: React.MouseEvent<HTMLButtonElement>) => void
} }
const IconButton = (props: Props, ref: Ref<HTMLButtonElement>) => { type ButtonProps = Omit<React.ComponentPropsWithoutRef<'button'>, 'children'>
const { variant = 'default', icon, ...buttonProps } = props
const IconButton = (
props: Props & ButtonProps,
ref: Ref<HTMLButtonElement>,
) => {
const { variant = 'default', onPress: onClick, icon, ...buttonProps } = props
return ( return (
<AriaButton {...buttonProps} ref={ref} className={styles({ variant })}> <button
{...buttonProps}
onClick={onClick}
ref={ref}
className={styles({ variant })}
>
{icon} {icon}
</AriaButton> </button>
) )
} }
@ -37,16 +46,16 @@ const styles = cva({
variants: { variants: {
variant: { variant: {
default: [ default: [
'border-transparent bg-neutral-10 text-neutral-50 hover:bg-neutral-20 pressed:border-neutral-20 pressed:bg-neutral-10 pressed:text-neutral-100', 'border-transparent bg-neutral-10 text-neutral-50 active:border-neutral-20 active:bg-neutral-10 active:text-neutral-100 hover:bg-neutral-20',
'dark:bg-neutral-90 dark:text-neutral-40 dark:hover:bg-neutral-80 dark:pressed:border-neutral-60 dark:pressed:bg-neutral-80/70 dark:pressed:text-white-100', 'dark:bg-neutral-90 dark:text-neutral-40 dark:active:border-neutral-60 dark:active:bg-neutral-80/70 dark:active:text-white-100 dark:hover:bg-neutral-80',
], ],
outline: [ outline: [
'border-neutral-30 text-neutral-50 hover:border-neutral-40 pressed:border-neutral-20 pressed:bg-neutral-10 pressed:text-neutral-100', 'border-neutral-30 text-neutral-50 active:border-neutral-20 active:bg-neutral-10 active:text-neutral-100 hover:border-neutral-40',
'dark:border-neutral-70 dark:text-neutral-40 dark:hover:bg-neutral-60 dark:pressed:border-neutral-60 dark:pressed:bg-neutral-80/70 dark:pressed:text-white-100', 'dark:border-neutral-70 dark:text-neutral-40 dark:active:border-neutral-60 dark:active:bg-neutral-80/70 dark:active:text-white-100 dark:hover:bg-neutral-60',
], ],
ghost: [ ghost: [
'border-transparent text-neutral-50 hover:bg-neutral-10 pressed:border-neutral-20 pressed:bg-neutral-10 pressed:text-neutral-100', 'border-transparent text-neutral-50 active:border-neutral-20 active:bg-neutral-10 active:text-neutral-100 hover:bg-neutral-10',
'dark:text-neutral-40 dark:hover:bg-neutral-80/70 dark:pressed:border-neutral-60 dark:pressed:bg-neutral-80/70 dark:pressed:text-white-100', 'dark:text-neutral-40 dark:active:border-neutral-60 dark:active:bg-neutral-80/70 dark:active:text-white-100 dark:hover:bg-neutral-80/70',
], ],
}, },
}, },

View File

@ -16,7 +16,7 @@ type Props = {
} }
type ButtonProps = { type ButtonProps = {
onPress: () => void onPress: (event: React.MouseEvent<HTMLButtonElement>) => void
selected?: boolean selected?: boolean
disabled?: boolean disabled?: boolean
} & Omit<React.ComponentPropsWithoutRef<'button'>, 'children'> } & Omit<React.ComponentPropsWithoutRef<'button'>, 'children'>