@kood/claude-code 0.2.5 → 0.3.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/dist/index.js +13 -8
- package/package.json +1 -1
- package/templates/.claude/agents/code-reviewer.md +371 -19
- package/templates/.claude/agents/dependency-manager.md +197 -0
- package/templates/.claude/agents/deployment-validator.md +136 -0
- package/templates/.claude/agents/git-operator.md +147 -0
- package/templates/.claude/agents/implementation-executor.md +202 -0
- package/templates/.claude/agents/lint-fixer.md +155 -0
- package/templates/.claude/agents/refactor-advisor.md +339 -29
- package/templates/.claude/commands/agent-creator.md +355 -0
- package/templates/.claude/commands/docs-creator.md +404 -163
- package/templates/.claude/commands/docs-refactor.md +400 -113
- package/templates/.claude/commands/execute.md +357 -185
- package/templates/.claude/commands/git-all.md +16 -70
- package/templates/.claude/commands/git-session.md +36 -68
- package/templates/.claude/commands/git.md +20 -69
- package/templates/.claude/commands/lint-fix.md +164 -107
- package/templates/.claude/commands/lint-init.md +142 -168
- package/templates/.claude/commands/plan.md +300 -84
- package/templates/.claude/commands/prd.md +497 -214
- package/templates/.claude/commands/pre-deploy.md +242 -0
- package/templates/.claude/commands/subagent-creator.md +118 -0
- package/templates/.claude/commands/version-update.md +45 -57
- package/templates/hono/CLAUDE.md +99 -54
- package/templates/hono/docs/guides/conventions.md +352 -0
- package/templates/hono/docs/guides/env-setup.md +347 -0
- package/templates/hono/docs/guides/getting-started.md +239 -0
- package/templates/hono/docs/library/hono/error-handling.md +20 -29
- package/templates/hono/docs/library/hono/index.md +25 -52
- package/templates/hono/docs/library/hono/middleware.md +16 -75
- package/templates/hono/docs/library/hono/rpc.md +7 -35
- package/templates/hono/docs/library/hono/validation.md +25 -45
- package/templates/hono/docs/library/t3-env/index.md +374 -0
- package/templates/npx/CLAUDE.md +165 -65
- package/templates/npx/docs/library/commander/index.md +10 -73
- package/templates/npx/docs/library/fs-extra/index.md +21 -113
- package/templates/npx/docs/library/prompts/index.md +30 -176
- package/templates/npx/docs/references/patterns.md +75 -48
- package/templates/tanstack-start/CLAUDE.md +101 -77
- package/templates/tanstack-start/docs/architecture.md +427 -0
- package/templates/tanstack-start/docs/design.md +558 -0
- package/templates/tanstack-start/docs/guides/conventions.md +132 -32
- package/templates/tanstack-start/docs/guides/env-setup.md +127 -62
- package/templates/tanstack-start/docs/guides/getting-started.md +81 -20
- package/templates/tanstack-start/docs/guides/hooks.md +241 -36
- package/templates/tanstack-start/docs/guides/routes.md +213 -61
- package/templates/tanstack-start/docs/guides/services.md +260 -24
- package/templates/tanstack-start/docs/library/better-auth/index.md +469 -16
- package/templates/tanstack-start/docs/library/t3-env/index.md +307 -0
- package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -21
- package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +22 -35
- package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +7 -24
- package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +26 -39
- package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +23 -26
- package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +32 -147
- package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +25 -167
- package/templates/tanstack-start/docs/library/tanstack-router/index.md +39 -74
- package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +46 -116
- package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +35 -154
- package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +32 -171
- package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +7 -15
- package/templates/tanstack-start/docs/library/tanstack-start/routing.md +16 -23
- package/templates/tanstack-start/docs/library/zod/complex-types.md +12 -31
- package/templates/tanstack-start/docs/library/zod/index.md +18 -35
- package/templates/tanstack-start/docs/library/zod/transforms.md +11 -25
- package/templates/tanstack-start/docs/library/zod/validation.md +12 -34
- package/templates/.claude/agents/debug-detective.md +0 -37
- package/templates/.claude/agents/test-writer.md +0 -41
- package/templates/.claude/commands/feedback.md +0 -199
- package/templates/.claude/commands/ts-fix.md +0 -176
- package/templates/.claude/skills/command-creator/LICENSE.txt +0 -202
- package/templates/.claude/skills/command-creator/SKILL.md +0 -245
- package/templates/.claude/skills/command-creator/scripts/init_command.py +0 -244
- package/templates/.claude/skills/command-creator/scripts/package_command.py +0 -125
- package/templates/.claude/skills/command-creator/scripts/quick_validate.py +0 -143
- package/templates/.claude/skills/frontend-design/SKILL.md +0 -310
- package/templates/.claude/skills/frontend-design/references/animation-patterns.md +0 -446
- package/templates/.claude/skills/frontend-design/references/colors-2026.md +0 -244
- package/templates/.claude/skills/frontend-design/references/typography-2026.md +0 -302
- package/templates/.claude/skills/gemini-review/SKILL.md +0 -118
- package/templates/.claude/skills/gemini-review/references/checklists.md +0 -129
- package/templates/.claude/skills/gemini-review/references/prompt-templates.md +0 -274
- package/templates/.claude/skills/skill-creator/LICENSE.txt +0 -202
- package/templates/.claude/skills/skill-creator/SKILL.md +0 -184
- package/templates/.claude/skills/skill-creator/scripts/init_skill.py +0 -303
- package/templates/.claude/skills/skill-creator/scripts/package_skill.py +0 -110
- package/templates/.claude/skills/skill-creator/scripts/quick_validate.py +0 -65
- package/templates/hono/docs/library/ai-sdk/index.md +0 -190
- package/templates/hono/docs/library/ai-sdk/openrouter.md +0 -111
- package/templates/hono/docs/library/ai-sdk/providers.md +0 -102
- package/templates/hono/docs/library/ai-sdk/streaming.md +0 -146
- package/templates/hono/docs/library/ai-sdk/structured-output.md +0 -161
- package/templates/hono/docs/library/ai-sdk/tools.md +0 -144
- package/templates/hono/docs/library/drizzle/cloudflare-d1.md +0 -247
- package/templates/hono/docs/library/drizzle/config.md +0 -167
- package/templates/hono/docs/library/drizzle/index.md +0 -259
- package/templates/hono/docs/library/hono/env-setup.md +0 -169
- package/templates/hono/docs/library/pino/index.md +0 -146
- package/templates/tanstack-start/docs/architecture/architecture.md +0 -243
- package/templates/tanstack-start/docs/deployment/cloudflare.md +0 -132
- package/templates/tanstack-start/docs/deployment/index.md +0 -163
- package/templates/tanstack-start/docs/deployment/nitro.md +0 -110
- package/templates/tanstack-start/docs/deployment/railway.md +0 -147
- package/templates/tanstack-start/docs/deployment/vercel.md +0 -135
- package/templates/tanstack-start/docs/design/components.md +0 -175
- package/templates/tanstack-start/docs/design/index.md +0 -151
- package/templates/tanstack-start/docs/design/safe-area.md +0 -118
- package/templates/tanstack-start/docs/design/tailwind-setup.md +0 -156
- package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +0 -472
- package/templates/tanstack-start/docs/library/ai-sdk/index.md +0 -264
- package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +0 -371
- package/templates/tanstack-start/docs/library/ai-sdk/providers.md +0 -403
- package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +0 -320
- package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +0 -454
- package/templates/tanstack-start/docs/library/ai-sdk/tools.md +0 -473
- package/templates/tanstack-start/docs/library/better-auth/2fa.md +0 -48
- package/templates/tanstack-start/docs/library/better-auth/advanced.md +0 -55
- package/templates/tanstack-start/docs/library/better-auth/plugins.md +0 -34
- package/templates/tanstack-start/docs/library/better-auth/session.md +0 -47
- package/templates/tanstack-start/docs/library/better-auth/setup.md +0 -41
- package/templates/tanstack-start/docs/library/drizzle/cloudflare-d1.md +0 -147
- package/templates/tanstack-start/docs/library/drizzle/config.md +0 -118
- package/templates/tanstack-start/docs/library/drizzle/crud.md +0 -205
- package/templates/tanstack-start/docs/library/drizzle/index.md +0 -79
- package/templates/tanstack-start/docs/library/drizzle/relations.md +0 -202
- package/templates/tanstack-start/docs/library/drizzle/schema.md +0 -154
- package/templates/tanstack-start/docs/library/drizzle/setup.md +0 -96
- package/templates/tanstack-start/docs/library/drizzle/transactions.md +0 -127
- package/templates/tanstack-start/docs/library/pino/index.md +0 -320
- /package/templates/hono/docs/{architecture/architecture.md → architecture.md} +0 -0
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
# 컴포넌트 가이드라인
|
|
2
|
-
|
|
3
|
-
## 버튼 (Button)
|
|
4
|
-
|
|
5
|
-
### 계층
|
|
6
|
-
|
|
7
|
-
| 유형 | 용도 | 스타일 |
|
|
8
|
-
|------|------|--------|
|
|
9
|
-
| Primary | 주된 행동 | `bg-blue-600 text-white` |
|
|
10
|
-
| Secondary | 대안적 행동 | `border border-gray-300` |
|
|
11
|
-
| Tertiary | 덜 중요한 행동 | `text-blue-600` |
|
|
12
|
-
| Destructive | 위험한 행동 | `bg-red-600 text-white` |
|
|
13
|
-
|
|
14
|
-
```tsx
|
|
15
|
-
// Primary
|
|
16
|
-
<button className="px-4 py-2 bg-blue-600 text-white rounded-lg
|
|
17
|
-
hover:bg-blue-700 disabled:bg-gray-300 disabled:cursor-not-allowed">
|
|
18
|
-
저장하기
|
|
19
|
-
</button>
|
|
20
|
-
|
|
21
|
-
// Secondary
|
|
22
|
-
<button className="px-4 py-2 border border-gray-300 rounded-lg hover:bg-gray-50">
|
|
23
|
-
취소
|
|
24
|
-
</button>
|
|
25
|
-
|
|
26
|
-
// 로딩 상태
|
|
27
|
-
<button disabled={isLoading} className="flex items-center gap-2">
|
|
28
|
-
{isLoading && <Spinner className="w-4 h-4 animate-spin" />}
|
|
29
|
-
{isLoading ? '저장 중...' : '저장하기'}
|
|
30
|
-
</button>
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### 크기
|
|
34
|
-
```tsx
|
|
35
|
-
<button className="px-3 py-1.5 text-sm">Small</button>
|
|
36
|
-
<button className="px-4 py-2 text-base">Medium</button>
|
|
37
|
-
<button className="px-6 py-3 text-lg">Large</button>
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## 입력 필드 (Input)
|
|
41
|
-
|
|
42
|
-
```tsx
|
|
43
|
-
<div>
|
|
44
|
-
<label className="block text-sm font-medium text-gray-700 mb-1">이메일</label>
|
|
45
|
-
<input
|
|
46
|
-
type="email"
|
|
47
|
-
className="w-full px-3 py-2 border border-gray-300 rounded-lg
|
|
48
|
-
focus:ring-2 focus:ring-blue-500 focus:border-blue-500
|
|
49
|
-
placeholder:text-gray-400"
|
|
50
|
-
placeholder="example@email.com"
|
|
51
|
-
/>
|
|
52
|
-
<p className="mt-1 text-sm text-gray-500">도움말</p>
|
|
53
|
-
</div>
|
|
54
|
-
|
|
55
|
-
// 에러 상태
|
|
56
|
-
<input className="border border-red-500 focus:ring-red-500" />
|
|
57
|
-
<p className="mt-1 text-sm text-red-600">오류 메시지</p>
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### 아이콘 포함
|
|
61
|
-
```tsx
|
|
62
|
-
<div className="relative">
|
|
63
|
-
<SearchIcon className="absolute left-3 top-1/2 -translate-y-1/2 w-5 h-5 text-gray-400" />
|
|
64
|
-
<input className="pl-10 pr-3 py-2 ..." />
|
|
65
|
-
</div>
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
## 카드 (Card)
|
|
69
|
-
|
|
70
|
-
```tsx
|
|
71
|
-
<div className="bg-white dark:bg-gray-800 rounded-lg border shadow-sm overflow-hidden">
|
|
72
|
-
<div className="px-6 py-4 border-b">
|
|
73
|
-
<h3 className="text-lg font-semibold">제목</h3>
|
|
74
|
-
</div>
|
|
75
|
-
<div className="px-6 py-4">본문</div>
|
|
76
|
-
<div className="px-6 py-4 bg-gray-50">푸터</div>
|
|
77
|
-
</div>
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## 모달 (Modal)
|
|
81
|
-
|
|
82
|
-
```tsx
|
|
83
|
-
<div className="fixed inset-0 bg-black/50 z-50 flex items-center justify-center">
|
|
84
|
-
<div className="bg-white rounded-lg shadow-xl w-full max-w-md mx-4">
|
|
85
|
-
<div className="px-6 py-4 border-b flex items-center justify-between">
|
|
86
|
-
<h2 className="text-lg font-semibold">제목</h2>
|
|
87
|
-
<button><XIcon /></button>
|
|
88
|
-
</div>
|
|
89
|
-
<div className="px-6 py-4">본문</div>
|
|
90
|
-
<div className="px-6 py-4 bg-gray-50 flex justify-end gap-3">
|
|
91
|
-
<button>취소</button>
|
|
92
|
-
<button className="bg-blue-600 text-white">확인</button>
|
|
93
|
-
</div>
|
|
94
|
-
</div>
|
|
95
|
-
</div>
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
### 크기
|
|
99
|
-
```tsx
|
|
100
|
-
max-w-sm // 간단한 확인
|
|
101
|
-
max-w-md // 기본 (폼)
|
|
102
|
-
max-w-lg // 복잡한 내용
|
|
103
|
-
max-w-2xl // 테이블, 대시보드
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
## 알림/토스트 (Alert)
|
|
107
|
-
|
|
108
|
-
```tsx
|
|
109
|
-
// 정보
|
|
110
|
-
<div className="p-4 bg-blue-50 border border-blue-200 rounded-lg flex gap-3">
|
|
111
|
-
<InfoIcon className="w-5 h-5 text-blue-600" />
|
|
112
|
-
<p className="text-blue-800">안내 메시지</p>
|
|
113
|
-
</div>
|
|
114
|
-
|
|
115
|
-
// 성공: bg-green-50, border-green-200, text-green-800
|
|
116
|
-
// 경고: bg-yellow-50, border-yellow-200, text-yellow-800
|
|
117
|
-
// 오류: bg-red-50, border-red-200, text-red-800
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
## 배지 (Badge)
|
|
121
|
-
|
|
122
|
-
```tsx
|
|
123
|
-
<span className="px-2 py-0.5 text-xs font-medium rounded-full bg-green-100 text-green-800">
|
|
124
|
-
활성
|
|
125
|
-
</span>
|
|
126
|
-
|
|
127
|
-
// 숫자 배지
|
|
128
|
-
<div className="relative">
|
|
129
|
-
<BellIcon />
|
|
130
|
-
<span className="absolute -top-1 -right-1 w-5 h-5 bg-red-500 text-white text-xs
|
|
131
|
-
rounded-full flex items-center justify-center">3</span>
|
|
132
|
-
</div>
|
|
133
|
-
```
|
|
134
|
-
|
|
135
|
-
## 테이블 (Table)
|
|
136
|
-
|
|
137
|
-
```tsx
|
|
138
|
-
<table className="w-full">
|
|
139
|
-
<thead className="bg-gray-50">
|
|
140
|
-
<tr>
|
|
141
|
-
<th className="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase">
|
|
142
|
-
이름
|
|
143
|
-
</th>
|
|
144
|
-
</tr>
|
|
145
|
-
</thead>
|
|
146
|
-
<tbody className="divide-y divide-gray-200">
|
|
147
|
-
<tr className="hover:bg-gray-50">
|
|
148
|
-
<td className="px-6 py-4 whitespace-nowrap">홍길동</td>
|
|
149
|
-
</tr>
|
|
150
|
-
</tbody>
|
|
151
|
-
</table>
|
|
152
|
-
```
|
|
153
|
-
|
|
154
|
-
## 조합 원칙
|
|
155
|
-
|
|
156
|
-
```tsx
|
|
157
|
-
// ✅ Primary 하나만
|
|
158
|
-
<div className="flex gap-2">
|
|
159
|
-
<button className="border">취소</button>
|
|
160
|
-
<button className="bg-blue-600 text-white">저장</button>
|
|
161
|
-
</div>
|
|
162
|
-
|
|
163
|
-
// ❌ Primary 여러 개
|
|
164
|
-
<div className="flex gap-2">
|
|
165
|
-
<button className="bg-blue-600">취소</button>
|
|
166
|
-
<button className="bg-green-600">저장</button>
|
|
167
|
-
</div>
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
## 체크리스트
|
|
171
|
-
|
|
172
|
-
- [ ] 버튼 계층 구분 (Primary 화면당 1개)
|
|
173
|
-
- [ ] 입력 필드에 레이블 필수
|
|
174
|
-
- [ ] 에러/로딩 상태 시각적 표시
|
|
175
|
-
- [ ] 포커스 스타일 명확히
|
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
# UI/UX 디자인 가이드
|
|
2
|
-
|
|
3
|
-
> TanStack Start + Tailwind CSS v4
|
|
4
|
-
|
|
5
|
-
@components.md
|
|
6
|
-
@safe-area.md
|
|
7
|
-
@tailwind-setup.md
|
|
8
|
-
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
## 핵심 원칙
|
|
12
|
-
|
|
13
|
-
| 원칙 | 설명 |
|
|
14
|
-
|------|------|
|
|
15
|
-
| **일관성** | 같은 요소는 같은 스타일과 동작 |
|
|
16
|
-
| **계층 구조** | 중요한 것이 먼저 눈에 들어옴 |
|
|
17
|
-
| **단순함** | 색상 3-5개, 폰트 2-3개, 충분한 여백 |
|
|
18
|
-
| **접근성** | 충분한 대비, 읽기 쉬운 크기, 키보드 조작 |
|
|
19
|
-
|
|
20
|
-
---
|
|
21
|
-
|
|
22
|
-
## 색상 (60-30-10 규칙)
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
60% - 배경색 (중립색)
|
|
26
|
-
30% - 보조색 (카드, 섹션)
|
|
27
|
-
10% - 강조색 (버튼, CTA)
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### 의미론적 색상
|
|
31
|
-
|
|
32
|
-
| 색상 | 의미 | Tailwind |
|
|
33
|
-
|------|------|----------|
|
|
34
|
-
| 🟢 Green | 성공 | `text-green-600` |
|
|
35
|
-
| 🔴 Red | 오류 | `text-red-600` |
|
|
36
|
-
| 🟡 Yellow | 경고 | `text-yellow-600` |
|
|
37
|
-
| 🔵 Blue | 정보 | `text-blue-600` |
|
|
38
|
-
|
|
39
|
-
### 다크 모드 매핑
|
|
40
|
-
|
|
41
|
-
```
|
|
42
|
-
라이트 ←→ 다크
|
|
43
|
-
bg-white ←→ bg-gray-900
|
|
44
|
-
bg-gray-50 ←→ bg-gray-800
|
|
45
|
-
text-gray-900 ←→ text-white
|
|
46
|
-
text-gray-600 ←→ text-gray-300
|
|
47
|
-
```
|
|
48
|
-
|
|
49
|
-
---
|
|
50
|
-
|
|
51
|
-
## 폰트
|
|
52
|
-
|
|
53
|
-
| 폰트 | 용도 |
|
|
54
|
-
|------|------|
|
|
55
|
-
| Pretendard | 한글 (권장) |
|
|
56
|
-
| Inter | 영문 |
|
|
57
|
-
| JetBrains Mono | 코드 |
|
|
58
|
-
|
|
59
|
-
### 크기
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
text-4xl 36px h1
|
|
63
|
-
text-2xl 24px h2, h3
|
|
64
|
-
text-base 16px 본문
|
|
65
|
-
text-sm 14px 보조 텍스트
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### Tailwind 설정
|
|
69
|
-
|
|
70
|
-
```css
|
|
71
|
-
@theme {
|
|
72
|
-
--font-sans: "Pretendard", "Inter", system-ui, sans-serif;
|
|
73
|
-
--font-mono: "JetBrains Mono", monospace;
|
|
74
|
-
}
|
|
75
|
-
```
|
|
76
|
-
|
|
77
|
-
---
|
|
78
|
-
|
|
79
|
-
## 간격 (8px 그리드)
|
|
80
|
-
|
|
81
|
-
| 용도 | Tailwind | 크기 |
|
|
82
|
-
|------|----------|------|
|
|
83
|
-
| 아이콘-텍스트 | gap-1 | 4px |
|
|
84
|
-
| 인라인 요소 | gap-2 | 8px |
|
|
85
|
-
| 카드 내부 | p-4 | 16px |
|
|
86
|
-
| 카드 간격 | gap-6 | 24px |
|
|
87
|
-
| 섹션 간격 | py-12 | 48px |
|
|
88
|
-
|
|
89
|
-
### 컨테이너
|
|
90
|
-
|
|
91
|
-
```
|
|
92
|
-
max-w-md 448px 폼
|
|
93
|
-
max-w-lg 512px 모달
|
|
94
|
-
max-w-3xl 768px 블로그
|
|
95
|
-
max-w-7xl 1280px 대시보드
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
---
|
|
99
|
-
|
|
100
|
-
## 접근성 (WCAG AA)
|
|
101
|
-
|
|
102
|
-
### 색상 대비
|
|
103
|
-
|
|
104
|
-
| 기준 | 최소 대비 | 적용 대상 |
|
|
105
|
-
|------|----------|----------|
|
|
106
|
-
| AA | 4.5:1 | 일반 텍스트 |
|
|
107
|
-
| AA (큰 텍스트) | 3:1 | 18px 이상 |
|
|
108
|
-
|
|
109
|
-
```tsx
|
|
110
|
-
// ❌ 색상만으로 구분
|
|
111
|
-
<span className="text-red-600">오류</span>
|
|
112
|
-
|
|
113
|
-
// ✅ 아이콘/텍스트 병행
|
|
114
|
-
<span className="text-red-600 flex items-center gap-1">
|
|
115
|
-
<XCircleIcon className="w-4 h-4" />
|
|
116
|
-
오류가 발생했습니다
|
|
117
|
-
</span>
|
|
118
|
-
```
|
|
119
|
-
|
|
120
|
-
### 키보드
|
|
121
|
-
|
|
122
|
-
```tsx
|
|
123
|
-
// ✅ 명확한 포커스 스타일
|
|
124
|
-
<button className="focus:ring-2 focus:ring-blue-500 focus:ring-offset-2">
|
|
125
|
-
|
|
126
|
-
// ❌ 포커스 제거 금지
|
|
127
|
-
<button className="outline-none focus:outline-none">
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### 폼
|
|
131
|
-
|
|
132
|
-
```tsx
|
|
133
|
-
<label htmlFor="email">이메일</label>
|
|
134
|
-
<input
|
|
135
|
-
id="email"
|
|
136
|
-
required
|
|
137
|
-
aria-invalid={hasError}
|
|
138
|
-
aria-describedby={hasError ? "email-error" : undefined}
|
|
139
|
-
/>
|
|
140
|
-
{hasError && <p id="email-error" role="alert">오류</p>}
|
|
141
|
-
```
|
|
142
|
-
|
|
143
|
-
### 체크리스트
|
|
144
|
-
|
|
145
|
-
- [ ] 모든 이미지에 alt
|
|
146
|
-
- [ ] 폼 요소에 레이블
|
|
147
|
-
- [ ] 키보드 접근 가능
|
|
148
|
-
- [ ] 포커스 표시 유지
|
|
149
|
-
- [ ] 대비 4.5:1 이상
|
|
150
|
-
- [ ] 색상만으로 정보 전달 금지
|
|
151
|
-
- [ ] 터치 영역 44px 이상
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
# iOS Safe Area
|
|
2
|
-
|
|
3
|
-
> **Library**: [tailwindcss-safe-area](https://github.com/mvllow/tailwindcss-safe-area)
|
|
4
|
-
|
|
5
|
-
iOS 노치, 홈 인디케이터, 다이나믹 아일랜드 대응.
|
|
6
|
-
|
|
7
|
-
## 설치
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
yarn add tailwindcss-safe-area
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
```typescript
|
|
14
|
-
// tailwind.config.ts
|
|
15
|
-
import safeArea from 'tailwindcss-safe-area'
|
|
16
|
-
export default { plugins: [safeArea] }
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Viewport 설정 (필수)
|
|
20
|
-
|
|
21
|
-
```typescript
|
|
22
|
-
// src/routes/__root.tsx
|
|
23
|
-
export const Route = createRootRoute({
|
|
24
|
-
head: () => ({
|
|
25
|
-
meta: [{
|
|
26
|
-
name: 'viewport',
|
|
27
|
-
content: 'width=device-width, initial-scale=1, viewport-fit=cover',
|
|
28
|
-
}],
|
|
29
|
-
}),
|
|
30
|
-
})
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## 유틸리티 클래스
|
|
34
|
-
|
|
35
|
-
### Padding
|
|
36
|
-
```tsx
|
|
37
|
-
<div className="p-safe"> {/* 전체 */}
|
|
38
|
-
<header className="pt-safe"> {/* 상단 (노치) */}
|
|
39
|
-
<footer className="pb-safe"> {/* 하단 (홈 인디케이터) */}
|
|
40
|
-
<div className="px-safe py-safe"> {/* X축, Y축 */}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
### Margin
|
|
44
|
-
```tsx
|
|
45
|
-
<div className="m-safe mt-safe mb-safe mx-safe my-safe">
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Height
|
|
49
|
-
```tsx
|
|
50
|
-
<main className="h-screen-safe"> {/* safe area 제외 높이 */}
|
|
51
|
-
<div className="min-h-screen-safe"> {/* 최소 높이 */}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
### Fallback (safe area 없을 때 대체값)
|
|
55
|
-
```tsx
|
|
56
|
-
<div className="p-safe-or-4"> {/* safe area 또는 1rem */}
|
|
57
|
-
<header className="pt-safe-or-2"> {/* 상단 또는 0.5rem */}
|
|
58
|
-
<footer className="pb-safe-or-4"> {/* 하단 또는 1rem */}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
## 레이아웃 패턴
|
|
62
|
-
|
|
63
|
-
### 기본 앱 레이아웃
|
|
64
|
-
```tsx
|
|
65
|
-
<div className="min-h-screen-safe flex flex-col">
|
|
66
|
-
<header className="pt-safe-or-2 px-safe-or-4 bg-white border-b">
|
|
67
|
-
<nav className="h-14 flex items-center">헤더</nav>
|
|
68
|
-
</header>
|
|
69
|
-
<main className="flex-1 px-safe-or-4">{children}</main>
|
|
70
|
-
<footer className="pb-safe-or-2 px-safe-or-4 bg-white border-t">
|
|
71
|
-
<nav className="h-14 flex items-center justify-around">탭바</nav>
|
|
72
|
-
</footer>
|
|
73
|
-
</div>
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
### 고정 하단 버튼
|
|
77
|
-
```tsx
|
|
78
|
-
<div className="fixed bottom-0 left-0 right-0 pb-safe-or-4 px-safe-or-4 bg-white border-t">
|
|
79
|
-
<button className="w-full h-12 bg-primary-600 text-white rounded-lg">
|
|
80
|
-
버튼
|
|
81
|
-
</button>
|
|
82
|
-
</div>
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
### 전체 화면 모달
|
|
86
|
-
```tsx
|
|
87
|
-
<div className="fixed inset-0 bg-white z-50">
|
|
88
|
-
<div className="h-screen-safe flex flex-col p-safe">{children}</div>
|
|
89
|
-
</div>
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
## 높이 문제 해결
|
|
93
|
-
|
|
94
|
-
```tsx
|
|
95
|
-
// 동적 뷰포트 높이 (권장)
|
|
96
|
-
<div className="h-dvh">
|
|
97
|
-
|
|
98
|
-
// 또는
|
|
99
|
-
<div className="h-screen-safe">
|
|
100
|
-
```
|
|
101
|
-
|
|
102
|
-
## 트러블슈팅
|
|
103
|
-
|
|
104
|
-
```tsx
|
|
105
|
-
// ❌ 노치에 가려짐
|
|
106
|
-
<header className="fixed top-0">
|
|
107
|
-
|
|
108
|
-
// ✅ safe area 적용
|
|
109
|
-
<header className="fixed top-0 pt-safe">
|
|
110
|
-
|
|
111
|
-
// ❌ 홈 인디케이터와 겹침
|
|
112
|
-
<button className="fixed bottom-4">
|
|
113
|
-
|
|
114
|
-
// ✅ safe area 적용
|
|
115
|
-
<div className="fixed bottom-0 pb-safe-or-4">
|
|
116
|
-
<button>...</button>
|
|
117
|
-
</div>
|
|
118
|
-
```
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
# Tailwind CSS 설정
|
|
2
|
-
|
|
3
|
-
> Tailwind CSS v4
|
|
4
|
-
|
|
5
|
-
## 설치
|
|
6
|
-
|
|
7
|
-
```bash
|
|
8
|
-
yarn add tailwindcss postcss autoprefixer
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
```css
|
|
12
|
-
/* src/styles/app.css */
|
|
13
|
-
@import "tailwindcss";
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## 디자인 토큰 (@theme)
|
|
17
|
-
|
|
18
|
-
```css
|
|
19
|
-
@import "tailwindcss";
|
|
20
|
-
|
|
21
|
-
@theme {
|
|
22
|
-
/* 색상 */
|
|
23
|
-
--color-primary-500: oklch(0.55 0.2 250);
|
|
24
|
-
--color-primary-600: oklch(0.48 0.22 250);
|
|
25
|
-
--color-primary-700: oklch(0.42 0.2 250);
|
|
26
|
-
|
|
27
|
-
--color-success: oklch(0.55 0.15 145);
|
|
28
|
-
--color-error: oklch(0.55 0.2 25);
|
|
29
|
-
--color-warning: oklch(0.75 0.15 85);
|
|
30
|
-
|
|
31
|
-
/* 폰트 */
|
|
32
|
-
--font-sans: "Pretendard", "Inter", system-ui, sans-serif;
|
|
33
|
-
--font-mono: "JetBrains Mono", monospace;
|
|
34
|
-
|
|
35
|
-
/* 반경 */
|
|
36
|
-
--radius-button: 0.5rem;
|
|
37
|
-
--radius-card: 0.75rem;
|
|
38
|
-
--radius-modal: 1rem;
|
|
39
|
-
|
|
40
|
-
/* 그림자 */
|
|
41
|
-
--shadow-card: 0 1px 3px rgba(0, 0, 0, 0.1);
|
|
42
|
-
--shadow-modal: 0 20px 25px -5px rgba(0, 0, 0, 0.1);
|
|
43
|
-
}
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
## 사용법
|
|
47
|
-
|
|
48
|
-
```tsx
|
|
49
|
-
<button className="bg-primary-600 hover:bg-primary-700">버튼</button>
|
|
50
|
-
<div className="text-success">성공</div>
|
|
51
|
-
<div className="rounded-[--radius-card]">카드</div>
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## 다크 모드
|
|
55
|
-
|
|
56
|
-
```css
|
|
57
|
-
@theme {
|
|
58
|
-
--color-surface: white;
|
|
59
|
-
--color-text-primary: oklch(0.15 0 0);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
@media (prefers-color-scheme: dark) {
|
|
63
|
-
:root {
|
|
64
|
-
--color-surface: oklch(0.15 0 0);
|
|
65
|
-
--color-text-primary: oklch(0.95 0 0);
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
```
|
|
69
|
-
|
|
70
|
-
```tsx
|
|
71
|
-
// Tailwind dark: 접두사
|
|
72
|
-
<div className="bg-white dark:bg-gray-900">
|
|
73
|
-
<h1 className="text-gray-900 dark:text-white">제목</h1>
|
|
74
|
-
</div>
|
|
75
|
-
|
|
76
|
-
// CSS 변수 (자동 대응)
|
|
77
|
-
<div className="bg-[--color-surface] text-[--color-text-primary]">
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## CVA (class-variance-authority)
|
|
81
|
-
|
|
82
|
-
```bash
|
|
83
|
-
yarn add class-variance-authority clsx tailwind-merge
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
```tsx
|
|
87
|
-
// src/lib/utils.ts
|
|
88
|
-
import { clsx, type ClassValue } from 'clsx'
|
|
89
|
-
import { twMerge } from 'tailwind-merge'
|
|
90
|
-
export const cn = (...inputs: ClassValue[]) => twMerge(clsx(inputs))
|
|
91
|
-
|
|
92
|
-
// src/components/ui/button.tsx
|
|
93
|
-
import { cva, type VariantProps } from 'class-variance-authority'
|
|
94
|
-
|
|
95
|
-
const buttonVariants = cva(
|
|
96
|
-
'inline-flex items-center justify-center font-medium transition-colors focus:ring-2 disabled:opacity-50',
|
|
97
|
-
{
|
|
98
|
-
variants: {
|
|
99
|
-
variant: {
|
|
100
|
-
primary: 'bg-primary-600 text-white hover:bg-primary-700',
|
|
101
|
-
secondary: 'border border-gray-300 hover:bg-gray-50',
|
|
102
|
-
destructive: 'bg-red-600 text-white hover:bg-red-700',
|
|
103
|
-
},
|
|
104
|
-
size: {
|
|
105
|
-
sm: 'px-3 py-1.5 text-sm rounded-md',
|
|
106
|
-
md: 'px-4 py-2 text-base rounded-lg',
|
|
107
|
-
lg: 'px-6 py-3 text-lg rounded-lg',
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
defaultVariants: { variant: 'primary', size: 'md' },
|
|
111
|
-
}
|
|
112
|
-
)
|
|
113
|
-
|
|
114
|
-
interface ButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement>,
|
|
115
|
-
VariantProps<typeof buttonVariants> {}
|
|
116
|
-
|
|
117
|
-
export const Button = ({ variant, size, className, ...props }: ButtonProps) => (
|
|
118
|
-
<button className={buttonVariants({ variant, size, className })} {...props} />
|
|
119
|
-
)
|
|
120
|
-
```
|
|
121
|
-
|
|
122
|
-
## 반응형
|
|
123
|
-
|
|
124
|
-
```css
|
|
125
|
-
sm 640px 모바일 가로
|
|
126
|
-
md 768px 태블릿
|
|
127
|
-
lg 1024px 노트북
|
|
128
|
-
xl 1280px 데스크탑
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
```tsx
|
|
132
|
-
<div className="p-4 md:p-6 lg:p-8">
|
|
133
|
-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 md:gap-6">
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
## 플러그인
|
|
137
|
-
|
|
138
|
-
```css
|
|
139
|
-
@import "tailwindcss";
|
|
140
|
-
@plugin "@tailwindcss/forms";
|
|
141
|
-
@plugin "@tailwindcss/typography";
|
|
142
|
-
```
|
|
143
|
-
|
|
144
|
-
```tsx
|
|
145
|
-
<article className="prose dark:prose-invert">
|
|
146
|
-
{/* 마크다운 콘텐츠 */}
|
|
147
|
-
</article>
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
## 체크리스트
|
|
151
|
-
|
|
152
|
-
- [ ] @theme으로 디자인 토큰 정의
|
|
153
|
-
- [ ] 브랜드/의미론적 색상 설정
|
|
154
|
-
- [ ] 폰트 패밀리 설정
|
|
155
|
-
- [ ] 다크 모드 대응
|
|
156
|
-
- [ ] 모바일 퍼스트 반응형
|