fix(theme-common): relax Tabs children validation to enable component composition #11728
+1
−21
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Motivation
Currently, the
<Tabs>component enforces strict validation that throws a runtime error (Bad <Tabs> child) if any direct child is not strictly a<TabItem>.This restriction prevents developers from using Component Composition (wrapping
<TabItem>inside other components to abstract logic or styles), even if the wrapper correctly passes the required props.This PR removes the strict
throw new Errorvalidation insanitizeTabsChildren.Benefits:
Enables Composition: Developers can now wrap
TabItemcomponents (e.g.,<MyCustomTab value="x">).Graceful Failure: If a user/developer forgets to pass props (invalid usage), the application no longer crashes. Instead, it renders an empty tab, providing a visual cue to fix the code without breaking the entire development experience.
Test Plan
I verified the fix using a wrapper component that abstracts the
<TabItem>.Test Code (Simulating Component Composition):
Verification
The app crashes because the wrapper does not expose the
valueprop to the parent<Tabs>.The app renders the content ("Test Local") without crashing. The tab button renders (empty/fallback) instead of breaking the page.
Related issues/PRs
Fixes #11672