Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[accordion] New Accordion components and hooks #577

Open
wants to merge 48 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
a64950b
Provide Collapsible content width css var
mj12albert Sep 3, 2024
ab49d59
New Accordion hooks and components
mj12albert Aug 22, 2024
12353ff
Add docs and demos
mj12albert Sep 4, 2024
adb4ce2
Misc fixes
mj12albert Sep 4, 2024
357b1f5
Refactor useCollapsibleTrigger with useButton
mj12albert Sep 4, 2024
a211d7b
Fix review comments
mj12albert Sep 11, 2024
895872c
Rename subcomponents
mj12albert Sep 11, 2024
9605d9f
Support focus loop
mj12albert Sep 11, 2024
bfc09a1
Add tests
mj12albert Sep 16, 2024
3c687fa
Rename data-state for Accordion and Collapsible
mj12albert Sep 17, 2024
28978bb
Use a boolean prop to apply hidden-until-found
mj12albert Sep 17, 2024
c16a64a
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Sep 19, 2024
80b04e0
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Sep 20, 2024
0301088
PR review fixes
mj12albert Sep 23, 2024
d00847d
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 9, 2024
b37d00e
Rename onOpenChange to onValueChange and misc fixes
mj12albert Oct 9, 2024
b7c09a0
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 9, 2024
d8d2b68
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 13, 2024
85a3e12
Update experiments
mj12albert Oct 13, 2024
a26bf03
[core] Increase the minimum Node.js version support to 14.0.0 (#658)
oliviertassinari Oct 10, 2024
95e7a1c
Bump Public packages' dependencies (major) (#725)
renovate[bot] Oct 11, 2024
2572aa2
Bump Public packages' dependencies (#724)
renovate[bot] Oct 11, 2024
c28dcf1
[examples] Avoid git diff when playing with examples
oliviertassinari Oct 13, 2024
ef3c012
[Checkbox][Switch] Split data-state into data-checked, data-unchecked…
atomiks Oct 14, 2024
094b558
[core] Improve DX of importing Base UI components (#700)
michaldudak Oct 14, 2024
19cfa44
Update exports and types
mj12albert Oct 14, 2024
24be486
Update demos
mj12albert Oct 14, 2024
24a9abc
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 15, 2024
c76e668
Merge collapsible internal height and width states
mj12albert Oct 15, 2024
f87d7f0
Finalize demo margin padding
mj12albert Oct 16, 2024
283ec66
Refactor collapsible content internals
mj12albert Oct 15, 2024
0d2b45f
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 16, 2024
ddc2547
Improve getting computed styles performance
mj12albert Oct 16, 2024
0b5458f
Rename Collapsible.Content to Panel
mj12albert Oct 16, 2024
7ad7ce1
Update style hooks
mj12albert Oct 16, 2024
710c2cd
Improve tests
mj12albert Oct 16, 2024
788facc
Merge branch 'master' into feat/accordion
mj12albert Oct 16, 2024
5a7803e
Update docs
mj12albert Oct 17, 2024
707249d
Fixes
mj12albert Oct 17, 2024
743c07e
Rename
mj12albert Oct 17, 2024
49598c5
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 17, 2024
ca7e9b4
Fix contexts
mj12albert Oct 17, 2024
8e0df16
Update experiments
mj12albert Oct 17, 2024
03e0ec4
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 21, 2024
7dce2b3
prettier
mj12albert Oct 21, 2024
0321519
Merge remote-tracking branch 'upstream/master' into feat/accordion
mj12albert Oct 22, 2024
fc14621
Fix review comments
mj12albert Oct 22, 2024
e1134df
Universally update style hooks from data-attr='true' to data-attr
mj12albert Oct 22, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 19 additions & 0 deletions docs/data/api/accordion-header.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "AccordionHeader",
"imports": [
"import { Accordion } from '@base_ui/react/Accordion';\nconst AccordionHeader = Accordion.Header;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "AccordionHeader",
"forwardsRefTo": "HTMLHeadingElement",
"filename": "/packages/mui-base/src/Accordion/Header/AccordionHeader.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-accordion/\">Accordion</a></li></ul>",
"cssComponent": false
}
19 changes: 19 additions & 0 deletions docs/data/api/accordion-heading.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "AccordionHeading",
"imports": [
"import { Accordion } from '@base_ui/react/Accordion';\nconst AccordionHeading = Accordion.Heading;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "AccordionHeading",
"forwardsRefTo": "HTMLHeadingElement",
"filename": "/packages/mui-base/src/Accordion/Heading/AccordionHeading.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-accordion/\">Accordion</a></li></ul>",
"cssComponent": false
}
21 changes: 21 additions & 0 deletions docs/data/api/accordion-item.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"disabled": { "type": { "name": "bool" }, "default": "false" },
"onOpenChange": { "type": { "name": "func" } },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "AccordionItem",
"imports": [
"import { Accordion } from '@base_ui/react/Accordion';\nconst AccordionItem = Accordion.Item;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "AccordionItem",
"forwardsRefTo": "HTMLDivElement",
"filename": "/packages/mui-base/src/Accordion/Item/AccordionItem.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-accordion/\">Accordion</a></li></ul>",
"cssComponent": false
}
20 changes: 20 additions & 0 deletions docs/data/api/accordion-panel.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"hiddenUntilFound": { "type": { "name": "bool" }, "default": "false" },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "AccordionPanel",
"imports": [
"import { Accordion } from '@base_ui/react/Accordion';\nconst AccordionPanel = Accordion.Panel;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "AccordionPanel",
"forwardsRefTo": "HTMLDivElement",
"filename": "/packages/mui-base/src/Accordion/Panel/AccordionPanel.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-accordion/\">Accordion</a></li></ul>",
"cssComponent": false
}
31 changes: 31 additions & 0 deletions docs/data/api/accordion-root.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
"props": {
"animated": { "type": { "name": "bool" }, "default": "true" },
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"defaultValue": {
"type": { "name": "arrayOf", "description": "Array&lt;number<br>&#124;&nbsp;string&gt;" },
"default": "0"
},
"disabled": { "type": { "name": "bool" }, "default": "false" },
"loop": { "type": { "name": "bool" }, "default": "true" },
"onValueChange": { "type": { "name": "func" } },
"openMultiple": { "type": { "name": "bool" }, "default": "true" },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } },
"value": {
"type": { "name": "arrayOf", "description": "Array&lt;number<br>&#124;&nbsp;string&gt;" }
}
},
"name": "AccordionRoot",
"imports": [
"import { Accordion } from '@base_ui/react/Accordion';\nconst AccordionRoot = Accordion.Root;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "AccordionRoot",
"forwardsRefTo": "HTMLDivElement",
"filename": "/packages/mui-base/src/Accordion/Root/AccordionRoot.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-accordion/\">Accordion</a></li></ul>",
"cssComponent": false
}
21 changes: 21 additions & 0 deletions docs/data/api/accordion-section.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"disabled": { "type": { "name": "bool" }, "default": "false" },
"onOpenChange": { "type": { "name": "func" } },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "AccordionSection",
"imports": [
"import { Accordion } from '@base_ui/react/Accordion';\nconst AccordionSection = Accordion.Section;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "AccordionSection",
"forwardsRefTo": "HTMLDivElement",
"filename": "/packages/mui-base/src/Accordion/Section/AccordionSection.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-accordion/\">Accordion</a></li></ul>",
"cssComponent": false
}
19 changes: 19 additions & 0 deletions docs/data/api/accordion-trigger.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "AccordionTrigger",
"imports": [
"import { Accordion } from '@base_ui/react/Accordion';\nconst AccordionTrigger = Accordion.Trigger;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "AccordionTrigger",
"forwardsRefTo": "HTMLButtonElement",
"filename": "/packages/mui-base/src/Accordion/Trigger/AccordionTrigger.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-accordion/\">Accordion</a></li></ul>",
"cssComponent": false
}
5 changes: 1 addition & 4 deletions docs/data/api/collapsible-content.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"htmlHidden": {
"type": { "name": "enum", "description": "'hidden'<br>&#124;&nbsp;'until-found'" },
"default": "'hidden'"
},
"hiddenUntilFound": { "type": { "name": "bool" }, "default": "false" },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "CollapsibleContent",
Expand Down
20 changes: 20 additions & 0 deletions docs/data/api/collapsible-panel.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
{
"props": {
"className": { "type": { "name": "union", "description": "func<br>&#124;&nbsp;string" } },
"hiddenUntilFound": { "type": { "name": "bool" }, "default": "false" },
"render": { "type": { "name": "union", "description": "element<br>&#124;&nbsp;func" } }
},
"name": "CollapsiblePanel",
"imports": [
"import { Collapsible } from '@base_ui/react/Collapsible';\nconst CollapsiblePanel = Collapsible.Panel;"
],
"classes": [],
"spread": true,
"themeDefaultProps": true,
"muiName": "CollapsiblePanel",
"forwardsRefTo": "HTMLDivElement",
"filename": "/packages/mui-base/src/Collapsible/Panel/CollapsiblePanel.tsx",
"inheritance": null,
"demos": "<ul><li><a href=\"/components/react-collapsible/\">Collapsible</a></li></ul>",
"cssComponent": false
}
8 changes: 8 additions & 0 deletions docs/data/api/use-accordion-root.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"parameters": {},
"returnValue": {},
"name": "useAccordionRoot",
"filename": "/packages/mui-base/src/Accordion/Root/useAccordionRoot.ts",
"imports": ["import { useAccordionRoot } from '@base_ui/react/Accordion';"],
"demos": "<ul><li><a href=\"/base-ui/react-accordion/#hook\">Accordion</a></li></ul>"
}
61 changes: 61 additions & 0 deletions docs/data/components/accordion/UnstyledAccordionIntroduction.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
'use client';
import * as React from 'react';
import { Accordion } from '@base_ui/react/Accordion';
import classes from './styles.module.css';

