diff --git a/CHANGELOG.md b/CHANGELOG.md index 34331fb86..068feee15 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -76,3 +76,8 @@ - `ChordsFeature` (코드 분석) 화면에서 각 파트(Role)의 `transpositionPlan`(이조/조옮김 계획)을 표시하는 기능을 추가했습니다. - `RangesFeature` (음역대 분석) 화면에서 겹침 경고(Overlap warning) 외에 해당 파트의 채보(Transcription) 가능 노드 수를 요약하여 보여주는 기능을 추가했습니다. - 신규 UI 요소에 대한 단위 테스트를 추가했습니다 (`apps/desktop/src/features/chords/index.test.tsx`, `apps/desktop/src/features/ranges/index.test.tsx`). + +## [0.1.4] - 2026-09-05 +### Added + +- 데스크탑 앱 환경을 위한 재사용 가능한 UI 컴포넌트인 `Slider`를 추가했습니다 (`@base-ui/react` 기반). 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..b48ca8a03 --- /dev/null +++ b/apps/desktop/src/components/ui/slider.stories.tsx @@ -0,0 +1,14 @@ +import type { Meta, StoryObj } from "@storybook/react-vite" +import { Slider } from "./slider" + +const meta = { + title: "UI/Slider", + component: Slider, + parameters: { layout: "padded" }, + args: { defaultValue: [50], className: "w-[60%]" }, +} 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..163050030 --- /dev/null +++ b/apps/desktop/src/components/ui/slider.tsx @@ -0,0 +1,31 @@ +"use client" + +import * as React from "react" +import { Slider as SliderPrimitive } from "@base-ui/react/slider" +import { cn } from "@/lib/utils" + +/** Render a styled slider component. */ +const Slider = React.forwardRef< + React.ElementRef, + React.ComponentPropsWithoutRef +>(({ className, ...props }, ref) => ( + + + + + + + + +)) +Slider.displayName = "Slider" + +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..6506b1772 100644 --- a/apps/desktop/src/components/ui/ui-added.test.tsx +++ b/apps/desktop/src/components/ui/ui-added.test.tsx @@ -54,6 +54,7 @@ import { InPageNavList, } from "./in-page-nav" import { Toaster, toast } from "./sonner" +import { Slider } from "./slider" describe("added ui primitives (runtime render)", () => { it("Table renders header, row and cell", () => { @@ -246,3 +247,11 @@ describe("added ui primitives (runtime render)", () => { expect(await screen.findByText("분석 준비 완료")).toBeTruthy() }) }) + +describe("added ui primitives - slider", () => { + it("Slider renders its control, track, indicator, and thumb", () => { + const { container } = render() + expect(container.querySelector('[data-slot="slider"]')).toBeTruthy() + expect(container.querySelector('[data-slot="slider-thumb"]')).toBeTruthy() + }) +}) 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")