@kood/claude-code 0.2.5 → 0.3.1
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 +65 -71
- package/templates/.claude/commands/git-session.md +80 -64
- package/templates/.claude/commands/git.md +68 -72
- package/templates/.claude/commands/lint-fix.md +224 -109
- 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,143 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env python3
|
|
2
|
-
"""
|
|
3
|
-
커맨드 검증 스크립트 - 최소 버전
|
|
4
|
-
"""
|
|
5
|
-
|
|
6
|
-
import sys
|
|
7
|
-
import re
|
|
8
|
-
from pathlib import Path
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def validate_command(command_path):
|
|
12
|
-
"""
|
|
13
|
-
커맨드 파일 기본 검증.
|
|
14
|
-
|
|
15
|
-
Args:
|
|
16
|
-
command_path: .md 커맨드 파일 경로
|
|
17
|
-
|
|
18
|
-
Returns:
|
|
19
|
-
(유효 여부, 메시지) 튜플
|
|
20
|
-
"""
|
|
21
|
-
command_path = Path(command_path)
|
|
22
|
-
|
|
23
|
-
# 파일 존재 확인
|
|
24
|
-
if not command_path.exists():
|
|
25
|
-
return False, f"커맨드 파일을 찾을 수 없음: {command_path}"
|
|
26
|
-
|
|
27
|
-
# 파일 확장자 확인
|
|
28
|
-
if command_path.suffix != '.md':
|
|
29
|
-
return False, "커맨드 파일은 .md 확장자여야 합니다"
|
|
30
|
-
|
|
31
|
-
# 파일명 규칙 확인
|
|
32
|
-
name = command_path.stem
|
|
33
|
-
if not re.match(r'^[a-z0-9-]+$', name):
|
|
34
|
-
return False, f"커맨드 이름 '{name}'은 하이픈-케이스여야 합니다 (소문자, 숫자, 하이픈만 허용)"
|
|
35
|
-
|
|
36
|
-
if name.startswith('-') or name.endswith('-') or '--' in name:
|
|
37
|
-
return False, f"커맨드 이름 '{name}'은 하이픈으로 시작/끝나거나 연속된 하이픈을 포함할 수 없습니다"
|
|
38
|
-
|
|
39
|
-
if len(name) > 40:
|
|
40
|
-
return False, f"커맨드 이름 '{name}'이 40자를 초과합니다"
|
|
41
|
-
|
|
42
|
-
# 내용 읽기
|
|
43
|
-
try:
|
|
44
|
-
content = command_path.read_text()
|
|
45
|
-
except Exception as e:
|
|
46
|
-
return False, f"파일 읽기 오류: {e}"
|
|
47
|
-
|
|
48
|
-
# 빈 파일 확인
|
|
49
|
-
if not content.strip():
|
|
50
|
-
return False, "커맨드 파일이 비어있습니다"
|
|
51
|
-
|
|
52
|
-
# frontmatter가 있으면 검증
|
|
53
|
-
if content.startswith('---'):
|
|
54
|
-
match = re.match(r'^---\n(.*?)\n---', content, re.DOTALL)
|
|
55
|
-
if not match:
|
|
56
|
-
return False, "잘못된 frontmatter 형식 (닫는 --- 누락)"
|
|
57
|
-
|
|
58
|
-
frontmatter = match.group(1)
|
|
59
|
-
|
|
60
|
-
# 허용된 frontmatter 필드 검증
|
|
61
|
-
valid_fields = {'description', 'allowed-tools', 'argument-hint', 'model', 'disable-model-invocation'}
|
|
62
|
-
for line in frontmatter.split('\n'):
|
|
63
|
-
line = line.strip()
|
|
64
|
-
if not line or line.startswith('#'):
|
|
65
|
-
continue
|
|
66
|
-
if ':' in line:
|
|
67
|
-
field = line.split(':')[0].strip()
|
|
68
|
-
if field and field not in valid_fields:
|
|
69
|
-
return False, f"알 수 없는 frontmatter 필드: '{field}'"
|
|
70
|
-
|
|
71
|
-
# description 확인
|
|
72
|
-
desc_match = re.search(r'description:\s*(.+)', frontmatter)
|
|
73
|
-
if desc_match:
|
|
74
|
-
description = desc_match.group(1).strip()
|
|
75
|
-
if '<' in description or '>' in description:
|
|
76
|
-
return False, "description에 꺾쇠괄호(< 또는 >)를 포함할 수 없습니다"
|
|
77
|
-
if '[TODO' in description:
|
|
78
|
-
return False, "description에 TODO 플레이스홀더가 있습니다 - 완성해주세요"
|
|
79
|
-
|
|
80
|
-
# frontmatter 이후 내용 확인
|
|
81
|
-
body = content[match.end():].strip()
|
|
82
|
-
if not body:
|
|
83
|
-
return False, "커맨드에 frontmatter만 있고 지시사항이 없습니다"
|
|
84
|
-
|
|
85
|
-
return True, "커맨드가 유효합니다!"
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
def validate_commands_folder(folder_path):
|
|
89
|
-
"""
|
|
90
|
-
폴더 내 모든 커맨드 파일 검증.
|
|
91
|
-
|
|
92
|
-
Args:
|
|
93
|
-
folder_path: .md 파일이 포함된 폴더 경로
|
|
94
|
-
|
|
95
|
-
Returns:
|
|
96
|
-
(전체 유효 여부, 결과 리스트) 튜플
|
|
97
|
-
"""
|
|
98
|
-
folder_path = Path(folder_path)
|
|
99
|
-
|
|
100
|
-
if not folder_path.exists():
|
|
101
|
-
return False, [("folder", False, f"폴더를 찾을 수 없음: {folder_path}")]
|
|
102
|
-
|
|
103
|
-
if not folder_path.is_dir():
|
|
104
|
-
return False, [("path", False, f"경로가 디렉토리가 아님: {folder_path}")]
|
|
105
|
-
|
|
106
|
-
# 모든 .md 파일 찾기
|
|
107
|
-
md_files = list(folder_path.glob('**/*.md'))
|
|
108
|
-
|
|
109
|
-
if not md_files:
|
|
110
|
-
return False, [("folder", False, "폴더에 .md 파일이 없습니다")]
|
|
111
|
-
|
|
112
|
-
results = []
|
|
113
|
-
all_valid = True
|
|
114
|
-
|
|
115
|
-
for md_file in md_files:
|
|
116
|
-
valid, message = validate_command(md_file)
|
|
117
|
-
results.append((md_file.name, valid, message))
|
|
118
|
-
if not valid:
|
|
119
|
-
all_valid = False
|
|
120
|
-
|
|
121
|
-
return all_valid, results
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
if __name__ == "__main__":
|
|
125
|
-
if len(sys.argv) != 2:
|
|
126
|
-
print("사용법: python quick_validate.py <command.md 또는 commands-폴더>")
|
|
127
|
-
sys.exit(1)
|
|
128
|
-
|
|
129
|
-
path = Path(sys.argv[1])
|
|
130
|
-
|
|
131
|
-
if path.is_file():
|
|
132
|
-
valid, message = validate_command(path)
|
|
133
|
-
print(message)
|
|
134
|
-
sys.exit(0 if valid else 1)
|
|
135
|
-
elif path.is_dir():
|
|
136
|
-
all_valid, results = validate_commands_folder(path)
|
|
137
|
-
for name, valid, message in results:
|
|
138
|
-
status = "✅" if valid else "❌"
|
|
139
|
-
print(f"[{status}] {name}: {message}")
|
|
140
|
-
sys.exit(0 if all_valid else 1)
|
|
141
|
-
else:
|
|
142
|
-
print(f"경로를 찾을 수 없음: {path}")
|
|
143
|
-
sys.exit(1)
|
|
@@ -1,310 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: frontend-design
|
|
3
|
-
description: 프론트엔드 UI 구현 스킬. 컴포넌트, 페이지, 애플리케이션 구축 시 사용. 2026 트렌드 기반 고품질 디자인 생성.
|
|
4
|
-
license: Complete terms in LICENSE.txt
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# Frontend Design Skill
|
|
8
|
-
|
|
9
|
-
프로덕션급 프론트엔드 인터페이스 구현. 독창적이고 기억에 남는 디자인.
|
|
10
|
-
|
|
11
|
-
## 사용 시점
|
|
12
|
-
|
|
13
|
-
| 트리거 | 예시 |
|
|
14
|
-
|--------|------|
|
|
15
|
-
| UI 컴포넌트 요청 | "버튼 컴포넌트 만들어줘" |
|
|
16
|
-
| 페이지 구현 | "랜딩 페이지 만들어줘" |
|
|
17
|
-
| 스타일링 작업 | "다크 테마 적용해줘" |
|
|
18
|
-
| 애니메이션 추가 | "hover 효과 넣어줘" |
|
|
19
|
-
|
|
20
|
-
## 디자인 프로세스
|
|
21
|
-
|
|
22
|
-
### 1단계: 컨텍스트 파악
|
|
23
|
-
|
|
24
|
-
```
|
|
25
|
-
- 목적: 무슨 문제 해결?
|
|
26
|
-
- 대상: 누가 사용?
|
|
27
|
-
- 제약: 프레임워크, 성능, 접근성 요구사항
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
### 2단계: 미적 방향 결정
|
|
31
|
-
|
|
32
|
-
**반드시 하나 선택하고 일관성 유지:**
|
|
33
|
-
|
|
34
|
-
| 방향 | 특징 | 적합한 상황 |
|
|
35
|
-
|------|------|-------------|
|
|
36
|
-
| Liquid Glass | 투명도, 깊이, 유동적 표면 | 모던 앱, 대시보드 |
|
|
37
|
-
| Calm Minimal | 여백, 선명한 타이포, 절제 | 콘텐츠 중심, 포트폴리오 |
|
|
38
|
-
| Bold Maximalist | 큰 타이포, 강렬한 색, 레이어 | 크리에이티브, 브랜드 |
|
|
39
|
-
| Organic Natural | 부드러운 곡선, 어시 톤, 텍스처 | 웰빙, 라이프스타일 |
|
|
40
|
-
| Editorial | 매거진 레이아웃, 그리드 플레이 | 미디어, 블로그 |
|
|
41
|
-
| Retro Futuristic | 네온, 그라디언트, 글리치 | 테크, 게임 |
|
|
42
|
-
|
|
43
|
-
### 3단계: 구현
|
|
44
|
-
|
|
45
|
-
```
|
|
46
|
-
1. CSS 변수로 디자인 토큰 정의
|
|
47
|
-
2. 타이포그래피 시스템 설정
|
|
48
|
-
3. 컬러 팔레트 적용
|
|
49
|
-
4. 레이아웃 구조화
|
|
50
|
-
5. 애니메이션/인터랙션 추가
|
|
51
|
-
6. 접근성 검증
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
## 핵심 규칙
|
|
55
|
-
|
|
56
|
-
### 타이포그래피
|
|
57
|
-
|
|
58
|
-
**DO:**
|
|
59
|
-
```css
|
|
60
|
-
/* Variable fonts 사용 */
|
|
61
|
-
@font-face {
|
|
62
|
-
font-family: 'Display';
|
|
63
|
-
src: url('font.woff2') format('woff2');
|
|
64
|
-
font-weight: 100 900;
|
|
65
|
-
font-display: swap;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
/* 명확한 위계 */
|
|
69
|
-
--font-display: 'Playfair Display', serif; /* 헤드라인 */
|
|
70
|
-
--font-body: 'Source Sans 3', sans-serif; /* 본문 */
|
|
71
|
-
--font-mono: 'JetBrains Mono', monospace; /* 코드 */
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
**DON'T:**
|
|
75
|
-
```css
|
|
76
|
-
/* ❌ 금지 - 일반적인 시스템 폰트 */
|
|
77
|
-
font-family: Arial, Helvetica, sans-serif;
|
|
78
|
-
font-family: -apple-system, BlinkMacSystemFont, sans-serif;
|
|
79
|
-
|
|
80
|
-
/* ❌ 금지 - AI 슬롭 폰트 */
|
|
81
|
-
font-family: 'Inter', sans-serif;
|
|
82
|
-
font-family: 'Roboto', sans-serif;
|
|
83
|
-
font-family: 'Space Grotesk', sans-serif;
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
**추천 폰트 페어링:**
|
|
87
|
-
|
|
88
|
-
| 헤드라인 | 본문 | 무드 |
|
|
89
|
-
|----------|------|------|
|
|
90
|
-
| Playfair Display | Source Sans 3 | 클래식, 에디토리얼 |
|
|
91
|
-
| Clash Display | Satoshi | 모던, 볼드 |
|
|
92
|
-
| Fraunces | Work Sans | 따뜻한, 친근한 |
|
|
93
|
-
| Space Mono | DM Sans | 테크, 미니멀 |
|
|
94
|
-
| Syne | Inter (예외적 허용) | 크리에이티브 |
|
|
95
|
-
|
|
96
|
-
**상세**: [references/typography-2026.md](references/typography-2026.md)
|
|
97
|
-
|
|
98
|
-
### 컬러
|
|
99
|
-
|
|
100
|
-
**DO:**
|
|
101
|
-
```css
|
|
102
|
-
/* OKLCH 컬러 시스템 (2026 표준) */
|
|
103
|
-
:root {
|
|
104
|
-
/* 베이스 - 소프트 뉴트럴 (순백색 X) */
|
|
105
|
-
--bg-primary: oklch(98% 0.005 90); /* 웜 오프화이트 */
|
|
106
|
-
--bg-secondary: oklch(95% 0.01 90); /* 린넨 */
|
|
107
|
-
|
|
108
|
-
/* 텍스트 */
|
|
109
|
-
--text-primary: oklch(20% 0.01 90); /* 소프트 블랙 */
|
|
110
|
-
--text-secondary: oklch(45% 0.02 90); /* 뮤트 그레이 */
|
|
111
|
-
|
|
112
|
-
/* 액센트 - 하나만 강하게 */
|
|
113
|
-
--accent: oklch(65% 0.25 180); /* Transformative Teal */
|
|
114
|
-
--accent-hover: oklch(60% 0.28 180);
|
|
115
|
-
|
|
116
|
-
/* 상태 */
|
|
117
|
-
--success: oklch(70% 0.2 145);
|
|
118
|
-
--error: oklch(65% 0.25 25);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
/* 다크 모드 */
|
|
122
|
-
@media (prefers-color-scheme: dark) {
|
|
123
|
-
:root {
|
|
124
|
-
--bg-primary: oklch(15% 0.01 90);
|
|
125
|
-
--bg-secondary: oklch(20% 0.015 90);
|
|
126
|
-
--text-primary: oklch(90% 0.01 90);
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
```
|
|
130
|
-
|
|
131
|
-
**DON'T:**
|
|
132
|
-
```css
|
|
133
|
-
/* ❌ 금지 - 순백색 배경 */
|
|
134
|
-
background: #ffffff;
|
|
135
|
-
background: white;
|
|
136
|
-
|
|
137
|
-
/* ❌ 금지 - AI 슬롭 퍼플 그라디언트 */
|
|
138
|
-
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
139
|
-
background: linear-gradient(to right, #8b5cf6, #a855f7);
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
**2026 트렌드 컬러:**
|
|
143
|
-
|
|
144
|
-
| 이름 | OKLCH | HEX (참고) | 용도 |
|
|
145
|
-
|------|-------|-----------|------|
|
|
146
|
-
| Cloud Dancer | oklch(97% 0.005 90) | #F5F5F5 | 배경, 여백 |
|
|
147
|
-
| Mocha Mousse | oklch(55% 0.08 55) | #A47764 | 어시, 따뜻함 |
|
|
148
|
-
| Transformative Teal | oklch(65% 0.15 180) | #2D9CCA | 액센트 |
|
|
149
|
-
| Neo Mint | oklch(85% 0.1 160) | #AAF0D1 | 프레시, 테크 |
|
|
150
|
-
| Soft Coral | oklch(75% 0.12 30) | #FFB5A7 | 따뜻한 액센트 |
|
|
151
|
-
|
|
152
|
-
**상세**: [references/colors-2026.md](references/colors-2026.md)
|
|
153
|
-
|
|
154
|
-
### 애니메이션
|
|
155
|
-
|
|
156
|
-
**원칙:**
|
|
157
|
-
1. **목적 있는 움직임만** - 장식적 애니메이션 금지
|
|
158
|
-
2. **300ms 이하** - 트랜지션은 빠르게
|
|
159
|
-
3. **GPU 가속** - transform, opacity만 애니메이트
|
|
160
|
-
4. **접근성** - prefers-reduced-motion 존중
|
|
161
|
-
|
|
162
|
-
**DO:**
|
|
163
|
-
```css
|
|
164
|
-
/* 기본 트랜지션 */
|
|
165
|
-
.button {
|
|
166
|
-
transition: transform 200ms ease-out,
|
|
167
|
-
background-color 150ms ease;
|
|
168
|
-
}
|
|
169
|
-
.button:hover {
|
|
170
|
-
transform: translateY(-2px);
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
/* 스태거 애니메이션 */
|
|
174
|
-
.list-item {
|
|
175
|
-
animation: fadeInUp 400ms ease-out backwards;
|
|
176
|
-
}
|
|
177
|
-
.list-item:nth-child(1) { animation-delay: 0ms; }
|
|
178
|
-
.list-item:nth-child(2) { animation-delay: 50ms; }
|
|
179
|
-
.list-item:nth-child(3) { animation-delay: 100ms; }
|
|
180
|
-
|
|
181
|
-
@keyframes fadeInUp {
|
|
182
|
-
from {
|
|
183
|
-
opacity: 0;
|
|
184
|
-
transform: translateY(20px);
|
|
185
|
-
}
|
|
186
|
-
to {
|
|
187
|
-
opacity: 1;
|
|
188
|
-
transform: translateY(0);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
/* 접근성 */
|
|
193
|
-
@media (prefers-reduced-motion: reduce) {
|
|
194
|
-
*, *::before, *::after {
|
|
195
|
-
animation-duration: 0.01ms !important;
|
|
196
|
-
transition-duration: 0.01ms !important;
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
```
|
|
200
|
-
|
|
201
|
-
**DON'T:**
|
|
202
|
-
```css
|
|
203
|
-
/* ❌ 금지 - 레이아웃 속성 애니메이트 */
|
|
204
|
-
transition: width 300ms, height 300ms, margin 300ms;
|
|
205
|
-
|
|
206
|
-
/* ❌ 금지 - 너무 느린 트랜지션 */
|
|
207
|
-
transition: all 1s ease;
|
|
208
|
-
|
|
209
|
-
/* ❌ 금지 - 무한 회전 (목적 없는 장식) */
|
|
210
|
-
animation: spin 2s infinite linear;
|
|
211
|
-
```
|
|
212
|
-
|
|
213
|
-
**React (Motion 라이브러리):**
|
|
214
|
-
```tsx
|
|
215
|
-
import { motion } from 'motion/react';
|
|
216
|
-
|
|
217
|
-
// 페이지 진입
|
|
218
|
-
<motion.div
|
|
219
|
-
initial={{ opacity: 0, y: 20 }}
|
|
220
|
-
animate={{ opacity: 1, y: 0 }}
|
|
221
|
-
transition={{ duration: 0.3, ease: 'easeOut' }}
|
|
222
|
-
>
|
|
223
|
-
{content}
|
|
224
|
-
</motion.div>
|
|
225
|
-
|
|
226
|
-
// 리스트 스태거
|
|
227
|
-
<motion.ul>
|
|
228
|
-
{items.map((item, i) => (
|
|
229
|
-
<motion.li
|
|
230
|
-
key={item.id}
|
|
231
|
-
initial={{ opacity: 0, x: -20 }}
|
|
232
|
-
animate={{ opacity: 1, x: 0 }}
|
|
233
|
-
transition={{ delay: i * 0.05 }}
|
|
234
|
-
>
|
|
235
|
-
{item.name}
|
|
236
|
-
</motion.li>
|
|
237
|
-
))}
|
|
238
|
-
</motion.ul>
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
**상세**: [references/animation-patterns.md](references/animation-patterns.md)
|
|
242
|
-
|
|
243
|
-
### 레이아웃
|
|
244
|
-
|
|
245
|
-
**DO:**
|
|
246
|
-
```css
|
|
247
|
-
/* 비대칭, 그리드 브레이킹 */
|
|
248
|
-
.hero {
|
|
249
|
-
display: grid;
|
|
250
|
-
grid-template-columns: 1fr 1.5fr;
|
|
251
|
-
gap: clamp(2rem, 5vw, 4rem);
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/* 여백은 넉넉하게 */
|
|
255
|
-
section {
|
|
256
|
-
padding: clamp(4rem, 10vh, 8rem) 0;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
/* Container queries (2026 표준) */
|
|
260
|
-
@container (min-width: 400px) {
|
|
261
|
-
.card { flex-direction: row; }
|
|
262
|
-
}
|
|
263
|
-
```
|
|
264
|
-
|
|
265
|
-
**DON'T:**
|
|
266
|
-
```css
|
|
267
|
-
/* ❌ 금지 - 완벽한 대칭 (지루함) */
|
|
268
|
-
grid-template-columns: 1fr 1fr;
|
|
269
|
-
|
|
270
|
-
/* ❌ 금지 - 빽빽한 레이아웃 */
|
|
271
|
-
padding: 10px;
|
|
272
|
-
gap: 8px;
|
|
273
|
-
```
|
|
274
|
-
|
|
275
|
-
## 접근성 체크리스트
|
|
276
|
-
|
|
277
|
-
| 항목 | 기준 | 확인 |
|
|
278
|
-
|------|------|------|
|
|
279
|
-
| 색상 대비 | WCAG AA (4.5:1 텍스트, 3:1 UI) | [ ] |
|
|
280
|
-
| 키보드 네비게이션 | 모든 인터랙티브 요소 접근 가능 | [ ] |
|
|
281
|
-
| 포커스 표시 | 명확한 포커스 링 | [ ] |
|
|
282
|
-
| 모션 감소 | prefers-reduced-motion 처리 | [ ] |
|
|
283
|
-
| 스크린 리더 | 시맨틱 HTML, aria-label | [ ] |
|
|
284
|
-
| 텍스트 크기 | 16px 이상 본문 | [ ] |
|
|
285
|
-
| 터치 타겟 | 44x44px 이상 | [ ] |
|
|
286
|
-
|
|
287
|
-
## 금지 사항 (Anti-patterns)
|
|
288
|
-
|
|
289
|
-
| 카테고리 | 금지 항목 |
|
|
290
|
-
|----------|----------|
|
|
291
|
-
| 폰트 | Inter, Roboto, Arial, system fonts 단독 사용 |
|
|
292
|
-
| 컬러 | 퍼플 그라디언트 on 화이트, 순백색 배경 |
|
|
293
|
-
| 레이아웃 | 완벽 대칭, 좁은 여백, 쿠키커터 카드 |
|
|
294
|
-
| 애니메이션 | 목적 없는 회전, 1초+ 트랜지션, layout 애니메이트 |
|
|
295
|
-
| 패턴 | 동일한 그림자, 동일한 border-radius, 복사된 UI |
|
|
296
|
-
|
|
297
|
-
## 참조 문서
|
|
298
|
-
|
|
299
|
-
- [references/typography-2026.md](references/typography-2026.md) - 폰트 선택, 스케일, 페어링
|
|
300
|
-
- [references/colors-2026.md](references/colors-2026.md) - OKLCH, 팔레트, 다크모드
|
|
301
|
-
- [references/animation-patterns.md](references/animation-patterns.md) - CSS/JS 패턴, 라이브러리
|
|
302
|
-
|
|
303
|
-
## Sources
|
|
304
|
-
|
|
305
|
-
- [UI Trends 2026 - UX Studio Team](https://www.uxstudioteam.com/ux-blog/ui-trends-2019)
|
|
306
|
-
- [12 UI/UX Design Trends - Index.dev](https://www.index.dev/blog/ui-ux-design-trends)
|
|
307
|
-
- [Typography Trends 2026 - Wannathis](https://wannathis.one/blog/top-typography-trends-2026-for-designers)
|
|
308
|
-
- [Color Trends 2026 - Lounge Lizard](https://www.loungelizard.com/blog/web-design-color-trends/)
|
|
309
|
-
- [Motion UI Trends 2026 - Loma Technology](https://lomatechnology.com/blog/motion-ui-trends-2026/2911)
|
|
310
|
-
- [Motion Library](https://motion.dev/)
|