Skip to content

feat(tabs): new tedi-ready component #555#557

Merged
mart-sessman merged 8 commits intorcfrom
feat/555-tabs-tedi-ready
Apr 15, 2026
Merged

feat(tabs): new tedi-ready component #555#557
mart-sessman merged 8 commits intorcfrom
feat/555-tabs-tedi-ready

Conversation

@mart-sessman
Copy link
Copy Markdown
Contributor

@mart-sessman mart-sessman commented Mar 13, 2026

extracted StatusIndicator from badge

Summary by CodeRabbit

  • New Features

    • Tabs component with keyboard navigation (Arrow, Home, End keys), overflow handling modes (dropdown/scroll), icon support, and disabled states.
    • Status Indicator component with multiple status types and size/position variants.
    • useScrollFade hook for scroll fade effects.
    • React Router integration documentation for Tabs.
  • Improvements

    • StatusBadge now uses dedicated Status Indicator component.
    • Enhanced dropdown trigger prop merging.
  • Tests

    • Comprehensive test coverage added for Tabs, Status Indicator, and scroll fade functionality.

Migration Guide — Tabs

This release introduces a new TEDI-ready Tabs component that replaces the community Tabs. The new component uses a compound component pattern, giving consumers explicit control over tab triggers and content panels separately. The community Tabs, TabsItem, TabsNav, and TabsNavItem are now deprecated.

Community → TEDI-Ready Migration

What changed: The Tabs component has been rebuilt from a flat composition model (where TabsItem defined both the tab label and panel content) to a compound component pattern with explicit sub-components for the tab list, triggers, and content panels. Props have been renamed to align with standard conventions (value/defaultValue/onChange).

Why: The new architecture gives consumers explicit control over tab trigger rendering (icons, disabled states), supports overflow handling (dropdown or scroll), and enables router-based usage where content is rendered externally.

Before:

import { Tabs, TabsItem } from '@tedi-design-system/react/community';

<Tabs
  defaultCurrentTab="tab-1"
  aria-labelledby="tabs-heading"
  onTabChange={(id) => console.log(id)}
  hideNavOnPrint="hide"
>
  <TabsItem id="tab-1" label="General" padding={1.5} background="white">
    General settings content
  </TabsItem>
  <TabsItem id="tab-2" label="Advanced">
    Advanced settings content
  </TabsItem>
  <TabsItem id="tab-3" label="Notifications">
    Notification preferences content
  </TabsItem>
</Tabs>

After:

import { Tabs } from '@tedi-design-system/react/tedi';

<Tabs
  defaultValue="tab-1"
  onChange={(id) => console.log(id)}
>
  <Tabs.List aria-labelledby="tabs-heading" printVisibility="hide">
    <Tabs.Trigger id="tab-1">General</Tabs.Trigger>
    <Tabs.Trigger id="tab-2">Advanced</Tabs.Trigger>
    <Tabs.Trigger id="tab-3">Notifications</Tabs.Trigger>
  </Tabs.List>
  <Tabs.Content id="tab-1">
    General settings content
  </Tabs.Content>
  <Tabs.Content id="tab-2">
    Advanced settings content
  </Tabs.Content>
  <Tabs.Content id="tab-3">
    Notification preferences content
  </Tabs.Content>
</Tabs>

Key changes:

  • Import path changed from @tedi-design-system/react/community to @tedi-design-system/react/tedi
  • Composition model changed from flat (TabsItem holds both label and content) to compound (Tabs.Trigger for labels, Tabs.Content for panels)
  • defaultCurrentTab renamed to defaultValue
  • currentTab renamed to value (controlled mode)
  • onTabChange renamed to onChange
  • aria-labelledby moved from Tabs root to Tabs.List
  • hideNavOnPrint replaced by printVisibility on Tabs.List, with an additional 'print-only' option ('show' | 'hide' | 'print-only')
  • TabsItem.label prop removed — the tab label is now the children of Tabs.Trigger
  • TabsItem.padding / TabsItem.background removed — content panels no longer wrap in a Card. Style the content yourself if needed
  • New: overflowMode on Tabs.List — set to 'dropdown' (default) or 'scroll' to handle tabs that don't fit
  • New: icon prop on Tabs.Trigger — display an icon before the tab label
  • New: disabled prop on Tabs.Trigger — disable individual tabs
  • New: optional id on Tabs.Content — omit the id to always render content (useful for router-based tab navigation)

