@pylerai/design-system 2.0.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +56 -8
- package/dist/components/ui/badge.js +6 -6
- package/dist/components/ui/button.js +9 -9
- package/dist/components/ui/chip.js +4 -4
- package/dist/components/ui/dropdown.js +47 -47
- package/dist/components/ui/input.js +14 -14
- package/dist/components/ui/loading-bar.js +26 -26
- package/dist/components/ui/pagination.js +11 -11
- package/dist/components/ui/search-field.js +10 -10
- package/dist/components/ui/tabs.js +2 -2
- package/dist/components/ui/tips.js +11 -11
- package/dist/components/ui/toast.js +17 -17
- package/dist/fonts/PretendardJPVariable.subset.0.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.1.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.10.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.100.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.101.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.102.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.103.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.104.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.105.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.106.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.107.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.108.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.109.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.11.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.110.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.111.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.112.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.113.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.114.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.115.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.116.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.117.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.118.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.12.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.13.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.14.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.15.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.16.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.17.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.18.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.19.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.2.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.20.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.21.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.22.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.23.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.24.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.25.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.26.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.27.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.28.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.29.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.3.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.30.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.31.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.32.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.33.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.34.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.35.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.36.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.37.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.38.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.39.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.4.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.40.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.41.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.42.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.43.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.44.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.45.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.46.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.47.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.48.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.49.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.5.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.50.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.51.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.52.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.53.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.54.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.55.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.56.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.57.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.58.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.59.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.6.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.60.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.61.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.62.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.63.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.64.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.65.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.66.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.67.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.68.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.69.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.7.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.70.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.71.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.72.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.73.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.74.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.75.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.76.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.77.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.78.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.79.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.8.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.80.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.81.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.82.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.83.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.84.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.85.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.86.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.87.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.88.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.89.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.9.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.90.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.91.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.92.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.93.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.94.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.95.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.96.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.97.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.98.woff2 +0 -0
- package/dist/fonts/PretendardJPVariable.subset.99.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.0.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.1.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.10.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.11.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.12.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.13.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.14.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.15.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.16.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.17.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.18.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.19.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.2.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.20.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.21.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.22.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.23.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.24.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.25.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.26.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.27.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.28.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.29.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.3.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.30.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.31.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.32.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.33.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.34.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.35.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.36.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.37.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.38.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.39.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.4.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.40.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.41.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.42.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.43.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.44.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.45.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.46.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.47.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.48.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.49.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.5.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.50.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.51.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.52.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.53.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.54.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.55.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.56.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.57.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.58.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.59.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.6.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.60.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.61.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.62.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.63.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.64.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.65.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.66.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.67.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.68.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.69.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.7.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.70.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.71.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.72.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.73.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.74.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.75.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.76.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.77.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.78.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.79.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.8.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.80.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.81.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.82.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.83.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.84.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.85.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.86.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.87.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.88.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.89.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.9.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.90.woff2 +0 -0
- package/dist/fonts/PretendardVariable.subset.91.woff2 +0 -0
- package/dist/fonts.css +2018 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +66 -63
- package/dist/style.css +1 -1
- package/dist/tokens/shadow-radius.d.ts +26 -0
- package/dist/tokens/shadow-radius.js +20 -0
- package/package.json +13 -7
- package/pyler-shadow-radius.cjs +25 -0
- package/tailwind-preset.cjs +2 -10
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Pyler Inc.
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -12,7 +12,7 @@ Pyler Frontend를 위한 디자인 시스템 패키지 (React + TypeScript + Tai
|
|
|
12
12
|
|
|
13
13
|
- **패키지명**: `@pylerai/design-system` 
|
|
14
14
|
- **레지스트리**: public npm (`registry.npmjs.org`) — 별도 인증 불필요
|
|
15
|
-
- **라이선스**:
|
|
15
|
+
- **라이선스**: MIT ([LICENSE](./LICENSE))
|
|
16
16
|
- **peer 의존성**: React 18 또는 19
|
|
17
17
|
|
|
18
18
|
> [CHANGELOG](./CHANGELOG.md) · [CONTRIBUTING](./CONTRIBUTING.md)
|
|
@@ -43,6 +43,29 @@ CSS 파일에서 `@import` 해도 동일합니다.
|
|
|
43
43
|
|
|
44
44
|
> 구버전 번들러에서 서브패스가 동작하지 않으면 `@pylerai/design-system/dist/style.css`를 사용하세요.
|
|
45
45
|
|
|
46
|
+
#### 폰트
|
|
47
|
+
|
|
48
|
+
`style.css`의 `--ds-font-sans`는 `"Pretendard JP", Pretendard, …` 라는 **이름**만 선언합니다. 그 이름을 실제로 등록하는 `@font-face`는 `fonts.css`에 있으므로 둘을 같이 로드합니다.
|
|
49
|
+
|
|
50
|
+
```typescript
|
|
51
|
+
import "@pylerai/design-system/style.css";
|
|
52
|
+
import "@pylerai/design-system/fonts.css";
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
그리고 앱의 전역 스타일은 폰트 이름을 직접 쓰지 않고 변수만 참조합니다.
|
|
56
|
+
|
|
57
|
+
```css
|
|
58
|
+
body {
|
|
59
|
+
font-family: var(--ds-font-sans);
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
- **앱에서 Pretendard를 따로 로드하지 않습니다** — `next/font`, `public/fonts`, CDN `<link>` 모두 해당. 이름이 한 글자만 어긋나도 스택이 매칭에 실패해 OS 폰트나 세리프로 조용히 떨어집니다(aid-frontend PF-3757). Montserrat 등 앱 고유의 장식 폰트는 이 규칙과 무관합니다.
|
|
64
|
+
- `--ds-font-sans`를 앱에서 덮어쓰지 않습니다. `next/font` 변수로 바꿔 끼우던 방식은 폐기했습니다.
|
|
65
|
+
- 폰트는 npm `pretendard-jp`·`pretendard`의 **가변 다이나믹 서브셋**입니다. `unicode-range`로 쪼개져 화면에 쓰인 글자 범위 조각만 내려받습니다(요청 수는 늘고 총량은 줍니다). JP 서브셋은 한글 range를 선언하지 않아 한글은 2순위 Pretendard가 받으며, 두 폰트의 한글·라틴 아웃라인과 메트릭은 같습니다.
|
|
66
|
+
- `fonts.css`는 `:root { font-feature-settings: "ss05" }`를 함께 켭니다. Pretendard JP의 기본 자형은 일본어 관습(괄호·구두점 위치, 공용 한자)이라 벤더 지침대로 한국어 자형으로 맞추는 것이고, `lang="ja"` 요소는 원래 자형으로 돌아갑니다.
|
|
67
|
+
- 스택 이름과 `fonts.css` 등록 이름이 어긋나면 `npm run check:tokens`가 실패합니다.
|
|
68
|
+
|
|
46
69
|
### 2. Tailwind 연동
|
|
47
70
|
|
|
48
71
|
프리셋을 사용하면 `ds` 컬러 팔레트·타이포그래피 스케일·radius·shadow가 한 번에 합쳐집니다.
|
|
@@ -63,13 +86,21 @@ module.exports = {
|
|
|
63
86
|
};
|
|
64
87
|
```
|
|
65
88
|
|
|
66
|
-
이미 `extend
|
|
89
|
+
이미 자체 `theme.extend`가 있어 프리셋 대신 조각만 합치려면 (`darkMode` 등 프리셋의 다른 설정은 들어오지 않습니다):
|
|
67
90
|
|
|
68
91
|
```javascript
|
|
69
92
|
const { dsColors } = require("@pylerai/design-system/pyler-tailwind-colors");
|
|
93
|
+
const { pylerTypographyThemeExtend } = require("@pylerai/design-system/pyler-typography");
|
|
94
|
+
const { pylerShadowRadiusThemeExtend } = require("@pylerai/design-system/pyler-shadow-radius");
|
|
70
95
|
|
|
71
96
|
module.exports = {
|
|
72
|
-
theme: {
|
|
97
|
+
theme: {
|
|
98
|
+
extend: {
|
|
99
|
+
colors: { ds: dsColors },
|
|
100
|
+
...pylerTypographyThemeExtend, // fontFamily.sans, fontSize.text-*
|
|
101
|
+
...pylerShadowRadiusThemeExtend, // boxShadow.ds-*, borderRadius.ds-*
|
|
102
|
+
},
|
|
103
|
+
},
|
|
73
104
|
};
|
|
74
105
|
```
|
|
75
106
|
|
|
@@ -127,6 +158,7 @@ function App() {
|
|
|
127
158
|
Figma Light 모드와 동일한 값을 **CSS 변수(`--ds-*`)**, **Tailwind `ds` 팔레트**, **TypeScript 상수** 세 가지 형태로 제공합니다. 앱 코드에 HEX를 직접 쓰지 말고 토큰을 참조하세요.
|
|
128
159
|
|
|
129
160
|
> 세 형태의 값이 어긋나지 않도록 `npm run check:tokens`가 CI에서 정합성을 검사합니다.
|
|
161
|
+
> 토큰 값을 바꾸는 기여자용 절차는 [CONTRIBUTING의 "토큰 변경 절차"](./CONTRIBUTING.md#토큰-변경-절차-컬러--타이포그래피)를 참고하세요.
|
|
130
162
|
|
|
131
163
|
### 컬러
|
|
132
164
|
|
|
@@ -176,7 +208,7 @@ flatPylerLightTokens.forEach(({ path, hex, cssVar }) => { /* 문서화·순회
|
|
|
176
208
|
| Body 4 R | 12px | 400 | `text-body-4-r` | `.ds-type-body-4-r` |
|
|
177
209
|
| Label 1 R | 11px | 400 | `text-label-1-r` | `.ds-type-label-1-r` |
|
|
178
210
|
|
|
179
|
-
폰트는 Pretendard JP(`--ds-font-sans`)를 사용합니다.
|
|
211
|
+
폰트는 Pretendard JP(`--ds-font-sans`)를 사용합니다. `@pylerai/design-system/fonts.css`를 함께 로드하면 등록됩니다(위 "폰트" 절 참고).
|
|
180
212
|
|
|
181
213
|
컴포넌트로 쓸 수도 있습니다. `as`로 태그를, `asChild`로 자식 요소에 스타일만 입힐 수 있습니다.
|
|
182
214
|
|
|
@@ -205,6 +237,23 @@ import { PYLER_TYPOGRAPHY_STYLE } from "@pylerai/design-system";
|
|
|
205
237
|
// shadow: ds-default, ds-modal
|
|
206
238
|
```
|
|
207
239
|
|
|
240
|
+
Tailwind 클래스를 쓸 수 없는 자리(Chakra `radii`/`shadows` foundation, `sx`, inline style)에는 `DS_RADIUS`·`DS_SHADOW`를 넘깁니다. 값은 `var(--ds-*)` 문자열이라 `style.css`가 로드돼 있어야 합니다.
|
|
241
|
+
|
|
242
|
+
```tsx
|
|
243
|
+
import { DS_RADIUS, DS_SHADOW } from "@pylerai/design-system";
|
|
244
|
+
|
|
245
|
+
// Chakra: theme foundation 에 등록하면 borderRadius="ds-md" 처럼 토큰 이름으로 쓸 수 있습니다
|
|
246
|
+
extendTheme({
|
|
247
|
+
radii: { "ds-xs": DS_RADIUS.xs, "ds-ss": DS_RADIUS.ss, "ds-md": DS_RADIUS.md, "ds-lg": DS_RADIUS.lg },
|
|
248
|
+
shadows: { "ds-default": DS_SHADOW.default, "ds-modal": DS_SHADOW.modal },
|
|
249
|
+
});
|
|
250
|
+
|
|
251
|
+
<Box borderRadius="ds-md" boxShadow="ds-default" />
|
|
252
|
+
<div style={{ borderRadius: DS_RADIUS.md }} />
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
앱에서 `rounded-[8px]`·`shadow-[0px_5px_16px_…]` 같은 리터럴을 새로 쓰지 않습니다. 값이 같아도 토큰이 바뀌면 리터럴만 남아 드리프트합니다.
|
|
256
|
+
|
|
208
257
|
Dim은 `var(--ds-dim-default)`로 제공됩니다. Storybook **Foundation → Radius / Shadow / Dim** 참고.
|
|
209
258
|
|
|
210
259
|
## ♿ 접근성
|
|
@@ -234,7 +283,8 @@ design-system/
|
|
|
234
283
|
├── .storybook/ # Storybook 설정 (main/preview/vitest.setup)
|
|
235
284
|
├── .github/workflows/
|
|
236
285
|
│ ├── pr-checks.yml # PR 검증 (tokens → lint → tsc → test → build)
|
|
237
|
-
│
|
|
286
|
+
│ ├── deploy-github-pages.yml # Storybook 배포
|
|
287
|
+
│ └── release-package.yml # GitHub Release 생성 시 npm 자동 배포
|
|
238
288
|
├── scripts/
|
|
239
289
|
│ └── check-tokens.cjs # 토큰 정합성 검사
|
|
240
290
|
├── src/
|
|
@@ -270,9 +320,7 @@ npm run build
|
|
|
270
320
|
|
|
271
321
|
## 📤 배포
|
|
272
322
|
|
|
273
|
-
`main`은 브랜치 보호로 직접 push할 수 없습니다. 버전 릴리스 절차(버전 범프 → CHANGELOG → 태그 →
|
|
274
|
-
|
|
275
|
-
> ⚠️ `.github/workflows/release-package.yml`은 GitHub Release 생성 시 GitHub Packages로 배포하도록 되어 있으나, 실제 배포는 public npm으로 수동 실행하는 방식입니다. 한 번도 실행된 적 없는 워크플로이며 정리 대상입니다. 자세한 경위는 [CONTRIBUTING](./CONTRIBUTING.md#알려진-이슈-release-packageyml-워크플로-범위-외) 참고.
|
|
323
|
+
`main`은 브랜치 보호로 직접 push할 수 없습니다. 버전 릴리스 절차(버전 범프 → CHANGELOG → 태그 → GitHub Release 생성 → CI 자동 npm 배포)는 [CONTRIBUTING](./CONTRIBUTING.md)에 정리돼 있습니다.
|
|
276
324
|
|
|
277
325
|
## 🔗 링크
|
|
278
326
|
|
|
@@ -23,21 +23,21 @@ const b = {
|
|
|
23
23
|
md: { padding: "px-2 pt-[5px] pb-[3px]", text: "text-body-3-m" },
|
|
24
24
|
sm: { padding: "px-1 pt-[3px] pb-[1px]", text: "text-label-1-r" }
|
|
25
25
|
}, g = l.forwardRef(
|
|
26
|
-
({ color: r = "normal", size: e = "md", className: t, children: o, ...
|
|
27
|
-
const { border:
|
|
26
|
+
({ color: r = "normal", size: e = "md", className: t, children: o, ...s }, d) => {
|
|
27
|
+
const { border: a, text: n } = b[r], { padding: p, text: m } = c[e];
|
|
28
28
|
return /* @__PURE__ */ x(
|
|
29
29
|
"span",
|
|
30
30
|
{
|
|
31
|
-
ref:
|
|
31
|
+
ref: d,
|
|
32
32
|
className: i(
|
|
33
|
-
"inline-flex items-center justify-center border rounded-
|
|
34
|
-
|
|
33
|
+
"inline-flex items-center justify-center border rounded-ds-ss bg-ds-background-default whitespace-nowrap",
|
|
34
|
+
a,
|
|
35
35
|
p,
|
|
36
36
|
n,
|
|
37
37
|
m,
|
|
38
38
|
t
|
|
39
39
|
),
|
|
40
|
-
...
|
|
40
|
+
...s,
|
|
41
41
|
children: o
|
|
42
42
|
}
|
|
43
43
|
);
|
|
@@ -9,10 +9,10 @@ const v = R(
|
|
|
9
9
|
{
|
|
10
10
|
variants: {
|
|
11
11
|
variant: {
|
|
12
|
-
filled: "rounded-
|
|
13
|
-
outlined: "rounded-
|
|
14
|
-
text: "rounded-
|
|
15
|
-
icon: "rounded-
|
|
12
|
+
filled: "rounded-ds-md",
|
|
13
|
+
outlined: "rounded-ds-md border border-ds-line-normal bg-ds-background-default text-ds-text-strong hover:bg-ds-surface-normal active:bg-ds-surface-strong disabled:bg-ds-surface-normal disabled:text-ds-text-disabled",
|
|
14
|
+
text: "rounded-ds-md bg-transparent text-ds-text-strong disabled:text-ds-text-disabled",
|
|
15
|
+
icon: "rounded-ds-md",
|
|
16
16
|
indicator: "rounded-full inline-block"
|
|
17
17
|
},
|
|
18
18
|
color: {
|
|
@@ -116,12 +116,12 @@ const v = R(
|
|
|
116
116
|
asChild: c = !1,
|
|
117
117
|
shape: u = "square",
|
|
118
118
|
iconStyle: x = "filled",
|
|
119
|
-
leftIcon:
|
|
120
|
-
rightIcon:
|
|
119
|
+
leftIcon: d,
|
|
120
|
+
rightIcon: t,
|
|
121
121
|
children: b,
|
|
122
122
|
...h
|
|
123
123
|
}, y) => {
|
|
124
|
-
const f = c ? B : "button", N = e === "icon" && x === "outlined" ? "bg-ds-background-default border border-ds-line-normal text-ds-text-strong hover:bg-ds-surface-normal active:bg-ds-surface-strong disabled:text-ds-text-disabled" : void 0, l = !!
|
|
124
|
+
const f = c ? B : "button", N = e === "icon" && x === "outlined" ? "bg-ds-background-default border border-ds-line-normal text-ds-text-strong hover:bg-ds-surface-normal active:bg-ds-surface-strong disabled:text-ds-text-disabled" : void 0, l = !!d, p = !!t, z = e !== "icon" && e !== "indicator" && (l || p) ? (() => {
|
|
125
125
|
const n = r ?? "md", o = {
|
|
126
126
|
sm: { leftOnly: "pl-1 pr-2", rightOnly: "pl-2 pr-1", both: "px-1" },
|
|
127
127
|
md: { leftOnly: "pl-2 pr-3", rightOnly: "pl-3 pr-2", both: "px-2" },
|
|
@@ -143,9 +143,9 @@ const v = R(
|
|
|
143
143
|
ref: y,
|
|
144
144
|
...h,
|
|
145
145
|
children: c ? b : /* @__PURE__ */ O(k, { children: [
|
|
146
|
-
|
|
146
|
+
d && /* @__PURE__ */ a("span", { className: "shrink-0", children: d }),
|
|
147
147
|
b,
|
|
148
|
-
|
|
148
|
+
t && /* @__PURE__ */ a("span", { className: "shrink-0", children: t })
|
|
149
149
|
] })
|
|
150
150
|
}
|
|
151
151
|
);
|
|
@@ -4,20 +4,20 @@ import { XIcon as b } from "../../lib/icons.js";
|
|
|
4
4
|
import { cn as n } from "../../lib/utils.js";
|
|
5
5
|
import * as f from "react";
|
|
6
6
|
const h = f.forwardRef(
|
|
7
|
-
({ size: l = "md", selected: i = !1, disabled: e = !1, onRemove: a, onClick: r, children:
|
|
7
|
+
({ size: l = "md", selected: i = !1, disabled: e = !1, onRemove: a, onClick: r, children: d, className: p }, c) => {
|
|
8
8
|
const s = l === "md", t = !!a, u = r ? "button" : "span";
|
|
9
9
|
return /* @__PURE__ */ x(
|
|
10
10
|
"div",
|
|
11
11
|
{
|
|
12
12
|
ref: c,
|
|
13
13
|
className: n(
|
|
14
|
-
"inline-flex items-center border rounded-
|
|
14
|
+
"inline-flex items-center border rounded-ds-ss bg-ds-background-default select-none transition-colors",
|
|
15
15
|
// 좌우 여백은 컨테이너가 아니라 본문(클릭 대상)이 갖는다.
|
|
16
16
|
// 컨테이너에 두면 여백 영역이 클릭되지 않는 죽은 공간이 된다.
|
|
17
17
|
s ? t ? "h-8 pr-1" : "h-8" : t ? "h-[26px] pr-0.5" : "h-[26px]",
|
|
18
18
|
s ? "text-body-3-r" : "text-body-4-r",
|
|
19
19
|
e ? "border-ds-line-normal text-ds-text-disabled cursor-not-allowed" : i ? "border-ds-primary-blue-normal text-ds-text-strong cursor-pointer" : "border-ds-line-normal text-ds-text-strong cursor-pointer hover:border-ds-line-strong",
|
|
20
|
-
|
|
20
|
+
p
|
|
21
21
|
),
|
|
22
22
|
children: [
|
|
23
23
|
/* @__PURE__ */ o(
|
|
@@ -36,7 +36,7 @@ const h = f.forwardRef(
|
|
|
36
36
|
r && !e && "cursor-pointer",
|
|
37
37
|
r && "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ds-primary-blue-normal rounded-[3px]"
|
|
38
38
|
),
|
|
39
|
-
children:
|
|
39
|
+
children: d
|
|
40
40
|
}
|
|
41
41
|
),
|
|
42
42
|
t && /* @__PURE__ */ o(
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
import { jsxs as u, jsx as r } from "react/jsx-runtime";
|
|
3
3
|
import { DropdownArrowIcon as _, SelectCheckIcon as C, CheckboxCheckedIcon as V, CheckboxUncheckedIcon as ee, RadioCheckedIcon as te, RadioUncheckedIcon as re } from "../../lib/icons.js";
|
|
4
4
|
import { cn as m } from "../../lib/utils.js";
|
|
5
|
-
import * as
|
|
5
|
+
import * as l from "react";
|
|
6
6
|
import { Button as q } from "./button.js";
|
|
7
7
|
const k = {
|
|
8
8
|
lg: {
|
|
@@ -20,19 +20,19 @@ const k = {
|
|
|
20
20
|
option: "h-8 pl-3 pr-2",
|
|
21
21
|
text: "text-body-3-r"
|
|
22
22
|
}
|
|
23
|
-
}, se =
|
|
23
|
+
}, se = l.forwardRef(
|
|
24
24
|
({
|
|
25
|
-
type:
|
|
26
|
-
options:
|
|
25
|
+
type: i = "default",
|
|
26
|
+
options: o,
|
|
27
27
|
value: A,
|
|
28
28
|
onValueChange: w,
|
|
29
29
|
values: n,
|
|
30
30
|
onValuesChange: N,
|
|
31
31
|
placeholder: L = "선택해주세요",
|
|
32
|
-
label:
|
|
32
|
+
label: h,
|
|
33
33
|
showLabel: v = !0,
|
|
34
34
|
require: M,
|
|
35
|
-
size:
|
|
35
|
+
size: g = "lg",
|
|
36
36
|
disabled: x,
|
|
37
37
|
readOnly: y,
|
|
38
38
|
error: b,
|
|
@@ -47,58 +47,58 @@ const k = {
|
|
|
47
47
|
className: G,
|
|
48
48
|
"aria-label": J
|
|
49
49
|
}, P) => {
|
|
50
|
-
const [s,
|
|
51
|
-
|
|
50
|
+
const [s, d] = l.useState(!1), [c, D] = l.useState(-1), E = l.useRef(null), U = l.useRef(null), K = l.useRef(null), f = l.useId(), j = (e) => `${f}-option-${e}`;
|
|
51
|
+
l.useEffect(() => {
|
|
52
52
|
const e = (t) => {
|
|
53
|
-
E.current && !E.current.contains(t.target) &&
|
|
53
|
+
E.current && !E.current.contains(t.target) && d(!1);
|
|
54
54
|
};
|
|
55
55
|
return document.addEventListener("mousedown", e), () => document.removeEventListener("mousedown", e);
|
|
56
|
-
}, []),
|
|
56
|
+
}, []), l.useEffect(() => {
|
|
57
57
|
s || D(-1);
|
|
58
|
-
}, [s]),
|
|
58
|
+
}, [s]), l.useEffect(() => {
|
|
59
59
|
var e, t;
|
|
60
60
|
!s || c < 0 || (t = (e = U.current) == null ? void 0 : e.querySelector(`#${CSS.escape(j(c))}`)) == null || t.scrollIntoView({ block: "nearest" });
|
|
61
61
|
}, [s, c]);
|
|
62
|
-
const Q = (e) =>
|
|
63
|
-
x || y ||
|
|
62
|
+
const Q = (e) => i === "checkbox" ? (n == null ? void 0 : n.includes(e)) ?? !1 : e === A, $ = o.find((e) => e.value === A), W = () => i === "checkbox" ? !n || n.length === 0 ? L : o.filter((t) => n.includes(t.value)).map((t) => t.label).join(", ") : $ ? $.label : L, X = () => {
|
|
63
|
+
x || y || d((e) => !e);
|
|
64
64
|
}, T = (e) => {
|
|
65
|
-
if (
|
|
66
|
-
const t = n ?? [],
|
|
67
|
-
N == null || N(
|
|
65
|
+
if (i === "checkbox") {
|
|
66
|
+
const t = n ?? [], a = t.includes(e) ? t.filter((p) => p !== e) : [...t, e];
|
|
67
|
+
N == null || N(a);
|
|
68
68
|
} else
|
|
69
|
-
w == null || w(e),
|
|
70
|
-
}, Y =
|
|
71
|
-
var
|
|
69
|
+
w == null || w(e), d(!1);
|
|
70
|
+
}, Y = i === "checkbox" ? ((n == null ? void 0 : n.length) ?? 0) > 0 : !!$, Z = (e) => {
|
|
71
|
+
var a;
|
|
72
72
|
if (x || y) return;
|
|
73
73
|
const t = (p) => {
|
|
74
|
-
e.preventDefault(), s ||
|
|
74
|
+
e.preventDefault(), s || d(!0), D(p);
|
|
75
75
|
};
|
|
76
76
|
switch (e.key) {
|
|
77
77
|
case "ArrowDown":
|
|
78
|
-
return t(s ? Math.min(c + 1,
|
|
78
|
+
return t(s ? Math.min(c + 1, o.length - 1) : 0);
|
|
79
79
|
case "ArrowUp":
|
|
80
|
-
return t(s ? Math.max(c - 1, 0) :
|
|
80
|
+
return t(s ? Math.max(c - 1, 0) : o.length - 1);
|
|
81
81
|
case "Home":
|
|
82
82
|
return s ? t(0) : void 0;
|
|
83
83
|
case "End":
|
|
84
|
-
return s ? t(
|
|
84
|
+
return s ? t(o.length - 1) : void 0;
|
|
85
85
|
case "Enter":
|
|
86
86
|
case " ":
|
|
87
|
-
e.preventDefault(), s ? c >= 0 && T(
|
|
87
|
+
e.preventDefault(), s ? c >= 0 && T(o[c].value) : d(!0);
|
|
88
88
|
return;
|
|
89
89
|
case "Escape":
|
|
90
|
-
s && (e.preventDefault(),
|
|
90
|
+
s && (e.preventDefault(), d(!1), (a = K.current) == null || a.focus());
|
|
91
91
|
return;
|
|
92
92
|
case "Tab":
|
|
93
|
-
|
|
93
|
+
d(!1);
|
|
94
94
|
return;
|
|
95
95
|
default:
|
|
96
96
|
return;
|
|
97
97
|
}
|
|
98
98
|
};
|
|
99
99
|
return /* @__PURE__ */ u("div", { ref: P, className: m("flex flex-col gap-2", F), children: [
|
|
100
|
-
v &&
|
|
101
|
-
/* @__PURE__ */ r("span", { id: `${f}-label`, className: "text-body-2-r text-ds-text-strong", children:
|
|
100
|
+
v && h && /* @__PURE__ */ u("div", { className: "flex items-start gap-0.5 whitespace-nowrap", children: [
|
|
101
|
+
/* @__PURE__ */ r("span", { id: `${f}-label`, className: "text-body-2-r text-ds-text-strong", children: h }),
|
|
102
102
|
M && /* @__PURE__ */ r("span", { "aria-hidden": "true", className: "text-body-2-r text-ds-primary-red-normal", children: "*" })
|
|
103
103
|
] }),
|
|
104
104
|
/* @__PURE__ */ u("div", { ref: E, className: "relative", children: [
|
|
@@ -112,8 +112,8 @@ const k = {
|
|
|
112
112
|
"aria-haspopup": "listbox",
|
|
113
113
|
"aria-controls": s ? f : void 0,
|
|
114
114
|
"aria-activedescendant": s && c >= 0 ? j(c) : void 0,
|
|
115
|
-
"aria-labelledby": v &&
|
|
116
|
-
"aria-label": v &&
|
|
115
|
+
"aria-labelledby": v && h ? `${f}-label` : void 0,
|
|
116
|
+
"aria-label": v && h ? void 0 : J,
|
|
117
117
|
"aria-invalid": b ? !0 : void 0,
|
|
118
118
|
"aria-describedby": b || I ? `${f}-description` : void 0,
|
|
119
119
|
"aria-required": M || void 0,
|
|
@@ -121,9 +121,9 @@ const k = {
|
|
|
121
121
|
onClick: X,
|
|
122
122
|
onKeyDown: Z,
|
|
123
123
|
className: m(
|
|
124
|
-
"flex items-center w-full rounded-
|
|
124
|
+
"flex items-center w-full rounded-ds-md border transition-colors",
|
|
125
125
|
x ? "bg-ds-surface-strong border-ds-line-normal cursor-not-allowed" : y ? "bg-ds-surface-normal border-ds-line-normal cursor-default" : b ? "bg-ds-background-default border-ds-primary-red-normal hover:bg-ds-surface-normal" : s ? "bg-ds-background-default border-ds-primary-blue-normal" : "bg-ds-background-default border-ds-line-normal hover:bg-ds-surface-normal hover:border-ds-line-strong",
|
|
126
|
-
k[
|
|
126
|
+
k[g].trigger,
|
|
127
127
|
G
|
|
128
128
|
),
|
|
129
129
|
children: [
|
|
@@ -133,7 +133,7 @@ const k = {
|
|
|
133
133
|
{
|
|
134
134
|
className: m(
|
|
135
135
|
"flex-1 min-w-0 text-left truncate font-sans",
|
|
136
|
-
k[
|
|
136
|
+
k[g].text,
|
|
137
137
|
Y ? "text-ds-text-strong" : x ? "text-ds-text-disabled" : "text-ds-text-normal"
|
|
138
138
|
),
|
|
139
139
|
children: W()
|
|
@@ -159,11 +159,11 @@ const k = {
|
|
|
159
159
|
ref: U,
|
|
160
160
|
id: f,
|
|
161
161
|
role: "listbox",
|
|
162
|
-
"aria-multiselectable":
|
|
163
|
-
className: "absolute top-full left-0 z-50 mt-1 min-w-full w-max max-w-sm bg-ds-background-default border border-ds-line-normal rounded-
|
|
162
|
+
"aria-multiselectable": i === "checkbox" ? !0 : void 0,
|
|
163
|
+
className: "absolute top-full left-0 z-50 mt-1 min-w-full w-max max-w-sm bg-ds-background-default border border-ds-line-normal rounded-ds-md p-1 shadow-ds-default",
|
|
164
164
|
children: [
|
|
165
|
-
|
|
166
|
-
const
|
|
165
|
+
o.map((e, t) => {
|
|
166
|
+
const a = Q(e.value), p = t === c;
|
|
167
167
|
return (
|
|
168
168
|
// 키보드 조작은 aria-activedescendant 패턴에 따라 combobox 트리거의
|
|
169
169
|
// onKeyDown이 전담한다(옵션은 포커스를 받지 않는 것이 WAI-ARIA 권고).
|
|
@@ -174,13 +174,13 @@ const k = {
|
|
|
174
174
|
{
|
|
175
175
|
id: j(t),
|
|
176
176
|
role: "option",
|
|
177
|
-
"aria-selected":
|
|
177
|
+
"aria-selected": a,
|
|
178
178
|
onClick: () => T(e.value),
|
|
179
179
|
onMouseEnter: () => D(t),
|
|
180
180
|
className: m(
|
|
181
|
-
"flex items-center rounded-
|
|
182
|
-
k[
|
|
183
|
-
|
|
181
|
+
"flex items-center rounded-ds-md cursor-pointer gap-1.5 transition-colors",
|
|
182
|
+
k[g].option,
|
|
183
|
+
a ? "bg-ds-surface-normal" : "bg-ds-background-default hover:bg-ds-surface-normal",
|
|
184
184
|
// 키보드 이동 위치 표시 (마우스 hover와 구분되도록 링으로)
|
|
185
185
|
p && "ring-1 ring-inset ring-ds-primary-blue-normal"
|
|
186
186
|
),
|
|
@@ -190,15 +190,15 @@ const k = {
|
|
|
190
190
|
{
|
|
191
191
|
className: m(
|
|
192
192
|
"flex-1 min-w-0 truncate font-sans",
|
|
193
|
-
k[
|
|
193
|
+
k[g].text,
|
|
194
194
|
"text-ds-text-strong"
|
|
195
195
|
),
|
|
196
196
|
children: e.label
|
|
197
197
|
}
|
|
198
198
|
),
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
199
|
+
i === "default" && a && /* @__PURE__ */ r("span", { className: "shrink-0 flex items-center justify-center text-ds-text-strong", children: /* @__PURE__ */ r(C, {}) }),
|
|
200
|
+
i === "checkbox" && /* @__PURE__ */ r("span", { className: "shrink-0 flex items-center justify-center", children: a ? /* @__PURE__ */ r(V, {}) : /* @__PURE__ */ r(ee, {}) }),
|
|
201
|
+
i === "radio" && /* @__PURE__ */ r("span", { className: "shrink-0 flex items-center justify-center", children: a ? /* @__PURE__ */ r(te, {}) : /* @__PURE__ */ r(re, {}) })
|
|
202
202
|
]
|
|
203
203
|
},
|
|
204
204
|
e.value
|
|
@@ -213,7 +213,7 @@ const k = {
|
|
|
213
213
|
size: "lg",
|
|
214
214
|
className: "flex-1",
|
|
215
215
|
onClick: () => {
|
|
216
|
-
R == null || R(),
|
|
216
|
+
R == null || R(), d(!1);
|
|
217
217
|
},
|
|
218
218
|
children: B
|
|
219
219
|
}
|
|
@@ -226,7 +226,7 @@ const k = {
|
|
|
226
226
|
size: "lg",
|
|
227
227
|
className: "flex-1",
|
|
228
228
|
onClick: () => {
|
|
229
|
-
S == null || S(),
|
|
229
|
+
S == null || S(), d(!1);
|
|
230
230
|
},
|
|
231
231
|
children: H
|
|
232
232
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use client";
|
|
2
2
|
import { jsxs as i, jsx as e } from "react/jsx-runtime";
|
|
3
3
|
import { EyeOnIcon as E, EyeOffIcon as P } from "../../lib/icons.js";
|
|
4
|
-
import { cn as
|
|
4
|
+
import { cn as d } from "../../lib/utils.js";
|
|
5
5
|
import * as o from "react";
|
|
6
6
|
const I = {
|
|
7
7
|
lg: {
|
|
@@ -18,7 +18,7 @@ const I = {
|
|
|
18
18
|
}
|
|
19
19
|
}, V = o.forwardRef(
|
|
20
20
|
({
|
|
21
|
-
label:
|
|
21
|
+
label: r,
|
|
22
22
|
showLabel: c = !0,
|
|
23
23
|
require: l,
|
|
24
24
|
message: n,
|
|
@@ -44,17 +44,17 @@ const I = {
|
|
|
44
44
|
children: m ? /* @__PURE__ */ e(E, {}) : /* @__PURE__ */ e(P, {})
|
|
45
45
|
}
|
|
46
46
|
) : null);
|
|
47
|
-
return /* @__PURE__ */ i("div", { className:
|
|
48
|
-
c &&
|
|
49
|
-
/* @__PURE__ */ e("label", { htmlFor: y, className: "text-body-2-r text-ds-text-strong", children:
|
|
47
|
+
return /* @__PURE__ */ i("div", { className: d("flex flex-col gap-2", F), children: [
|
|
48
|
+
c && r && /* @__PURE__ */ i("div", { className: "flex items-start gap-0.5 whitespace-nowrap", children: [
|
|
49
|
+
/* @__PURE__ */ e("label", { htmlFor: y, className: "text-body-2-r text-ds-text-strong", children: r }),
|
|
50
50
|
l && /* @__PURE__ */ e("span", { "aria-hidden": "true", className: "text-body-2-r text-ds-primary-red-normal", children: "*" })
|
|
51
51
|
] }),
|
|
52
52
|
n && /* @__PURE__ */ e("p", { id: N, className: "text-body-4-r text-ds-text-strong", children: n }),
|
|
53
53
|
/* @__PURE__ */ i(
|
|
54
54
|
"div",
|
|
55
55
|
{
|
|
56
|
-
className:
|
|
57
|
-
"flex items-center overflow-hidden bg-ds-background-default border rounded-
|
|
56
|
+
className: d(
|
|
57
|
+
"flex items-center overflow-hidden bg-ds-background-default border rounded-ds-md transition-colors",
|
|
58
58
|
t ? "border-ds-primary-red-normal" : "border-ds-line-normal hover:border-ds-line-strong focus-within:border-ds-primary-blue-normal",
|
|
59
59
|
(b || f) && "bg-ds-surface-normal",
|
|
60
60
|
I[a].container
|
|
@@ -69,7 +69,7 @@ const I = {
|
|
|
69
69
|
"aria-invalid": t ? !0 : void 0,
|
|
70
70
|
"aria-describedby": B,
|
|
71
71
|
"aria-required": l || void 0,
|
|
72
|
-
className:
|
|
72
|
+
className: d(
|
|
73
73
|
"flex-1 min-w-0 bg-transparent outline-none font-sans",
|
|
74
74
|
"text-ds-text-strong placeholder:text-ds-text-normal",
|
|
75
75
|
"disabled:text-ds-text-disabled",
|
|
@@ -89,7 +89,7 @@ const I = {
|
|
|
89
89
|
"p",
|
|
90
90
|
{
|
|
91
91
|
id: v,
|
|
92
|
-
className:
|
|
92
|
+
className: d(
|
|
93
93
|
"text-body-4-r",
|
|
94
94
|
t ? "text-ds-primary-red-normal" : "text-ds-text-normal"
|
|
95
95
|
),
|
|
@@ -101,16 +101,16 @@ const I = {
|
|
|
101
101
|
);
|
|
102
102
|
V.displayName = "InputField";
|
|
103
103
|
const $ = o.forwardRef(
|
|
104
|
-
({ label:
|
|
104
|
+
({ label: r, showLabel: c = !0, wrapperClassName: l, className: n, ...s }, t) => {
|
|
105
105
|
const x = o.useId(), a = s.id ?? x;
|
|
106
|
-
return /* @__PURE__ */ i("div", { className:
|
|
107
|
-
c &&
|
|
108
|
-
/* @__PURE__ */ e("div", { className: "overflow-hidden border border-ds-line-normal bg-ds-background-default rounded-
|
|
106
|
+
return /* @__PURE__ */ i("div", { className: d("flex flex-col gap-2", l), children: [
|
|
107
|
+
c && r && /* @__PURE__ */ e("label", { htmlFor: a, className: "text-body-2-r text-ds-text-strong", children: r }),
|
|
108
|
+
/* @__PURE__ */ e("div", { className: "overflow-hidden border border-ds-line-normal bg-ds-background-default rounded-ds-md p-3 hover:border-ds-line-strong focus-within:border-ds-primary-blue-normal transition-colors", children: /* @__PURE__ */ e(
|
|
109
109
|
"textarea",
|
|
110
110
|
{
|
|
111
111
|
ref: t,
|
|
112
112
|
id: a,
|
|
113
|
-
className:
|
|
113
|
+
className: d(
|
|
114
114
|
"w-full min-h-[114px] resize-none bg-transparent outline-none font-sans",
|
|
115
115
|
"text-body-3-r text-ds-text-strong placeholder:text-ds-text-normal",
|
|
116
116
|
"disabled:text-ds-text-disabled",
|