Accordion
A collapsible component that displays content in a vertical stack.
import { defineConfig } from '@pandacss/dev'
import { createPreset } from '@park-ui/panda-preset'
export default defineConfig({
preflight: true,
presets: [
'@pandacss/preset-base',
createPreset({
accentColor: '__ACCENT_COLOR__',
grayColor: '__GRAY_COLOR__',
borderRadius: '__BORDER_RADIUS__',
}),
],
include: ['./src/**/*.{js,jsx,ts,tsx}'],
jsxFramework: '__JS_FRAMEWORK__',
outdir: 'styled-system',
})
import { parkwindPlugin } from '@park-ui/tailwind-plugin'
import type { Config } from 'tailwindcss'
const config: Config = {
content: ['./src/**/*.{astro,html,js,jsx,svelte,ts,tsx,vue}'],
theme: {
extend: {},
},
plugins: [parkwindPlugin],
parkUI: {
accentColor: '__ACCENT_COLOR__',
grayColor: '__GRAY_COLOR__',
borderRadius: '__BORDER_RADIUS__',
},
darkMode: ['class'],
}
export default config
A collapsible component that displays content in a vertical stack.
import { ChevronDownIcon } from 'lucide-react'
import * as Accordion from '~/components/ui/accordion'
export const Demo = (props: Accordion.RootProps) => {
const items = ['React', 'Solid', 'Svelte', 'Vue']
return (
<Accordion.Root defaultValue={['React']} multiple {...props}>
{items.map((item, id) => (
<Accordion.Item key={id} value={item} disabled={item === 'Svelte'}>
<Accordion.ItemTrigger>
{item}
<Accordion.ItemIndicator>
<ChevronDownIcon />
</Accordion.ItemIndicator>
</Accordion.ItemTrigger>
<Accordion.ItemContent>
Pudding donut gummies chupa chups oat cake marzipan biscuit tart. Dessert macaroon ice
cream bonbon jelly. Jelly topping tiramisu halvah lollipop.
</Accordion.ItemContent>
</Accordion.Item>
))}
</Accordion.Root>
)
}
Insert code snippet into your project. Update import paths as needed.
import { Accordion } from '@ark-ui/react/accordion'
import type { ComponentProps } from 'react'
import { styled } from 'styled-system/jsx'
import { accordion } from 'styled-system/recipes'
import { createStyleContext } from '~/lib/create-style-context'
const { withProvider, withContext } = createStyleContext(accordion)
export const Root = withProvider(styled(Accordion.Root), 'root')
export const Item = withContext(styled(Accordion.Item), 'item')
export const ItemContent = withContext(styled(Accordion.ItemContent), 'itemContent')
export const ItemIndicator = withContext(styled(Accordion.ItemIndicator), 'itemIndicator')
export const ItemTrigger = withContext(styled(Accordion.ItemTrigger), 'itemTrigger')
export interface RootProps extends ComponentProps<typeof Root> {}
export interface ItemProps extends ComponentProps<typeof Item> {}
export interface ItemContentProps extends ComponentProps<typeof ItemContent> {}
export interface ItemIndicatorProps extends ComponentProps<typeof ItemIndicator> {}
export interface ItemTriggerProps extends ComponentProps<typeof ItemTrigger> {}
import { Accordion } from '@ark-ui/solid'
import type { ComponentProps } from 'solid-js'
import { styled } from 'styled-system/jsx'
import { accordion } from 'styled-system/recipes'
import { createStyleContext } from '~/lib/create-style-context'
const { withProvider, withContext } = createStyleContext(accordion)
export const Root = withProvider(styled(Accordion.Root), 'root')
export const Item = withContext(styled(Accordion.Item), 'item')
export const ItemContent = withContext(styled(Accordion.ItemContent), 'itemContent')
export const ItemIndicator = withContext(styled(Accordion.ItemIndicator), 'itemIndicator')
export const ItemTrigger = withContext(styled(Accordion.ItemTrigger), 'itemTrigger')
export interface RootProps extends ComponentProps<typeof Root> {}
export interface ItemProps extends ComponentProps<typeof Item> {}
export interface ItemContentProps extends ComponentProps<typeof ItemContent> {}
export interface ItemIndicatorProps extends ComponentProps<typeof ItemIndicator> {}
export interface ItemTriggerProps extends ComponentProps<typeof ItemTrigger> {}
Not yet available
This step is necessary only if you do not use any of the Park UI plugins.
import { accordionAnatomy } from '@ark-ui/anatomy'
import { defineSlotRecipe } from '@pandacss/dev'
export const accordion = defineSlotRecipe({
className: 'accordion',
slots: accordionAnatomy.keys(),
base: {
root: {
divideY: '1px',
width: 'full',
borderTopWidth: '1px',
borderBottomWidth: '1px',
},
itemTrigger: {
alignItems: 'center',
color: 'fg.default',
cursor: 'pointer',
display: 'flex',
fontWeight: 'semibold',
gap: '3',
justifyContent: 'space-between',
textStyle: 'lg',
textAlign: 'left',
width: 'full',
_disabled: {
color: 'fg.disabled',
cursor: 'not-allowed',
},
},
itemIndicator: {
color: 'fg.muted',
transformOrigin: 'center',
transitionDuration: 'normal',
transitionProperty: 'transform',
transitionTimingFunction: 'default',
_open: {
transform: 'rotate(-180deg)',
},
},
itemContent: {
color: 'fg.muted',
overflow: 'hidden',
transitionProperty: 'padding-bottom',
transitionDuration: 'normal',
transitionTimingFunction: 'default',
_open: {
animation: 'collapse-in',
},
_closed: {
animation: 'collapse-out',
},
},
},
defaultVariants: {
size: 'md',
},
variants: {
size: {
md: {
itemTrigger: {
py: '4',
},
itemContent: {
pb: '6',
pr: '8',
_closed: {
pb: '0',
},
},
},
},
},
})