-
Notifications
You must be signed in to change notification settings - Fork 45
/
Copy pathListItem.tsx
109 lines (100 loc) · 2.81 KB
/
ListItem.tsx
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import React, {type Ref, useContext} from 'react'
import clsx from 'clsx'
import {CheckIcon, DashIcon, Icon, IconProps, XIcon} from '@primer/octicons-react'
import {Text, TextProps} from '../../Text'
import type {BaseProps} from '../../component-helpers'
import {ListContext} from '../listContext'
import styles from './ListItem.module.css'
export type ListItemProps = BaseProps<HTMLElement> & {
/**
* React.ReactNode and React.ReactNode[] are valid children.
*/
children?: React.ReactNode | React.ReactNode[]
/**
* The ref object to be attached to the list item.
*/
ref?: Ref<HTMLLIElement>
/*
* Custom icon to be used as leading visual
*/
leadingVisual?: Icon
/*
* Color of leading icon
*/
leadingVisualFill?: IconProps['fill']
/*
* Aria label for the leading visual
*/
leadingVisualAriaLabel?: string
} & Pick<TextProps, 'variant'>
function Root({
className,
children,
leadingVisualFill,
leadingVisual: LeadingVisual,
leadingVisualAriaLabel,
variant: textVariant = 'default',
...props
}: ListItemProps) {
const {variant} = useContext(ListContext)
const _leadingVisual = () => {
const iconProps = {fill: leadingVisualFill, 'aria-label': leadingVisualAriaLabel}
if (LeadingVisual) {
return (
<LeadingVisual
className={clsx(
styles['ListItem__leading-visual'],
!leadingVisualFill && styles['ListItem__leading-visual--muted'],
)}
{...iconProps}
/>
)
}
switch (variant) {
case 'checked':
return (
<CheckIcon
className={clsx(
styles['ListItem__leading-visual'],
styles['ListItem__checked'],
!leadingVisualFill && styles['ListItem__leading-visual--muted'],
)}
{...iconProps}
/>
)
case 'x':
return (
<XIcon
className={clsx(
styles['ListItem__leading-visual'],
styles['ListItem__x'],
!leadingVisualFill && styles['ListItem__leading-visual--muted'],
)}
{...iconProps}
/>
)
case 'default':
return (
<DashIcon
className={clsx(
styles['ListItem__leading-visual'],
styles['ListItem__default'],
!leadingVisualFill && styles['ListItem__leading-visual--muted'],
)}
{...iconProps}
/>
)
default:
return null
}
}
return (
<li className={clsx(styles.ListItem, !variant && styles.OrderedList__item, className)} {...props}>
{_leadingVisual()}
<Text as="span" variant={textVariant} className={clsx(styles[`ListItem--${textVariant}`])}>
{children}
</Text>
</li>
)
}
export const ListItem = Object.assign(Root)