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

[Tabs] Add new experimental Tabs API #20806

Merged
merged 10 commits into from May 6, 2020
Merged

[Tabs] Add new experimental Tabs API #20806

merged 10 commits into from May 6, 2020

Conversation

eps1lon
Copy link
Member

@eps1lon eps1lon commented Apr 28, 2020

Currently you have to wire up two different sets of IDREFs to make the tabs accessible and make sure that values and indices are correctly set up.

This PR adds a couple of new components that implement the same pattern we used in our demos. With these components you don't need to wire up all the aria related props with the caveat of not server rendering those. However, we do require a value prop as a string now. Otherwise we would need to count the children.

<TabContext value={value}>
  <AppBar position="static">
    <TabList onChange={handleChange} aria-label="simple tabs example">
      <Tab label="Item One" value="1" />
      <Tab label="Item Two" value="2" />
      <Tab label="Item Three" value="3" />
    </TabList>
  </AppBar>
  <TabPanel value="1">Item One</TabPanel>
  <TabPanel value="2">Item Two</TabPanel>
  <TabPanel value="3">Item Three</TabPanel>
</TabContext>

-- https://deploy-preview-20806--material-ui.netlify.app/components/tabs/#experimental-tabs-api

The new API only allows string as value. The API in core allows not setting any tab but there is no use case for this as a demo. It's also not allowed by ARIA and, frankly, I haven't seen a tabs UI where no panel is selected.

Aside: The experimental useOpaqueIdentifier in react would not help here since we have to communicate these across the tree and create dynamically. Edit: See reactjs/rfcs#32 (comment)

@eps1lon eps1lon added accessibility a11y package: lab Specific to @mui/lab labels Apr 28, 2020
@mui-pr-bot
Copy link

mui-pr-bot commented Apr 28, 2020

@material-ui/core: parsed: 0.00% 😍, gzip: +0.15%
@material-ui/lab: parsed: +6.02% , gzip: +6.05%

Details of bundle changes.

Comparing: 939205f...a0af3d2

