From 85ff3b8f01fb97e00f402d6dc15369f9f252e3d1 Mon Sep 17 00:00:00 2001 From: adilallo <39313955+adilallo@users.noreply.github.com> Date: Fri, 6 Feb 2026 14:33:25 -0700 Subject: [PATCH] Update proportion bar component --- .../progress/Progress/Progress.container.tsx | 23 ---- app/components/progress/Progress/index.tsx | 1 - .../ProportionBar/ProportionBar.container.tsx | 23 ++++ .../ProportionBar.types.ts} | 10 +- .../ProportionBar.view.tsx} | 8 +- .../progress/ProportionBar/index.tsx | 1 + .../Stepper/Stepper.container.tsx | 0 .../{Progress => }/Stepper/Stepper.types.ts | 0 .../{Progress => }/Stepper/Stepper.view.tsx | 0 .../progress/{Progress => }/Stepper/index.tsx | 0 .../utility/ModalFooter/ModalFooter.view.tsx | 2 +- stories/progress/Progress.stories.js | 110 ------------------ stories/progress/ProportionBar.stories.js | 74 ++++++++++++ ...ogress.test.tsx => ProportionBar.test.tsx} | 32 ++--- tests/components/Stepper.test.tsx | 2 +- 15 files changed, 125 insertions(+), 161 deletions(-) delete mode 100644 app/components/progress/Progress/Progress.container.tsx delete mode 100644 app/components/progress/Progress/index.tsx create mode 100644 app/components/progress/ProportionBar/ProportionBar.container.tsx rename app/components/progress/{Progress/Progress.types.ts => ProportionBar/ProportionBar.types.ts} (51%) rename app/components/progress/{Progress/Progress.view.tsx => ProportionBar/ProportionBar.view.tsx} (95%) create mode 100644 app/components/progress/ProportionBar/index.tsx rename app/components/progress/{Progress => }/Stepper/Stepper.container.tsx (100%) rename app/components/progress/{Progress => }/Stepper/Stepper.types.ts (100%) rename app/components/progress/{Progress => }/Stepper/Stepper.view.tsx (100%) rename app/components/progress/{Progress => }/Stepper/index.tsx (100%) delete mode 100644 stories/progress/Progress.stories.js create mode 100644 stories/progress/ProportionBar.stories.js rename tests/components/{Progress.test.tsx => ProportionBar.test.tsx} (70%) diff --git a/app/components/progress/Progress/Progress.container.tsx b/app/components/progress/Progress/Progress.container.tsx deleted file mode 100644 index b74b660..0000000 --- a/app/components/progress/Progress/Progress.container.tsx +++ /dev/null @@ -1,23 +0,0 @@ -"use client"; - -import { memo } from "react"; -import { ProgressView } from "./Progress.view"; -import type { ProgressProps } from "./Progress.types"; - -const ProgressContainer = memo( - ({ progress = "3-2", className = "" }) => { - const barClasses = `h-[8px] relative w-full`; - - return ( - - ); - }, -); - -ProgressContainer.displayName = "Progress"; - -export default ProgressContainer; diff --git a/app/components/progress/Progress/index.tsx b/app/components/progress/Progress/index.tsx deleted file mode 100644 index 178ca49..0000000 --- a/app/components/progress/Progress/index.tsx +++ /dev/null @@ -1 +0,0 @@ -export { default } from "./Progress.container"; diff --git a/app/components/progress/ProportionBar/ProportionBar.container.tsx b/app/components/progress/ProportionBar/ProportionBar.container.tsx new file mode 100644 index 0000000..517aa02 --- /dev/null +++ b/app/components/progress/ProportionBar/ProportionBar.container.tsx @@ -0,0 +1,23 @@ +"use client"; + +import { memo } from "react"; +import { ProportionBarView } from "./ProportionBar.view"; +import type { ProportionBarProps } from "./ProportionBar.types"; + +const ProportionBarContainer = memo( + ({ progress = "3-2", className = "" }) => { + const barClasses = `h-[8px] relative w-full`; + + return ( + + ); + }, +); + +ProportionBarContainer.displayName = "ProportionBar"; + +export default ProportionBarContainer; diff --git a/app/components/progress/Progress/Progress.types.ts b/app/components/progress/ProportionBar/ProportionBar.types.ts similarity index 51% rename from app/components/progress/Progress/Progress.types.ts rename to app/components/progress/ProportionBar/ProportionBar.types.ts index c64d9f2..3a6510e 100644 --- a/app/components/progress/Progress/Progress.types.ts +++ b/app/components/progress/ProportionBar/ProportionBar.types.ts @@ -1,4 +1,4 @@ -export type ProgressBarState = +export type ProportionBarState = | "1-0" | "1-1" | "1-2" @@ -12,13 +12,13 @@ export type ProgressBarState = | "3-1" | "3-2"; -export interface ProgressProps { - progress?: ProgressBarState; +export interface ProportionBarProps { + progress?: ProportionBarState; className?: string; } -export interface ProgressViewProps { - progress: ProgressBarState; +export interface ProportionBarViewProps { + progress: ProportionBarState; className: string; barClasses: string; } diff --git a/app/components/progress/Progress/Progress.view.tsx b/app/components/progress/ProportionBar/ProportionBar.view.tsx similarity index 95% rename from app/components/progress/Progress/Progress.view.tsx rename to app/components/progress/ProportionBar/ProportionBar.view.tsx index e41ce33..c98f26f 100644 --- a/app/components/progress/Progress/Progress.view.tsx +++ b/app/components/progress/ProportionBar/ProportionBar.view.tsx @@ -1,11 +1,11 @@ -import type { ProgressViewProps } from "./Progress.types"; +import type { ProportionBarViewProps } from "./ProportionBar.types"; -export function ProgressView({ +export function ProportionBarView({ progress, className, barClasses, -}: ProgressViewProps) { - // Progress bar type +}: ProportionBarViewProps) { + // Proportion bar type const [fullSegments, partialSegment] = progress.split("-").map(Number); // Calculate total progress: // - For 1-X: first section is (X+1)/6 filled diff --git a/app/components/progress/ProportionBar/index.tsx b/app/components/progress/ProportionBar/index.tsx new file mode 100644 index 0000000..2e34c4e --- /dev/null +++ b/app/components/progress/ProportionBar/index.tsx @@ -0,0 +1 @@ +export { default } from "./ProportionBar.container"; diff --git a/app/components/progress/Progress/Stepper/Stepper.container.tsx b/app/components/progress/Stepper/Stepper.container.tsx similarity index 100% rename from app/components/progress/Progress/Stepper/Stepper.container.tsx rename to app/components/progress/Stepper/Stepper.container.tsx diff --git a/app/components/progress/Progress/Stepper/Stepper.types.ts b/app/components/progress/Stepper/Stepper.types.ts similarity index 100% rename from app/components/progress/Progress/Stepper/Stepper.types.ts rename to app/components/progress/Stepper/Stepper.types.ts diff --git a/app/components/progress/Progress/Stepper/Stepper.view.tsx b/app/components/progress/Stepper/Stepper.view.tsx similarity index 100% rename from app/components/progress/Progress/Stepper/Stepper.view.tsx rename to app/components/progress/Stepper/Stepper.view.tsx diff --git a/app/components/progress/Progress/Stepper/index.tsx b/app/components/progress/Stepper/index.tsx similarity index 100% rename from app/components/progress/Progress/Stepper/index.tsx rename to app/components/progress/Stepper/index.tsx diff --git a/app/components/utility/ModalFooter/ModalFooter.view.tsx b/app/components/utility/ModalFooter/ModalFooter.view.tsx index 311cee2..da0434f 100644 --- a/app/components/utility/ModalFooter/ModalFooter.view.tsx +++ b/app/components/utility/ModalFooter/ModalFooter.view.tsx @@ -2,7 +2,7 @@ import { useTranslation } from "../../../contexts/MessagesContext"; import Button from "../../buttons/Button"; -import Stepper from "../../progress/Progress/Stepper"; +import Stepper from "../../progress/Stepper"; import type { ModalFooterProps } from "./ModalFooter.types"; export function ModalFooterView({ diff --git a/stories/progress/Progress.stories.js b/stories/progress/Progress.stories.js deleted file mode 100644 index 077cf34..0000000 --- a/stories/progress/Progress.stories.js +++ /dev/null @@ -1,110 +0,0 @@ -import Progress from "../../app/components/progress/Progress"; - -export default { - title: "Components/Progress", - component: Progress, - parameters: { - layout: "centered", - docs: { - description: { - component: - "Progress bar component for showing completion percentage. Displays a 3-segment progress bar with support for partial fills.", - }, - }, - }, - argTypes: { - progress: { - control: { type: "select" }, - options: [ - "1-0", - "1-1", - "1-2", - "1-3", - "1-4", - "1-5", - "2-0", - "2-1", - "2-2", - "3-0", - "3-1", - "3-2", - ], - description: "Progress state (format: segments-partial)", - }, - }, - tags: ["autodocs"], -}; - -export const Default = { - args: { - progress: "3-2", - }, - render: (args) => ( -
- -
- ), -}; - -export const AllStates = { - args: {}, - render: (_args) => ( -
-
-

1-0

- -
-
-

1-1

- -
-
-

1-2

- -
-
-

1-3

- -
-
-

1-4

- -
-
-

1-5

- -
-
-

2-0

- -
-
-

2-1

- -
-
-

2-2

- -
-
-

3-0

- -
-
-

3-1

- -
-
-

3-2

- -
-
- ), - parameters: { - docs: { - description: { - story: "Different progress states of the progress bar component.", - }, - }, - }, -}; diff --git a/stories/progress/ProportionBar.stories.js b/stories/progress/ProportionBar.stories.js new file mode 100644 index 0000000..e1e0ff7 --- /dev/null +++ b/stories/progress/ProportionBar.stories.js @@ -0,0 +1,74 @@ +import ProportionBar from "../../app/components/progress/ProportionBar"; + +export default { + title: "Components/Progress/ProportionBar", + component: ProportionBar, + parameters: { + layout: "centered", + docs: { + description: { + component: + "Proportion bar component for showing completion percentage. Displays a 3-segment proportion bar with support for partial fills.", + }, + }, + }, + argTypes: { + progress: { + control: { type: "select" }, + options: [ + "1-0", + "1-1", + "1-2", + "1-3", + "1-4", + "1-5", + "2-0", + "2-1", + "2-2", + "3-0", + "3-1", + "3-2", + ], + description: "Proportion state (format: segments-partial)", + }, + }, + tags: ["autodocs"], +}; + +export const Default = { + args: { + progress: "3-2", + }, + render: (args) => ( +
+ +
+ ), +}; + +export const AllStates = { + args: {}, + render: (_args) => ( +
+ + + + + + + + + + + + +
+ ), + parameters: { + docs: { + description: { + story: "Different proportion states of the proportion bar component.", + }, + }, + }, +}; diff --git a/tests/components/Progress.test.tsx b/tests/components/ProportionBar.test.tsx similarity index 70% rename from tests/components/Progress.test.tsx rename to tests/components/ProportionBar.test.tsx index f480741..a3f40aa 100644 --- a/tests/components/Progress.test.tsx +++ b/tests/components/ProportionBar.test.tsx @@ -2,21 +2,21 @@ import React from "react"; import { describe, it, expect } from "vitest"; import { render, screen } from "@testing-library/react"; import "@testing-library/jest-dom/vitest"; -import Progress from "../../app/components/progress/Progress"; +import ProportionBar from "../../app/components/progress/ProportionBar"; import { componentTestSuite, ComponentTestSuiteConfig, } from "../utils/componentTestSuite"; -type ProgressProps = React.ComponentProps; +type ProportionBarProps = React.ComponentProps; -const baseProps: ProgressProps = { +const baseProps: ProportionBarProps = { progress: "2-1", }; -const config: ComponentTestSuiteConfig = { - component: Progress, - name: "Progress", +const config: ComponentTestSuiteConfig = { + component: ProportionBar, + name: "ProportionBar", props: baseProps, requiredProps: [], optionalProps: { @@ -27,17 +27,17 @@ const config: ComponentTestSuiteConfig = { testCases: { renders: true, accessibility: true, - keyboardNavigation: false, // Progress is not keyboard navigable - disabledState: false, // Progress doesn't have disabled state + keyboardNavigation: false, // ProportionBar is not keyboard navigable + disabledState: false, // ProportionBar doesn't have disabled state errorState: false, }, }; -componentTestSuite(config); +componentTestSuite(config); -describe("Progress (behavioral tests)", () => { - it("renders progress bar with correct progress value", () => { - render(); +describe("ProportionBar (behavioral tests)", () => { + it("renders proportion bar with correct progress value", () => { + render(); const progressbar = screen.getByRole("progressbar"); // 2-1: First section full (1) + second section 1/3 filled = 1 + 1/3 ≈ 1.333 expect(progressbar).toHaveAttribute("aria-valuenow", "1.3333333333333333"); @@ -46,18 +46,18 @@ describe("Progress (behavioral tests)", () => { }); it("applies custom className", () => { - const { container } = render(); + const { container } = render(); expect(container.firstChild).toHaveClass("custom-class"); }); it("defaults to progress 3-2 when progress is not specified", () => { - render(); + render(); const progressbar = screen.getByRole("progressbar"); // 3-2: First two sections full (2) + third section 2/3 filled = 2 + 2/3 ≈ 2.667 expect(progressbar).toHaveAttribute("aria-valuenow", "2.6666666666666665"); }); - it("handles all progress states correctly", () => { + it("handles all proportion states correctly", () => { const testCases = [ { progress: "1-0" as const, expected: 1 / 6 }, // First section 1/6 filled { progress: "1-5" as const, expected: 1 }, // First section 6/6 filled (fully filled) @@ -68,7 +68,7 @@ describe("Progress (behavioral tests)", () => { ]; testCases.forEach(({ progress, expected }) => { - const { unmount } = render(); + const { unmount } = render(); const progressbar = screen.getByRole("progressbar"); expect(progressbar).toHaveAttribute("aria-valuenow", String(expected)); unmount(); diff --git a/tests/components/Stepper.test.tsx b/tests/components/Stepper.test.tsx index 0a21daf..fe0edd9 100644 --- a/tests/components/Stepper.test.tsx +++ b/tests/components/Stepper.test.tsx @@ -2,7 +2,7 @@ import React from "react"; import { describe, it, expect } from "vitest"; import { render, screen } from "@testing-library/react"; import "@testing-library/jest-dom/vitest"; -import Stepper from "../../app/components/progress/Progress/Stepper"; +import Stepper from "../../app/components/progress/Stepper"; import { componentTestSuite, ComponentTestSuiteConfig,