Skip to content

Commit 4d5a38a

Browse files
authored
Fluent: Add accordion primitive (#16789)
This is a simple accordion primitive wrapper on top of the Fluent accordion.
1 parent 2c7e3f0 commit 4d5a38a

File tree

2 files changed

+68
-31
lines changed

2 files changed

+68
-31
lines changed

packages/dev/inspector-v2/src/components/accordionPane.tsx

Lines changed: 12 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
// eslint-disable-next-line import/no-internal-modules
22

3-
import { Accordion, AccordionHeader, AccordionItem, AccordionPanel, makeStyles, Subtitle1, tokens } from "@fluentui/react-components";
4-
import { useMemo, useState, type ComponentType } from "react";
3+
import type { ComponentType } from "react";
4+
5+
import { makeStyles } from "@fluentui/react-components";
6+
import { useMemo, useState } from "react";
7+
8+
import { Accordion, AccordionSection } from "shared-ui-components/fluent/primitives/accordion";
59

610
export type AccordionSection = Readonly<{
711
/**
@@ -58,16 +62,6 @@ const useStyles = makeStyles({
5862
display: "flex",
5963
flexDirection: "column",
6064
},
61-
placeholderDiv: {
62-
padding: `${tokens.spacingVerticalM} ${tokens.spacingHorizontalM}`,
63-
},
64-
accordion: {
65-
overflowY: "auto",
66-
paddingBottom: tokens.spacingVerticalM,
67-
display: "flex",
68-
flexDirection: "column",
69-
rowGap: tokens.spacingVerticalM,
70-
},
7165
panelDiv: {
7266
display: "flex",
7367
flexDirection: "column",
@@ -122,27 +116,14 @@ export function AccordionPane<ContextT = unknown>(props: {
122116
return (
123117
<div className={classes.rootDiv}>
124118
{visibleSections.length > 0 && (
125-
<Accordion
126-
key={version}
127-
className={classes.accordion}
128-
collapsible
129-
multiple
130-
defaultOpenItems={visibleSections.filter((section) => !section.collapseByDefault).map((section) => section.identity.description)}
131-
>
119+
<Accordion key={version}>
132120
{visibleSections.map((section) => {
133121
return (
134-
<AccordionItem key={section.identity.description} value={section.identity.description}>
135-
<AccordionHeader expandIconPosition="end">
136-
<Subtitle1>{section.identity.description}</Subtitle1>
137-
</AccordionHeader>
138-
<AccordionPanel>
139-
<div className={classes.panelDiv}>
140-
{section.components.map((component) => {
141-
return <component.component key={component.key} context={context} />;
142-
})}
143-
</div>
144-
</AccordionPanel>
145-
</AccordionItem>
122+
<AccordionSection key={section.identity.description} title={section.identity.description!}>
123+
{section.components.map((component) => {
124+
return <component.component key={component.key} context={context} />;
125+
})}
126+
</AccordionSection>
146127
);
147128
})}
148129
</Accordion>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
import type { FunctionComponent, PropsWithChildren } from "react";
2+
3+
import { Children, isValidElement } from "react";
4+
5+
import { Accordion as FluentAccordion, AccordionItem, AccordionHeader, AccordionPanel, Subtitle1, makeStyles, tokens } from "@fluentui/react-components";
6+
7+
const useStyles = makeStyles({
8+
accordion: {
9+
overflowY: "auto",
10+
paddingBottom: tokens.spacingVerticalM,
11+
display: "flex",
12+
flexDirection: "column",
13+
rowGap: tokens.spacingVerticalM,
14+
},
15+
panelDiv: {
16+
display: "flex",
17+
flexDirection: "column",
18+
overflow: "hidden",
19+
},
20+
});
21+
22+
export type AccordionSectionProps = {
23+
title: string;
24+
};
25+
26+
export const AccordionSection: FunctionComponent<PropsWithChildren<AccordionSectionProps>> = (props) => {
27+
const classes = useStyles();
28+
29+
return <div className={classes.panelDiv}>{props.children}</div>;
30+
};
31+
32+
export const Accordion: FunctionComponent<PropsWithChildren> = (props) => {
33+
const classes = useStyles();
34+
35+
const { children, ...rest } = props;
36+
37+
return (
38+
<FluentAccordion className={classes.accordion} collapsible multiple defaultOpenItems={Array.from({ length: Children.count(children) }, (_, index) => index)} {...rest}>
39+
{Children.map(children, (child, index) => {
40+
if (isValidElement(child)) {
41+
return (
42+
<AccordionItem key={child.props.title} value={index}>
43+
<AccordionHeader expandIconPosition="end">
44+
<Subtitle1>{child.props.title}</Subtitle1>
45+
</AccordionHeader>
46+
<AccordionPanel>
47+
<div className={classes.panelDiv}>{child}</div>
48+
</AccordionPanel>
49+
</AccordionItem>
50+
);
51+
}
52+
return null;
53+
})}
54+
</FluentAccordion>
55+
);
56+
};

0 commit comments

Comments
 (0)