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

Merged
merged 54 commits into from
Oct 29, 2024

Conversation

mj12albert
Copy link
Member

@mj12albert mj12albert commented Sep 3, 2024

Closes #25
Closes #627
Closes #702
Closes mui/material-ui#36297

Builds on top of:

Preview

👉 https://deploy-preview-577--base-ui.netlify.app/components/react-accordion

Summary

Accordion is built using Collapsible, some changes were made to Collapsible while working on this:

  • useCollapsibleTrigger (and Collapsible/AccordionTrigger) now uses useButton
  • Collapsible.Content is now renamed to Collapsible.Panel
  • perf improvements: reduced the use of window.getComputedStyle to an absolute minimum, merged the internal states into one
  • style hooks follows the latest convention: [data-open] on the panel, and [data-panel-open] on the trigger

Accordion features

  • orientation: 'vertical' | 'horizontal': sets a data attr and navigates focus between triggers with ArrowRight/Left instead of ArrowDown/Up
  • Collapsible.Content now exposes the --collapsible-content-width var to support horizontal orientation
  • direction: 'ltr' | 'rtl': sets the dir attr like other components and reverses ArrowRight & ArrowLeft when orientation === 'horizontal'
  • openMultiple: boolean: default true, controls whether multiple sections can be open at the same time, not expected to change during the lifetime of the component
  • disabled can be set on the Root, Section, or Trigger
  • hidden="until-found" can be set on the Root or a Panel

Extra demos

@mj12albert mj12albert added new feature New feature or request component: accordion This is the name of the generic UI component, not the React module! labels Sep 3, 2024
@mui-bot
Copy link

mui-bot commented Sep 3, 2024

Netlify deploy preview

https://deploy-preview-577--base-ui.netlify.app/

Generated by 🚫 dangerJS against faf9231

@mj12albert mj12albert force-pushed the feat/accordion branch 4 times, most recently from 36e29e3 to 881476c Compare September 3, 2024 15:02
@github-actions github-actions bot added the PR: out-of-date The pull request has merge conflicts and can't be merged label Sep 4, 2024
@mj12albert mj12albert force-pushed the feat/accordion branch 2 times, most recently from 84b0482 to e16cad0 Compare September 4, 2024 05:33
@github-actions github-actions bot removed the PR: out-of-date The pull request has merge conflicts and can't be merged label Sep 4, 2024
@mj12albert mj12albert force-pushed the feat/accordion branch 7 times, most recently from bb181bf to c735efb Compare September 4, 2024 07:49
@mj12albert mj12albert marked this pull request as ready for review September 4, 2024 07:50
@mj12albert mj12albert force-pushed the feat/accordion branch 3 times, most recently from b5f818e to 6969cd2 Compare September 5, 2024 05:11
@github-actions github-actions bot added the PR: out-of-date The pull request has merge conflicts and can't be merged label Sep 5, 2024
@github-actions github-actions bot removed the PR: out-of-date The pull request has merge conflicts and can't be merged label Sep 5, 2024
@github-actions github-actions bot added the PR: out-of-date The pull request has merge conflicts and can't be merged label Oct 18, 2024
@github-actions github-actions bot removed the PR: out-of-date The pull request has merge conflicts and can't be merged label Oct 21, 2024
Comment on lines 87 to 95
customStyleHookMapping: {
disabled: (isDisabled) => {
if (isDisabled) {
return { 'data-disabled': '' };
}
return null;
},
value: () => null,
},
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should be placed outside the component. I don't think data-disabled needs a custom style hook as this should work by default?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@atomiks Moved - by default disabled becomes data-disabled="true" instead of just data-disabled which seems a bit better, maybe the getStyleHookProps util could be updated to handle this universally?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm ok with just data-disabled and whatever we choose, we should apply to all components. So getStyleHookProps should handle it.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

2c8327e
Since we already don't render any data attr when the value is false, I think we could change all data-attr='true' to just data-attr (e.g. data-readonly, data-required...)

docs/data/components/accordion/accordion.mdx Outdated Show resolved Hide resolved
When uncontrolled, use the `defaultValue` prop to set the initial state of the accordion:

```tsx
<Accordion.Root defaultValue={[0]}>
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wonder if openPanels wouldn't make more sense than value (and now that I think of it, I'd rename Tabs's value as well).

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree the API for Tabs and Accordion should be as similar as possible, wonder what @vladmoroz and @colmtuite think?
The API would be openPanels/defaultOpenPanels? and onOpenPanelChange?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@michaldudak what would value become on the item itself? E.g. here <Accordion.Item value="1">

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

value on items still makes sense to me.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

If items have value, I think the connection gets lost then if the root uses anything else other than value

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

But it's not the same thing. A panel has a value (or really, an identifier, so we could consider using the id here as well), and the Accordion controls which panels are open. Using the same prop for both is counterintuitive for me.

React Aria's DisclosureGroup uses expandedKeys and id (a bit weird as well, as "key" != "id")
Ariakit's Tab uses selectedId and id.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For using id, I worry it's not a good idea to conflate the "panel value" with the id attribute 🤔
but since this is equally relevant to Tabs let's discuss this in the next call to unblock this PR 🙏

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not entirely convinced it's the best idea either, especially that on Tabs you can use non-string values as well, which won't be possible with id. But then, is it a real use case?

Copy link
Member Author

@mj12albert mj12albert Oct 28, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We discussed this and decided to stick with value/onValueChange for general consistency, all the other options we could come up with are a bit clumsy by comparison

@mj12albert mj12albert linked an issue Oct 24, 2024 that may be closed by this pull request
2 tasks
@github-actions github-actions bot added PR: out-of-date The pull request has merge conflicts and can't be merged and removed PR: out-of-date The pull request has merge conflicts and can't be merged labels Oct 24, 2024
@github-actions github-actions bot added the PR: out-of-date The pull request has merge conflicts and can't be merged label Oct 29, 2024
@github-actions github-actions bot removed the PR: out-of-date The pull request has merge conflicts and can't be merged label Oct 29, 2024
@mj12albert mj12albert merged commit 8054a85 into mui:master Oct 29, 2024
18 checks passed
atomiks added a commit to atomiks/base-ui that referenced this pull request Oct 30, 2024
Co-authored-by: Olivier Tassinari <[email protected]>
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Michał Dudak <[email protected]>
Co-authored-by: atomiks <[email protected]>
@mj12albert mj12albert deleted the feat/accordion branch October 30, 2024 06:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
component: accordion This is the name of the generic UI component, not the React module! new feature New feature or request
Projects
None yet
7 participants