Skip to content

Commit 7c36e19

Browse files
committed
feat: open prop expandable card (#5431)
1 parent 875bb35 commit 7c36e19

File tree

5 files changed

+46
-2
lines changed

5 files changed

+46
-2
lines changed

.changeset/real-suns-repair.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@ultraviolet/ui": patch
3+
---
4+
5+
`ExpandableCard`: new prop "open" (uncontrolled version of prop "expanded)
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Template } from './Template.stories'
2+
3+
export const Open = Template.bind({})
4+
5+
Open.args = { ...Template.args, header: 'I am open', open: true }
6+
7+
Open.parameters = {
8+
docs: {
9+
description: {
10+
story:
11+
'For an unconctrolled ExpandableCard open by default, use prop `open`. Otherwise use prop `expanded`.',
12+
},
13+
},
14+
}

packages/ui/src/components/ExpandableCard/__stories__/index.stories.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ export { Playground } from './Playground.stories'
1313
export { Size } from './Size.stories'
1414
export { Header } from './Header.stories'
1515
export { Disabled } from './Disabled.stories'
16+
export { Open } from './Open.stories'
1617
export { Controlled } from './Controlled.stories'
1718
export { Name } from './Name.stories'
1819
export { Draggable } from './Draggable.stories'

packages/ui/src/components/ExpandableCard/__tests__/index.test.tsx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,4 +122,19 @@ describe('ExpandableCard', () => {
122122
expect(onToggleExpand).toHaveBeenCalled()
123123
})
124124
})
125+
126+
test('works properly when uncontrolled and open', async () => {
127+
renderWithTheme(
128+
<ExpandableCard data-testid="expandablecard" header="Title" open>
129+
Content
130+
</ExpandableCard>,
131+
)
132+
133+
const title = screen.getByText('Title')
134+
const content = screen.getByText('Content')
135+
expect(content).toBeVisible()
136+
137+
await userEvent.click(title)
138+
expect(content).not.toBeVisible()
139+
})
125140
})

packages/ui/src/components/ExpandableCard/index.tsx

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@
33
import { useTheme } from '@emotion/react'
44
import styled from '@emotion/styled'
55
import { ArrowDownIcon, DragIcon } from '@ultraviolet/icons'
6-
import type { DragEvent, ForwardedRef, KeyboardEvent, ReactNode } from 'react'
6+
import type {
7+
DetailsHTMLAttributes,
8+
DragEvent,
9+
ForwardedRef,
10+
KeyboardEvent,
11+
ReactNode,
12+
} from 'react'
713
import { forwardRef, useCallback, useRef, useState } from 'react'
814
import type { XOR } from '../../types'
915
import { Stack } from '../Stack'
@@ -150,6 +156,8 @@ type CommonProps = {
150156
disabled?: boolean
151157
'data-testid'?: string
152158
className?: string
159+
/** Uncontrolled but open by default */
160+
open?: DetailsHTMLAttributes<HTMLDetailsElement>['open']
153161
} & DraggableProps
154162

155163
type ExpandableCardProps = XOR<
@@ -173,6 +181,7 @@ const BaseExpandableCard = forwardRef(
173181
index,
174182
onKeyDown,
175183
'data-testid': dataTestId,
184+
open,
176185
}: ExpandableCardProps,
177186
ref: ForwardedRef<HTMLDetailsElement>,
178187
) => {
@@ -291,7 +300,7 @@ const BaseExpandableCard = forwardRef(
291300
data-testid={dataTestId}
292301
key={clicking ? 'closed' : 'open'}
293302
name={name}
294-
open={expanded}
303+
open={open ?? expanded}
295304
ref={ref}
296305
tabIndex={disabled ? -1 : undefined}
297306
>

0 commit comments

Comments
 (0)