feat(tabs): new tedi-ready component #14 - #481
Conversation
|
Warning Review limit reached
Next review available in: 30 minutes Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available. How can I continue?After more reviews become available, a review can be triggered using the To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews. How do review limits work?CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability. For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window. Please refer docs for additional details. Review details⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
📝 WalkthroughWalkthroughAdds the TEDI-ready tabs component family, deprecates the community tabs API, and updates dropdown item label clipping behavior and related Storybook/docs wiring. ChangesTEDI-Ready Tabs implementation
Community tabs deprecation notices
Dropdown item label clipping
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related issues
Possibly related PRs
Suggested reviewers
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
|
@coderabbitai review it |
|
✅ Action performedReview finished.
|
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@tedi/components/navigation/tabs/tabs-list/tabs-list.component.ts`:
- Around line 151-157: In tabs-list.component.ts, the overflow state in the
tabs-list logic is using a latched naturalWidth value that is only set when
overflow first appears, so later content growth can incorrectly clear
isOverflowing. Update the logic in the overflow check around isOverflowing and
naturalWidth so naturalWidth is refreshed when the list width increases, and
make the overflow recalculation in the tabs-list component use the latest
scrollWidth before deciding whether to set isOverflowing back to false.
In `@tedi/components/navigation/tabs/tabs.spec.ts`:
- Around line 230-231: The specs are mutating the tab input directly instead of
using the TestBed input API. Update the affected tests in tabs.spec.ts to set
the component’s signal input through fixture.componentRef.setInput(...) for the
value input on the tabs host before calling fixture.detectChanges(), and apply
the same pattern to the other matching cases in this spec file so the tests
follow the repository convention.
- Around line 22-33: The tab spec setup mutates shared globals in beforeAll by
replacing ResizeObserver and Element.prototype.scrollIntoView, so add an
afterAll cleanup in tabs.spec.ts to restore both mocks to their original
implementations. Use the existing beforeAll block and the
resizeCallback/scrollIntoView setup as the anchor, and make sure the teardown
fully resets global.ResizeObserver and Element.prototype.scrollIntoView so other
specs are not affected.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 25d77339-ac61-4662-b015-93a4b87d2c11
📒 Files selected for processing (22)
community/components/navigation/tabs/tab-content/tab-content.component.tscommunity/components/navigation/tabs/tab/tab.component.tscommunity/components/navigation/tabs/tabs.component.tscommunity/components/navigation/tabs/tabs.stories.tsskills/tedi-angular/references/components.mdtedi/components/navigation/index.tstedi/components/navigation/tabs/_tabs.mixins.scsstedi/components/navigation/tabs/index.tstedi/components/navigation/tabs/tabs-content/tabs-content.component.htmltedi/components/navigation/tabs/tabs-content/tabs-content.component.scsstedi/components/navigation/tabs/tabs-content/tabs-content.component.tstedi/components/navigation/tabs/tabs-helpers.tstedi/components/navigation/tabs/tabs-list/tabs-list.component.htmltedi/components/navigation/tabs/tabs-list/tabs-list.component.scsstedi/components/navigation/tabs/tabs-list/tabs-list.component.tstedi/components/navigation/tabs/tabs-trigger/tabs-trigger.component.htmltedi/components/navigation/tabs/tabs-trigger/tabs-trigger.component.scsstedi/components/navigation/tabs/tabs-trigger/tabs-trigger.component.tstedi/components/navigation/tabs/tabs.component.scsstedi/components/navigation/tabs/tabs.component.tstedi/components/navigation/tabs/tabs.spec.tstedi/components/navigation/tabs/tabs.stories.ts
# [7.0.0](angular-6.4.0...angular-7.0.0) (2026-07-02) ### Bug Fixes * **date-field,date-picker:** resolved conflict with formcontrol [#494](#494) ([#501](#501)) ([7721071](7721071)) * **dropdown:** overridden browser-default padding on dropdown-content [#498](#498) ([#499](#499)) ([1219cde](1219cde)) * **icon:** size input now works inside buttons and links [#435](#435) ([#497](#497)) ([e2b6a70](e2b6a70)) * **table:** state is correctly forwarded + added state docs [#477](#477) ([#478](#478)) ([9282b60](9282b60)) ### Features * **accordion:** fix mobile examples, add new inputs and stories [#467](#467) ([#483](#483)) ([c45e3e7](c45e3e7)) * Added angular v22 support [#466](#466) ([#476](#476)) ([36b1266](36b1266)) * **alert:** add tedi-alert-action slot [#460](#460) ([#461](#461)) ([ca8fc86](ca8fc86)) * **alert:** Added small size [#502](#502) ([#503](#503)) ([c6bd5aa](c6bd5aa)) * **button-group:** new tedi-ready component [#9](#9) ([#450](#450)) ([37a4d3b](37a4d3b)) * **card,card-button,timeline-card:** new tedi-ready components [#453](#453) ([#479](#479)) ([7c13043](7c13043)) * **date-field,calendar:** calendar tedi-ready [#6](#6) ([#443](#443)) ([467271a](467271a)) * **dropdown:** Added support for wrapped buttons [#468](#468) ([#469](#469)) ([056340a](056340a)) * **ellipsis:** new tedi-ready component [#472](#472) ([#475](#475)) ([a38d594](a38d594)) * **float-ui:** replaced float-ui usage in relevant components [#380](#380) ([#401](#401)) ([7aee67b](7aee67b)) * **header:** update Header component against Figma [#312](#312) ([#440](#440)) ([81b1c18](81b1c18)) * **info-button:** added inverted variant [#236](#236) ([#496](#496)) ([0a67fa8](0a67fa8)) * **pagination:** tedi-ready component [#446](#446) ([#447](#447)) ([47af78b](47af78b)) * **progressbar,attachment:** new tedi-ready components [#253](#253) ([#451](#451)) ([b2b9b5b](b2b9b5b)), closes [#482](#482) * **select:** added tooltip, ariaLabelledby, ariaLabel [#508](#508) ([#509](#509)) ([0ee3572](0ee3572)) * **table:** added new features [#480](#480) ([#485](#485)) ([1ca8a2d](1ca8a2d)) * **table:** added selectedRowHighlight input and updated stories [#445](#445) ([c7aeb1b](c7aeb1b)) * **table:** behavioural improvements [#470](#470) ([#473](#473)) ([098a616](098a616)) * **table:** new tedi-ready component [#445](#445) ([#448](#448)) ([2d9480e](2d9480e)) * **tabs:** new tedi-ready component [#14](#14) ([#481](#481)) ([5f37a32](5f37a32)) * **time-field,time-picker,scroll-fade:** new tedi-ready components [#374](#374) ([#397](#397)) ([0040e62](0040e62)) ### BREAKING CHANGES * **icon:** button and link icon size changed, tedi-icon--size-* overrides no longer work
Migration Guide — Tabs
Community Tabs → TEDI-Ready Tabs
What changed: The community Tabs exposed
tedi-tabs+[tedi-tab]+tedi-tab-content, with selection driven per-tab via a[selected]model andtabSelectedoutput, optional router integration viaRouterLinkActive, and an automatic mobile "More" dropdown. The TEDI-Ready Tabs is a full WAI-ARIA tab pattern: a requiredtedi-tabs-listwrapper holdsbutton[tedi-tabs-trigger]items, selection is centralized on the root viavalue/defaultValue/valueChange, panels aretedi-tabs-content, and overflow is configurable viaoverflowMode("dropdown"|"scroll").Why: To deliver the official TEDI design-system Tabs with a single source of truth for the active tab, full keyboard support (Arrow/Home/End, roving tabindex), correct
tablist/tab/tabpanelsemantics, icon support, and explicit overflow handling.Before (community):
After (TEDI-Ready):
Controlled selection
Replace per-tab
[selected]/(tabSelected)with a single binding on the root:Icons
The TEDI-Ready trigger has a first-class
iconinput (community had none; you projected your own):Overflow
The community auto mobile "More" dropdown is replaced by an explicit
overflowModeon the list:Router-driven tabs
The community
[tedi-tab]integratedRouterLinkActiveto derive the active tab from the URL. The TEDI-Ready Tabs does not build router activation into the trigger; instead, drivevaluefrom your routing state and use an id-lesstedi-tabs-contentas an always-rendered panel for a router outlet:Key changes
@tedi-design-system/angular/community→@tedi-design-system/angular.tedi-tabs-list(community had no list wrapper). Addaria-label(oraria-labelledby) on the list for accessibility.[tedi-tab](any element) →button[tedi-tabs-trigger](must be a native<button>).tabId→id(on the trigger).selected(model) +tabSelected(output) → centralizedvalue/defaultValue(inputs) +valueChange(output) ontedi-tabs.tedi-tab-contentwithtabId→tedi-tabs-contentwithid. An id-less panel always renders (router-outlet use case).iconinput on the trigger.overflowMode="dropdown" | "scroll"on the list.RouterLinkActivehost-directive behavior is no longer built in; drivevaluefrom routing instead.disabled: unchanged in name; now applied to the native<button>trigger.Summary — old → new mapping
import … from '@tedi-design-system/angular/community'import … from '@tedi-design-system/angular'<tedi-tabs>(selection lived on tabs)<tedi-tabs [(value)]>/defaultValue/(valueChange)<tedi-tabs-list aria-label="…" [overflowMode]>(required wrapper)<button tedi-tab tabId="x"><button tedi-tabs-trigger id="x">[selected](model),(tabSelected)value/valueChangeon rootdisableddisabled(on the<button>)iconinput on triggerRouterLinkActivebuilt into[tedi-tab]valuefrom routing;<tedi-tabs-content>(no id) for outlet<tedi-tab-content tabId="x"><tedi-tabs-content id="x">overflowMode="dropdown"(default) or"scroll"Summary by CodeRabbit
clipContentto dropdown item label rendering to control ellipsis/overflow behavior.