Skip to content

feat(horizontal-stepper): new TEDI-ready component #405#437

Open
mart-sessman wants to merge 6 commits into
rcfrom
feat/405-horizontal-stepper-tedi-ready
Open

feat(horizontal-stepper): new TEDI-ready component #405#437
mart-sessman wants to merge 6 commits into
rcfrom
feat/405-horizontal-stepper-tedi-ready

Conversation

@mart-sessman
Copy link
Copy Markdown
Contributor

@mart-sessman mart-sessman commented May 8, 2026

Summary

Adds the new TEDI-ready Horizontal Stepper component (and its HorizontalStepperItem sub-component).

This PR is a fresh re-open of #410, which was closed automatically during a force-push and could not be reopened. Code is identical (cherry-picked from the same commits, now applied cleanly on top of the post-revert rc).

Test plan

  • CI green (lint, tests, build)
  • Storybook story for tedi-horizontal-stepper renders correctly
  • Component reflects the design review feedback already applied in c174ded

Summary by CodeRabbit

Release Notes

  • New Features

    • Added HorizontalStepper component to guide users through multi-step workflows with visual indicators for completed, current, and error states.
    • Added step descriptions, customizable background styles, and responsive compact mode for smaller screens.
    • Enhanced accessibility with ARIA labels and navigation semantics.
  • Documentation

    • Added component reference documentation.
  • Chores

    • Updated design system dependency.

Review Change Stack

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 8, 2026

Warning

Rate limit exceeded

@mart-sessman has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 48 minutes and 28 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: ba2e4f11-c9b9-4ab8-a044-12e6eb65c7d1

📥 Commits

Reviewing files that changed from the base of the PR and between 1bafb71 and 44eaf53.

📒 Files selected for processing (10)
  • skills/tedi-angular/references/components.md
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.scss
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.spec.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.stories.ts
  • tedi/components/overlay/modal/modal.component.scss
  • tedi/components/overlay/modal/modal.stories.ts
  • tedi/components/overlay/modal/modal.types.ts
  • tedi/services/breakpoint/breakpoint.service.ts
📝 Walkthrough

Walkthrough

This PR introduces a complete horizontal stepper component for multi-step workflows. HorizontalStepper provides a parent component that orchestrates child items, auto-assigns step numbers via Angular signals, and supports configurable backgrounds and responsive compact layouts. Each item renders a step button with label, optional description, and dynamic visual states (selected, completed, error, disabled).

Changes

HorizontalStepper Component

Layer / File(s) Summary
Types & Public API
tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.ts
Exports HorizontalStepperBackground ("default" | "transparent"), HorizontalStepperBreakpoint ("sm" | "md" | "lg" | "xl"), and HorizontalStepperCompact (boolean | breakpoint) type aliases.
Item Component
tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.ts
HorizontalStepperItemComponent exposes required label, optional description, boolean state inputs (completed, error, selected, disabled), stepSelect output, internal _stepNumber signal, and onClick that emits only when not already selected.
Item Template & Styles
tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.html, .scss
Template renders button with conditional disabled/ARIA state, icon indicator (check/exclamation/number), label, and description. Base styles define layout and interactive hover. Three modifiers: --selected (with clip-path arrow), --completed, --error override colors and borders.
Item Unit Tests
tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.spec.ts
Tests rendering (label, description), state visuals (CSS classes + icons), step-number visibility, stepSelect emission rules, disabled behavior, and button control verification.
Parent Component
tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.ts
HorizontalStepperComponent accepts signal inputs ariaLabel, background, compact; queries projected items via contentChildren; assigns 1-based step numbers via effect; host binds CSS modifiers and navigation role/label.
Parent Template & Styles
tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.html, .scss
Template provides <ng-content /> slot. Base .tedi-horizontal-stepper styling defines background color with --transparent and --compact modifiers. compact-styles mixin hides non-selected item content; breakpoint variants (--compact-{sm,md,lg,xl}) apply responsive compact via media-breakpoint-down.
Parent Unit Tests
tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.spec.ts
Tests creation, navigation semantics, step-number generation, transparent background toggling, state CSS classes, default compact-sm, and breakpoint-specific compact class application.
Storybook Stories
tedi/components/navigation/horizontal-stepper/horizontal-stepper.stories.ts
Defines 10 stories: Default, SecondStep, ThirdStep, WithErrors, WithDescriptions, TransparentBackground, AlwaysCompact, CompactAtMdBreakpoint, ClickToNavigate (signal-driven selection), and ExternalNavigation (back/next with disabled future steps). Includes interactive demos and source snippets.
Component Reference
skills/tedi-angular/references/components.md
Documents HorizontalStepper selector, inputs, sub-component interface, and example usage.
Module Exports
tedi/components/navigation/horizontal-stepper/index.ts, tedi/components/navigation/index.ts, tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/index.ts
Adds barrel re-exports at item, stepper, and navigation levels to expose components publicly.
Dependencies & Translations
package.json, tedi/services/translation/translations.ts
Updates @tedi-design-system/core to ^6.1.0; adds stepper.error translation entry with et/en/ru localized messages.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

