fix: Reset TabPanels size variables on TabPanel so nested Tabs do not inherit them#10293
fix: Reset TabPanels size variables on TabPanel so nested Tabs do not inherit them#10293mvanhorn wants to merge 3 commits into
Conversation
…o not inherit them
snowystinger
left a comment
There was a problem hiding this comment.
How did you verify that this worked in a browser to a satisfactory degree? I don't see a story to test it with.
| '--tab-panel-width': 'auto', | ||
| '--tab-panel-height': 'auto', |
There was a problem hiding this comment.
| '--tab-panel-width': 'auto', | |
| '--tab-panel-height': 'auto', | |
| '--tab-panel-width': 'unset', | |
| '--tab-panel-height': 'unset', |
Address @snowystinger's request for a browser-testable story: the existing NestedTabs story does not apply the size-transition CSS, so it never exercises the --tab-panel-width/height inheritance. Add a story that puts an animated-tabpanels class (consuming those vars with a width/height transition) on both an outer and a nested TabPanels, so the bleed is observable in Storybook/Chromatic - without the per-TabPanel reset the inner panels inherit the outer TabPanels' pixel vars; with it they size to their own content.
|
Added a Verified in the browser via DOM inspection: with the fix, every One thing worth flagging: |
|
alternatively we could do |
|
Went with @devongovett's suggestion — registered |
Nested
TabPanelsinherit the parent's inline--tab-panel-width/--tab-panel-heightpixel values while they mount, because CSS custom properties inherit andunsetcannot stop that (for inherited properties it meansinherit). With the documented.react-aria-TabPanels { height: var(--tab-panel-height) }pattern, a freshly mounted innerTabPanelssizes itself from the outer panel's measurements and the height transition jumps.TabPanelInnernow sets--tab-panel-width: autoand--tab-panel-height: autoon itsdom.div(the reset point snowystinger suggested in the issue), so the variables stop at the panel boundary and a nestedTabPanelsmeasures cleanly. User-provided inline styles are spread after the reset and still win. The two 0-height initial-render reports in the same issue are separate timing problems in the async collection build and are not touched here.Closes #10292
✅ Pull Request Checklist:
📝 Test Instructions:
Run
yarn jest packages/react-aria-components/test/Tabs.test.js. The new tests render nested Tabs mid-transition and assert the inner panel's--tab-panel-width/--tab-panel-heightresolve toautorather than the outer panel's pixel values, and that a user style passed toTabPanelstill overrides the reset. To reproduce manually, nest aTabsinside aTabPanelwith the height-transition CSS from the TabPanels docs and switch tabs: without the reset the inner panels flash to the outer panel's height.🧢 Your Project:
Personal open source contribution