Details of page changes
bundle Size Change Size Gzip Change Gzip
/api-docs/tab-panel ▲ +1.45 kB (+Infinity% ) 1.45 kB ▼ -1 B (-Infinity% ) -1 B
/components/tabs ▲ +1.4 kB (+7.04% ) 21.3 kB -- -1 B
/api-docs/tab-list ▲ +1.08 kB (+Infinity% ) 1.08 kB ▼ -1 B (-Infinity% ) -1 B
/api-docs/tab-context ▲ +1.05 kB (+Infinity% ) 1.05 kB ▼ -1 B (-Infinity% ) -1 B
/components/skeleton ▲ +100 B (+0.99% ) 10.2 kB -- -1 B
/blog/october-2019-update ▲ +10 B (+0.40% ) 2.51 kB -- -1 B
/components/pickers ▼ -10 B (-0.17% ) 6 kB -- -1 B
/customization/density ▲ +10 B (+0.10% ) 9.76 kB -- -1 B
/discover-more/team ▲ +10 B (+0.15% ) 6.68 kB -- -1 B
/getting-started/templates/dashboard ▲ +10 B (+0.11% ) 8.87 kB -- -1 B
/getting-started/templates/sign-in-side ▲ +10 B (+0.11% ) 9.3 kB -- -1 B
/getting-started/templates/sign-in ▲ +10 B (+0.10% ) 9.54 kB -- -1 B
/performance/table-styled-components ▼ -10 B (-0.38% ) 2.6 kB -- -1 B
/premium-themes/onepirate/forgot-password ▼ -10 B (-0.99% ) 1 kB -- -1 B
/premium-themes/onepirate/privacy ▲ +10 B (+0.23% ) 4.44 kB -- -1 B
/system/shadows ▲ +10 B (+0.26% ) 3.86 kB -- -1 B
/_app -- 37 kB -- -1 B
/api-docs/alert-title -- 1.4 kB -- -1 B
/api-docs/alert -- 2.4 kB -- -1 B
/api-docs/app-bar -- 1.94 kB -- -1 B
/api-docs/autocomplete -- 4.61 kB -- -1 B
/api-docs/avatar-group -- 1.51 kB -- -1 B
/api-docs/avatar -- 1.86 kB -- -1 B
/api-docs/backdrop -- 1.72 kB -- -1 B
/api-docs/badge -- 2.13 kB -- -1 B
/api-docs/bottom-navigation-action -- 1.81 kB -- -1 B
/api-docs/bottom-navigation -- 1.7 kB -- -1 B
/api-docs/breadcrumbs -- 1.84 kB -- -1 B
/api-docs/button-base -- 2.33 kB -- -1 B
/api-docs/button-group -- 2.23 kB -- -1 B
/api-docs/button -- 2.56 kB -- -1 B
/api-docs/card-action-area -- 1.58 kB -- -1 B
/api-docs/card-actions -- 1.47 kB -- -1 B
/api-docs/card-content -- 1.45 kB -- -1 B
/api-docs/card-header -- 1.78 kB -- -1 B
/api-docs/card-media -- 1.69 kB -- -1 B
/api-docs/card -- 1.5 kB -- -1 B
/api-docs/checkbox -- 2.3 kB -- -1 B
/api-docs/chip -- 2.46 kB -- -1 B
/api-docs/circular-progress -- 2.07 kB -- -1 B
/api-docs/click-away-listener -- 1.37 kB -- -1 B
/api-docs/collapse -- 2.02 kB -- -1 B
/api-docs/container -- 1.86 kB -- -1 B
/api-docs/css-baseline -- 1.4 kB -- -1 B
/api-docs/dialog-actions -- 1.47 kB -- -1 B
/api-docs/dialog-content-text -- 1.48 kB -- -1 B
/api-docs/dialog-content -- 1.45 kB -- -1 B
/api-docs/dialog-title -- 1.49 kB -- -1 B
/api-docs/dialog -- 2.73 kB -- -1 B
/api-docs/divider -- 1.81 kB -- -1 B
/api-docs/drawer -- 2.13 kB -- -1 B
/api-docs/expansion-panel-actions -- 1.49 kB -- -1 B
/api-docs/expansion-panel-details -- 1.41 kB -- -1 B
/api-docs/expansion-panel-summary -- 1.72 kB -- -1 B
/api-docs/expansion-panel -- 1.97 kB -- -1 B
/api-docs/fab -- 2.11 kB -- -1 B
/api-docs/fade -- 1.39 kB -- -1 B
/api-docs/filled-input -- 2.87 kB -- -1 B
/api-docs/form-control-label -- 1.98 kB -- -1 B
/api-docs/form-control -- 2.36 kB -- -1 B
/api-docs/form-group -- 1.55 kB -- -1 B
/api-docs/form-helper-text -- 1.91 kB -- -1 B
/api-docs/form-label -- 1.84 kB -- -1 B
/api-docs/grid-list-tile-bar -- 1.8 kB -- -1 B
/api-docs/grid-list-tile -- 1.72 kB -- -1 B
/api-docs/grid-list -- 1.62 kB -- -1 B
/api-docs/grid -- 2.56 kB -- -1 B
/api-docs/grow -- 1.44 kB -- -1 B
/api-docs/hidden -- 1.53 kB -- -1 B
/api-docs/icon-button -- 2.1 kB -- -1 B
/api-docs/icon -- 1.78 kB -- -1 B
/api-docs/input-adornment -- 1.93 kB -- -1 B
/api-docs/input-base -- 2.95 kB -- -1 B
/api-docs/input-label -- 2.07 kB -- -1 B
/api-docs/input -- 2.83 kB -- -1 B
/api-docs/linear-progress -- 2.03 kB -- -1 B
/api-docs/link -- 1.93 kB -- -1 B
/api-docs/list-item-avatar -- 1.5 kB -- -1 B
/api-docs/list-item-icon -- 1.51 kB -- -1 B
/api-docs/list-item-secondary-action -- 1.47 kB -- -1 B
/api-docs/list-item-text -- 1.79 kB -- -1 B
/api-docs/list-item -- 2.25 kB -- -1 B
/api-docs/list-subheader -- 1.77 kB -- -1 B
/api-docs/list -- 1.68 kB -- -1 B
/api-docs/menu-item -- 1.74 kB -- -1 B
/api-docs/menu-list -- 1.57 kB -- -1 B
/api-docs/menu -- 2.4 kB -- -1 B
/api-docs/mobile-stepper -- 1.93 kB -- -1 B
/api-docs/modal -- 2.42 kB -- -1 B
/api-docs/native-select -- 2.08 kB -- -1 B
/api-docs/no-ssr -- 1.3 kB -- -1 B
/api-docs/outlined-input -- 2.98 kB -- -1 B
/api-docs/pagination-item -- 1.97 kB -- -1 B
/api-docs/pagination -- 2.24 kB -- -1 B
/api-docs/paper -- 1.87 kB -- -1 B
/api-docs/popover -- 2.69 kB -- -1 B
/api-docs/popper -- 1.91 kB -- -1 B
/api-docs/portal -- 1.34 kB -- -1 B
/api-docs/radio-group -- 1.45 kB -- -1 B
/api-docs/radio -- 2.12 kB -- -1 B
/api-docs/rating -- 2.49 kB -- -1 B
/api-docs/root-ref -- 1.41 kB -- -1 B
/api-docs/scoped-css-baseline -- 1.4 kB -- -1 B
/api-docs/select -- 2.94 kB -- -1 B
/api-docs/skeleton -- 1.77 kB -- -1 B
/api-docs/slide -- 1.54 kB -- -1 B
/api-docs/slider -- 3.11 kB -- -1 B
/api-docs/snackbar-content -- 1.61 kB -- -1 B
/api-docs/snackbar -- 2.71 kB -- -1 B
/api-docs/speed-dial-action -- 2.04 kB -- -1 B
/api-docs/speed-dial-icon -- 1.55 kB -- -1 B
/api-docs/speed-dial -- 2.3 kB -- -1 B
/api-docs/step-button -- 1.63 kB -- -1 B
/api-docs/step-connector -- 1.54 kB -- -1 B
/api-docs/step-content -- 1.72 kB -- -1 B
/api-docs/step-icon -- 1.57 kB -- -1 B
/api-docs/step-label -- 1.9 kB -- -1 B
/api-docs/step -- 1.64 kB -- -1 B
/api-docs/stepper -- 1.84 kB -- -1 B
/api-docs/svg-icon -- 2.26 kB -- -1 B
/api-docs/swipeable-drawer -- 2 kB -- -1 B
/api-docs/switch -- 2.46 kB -- -1 B
/api-docs/tab-scroll-button -- 1.61 kB -- -1 B
/api-docs/tab -- 1.99 kB -- -1 B
/api-docs/table-body -- 1.47 kB -- -1 B
/api-docs/table-cell -- 2.13 kB -- -1 B
/api-docs/table-container -- 1.48 kB -- -1 B
/api-docs/table-footer -- 1.47 kB -- -1 B
/api-docs/table-head -- 1.46 kB -- -1 B
/api-docs/table-pagination -- 2.46 kB -- -1 B
/api-docs/table-row -- 1.69 kB -- -1 B
/api-docs/table-sort-label -- 1.83 kB -- -1 B
/api-docs/table -- 1.68 kB -- -1 B
/api-docs/tabs -- 2.56 kB -- -1 B
/api-docs/text-field -- 3.18 kB -- -1 B
/api-docs/textarea-autosize -- 1.13 kB -- -1 B
/api-docs/toggle-button-group -- 1.86 kB -- -1 B
/api-docs/toggle-button -- 1.8 kB -- -1 B
/api-docs/toolbar -- 1.65 kB -- -1 B
/api-docs/tooltip -- 2.54 kB -- -1 B
/api-docs/tree-item -- 1.88 kB -- -1 B
/api-docs/tree-view -- 1.92 kB -- -1 B
/api-docs/typography -- 2.59 kB -- -1 B
/api-docs/zoom -- 1.41 kB -- -1 B
/blog/2019-developer-survey-results -- 6.36 kB -- -1 B
/blog/2019 -- 4.24 kB -- -1 B
/blog/2020-introducing-sketch -- 3.5 kB -- -1 B
/blog/2020-q1-update -- 4.33 kB -- -1 B
/blog/april-2019-update -- 3.13 kB -- -1 B
/blog/august-2019-update -- 2.24 kB -- -1 B
/blog/december-2019-update -- 2.37 kB -- -1 B
/blog/july-2019-update -- 2.13 kB -- -1 B
/blog/june-2019-update -- 2.01 kB -- -1 B
/blog/march-2019-update -- 2.54 kB -- -1 B
/blog/material-ui-v1-is-out -- 6.67 kB -- -1 B
/blog/material-ui-v4-is-out -- 9.68 kB -- -1 B
/blog/may-2019-update -- 2.35 kB -- -1 B
/blog/november-2019-update -- 2.75 kB -- -1 B
/blog/september-2019-update -- 2.68 kB -- -1 B
/company/about -- 1.74 kB -- -1 B
/company/contact -- 1.33 kB -- -1 B
/company/jobs -- 1.35 kB -- -1 B
/components/about-the-lab -- 6.81 kB -- -1 B
/components/alert -- 12.5 kB -- -1 B
/components/app-bar -- 30 kB -- -1 B
/components/autocomplete -- 99.4 kB -- -1 B
/components/avatars -- 8.83 kB -- -1 B
/components/backdrop -- 2.58 kB -- -1 B
/components/badges -- 15.4 kB -- -1 B
/components/bottom-navigation -- 6.27 kB -- -1 B
/components/box -- 8.05 kB -- -1 B
/components/breadcrumbs -- 14.7 kB -- -1 B
/components/button-group -- 7.37 kB -- -1 B
/components/buttons -- 26.2 kB -- -1 B
/components/cards -- 17.3 kB -- -1 B
/components/checkboxes -- 16.3 kB -- -1 B
/components/chips -- 21.8 kB -- -1 B
/components/click-away-listener -- 4.58 kB -- -1 B
/components/container -- 3.72 kB -- -1 B
/components/css-baseline -- 6.74 kB -- -1 B
/components/dialogs -- 42.8 kB -- -1 B
/components/dividers -- 12.7 kB -- -1 B
/components/drawers -- 31.5 kB -- -1 B
/components/expansion-panels -- 20.4 kB -- -1 B
/components/floating-action-button -- 10.4 kB -- -1 B
/components/grid-list -- 12.1 kB -- -1 B
/components/grid -- 32.4 kB -- -1 B
/components/hidden -- 10.6 kB -- -1 B
/components/icons -- 27.3 kB -- -1 B
/components/links -- 6.91 kB -- -1 B
/components/lists -- 26.7 kB -- -1 B
/components/material-icons -- 729 kB -- -1 B
/components/menus -- 24.9 kB -- -1 B
/components/modal -- 11.9 kB -- -1 B
/components/no-ssr -- 5.11 kB -- -1 B
/components/pagination -- 9.45 kB -- -1 B
/components/paper -- 3.49 kB -- -1 B
/components/popover -- 17.4 kB -- -1 B
/components/popper -- 23.4 kB -- -1 B
/components/portal -- 3 kB -- -1 B
/components/progress -- 20.3 kB -- -1 B
/components/radio-buttons -- 14.8 kB -- -1 B
/components/rating -- 10.8 kB -- -1 B
/components/selects -- 30.9 kB -- -1 B
/components/slider -- 15.6 kB -- -1 B
/components/snackbars -- 28.6 kB -- -1 B
/components/speed-dial -- 14.4 kB -- -1 B
/components/steppers -- 36.6 kB -- -1 B
/components/switches -- 16.4 kB -- -1 B
/components/tables -- 143 kB -- -1 B
/components/text-fields -- 54.8 kB -- -1 B
/components/textarea-autosize -- 2.94 kB -- -1 B
/components/toggle-button -- 10.5 kB -- -1 B
/components/tooltips -- 16.5 kB -- -1 B
/components/transfer-list -- 9.68 kB -- -1 B
/components/transitions -- 11.5 kB -- -1 B
/components/tree-view -- 11.2 kB -- -1 B
/components/typography -- 9.92 kB -- -1 B
/components/use-media-query -- 12.9 kB -- -1 B
/customization/breakpoints -- 16.2 kB -- -1 B
/customization/color -- 20.9 kB -- -1 B
/customization/components -- 38.4 kB -- -1 B
/customization/default-theme -- 8.8 kB -- -1 B
/customization/globals -- 4.72 kB -- -1 B
/customization/palette -- 14.1 kB -- -1 B
/customization/spacing -- 2.61 kB -- -1 B
/customization/theming -- 16.8 kB -- -1 B
/customization/typography -- 11.8 kB -- -1 B
/customization/z-index -- 3.13 kB -- -1 B
/discover-more/backers -- 3.04 kB -- -1 B
/discover-more/changelog -- 1.44 kB -- -1 B
/discover-more/languages -- 3.44 kB -- -1 B
/discover-more/related-projects -- 7.95 kB -- -1 B
/discover-more/roadmap -- 3.72 kB -- -1 B
/discover-more/showcase -- 13.4 kB -- -1 B
/discover-more/vision -- 6.68 kB -- -1 B
/getting-started/example-projects -- 6.8 kB -- -1 B
/getting-started/faq -- 36.1 kB -- -1 B
/getting-started/installation -- 7.83 kB -- -1 B
/getting-started/learn -- 8.92 kB -- -1 B
/getting-started/support -- 9.02 kB -- -1 B
/getting-started/supported-components -- 6.42 kB -- -1 B
/getting-started/supported-platforms -- 5.76 kB -- -1 B
/getting-started/templates -- 8.91 kB -- -1 B
/getting-started/templates/album -- 5.59 kB -- -1 B
/getting-started/templates/blog -- 7.45 kB -- -1 B
/getting-started/templates/checkout -- 11.2 kB -- -1 B
/getting-started/templates/pricing -- 7.8 kB -- -1 B
/getting-started/templates/sign-up -- 9.64 kB -- -1 B
/getting-started/templates/sticky-footer -- 1.54 kB -- -1 B
/getting-started/usage -- 9.58 kB -- -1 B
/guides/api -- 15.8 kB -- -1 B
/guides/composition -- 14.9 kB -- -1 B
/guides/flow -- 2.26 kB -- -1 B
/guides/interoperability -- 16.3 kB -- -1 B
/guides/localization -- 11.7 kB -- -1 B
/guides/migration-v0x -- 7.39 kB -- -1 B
/guides/migration-v3 -- 19.2 kB -- -1 B
/guides/minimizing-bundle-size -- 8.7 kB -- -1 B
/guides/responsive-ui -- 4.27 kB -- -1 B
/guides/right-to-left -- 6.77 kB -- -1 B
/guides/server-rendering -- 8.75 kB -- -1 B
/guides/testing -- 8.61 kB -- -1 B
/guides/typescript -- 14.6 kB -- -1 B
/performance/table-component -- 1.44 kB -- -1 B
/performance/table-emotion -- 8.49 kB -- -1 B
/performance/table-hook -- 2.24 kB -- -1 B
/performance/table-mui -- 4.49 kB -- -1 B
/performance/table-raw -- 613 B -- -1 B
/premium-themes/onepirate -- 7.27 kB -- -1 B
/premium-themes/onepirate/sign-in -- 1.07 kB -- -1 B
/premium-themes/onepirate/sign-up -- 1.12 kB -- -1 B
/premium-themes/onepirate/terms -- 11.8 kB -- -1 B
/premium-themes/paperbase -- 8.96 kB -- -1 B
/styles/advanced -- 33.3 kB -- -1 B
/styles/api -- 16.9 kB -- -1 B
/styles/basics -- 16.5 kB -- -1 B
/system/api -- 5.96 kB -- -1 B
/system/basics -- 27.4 kB -- -1 B
/system/borders -- 4.1 kB -- -1 B
/system/display -- 6.55 kB -- -1 B
/system/flexbox -- 5.85 kB -- -1 B
/system/palette -- 4.35 kB -- -1 B
/system/positions -- 2.53 kB -- -1 B
/system/sizing -- 3.53 kB -- -1 B
/system/spacing -- 6.01 kB -- -1 B
/system/typography -- 4.41 kB -- -1 B
/versions -- 23.7 kB -- -1 B
docs:chunk:shared -- 61.7 kB -- -1 B
docs:shared:chunk/commons -- 5.99 kB -- -1 B
docs:shared:chunk/framework -- 42.3 kB -- -1 B
docs:shared:runtime/main -- 6.78 kB -- -1 B
docs:shared:runtime/webpack -- 1.24 kB -- -1 B
bundle Size Change Size Gzip Change Gzip
TabList ▲ +91.6 kB (+Infinity% ) 91.6 kB ▲ +29.3 kB (+Infinity% ) 29.3 kB
TabPanel ▲ +69.9 kB (+Infinity% ) 69.9 kB ▲ +22 kB (+Infinity% ) 22 kB
@material-ui/lab ▲ +12.2 kB (+6.02% ) 216 kB ▲ +3.66 kB (+6.05% ) 64.2 kB
TabContext ▲ +2.65 kB (+Infinity% ) 2.65 kB ▲ +1.15 kB (+Infinity% ) 1.15 kB
Tabs ▼ -79 B (-0.09% ) 90.3 kB ▼ -771 B (-2.65% ) 28.3 kB
TabScrollButton ▼ -52 B (-0.06% ) 81.4 kB ▼ -7 B (-0.03% ) 25.5 kB
TablePagination ▲ +7 B (0.00% ) 148 kB ▲ +2 B (0.00% ) 43.4 kB
TextField ▲ +7 B (+0.01% ) 130 kB ▲ +1 B (0.00% ) 38.2 kB
@material-ui/core ▲ +6 B (0.00% ) 375 kB ▲ +151 B (+0.15% ) 103 kB
Menu ▲ +6 B (+0.01% ) 93.6 kB ▼ -3 B (-0.01% ) 28.9 kB
Drawer ▲ +6 B (+0.01% ) 89.9 kB ▼ -2 B (-0.01% ) 27.4 kB
PaginationItem ▲ +5 B (+0.01% ) 85.3 kB ▼ -7 B (-0.03% ) 26.4 kB
Chip ▲ +5 B (+0.01% ) 87.1 kB ▼ -6 B (-0.02% ) 26.8 kB
StepLabel ▲ +5 B (+0.01% ) 73.3 kB ▼ -4 B (-0.02% ) 22.7 kB
Avatar ▲ +5 B (+0.01% ) 70 kB ▼ -3 B (-0.01% ) 21.9 kB
Collapse ▲ +5 B (+0.01% ) 77.4 kB ▼ -3 B (-0.01% ) 22.8 kB
Autocomplete ▲ +5 B (0.00% ) 136 kB ▼ -2 B (-0.00% ) 42.9 kB
MenuItem ▲ +5 B (+0.01% ) 82.6 kB ▼ -2 B (-0.01% ) 25.9 kB
Pagination ▲ +5 B (+0.01% ) 88.9 kB ▼ -2 B (-0.01% ) 27.5 kB
Tooltip ▲ +5 B (0.00% ) 107 kB ▲ +2 B (+0.01% ) 33.7 kB
Button ▲ +5 B (+0.01% ) 84.2 kB ▼ -1 B (-0.00% ) 25.9 kB
InputLabel ▲ +5 B (+0.01% ) 70.1 kB ▼ -1 B (-0.00% ) 21.7 kB
LinearProgress ▲ +5 B (+0.01% ) 70.2 kB ▼ -1 B (-0.00% ) 21.7 kB
FormHelperText ▲ +5 B (+0.01% ) 68.2 kB -- 21.2 kB
RadioGroup ▲ +5 B (+0.01% ) 68.7 kB -- 21.4 kB
Select ▲ +4 B (0.00% ) 121 kB -- 36.1 kB
IconButton ▲ +3 B (0.00% ) 80.6 kB ▼ -3 B (-0.01% ) 25.2 kB
OutlinedInput ▲ +3 B (0.00% ) 79.6 kB ▲ +3 B (+0.01% ) 24.8 kB
StepIcon ▲ +3 B (0.00% ) 69.4 kB ▼ -3 B (-0.01% ) 21.7 kB
ButtonBase ▼ -3 B (-0.00% ) 78.4 kB ▼ -2 B (-0.01% ) 24.7 kB
InputBase ▲ +3 B (0.00% ) 75.5 kB ▲ +2 B (+0.01% ) 23.8 kB
ListItem ▲ +3 B (0.00% ) 81.5 kB ▼ -2 B (-0.01% ) 25.6 kB
FilledInput ▲ +3 B (0.00% ) 78.6 kB ▲ +1 B (0.00% ) 24.5 kB
FormLabel ▲ +3 B (0.00% ) 68.3 kB ▼ -1 B (-0.00% ) 21.2 kB
FormControl ▲ +3 B (0.00% ) 69.2 kB -- 21.6 kB
FormGroup ▲ +2 B (0.00% ) 66.8 kB ▲ +192 B (+0.92% ) 21 kB
Backdrop ▲ +2 B (0.00% ) 72.8 kB ▼ -3 B (-0.01% ) 22.5 kB
Popover ▲ +2 B (0.00% ) 87.9 kB ▼ -2 B (-0.01% ) 27.2 kB
Fab ▲ +2 B (0.00% ) 81.2 kB ▲ +1 B (0.00% ) 25.4 kB
Typography ▼ -2 B (-0.00% ) 68.4 kB ▼ -1 B (-0.00% ) 21.4 kB
MenuList ▲ +2 B (0.00% ) 70.8 kB -- 22.2 kB
SnackbarContent ▲ +1 B (0.00% ) 68.4 kB ▲ +241 B (+1.13% ) 21.6 kB
Input ▲ +1 B (0.00% ) 77.5 kB ▲ +2 B (+0.01% ) 24.2 kB
List ▲ +1 B (0.00% ) 67.1 kB ▼ -1 B (-0.00% ) 20.9 kB
Paper ▲ +1 B (0.00% ) 67.2 kB ▼ -1 B (-0.00% ) 21 kB
SvgIcon ▼ -1 B (-0.00% ) 67.8 kB ▼ -1 B (-0.00% ) 21.2 kB
SwipeableDrawer -- 97.3 kB ▲ +27 B (+0.09% ) 30.6 kB
NativeSelect -- 81.8 kB ▲ +18 B (+0.07% ) 26 kB
Switch -- 85.8 kB ▲ +12 B (+0.04% ) 27.1 kB
Tab -- 80.8 kB ▲ +11 B (+0.04% ) 25.8 kB
Alert -- 87.7 kB ▼ -10 B (-0.04% ) 27.8 kB
CardActionArea -- 79.5 kB ▲ +10 B (+0.04% ) 25.2 kB
TableFooter -- 67 kB ▲ +10 B (+0.05% ) 21 kB
Checkbox -- 86.6 kB ▲ +9 B (+0.03% ) 27.5 kB
TableHead -- 66.9 kB ▲ +9 B (+0.04% ) 21 kB
@material-ui/system -- 17.2 kB ▼ -8 B (-0.18% ) 4.51 kB
ExpansionPanelDetails -- 66.8 kB ▲ +8 B (+0.04% ) 20.9 kB
ScopedCssBaseline -- 67.7 kB ▲ +8 B (+0.04% ) 21.3 kB
Box -- 73.7 kB ▲ +7 B (+0.03% ) 22.4 kB
Slide -- 34.7 kB ▼ -7 B (-0.07% ) 10.4 kB
Slider -- 80.8 kB ▲ +7 B (+0.03% ) 25.8 kB
TreeItem -- 80.2 kB ▲ +7 B (+0.03% ) 25.5 kB
ButtonGroup -- 87.8 kB ▲ +6 B (+0.02% ) 27.2 kB
CircularProgress -- 68.9 kB ▲ +6 B (+0.03% ) 21.8 kB
DialogActions -- 66.9 kB ▲ +6 B (+0.03% ) 21 kB
Table -- 67.4 kB ▲ +6 B (+0.03% ) 21.2 kB
ToggleButton -- 80.5 kB ▲ +6 B (+0.02% ) 25.6 kB
CssBaseline -- 66.8 kB ▲ +5 B (+0.02% ) 21 kB
DialogContent -- 67 kB ▲ +5 B (+0.02% ) 21 kB
ListItemIcon -- 67 kB ▲ +5 B (+0.02% ) 21 kB
StepButton -- 86.7 kB ▲ +5 B (+0.02% ) 27.5 kB
Zoom -- 32.7 kB ▼ -5 B (-0.05% ) 9.83 kB
AvatarGroup -- 71 kB ▲ +4 B (+0.02% ) 22.5 kB
Breadcrumbs -- 84.9 kB ▼ -4 B (-0.01% ) 27 kB
GridList -- 67.3 kB ▲ +4 B (+0.02% ) 21.2 kB
ListItemAvatar -- 66.9 kB ▲ +4 B (+0.02% ) 21 kB
ListItemSecondaryAction -- 66.8 kB ▲ +4 B (+0.02% ) 21 kB
Radio -- 87.6 kB ▲ +4 B (+0.01% ) 27.9 kB
Skeleton -- 67.8 kB ▲ +4 B (+0.02% ) 21.4 kB
TableContainer -- 66.8 kB ▲ +4 B (+0.02% ) 20.9 kB
ToggleButtonGroup -- 68 kB ▲ +4 B (+0.02% ) 21.4 kB
CardActions -- 66.9 kB ▲ +3 B (+0.01% ) 21 kB
CardMedia -- 67.2 kB ▼ -3 B (-0.01% ) 21.1 kB
Dialog -- 87.9 kB ▲ +3 B (+0.01% ) 27.5 kB
DialogTitle -- 69.1 kB ▲ +3 B (+0.01% ) 21.8 kB
ExpansionPanelActions -- 66.9 kB ▲ +3 B (+0.01% ) 21 kB
ExpansionPanelSummary -- 82.6 kB ▲ +3 B (+0.01% ) 26.3 kB
Grid -- 69.9 kB ▲ +3 B (+0.01% ) 22 kB
Grow -- 33.3 kB ▼ -3 B (-0.03% ) 10.1 kB
Icon -- 67.6 kB ▲ +3 B (+0.01% ) 21.2 kB
ListSubheader -- 67.6 kB ▼ -3 B (-0.01% ) 21.3 kB
SpeedDialIcon -- 69.4 kB ▲ +3 B (+0.01% ) 21.8 kB
Step -- 67.5 kB ▲ +3 B (+0.01% ) 21.2 kB
StepConnector -- 67.5 kB ▲ +3 B (+0.01% ) 21.3 kB
Stepper -- 69.7 kB ▼ -3 B (-0.01% ) 22 kB
TableBody -- 66.9 kB ▲ +3 B (+0.01% ) 21 kB
TableCell -- 68.9 kB ▲ +3 B (+0.01% ) 21.7 kB
TableRow -- 67.3 kB ▲ +3 B (+0.01% ) 21.2 kB
Toolbar -- 67.1 kB ▲ +3 B (+0.01% ) 21.1 kB
TreeView -- 73.3 kB ▼ -3 B (-0.01% ) 23.1 kB
@material-ui/styles -- 52.1 kB ▲ +2 B (+0.01% ) 15.6 kB
AlertTitle -- 69 kB ▲ +2 B (+0.01% ) 21.7 kB
AppBar -- 68.8 kB ▲ +2 B (+0.01% ) 21.6 kB
BottomNavigation -- 67.2 kB ▲ +2 B (+0.01% ) 21.1 kB
Card -- 67.7 kB ▼ -2 B (-0.01% ) 21.2 kB
CardContent -- 66.8 kB ▲ +2 B (+0.01% ) 20.9 kB
CardHeader -- 69.9 kB ▲ +2 B (+0.01% ) 22 kB
Container -- 68 kB ▲ +2 B (+0.01% ) 21.3 kB
Divider -- 67.5 kB ▼ -2 B (-0.01% ) 21.3 kB
Fade -- 32.6 kB ▼ -2 B (-0.02% ) 9.84 kB
InputAdornment -- 69.9 kB ▼ -2 B (-0.01% ) 22.1 kB
Link -- 71.4 kB ▲ +2 B (+0.01% ) 22.7 kB
Modal -- 15 kB ▼ -2 B (-0.04% ) 5.24 kB
Rating -- 75.7 kB ▼ -2 B (-0.01% ) 24.4 kB
Snackbar -- 80.7 kB ▲ +2 B (+0.01% ) 25.3 kB
StepContent -- 74 kB ▲ +2 B (+0.01% ) 23.2 kB
BottomNavigationAction -- 79.9 kB ▲ +1 B (0.00% ) 25.4 kB
ClickAwayListener -- 4.13 kB ▼ -1 B (-0.06% ) 1.66 kB
DialogContentText -- 68.8 kB ▲ +1 B (0.00% ) 21.7 kB
ExpansionPanel -- 76.4 kB ▼ -1 B (-0.00% ) 24.1 kB
GridListTileBar -- 68 kB ▲ +1 B (0.00% ) 21.4 kB
Hidden -- 70.8 kB ▲ +1 B (0.00% ) 22.3 kB
ListItemText -- 69.8 kB ▲ +1 B (0.00% ) 22 kB
Portal -- 2.87 kB ▲ +1 B (+0.08% ) 1.29 kB
SpeedDialAction -- 122 kB ▼ -1 B (-0.00% ) 39 kB
TableSortLabel -- 81.8 kB ▼ -1 B (-0.00% ) 26 kB
TextareaAutosize -- 5.24 kB ▼ -1 B (-0.05% ) 2.19 kB
useAutocomplete -- 15 kB ▲ +1 B (+0.02% ) 5.28 kB
useMediaQuery -- 2.57 kB ▲ +1 B (+0.09% ) 1.06 kB
@material-ui/core[umd] -- 328 kB -- 94.6 kB
Badge -- 70.1 kB -- 21.9 kB
colorManipulator -- 3.88 kB -- 1.52 kB
docs:/ -- 12 kB -- -1 B
docs:/_app -- 37 kB -- -1 B
FormControlLabel -- 70.3 kB -- 22.1 kB
GridListTile -- 68.5 kB -- 21.5 kB
MobileStepper -- 72.7 kB -- 22.9 kB
NoSsr -- 2.18 kB -- 1.03 kB
Popper -- 28.8 kB -- 10.3 kB
RootRef -- 4.64 kB -- 1.76 kB
SpeedDial -- 90.7 kB -- 28.8 kB
styles/createMuiTheme -- 22.3 kB -- 7.72 kB
useScrollTrigger -- 2.66 kB -- 1.08 kB

