Skip to content

Commit e5753f0

Browse files
chore(DialogV1): remove sx from deprecated Dialog (#6923)
1 parent 03c0c59 commit e5753f0

File tree

5 files changed

+64
-15
lines changed

5 files changed

+64
-15
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@primer/react": major
3+
"@primer/styled-react": patch
4+
---
5+
6+
chore: remove sx from deprecated Dialog

packages/react/src/DialogV1/Dialog.tsx

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,34 @@
11
import React, {forwardRef, useRef, type HTMLAttributes} from 'react'
22
import {IconButton} from '../Button'
33
import useDialog from '../hooks/useDialog'
4-
import type {SxProp} from '../sx'
54
import type {ComponentProps} from '../utils/types'
65
import {useRefObjectAsForwardedRef} from '../hooks/useRefObjectAsForwardedRef'
76
import {XIcon} from '@primer/octicons-react'
87
import {clsx} from 'clsx'
98
import classes from './Dialog.module.css'
10-
import {BoxWithFallback} from '../internal/components/BoxWithFallback'
119

1210
// Dialog v1
1311
const noop = () => null
1412

1513
type StyledDialogBaseProps = {
1614
narrow?: boolean
1715
wide?: boolean
18-
} & SxProp
16+
as?: React.ElementType
17+
}
1918

20-
export type DialogHeaderProps = React.PropsWithChildren<HTMLAttributes<HTMLDivElement>> & SxProp
19+
export type DialogHeaderProps = React.PropsWithChildren<HTMLAttributes<HTMLDivElement>> & {
20+
as?: React.ElementType
21+
}
2122

22-
function DialogHeader({children, className, ...rest}: DialogHeaderProps) {
23+
function DialogHeader({children, className, as: Component = 'div', ...rest}: DialogHeaderProps) {
2324
if (React.Children.toArray(children).every(ch => typeof ch === 'string')) {
2425
children = <span className={classes.HeaderChild}>{children}</span>
2526
}
2627

2728
return (
28-
<BoxWithFallback as="div" {...rest} className={clsx(classes.Header, className)}>
29+
<Component {...rest} className={clsx(classes.Header, className)}>
2930
{children}
30-
</BoxWithFallback>
31+
</Component>
3132
)
3233
}
3334

@@ -36,11 +37,15 @@ type InternalDialogProps = {
3637
onDismiss?: () => void
3738
initialFocusRef?: React.RefObject<HTMLElement>
3839
returnFocusRef?: React.RefObject<HTMLElement>
40+
as?: React.ElementType
3941
} & StyledDialogBaseProps &
4042
HTMLAttributes<HTMLDivElement>
4143

4244
const Dialog = forwardRef<HTMLDivElement, InternalDialogProps>(
43-
({children, onDismiss = noop, isOpen, initialFocusRef, returnFocusRef, className, ...props}, forwardedRef) => {
45+
(
46+
{children, onDismiss = noop, isOpen, initialFocusRef, returnFocusRef, className, as: Component = 'div', ...props},
47+
forwardedRef,
48+
) => {
4449
const overlayRef = useRef(null)
4550
const modalRef = useRef<HTMLDivElement>(null)
4651
useRefObjectAsForwardedRef(forwardedRef, modalRef)
@@ -65,9 +70,8 @@ const Dialog = forwardRef<HTMLDivElement, InternalDialogProps>(
6570

6671
return isOpen ? (
6772
<>
68-
<BoxWithFallback as="span" className={classes.Overlay} ref={overlayRef} />
69-
<BoxWithFallback
70-
as="div"
73+
<span className={classes.Overlay} ref={overlayRef} />
74+
<Component
7175
tabIndex={-1}
7276
ref={modalRef}
7377
role="dialog"
@@ -86,7 +90,7 @@ const Dialog = forwardRef<HTMLDivElement, InternalDialogProps>(
8690
className={classes.CloseIcon}
8791
/>
8892
{children}
89-
</BoxWithFallback>
93+
</Component>
9094
</>
9195
) : null
9296
},

packages/styled-react/src/__tests__/primer-react-deprecated.browser.test.tsx

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ import {Button} from '../index'
55

66
describe('@primer/react/deprecated', () => {
77
test('Dialog supports `sx` prop', () => {
8-
render(<Dialog data-testid="component" isOpen sx={{background: 'red'}} />)
8+
render(<Dialog as="button" data-testid="component" isOpen sx={{background: 'red'}} />)
99
expect(window.getComputedStyle(screen.getByTestId('component')).backgroundColor).toBe('rgb(255, 0, 0)')
10+
expect(screen.getByTestId('component').role).toBe('dialog')
1011
})
1112

1213
test('Dialog.Header supports `sx` prop', () => {
13-
render(<Dialog.Header data-testid="component" sx={{background: 'red'}} />)
14+
render(<Dialog.Header as="button" data-testid="component" sx={{background: 'red'}} />)
1415
expect(window.getComputedStyle(screen.getByTestId('component')).backgroundColor).toBe('rgb(255, 0, 0)')
16+
expect(screen.getByTestId('component').className.includes('Header')).toBe(true)
1517
})
1618

1719
test('Octicon supports `sx` prop', () => {
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import {Dialog as PrimerDialog} from '@primer/react/deprecated'
2+
import type {
3+
DialogProps as PrimerDialogProps,
4+
DialogHeaderProps as PrimerDialogHeaderProps,
5+
} from '@primer/react/deprecated'
6+
import {Box} from './Box'
7+
import type {SxProp} from '../sx'
8+
import {forwardRef} from 'react'
9+
import type {ForwardRefComponent} from '../polymorphic'
10+
11+
type DialogProps = PrimerDialogProps & SxProp
12+
13+
const StyledDialog = forwardRef<HTMLDivElement, DialogProps>(function Dialog(props, ref) {
14+
return <Box as={PrimerDialog} ref={ref} {...props} />
15+
})
16+
17+
const DialogImpl = forwardRef(({as, ...props}: DialogProps, ref) => (
18+
<StyledDialog {...props} {...(as ? {forwardedAs: as} : {})} ref={ref} />
19+
)) as ForwardRefComponent<'div', DialogProps>
20+
21+
type DialogHeaderProps = PrimerDialogHeaderProps & SxProp
22+
23+
const StyledDialogHeader = forwardRef<HTMLDivElement, DialogHeaderProps>(function DialogHeader(props, ref) {
24+
return <Box as={PrimerDialog.Header} ref={ref} {...props} />
25+
})
26+
27+
const DialogHeader = forwardRef(({as, ...props}: DialogHeaderProps, ref) => (
28+
<StyledDialogHeader {...props} {...(as ? {forwardedAs: as} : {})} ref={ref} />
29+
)) as ForwardRefComponent<'div', DialogHeaderProps>
30+
31+
const Dialog = Object.assign(DialogImpl, {
32+
Header: DialogHeader,
33+
})
34+
35+
export {Dialog}
36+
export type {DialogProps, DialogHeaderProps}
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
export {TabNav, type TabNavProps, type TabNavLinkProps} from './components/TabNav'
2-
export {Dialog, Octicon, Tooltip, type TooltipProps} from '@primer/react/deprecated'
2+
export {Dialog, type DialogProps, type DialogHeaderProps} from './components/DialogV1'
3+
export {Octicon, Tooltip, type TooltipProps} from '@primer/react/deprecated'

0 commit comments

Comments
 (0)