Suggested reviewers

  • ly-tempel-bitweb
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and specifically describes the main change: introducing a new TEDI-ready Horizontal Stepper component, which aligns perfectly with the changeset's primary focus.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/405-horizontal-stepper-tedi-ready

Tip

💬 Introducing Slack Agent: The best way for teams to turn conversations into code.

Slack Agent is built on CodeRabbit's deep understanding of your code, so your team can collaborate across the entire SDLC without losing context.

  • Generate code and open pull requests
  • Plan features and break down work
  • Investigate incidents and troubleshoot customer tickets together
  • Automate recurring tasks and respond to alerts with triggers
  • Summarize progress and report instantly

Built for teams:

  • Shared memory across your entire org—no repeating context
  • Per-thread sandboxes to safely plan and execute work
  • Governance built-in—scoped access, auditability, and budget controls

One agent for your entire SDLC. Right inside Slack.

👉 Get started


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.

@codecov
Copy link
Copy Markdown

codecov Bot commented May 8, 2026

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

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: 1

🧹 Nitpick comments (1)
tedi/components/navigation/horizontal-stepper/horizontal-stepper.stories.ts (1)

85-114: ⚡ Quick win

Avoid exposing Storybook controls that don’t affect rendering.

ariaLabel and compact are declared in argTypes, but several templates hardcode ariaLabel and skip [compact], so those controls are inert in those stories. Either bind them from props or remove those controls for fixed-state stories.

Example adjustment (representative)
-      <tedi-horizontal-stepper ariaLabel="Form progress" [background]="background">
+      <tedi-horizontal-stepper
+        [ariaLabel]="ariaLabel"
+        [background]="background"
+        [compact]="compact"
+      >

Also applies to: 124-125, 141-142, 158-159, 176-177, 201-202

🤖 Prompt for 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.

In `@tedi/components/navigation/horizontal-stepper/horizontal-stepper.stories.ts`
around lines 85 - 114, Some stories declare argTypes for ariaLabel and compact
but the story templates either hardcode ariaLabel or omit binding [compact],
making those Storybook controls inert; update each affected story template
(e.g., the story functions that render <tedi-horizontal-stepper ...>) to bind
ariaLabel and compact from props (use :aria-label="ariaLabel" or v-bind and
[compact]="compact" / :compact="compact" depending on framework) so controls
affect rendering, or remove ariaLabel/compact from the story's argTypes if the
story is meant to be a fixed-state example; ensure changes touch the story
export functions/templates referenced in horizontal-stepper.stories.ts (the
stories around the mentioned ranges) so controls match actual inputs.
🤖 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/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.ts`:
- Around line 51-54: The onClick() handler currently only guards against
selected() but should also guard against disabled() to prevent actions when the
item is disabled; update the onClick() method in
horizontal-stepper-item.component.ts to return early if this.disabled() (in
addition to this.selected()) so that stepSelect.emit() is never called for
disabled items.

---

Nitpick comments:
In `@tedi/components/navigation/horizontal-stepper/horizontal-stepper.stories.ts`:
- Around line 85-114: Some stories declare argTypes for ariaLabel and compact
but the story templates either hardcode ariaLabel or omit binding [compact],
making those Storybook controls inert; update each affected story template
(e.g., the story functions that render <tedi-horizontal-stepper ...>) to bind
ariaLabel and compact from props (use :aria-label="ariaLabel" or v-bind and
[compact]="compact" / :compact="compact" depending on framework) so controls
affect rendering, or remove ariaLabel/compact from the story's argTypes if the
story is meant to be a fixed-state example; ensure changes touch the story
export functions/templates referenced in horizontal-stepper.stories.ts (the
stories around the mentioned ranges) so controls match actual inputs.
🪄 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: 867ef4a5-4164-403b-bdbb-398d525a5101

📥 Commits

Reviewing files that changed from the base of the PR and between a575670 and 1bafb71.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (15)
  • package.json
  • skills/tedi-angular/references/components.md
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.html
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.scss
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.spec.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/horizontal-stepper-item.component.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper-item/index.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.html
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.scss
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.spec.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.component.ts
  • tedi/components/navigation/horizontal-stepper/horizontal-stepper.stories.ts
  • tedi/components/navigation/horizontal-stepper/index.ts
  • tedi/components/navigation/index.ts
  • tedi/services/translation/translations.ts

gap: var(--stepper-item-horizontal-inner-spacing);
align-items: flex-start;
width: auto;
min-height: 40px;
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.

maybe use the variable here? min-height: var(--stepper-item-horizontal-min-height);

@airikej
Copy link
Copy Markdown
Contributor

airikej commented May 14, 2026

currently the items seem to be missing focus styles? if i navigate with keyboard its hard to understand on which item i'm currently on

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.

2 participants