Mapping Table

Community (deprecated) TEDI-Ready Notes
Tabs Tabs Props renamed (see above)
TabsItem Tabs.Trigger + Tabs.Content Split into two components
TabsItem.label Tabs.Trigger children Label is now rendered content, not a string prop
TabsItem.id Tabs.Trigger.id + Tabs.Content.id Same id must be set on both
TabsItem.padding (removed) Style content directly
TabsItem.background (removed) Style content directly
TabsNav Tabs.List Now a compound sub-component
TabsNavItem Tabs.Trigger No longer anchor-based; rendered as <button>
Tabs.aria-labelledby Tabs.List.aria-labelledby Moved to list level
Tabs.hideNavOnPrint Tabs.List.printVisibility Expanded options
(n/a) Tabs.List.overflowMode New — 'dropdown' or 'scroll'
(n/a) Tabs.Trigger.icon New — icon before label
(n/a) Tabs.Trigger.disabled New — disable individual tabs

New Component — StatusIndicator

This release introduces StatusIndicator as a standalone component. It was extracted from StatusBadge's internals and is now available for independent use.

Import:

import { StatusIndicator } from '@tedi-design-system/react/tedi';

Props:

Prop Type Default
type 'success' | 'danger' | 'warning' | 'inactive' 'success'
size 'sm' | 'lg' 'sm'
hasBorder boolean false
position 'default' | 'top-right' 'default'
className string

This is an additive change — no migration action required.

extracted StatusIndicator from badge
@codecov
Copy link
Copy Markdown

codecov Bot commented Mar 13, 2026

Codecov Report

❌ Patch coverage is 97.29730% with 4 lines in your changes missing coverage. Please review.

Files with missing lines Patch % Lines
...rc/tedi/components/navigation/tabs/tabs-helpers.ts 93.10% 2 Missing ⚠️
...c/tedi/components/navigation/tabs/tabs-context.tsx 83.33% 1 Missing ⚠️
...components/navigation/tabs/tabs-list/tabs-list.tsx 98.41% 1 Missing ⚠️

📢 Thoughts on this report? Let us know!

