Add Tag (#372)
* add tag * add next-env.d.ts * fix gap * use $full token for borderRadius * remove comments * fix system message render * fix action type * rm next-env.d.ts
This commit is contained in:
parent
c9ae7f8fe2
commit
d858c8e0a7
|
@ -32,7 +32,7 @@ export const AllVariants: Story = {
|
||||||
timestamp="11:12"
|
timestamp="11:12"
|
||||||
type="deleted"
|
type="deleted"
|
||||||
text="Message deleted for you"
|
text="Message deleted for you"
|
||||||
action={{ label: 'Undo', onClick: action('undo') }}
|
action={{ label: 'Undo', onPress: action('undo') }}
|
||||||
state={state}
|
state={state}
|
||||||
/>
|
/>
|
||||||
<SystemMessage
|
<SystemMessage
|
||||||
|
|
|
@ -34,7 +34,7 @@ type Props = {
|
||||||
text: string
|
text: string
|
||||||
action?: {
|
action?: {
|
||||||
label: string
|
label: string
|
||||||
onClick: () => void
|
onPress: () => void
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
| {
|
| {
|
||||||
|
@ -47,7 +47,7 @@ type Props = {
|
||||||
const SystemMessage = (props: Props) => {
|
const SystemMessage = (props: Props) => {
|
||||||
const { state = 'default', timestamp, type } = props
|
const { state = 'default', timestamp, type } = props
|
||||||
|
|
||||||
const renderMessage = (type: 'pinned' | 'deleted' | 'added') => {
|
const renderMessage = () => {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case 'pinned':
|
case 'pinned':
|
||||||
return (
|
return (
|
||||||
|
@ -89,7 +89,7 @@ const SystemMessage = (props: Props) => {
|
||||||
type === 'deleted' && state === 'landed' ? 'landed_deleted' : state
|
type === 'deleted' && state === 'landed' ? 'landed_deleted' : state
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
{renderMessage(type)}
|
{renderMessage()}
|
||||||
</Base>
|
</Base>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
export { Tag } from './tag'
|
|
@ -0,0 +1,46 @@
|
||||||
|
import { Stack } from '@tamagui/core'
|
||||||
|
|
||||||
|
import { Tag } from './tag'
|
||||||
|
|
||||||
|
import type { Meta, StoryObj } from '@storybook/react'
|
||||||
|
|
||||||
|
const meta: Meta<typeof Tag> = {
|
||||||
|
component: Tag,
|
||||||
|
argTypes: {},
|
||||||
|
parameters: {
|
||||||
|
design: {
|
||||||
|
type: 'figma',
|
||||||
|
url: 'https://www.figma.com/file/IBmFKgGL1B4GzqD8LQTw6n/Design-System-for-Desktop%2FWeb?node-id=180-9685&t=tDEqIV09qddTZgXF-4',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
type Story = StoryObj<typeof Tag>
|
||||||
|
|
||||||
|
export const Default: Story = {
|
||||||
|
render: () => {
|
||||||
|
return (
|
||||||
|
<Stack space flexDirection="row">
|
||||||
|
<Stack space alignItems="flex-start">
|
||||||
|
<Tag emoji="🐷" label="Tag" size={32} />
|
||||||
|
<Tag emoji="🐷" label="Tag" size={32} selected />
|
||||||
|
<Tag emoji="🐷" label="Tag" size={32} disabled />
|
||||||
|
<Tag emoji="🐷" size={32} />
|
||||||
|
|
||||||
|
<Tag emoji="🐷" label="Tag" size={24} />
|
||||||
|
<Tag emoji="🐷" size={24} />
|
||||||
|
</Stack>
|
||||||
|
|
||||||
|
<Stack space alignItems="flex-start">
|
||||||
|
<Tag label="Tag" size={32} />
|
||||||
|
<Tag label="Tag" size={32} selected />
|
||||||
|
<Tag label="Tag" size={32} disabled />
|
||||||
|
|
||||||
|
<Tag label="Tag" size={24} />
|
||||||
|
</Stack>
|
||||||
|
</Stack>
|
||||||
|
)
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
export default meta
|
|
@ -0,0 +1,87 @@
|
||||||
|
import { Stack, styled } from '@tamagui/core'
|
||||||
|
|
||||||
|
import { Text } from '../text'
|
||||||
|
|
||||||
|
import type { TextProps } from '../text'
|
||||||
|
|
||||||
|
type Props = {
|
||||||
|
size: 32 | 24
|
||||||
|
emoji?: string
|
||||||
|
label?: string
|
||||||
|
selected?: boolean
|
||||||
|
disabled?: boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
const textSizes: Record<NonNullable<Props['size']>, TextProps['size']> = {
|
||||||
|
'32': 15,
|
||||||
|
'24': 13,
|
||||||
|
}
|
||||||
|
|
||||||
|
const Tag = (props: Props) => {
|
||||||
|
const { size, emoji, label, selected, disabled } = props
|
||||||
|
|
||||||
|
return (
|
||||||
|
<Base
|
||||||
|
size={size}
|
||||||
|
selected={selected}
|
||||||
|
disabled={disabled}
|
||||||
|
emojiOnly={Boolean(emoji && !label)}
|
||||||
|
>
|
||||||
|
{emoji && <Text size={textSizes[size]}>{emoji}</Text>}
|
||||||
|
{label && (
|
||||||
|
<Text size={textSizes[size]} weight="medium">
|
||||||
|
{label}
|
||||||
|
</Text>
|
||||||
|
)}
|
||||||
|
</Base>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
const Base = styled(Stack, {
|
||||||
|
display: 'flex',
|
||||||
|
flexDirection: 'row',
|
||||||
|
alignItems: 'center',
|
||||||
|
justifyContent: 'center',
|
||||||
|
borderWidth: 1,
|
||||||
|
borderColor: '$neutral-20',
|
||||||
|
borderRadius: '$full',
|
||||||
|
|
||||||
|
variants: {
|
||||||
|
size: {
|
||||||
|
32: {
|
||||||
|
height: 32,
|
||||||
|
minWidth: 32,
|
||||||
|
paddingHorizontal: 12,
|
||||||
|
gap: 6,
|
||||||
|
},
|
||||||
|
24: {
|
||||||
|
height: 24,
|
||||||
|
minWidth: 24,
|
||||||
|
paddingHorizontal: 8,
|
||||||
|
gap: 5,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
selected: {
|
||||||
|
true: {
|
||||||
|
backgroundColor: '$primary-50-opa-10',
|
||||||
|
borderColor: '$primary-50',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
disabled: {
|
||||||
|
true: {
|
||||||
|
opacity: 0.3,
|
||||||
|
cursor: 'default',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
emojiOnly: {
|
||||||
|
true: {
|
||||||
|
paddingHorizontal: 0,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
export { Tag }
|
Loading…
Reference in New Issue