Skip to content

Commit 978fe76

Browse files
committed
feat: modify the accordion structure to obtain the context
1 parent 95addc7 commit 978fe76

File tree

6 files changed

+81
-49
lines changed

6 files changed

+81
-49
lines changed
Lines changed: 13 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,62 +1,30 @@
11
'use client';
22

33
import type { Root } from '@radix-ui/react-accordion';
4+
import type { ComponentRef } from 'react';
45
import { forwardRef } from 'react';
56

6-
import { cn } from '@/lib/utils';
7+
import { useComponentConfig } from '../config-provider/context';
78

8-
import AccordionContent from './AccordionContent';
9-
import AccordionHeader from './AccordionHeader';
10-
import AccordionItem from './AccordionItem';
11-
import AccordionRoot from './AccordionRoot';
12-
import AccordionTrigger from './AccordionTrigger';
13-
import { accordionVariants } from './accordion-variants';
9+
import AccordionUI from './AccordionUI';
1410
import type { AccordionProps } from './types';
1511

16-
const Accordion = forwardRef<React.ElementRef<typeof Root>, AccordionProps>((props, ref) => {
17-
const { className, classNames, items, size, triggerIcon, triggerLeading, triggerTrailing, ...rest } = props;
12+
const Accordion = forwardRef<ComponentRef<typeof Root>, AccordionProps>((props, ref) => {
13+
const config = useComponentConfig('accordion');
1814

19-
const { root } = accordionVariants({ size });
20-
21-
const mergedCls = cn(root(), className);
15+
const mergedProps = {
16+
...config,
17+
...props
18+
};
2219

2320
return (
24-
<AccordionRoot
25-
className={mergedCls}
21+
<AccordionUI
22+
{...mergedProps}
2623
ref={ref}
27-
{...rest}
28-
>
29-
{items.map(item => (
30-
<AccordionItem
31-
className={classNames?.item}
32-
disabled={item.disabled}
33-
key={item.value}
34-
value={item.value}
35-
>
36-
<AccordionHeader className={classNames?.header}>
37-
<AccordionTrigger
38-
className={classNames?.trigger}
39-
classNames={classNames}
40-
icon={triggerIcon}
41-
leading={item.leading || triggerLeading}
42-
size={size}
43-
trailing={item.trailing || triggerTrailing}
44-
>
45-
{item.title}
46-
</AccordionTrigger>
47-
</AccordionHeader>
48-
49-
<AccordionContent
50-
className={classNames?.content}
51-
size={size}
52-
>
53-
{item.children}
54-
</AccordionContent>
55-
</AccordionItem>
56-
))}
57-
</AccordionRoot>
24+
/>
5825
);
5926
});
27+
6028
Accordion.displayName = 'Accordion';
6129

6230
export default Accordion;
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import type { Root } from '@radix-ui/react-accordion';
2+
import { forwardRef } from 'react';
3+
4+
import AccordionContent from './AccordionContent';
5+
import AccordionHeader from './AccordionHeader';
6+
import AccordionItem from './AccordionItem';
7+
import AccordionRoot from './AccordionRoot';
8+
import AccordionTrigger from './AccordionTrigger';
9+
import type { AccordionProps } from './types';
10+
11+
const AccordionUI = forwardRef<React.ElementRef<typeof Root>, AccordionProps>((props, ref) => {
12+
const { className, classNames, dir, items, size, triggerIcon, triggerLeading, triggerTrailing, ...rest } = props;
13+
14+
return (
15+
<AccordionRoot
16+
className={className || classNames?.root}
17+
ref={ref}
18+
{...rest}
19+
>
20+
{items.map(item => (
21+
<AccordionItem
22+
className={classNames?.item}
23+
dir={dir}
24+
disabled={item.disabled}
25+
key={item.value}
26+
value={item.value}
27+
>
28+
<AccordionHeader
29+
className={classNames?.header}
30+
dir={dir}
31+
>
32+
<AccordionTrigger
33+
className={classNames?.trigger}
34+
classNames={classNames}
35+
dir={dir}
36+
icon={triggerIcon}
37+
leading={item.leading || triggerLeading}
38+
size={size}
39+
trailing={item.trailing || triggerTrailing}
40+
>
41+
{item.title}
42+
</AccordionTrigger>
43+
</AccordionHeader>
44+
45+
<AccordionContent
46+
className={classNames?.content}
47+
dir={dir}
48+
size={size}
49+
>
50+
{item.children}
51+
</AccordionContent>
52+
</AccordionItem>
53+
))}
54+
</AccordionRoot>
55+
);
56+
});
57+
AccordionUI.displayName = 'AccordionUI';
58+
59+
export default AccordionUI;

packages/ui/src/components/accordion/accordion-variants.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ export const accordionVariants = tv({
55
size: 'md'
66
},
77
slots: {
8-
content: [`overflow-hidden data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up`],
8+
content: [
9+
`overflow-hidden transition will-change-auto data-[state=open]:animate-accordion-down data-[state=closed]:animate-accordion-up`
10+
],
911
header: 'flex',
1012
item: 'border-b',
1113
root: '',

packages/ui/src/components/accordion/index.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ export { default as AccordionHeader } from './AccordionHeader';
44
export { default as AccordionItem } from './AccordionItem';
55
export { default as AccordionRoot } from './AccordionRoot';
66
export { default as AccordionTrigger } from './AccordionTrigger';
7+
export { default as AccordionUi } from './AccordionUI';
78

89
export * from './types';

packages/ui/src/components/accordion/types.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import type { BaseNodeProps, ClassValue, PropsSlot, ThemeSize } from '@/types/ot
1313
import type { AccordionSlots } from './accordion-variants';
1414

1515
/** The ui of the accordion. */
16-
export type AccordionUi = Partial<Record<AccordionSlots, ClassValue>>;
16+
export type AccordionClassNames = Partial<Record<AccordionSlots, ClassValue>>;
1717

1818
export type AccordionRootProps = BaseNodeProps<AccordionSingleProps> | BaseNodeProps<AccordionMultipleProps>;
1919

@@ -25,7 +25,7 @@ export interface AccordionItemProps extends BaseNodeProps<_AccordionItemProps> {
2525

2626
export interface AccordionTriggerProps extends BaseNodeProps<_AccordionTriggerProps>, PropsSlot {
2727
/** The ui of the accordion trigger. */
28-
classNames?: Pick<AccordionUi, 'triggerIcon' | 'triggerLeadingIcon'>;
28+
classNames?: Pick<AccordionClassNames, 'triggerIcon' | 'triggerLeadingIcon'>;
2929
icon?: React.ReactNode;
3030
}
3131

@@ -38,7 +38,7 @@ export interface AccordionItemData extends Pick<AccordionItemProps, 'disabled' |
3838
}
3939

4040
export type AccordionProps<T extends AccordionItemData = AccordionItemData> = AccordionRootProps & {
41-
classNames?: AccordionUi;
41+
classNames?: AccordionClassNames;
4242
items: T[];
4343
size?: ThemeSize;
4444
triggerIcon?: React.ReactNode;

packages/ui/src/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ export * from './components/checkbox';
2222

2323
export * from './components/chip';
2424

25+
export * from './components/config-provider';
26+
2527
export * from './components/divider';
2628

2729
export * from './components/label';

0 commit comments

Comments
 (0)