export default function UnstyledAccordionIntroduction() {
return (
<div className={classes.demo}>
<Accordion.Root className={classes.root} aria-label="Base UI Accordion">
<Accordion.Item className={classes.item}>
<Accordion.Header className={classes.header}>
<Accordion.Trigger className={classes.trigger}>
<span className={classes.triggerText}>Trigger 1</span>
<ExpandMoreIcon />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Panel className={classes.panel}>
This is the contents of Accordion.Panel 1
</Accordion.Panel>
</Accordion.Item>
<Accordion.Item className={classes.item}>
<Accordion.Header className={classes.header}>
<Accordion.Trigger className={classes.trigger}>
<span className={classes.triggerText}>Trigger 2</span>
<ExpandMoreIcon />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Panel className={classes.panel}>
This is the contents of Accordion.Panel 2
</Accordion.Panel>
</Accordion.Item>
<Accordion.Item className={classes.item}>
<Accordion.Header className={classes.header}>
<Accordion.Trigger className={classes.trigger}>
<span className={classes.triggerText}>Trigger 3</span>
<ExpandMoreIcon />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Panel className={classes.panel}>
This is the contents of Accordion.Panel 3
</Accordion.Panel>
</Accordion.Item>
</Accordion.Root>
</div>
);
}

function ExpandMoreIcon(props) {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
{...props}
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
>
<path d="M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z" fill="currentColor" />
</svg>
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
'use client';
import * as React from 'react';
import { Accordion } from '@base_ui/react/Accordion';
import classes from './styles.module.css';

export default function UnstyledAccordionIntroduction() {
return (
<div className={classes.demo}>
<Accordion.Root className={classes.root} aria-label="Base UI Accordion">
<Accordion.Item className={classes.item}>
<Accordion.Header className={classes.header}>
<Accordion.Trigger className={classes.trigger}>
<span className={classes.triggerText}>Trigger 1</span>
<ExpandMoreIcon />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Panel className={classes.panel}>
This is the contents of Accordion.Panel 1
</Accordion.Panel>
</Accordion.Item>
<Accordion.Item className={classes.item}>
<Accordion.Header className={classes.header}>
<Accordion.Trigger className={classes.trigger}>
<span className={classes.triggerText}>Trigger 2</span>
<ExpandMoreIcon />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Panel className={classes.panel}>
This is the contents of Accordion.Panel 2
</Accordion.Panel>
</Accordion.Item>
<Accordion.Item className={classes.item}>
<Accordion.Header className={classes.header}>
<Accordion.Trigger className={classes.trigger}>
<span className={classes.triggerText}>Trigger 3</span>
<ExpandMoreIcon />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Panel className={classes.panel}>
This is the contents of Accordion.Panel 3
</Accordion.Panel>
</Accordion.Item>
</Accordion.Root>
</div>
);
}

function ExpandMoreIcon(props: React.SVGProps<SVGSVGElement>) {
return (
<svg
xmlns="http://www.w3.org/2000/svg"
{...props}
width="24"
height="24"
viewBox="0 0 24 24"
fill="none"
>
<path d="M16.59 8.59 12 13.17 7.41 8.59 6 10l6 6 6-6z" fill="currentColor" />
</svg>
);
}
Loading