@kood/claude-code 0.2.4 → 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.
Files changed (130) hide show
  1. package/dist/index.js +13 -8
  2. package/package.json +1 -1
  3. package/templates/.claude/agents/code-reviewer.md +371 -19
  4. package/templates/.claude/agents/dependency-manager.md +197 -0
  5. package/templates/.claude/agents/deployment-validator.md +136 -0
  6. package/templates/.claude/agents/git-operator.md +147 -0
  7. package/templates/.claude/agents/implementation-executor.md +202 -0
  8. package/templates/.claude/agents/lint-fixer.md +155 -0
  9. package/templates/.claude/agents/refactor-advisor.md +339 -29
  10. package/templates/.claude/commands/agent-creator.md +355 -0
  11. package/templates/.claude/commands/docs-creator.md +404 -163
  12. package/templates/.claude/commands/docs-refactor.md +400 -113
  13. package/templates/.claude/commands/execute.md +357 -185
  14. package/templates/.claude/commands/git-all.md +16 -70
  15. package/templates/.claude/commands/git-session.md +36 -68
  16. package/templates/.claude/commands/git.md +20 -69
  17. package/templates/.claude/commands/lint-fix.md +164 -107
  18. package/templates/.claude/commands/lint-init.md +142 -168
  19. package/templates/.claude/commands/plan.md +300 -84
  20. package/templates/.claude/commands/prd.md +613 -0
  21. package/templates/.claude/commands/pre-deploy.md +242 -0
  22. package/templates/.claude/commands/subagent-creator.md +118 -0
  23. package/templates/.claude/commands/version-update.md +45 -57
  24. package/templates/hono/CLAUDE.md +99 -54
  25. package/templates/hono/docs/guides/conventions.md +352 -0
  26. package/templates/hono/docs/guides/env-setup.md +347 -0
  27. package/templates/hono/docs/guides/getting-started.md +239 -0
  28. package/templates/hono/docs/library/hono/error-handling.md +20 -29
  29. package/templates/hono/docs/library/hono/index.md +25 -52
  30. package/templates/hono/docs/library/hono/middleware.md +16 -75
  31. package/templates/hono/docs/library/hono/rpc.md +7 -35
  32. package/templates/hono/docs/library/hono/validation.md +25 -45
  33. package/templates/hono/docs/library/t3-env/index.md +374 -0
  34. package/templates/npx/CLAUDE.md +165 -65
  35. package/templates/npx/docs/library/commander/index.md +10 -73
  36. package/templates/npx/docs/library/fs-extra/index.md +21 -113
  37. package/templates/npx/docs/library/prompts/index.md +30 -176
  38. package/templates/npx/docs/references/patterns.md +75 -48
  39. package/templates/tanstack-start/CLAUDE.md +101 -77
  40. package/templates/tanstack-start/docs/architecture.md +427 -0
  41. package/templates/tanstack-start/docs/design.md +558 -0
  42. package/templates/tanstack-start/docs/guides/conventions.md +132 -32
  43. package/templates/tanstack-start/docs/guides/env-setup.md +127 -62
  44. package/templates/tanstack-start/docs/guides/getting-started.md +81 -20
  45. package/templates/tanstack-start/docs/guides/hooks.md +241 -36
  46. package/templates/tanstack-start/docs/guides/routes.md +213 -61
  47. package/templates/tanstack-start/docs/guides/services.md +260 -24
  48. package/templates/tanstack-start/docs/library/better-auth/index.md +469 -16
  49. package/templates/tanstack-start/docs/library/t3-env/index.md +307 -0
  50. package/templates/tanstack-start/docs/library/tanstack-query/index.md +12 -21
  51. package/templates/tanstack-start/docs/library/tanstack-query/invalidation.md +22 -35
  52. package/templates/tanstack-start/docs/library/tanstack-query/optimistic-updates.md +7 -24
  53. package/templates/tanstack-start/docs/library/tanstack-query/use-mutation.md +26 -39
  54. package/templates/tanstack-start/docs/library/tanstack-query/use-query.md +23 -26
  55. package/templates/tanstack-start/docs/library/tanstack-router/error-handling.md +32 -147
  56. package/templates/tanstack-start/docs/library/tanstack-router/hooks.md +25 -167
  57. package/templates/tanstack-start/docs/library/tanstack-router/index.md +39 -74
  58. package/templates/tanstack-start/docs/library/tanstack-router/navigation.md +46 -116
  59. package/templates/tanstack-start/docs/library/tanstack-router/route-context.md +35 -154
  60. package/templates/tanstack-start/docs/library/tanstack-router/search-params.md +32 -171
  61. package/templates/tanstack-start/docs/library/tanstack-start/auth-patterns.md +7 -15
  62. package/templates/tanstack-start/docs/library/tanstack-start/routing.md +16 -23
  63. package/templates/tanstack-start/docs/library/zod/complex-types.md +12 -31
  64. package/templates/tanstack-start/docs/library/zod/index.md +18 -35
  65. package/templates/tanstack-start/docs/library/zod/transforms.md +11 -25
  66. package/templates/tanstack-start/docs/library/zod/validation.md +12 -34
  67. package/templates/.claude/agents/debug-detective.md +0 -37
  68. package/templates/.claude/agents/test-writer.md +0 -41
  69. package/templates/.claude/commands/feedback.md +0 -199
  70. package/templates/.claude/commands/ts-fix.md +0 -176
  71. package/templates/.claude/skills/command-creator/LICENSE.txt +0 -202
  72. package/templates/.claude/skills/command-creator/SKILL.md +0 -245
  73. package/templates/.claude/skills/command-creator/scripts/init_command.py +0 -244
  74. package/templates/.claude/skills/command-creator/scripts/package_command.py +0 -125
  75. package/templates/.claude/skills/command-creator/scripts/quick_validate.py +0 -143
  76. package/templates/.claude/skills/frontend-design/SKILL.md +0 -310
  77. package/templates/.claude/skills/frontend-design/references/animation-patterns.md +0 -446
  78. package/templates/.claude/skills/frontend-design/references/colors-2026.md +0 -244
  79. package/templates/.claude/skills/frontend-design/references/typography-2026.md +0 -302
  80. package/templates/.claude/skills/gemini-review/SKILL.md +0 -118
  81. package/templates/.claude/skills/gemini-review/references/checklists.md +0 -129
  82. package/templates/.claude/skills/gemini-review/references/prompt-templates.md +0 -274
  83. package/templates/.claude/skills/skill-creator/LICENSE.txt +0 -202
  84. package/templates/.claude/skills/skill-creator/SKILL.md +0 -184
  85. package/templates/.claude/skills/skill-creator/scripts/init_skill.py +0 -303
  86. package/templates/.claude/skills/skill-creator/scripts/package_skill.py +0 -110
  87. package/templates/.claude/skills/skill-creator/scripts/quick_validate.py +0 -65
  88. package/templates/hono/docs/library/ai-sdk/index.md +0 -190
  89. package/templates/hono/docs/library/ai-sdk/openrouter.md +0 -111
  90. package/templates/hono/docs/library/ai-sdk/providers.md +0 -102
  91. package/templates/hono/docs/library/ai-sdk/streaming.md +0 -146
  92. package/templates/hono/docs/library/ai-sdk/structured-output.md +0 -161
  93. package/templates/hono/docs/library/ai-sdk/tools.md +0 -144
  94. package/templates/hono/docs/library/drizzle/cloudflare-d1.md +0 -247
  95. package/templates/hono/docs/library/drizzle/config.md +0 -167
  96. package/templates/hono/docs/library/drizzle/index.md +0 -259
  97. package/templates/hono/docs/library/hono/env-setup.md +0 -169
  98. package/templates/hono/docs/library/pino/index.md +0 -146
  99. package/templates/tanstack-start/docs/architecture/architecture.md +0 -243
  100. package/templates/tanstack-start/docs/deployment/cloudflare.md +0 -132
  101. package/templates/tanstack-start/docs/deployment/index.md +0 -163
  102. package/templates/tanstack-start/docs/deployment/nitro.md +0 -110
  103. package/templates/tanstack-start/docs/deployment/railway.md +0 -147
  104. package/templates/tanstack-start/docs/deployment/vercel.md +0 -135
  105. package/templates/tanstack-start/docs/design/components.md +0 -175
  106. package/templates/tanstack-start/docs/design/index.md +0 -151
  107. package/templates/tanstack-start/docs/design/safe-area.md +0 -118
  108. package/templates/tanstack-start/docs/design/tailwind-setup.md +0 -156
  109. package/templates/tanstack-start/docs/library/ai-sdk/hooks.md +0 -472
  110. package/templates/tanstack-start/docs/library/ai-sdk/index.md +0 -264
  111. package/templates/tanstack-start/docs/library/ai-sdk/openrouter.md +0 -371
  112. package/templates/tanstack-start/docs/library/ai-sdk/providers.md +0 -403
  113. package/templates/tanstack-start/docs/library/ai-sdk/streaming.md +0 -320
  114. package/templates/tanstack-start/docs/library/ai-sdk/structured-output.md +0 -454
  115. package/templates/tanstack-start/docs/library/ai-sdk/tools.md +0 -473
  116. package/templates/tanstack-start/docs/library/better-auth/2fa.md +0 -48
  117. package/templates/tanstack-start/docs/library/better-auth/advanced.md +0 -55
  118. package/templates/tanstack-start/docs/library/better-auth/plugins.md +0 -34
  119. package/templates/tanstack-start/docs/library/better-auth/session.md +0 -47
  120. package/templates/tanstack-start/docs/library/better-auth/setup.md +0 -41
  121. package/templates/tanstack-start/docs/library/drizzle/cloudflare-d1.md +0 -147
  122. package/templates/tanstack-start/docs/library/drizzle/config.md +0 -118
  123. package/templates/tanstack-start/docs/library/drizzle/crud.md +0 -205
  124. package/templates/tanstack-start/docs/library/drizzle/index.md +0 -79
  125. package/templates/tanstack-start/docs/library/drizzle/relations.md +0 -202
  126. package/templates/tanstack-start/docs/library/drizzle/schema.md +0 -154
  127. package/templates/tanstack-start/docs/library/drizzle/setup.md +0 -96
  128. package/templates/tanstack-start/docs/library/drizzle/transactions.md +0 -127
  129. package/templates/tanstack-start/docs/library/pino/index.md +0 -320
  130. /package/templates/hono/docs/{architecture/architecture.md → architecture.md} +0 -0