Generated by 🚫 dangerJS against a0af3d2

@oliviertassinari

This comment has been minimized.

@oliviertassinari
Copy link
Member

oliviertassinari commented Apr 28, 2020

@eps1lon Great work! One point of interrogation. How should we link a Tab with a TabPanel? Is the position of the children enough? Sometimes, developers are conditionality rendering the tab, would it cause an issue? Garden uses an id, Reach UI doesn't. I could only find reach/reach-ui#406 on a similar matter

Copy link
Member

@oliviertassinari oliviertassinari left a comment

Choose a reason for hiding this comment

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

Do we have an opportunity to expose a second hook API for the problem?

packages/material-ui-lab/src/TabPanel/TabPanel.js Outdated Show resolved Hide resolved
@eps1lon
Copy link
Member Author

eps1lon commented Apr 28, 2020

How should we link a Tab with a TabPanel?

Right now they rely on the same position.

Is the position of the children enough?

Please be more specific.

Sometimes, developers are conditionality rendering the tab, would it cause an issue?

I'm not aware of this use case. Do you have a real-world example where you would conditionally hide a tab but not the corresponding tabpanel?

Do we have an opportunity to expose a second hook API for the problem?

What problem and why do we need a second API for it?

@oliviertassinari
Copy link
Member

oliviertassinari commented Apr 28, 2020

