diff --git a/src/components/StepProgress.module.css b/src/components/StepProgress.module.css
new file mode 100644
index 0000000..519886c
--- /dev/null
+++ b/src/components/StepProgress.module.css
@@ -0,0 +1,35 @@
+.steps {
+ display: flex;
+ justify-content: center;
+ gap: var(--space-lg);
+ list-style: none;
+ padding: 0;
+ margin: 0 0 var(--space-lg);
+}
+
+.step {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ gap: 0.35rem;
+ opacity: 0.4;
+ transition: opacity 0.3s ease;
+}
+
+.step.active {
+ opacity: 1;
+}
+
+.dot {
+ width: 10px;
+ height: 10px;
+ border-radius: 50%;
+ background: var(--color-gold);
+}
+
+.label {
+ font-size: 0.7rem;
+ letter-spacing: 1px;
+ text-transform: uppercase;
+ color: var(--color-charcoal);
+}
diff --git a/src/components/StepProgress.test.tsx b/src/components/StepProgress.test.tsx
new file mode 100644
index 0000000..ca1726a
--- /dev/null
+++ b/src/components/StepProgress.test.tsx
@@ -0,0 +1,27 @@
+import { render, screen } from '@testing-library/react'
+import { describe, it, expect } from 'vitest'
+import StepProgress from './StepProgress'
+
+describe('StepProgress', () => {
+ it('marks steps up to and including the current one as active', () => {
+ render(
- {selectedService?.name} on {booking.state.date} at {booking.state.slot?.time}. - Mira will see you then. -
-No times available on this date.
- {nextAvailable && ( - - )} -+ {selectedService?.name} on {booking.state.date} at {booking.state.slot?.time}. + Mira will see you then. +
)} - {availableSlots.length > 0 && ( -No times available on this date.
+ {nextAvailable && ( + + )} +