@@ -1,446 +0,0 @@
1
- # Animation Patterns 2026
2
-
3
- ## 핵심 원칙
4
-
5
- | 원칙 | 설명 |
6
- |------|------|
7
- | 목적 | 모든 애니메이션에 이유가 있어야 함 |
8
- | 속도 | 트랜지션 300ms 이하 |
9
- | 성능 | transform, opacity만 애니메이트 |
10
- | 접근성 | prefers-reduced-motion 존중 |
11
-
12
- ## CSS 애니메이션
13
-
14
- ### 기본 Easing
15
-
16
- ```css
17
- :root {
18
- /* 표준 이징 */
19
- --ease-out: cubic-bezier(0.16, 1, 0.3, 1); /* 빠른 시작, 부드러운 끝 */
20
- --ease-in-out: cubic-bezier(0.65, 0, 0.35, 1); /* 균형잡힌 */
21
- --ease-spring: cubic-bezier(0.34, 1.56, 0.64, 1); /* 스프링 효과 */
22
-
23
- /* 기본 duration */
24
- --duration-fast: 150ms;
25
- --duration-normal: 200ms;
26
- --duration-slow: 300ms;
27
- --duration-enter: 400ms; /* 진입 애니메이션 */
28
- }
29
- ```
30
-
31
- ### 호버 효과
32
-
33
- ```css
34
- /* 버튼 리프트 */
35
- .button {
36
- transition:
37
- transform var(--duration-fast) var(--ease-out),
38
- box-shadow var(--duration-fast) var(--ease-out);
39
- }
40
- .button:hover {
41
- transform: translateY(-2px);
42
- box-shadow: 0 4px 12px oklch(0% 0 0 / 0.15);
43
- }
44
- .button:active {
45
- transform: translateY(0);
46
- }
47
-
48
- /* 카드 틸트 */
49
- .card {
50
- transition: transform var(--duration-normal) var(--ease-out);
51
- }
52
- .card:hover {
53
- transform: perspective(1000px) rotateX(-2deg) rotateY(2deg);
54
- }
55
-
56
- /* 링크 언더라인 */
57
- .link {
58
- position: relative;
59
- }
60
- .link::after {
61
- content: '';
62
- position: absolute;
63
- bottom: 0;
64
- left: 0;
65
- width: 100%;
66
- height: 2px;
67
- background: currentColor;
68
- transform: scaleX(0);
69
- transform-origin: right;
70
- transition: transform var(--duration-normal) var(--ease-out);
71
- }
72
- .link:hover::after {
73
- transform: scaleX(1);
74
- transform-origin: left;
75
- }
76
- ```
77
-
78
- ### 진입 애니메이션
79
-
80
- ```css
81
- /* Fade In Up */
82
- @keyframes fadeInUp {
83
- from {
84
- opacity: 0;
85
- transform: translateY(20px);
86
- }
87
- to {
88
- opacity: 1;
89
- transform: translateY(0);
90
- }
91
- }
92
-
93
- .fade-in-up {
94
- animation: fadeInUp var(--duration-enter) var(--ease-out) backwards;
95
- }
96
-
97
- /* Fade In Scale */
98
- @keyframes fadeInScale {
99
- from {
100
- opacity: 0;
101
- transform: scale(0.95);
102
- }
103
- to {
104
- opacity: 1;
105
- transform: scale(1);
106
- }
107
- }
108
-
109
- /* Slide In */
110
- @keyframes slideIn {
111
- from {
112
- transform: translateX(-100%);
113
- }
114
- to {
115
- transform: translateX(0);
116
- }
117
- }
118
- ```
119
-
120
- ### 스태거 애니메이션
121
-
122
- ```css
123
- /* CSS만으로 스태거 */
124
- .stagger > * {
125
- animation: fadeInUp var(--duration-enter) var(--ease-out) backwards;
126
- }
127
- .stagger > *:nth-child(1) { animation-delay: 0ms; }
128
- .stagger > *:nth-child(2) { animation-delay: 50ms; }
129
- .stagger > *:nth-child(3) { animation-delay: 100ms; }
130
- .stagger > *:nth-child(4) { animation-delay: 150ms; }
131
- .stagger > *:nth-child(5) { animation-delay: 200ms; }
132
- .stagger > *:nth-child(6) { animation-delay: 250ms; }
133
-
134
- /* CSS 커스텀 프로퍼티 활용 */
135
- .stagger-item {
136
- animation: fadeInUp var(--duration-enter) var(--ease-out) backwards;
137
- animation-delay: calc(var(--index, 0) * 50ms);
138
- }
139
- ```
140
-
141
- ```html
142
- <ul class="stagger">
143
- <li style="--index: 0">Item 1</li>
144
- <li style="--index: 1">Item 2</li>
145
- <li style="--index: 2">Item 3</li>
146
- </ul>
147
- ```
148
-
149
- ### 스크롤 트리거
150
-
151
- ```css
152
- /* Intersection Observer와 함께 사용 */
153
- .reveal {
154
- opacity: 0;
155
- transform: translateY(30px);
156
- transition:
157
- opacity var(--duration-slow) var(--ease-out),
158
- transform var(--duration-slow) var(--ease-out);
159
- }
160
- .reveal.visible {
161
- opacity: 1;
162
- transform: translateY(0);
163
- }
164
- ```
165
-
166
- ```js
167
- const observer = new IntersectionObserver(
168
- (entries) => {
169
- entries.forEach((entry) => {
170
- if (entry.isIntersecting) {
171
- entry.target.classList.add('visible');
172
- }
173
- });
174
- },
175
- { threshold: 0.1, rootMargin: '0px 0px -50px 0px' }
176
- );
177
-
178
- document.querySelectorAll('.reveal').forEach((el) => observer.observe(el));
179
- ```
180
-
181
- ## 접근성
182
-
183
- ### 필수: Reduced Motion
184
-
185
- ```css
186
- @media (prefers-reduced-motion: reduce) {
187
- *,
188
- *::before,
189
- *::after {
190
- animation-duration: 0.01ms !important;
191
- animation-iteration-count: 1 !important;
192
- transition-duration: 0.01ms !important;
193
- scroll-behavior: auto !important;
194
- }
195
- }
196
- ```
197
-
198
- ### 선택적 대체
199
-
200
- ```css
201
- .animated-element {
202
- transition: transform 300ms ease;
203
- }
204
-
205
- @media (prefers-reduced-motion: reduce) {
206
- .animated-element {
207
- transition: opacity 150ms ease; /* 움직임 대신 페이드 */
208
- }
209
- }
210
- ```
211
-
212
- ### JS에서 확인
213
-
214
- ```js
215
- const prefersReducedMotion = window.matchMedia(
216
- '(prefers-reduced-motion: reduce)'
217
- ).matches;
218
-
219
- if (!prefersReducedMotion) {
220
- // 애니메이션 실행
221
- }
222
- ```
223
-
224
- ## React: Motion (Framer Motion)
225
-
226
- ### 설치
227
-
228
- ```bash
229
- npm install motion
230
- ```
231
-
232
- ### 기본 패턴
233
-
234
- ```tsx
235
- import { motion } from 'motion/react';
236
-
237
- // 진입 애니메이션
238
- const FadeIn = ({ children }) => (
239
- <motion.div
240
- initial={{ opacity: 0, y: 20 }}
241
- animate={{ opacity: 1, y: 0 }}
242
- transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
243
- >
244
- {children}
245
- </motion.div>
246
- );
247
-
248
- // 호버 효과
249
- const HoverCard = ({ children }) => (
250
- <motion.div
251
- whileHover={{ scale: 1.02, y: -4 }}
252
- whileTap={{ scale: 0.98 }}
253
- transition={{ duration: 0.15 }}
254
- >
255
- {children}
256
- </motion.div>
257
- );
258
- ```
259
-
260
- ### 스태거 리스트
261
-
262
- ```tsx
263
- import { motion, stagger, useAnimate } from 'motion/react';
264
-
265
- const StaggerList = ({ items }) => (
266
- <motion.ul
267
- initial="hidden"
268
- animate="visible"
269
- variants={{
270
- visible: {
271
- transition: {
272
- staggerChildren: 0.05,
273
- },
274
- },
275
- }}
276
- >
277
- {items.map((item) => (
278
- <motion.li
279
- key={item.id}
280
- variants={{
281
- hidden: { opacity: 0, x: -20 },
282
- visible: { opacity: 1, x: 0 },
283
- }}
284
- transition={{ duration: 0.3, ease: [0.16, 1, 0.3, 1] }}
285
- >
286
- {item.name}
287
- </motion.li>
288
- ))}
289
- </motion.ul>
290
- );
291
- ```
292
-
293
- ### 페이지 트랜지션
294
-
295
- ```tsx
296
- import { AnimatePresence, motion } from 'motion/react';
297
-
298
- const PageTransition = ({ children, key }) => (
299
- <AnimatePresence mode="wait">
300
- <motion.div
301
- key={key}
302
- initial={{ opacity: 0, y: 10 }}
303
- animate={{ opacity: 1, y: 0 }}
304
- exit={{ opacity: 0, y: -10 }}
305
- transition={{ duration: 0.2 }}
306
- >
307
- {children}
308
- </motion.div>
309
- </AnimatePresence>
310
- );
311
- ```
312
-
313
- ### 레이아웃 애니메이션
314
-
315
- ```tsx
316
- // 자동 레이아웃 애니메이션
317
- <motion.div layout>
318
- {isExpanded && <p>추가 콘텐츠</p>}
319
- </motion.div>
320
-
321
- // 공유 레이아웃
322
- <motion.div layoutId="shared-element">
323
- {/* 같은 layoutId를 가진 요소 간 애니메이션 */}
324
- </motion.div>
325
- ```
326
-
327
- ### Reduced Motion 지원
328
-
329
- ```tsx
330
- import { useReducedMotion } from 'motion/react';
331
-
332
- const AnimatedComponent = () => {
333
- const shouldReduceMotion = useReducedMotion();
334
-
335
- return (
336
- <motion.div
337
- initial={{ opacity: 0, y: shouldReduceMotion ? 0 : 20 }}
338
- animate={{ opacity: 1, y: 0 }}
339
- transition={{ duration: shouldReduceMotion ? 0 : 0.3 }}
340
- >
341
- Content
342
- </motion.div>
343
- );
344
- };
345
- ```
346
-
347
- ## GSAP (복잡한 애니메이션)
348
-
349
- ### 설치
350
-
351
- ```bash
352
- npm install gsap
353
- ```
354
-
355
- ### 기본 사용
356
-
357
- ```js
358
- import gsap from 'gsap';
359
-
360
- // 단일 애니메이션
361
- gsap.to('.element', {
362
- x: 100,
363
- opacity: 1,
364
- duration: 0.3,
365
- ease: 'power3.out',
366
- });
367
-
368
- // 타임라인
369
- const tl = gsap.timeline();
370
- tl.from('.title', { y: 50, opacity: 0, duration: 0.5 })
371
- .from('.subtitle', { y: 30, opacity: 0, duration: 0.4 }, '-=0.3')
372
- .from('.cta', { scale: 0.9, opacity: 0, duration: 0.3 }, '-=0.2');
373
- ```
374
-
375
- ### ScrollTrigger
376
-
377
- ```js
378
- import gsap from 'gsap';
379
- import { ScrollTrigger } from 'gsap/ScrollTrigger';
380
-
381
- gsap.registerPlugin(ScrollTrigger);
382
-
383
- gsap.from('.reveal', {
384
- scrollTrigger: {
385
- trigger: '.reveal',
386
- start: 'top 80%',
387
- toggleActions: 'play none none reverse',
388
- },
389
- y: 50,
390
- opacity: 0,
391
- duration: 0.6,
392
- ease: 'power3.out',
393
- });
394
- ```
395
-
396
- ## 금지 패턴
397
-
398
- | 패턴 | 이유 | 대안 |
399
- |------|------|------|
400
- | `transition: all` | 성능 저하, 예측 불가 | 개별 속성 명시 |
401
- | `width/height` 애니메이트 | 레이아웃 리플로우 | transform: scale |
402
- | `margin/padding` 애니메이트 | 레이아웃 리플로우 | transform: translate |
403
- | 1초+ 트랜지션 | 느린 UX | 300ms 이하 |
404
- | 무한 회전 | 주의 분산, 접근성 | 필요시만, 정지 옵션 |
405
- | `animation-delay` 과다 | 느린 인지 | 50-100ms 간격 |
406
-
407
- ```css
408
- /* ❌ 금지 */
409
- transition: all 0.5s;
410
- transition: width 0.3s, height 0.3s;
411
- animation: spin 2s infinite linear;
412
-
413
- /* ✅ 권장 */
414
- transition: transform 0.2s ease-out, opacity 0.15s ease;
415
- ```
416
-
417
- ## 성능 체크리스트
418
-
419
- | 항목 | 확인 |
420
- |------|------|
421
- | transform/opacity만 애니메이트 | [ ] |
422
- | will-change 적절히 사용 | [ ] |
423
- | 레이아웃 속성 애니메이트 안함 | [ ] |
424
- | 60fps 유지 (DevTools 확인) | [ ] |
425
- | 모바일에서 테스트 | [ ] |
426
- | prefers-reduced-motion 처리 | [ ] |
427
-
428
- ### will-change 사용
429
-
430
- ```css
431
- /* 애니메이션 시작 직전에만 */
432
- .card {
433
- will-change: auto;
434
- }
435
- .card:hover {
436
- will-change: transform;
437
- }
438
-
439
- /* 또는 JS로 관리 */
440
- element.addEventListener('mouseenter', () => {
441
- element.style.willChange = 'transform';
442
- });
443
- element.addEventListener('animationend', () => {
444
- element.style.willChange = 'auto';
445
- });
446
- ```
@@ -1,244 +0,0 @@
1
- # Colors 2026 Guide
2
-
3
- ## OKLCH 컬러 시스템
4
-
5
- 2026년 표준. 인간 지각에 맞춰 설계된 컬러 모델.
6
-
7
- ### 구조
8
-
9
- ```
10
- oklch(L% C H)
11
- L = Lightness (0-100%)
12
- C = Chroma (0-0.4, 채도)
13
- H = Hue (0-360, 색상)
14
- ```
15
-
16
- ### 장점
17
-
18
- | 기존 방식 | OKLCH |
19
- |-----------|-------|
20
- | 밝기 변경 시 채도 왜곡 | 일관된 밝기 조절 |
21
- | 다크모드 팔레트 별도 제작 | L값만 변경 |
22
- | 접근성 대비 계산 복잡 | L값으로 직관적 대비 |
23
-
24
- ## 팔레트 구성
25
-
26
- ### 기본 구조
27
-
28
- ```css
29
- :root {
30
- /* === Base === */
31
- --bg-primary: oklch(98% 0.005 90); /* 웜 오프화이트 */
32
- --bg-secondary: oklch(95% 0.01 90); /* 린넨 */
33
- --bg-tertiary: oklch(92% 0.015 90); /* 샌드 */
34
- --bg-elevated: oklch(100% 0 0); /* 카드, 모달 */
35
-
36
- /* === Text === */
37
- --text-primary: oklch(20% 0.01 90); /* 헤드라인 */
38
- --text-secondary: oklch(40% 0.02 90); /* 본문 */
39
- --text-tertiary: oklch(55% 0.02 90); /* 보조 텍스트 */
40
- --text-muted: oklch(65% 0.01 90); /* 플레이스홀더 */
41
-
42
- /* === Accent === */
43
- --accent: oklch(65% 0.2 180); /* 프라이머리 */
44
- --accent-hover: oklch(60% 0.22 180);
45
- --accent-active: oklch(55% 0.24 180);
46
- --accent-subtle: oklch(95% 0.05 180); /* 배경용 */
47
-
48
- /* === Semantic === */
49
- --success: oklch(70% 0.18 145);
50
- --success-bg: oklch(95% 0.05 145);
51
- --warning: oklch(75% 0.15 85);
52
- --warning-bg: oklch(95% 0.05 85);
53
- --error: oklch(60% 0.22 25);
54
- --error-bg: oklch(95% 0.05 25);
55
- --info: oklch(65% 0.15 240);
56
- --info-bg: oklch(95% 0.04 240);
57
-
58
- /* === Border === */
59
- --border-default: oklch(88% 0.01 90);
60
- --border-subtle: oklch(92% 0.005 90);
61
- --border-strong: oklch(75% 0.02 90);
62
- }
63
- ```
64
-
65
- ### 다크 모드
66
-
67
- ```css
68
- @media (prefers-color-scheme: dark) {
69
- :root {
70
- /* L값 반전 패턴 */
71
- --bg-primary: oklch(12% 0.01 90);
72
- --bg-secondary: oklch(16% 0.015 90);
73
- --bg-tertiary: oklch(20% 0.02 90);
74
- --bg-elevated: oklch(18% 0.015 90);
75
-
76
- --text-primary: oklch(92% 0.01 90);
77
- --text-secondary: oklch(75% 0.02 90);
78
- --text-tertiary: oklch(60% 0.02 90);
79
- --text-muted: oklch(50% 0.01 90);
80
-
81
- /* 액센트는 밝기만 조절 */
82
- --accent: oklch(70% 0.18 180);
83
- --accent-hover: oklch(75% 0.16 180);
84
- --accent-subtle: oklch(25% 0.08 180);
85
-
86
- --border-default: oklch(25% 0.02 90);
87
- --border-subtle: oklch(20% 0.01 90);
88
- --border-strong: oklch(35% 0.02 90);
89
- }
90
- }
91
- ```
92
-
93
- ## 2026 트렌드 컬러
94
-
95
- ### Pantone 2026
96
-
97
- | 이름 | OKLCH | HEX | 용도 |
98
- |------|-------|-----|------|
99
- | Cloud Dancer | oklch(97% 0.005 90) | #F5F5F5 | 배경 베이스 |
100
- | Mocha Mousse | oklch(55% 0.08 55) | #A47764 | 어시 액센트 |
101
-
102
- ### 주요 액센트
103
-
104
- | 이름 | OKLCH | HEX | 무드 |
105
- |------|-------|-----|------|
106
- | Transformative Teal | oklch(65% 0.15 180) | #2D9CCA | 신뢰, 성장 |
107
- | Neo Mint | oklch(85% 0.1 160) | #AAF0D1 | 프레시, 테크 |
108
- | Soft Coral | oklch(75% 0.12 30) | #FFB5A7 | 따뜻함 |
109
- | Electric Blue | oklch(60% 0.2 250) | #3366FF | 에너지 |
110
- | Muted Purple | oklch(55% 0.12 300) | #8B7BA5 | 크리에이티브 |
111
- | Pastel Orange | oklch(80% 0.1 60) | #FFD4A3 | 친근함 |
112
-
113
- ## 테마별 팔레트
114
-
115
- ### Calm Minimal
116
-
117
- ```css
118
- :root {
119
- --bg-primary: oklch(98% 0.003 60); /* 아이보리 */
120
- --text-primary: oklch(25% 0.01 60);
121
- --accent: oklch(45% 0.08 180); /* 딥 틸 */
122
- }
123
- ```
124
-
125
- ### Bold Maximalist
126
-
127
- ```css
128
- :root {
129
- --bg-primary: oklch(15% 0.02 280); /* 딥 네이비 */
130
- --text-primary: oklch(95% 0.01 60);
131
- --accent: oklch(70% 0.25 30); /* 비비드 오렌지 */
132
- --accent-secondary: oklch(75% 0.2 320); /* 핑크 */
133
- }
134
- ```
135
-
136
- ### Organic Natural
137
-
138
- ```css
139
- :root {
140
- --bg-primary: oklch(95% 0.02 80); /* 크림 */
141
- --text-primary: oklch(30% 0.04 80); /* 브라운 */
142
- --accent: oklch(50% 0.12 140); /* 포레스트 */
143
- }
144
- ```
145
-
146
- ### Liquid Glass
147
-
148
- ```css
149
- :root {
150
- --bg-primary: oklch(98% 0.01 240 / 0.9); /* 반투명 */
151
- --glass: oklch(100% 0 0 / 0.6);
152
- --glass-border: oklch(100% 0 0 / 0.2);
153
- --accent: oklch(65% 0.18 200);
154
- }
155
-
156
- .glass-card {
157
- background: var(--glass);
158
- backdrop-filter: blur(20px) saturate(180%);
159
- border: 1px solid var(--glass-border);
160
- }
161
- ```
162
-
163
- ## 접근성
164
-
165
- ### 대비 계산
166
-
167
- ```
168
- WCAG AA 기준:
169
- - 일반 텍스트: 4.5:1
170
- - 큰 텍스트 (18px+): 3:1
171
- - UI 컴포넌트: 3:1
172
-
173
- OKLCH에서 대비 확보:
174
- - L값 차이 최소 50% 권장 (텍스트 vs 배경)
175
- ```
176
-
177
- ### 안전한 조합
178
-
179
- | 배경 L값 | 텍스트 L값 | 대비 |
180
- |----------|-----------|------|
181
- | 95%+ | 30% 이하 | AA 충족 |
182
- | 15% 이하 | 85%+ | AA 충족 |
183
-
184
- ## 금지 패턴
185
-
186
- ```css
187
- /* ❌ 순백색 배경 */
188
- background: #ffffff;
189
- background: oklch(100% 0 0);
190
-
191
- /* ❌ AI 슬롭 퍼플 그라디언트 */
192
- background: linear-gradient(135deg, #667eea, #764ba2);
193
-
194
- /* ❌ 너무 채도 높은 배경 */
195
- background: oklch(50% 0.3 180); /* C값 0.2 이하 권장 */
196
-
197
- /* ❌ 대비 부족 */
198
- color: oklch(60% 0.1 90); /* on 80% 배경 = 실패 */
199
- ```
200
-
201
- ## 실용 팁
202
-
203
- ### 그라디언트
204
-
205
- ```css
206
- /* OKLCH 그라디언트 (더 자연스러운 중간색) */
207
- background: linear-gradient(
208
- 135deg,
209
- oklch(65% 0.15 180),
210
- oklch(55% 0.18 220)
211
- );
212
-
213
- /* 색상 공간 명시 */
214
- background: linear-gradient(
215
- in oklch,
216
- oklch(70% 0.2 30),
217
- oklch(65% 0.18 60)
218
- );
219
- ```
220
-
221
- ### 투명도
222
-
223
- ```css
224
- /* 알파 채널 */
225
- background: oklch(65% 0.15 180 / 0.8);
226
- border: 1px solid oklch(65% 0.15 180 / 0.3);
227
- ```
228
-
229
- ### 동적 밝기
230
-
231
- ```css
232
- /* CSS 변수로 밝기 조절 */
233
- :root {
234
- --accent-h: 180;
235
- --accent-c: 0.15;
236
- }
237
-
238
- .accent {
239
- background: oklch(65% var(--accent-c) var(--accent-h));
240
- }
241
- .accent:hover {
242
- background: oklch(60% var(--accent-c) var(--accent-h));
243
- }
244
- ```