Please be more specific.

Sure, my point of interrogation is about, will the developers be able to correctly manage the positions of the children? In the below example, I would expect to work well, however considering #17452, and a more complex rendering logic, I wonder about the potential bug surface for off by 1 error it opens (developer not correctly syncing the shown Tab and TabPanel).

<TabContext value={value}>
  <AppBar position="static">
    <TabList onChange={handleChange} aria-label="simple tabs example">
      <Tab label="Item One" />
      {foo === 'bar' ? <Tab label="Item Two" /> : null}
      <Tab label="Item Three" />
    </TabList>
  </AppBar>
  <TabPanels>
    <TabPanel>Item One</TabPanel>
    {foo === 'bar' ? <TabPanel>Item Two</TabPanel> : null}
    <TabPanel>Item Three</TabPanel>
  </TabPanels>
</TabContext>

What problem and why do we need a second API for it?

It could enable the developers to break free from the component structure we impose and the dependencies these components have (JSS).

@eps1lon
Copy link
Member Author

eps1lon commented Apr 28, 2020

It could enable the developers to break free from the component structure we impose and the dependencies these components have (JSS).

For TabPanel we don't necessarily need it. I would expect the same customization options with any component though. But I wouldn't mind getting rid of withStyles in TabPanel and see if this works.