Comment thread src/tedi/components/navigation/tabs/tabs.module.scss Outdated
Comment thread src/tedi/components/navigation/tabs/tabs.stories.tsx
Comment thread src/tedi/components/navigation/tabs/tabs.stories.tsx Outdated
url: 'https://www.figma.com/design/jWiRIXhHRxwVdMSimKX2FF/TEDI-READY-2.38.59?node-id=2405-53326&m=dev',
},
},
argTypes: {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

i think these are generated automatically, you should be able to remove them

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

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

by default it added just a string type without any selectable values. Could it be achieved without defining argTypes?

Copy link
Copy Markdown
Contributor

@airikej airikej Mar 13, 2026

Choose a reason for hiding this comment

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

ah i see the problem, it does that because you define separate types e.g

export type StatusIndicatorType = 'success' | 'danger' | 'warning' | 'inactive';
export type StatusIndicatorSize = 'sm' | 'lg';
export type StatusIndicatorPosition = 'default' | 'top-right';

and then assign it like
statusIndicatorPosition: StatusIndicatorPosition
but if you add it like this:
statusIndicatorPosition: default' | 'top-right'
then it shows the selection

no idea how to fix that though

@mart-sessman
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 26, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 26, 2026

📝 Walkthrough

Walkthrough

A comprehensive Tabs component suite is added to TEDI with keyboard navigation, overflow handling (dropdown/scroll modes), and context-driven state management. A new StatusIndicator component is introduced for visual status badges. Supporting infrastructure includes a useScrollFade hook, Jest mocks for browser APIs, updated existing components (StatusBadge, ScrollFade, DropdownTrigger), and localization labels.

Changes

Cohort / File(s) Summary
Jest Configuration
jest-mocks.js
Added global mocks for ResizeObserver and Element.prototype.scrollIntoView for test environments.
Tabs Core Implementation
src/tedi/components/navigation/tabs/tabs.tsx, tabs-context.tsx, tabs-helpers.ts
New Tabs component with context-based state management, keyboard navigation helper for tablist ArrowKey/Home/End handling, and support for controlled/uncontrolled modes.
Tabs Subcomponents
src/tedi/components/navigation/tabs/tabs-list/tabs-list.tsx, tabs-trigger/tabs-trigger.tsx, tabs-content/tabs-content.tsx
Three new React components for tablist container, individual tab triggers with ARIA support, and tab panel content; supports overflow detection and dropdown/scroll modes.
Tabs Styling & Exports
src/tedi/components/navigation/tabs/tabs.module.scss, index.ts
New SCSS module with tab button base mixin, selected/disabled states, scroll fade overlays, and "more" button styles; barrel export for tabs APIs.
Tabs Testing & Documentation
src/tedi/components/navigation/tabs/tabs.spec.tsx, tabs.stories.tsx, usage-with-router.mdx
Comprehensive test suite covering rendering, keyboard navigation, overflow behavior, and accessibility; Storybook stories with multiple interaction scenarios; React Router integration guide.
ScrollFade Hook
src/tedi/helpers/hooks/use-scroll-fade.ts, use-scroll-fade.spec.tsx, src/tedi/helpers/index.ts
New hook for detecting scroll position (start/end) with ResizeObserver support; includes tests validating vertical/horizontal scroll detection and callback triggers.
StatusIndicator Component
src/tedi/components/tags/status-indicator/status-indicator.tsx, status-indicator.module.scss, index.ts
New component rendering circular status indicator with type/size variants, positioned absolutely for badge placement; defines SCSS module with background colors and styling variants.
StatusIndicator Testing & Stories
src/tedi/components/tags/status-indicator/status-indicator.spec.tsx, status-indicator.stories.tsx
Test suite validating DOM structure and class application; Storybook stories demonstrating default, all variants grid, and positioning examples.
StatusBadge Refactoring
src/tedi/components/tags/status-badge/status-badge.tsx, status-badge.spec.tsx, status-badge.module.scss
Updated to delegate status visualization to new StatusIndicator component; removed badge-level status styling block and updated tests to verify indicator element instead of modifier classes.
Component Integration Updates
src/tedi/components/misc/scroll-fade/scroll-fade.tsx, src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.tsx, src/community/components/tabs/tabs.stories.tsx
ScrollFade refactored to use useScrollFade hook; DropdownTrigger now spreads children props into reference props; Community Tabs stories updated with status metadata.
Public API Exports
src/tedi/index.ts
Added re-exports for new StatusIndicator and Tabs component suites at package entrypoint.
Localization
src/tedi/providers/label-provider/labels-map.ts
Added 'tabs.more' label with translations (et/en/ru) for overflow "more" button; extended close label to include Tabs component association.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant Trigger as TabsTrigger
    participant Context as TabsContext
    participant Content as TabsContent
    participant Observer as ResizeObserver

    User->>Trigger: Click tab (not disabled)
    Trigger->>Context: setCurrentTab(id)
    Context-->>Trigger: Update currentTab
    Trigger-->>User: Tab appears selected
    Content->>Context: Read currentTab
    alt id matches currentTab
        Content-->>User: Render panel
    else id doesn't match
        Content-->>User: Return null
    end

    Note over Observer: In overflow mode (dropdown)
    Observer->>Observer: Detect size change
    Observer->>Trigger: Calculate overflow
    alt Overflow detected
        Trigger-->>User: Show "More" button
        User->>Trigger: Click More button
        Trigger->>Content: Open dropdown
        User->>Content: Select non-current tab
        Content->>Context: setCurrentTab(selectedId)
        Content-->>User: Close dropdown
    else No overflow
        Trigger-->>User: Hide "More" button
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~55 minutes

Poem

🐰 Tabs now dance in rows so neat,
StatusIndicators mark the beat,
Scroll fades whisper, left and right,
Navigation flows just right,
Context magic, hooks so bright! 🎀

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main objective of the PR: introducing a new Tabs component (TEDI-Ready). It is concise, specific, and clearly communicates the primary change.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/555-tabs-tedi-ready

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 5

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.tsx (1)

15-21: ⚠️ Potential issue | 🟠 Major

Ref override risk: children.props.ref can overwrite refs.setReference.

The current spread order { ref: refs.setReference, ...children.props } means any ref in children.props will override the dropdown's reference setter. This would silently break Floating UI positioning if a consumer passes a trigger element with its own ref.

Reverse the order so refs.setReference always takes precedence:

Proposed fix
  return cloneElement(
    children,
    getReferenceProps({
-     ref: refs.setReference,
      ...children.props,
+     ref: refs.setReference,
    })
  );

Note: If supporting both refs is a requirement, consider using a ref-merging utility (e.g., useMergeRefs from Floating UI or a custom helper).

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.tsx`
around lines 15 - 21, The spread order in the cloneElement call lets
children.props.ref override the dropdown's reference setter; update the props
passed to cloneElement/getReferenceProps so refs.setReference takes precedence
(i.e., spread children.props first, then provide ref: refs.setReference) when
calling cloneElement in dropdown-trigger.tsx (symbols: cloneElement,
getReferenceProps, refs.setReference, children.props); if you need to preserve
both refs instead, merge them with a ref-merging utility like useMergeRefs and
pass the merged ref as refs.setReference.
🧹 Nitpick comments (3)
src/tedi/components/tags/status-indicator/status-indicator.tsx (1)

52-53: Simplify accessibility attributes.

Since aria-hidden="true" hides this element from assistive technology, the role="img" is effectively ignored. For purely decorative elements, you can use aria-hidden="true" alone.

♻️ Suggested simplification
       className={cn(...)}
-      role="img"
       aria-hidden="true"
     />
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/tedi/components/tags/status-indicator/status-indicator.tsx` around lines
52 - 53, The JSX element inside the StatusIndicator component currently sets
both role="img" and aria-hidden="true"; remove the redundant role="img"
attribute so the decorative element is only hidden from assistive tech via
aria-hidden="true". Locate the element in StatusIndicator (the tag with
role="img" and aria-hidden) and delete the role prop, leaving aria-hidden="true"
only to simplify accessibility.
src/tedi/components/navigation/tabs/tabs-list/tabs-list.tsx (1)

77-85: Consider simplifying the ref merging.

The type assertion on line 79 works but is verbose. An alternative is to use a mutable ref from the start.

♻️ Alternative using useRef with explicit null type
- const listRef = useRef<HTMLDivElement>(null);
+ const listRef = useRef<HTMLDivElement | null>(null);
  ...
  const mergedListRef = useCallback(
    (node: HTMLDivElement | null) => {
-     (listRef as React.MutableRefObject<HTMLDivElement | null>).current = node;
+     listRef.current = node;
      if (overflowMode === 'scroll') {
        scrollRef(node);
      }
    },
    [overflowMode, scrollRef]
  );
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/tedi/components/navigation/tabs/tabs-list/tabs-list.tsx` around lines 77
- 85, The mergedListRef callback uses a verbose type assertion on listRef;
instead, make listRef a mutable ref with an explicit null type (e.g.,
useRef<HTMLDivElement | null>(null)) so you can assign node directly without
casting, then keep mergedListRef (and its useCallback) to set listRef.current =
node and call scrollRef(node) when overflowMode === 'scroll'. Update the
definition of listRef where it is declared (rather than inside mergedListRef)
and remove the (listRef as React.MutableRefObject...) cast to simplify the ref
merging.
src/tedi/components/navigation/tabs/tabs.module.scss (1)

47-47: Consider using CSS variables for hardcoded pixel values.

The 48px width for scroll-fade overlays is hardcoded. For consistency with the design token approach used elsewhere (e.g., var(--borders-02), var(--tab-spacing-x)), consider using a CSS variable.

♻️ Suggested change
-      width: 48px;
+      width: var(--tab-scroll-fade-width, 48px);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/tedi/components/navigation/tabs/tabs.module.scss` at line 47, Replace the
hardcoded "width: 48px" in tabs.module.scss with a CSS variable to match
existing design-token usage: add a new variable like --tab-scroll-fade-width
(defined in :root or the module's top-level selector with a fallback of 48px)
and use var(--tab-scroll-fade-width, 48px) in place of the literal 48px; this
keeps consistency with variables such as --borders-02 and --tab-spacing-x and
allows future theming/tokens to control the scroll-fade overlay width.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@src/tedi/components/navigation/tabs/tabs-content/tabs-content.tsx`:
- Around line 35-37: In TabsContent, when id prop is not provided the panel
still has role="tabpanel" but no aria-labelledby; update the component to
compute a fallback label id (e.g., use the current/active tab id from the tabs
context or prop — look for functions/values like getActiveTabId, activeTabId, or
useTabsContext) and set aria-labelledby={id ?? fallbackTabId ?? undefined} while
keeping id={id ? `${id}-panel` : undefined}; ensure the fallback value is the
corresponding tab element id so the tab↔panel ARIA linkage is preserved.

In `@src/tedi/components/navigation/tabs/tabs-helpers.ts`:
- Around line 13-17: The code assumes tabs[newIndex] exists and calls .focus() /
.scrollIntoView() without guarding against empty or invalid tab sets; update the
logic around the tabs array and index calculations (use the variables tabs,
currentIndex, newIndex) to early-return or no-op when tabs.length === 0 or
currentIndex === -1, and before invoking methods ensure typeof tabs[newIndex]
!== 'undefined' (apply the same guard to the similar block referenced at lines
34-38) so focus/scrollIntoView are only called on a valid HTMLElement.

In `@src/tedi/components/navigation/tabs/tabs-list/tabs-list.tsx`:
- Line 101: The dropdownItems array filters out the current tab (dropdownItems =
allItems.filter(item => item.id !== currentTab)), so passing active={currentTab
=== item.id} to each dropdown item is always false; remove the dead active prop
from the dropdown item JSX (or alternatively, if you intended to highlight the
current/previous tab, either stop filtering out the currentTab from
dropdownItems or change the comparison to a different selectedId variable).
Update the rendering logic around dropdownItems and the component receiving the
active prop (e.g., TabDropdownItem or similar) accordingly.

In `@src/tedi/components/navigation/tabs/tabs-trigger/tabs-trigger.tsx`:
- Around line 11-13: The JSDoc for the TabsTrigger prop `id` is inconsistent
with how `aria-controls` is generated: `TabsTrigger` currently sets
aria-controls to `${id}-panel` but the comment says it must match the
corresponding `TabsContent` id. Update one of two things: either change
`aria-controls` generation in the TabsTrigger component to use the raw `id` (so
aria-controls={id}), or change the docs/JSDoc to state that `TabsContent` should
use `${id}-panel` and keep aria-controls={\`${id}-panel\`}; ensure the naming is
consistent between `TabsTrigger` (aria-controls) and `TabsContent` (id) and
update the JSDoc on the `id` prop accordingly.

In `@src/tedi/helpers/hooks/use-scroll-fade.ts`:
- Around line 74-75: The current onScrollToStartRef.current and
onScrollToEndRef.current calls fire every frame while at the boundary; change
useScrollFade to track previous boundary state (e.g., using
atStartPrev/atEndPrev refs or state) and only invoke
onScrollToStartRef.current() when atStart becomes true and atStartPrev was
false, and only invoke onScrollToEndRef.current() when atEnd becomes true and
atEndPrev was false; after invoking update the prev refs to reflect the new
boundary state so callbacks fire only on edge transitions.

---

Outside diff comments:
In `@src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.tsx`:
- Around line 15-21: The spread order in the cloneElement call lets
children.props.ref override the dropdown's reference setter; update the props
passed to cloneElement/getReferenceProps so refs.setReference takes precedence
(i.e., spread children.props first, then provide ref: refs.setReference) when
calling cloneElement in dropdown-trigger.tsx (symbols: cloneElement,
getReferenceProps, refs.setReference, children.props); if you need to preserve
both refs instead, merge them with a ref-merging utility like useMergeRefs and
pass the merged ref as refs.setReference.

---

Nitpick comments:
In `@src/tedi/components/navigation/tabs/tabs-list/tabs-list.tsx`:
- Around line 77-85: The mergedListRef callback uses a verbose type assertion on
listRef; instead, make listRef a mutable ref with an explicit null type (e.g.,
useRef<HTMLDivElement | null>(null)) so you can assign node directly without
casting, then keep mergedListRef (and its useCallback) to set listRef.current =
node and call scrollRef(node) when overflowMode === 'scroll'. Update the
definition of listRef where it is declared (rather than inside mergedListRef)
and remove the (listRef as React.MutableRefObject...) cast to simplify the ref
merging.

In `@src/tedi/components/navigation/tabs/tabs.module.scss`:
- Line 47: Replace the hardcoded "width: 48px" in tabs.module.scss with a CSS
variable to match existing design-token usage: add a new variable like
--tab-scroll-fade-width (defined in :root or the module's top-level selector
with a fallback of 48px) and use var(--tab-scroll-fade-width, 48px) in place of
the literal 48px; this keeps consistency with variables such as --borders-02 and
--tab-spacing-x and allows future theming/tokens to control the scroll-fade
overlay width.

In `@src/tedi/components/tags/status-indicator/status-indicator.tsx`:
- Around line 52-53: The JSX element inside the StatusIndicator component
currently sets both role="img" and aria-hidden="true"; remove the redundant
role="img" attribute so the decorative element is only hidden from assistive
tech via aria-hidden="true". Locate the element in StatusIndicator (the tag with
role="img" and aria-hidden) and delete the role prop, leaving aria-hidden="true"
only to simplify accessibility.
🪄 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: defaults

Review profile: CHILL

Plan: Pro

Run ID: 9ea0e2e1-639b-41e2-bcc1-671944500f7a

📥 Commits

Reviewing files that changed from the base of the PR and between 564c148 and f66bfb2.

📒 Files selected for processing (28)
  • jest-mocks.js
  • src/community/components/tabs/tabs.stories.tsx
  • src/tedi/components/misc/scroll-fade/scroll-fade.tsx
  • src/tedi/components/navigation/tabs/index.ts
  • src/tedi/components/navigation/tabs/tabs-content/tabs-content.tsx
  • src/tedi/components/navigation/tabs/tabs-context.tsx
  • src/tedi/components/navigation/tabs/tabs-helpers.ts
  • src/tedi/components/navigation/tabs/tabs-list/tabs-list.tsx
  • src/tedi/components/navigation/tabs/tabs-trigger/tabs-trigger.tsx
  • src/tedi/components/navigation/tabs/tabs.module.scss
  • src/tedi/components/navigation/tabs/tabs.spec.tsx
  • src/tedi/components/navigation/tabs/tabs.stories.tsx
  • src/tedi/components/navigation/tabs/tabs.tsx
  • src/tedi/components/navigation/tabs/usage-with-router.mdx
  • src/tedi/components/overlays/dropdown/dropdown-trigger/dropdown-trigger.tsx
  • src/tedi/components/tags/status-badge/status-badge.module.scss
  • src/tedi/components/tags/status-badge/status-badge.spec.tsx
  • src/tedi/components/tags/status-badge/status-badge.tsx
  • src/tedi/components/tags/status-indicator/index.ts
  • src/tedi/components/tags/status-indicator/status-indicator.module.scss
  • src/tedi/components/tags/status-indicator/status-indicator.spec.tsx
  • src/tedi/components/tags/status-indicator/status-indicator.stories.tsx
  • src/tedi/components/tags/status-indicator/status-indicator.tsx
  • src/tedi/helpers/hooks/use-scroll-fade.spec.tsx
  • src/tedi/helpers/hooks/use-scroll-fade.ts
  • src/tedi/helpers/index.ts
  • src/tedi/index.ts
  • src/tedi/providers/label-provider/labels-map.ts
💤 Files with no reviewable changes (1)
  • src/tedi/components/tags/status-badge/status-badge.module.scss

Comment thread src/tedi/components/navigation/tabs/tabs-content/tabs-content.tsx
Comment thread src/tedi/components/navigation/tabs/tabs-helpers.ts
Comment thread src/tedi/components/navigation/tabs/tabs-list/tabs-list.tsx
Comment thread src/tedi/components/navigation/tabs/tabs-trigger/tabs-trigger.tsx Outdated
Comment thread src/tedi/helpers/hooks/use-scroll-fade.ts Outdated
@mart-sessman
Copy link
Copy Markdown
Contributor Author

@coderabbitai resolve

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 26, 2026

✅ Actions performed

Comments resolved. Approval is disabled; enable reviews.request_changes_workflow to allow explicit top-level @coderabbitai resolve or @coderabbitai approve commands.

const dropdownItems = allItems.filter((item) => item.id !== currentTab);

const handleMoreSelect = (id: string) => {
if (id) {
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Is this if needed?

top: 0;
bottom: 0;
z-index: 1;
width: 48px;
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Replace with design token?

export interface StatusIndicatorProps {
/**
* The status type, which determines the indicator color.
* @default 'success'
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Apostrophes are unnecessary for the default string values. At the moment it shows it as "'success'" in Storybook.

@mart-sessman mart-sessman merged commit 9c06c51 into rc Apr 15, 2026
22 checks passed
@mart-sessman mart-sessman deleted the feat/555-tabs-tedi-ready branch April 15, 2026 11:32
github-actions Bot pushed a commit that referenced this pull request Apr 15, 2026
# [17.0.0-rc.6](react-17.0.0-rc.5...react-17.0.0-rc.6) (2026-04-15)

### Features

* **tabs:** new tedi-ready component [#555](#555) ([#557](#557)) ([9c06c51](9c06c51))
github-actions Bot pushed a commit that referenced this pull request Apr 29, 2026
# [17.0.0](react-16.1.0...react-17.0.0) (2026-04-29)

### Bug Fixes

* **checkbox:** invalid indicator hover border fix [#605](#605) ([#609](#609)) ([f1d62c6](f1d62c6))
* **select:** select placeholder no longer blocks context menu interactions [#584](#584) ([#585](#585)) ([e8d86ab](e8d86ab))
* **variables:** update core version, update variable names [#592](#592) ([#598](#598)) ([1f15b36](1f15b36))

### Features

* **button-group:** add mobile variant [#448](#448) ([#606](#606)) ([54dee90](54dee90)), closes [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94) [#94](#94)
* **card:** add more control to borderRadius usage, add examples [#444](#444) ([#597](#597)) ([deac9db](deac9db))
* **print:** introduce PrintingProvider + context-based usePrint [#99](#99) ([#497](#497)) ([a58cb70](a58cb70))
* **spinner:** add new sizes [#586](#586) ([#589](#589)) ([fbea0c3](fbea0c3))
* **tabs:** new tedi-ready component [#555](#555) ([#557](#557)) ([9c06c51](9c06c51))
* **textarea:** add autoGrow, height and maxHeight props [#588](#588) ([#593](#593)) ([2c86740](2c86740))
* **toggle:** new TEDI-Ready component [#305](#305) ([#594](#594)) ([6f28045](6f28045))

### BREAKING CHANGES

* **print:** usePrint hook removed.
Replace with usePrint from the new PrintingProvider context.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants