Skip to content

Commit 2c9bd01

Browse files
pksjcemperrotti
andauthored
Add small variant to underline nav (#2225)
* Add small variant to underline nav * Update documentation * Fix up the build * Create five-avocados-doubt.md * adjusts vertical alignment of leading icon Co-authored-by: Mike Perrotti <[email protected]>
1 parent d5e2459 commit 2c9bd01

File tree

6 files changed

+63
-10
lines changed

6 files changed

+63
-10
lines changed

.changeset/five-avocados-doubt.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@primer/react": patch
3+
---
4+
5+
Add small variant to underline nav

docs/content/drafts/UnderlineNav2.mdx

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,15 @@ description: Use an underlined nav to allow tab like navigation with overflow be
2727
</UnderlineNav>
2828
```
2929

30+
### Small variant
31+
32+
```jsx live drafts
33+
<UnderlineNav label="small variant" variant="small">
34+
<UnderlineNav.Link selected>Item 1</UnderlineNav.Link>
35+
<UnderlineNav.Link>Item 2</UnderlineNav.Link>
36+
</UnderlineNav>
37+
```
38+
3039
## Props
3140

3241
### UnderlineNav
@@ -38,9 +47,16 @@ description: Use an underlined nav to allow tab like navigation with overflow be
3847
<PropsTableRow
3948
name="overflow"
4049
type="'auto' | 'menu' | 'scroll'"
50+
defaultValue="auto"
4151
description="Controls the type of overflow behaviour in smaller screens"
4252
/>
43-
<PropsTableRow name="align" type="right | left" description="The alignment of the nav links" />
53+
<PropsTableRow name="align" type="right | left" defaultValue="left" description="The alignment of the nav links" />
54+
<PropsTableRow
55+
name="variant"
56+
type="default | small"
57+
defaultValue="default"
58+
description="The alignment of the nav links"
59+
/>
4460
<PropsTableRow
4561
name="afterSelect"
4662
type="(event) => void"
@@ -59,7 +75,12 @@ description: Use an underlined nav to allow tab like navigation with overflow be
5975
type="(event) => void"
6076
description="The handler that gets called when a nav link is selected"
6177
/>
62-
<PropsTableRow name="as" type="string | Component" description="What kind of component needs to be rendered" />
78+
<PropsTableRow
79+
name="as"
80+
type="string | Component"
81+
defaultValue="a"
82+
description="What kind of component needs to be rendered"
83+
/>
6384
<PropsTableSxRow />
6485
</PropsTable>
6586

src/UnderlineNav2/UnderlineNav.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -63,13 +63,23 @@ export type UnderlineNavProps = {
6363
overflow?: Overflow
6464
align?: 'right'
6565
sx?: SxProp
66+
variant?: 'default' | 'small'
6667
afterSelect?: (event: React.MouseEvent<HTMLLIElement> | React.KeyboardEvent<HTMLLIElement>) => void
6768
children: React.ReactNode
6869
}
6970

7071
export const UnderlineNav = forwardRef(
7172
(
72-
{as = 'nav', overflow = 'auto', align, label, sx: sxProp = {}, afterSelect, children}: UnderlineNavProps,
73+
{
74+
as = 'nav',
75+
overflow = 'auto',
76+
align,
77+
label,
78+
sx: sxProp = {},
79+
afterSelect,
80+
variant = 'default',
81+
children
82+
}: UnderlineNavProps,
7383
forwardedRef
7484
) => {
7585
const backupRef = useRef<HTMLElement>(null)
@@ -131,7 +141,7 @@ export const UnderlineNav = forwardRef(
131141
useResizeObserver(resizeObserverCallback, newRef as RefObject<HTMLElement>)
132142
return (
133143
<UnderlineNavContext.Provider
134-
value={{setChildrenWidth, selectedLink, setSelectedLink, afterSelect: afterSelectHandler}}
144+
value={{setChildrenWidth, selectedLink, setSelectedLink, afterSelect: afterSelectHandler, variant}}
135145
>
136146
<Box as={as} sx={merge(styles, sxProp)} aria-label={label} ref={newRef}>
137147
<Box as="ul" sx={merge<BetterSystemStyleObject>(overflowStyles, ulStyles)}>

src/UnderlineNav2/UnderlineNavContext.tsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@ export const UnderlineNavContext = createContext<{
55
selectedLink: RefObject<HTMLElement> | undefined
66
setSelectedLink: (ref: RefObject<HTMLElement>) => void
77
afterSelect?: (event: React.MouseEvent<HTMLLIElement> | React.KeyboardEvent<HTMLLIElement>) => void
8+
variant: 'default' | 'small'
89
}>({
910
setChildrenWidth: () => null,
1011
selectedLink: undefined,
11-
setSelectedLink: () => null
12+
setSelectedLink: () => null,
13+
variant: 'default'
1214
})

src/UnderlineNav2/UnderlineNavLink.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,20 +55,29 @@ export const UnderlineNavLink = forwardRef(
5555
) => {
5656
const backupRef = useRef<HTMLElement>(null)
5757
const ref = forwardedRef ?? backupRef
58-
const {setChildrenWidth, selectedLink, setSelectedLink, afterSelect} = useContext(UnderlineNavContext)
58+
const {setChildrenWidth, selectedLink, setSelectedLink, afterSelect, variant} = useContext(UnderlineNavContext)
5959
useLayoutEffect(() => {
6060
const domRect = (ref as MutableRefObject<HTMLElement>).current.getBoundingClientRect()
6161
setChildrenWidth({width: domRect.width})
6262
preSelected && selectedLink === undefined && setSelectedLink(ref as RefObject<HTMLElement>)
6363
}, [ref, preSelected, selectedLink, setSelectedLink, setChildrenWidth])
6464
const iconWrapStyles = {
65-
display: 'inline-block',
66-
marginRight: '8px'
65+
alignItems: 'center',
66+
display: 'inline-flex',
67+
marginRight: 2
6768
}
6869

6970
const textStyles: BetterSystemStyleObject = {
7071
whiteSpace: 'nowrap'
7172
}
73+
const smallVariantLinkStyles = {
74+
paddingY: 2,
75+
fontSize: 0
76+
}
77+
const defaultVariantLinkStyles = {
78+
paddingY: 3,
79+
fontSize: 1
80+
}
7281

7382
const linkStyles = {
7483
display: 'inline-flex',
@@ -78,9 +87,8 @@ export const UnderlineNavLink = forwardRef(
7887
borderColor: selectedLink === ref ? 'primer.border.active' : 'transparent',
7988
textDecoration: 'none',
8089
paddingX: 2,
81-
paddingY: 3,
8290
marginRight: 3,
83-
fontSize: 1,
91+
...(variant === 'small' ? smallVariantLinkStyles : defaultVariantLinkStyles),
8492
'&:hover, &:focus': {
8593
borderColor: selectedLink === ref ? 'primer.border.active' : 'neutral.muted',
8694
transition: '0.2s ease'

src/UnderlineNav2/examples.stories.tsx

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,13 @@ export default {
1414
type: 'radio',
1515
options: ['left', 'right']
1616
}
17+
},
18+
variant: {
19+
defaultValue: 'default',
20+
control: {
21+
type: 'radio',
22+
options: ['default', 'small']
23+
}
1724
}
1825
},
1926
decorators: [

0 commit comments

Comments
 (0)