# Progress Circle
URL: /lynx/components/progress-circle
Source: https://github.com/daangn/seed-design/blob/dev/docs/content/lynx/components/progress-circle.mdx
작업이 진행 중임을 알리거나 작업 시간을 시각적으로 나타내는 데 사용됩니다.
Lynx Engine 최소 버전: 3.6
사용 가능 버전: @seed-design/lynx-react@0.1.0, @seed-design/lynx-css@0.1.0
## Preview
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
## Installation
- npm: npx @seed-design/cli add ui:progress-circle
- pnpm: pnpm dlx @seed-design/cli add ui:progress-circle
- yarn: yarn dlx @seed-design/cli add ui:progress-circle
- bun: bun x @seed-design/cli add ui:progress-circle
## Props
`ProgressCircle`은 기본적으로 접근성 요소로 노출되며 `accessibility-role-description="progressbar"`를 전달합니다. `minValue`, `maxValue`, `value`를 모두 지정하면 세 값을 `accessibility-value`로 전달하고, `value`를 생략하면 `indeterminate`를 전달합니다.
스크린 리더가 읽을 문구를 바꾸려면 `accessibility-value`를 직접 지정하세요. 필요한 경우 `accessibility-role-description`과 `accessibility-element`도 같은 방식으로 덮어쓸 수 있습니다.
```tsx
```
## Examples
### Neutral
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
### Brand
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
### Static White
`staticWhite`는 어두운 배경 위에서 사용합니다.
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
### Size=40
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
### Size=24
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
### Determinate
`minValue`, `maxValue`, `value`를 모두 지정하면 정해진 진행률을 표시합니다.
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
### Indeterminate
`value`를 생략하면 완료 시점을 알 수 없는 작업의 진행 상태를 표시합니다.
```tsx
import "./styles";
import { ProgressCircle } from "@/components/ui/progress-circle";
import { useSeedClassName } from "@seed-design/lynx-react";
export default function Example() {
const seedClassName = useSeedClassName({ colorMode: "system" });
return (
);
}
```
## 웹 버전과의 차이
Lynx 버전은 플랫폼 제약으로 인해 웹(`@seed-design/react`) 버전과 내부 구현이 다릅니다. Registry에서 제공하는 단일 `ProgressCircle` API와 공개 variant, 진행률 API는 같습니다.
| | 웹 (React) | Lynx |
| ------------------- | ----------------------------------------------------------------------------------------- | --------------------------------------------------------------------- |
| **Registry API** | 단일 `ProgressCircle` 컴포넌트 | 단일 `ProgressCircle` 컴포넌트 |
| **저수준 package API** | `Root`, `Track`, `Range` 조합 | `Root`, `Range` 조합 |
| **렌더링** | SVG ``과 `stroke-dasharray` | CSS `clip-path` 기반 pie sector |
| **애니메이션** | CSS `@keyframes`와 `animation` | Main thread `requestAnimationFrame`과 `setStyleProperty` |
| **Determinate 전환** | CSS `transition` | Main thread `requestAnimationFrame` 기반 easing 애니메이션 |
| **Track** | `` SVG circle | Root의 CSS `background`와 `clip-path`로 렌더링하며 별도 Track 컴포넌트 없음 |
| **접근성** | `role="progressbar"`와 `aria-valuemin`, `aria-valuemax`, `aria-valuenow`, `aria-valuetext` | `accessibility-role-description="progressbar"`와 `accessibility-value` |
Lynx에서는 `clip-path`가 애니메이션 속성이 아니어서 매 프레임 path 문자열을 만듭니다. Indeterminate 인스턴스를 한 화면에 많이 렌더링하면 성능이 저하될 수 있습니다.