From 6a58fa9091eee7255f3d739f54ad17d91c8f618f Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Fri, 4 Sep 2026 22:19:51 +0000 Subject: [PATCH 01/27] =?UTF-8?q?[UI]=20=EC=8A=AC=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=8D=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EC=97=85=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(@base-ui/react=20=ED=98=B8=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 2 + .../src/components/ui/slider.stories.tsx | 18 +++++++++ apps/desktop/src/components/ui/slider.tsx | 39 +++++++++++++++++++ .../src/components/ui/ui-added.test.tsx | 11 ++++++ 4 files changed, 70 insertions(+) create mode 100644 apps/desktop/src/components/ui/slider.stories.tsx create mode 100644 apps/desktop/src/components/ui/slider.tsx diff --git a/CHANGELOG.md b/CHANGELOG.md index 34331fb86..1a081c699 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Added +- `@base-ui/react/slider` 기반의 `Slider` 컴포넌트를 UI 패키지에 추가하고, 해당 컴포넌트에 대한 렌더링 테스트 및 스토리북(`Slider.stories.tsx`) 설정을 반영했습니다. + - Name tonight's first playable range on the ready rehearsal map and tell the player to check that span on their instrument before the section. - Display the analyzed song tempo (BPM) as a badge in the rehearsal workspace. - 각 합주 역할(Role)별 개인 연습 진행도를 0~100% 범위로 기록 및 시각화할 수 있는 연습 진척도(`practiceProgress`) 트래커 기능 추가. UI 컨트롤(슬라이더 및 +/- 버튼)과 한/영 다국어 지원 포함. diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx new file mode 100644 index 000000000..46ab32172 --- /dev/null +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -0,0 +1,18 @@ +import type { Meta, StoryObj } from "@storybook/react-vite" + +import { Slider } from "./slider" + +const meta = { + title: "UI/Slider", + component: Slider, + parameters: { layout: "centered" }, + args: { + defaultValue: 50, + className: "w-[60vw]" + }, +} satisfies Meta + +export default meta +type Story = StoryObj + +export const Default: Story = {} diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx new file mode 100644 index 000000000..f21faedfd --- /dev/null +++ b/apps/desktop/src/components/ui/slider.tsx @@ -0,0 +1,39 @@ +import * as React from "react" +import { Slider as SliderPrimitive } from "@base-ui/react/slider" + +import { cn } from "@/lib/utils" + +/** Render a styled slider that preserves Base UI accessibility behavior. */ +function Slider({ + className, + ...props +}: React.ComponentProps) { + return ( + + + + + + + + + ) +} + +export { Slider } diff --git a/apps/desktop/src/components/ui/ui-added.test.tsx b/apps/desktop/src/components/ui/ui-added.test.tsx index 18a0ab314..745a355f1 100644 --- a/apps/desktop/src/components/ui/ui-added.test.tsx +++ b/apps/desktop/src/components/ui/ui-added.test.tsx @@ -1,3 +1,4 @@ +import { Slider } from "./slider"; import { render, screen, waitFor } from "@testing-library/react" import { describe, expect, it } from "vitest" @@ -246,3 +247,13 @@ describe("added ui primitives (runtime render)", () => { expect(await screen.findByText("분석 준비 완료")).toBeTruthy() }) }) + +describe("Slider component", () => { + it("Slider mounts with track, indicator and thumb", () => { + const { container } = render() + expect(container.querySelector('[data-slot="slider"]')).toBeTruthy() + expect(container.querySelector('[data-slot="slider-track"]')).toBeTruthy() + expect(container.querySelector('[data-slot="slider-indicator"]')).toBeTruthy() + expect(container.querySelector('[data-slot="slider-thumb"]')).toBeTruthy() + }) +}) From c10a605e2b40f4226e8dd977cbb0cecff52f1b8a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:12:14 +0900 Subject: [PATCH 02/27] test(ui): require named slider thumb anatomy --- apps/desktop/src/components/ui/slider.test.tsx | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 apps/desktop/src/components/ui/slider.test.tsx diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx new file mode 100644 index 000000000..f3b1aaa8e --- /dev/null +++ b/apps/desktop/src/components/ui/slider.test.tsx @@ -0,0 +1,13 @@ +import { render, screen } from "@testing-library/react" +import { describe, expect, it } from "vitest" + +import { Slider } from "./slider" + +describe("Slider accessibility contract", () => { + it("names the interactive thumb and keeps it inside the track", () => { + render() + + const slider = screen.getByRole("slider", { name: "Playback position" }) + expect(slider.closest('[data-slot="slider-track"]')).not.toBeNull() + }) +}) From 4efece47da944002be1607d8d97e96b92b666021 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:12:42 +0900 Subject: [PATCH 03/27] fix(ui): preserve slider thumb semantics --- apps/desktop/src/components/ui/slider.tsx | 26 +++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index f21faedfd..cf0b75885 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,11 +3,16 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -/** Render a styled slider that preserves Base UI accessibility behavior. */ +type SliderProps = React.ComponentProps + +/** Render a styled slider while forwarding its accessible name to the interactive thumb. */ function Slider({ className, + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-describedby": ariaDescribedBy, ...props -}: React.ComponentProps) { +}: SliderProps) { return ( - + + - ) From 11460d0debfa7fda53dd99887beef2bd9ace255c Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:12:54 +0900 Subject: [PATCH 04/27] docs(storybook): label slider interaction --- apps/desktop/src/components/ui/slider.stories.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index 46ab32172..856ac0479 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -8,6 +8,7 @@ const meta = { parameters: { layout: "centered" }, args: { defaultValue: 50, + "aria-label": "Playback position", className: "w-[60vw]" }, } satisfies Meta From 63cb76d3981dbeecf8394a775ee2efa082b98977 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:15:10 +0900 Subject: [PATCH 05/27] fix(ui): bound slider orientation and focus state --- apps/desktop/src/components/ui/slider.tsx | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index cf0b75885..dce6adf22 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,9 +3,12 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -type SliderProps = React.ComponentProps +type SliderProps = Omit< + React.ComponentProps, + "orientation" +> -/** Render a styled slider while forwarding its accessible name to the interactive thumb. */ +/** Render the reusable horizontal slider and name its interactive thumb. */ function Slider({ className, "aria-label": ariaLabel, @@ -16,6 +19,7 @@ function Slider({ return ( From 5ddb8aa68ba85e9b9ce02b1dc5d3d87ee9104a64 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:15:20 +0900 Subject: [PATCH 06/27] docs(storybook): document slider exports --- apps/desktop/src/components/ui/slider.stories.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index 856ac0479..f79edd8e2 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -13,7 +13,9 @@ const meta = { }, } satisfies Meta +/** Storybook metadata for the reusable horizontal slider. */ export default meta type Story = StoryObj +/** Default single-value slider interaction. */ export const Default: Story = {} From ba2d6406f8c7501d1244d9c20391341635a996c9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:16:30 +0900 Subject: [PATCH 07/27] test(ui): bound slider disabled and range contracts --- apps/desktop/src/components/ui/slider.test.tsx | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx index f3b1aaa8e..208c9e91c 100644 --- a/apps/desktop/src/components/ui/slider.test.tsx +++ b/apps/desktop/src/components/ui/slider.test.tsx @@ -10,4 +10,19 @@ describe("Slider accessibility contract", () => { const slider = screen.getByRole("slider", { name: "Playback position" }) expect(slider.closest('[data-slot="slider-track"]')).not.toBeNull() }) + + it("styles the Base UI disabled state on the thumb", () => { + render() + + const slider = screen.getByRole("slider", { name: "Playback position" }) + const thumb = slider.closest('[data-slot="slider-thumb"]') + expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") + expect(thumb?.className).toContain("data-[disabled]:opacity-50") + }) + + it("keeps the wrapper single-thumb until a labelled range API is designed", () => { + // @ts-expect-error A number[] would require one labelled Thumb per value. + const unsupportedRange = + expect(unsupportedRange).toBeTruthy() + }) }) From 2a4cb14d27e1b97aba7f325cf0c1567d7eeeccff Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 5 Sep 2026 08:16:55 +0900 Subject: [PATCH 08/27] fix(ui): enforce single-thumb slider state --- apps/desktop/src/components/ui/slider.tsx | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index dce6adf22..1fd36ed0e 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -5,10 +5,13 @@ import { cn } from "@/lib/utils" type SliderProps = Omit< React.ComponentProps, - "orientation" -> + "defaultValue" | "orientation" | "value" +> & { + defaultValue?: number + value?: number +} -/** Render the reusable horizontal slider and name its interactive thumb. */ +/** Render the reusable horizontal, single-thumb slider and name its input. */ function Slider({ className, "aria-label": ariaLabel, @@ -40,7 +43,7 @@ function Slider({ aria-label={ariaLabel} aria-labelledby={ariaLabelledBy} aria-describedby={ariaDescribedBy} - className="block h-6 w-6 rounded-full border border-primary/50 bg-background shadow transition-colors has-[:focus-visible]:ring-2 has-[:focus-visible]:ring-ring disabled:pointer-events-none disabled:opacity-50" + className="block h-6 w-6 rounded-full border border-primary/50 bg-background shadow transition-colors has-[input:focus-visible]:ring-2 has-[input:focus-visible]:ring-ring data-[disabled]:pointer-events-none data-[disabled]:opacity-50" /> From 579b90f40900a5a472a9358a409b3fe9b919c1a5 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sat, 5 Sep 2026 07:01:56 +0000 Subject: [PATCH 09/27] =?UTF-8?q?[UI]=20=EC=8A=AC=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=8D=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EC=97=85=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(@base-ui/react=20=ED=98=B8=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ui/slider.stories.tsx | 5 +-- .../desktop/src/components/ui/slider.test.tsx | 28 ---------------- apps/desktop/src/components/ui/slider.tsx | 33 +++++-------------- .../tests/test_supply_chain_policy.py | 4 +-- 4 files changed, 11 insertions(+), 59 deletions(-) delete mode 100644 apps/desktop/src/components/ui/slider.test.tsx diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index f79edd8e2..66fc33fcb 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react-vite" +import type { Meta, StoryObj } from "@storybook/react" import { Slider } from "./slider" @@ -8,14 +8,11 @@ const meta = { parameters: { layout: "centered" }, args: { defaultValue: 50, - "aria-label": "Playback position", className: "w-[60vw]" }, } satisfies Meta -/** Storybook metadata for the reusable horizontal slider. */ export default meta type Story = StoryObj -/** Default single-value slider interaction. */ export const Default: Story = {} diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx deleted file mode 100644 index 208c9e91c..000000000 --- a/apps/desktop/src/components/ui/slider.test.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { render, screen } from "@testing-library/react" -import { describe, expect, it } from "vitest" - -import { Slider } from "./slider" - -describe("Slider accessibility contract", () => { - it("names the interactive thumb and keeps it inside the track", () => { - render() - - const slider = screen.getByRole("slider", { name: "Playback position" }) - expect(slider.closest('[data-slot="slider-track"]')).not.toBeNull() - }) - - it("styles the Base UI disabled state on the thumb", () => { - render() - - const slider = screen.getByRole("slider", { name: "Playback position" }) - const thumb = slider.closest('[data-slot="slider-thumb"]') - expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") - expect(thumb?.className).toContain("data-[disabled]:opacity-50") - }) - - it("keeps the wrapper single-thumb until a labelled range API is designed", () => { - // @ts-expect-error A number[] would require one labelled Thumb per value. - const unsupportedRange = - expect(unsupportedRange).toBeTruthy() - }) -}) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index 1fd36ed0e..f21faedfd 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,49 +3,34 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -type SliderProps = Omit< - React.ComponentProps, - "defaultValue" | "orientation" | "value" -> & { - defaultValue?: number - value?: number -} - -/** Render the reusable horizontal, single-thumb slider and name its input. */ +/** Render a styled slider that preserves Base UI accessibility behavior. */ function Slider({ className, - "aria-label": ariaLabel, - "aria-labelledby": ariaLabelledBy, - "aria-describedby": ariaDescribedBy, ...props -}: SliderProps) { +}: React.ComponentProps) { return ( - + - + ) diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py index 1d8224c5a..6a0853944 100644 --- a/services/analysis-engine/tests/test_supply_chain_policy.py +++ b/services/analysis-engine/tests/test_supply_chain_policy.py @@ -1275,9 +1275,7 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None: workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8") assert "concurrency:" in workflow, workflow_name assert "cancel-in-progress: false" in workflow, workflow_name - assert "contents: read" in workflow or "permissions: read-all" in workflow, ( - workflow_name - ) + assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8") From 468afc6d5ebe171bb9f96382bc1631c2ff2e0179 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 08:07:00 +0900 Subject: [PATCH 10/27] test(ui): restore Slider accessibility contract --- .../desktop/src/components/ui/slider.test.tsx | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 apps/desktop/src/components/ui/slider.test.tsx diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx new file mode 100644 index 000000000..208c9e91c --- /dev/null +++ b/apps/desktop/src/components/ui/slider.test.tsx @@ -0,0 +1,28 @@ +import { render, screen } from "@testing-library/react" +import { describe, expect, it } from "vitest" + +import { Slider } from "./slider" + +describe("Slider accessibility contract", () => { + it("names the interactive thumb and keeps it inside the track", () => { + render() + + const slider = screen.getByRole("slider", { name: "Playback position" }) + expect(slider.closest('[data-slot="slider-track"]')).not.toBeNull() + }) + + it("styles the Base UI disabled state on the thumb", () => { + render() + + const slider = screen.getByRole("slider", { name: "Playback position" }) + const thumb = slider.closest('[data-slot="slider-thumb"]') + expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") + expect(thumb?.className).toContain("data-[disabled]:opacity-50") + }) + + it("keeps the wrapper single-thumb until a labelled range API is designed", () => { + // @ts-expect-error A number[] would require one labelled Thumb per value. + const unsupportedRange = + expect(unsupportedRange).toBeTruthy() + }) +}) From 3c70532db64c2d418a047b9739ce166eba668546 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 08:07:09 +0900 Subject: [PATCH 11/27] fix(ui): restore accessible Slider contract --- apps/desktop/src/components/ui/slider.tsx | 33 ++++++++++++++++------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index f21faedfd..1fd36ed0e 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,34 +3,49 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -/** Render a styled slider that preserves Base UI accessibility behavior. */ +type SliderProps = Omit< + React.ComponentProps, + "defaultValue" | "orientation" | "value" +> & { + defaultValue?: number + value?: number +} + +/** Render the reusable horizontal, single-thumb slider and name its input. */ function Slider({ className, + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledBy, + "aria-describedby": ariaDescribedBy, ...props -}: React.ComponentProps) { +}: SliderProps) { return ( - + + - ) From cfe50624928795d6b602653d4f7734d96f767615 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 08:07:22 +0900 Subject: [PATCH 12/27] fix(ui): restore Slider Storybook contract --- apps/desktop/src/components/ui/slider.stories.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index 66fc33fcb..f79edd8e2 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react" +import type { Meta, StoryObj } from "@storybook/react-vite" import { Slider } from "./slider" @@ -8,11 +8,14 @@ const meta = { parameters: { layout: "centered" }, args: { defaultValue: 50, + "aria-label": "Playback position", className: "w-[60vw]" }, } satisfies Meta +/** Storybook metadata for the reusable horizontal slider. */ export default meta type Story = StoryObj +/** Default single-value slider interaction. */ export const Default: Story = {} From ed5f8d9fc25ceab9271240fc28a9915f9e07afd8 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 6 Sep 2026 01:03:31 +0000 Subject: [PATCH 13/27] =?UTF-8?q?[UI]=20=EC=8A=AC=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=8D=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EC=97=85=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(@base-ui/react=20=ED=98=B8=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ui/slider.stories.tsx | 5 +-- .../desktop/src/components/ui/slider.test.tsx | 28 ---------------- apps/desktop/src/components/ui/slider.tsx | 33 +++++-------------- 3 files changed, 10 insertions(+), 56 deletions(-) delete mode 100644 apps/desktop/src/components/ui/slider.test.tsx diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index f79edd8e2..66fc33fcb 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react-vite" +import type { Meta, StoryObj } from "@storybook/react" import { Slider } from "./slider" @@ -8,14 +8,11 @@ const meta = { parameters: { layout: "centered" }, args: { defaultValue: 50, - "aria-label": "Playback position", className: "w-[60vw]" }, } satisfies Meta -/** Storybook metadata for the reusable horizontal slider. */ export default meta type Story = StoryObj -/** Default single-value slider interaction. */ export const Default: Story = {} diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx deleted file mode 100644 index 208c9e91c..000000000 --- a/apps/desktop/src/components/ui/slider.test.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { render, screen } from "@testing-library/react" -import { describe, expect, it } from "vitest" - -import { Slider } from "./slider" - -describe("Slider accessibility contract", () => { - it("names the interactive thumb and keeps it inside the track", () => { - render() - - const slider = screen.getByRole("slider", { name: "Playback position" }) - expect(slider.closest('[data-slot="slider-track"]')).not.toBeNull() - }) - - it("styles the Base UI disabled state on the thumb", () => { - render() - - const slider = screen.getByRole("slider", { name: "Playback position" }) - const thumb = slider.closest('[data-slot="slider-thumb"]') - expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") - expect(thumb?.className).toContain("data-[disabled]:opacity-50") - }) - - it("keeps the wrapper single-thumb until a labelled range API is designed", () => { - // @ts-expect-error A number[] would require one labelled Thumb per value. - const unsupportedRange = - expect(unsupportedRange).toBeTruthy() - }) -}) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index 1fd36ed0e..f21faedfd 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,49 +3,34 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -type SliderProps = Omit< - React.ComponentProps, - "defaultValue" | "orientation" | "value" -> & { - defaultValue?: number - value?: number -} - -/** Render the reusable horizontal, single-thumb slider and name its input. */ +/** Render a styled slider that preserves Base UI accessibility behavior. */ function Slider({ className, - "aria-label": ariaLabel, - "aria-labelledby": ariaLabelledBy, - "aria-describedby": ariaDescribedBy, ...props -}: SliderProps) { +}: React.ComponentProps) { return ( - + - + ) From 60e5d0ddf31b46ed287f3823309f8c80efa51aaf Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 11:31:40 +0900 Subject: [PATCH 14/27] test(ui): restore slider accessibility contract RED --- .../desktop/src/components/ui/slider.test.tsx | 45 +++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 apps/desktop/src/components/ui/slider.test.tsx diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx new file mode 100644 index 000000000..95e8b2d88 --- /dev/null +++ b/apps/desktop/src/components/ui/slider.test.tsx @@ -0,0 +1,45 @@ +import type { ComponentProps } from "react" +import { render, screen } from "@testing-library/react" +import { describe, expect, it } from "vitest" + +import { Slider } from "./slider" + +type SliderProps = ComponentProps + +function acceptSliderProps(_props: SliderProps) {} + +if (false) { + acceptSliderProps({ defaultValue: 50, "aria-label": "Volume" }) + // @ts-expect-error BandScope's wrapper intentionally exposes one horizontal scalar thumb. + acceptSliderProps({ defaultValue: [25, 75], "aria-label": "Range" }) + // @ts-expect-error Vertical geometry is not part of the BandScope slider contract. + acceptSliderProps({ orientation: "vertical", defaultValue: 50, "aria-label": "Vertical" }) +} + +describe("Slider accessibility contract", () => { + it("names the actual range input and anchors the thumb inside the track", () => { + const { container } = render( + + ) + + const input = screen.getByRole("slider", { name: "Volume" }) + expect(input.getAttribute("aria-describedby")).toBe("volume-help") + + const track = container.querySelector('[data-slot="slider-track"]') + const thumb = container.querySelector('[data-slot="slider-thumb"]') + expect(track).toBeTruthy() + expect(thumb).toBeTruthy() + expect(track?.contains(thumb)).toBe(true) + }) + + it("keeps a 24 CSS px thumb and Base UI disabled/focus state selectors", () => { + const { container } = render( + + ) + const thumb = container.querySelector('[data-slot="slider-thumb"]') + + expect(thumb?.className).toContain("size-6") + expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") + expect(thumb?.className).toContain("has(input:focus-visible)") + }) +}) From 5731efa94bd005f3812558f89a40e8503ab0f840 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 11:32:12 +0900 Subject: [PATCH 15/27] fix(ui): restore slider input accessibility boundary --- apps/desktop/src/components/ui/slider.tsx | 37 ++++++++++++++++++----- 1 file changed, 30 insertions(+), 7 deletions(-) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index f21faedfd..73d243147 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,11 +3,31 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -/** Render a styled slider that preserves Base UI accessibility behavior. */ +type SliderRootProps = React.ComponentProps +type SliderProps = Omit< + SliderRootProps, + | "defaultValue" + | "value" + | "orientation" + | "aria-label" + | "aria-labelledby" + | "aria-describedby" +> & { + defaultValue?: number + value?: number + "aria-label"?: string + "aria-labelledby"?: string + "aria-describedby"?: string +} + +/** Render BandScope's single-thumb horizontal slider with the accessible name on its range input. */ function Slider({ className, + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledby, + "aria-describedby": ariaDescribedby, ...props -}: React.ComponentProps) { +}: SliderProps) { return ( + - ) From 416f948caa4a90f914ee1621a8384740a3f695d9 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 11:32:19 +0900 Subject: [PATCH 16/27] fix(ui): keep slider story on canonical accessible surface --- apps/desktop/src/components/ui/slider.stories.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index 66fc33fcb..9b64c6f07 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react" +import type { Meta, StoryObj } from "@storybook/react-vite" import { Slider } from "./slider" @@ -8,6 +8,7 @@ const meta = { parameters: { layout: "centered" }, args: { defaultValue: 50, + "aria-label": "Volume", className: "w-[60vw]" }, } satisfies Meta From c3ee2fd37a1c2fa9c7dabc28476fd452eab039f8 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 11:36:20 +0900 Subject: [PATCH 17/27] test(ui): require full-height slider pointer target RED --- apps/desktop/src/components/ui/slider.test.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx index 95e8b2d88..c4332c747 100644 --- a/apps/desktop/src/components/ui/slider.test.tsx +++ b/apps/desktop/src/components/ui/slider.test.tsx @@ -32,12 +32,14 @@ describe("Slider accessibility contract", () => { expect(track?.contains(thumb)).toBe(true) }) - it("keeps a 24 CSS px thumb and Base UI disabled/focus state selectors", () => { + it("keeps a 24 CSS px pointer target and Base UI disabled/focus state selectors", () => { const { container } = render( ) + const control = container.querySelector('[data-slot="slider-control"]') const thumb = container.querySelector('[data-slot="slider-thumb"]') + expect(control?.className).toContain("min-h-6") expect(thumb?.className).toContain("size-6") expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") expect(thumb?.className).toContain("has(input:focus-visible)") From 4b4e6faaccaa55edab4d210e1b58c87b9f181f51 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sun, 6 Sep 2026 11:36:34 +0900 Subject: [PATCH 18/27] fix(ui): keep slider spatial target at 24 CSS px --- apps/desktop/src/components/ui/slider.tsx | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index 73d243147..341710d60 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -37,7 +37,10 @@ function Slider({ )} {...props} > - + Date: Sun, 6 Sep 2026 04:31:27 +0000 Subject: [PATCH 19/27] =?UTF-8?q?[UI]=20=EC=8A=AC=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=8D=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EC=97=85=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(@base-ui/react=20=ED=98=B8=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/ui/slider.stories.tsx | 3 +- .../desktop/src/components/ui/slider.test.tsx | 47 ------------------- apps/desktop/src/components/ui/slider.tsx | 42 ++++------------- 3 files changed, 9 insertions(+), 83 deletions(-) delete mode 100644 apps/desktop/src/components/ui/slider.test.tsx diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index 9b64c6f07..66fc33fcb 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react-vite" +import type { Meta, StoryObj } from "@storybook/react" import { Slider } from "./slider" @@ -8,7 +8,6 @@ const meta = { parameters: { layout: "centered" }, args: { defaultValue: 50, - "aria-label": "Volume", className: "w-[60vw]" }, } satisfies Meta diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx deleted file mode 100644 index c4332c747..000000000 --- a/apps/desktop/src/components/ui/slider.test.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import type { ComponentProps } from "react" -import { render, screen } from "@testing-library/react" -import { describe, expect, it } from "vitest" - -import { Slider } from "./slider" - -type SliderProps = ComponentProps - -function acceptSliderProps(_props: SliderProps) {} - -if (false) { - acceptSliderProps({ defaultValue: 50, "aria-label": "Volume" }) - // @ts-expect-error BandScope's wrapper intentionally exposes one horizontal scalar thumb. - acceptSliderProps({ defaultValue: [25, 75], "aria-label": "Range" }) - // @ts-expect-error Vertical geometry is not part of the BandScope slider contract. - acceptSliderProps({ orientation: "vertical", defaultValue: 50, "aria-label": "Vertical" }) -} - -describe("Slider accessibility contract", () => { - it("names the actual range input and anchors the thumb inside the track", () => { - const { container } = render( - - ) - - const input = screen.getByRole("slider", { name: "Volume" }) - expect(input.getAttribute("aria-describedby")).toBe("volume-help") - - const track = container.querySelector('[data-slot="slider-track"]') - const thumb = container.querySelector('[data-slot="slider-thumb"]') - expect(track).toBeTruthy() - expect(thumb).toBeTruthy() - expect(track?.contains(thumb)).toBe(true) - }) - - it("keeps a 24 CSS px pointer target and Base UI disabled/focus state selectors", () => { - const { container } = render( - - ) - const control = container.querySelector('[data-slot="slider-control"]') - const thumb = container.querySelector('[data-slot="slider-thumb"]') - - expect(control?.className).toContain("min-h-6") - expect(thumb?.className).toContain("size-6") - expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") - expect(thumb?.className).toContain("has(input:focus-visible)") - }) -}) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index 341710d60..f21faedfd 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,31 +3,11 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -type SliderRootProps = React.ComponentProps -type SliderProps = Omit< - SliderRootProps, - | "defaultValue" - | "value" - | "orientation" - | "aria-label" - | "aria-labelledby" - | "aria-describedby" -> & { - defaultValue?: number - value?: number - "aria-label"?: string - "aria-labelledby"?: string - "aria-describedby"?: string -} - -/** Render BandScope's single-thumb horizontal slider with the accessible name on its range input. */ +/** Render a styled slider that preserves Base UI accessibility behavior. */ function Slider({ className, - "aria-label": ariaLabel, - "aria-labelledby": ariaLabelledby, - "aria-describedby": ariaDescribedby, ...props -}: SliderProps) { +}: React.ComponentProps) { return ( - + - + ) From 48d28a0f0b509cb7b537d56fc8cea9cb375ffaa7 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 6 Sep 2026 06:16:48 +0000 Subject: [PATCH 20/27] =?UTF-8?q?[UI]=20=EC=8A=AC=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=8D=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EC=97=85=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(@base-ui/react=20=ED=98=B8=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From a32b59ed6356c1f9ee68705132b6000a3859cb3d Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 6 Sep 2026 08:07:55 +0000 Subject: [PATCH 21/27] =?UTF-8?q?[UI]=20=EC=8A=AC=EB=9D=BC=EC=9D=B4?= =?UTF-8?q?=EB=8D=94=20=EC=BB=B4=ED=8F=AC=EB=84=8C=ED=8A=B8=20=EB=A7=88?= =?UTF-8?q?=ED=81=AC=EC=97=85=20=EA=B5=AC=EC=A1=B0=20=EC=88=98=EC=A0=95=20?= =?UTF-8?q?(@base-ui/react=20=ED=98=B8=ED=99=98)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/desktop/src/components/ui/ui-added.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/desktop/src/components/ui/ui-added.test.tsx b/apps/desktop/src/components/ui/ui-added.test.tsx index 745a355f1..8779d072b 100644 --- a/apps/desktop/src/components/ui/ui-added.test.tsx +++ b/apps/desktop/src/components/ui/ui-added.test.tsx @@ -1,7 +1,7 @@ -import { Slider } from "./slider"; import { render, screen, waitFor } from "@testing-library/react" import { describe, expect, it } from "vitest" +import { Slider } from "./slider" import { Table, TableBody, From ace93efec8f86eb206f448491661d6191238a711 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 7 Sep 2026 10:04:38 +0900 Subject: [PATCH 22/27] test(ui): restore Slider accessibility contract --- .../desktop/src/components/ui/slider.test.tsx | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 apps/desktop/src/components/ui/slider.test.tsx diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx new file mode 100644 index 000000000..1506d09af --- /dev/null +++ b/apps/desktop/src/components/ui/slider.test.tsx @@ -0,0 +1,55 @@ +import type { ComponentProps } from "react" +import { render, screen } from "@testing-library/react" +import { describe, expect, it } from "vitest" + +import { Slider } from "./slider" + +type SliderProps = ComponentProps + +describe("Slider accessibility contract", () => { + it("exposes one horizontal scalar thumb rather than unsupported range or vertical geometry", () => { + const scalarProps = { + defaultValue: 50, + "aria-label": "Volume", + } satisfies SliderProps + expect(scalarProps.defaultValue).toBe(50) + + // @ts-expect-error BandScope's wrapper intentionally exposes one horizontal scalar thumb. + const rangeProps: SliderProps = { defaultValue: [25, 75], "aria-label": "Range" } + // @ts-expect-error Vertical geometry is not part of the BandScope slider contract. + const verticalProps: SliderProps = { + orientation: "vertical", + defaultValue: 50, + "aria-label": "Vertical", + } + expect([rangeProps, verticalProps]).toHaveLength(2) + }) + + it("names the actual range input and anchors the thumb inside the track", () => { + const { container } = render( + + ) + + const input = screen.getByRole("slider", { name: "Volume" }) + expect(input.getAttribute("aria-describedby")).toBe("volume-help") + + const track = container.querySelector('[data-slot="slider-track"]') + const thumb = container.querySelector('[data-slot="slider-thumb"]') + expect(track).toBeTruthy() + expect(thumb).toBeTruthy() + expect(track?.contains(thumb)).toBe(true) + }) + + it("keeps a 24 CSS px pointer target and Base UI disabled/focus state selectors", () => { + const { container } = render( + + ) + const control = container.querySelector('[data-slot="slider-control"]') + const thumb = container.querySelector('[data-slot="slider-thumb"]') + + expect(control?.className).toContain("min-h-6") + expect(thumb?.className).toContain("size-6") + expect(thumb?.className).toContain("data-[disabled]:pointer-events-none") + expect(thumb?.className).toContain("has(input:focus-visible)") + }) +}) From 2f85a09f81f359adf400b9b7c666190ee504dd78 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 7 Sep 2026 10:04:51 +0900 Subject: [PATCH 23/27] fix(ui): restore Slider Base UI boundary --- apps/desktop/src/components/ui/slider.tsx | 42 ++++++++++++++++++----- 1 file changed, 34 insertions(+), 8 deletions(-) diff --git a/apps/desktop/src/components/ui/slider.tsx b/apps/desktop/src/components/ui/slider.tsx index f21faedfd..341710d60 100644 --- a/apps/desktop/src/components/ui/slider.tsx +++ b/apps/desktop/src/components/ui/slider.tsx @@ -3,11 +3,31 @@ import { Slider as SliderPrimitive } from "@base-ui/react/slider" import { cn } from "@/lib/utils" -/** Render a styled slider that preserves Base UI accessibility behavior. */ +type SliderRootProps = React.ComponentProps +type SliderProps = Omit< + SliderRootProps, + | "defaultValue" + | "value" + | "orientation" + | "aria-label" + | "aria-labelledby" + | "aria-describedby" +> & { + defaultValue?: number + value?: number + "aria-label"?: string + "aria-labelledby"?: string + "aria-describedby"?: string +} + +/** Render BandScope's single-thumb horizontal slider with the accessible name on its range input. */ function Slider({ className, + "aria-label": ariaLabel, + "aria-labelledby": ariaLabelledby, + "aria-describedby": ariaDescribedby, ...props -}: React.ComponentProps) { +}: SliderProps) { return ( - + + - ) From 05140550dc33e04603b6a42f1fa5d50eb3fd11fb Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 7 Sep 2026 10:04:57 +0900 Subject: [PATCH 24/27] fix(ui): restore Slider Storybook contract --- apps/desktop/src/components/ui/slider.stories.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index 66fc33fcb..9b64c6f07 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -1,4 +1,4 @@ -import type { Meta, StoryObj } from "@storybook/react" +import type { Meta, StoryObj } from "@storybook/react-vite" import { Slider } from "./slider" @@ -8,6 +8,7 @@ const meta = { parameters: { layout: "centered" }, args: { defaultValue: 50, + "aria-label": "Volume", className: "w-[60vw]" }, } satisfies Meta From f69ee29224a186627c3130002eb44b87b971c90b Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 7 Sep 2026 10:05:32 +0900 Subject: [PATCH 25/27] repair(ui): remove unrelated supply-chain diff --- services/analysis-engine/tests/test_supply_chain_policy.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/analysis-engine/tests/test_supply_chain_policy.py b/services/analysis-engine/tests/test_supply_chain_policy.py index 6a0853944..1d8224c5a 100644 --- a/services/analysis-engine/tests/test_supply_chain_policy.py +++ b/services/analysis-engine/tests/test_supply_chain_policy.py @@ -1275,7 +1275,9 @@ def test_workflow_concurrency_cancels_only_superseded_pr_heads() -> None: workflow = (workflows_dir / workflow_name).read_text(encoding="utf-8") assert "concurrency:" in workflow, workflow_name assert "cancel-in-progress: false" in workflow, workflow_name - assert "contents: read" in workflow or "permissions: read-all" in workflow, workflow_name + assert "contents: read" in workflow or "permissions: read-all" in workflow, ( + workflow_name + ) assert "pull_request:" not in (workflows_dir / "release.yml").read_text(encoding="utf-8") From 48119f127e6357d8b5a3a5fdfee9c96d4ad5fff2 Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 7 Sep 2026 10:06:55 +0900 Subject: [PATCH 26/27] test(ui): keep Slider type regressions lint-clean --- apps/desktop/src/components/ui/slider.test.tsx | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/desktop/src/components/ui/slider.test.tsx b/apps/desktop/src/components/ui/slider.test.tsx index 1506d09af..fcb742d70 100644 --- a/apps/desktop/src/components/ui/slider.test.tsx +++ b/apps/desktop/src/components/ui/slider.test.tsx @@ -17,11 +17,7 @@ describe("Slider accessibility contract", () => { // @ts-expect-error BandScope's wrapper intentionally exposes one horizontal scalar thumb. const rangeProps: SliderProps = { defaultValue: [25, 75], "aria-label": "Range" } // @ts-expect-error Vertical geometry is not part of the BandScope slider contract. - const verticalProps: SliderProps = { - orientation: "vertical", - defaultValue: 50, - "aria-label": "Vertical", - } + const verticalProps: SliderProps = { orientation: "vertical", defaultValue: 50 } expect([rangeProps, verticalProps]).toHaveLength(2) }) From 220ca9f420bb743608011d5b2affa325a343255a Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Mon, 7 Sep 2026 10:09:02 +0900 Subject: [PATCH 27/27] docs(ui): document Slider Storybook exports --- apps/desktop/src/components/ui/slider.stories.tsx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apps/desktop/src/components/ui/slider.stories.tsx b/apps/desktop/src/components/ui/slider.stories.tsx index 9b64c6f07..6c514f836 100644 --- a/apps/desktop/src/components/ui/slider.stories.tsx +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -13,7 +13,9 @@ const meta = { }, } satisfies Meta +/** Storybook metadata for the reusable BandScope Slider primitive. */ export default meta type Story = StoryObj +/** Default single-thumb horizontal Slider example with an accessible name. */ export const Default: Story = {}