Skip to content

Commit 60e5930

Browse files
authored
feat(react-accordion): expose base hooks and types for Accordion components (#35897)
1 parent 11e5094 commit 60e5930

10 files changed

Lines changed: 82 additions & 23 deletions

File tree

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"type": "minor",
3+
"comment": "feat: expose base hooks and types for Accordion components",
4+
"packageName": "@fluentui/react-accordion",
5+
"email": "dmytrokirpa@microsoft.com",
6+
"dependentChangeType": "patch"
7+
}

packages/react-components/react-accordion/library/etc/react-accordion.api.md

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ import type { SlotClassNames } from '@fluentui/react-utilities';
2121
// @public
2222
export const Accordion: ForwardRefComponent<AccordionProps> & (<TItem>(props: AccordionProps<TItem>) => JSXElement);
2323

24+
// @public (undocumented)
25+
export type AccordionBaseProps<Value = AccordionItemValue> = Omit<AccordionProps<Value>, 'navigation'>;
26+
27+
// @public (undocumented)
28+
export type AccordionBaseState<Value = AccordionItemValue> = Omit<AccordionState<Value>, 'navigation'>;
29+
2430
// @public (undocumented)
2531
export const accordionClassNames: SlotClassNames<AccordionSlots>;
2632

@@ -41,6 +47,12 @@ export type AccordionContextValues = {
4147
// @public
4248
export const AccordionHeader: ForwardRefComponent<AccordionHeaderProps>;
4349

50+
// @public (undocumented)
51+
export type AccordionHeaderBaseProps = Omit<AccordionHeaderProps, 'inline' | 'size'>;
52+
53+
// @public (undocumented)
54+
export type AccordionHeaderBaseState = Omit<AccordionHeaderState, 'inline' | 'size'>;
55+
4456
// @public (undocumented)
4557
export const accordionHeaderClassNames: SlotClassNames<AccordionHeaderSlots>;
4658

@@ -129,6 +141,12 @@ export type AccordionItemValue = unknown;
129141
// @public
130142
export const AccordionPanel: ForwardRefComponent<AccordionPanelProps>;
131143

144+
// @public (undocumented)
145+
export type AccordionPanelBaseProps = ComponentProps<Omit<AccordionPanelSlots, 'collapseMotion'>>;
146+
147+
// @public (undocumented)
148+
export type AccordionPanelBaseState = ComponentState<Omit<AccordionPanelSlots, 'collapseMotion'>> & Pick<AccordionPanelState, 'open'>;
149+
132150
// @public (undocumented)
133151
export const accordionPanelClassNames: SlotClassNames<Omit<AccordionPanelSlots, 'collapseMotion'>>;
134152

@@ -180,10 +198,10 @@ export type AccordionToggleEvent<E = HTMLElement> = React_2.MouseEvent<E> | Reac
180198
export type AccordionToggleEventHandler<Value = AccordionItemValue> = (event: AccordionToggleEvent, data: AccordionToggleData<Value>) => void;
181199

182200
// @public
183-
export const renderAccordion_unstable: (state: AccordionState, contextValues: AccordionContextValues) => JSXElement;
201+
export const renderAccordion_unstable: (state: AccordionBaseState, contextValues: AccordionContextValues) => JSXElement;
184202

185203
// @public
186-
export const renderAccordionHeader_unstable: (state: AccordionHeaderState, contextValues: AccordionHeaderContextValues) => JSXElement;
204+
export const renderAccordionHeader_unstable: (state: AccordionHeaderBaseState, contextValues: AccordionHeaderContextValues) => JSXElement;
187205

188206
// @public
189207
export const renderAccordionItem_unstable: (state: AccordionItemState, contextValues: AccordionItemContextValues) => JSXElement;
@@ -194,6 +212,9 @@ export const renderAccordionPanel_unstable: (state: AccordionPanelState) => JSXE
194212
// @public
195213
export const useAccordion_unstable: <Value = unknown>(props: AccordionProps<Value>, ref: React_2.Ref<HTMLElement>) => AccordionState<Value>;
196214

215+
// @public
216+
export const useAccordionBase_unstable: <Value = unknown>(props: AccordionBaseProps<Value>, ref: React_2.Ref<HTMLElement>) => AccordionBaseState<Value>;
217+
197218
// @public (undocumented)
198219
export const useAccordionContext_unstable: <T>(selector: ContextSelector<AccordionContextValue, T>) => T;
199220

@@ -203,6 +224,9 @@ export function useAccordionContextValues_unstable(state: AccordionState): Accor
203224
// @public
204225
export const useAccordionHeader_unstable: (props: AccordionHeaderProps, ref: React_2.Ref<HTMLElement>) => AccordionHeaderState;
205226

227+
// @public
228+
export const useAccordionHeaderBase_unstable: (props: AccordionHeaderBaseProps, ref: React_2.Ref<HTMLElement>) => AccordionHeaderBaseState;
229+
206230
// @public (undocumented)
207231
export const useAccordionHeaderContext_unstable: () => AccordionHeaderContextValue;
208232

@@ -227,6 +251,9 @@ export const useAccordionItemStyles_unstable: (state: AccordionItemState) => Acc
227251
// @public
228252
export const useAccordionPanel_unstable: (props: AccordionPanelProps, ref: React_2.Ref<HTMLElement>) => AccordionPanelState;
229253

254+
// @public
255+
export const useAccordionPanelBase_unstable: (props: AccordionPanelBaseProps, ref: React_2.Ref<HTMLElement>) => AccordionPanelBaseState;
256+
230257
// @public
231258
export const useAccordionPanelStyles_unstable: (state: AccordionPanelState) => AccordionPanelState;
232259

packages/react-components/react-accordion/library/src/AccordionHeader.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ export type {
55
AccordionHeaderSize,
66
AccordionHeaderSlots,
77
AccordionHeaderState,
8+
AccordionHeaderBaseState,
9+
AccordionHeaderBaseProps,
810
} from './components/AccordionHeader/index';
911
export {
1012
AccordionHeader,

packages/react-components/react-accordion/library/src/components/Accordion/renderAccordion.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,16 @@
44
import { assertSlots } from '@fluentui/react-utilities';
55
import type { JSXElement } from '@fluentui/react-utilities';
66

7-
import type { AccordionState, AccordionSlots, AccordionContextValues } from './Accordion.types';
7+
import type { AccordionBaseState, AccordionSlots, AccordionContextValues } from './Accordion.types';
88
import { AccordionProvider } from '../../contexts/accordion';
99

1010
/**
1111
* Function that renders the final JSX of the component
1212
*/
13-
export const renderAccordion_unstable = (state: AccordionState, contextValues: AccordionContextValues): JSXElement => {
13+
export const renderAccordion_unstable = (
14+
state: AccordionBaseState,
15+
contextValues: AccordionContextValues,
16+
): JSXElement => {
1417
assertSlots<AccordionSlots>(state);
1518

1619
return (

packages/react-components/react-accordion/library/src/components/Accordion/useAccordion.test.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ describe('useAccordionBase', () => {
144144
state.root.className,
145145
);
146146

147-
const contextValues = useAccordionHeaderContextValues_unstable(state);
147+
const contextValues = useAccordionHeaderContextValues_unstable(state as AccordionHeaderState);
148148
return renderAccordionHeader_unstable(state as AccordionHeaderState, contextValues);
149149
});
150150

packages/react-components/react-accordion/library/src/components/AccordionHeader/AccordionHeader.types.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ export type AccordionHeaderProps = ComponentProps<Partial<AccordionHeaderSlots>>
4545
size?: AccordionHeaderSize;
4646
};
4747

48+
export type AccordionHeaderBaseProps = Omit<AccordionHeaderProps, 'inline' | 'size'>;
49+
4850
export type AccordionHeaderState = ComponentState<AccordionHeaderSlots> &
4951
Required<Pick<AccordionHeaderProps, 'inline'>> &
5052
AccordionHeaderContextValue;
53+
54+
export type AccordionHeaderBaseState = Omit<AccordionHeaderState, 'inline' | 'size'>;

packages/react-components/react-accordion/library/src/components/AccordionHeader/index.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ export type {
66
AccordionHeaderSize,
77
AccordionHeaderSlots,
88
AccordionHeaderState,
9+
AccordionHeaderBaseState,
10+
AccordionHeaderBaseProps,
911
} from './AccordionHeader.types';
1012
export { renderAccordionHeader_unstable } from './renderAccordionHeader';
1113
export { useAccordionHeader_unstable, useAccordionHeaderBase_unstable } from './useAccordionHeader';

packages/react-components/react-accordion/library/src/components/AccordionHeader/renderAccordionHeader.tsx

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,18 @@
33

44
import { assertSlots } from '@fluentui/react-utilities';
55
import type { JSXElement } from '@fluentui/react-utilities';
6-
import type { AccordionHeaderState, AccordionHeaderSlots, AccordionHeaderContextValues } from './AccordionHeader.types';
6+
import type {
7+
AccordionHeaderBaseState,
8+
AccordionHeaderSlots,
9+
AccordionHeaderContextValues,
10+
} from './AccordionHeader.types';
711
import { AccordionHeaderProvider } from '../../contexts/accordionHeader';
812

913
/**
1014
* Function that renders the final JSX of the component
1115
*/
1216
export const renderAccordionHeader_unstable = (
13-
state: AccordionHeaderState,
17+
state: AccordionHeaderBaseState,
1418
contextValues: AccordionHeaderContextValues,
1519
): JSXElement => {
1620
assertSlots<AccordionHeaderSlots>(state);

packages/react-components/react-accordion/library/src/components/AccordionHeader/useAccordionHeader.tsx

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,12 @@
33
import * as React from 'react';
44
import { useEventCallback, slot, isResolvedShorthand } from '@fluentui/react-utilities';
55
import { useARIAButtonProps } from '@fluentui/react-aria';
6-
import type { AccordionHeaderProps, AccordionHeaderState } from './AccordionHeader.types';
6+
import type {
7+
AccordionHeaderBaseProps,
8+
AccordionHeaderBaseState,
9+
AccordionHeaderProps,
10+
AccordionHeaderState,
11+
} from './AccordionHeader.types';
712
import { useAccordionContext_unstable } from '../../contexts/accordion';
813
import { ChevronRightRegular } from '@fluentui/react-icons';
914
import { useFluent_unstable as useFluent } from '@fluentui/react-shared-contexts';
@@ -20,7 +25,8 @@ export const useAccordionHeader_unstable = (
2025
props: AccordionHeaderProps,
2126
ref: React.Ref<HTMLElement>,
2227
): AccordionHeaderState => {
23-
const state = useAccordionHeaderBase_unstable(props, ref);
28+
const { inline = false, size = 'medium', ...baseProps } = props;
29+
const state = useAccordionHeaderBase_unstable(baseProps, ref);
2430
const { dir } = useFluent();
2531

2632
// Calculate how to rotate the expand icon [>] (ChevronRightRegular)
@@ -44,7 +50,7 @@ export const useAccordionHeader_unstable = (
4450
);
4551
}
4652

47-
return state;
53+
return { ...state, inline, size };
4854
};
4955

5056
/**
@@ -54,10 +60,10 @@ export const useAccordionHeader_unstable = (
5460
* @param ref - reference to root HTMLElement of AccordionHeader
5561
*/
5662
export const useAccordionHeaderBase_unstable = (
57-
props: AccordionHeaderProps,
63+
props: AccordionHeaderBaseProps,
5864
ref: React.Ref<HTMLElement>,
59-
): AccordionHeaderState => {
60-
const { icon, button, expandIcon, inline = false, size = 'medium', expandIconPosition = 'start', ...rest } = props;
65+
): AccordionHeaderBaseState => {
66+
const { icon, button, expandIcon, expandIconPosition = 'start', ...rest } = props;
6167
const { value, disabled, open } = useAccordionItemContext_unstable();
6268
const requestToggle = useAccordionContext_unstable(ctx => ctx.requestToggle);
6369

@@ -89,8 +95,6 @@ export const useAccordionHeaderBase_unstable = (
8995
return {
9096
disabled,
9197
open,
92-
size,
93-
inline,
9498
expandIconPosition,
9599
components: {
96100
root: 'div',

packages/react-components/react-accordion/library/src/index.ts

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ export {
55
useAccordionContextValues_unstable,
66
useAccordionStyles_unstable,
77
useAccordion_unstable,
8+
useAccordionBase_unstable,
89
} from './Accordion';
910
export type {
1011
AccordionContextValues,
@@ -15,6 +16,8 @@ export type {
1516
AccordionToggleData,
1617
AccordionToggleEvent,
1718
AccordionToggleEventHandler,
19+
AccordionBaseState,
20+
AccordionBaseProps,
1821
} from './Accordion';
1922
export {
2023
AccordionItem,
@@ -38,6 +41,7 @@ export {
3841
useAccordionHeaderContextValues_unstable,
3942
useAccordionHeaderStyles_unstable,
4043
useAccordionHeader_unstable,
44+
useAccordionHeaderBase_unstable,
4145
} from './AccordionHeader';
4246
export type {
4347
AccordionHeaderContextValues,
@@ -46,15 +50,24 @@ export type {
4650
AccordionHeaderSize,
4751
AccordionHeaderSlots,
4852
AccordionHeaderState,
53+
AccordionHeaderBaseState,
54+
AccordionHeaderBaseProps,
4955
} from './AccordionHeader';
5056
export {
5157
AccordionPanel,
5258
accordionPanelClassNames,
5359
renderAccordionPanel_unstable,
5460
useAccordionPanelStyles_unstable,
5561
useAccordionPanel_unstable,
62+
useAccordionPanelBase_unstable,
63+
} from './AccordionPanel';
64+
export type {
65+
AccordionPanelProps,
66+
AccordionPanelSlots,
67+
AccordionPanelState,
68+
AccordionPanelBaseState,
69+
AccordionPanelBaseProps,
5670
} from './AccordionPanel';
57-
export type { AccordionPanelProps, AccordionPanelSlots, AccordionPanelState } from './AccordionPanel';
5871

5972
export { AccordionProvider, useAccordionContext_unstable } from './contexts/accordion';
6073

@@ -67,10 +80,3 @@ export type { AccordionItemContextValue } from './contexts/accordionItem';
6780
export { AccordionHeaderProvider, useAccordionHeaderContext_unstable } from './contexts/accordionHeader';
6881

6982
export type { AccordionHeaderContextValue } from './contexts/accordionHeader';
70-
71-
// Experimental APIs
72-
// export type { AccordionBaseState, AccordionBaseProps } from './Accordion';
73-
// export { useAccordionBase_unstable } from './Accordion';
74-
// export { useAccordionHeaderBase_unstable } from './AccordionHeader';
75-
// export type { AccordionPanelBaseState, AccordionPanelBaseProps } from './AccordionPanel';
76-
// export { useAccordionPanelBase_unstable } from './AccordionPanel';

0 commit comments

Comments
 (0)