TabContext is only a provider. TabList could just be a HoC that wires up Tabs so that it is backwards compatible.

will the developers be able to correctly manage the positions of the children?

This is too constructed. The same problem existed before and without a concrete use case I'd consider this something we don't have to worry about. Developers that break out of the default use case could just as well wrap the component.

There's definitely an opportunity to get rid of cloneElement which would require explicit value props (which are just as prone to errors). But it seems to me there was a need to automatically generate these values which I addressed in this API. We can change it but I'm once again left wondering why this wasn't an issue before?

@oliviertassinari
Copy link
Member

oliviertassinari commented Apr 28, 2020

The same problem existed before and without a concrete use case I'd consider this something we don't have to worry about.

Yeah, maybe It's a too far fetched case. It will be interesting to see the feedback we get once released and used.

There's definitely an opportunity to get rid of cloneElement

It sounds like there is a hard tradeoff to make: https://gist.github.com/ryanflorence/10e9387f633f9d2e6f444a9bddaabf6e#descendants which resonates a bit with the different APIs tradeoffs: #20806 (comment).

@eps1lon
Copy link
Member Author

eps1lon commented Apr 28, 2020

The thing is that we don't need to jump through all these hoops here. None of our demos require the composition. All of these "conditional rendering" or "lazy rendering" examples are (so far) constructed.

This doesn't mean that there aren't use cases for grouping tabs with divs or separating elements.

@eps1lon eps1lon force-pushed the feat/A11yTab branch 4 times, most recently from b799b7d to 1858844 Compare May 6, 2020 16:55
@eps1lon
Copy link
Member Author

eps1lon commented May 6, 2020

Updated with new revision that simplifies the implementation by requiring a value as a string. Removes the undocumtend value={false} use case and simplifies implementation while removing the need for the tabs to be ordered, immediate children.

@eps1lon
Copy link
Member Author

eps1lon commented May 6, 2020

Let's get this in, work on selectionFollowsFocus and then write up a proposal for this API to replace the previous one.

@eps1lon eps1lon merged commit 3426f17 into mui:master May 6, 2020
@eps1lon eps1lon deleted the feat/A11yTab branch May 6, 2020 18:37
@oliviertassinari oliviertassinari added the component: tabs This is the name of the generic UI component, not the React module! label May 12, 2020
@oliviertassinari oliviertassinari changed the title [lab] Add new experimental Tabs API [Tabs] Add new experimental Tabs API Jan 9, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
accessibility a11y component: tabs This is the name of the generic UI component, not the React module! package: lab Specific to @mui/lab
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

5 participants