atomsystem 0.4.3 โ†’ 0.5.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "atomsystem",
3
- "version": "0.4.3",
3
+ "version": "0.5.0",
4
4
  "type": "module",
5
5
  "homepage": "https://system.atomground.com",
6
6
  "repository": {
@@ -58,6 +58,7 @@
58
58
  "start": "next start",
59
59
  "lint": "next lint",
60
60
  "lint:design": "impeccable detect app components css presets",
61
+ "audit:recursive": "tsx scripts/audit-recursive.ts",
61
62
  "test:e2e": "playwright test",
62
63
  "test:e2e:ui": "playwright test --ui",
63
64
  "test:e2e:report": "playwright show-report"
@@ -0,0 +1,49 @@
1
+ # ๐Ÿ›๏ธ AtomSystem Universal AI Coding Guidelines
2
+
3
+ > ์ด ํ”„๋กœ์ ํŠธ๋Š” **AtomSystem (Universal Design Token & Agentic UI System)**์„ ๊ณต์‹ ๋””์ž์ธ ์‹œ์Šคํ…œ์œผ๋กœ ์ฑ„ํƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
4
+ > ๋ชจ๋“  AI ์–ด์‹œ์Šคํ„ดํŠธ(Cursor, Claude, Copilot, Antigravity, Windsurf ๋“ฑ)๋Š” ์ƒˆ๋กœ์šด UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ๋•Œ ์•„๋ž˜ ์›์น™์„ **์ ˆ๋Œ€์ ์œผ๋กœ ์ค€์ˆ˜**ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
5
+
6
+ ---
7
+
8
+ ## ๐Ÿš€ 1. ํ•ต์‹ฌ ์•„ํ‚คํ…์ฒ˜: 4๋‹จ๊ณ„ ๋ ˆ๊ณ  ์กฐ๋ฆฝ ํŒŒ์ดํ”„๋ผ์ธ
9
+
10
+ ```
11
+ [1. W3C DTCG Tokens] โ”€โ”€> [2. UI Components] โ”€โ”€> [3. Content Blocks] โ”€โ”€> [4. UX Patterns / Templates]
12
+ (CSS ๋ณ€์ˆ˜: ์ƒ‰์ƒ/๊ฐ„๊ฒฉ) (Button, Card, Badge) (RealtimeChart, Chat) (Dashboard, Checkout)
13
+ ```
14
+
15
+ 1. **Tokens (`atom.design.md`, `tokens/token.json`)**:
16
+ - ๋ชจ๋“  ์ƒ‰์ƒ, ๊ฐ„๊ฒฉ, ๋ณด๋”, ํฐํŠธ ํฌ๊ธฐ๋Š” ๋ฐ˜๋“œ์‹œ CSS ๋ณ€์ˆ˜(`var(--text-primary)`, `var(--bg-primary)`, `var(--border-subtle)` ๋“ฑ)๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
17
+ - **ํ•˜๋“œ์ฝ”๋”ฉ ์ ˆ๋Œ€ ๊ธˆ์ง€**: `text-blue-500`, `bg-[#123456]`, `p-[13px]`, `border-gray-200` ๋“ฑ ์ž„์˜์˜ ์ธ๋ผ์ธ ๊ฐ’ ์‚ฌ์šฉ์„ ์—„๊ฒฉํžˆ ๊ธˆ์ง€ํ•ฉ๋‹ˆ๋‹ค.
18
+ 2. **Components (`atom.components.md`, `components/ui/`)**:
19
+ - ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ๊ธฐ์ดˆ ์›์ž์ž…๋‹ˆ๋‹ค (`Button`, `Card`, `Badge`, `Input`, `Table`, `Tabs`, `Switch`, `Modal` ๋“ฑ).
20
+ - ๋‚ ๋ฆผ ์›์‹œ ํƒœ๊ทธ(`<button>`, `<div class="rounded-lg ...">`)๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š๊ณ , ๊ฒ€์ฆ๋œ `components/ui/` ์ปดํฌ๋„ŒํŠธ๋ฅผ importํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
21
+ 3. **Blocks (`atom.blocks.md`, `components/blocks/`)**:
22
+ - ์ปดํฌ๋„ŒํŠธ๋“ค์„ ์กฐ๋ฆฝํ•˜์—ฌ ์™„์„ฑํ•œ ๋…๋ฆฝ ๊ธฐ๋Šฅํ˜• ์ฝ˜ํ…์ธ  ๋ธ”๋ก์ž…๋‹ˆ๋‹ค (`realtime-chart`, `interactive-chat`, `pricing-table`, `card-list`, `file-explorer` ๋“ฑ).
23
+ - ๋ธ”๋ก์— ํ•„์š”ํ•œ ์ƒˆ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—†๋‹ค๋ฉด, ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋จผ์ € `components/ui/`์— ์‹ ์„คํ•˜๊ณ  ๋ธ”๋ก์„ ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค (**Component-First ์›์น™**).
24
+ 4. **UX Patterns & Templates (`atom.uxPattern.md`)**:
25
+ - ์™„์„ฑ๋œ ๋ธ”๋ก๊ณผ ๋ ˆ์ด์•„์›ƒ์„ ์กฐ๋ฆฝํ•˜์—ฌ ์™„์„ฑํ˜• ์‚ฌ์šฉ์ž ๊ฒฝํ—˜(๋Œ€์‹œ๋ณด๋“œ, ํผ ์œ ํšจ์„ฑ, ๊ฒฐ์ œ ํ”Œ๋กœ์šฐ ๋“ฑ)์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
26
+
27
+ ---
28
+
29
+ ## ๐ŸŽจ 2. ํ‘œ์ค€ ์‹œ๋งจํ‹ฑ CSS ๋ณ€์ˆ˜ ๊ทœ๊ฒฉ
30
+
31
+ | ์šฉ๋„ | ๋ผ์ดํŠธ ๋ชจ๋“œ | ๋‹คํฌ ๋ชจ๋“œ | CSS ๋ณ€์ˆ˜ ํ‘œ๊ธฐ |
32
+ |---|---|---|---|
33
+ | ๊ธฐ๋ณธ ๋ฐฐ๊ฒฝ | `#ffffff` | `#0a0a0a` | `var(--bg-primary)` ๋˜๋Š” `bg-(--bg-primary)` |
34
+ | ๋ณด์กฐ ํ‘œ๋ฉด | `#f9f9fb` | `#141414` | `var(--bg-secondary)` ๋˜๋Š” `bg-(--bg-secondary)` |
35
+ | ๋ณธ๋ฌธ ํ…์ŠคํŠธ | `#111111` | `#ededed` | `var(--text-primary)` ๋˜๋Š” `text-(--text-primary)` |
36
+ | ๋ณด์กฐ ํ…์ŠคํŠธ | `#666666` | `#a0a0a0` | `var(--text-secondary)` ๋˜๋Š” `text-(--text-secondary)` |
37
+ | ์˜…์€ ๋ณด๋” | `#eaeaea` | `#222222` | `var(--border-subtle)` ๋˜๋Š” `border-(--border-subtle)` |
38
+ | ๊ฐ•์กฐ ๋ณด๋” | `#d4d4d8` | `#333333` | `var(--border-strong)` ๋˜๋Š” `border-(--border-strong)` |
39
+ | ๊ธฐ๋ณธ ๊ณก๋ฅ  | `6px` | `6px` | `var(--radius)` ๋˜๋Š” `rounded-(--radius)` |
40
+ | ์ž‘์€ ๊ณก๋ฅ  | `4px` | `4px` | `var(--radius-sm)` ๋˜๋Š” `rounded-(--radius-sm)` |
41
+
42
+ ---
43
+
44
+ ## ๐Ÿ’ก 3. AI ์ž‘์—… ์‹œ ํ•„์ˆ˜ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
45
+ - [ ] Tailwind ์ž„์˜์˜ ์ปฌ๋Ÿฌ(`blue-500`, `gray-100`)๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•˜์ง€ ์•Š๊ณ  ์‹œ๋งจํ‹ฑ ํ† ํฐ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ–ˆ๋Š”๊ฐ€?
46
+ - [ ] ๋ฒ„ํŠผ, ์นด๋“œ, ๋ฑƒ์ง€ ๋“ฑ UI๋ฅผ ๋‚ ๋ฆผ ํƒœ๊ทธ ๋Œ€์‹  `components/ui/`์—์„œ importํ•˜์—ฌ ์กฐ๋ฆฝํ–ˆ๋Š”๊ฐ€?
47
+ - [ ] ๋ณต์žกํ•œ ํ™”๋ฉด์„ ๋งŒ๋“ค ๋•Œ `atom.blocks.md` ๋ฐ `atom.uxPattern.md`์˜ ๊ฒ€์ฆ๋œ ํŒจํ„ด์„ ๋”ฐ๋ž๋Š”๊ฐ€?
48
+ - [ ] ๋นˆ ๋ฐ์ดํ„ฐ ์ƒํƒœ(Empty State), ๋กœ๋”ฉ ์ƒํƒœ(Loading/Skeleton), ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค๋ง(A11y)์„ ๋ณด์žฅํ–ˆ๋Š”๊ฐ€?
49
+ - [ ] 10px ๊ทน์†Œ ํฐํŠธ๋‚˜ ๊ณผ๋„ํ•œ ๊ทธ๋ผ๋””์–ธํŠธ, ํ˜•๊ด‘์ƒ‰ ๋“ฑ AI ์Šฌ๋กญ(Visual Noise)์„ ๋ฐฐ์ œํ–ˆ๋Š”๊ฐ€?
@@ -0,0 +1,101 @@
1
+ # ๐Ÿงฑ AtomSystem Design Blocks Guide (atom.blocks.md)
2
+
3
+ > ํŽ˜์ด์ง€ ์ „์ฒด๊ฐ€ ์•„๋‹Œ, ํŽ˜์ด์ง€ ๋‚ด๋ถ€์— ๊ฒฐํ•ฉ(Composition)๋˜๋Š” ์‹ค๋ฌด ์™„์„ฑํ˜• ๋…๋ฆฝ ์ฝ˜ํ…์ธ  ๋ธ”๋ก ๋ช…์„ธ์„œ์ž…๋‹ˆ๋‹ค.
4
+ > **Component-First ์›์น™**: ๋ธ”๋ก์€ ๋‚ ๋ฆผ HTML ํƒœ๊ทธ๊ฐ€ ์•„๋‹ˆ๋ผ, ๋ฐ˜๋“œ์‹œ ๊ฒ€์ฆ๋œ ์›์ž ์ปดํฌ๋„ŒํŠธ(`Button`, `Card`, `Badge`, `Input`, `Table` ๋“ฑ)๋ฅผ ๋ ˆ๊ณ  ์กฐ๊ฐ ์‚ผ์•„ ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.
5
+
6
+ ---
7
+
8
+ ## ๐Ÿงฑ 4๋Œ€ ๋ ˆ๊ณ  ์กฐ๋ฆฝ ํŒŒ์ดํ”„๋ผ์ธ (Lego Assembly Pipeline)
9
+
10
+ ```
11
+ [1. W3C DTCG Tokens] โ”€โ”€> [2. UI Components] โ”€โ”€> [3. Content Blocks] โ”€โ”€> [4. Templates / Screens]
12
+ (CSS ๋ณ€์ˆ˜: ์ƒ‰์ƒ/๊ฐ„๊ฒฉ) (Button, Card, Badge) (RealtimeChart, Chat) (Dashboard, Checkout)
13
+ ```
14
+
15
+ 1. **Tokens**: ๋ธ”๋ก์˜ ๋ชจ๋“  ๊ณก๋ฅ , ๊ฐ„๊ฒฉ, ๋ณด๋”, ์ปฌ๋Ÿฌ๋Š” CSS ๋ณ€์ˆ˜(`var(--atom-*)`, `var(--bg-primary)` ๋“ฑ)๋กœ ์ฃผ์ž…๋ฉ๋‹ˆ๋‹ค.
16
+ 2. **Components**: ๋ธ”๋ก์€ ๋ฐ˜๋“œ์‹œ `components/ui/`์˜ ์ˆœ์ˆ˜ ์•„ํ†ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž„ํฌํŠธํ•˜์—ฌ ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.
17
+ 3. **Blocks**: ํŠน์ • ๊ธฐ๋Šฅ/์ฝ˜ํ…์ธ (์ฐจํŠธ, ์ฑ—, ์š”๊ธˆ์ œ ๋“ฑ)๋ฅผ ์™„๊ฒฐ์„ฑ ์žˆ๊ฒŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๋…๋ฆฝ ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค.
18
+ 4. **Templates**: 1๊ฐœ ์ด์ƒ์˜ ๋ธ”๋ก๊ณผ ๋ ˆ์ด์•„์›ƒ์ด ๊ฒฐํ•ฉ๋˜์–ด ์ตœ์ข… ํ™”๋ฉด(๋Œ€์‹œ๋ณด๋“œ, ๋žœ๋”ฉ ๋“ฑ)์„ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.
19
+
20
+ ---
21
+
22
+ ## ๐Ÿ“ฆ 7๋Œ€ ํ•ต์‹ฌ ๋””์ž์ธ ๋ธ”๋ก ์นดํƒˆ๋กœ๊ทธ
23
+
24
+ ### 1. ์‹ค์‹œ๊ฐ„ ์ฐจํŠธ & ํ‹ฑ ์‹œ๊ณ„์—ด ๋ธ”๋ก (`realtime-chart`)
25
+ - **๋ถ„๋ฅ˜**: `chart` (Analytics & FinTech)
26
+ - **์กฐ๋ฆฝ ์ปดํฌ๋„ŒํŠธ**: `Card`, `Button`, `Badge`
27
+ - **์ฃผ์ž… ํ† ํฐ**: `--text-primary`, `--bg-primary`, `--border-subtle`, `--radius`
28
+ - **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**:
29
+ - 1์ดˆ ๋‹จ์œ„ ์‹ค์‹œ๊ฐ„ ํ‹ฑ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ (์žฌ์ƒ/์ผ์‹œ์ •์ง€ ํ† ๊ธ€)
30
+ - 0KB ์ˆœ์ˆ˜ SVG ๊ธฐ๋ฐ˜ ๋ผ์ธ ์ฐจํŠธ ๋ฐ ์บ”๋“ค์Šคํ‹ฑ(Candle) ๋ชจ๋“œ ์ „ํ™˜
31
+ - ์‹œ๊ฐ„ ๋ฒ”์œ„ ํ•„ํ„ฐ (1m, 5m, 1h, 1d) ๋ฐ 24h High/Low/Volume ์š”์•ฝ ์Šคํƒฏ
32
+ - **๊ฒฐํ•ฉ ํ…œํ”Œ๋ฆฟ**: SaaS ์„ฑ๊ณผ ๋ถ„์„ ๋Œ€์‹œ๋ณด๋“œ ๋ฉ”์ธ ์บ”๋ฒ„์Šค, ๊ธˆ์œต ์ž์‚ฐ ๋ชจ๋‹ˆํ„ฐ๋ง ํ™”๋ฉด
33
+
34
+ ### 2. ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ AI ์ฑ— & ๋ฉ”์‹ ์ € ๋ธ”๋ก (`interactive-chat`)
35
+ - **๋ถ„๋ฅ˜**: `chat` (AI Assistant & Messenger)
36
+ - **์กฐ๋ฆฝ ์ปดํฌ๋„ŒํŠธ**: `Card`, `Input`, `Button`, `Badge`
37
+ - **์ฃผ์ž… ํ† ํฐ**: `--text-primary`, `--bg-primary`, `--border-subtle`, `--radius`
38
+ - **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**:
39
+ - ๋ฐœ์‹ /์ˆ˜์‹  ๋งํ’์„  ์ •๋ ฌ (์†ก์‹ ์ž: ์šฐ์ธก ๊ณ ๋Œ€๋น„, ์ˆ˜์‹ ์ž: ์ขŒ์ธก ์„œํ”ผ์Šค)
40
+ - ์ž์ฃผ ๋ฌป๋Š” ์งˆ๋ฌธ(FAQ) ์›ํด๋ฆญ ๋น ๋ฅธ ์ „์†ก ์ œ์•ˆ ์นฉ (๊ฐ€๋กœ ์Šคํฌ๋กค)
41
+ - ํƒ€์ดํ•‘ ์ค‘ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ธ๋””์ผ€์ดํ„ฐ ๋ฐ ์ž๋™ ์Šคํฌ๋กค(Auto-scroll)
42
+ - **๊ฒฐํ•ฉ ํ…œํ”Œ๋ฆฟ**: ์˜จ๋””๋งจ๋“œ AI ์ฝ”ํŒŒ์ผ๋Ÿฟ ๋“œ๋กœ์–ด, 1:1 ๊ณ ๊ฐ ์ƒ๋‹ด ์„ผํ„ฐ ํ™”๋ฉด
43
+
44
+ ### 3. ํ”Œ๋žœ ๋น„๊ต & ๊ฐ€๊ฒฉ ์ •์ฑ… ๋ธ”๋ก (`pricing-table`)
45
+ - **๋ถ„๋ฅ˜**: `pricing` (Conversion & Subscriptions)
46
+ - **์กฐ๋ฆฝ ์ปดํฌ๋„ŒํŠธ**: `Card`, `Button`, `Badge`
47
+ - **์ฃผ์ž… ํ† ํฐ**: `--text-primary`, `--bg-primary`, `--border-subtle`, `--border-strong`
48
+ - **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**:
49
+ - ์›”๊ฐ„ / ์—ฐ๊ฐ„(20% ํ• ์ธ) ๊ฒฐ์ œ ์ฃผ๊ธฐ ์›ํด๋ฆญ ํ† ๊ธ€ ์Šค์œ„์น˜ ๋ฐ ๊ธˆ์•ก ์‹ค์‹œ๊ฐ„ ์žฌ๊ณ„์‚ฐ
50
+ - 3๋‹จ๊ณ„ ํ‹ฐ์–ด(Starter, Pro, Enterprise) ๋น„๊ต ๊ตฌ์กฐ
51
+ - ์ถ”์ฒœ ํ”Œ๋žœ(Pro) 1px ๋ณผ๋“œ ๋ณด๋” ํ•˜์ด๋ผ์ดํŠธ ๋ฐ ์›ํด๋ฆญ CTA
52
+ - ํ‹ฐ์–ด๋ณ„ ํฌํ•จ/๋ฏธํฌํ•จ ๊ธฐ๋Šฅ ์ฒดํฌ๋ฆฌ์ŠคํŠธ
53
+ - **๊ฒฐํ•ฉ ํ…œํ”Œ๋ฆฟ**: SaaS ๊ตฌ๋… ๋žœ๋”ฉ ํŽ˜์ด์ง€ ์š”๊ธˆํ‘œ, ์—…๊ทธ๋ ˆ์ด๋“œ ๋ชจ๋‹ฌ
54
+
55
+ ### 4. ๋ฐ˜์‘ํ˜• ํ•„ํ„ฐ ์นด๋“œ ์ปฌ๋ ‰์…˜ ๋ธ”๋ก (`card-list`)
56
+ - **๋ถ„๋ฅ˜**: `card` (Showcase & Directory)
57
+ - **์กฐ๋ฆฝ ์ปดํฌ๋„ŒํŠธ**: `Card`, `Button`, `Badge`, `Input`
58
+ - **์ฃผ์ž… ํ† ํฐ**: `--text-primary`, `--bg-primary`, `--border-subtle`
59
+ - **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**:
60
+ - ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰ ์ธํ’‹ ๋ฐ ์นดํ…Œ๊ณ ๋ฆฌ ํ•„ํ„ฐ ํƒญ
61
+ - ๊ทธ๋ฆฌ๋“œ(3์—ด) โ†” ๋ฆฌ์ŠคํŠธ(1์—ด) ๋ทฐํฌํŠธ ์›ํด๋ฆญ ํ† ๊ธ€
62
+ - ๋ถ๋งˆํฌ ํ† ๊ธ€ ๋ฐ ํ˜ธ๋ฒ„ ํ”ผ๋“œ๋ฐฑ
63
+ - **๊ฒฐํ•ฉ ํ…œํ”Œ๋ฆฟ**: ๋ฆฌ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ปดํฌ๋„ŒํŠธ ์นดํƒˆ๋กœ๊ทธ, ์•ฑ์Šคํ† ์–ด ํƒ์ƒ‰๊ธฐ
64
+
65
+ ### 5. ๋น„์šฉ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ & ์บ๋Ÿฌ์…€ ์Šฌ๋ผ์ด๋” ๋ธ”๋ก (`interactive-slider`)
66
+ - **๋ถ„๋ฅ˜**: `slider` (Simulation & Control)
67
+ - **์กฐ๋ฆฝ ์ปดํฌ๋„ŒํŠธ**: `Card`, `Slider`, `Button`, `Badge`
68
+ - **์ฃผ์ž… ํ† ํฐ**: `--text-primary`, `--bg-primary`, `--border-subtle`
69
+ - **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**:
70
+ - ์‚ฌ์šฉ์ž ์ˆ˜/์Šคํ† ๋ฆฌ์ง€ ์šฉ๋Ÿ‰ ์Šฌ๋ผ์ด๋” ์กฐ์ ˆ์— ๋”ฐ๋ฅธ ์‹ค์‹œ๊ฐ„ ๊ฒฌ์  ๋™์  ๊ณ„์‚ฐ๊ธฐ
71
+ - ์Šค์™€์ดํ”„ ๊ฐ€๋Šฅํ•œ ์Šฌ๋ผ์ด๋“œ ์บ๋Ÿฌ์…€ ์‡ผ์ผ€์ด์Šค ํƒญ
72
+ - **๊ฒฐํ•ฉ ํ…œํ”Œ๋ฆฟ**: ํด๋ผ์šฐ๋“œ ์ธํ”„๋ผ ๊ฒฌ์  ๊ณ„์‚ฐ๊ธฐ, ์˜จ๋ณด๋”ฉ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ๊ฐ€์ด๋“œ
73
+
74
+ ### 6. ๋น„์ฆˆ๋‹ˆ์Šค ๋ฉ”ํŠธ๋ฆญ & 4๋Œ€ KPI ์Šคํƒฏ ๋ธ”๋ก (`metric-stats`)
75
+ - **๋ถ„๋ฅ˜**: `stats` (Executive Dashboard)
76
+ - **์กฐ๋ฆฝ ์ปดํฌ๋„ŒํŠธ**: `Card`, `Badge`
77
+ - **์ฃผ์ž… ํ† ํฐ**: `--text-primary`, `--bg-primary`, `--border-subtle`
78
+ - **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**:
79
+ - ๋งค์ถœ, ํ™œ์„ฑ ์œ ์ €, ๊ฐ€๋™๋ฅ , ์ „ํ™˜์œจ 4๋Œ€ ํ•ต์‹ฌ ์ง€ํ‘œ ์š”์•ฝ
80
+ - ์ „์ฃผ ๋Œ€๋น„ ์ฆ๊ฐ ๋ฐฐ์ง€ (+14.8%) ๋ฐ ๋ฏธ๋‹ˆ ์ธ๋ผ์ธ ์ŠคํŒŒํฌ๋ผ์ธ ํŠธ๋ Œ๋“œ
81
+ - **๊ฒฐํ•ฉ ํ…œํ”Œ๋ฆฟ**: ๊ด€๋ฆฌ์ž ๋Œ€์‹œ๋ณด๋“œ ์ƒ๋‹จ ์„œ๋จธ๋ฆฌ, ํ”„๋กœ์ ํŠธ ์˜ค๋ฒ„๋ทฐ
82
+
83
+ ### 7. ํ”„๋กœ๋•์…˜ ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ & ๊ณ„์ธต ํŠธ๋ฆฌ ๋ธ”๋ก (`file-explorer`)
84
+ - **๋ถ„๋ฅ˜**: `files` (Developer Tools)
85
+ - **์กฐ๋ฆฝ ์ปดํฌ๋„ŒํŠธ**: `Card`, `Button`, `Badge`
86
+ - **์ฃผ์ž… ํ† ํฐ**: `--text-primary`, `--bg-primary`, `--border-subtle`
87
+ - **ํ•ต์‹ฌ ๊ธฐ๋Šฅ**:
88
+ - ํด๋” ๊ณ„์ธต ํŠธ๋ฆฌ ์‚ฌ์ด๋“œ๋ฐ” (ํ™•์žฅ/์ถ•์†Œ ์•„์ฝ”๋””์–ธ)
89
+ - ๋””๋ ‰ํ† ๋ฆฌ ๊ฒฝ๋กœ ๋ธŒ๋ ˆ๋“œํฌ๋Ÿผ ๋ฐ ๊ทธ๋ฆฌ๋“œ/๋ฆฌ์ŠคํŠธ ํ† ๊ธ€
90
+ - ํŒŒ์ผ ํ™•์žฅ์ž๋ณ„ ์•„์ด์ฝ˜ ๋งคํ•‘ ๋ฐ ์‹ค์‹œ๊ฐ„ ํŒŒ์ผ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ํŒจ๋„
91
+ - **๊ฒฐํ•ฉ ํ…œํ”Œ๋ฆฟ**: ์›น IDE ์ฝ”๋“œ ํŽธ์ง‘๊ธฐ, ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ๋งค๋‹ˆ์ €
92
+
93
+ ---
94
+
95
+ ## ๐Ÿ›  AI Agent๋ฅผ ์œ„ํ•œ ๋ธ”๋ก ์ƒ์„ฑ ์ง€์นจ
96
+ 1. **์ž„์˜์˜ Tailwind ์ƒ‰์ƒ ํ•˜๋“œ์ฝ”๋”ฉ ์—„๊ฒฉ ๊ธˆ์ง€**:
97
+ - `text-blue-500`, `bg-gray-100` ๋Œ€์‹  ์‹œ๋งจํ‹ฑ ํ† ํฐ `text-(--text-primary)`, `bg-(--bg-primary)`, `border-(--border-subtle)`์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
98
+ 2. **์›์‹œ `<button>` ๋‚ ๋ฆผ ํƒœ๊ทธ ๊ธˆ์ง€**:
99
+ - ๋ธ”๋ก ๋‚ด๋ถ€์˜ ๋ชจ๋“  ์•ก์…˜ ๋ฒ„ํŠผ์€ `components/ui/Button.tsx`์˜ `<Button variant="primary|secondary|outline|ghost">` ์ปดํฌ๋„ŒํŠธ๋กœ ์กฐ๋ฆฝํ•ฉ๋‹ˆ๋‹ค.
100
+ 3. **์ƒํƒœ ํ”ผ๋“œ๋ฐฑ ๋ณด์žฅ**:
101
+ - ๋กœ๋”ฉ, ๋นˆ ๋ฐ์ดํ„ฐ(Empty State), ํ™œ์„ฑ/๋น„ํ™œ์„ฑ ์ƒํƒœ๋ฅผ ๋ฐ˜๋“œ์‹œ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
@@ -0,0 +1,142 @@
1
+ # ๐Ÿงฑ AtomSystem UI Components Guide (atom.components.md)
2
+
3
+ > W3C DTCG ํ‘œ์ค€ ํ† ํฐ๊ณผ ๊ฒฐํ•ฉ๋œ ๊ณ ์ ‘๊ทผ์„ฑ 0KB ๋Ÿฐํƒ€์ž„ UI ์›์ž/๋ถ„์ž ์ปดํฌ๋„ŒํŠธ ๊ทœ๊ฒฉ์„œ์ž…๋‹ˆ๋‹ค.
4
+ > ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋Š” `components/ui/`์—์„œ importํ•˜์—ฌ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
5
+
6
+ ---
7
+
8
+ ## ๐Ÿ“ฆ ์ปดํฌ๋„ŒํŠธ ๋ชฉ๋ก ๋ฐ ์‚ฌ์šฉ๋ฒ•
9
+
10
+ ### 1. Button (`components/ui/Button.tsx`)
11
+ ```tsx
12
+ import { Button } from '@/components/ui';
13
+
14
+ <Button variant="primary" size="md">ํ™•์ธ</Button>
15
+ <Button variant="secondary">๋ณด์กฐ ์•ก์…˜</Button>
16
+ <Button variant="outline">ํ…Œ๋‘๋ฆฌ ๋ฒ„ํŠผ</Button>
17
+ <Button variant="ghost">๊ณ ์ŠคํŠธ ๋ฒ„ํŠผ</Button>
18
+ <Button variant="destructive">์‚ญ์ œ</Button>
19
+ <Button loading>์ฒ˜๋ฆฌ ์ค‘...</Button>
20
+ ```
21
+ - **Variants**: `primary`, `secondary`, `outline`, `ghost`, `destructive`
22
+ - **Sizes**: `sm`, `md`, `lg`
23
+ - **A11y**: `aria-disabled`, ํ‚ค๋ณด๋“œ ์—”ํ„ฐ/์ŠคํŽ˜์ด์Šค ํฌ์ปค์Šค ๋ง ๋ณด์žฅ
24
+
25
+ ### 2. Card (`components/ui/Card.tsx`)
26
+ ```tsx
27
+ import { Card } from '@/components/ui';
28
+
29
+ <Card className="p-5 border border-(--border-subtle) bg-(--bg-primary)">
30
+ <h3>์นด๋“œ ์ œ๋ชฉ</h3>
31
+ <p>์นด๋“œ ๋ณธ๋ฌธ</p>
32
+ </Card>
33
+ ```
34
+ - 1px ์‹œ๋งจํ‹ฑ ๋ณด๋”์™€ ํ† ํฐ ๊ธฐ๋ฐ˜ ๊ณก๋ฅ (`--radius`) ์ ์šฉ
35
+
36
+ ### 3. Badge (`components/ui/Badge.tsx`)
37
+ ```tsx
38
+ import { Badge } from '@/components/ui';
39
+
40
+ <Badge variant="primary">์ถ”์ฒœ</Badge>
41
+ <Badge variant="secondary">์ผ๋ฐ˜</Badge>
42
+ <Badge variant="success">+14.8%</Badge>
43
+ <Badge variant="warning">์ ๊ฒ€ ์˜ˆ์ •</Badge>
44
+ <Badge variant="destructive">์‹คํŒจ</Badge>
45
+ ```
46
+
47
+ ### 4. Input (`components/ui/Input.tsx`)
48
+ ```tsx
49
+ import { Input } from '@/components/ui';
50
+
51
+ <Input
52
+ placeholder="์ด๋ฉ”์ผ ์ฃผ์†Œ ์ž…๋ ฅ"
53
+ status="default" // "error" | "success"
54
+ errorMessage="์˜ฌ๋ฐ”๋ฅธ ์ด๋ฉ”์ผ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค."
55
+ />
56
+ ```
57
+
58
+ ### 5. Table (`components/ui/Table.tsx`)
59
+ ```tsx
60
+ import { Table, TableHeader, TableBody, TableRow, TableHead, TableCell } from '@/components/ui';
61
+
62
+ <Table>
63
+ <TableHeader>
64
+ <TableRow>
65
+ <TableHead>์‚ฌ์šฉ์ž</TableHead>
66
+ <TableHead>ํ”Œ๋žœ</TableHead>
67
+ <TableHead>์ƒํƒœ</TableHead>
68
+ </TableRow>
69
+ </TableHeader>
70
+ <TableBody>
71
+ <TableRow>
72
+ <TableCell>ํ™๊ธธ๋™</TableCell>
73
+ <TableCell>Pro</TableCell>
74
+ <TableCell><Badge variant="success">ํ™œ์„ฑ</Badge></TableCell>
75
+ </TableRow>
76
+ </TableBody>
77
+ </Table>
78
+ ```
79
+
80
+ ### 6. Tabs (`components/ui/Tabs.tsx`)
81
+ ```tsx
82
+ import { TabsList, TabsTrigger } from '@/components/ui';
83
+
84
+ <TabsList>
85
+ <TabsTrigger active={tab === '1'} onClick={() => setTab('1')}>์›”๊ฐ„</TabsTrigger>
86
+ <TabsTrigger active={tab === '2'} onClick={() => setTab('2')}>์—ฐ๊ฐ„</TabsTrigger>
87
+ </TabsList>
88
+ ```
89
+
90
+ ### 7. Switch (`components/ui/Switch.tsx`)
91
+ ```tsx
92
+ import { Switch } from '@/components/ui';
93
+
94
+ <Switch checked={enabled} onChange={setEnabled} label="์•Œ๋ฆผ ๋ฐ›๊ธฐ" />
95
+ ```
96
+
97
+ ### 8. Modal (`components/ui/Modal.tsx`)
98
+ ```tsx
99
+ import { Modal } from '@/components/ui';
100
+
101
+ <Modal isOpen={isOpen} onClose={() => setIsOpen(false)} title="ํ™•์ธ">
102
+ <p>์ •๋ง ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?</p>
103
+ </Modal>
104
+ ```
105
+ - **A11y**: `role="dialog"`, `aria-modal="true"`, ESC ํ‚ค ๋ˆ„๋ฆ„ ์‹œ ์ž๋™ ๋‹ซ๊ธฐ
106
+
107
+ ### 9. Container (`components/ui/Container.tsx`)
108
+ ```tsx
109
+ import { Container } from '@/components/ui';
110
+
111
+ <Container size="xl" gutters center>
112
+ <h1>๋Œ€์‹œ๋ณด๋“œ</h1>
113
+ </Container>
114
+ ```
115
+ - **์—ฐ๋™ ํ† ํฐ**: `--atom-container-sm` (640px), `--atom-container-md` (768px), `--atom-container-lg` (1024px), `--atom-container-xl` (1280px), `--atom-container-2xl` (1536px), `--atom-layout-gutter` (16px/24px)
116
+ - **์šฉ๋„**: ๋ชจ๋“  ํŽ˜์ด์ง€์˜ ํ‘œ์ค€ ๊ฐ€๋กœํญ ๋ฐ ์•ˆ์ „ ์—ฌ๋ฐฑ ํ†ต์ผ (ํ•˜๋“œ์ฝ”๋”ฉ ๊ธˆ์ง€)
117
+
118
+ ### 10. Layout (`components/ui/Layout.tsx`)
119
+ ```tsx
120
+ import { Layout, Container, Stack, Grid, Section } from '@/components/ui';
121
+
122
+ <Layout>
123
+ <Layout.Header sticky>ํ—ค๋” ๋„ค๋น„๋ฐ”</Layout.Header>
124
+ <Layout.Content>
125
+ <Container size="xl">
126
+ <Section spacing="md">
127
+ <Stack gap="6">
128
+ <Grid cols={3} gap="4">
129
+ <Card>1</Card>
130
+ <Card>2</Card>
131
+ <Card>3</Card>
132
+ </Grid>
133
+ </Stack>
134
+ </Section>
135
+ </Container>
136
+ </Layout.Content>
137
+ <Layout.Footer>ํ‘ธํ„ฐ</Layout.Footer>
138
+ </Layout>
139
+ ```
140
+ - **์—ฐ๋™ ํ† ํฐ**: `--atom-space-*` (4px, 8px, 12px, 16px, 24px, 32px), `Section` spacing ํ† ํฐ
141
+ - **์šฉ๋„**: ์ „์—ญ ํŽ˜์ด์ง€ ์‰˜ ๊ตฌ์กฐํ™” ๋ฐ ์Šคํƒ/๊ทธ๋ฆฌ๋“œ ๊ธฐ๋ฐ˜์˜ ์ œ๋กœ ํ•˜๋“œ์ฝ”๋”ฉ ์—ฌ๋ฐฑ ๋ฐฐ์น˜
142
+
package/tokens/token.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://design-tokens.github.io/community-group/format/",
3
3
  "name": "AtomDesignToken System",
4
- "version": "0.4.3",
4
+ "version": "0.5.0",
5
5
  "color": {
6
6
  "brand": {
7
7
  "color-primary": {
@@ -290,6 +290,68 @@
290
290
  "variable": "--atom-shadow-xl"
291
291
  }
292
292
  },
293
+ "layout": {
294
+ "container": {
295
+ "sm": {
296
+ "$value": "640px",
297
+ "$type": "dimension",
298
+ "$description": "์ธ์ฆ ํผ, ๊ฒฐ์ œ ๋ชจ๋‹ฌ, ๋‹จ์ผ ์ปฌ๋Ÿผ ์ฝ˜ํ…์ธ ",
299
+ "variable": "--atom-container-sm"
300
+ },
301
+ "md": {
302
+ "$value": "768px",
303
+ "$type": "dimension",
304
+ "$description": "๋ธ”๋กœ๊ทธ ์•„ํ‹ฐํด, ํ”„๋กœํ•„ ๋ทฐ์–ด, ์„ค์ • ํผ",
305
+ "variable": "--atom-container-md"
306
+ },
307
+ "lg": {
308
+ "$value": "1024px",
309
+ "$type": "dimension",
310
+ "$description": "ํ‘œ์ค€ ๋žฉํƒ‘ ๋ทฐ, ์นดํƒˆ๋กœ๊ทธ ์นด๋“œ ๊ทธ๋ฆฌ๋“œ",
311
+ "variable": "--atom-container-lg"
312
+ },
313
+ "xl": {
314
+ "$value": "1280px",
315
+ "$type": "dimension",
316
+ "$description": "๊ธฐ๋ณธ ๋ฐ์Šคํฌํ†ฑ ์™€์ด๋“œ ๋ ˆ์ด์•„์›ƒ ๋ฐ ๋Œ€์‹œ๋ณด๋“œ ํ—ˆ๋ธŒ",
317
+ "variable": "--atom-container-xl"
318
+ },
319
+ "2xl": {
320
+ "$value": "1536px",
321
+ "$type": "dimension",
322
+ "$description": "์ดˆ๊ด‘ํญ ๊ณ ๋ฐ€๋„ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ, ํ•€ํ…Œํฌ ์ฐจํŠธ ์›Œํฌ์ŠคํŽ˜์ด์Šค",
323
+ "variable": "--atom-container-2xl"
324
+ },
325
+ "full": {
326
+ "$value": "100%",
327
+ "$type": "dimension",
328
+ "$description": "์ „์ฒด ํ™”๋ฉด ํ”Œ๋ฃจ์ด๋“œ ์œ ์—ฐ ๋ทฐ์–ด",
329
+ "variable": "--atom-container-full"
330
+ }
331
+ },
332
+ "gutter": {
333
+ "gutter": {
334
+ "$value": "16px",
335
+ "$type": "dimension",
336
+ "$description": "ํ™”๋ฉด ์ขŒ์šฐ ๊ธฐ๋ณธ ์•ˆ์ „ ์—ฌ๋ฐฑ (Safe Padding)",
337
+ "variable": "--atom-layout-gutter"
338
+ },
339
+ "gutter-lg": {
340
+ "$value": "24px",
341
+ "$type": "dimension",
342
+ "$description": "๋ฐ์Šคํฌํ†ฑ ํ™”๋ฉด ์ขŒ์šฐ ์•ˆ์ „ ์—ฌ๋ฐฑ",
343
+ "variable": "--atom-layout-gutter-lg"
344
+ }
345
+ },
346
+ "gap": {
347
+ "gap": {
348
+ "$value": "32px",
349
+ "$type": "dimension",
350
+ "$description": "์„น์…˜๊ณผ ์„น์…˜ ๊ฐ„์˜ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„๊ฒฉ",
351
+ "variable": "--atom-layout-gap"
352
+ }
353
+ }
354
+ },
293
355
  "presets": {
294
356
  "toss": {
295
357
  "name": "ํ† ์Šค ์Šคํƒ€์ผ (Toss)",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://design-tokens.github.io/community-group/format/",
3
3
  "name": "AtomDesignToken System",
4
- "version": "0.4.3",
4
+ "version": "0.5.0",
5
5
  "color": {
6
6
  "brand": {
7
7
  "color-primary": {
@@ -290,6 +290,68 @@
290
290
  "variable": "--atom-shadow-xl"
291
291
  }
292
292
  },
293
+ "layout": {
294
+ "container": {
295
+ "sm": {
296
+ "$value": "640px",
297
+ "$type": "dimension",
298
+ "$description": "์ธ์ฆ ํผ, ๊ฒฐ์ œ ๋ชจ๋‹ฌ, ๋‹จ์ผ ์ปฌ๋Ÿผ ์ฝ˜ํ…์ธ ",
299
+ "variable": "--atom-container-sm"
300
+ },
301
+ "md": {
302
+ "$value": "768px",
303
+ "$type": "dimension",
304
+ "$description": "๋ธ”๋กœ๊ทธ ์•„ํ‹ฐํด, ํ”„๋กœํ•„ ๋ทฐ์–ด, ์„ค์ • ํผ",
305
+ "variable": "--atom-container-md"
306
+ },
307
+ "lg": {
308
+ "$value": "1024px",
309
+ "$type": "dimension",
310
+ "$description": "ํ‘œ์ค€ ๋žฉํƒ‘ ๋ทฐ, ์นดํƒˆ๋กœ๊ทธ ์นด๋“œ ๊ทธ๋ฆฌ๋“œ",
311
+ "variable": "--atom-container-lg"
312
+ },
313
+ "xl": {
314
+ "$value": "1280px",
315
+ "$type": "dimension",
316
+ "$description": "๊ธฐ๋ณธ ๋ฐ์Šคํฌํ†ฑ ์™€์ด๋“œ ๋ ˆ์ด์•„์›ƒ ๋ฐ ๋Œ€์‹œ๋ณด๋“œ ํ—ˆ๋ธŒ",
317
+ "variable": "--atom-container-xl"
318
+ },
319
+ "2xl": {
320
+ "$value": "1536px",
321
+ "$type": "dimension",
322
+ "$description": "์ดˆ๊ด‘ํญ ๊ณ ๋ฐ€๋„ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๋“œ, ํ•€ํ…Œํฌ ์ฐจํŠธ ์›Œํฌ์ŠคํŽ˜์ด์Šค",
323
+ "variable": "--atom-container-2xl"
324
+ },
325
+ "full": {
326
+ "$value": "100%",
327
+ "$type": "dimension",
328
+ "$description": "์ „์ฒด ํ™”๋ฉด ํ”Œ๋ฃจ์ด๋“œ ์œ ์—ฐ ๋ทฐ์–ด",
329
+ "variable": "--atom-container-full"
330
+ }
331
+ },
332
+ "gutter": {
333
+ "gutter": {
334
+ "$value": "16px",
335
+ "$type": "dimension",
336
+ "$description": "ํ™”๋ฉด ์ขŒ์šฐ ๊ธฐ๋ณธ ์•ˆ์ „ ์—ฌ๋ฐฑ (Safe Padding)",
337
+ "variable": "--atom-layout-gutter"
338
+ },
339
+ "gutter-lg": {
340
+ "$value": "24px",
341
+ "$type": "dimension",
342
+ "$description": "๋ฐ์Šคํฌํ†ฑ ํ™”๋ฉด ์ขŒ์šฐ ์•ˆ์ „ ์—ฌ๋ฐฑ",
343
+ "variable": "--atom-layout-gutter-lg"
344
+ }
345
+ },
346
+ "gap": {
347
+ "gap": {
348
+ "$value": "32px",
349
+ "$type": "dimension",
350
+ "$description": "์„น์…˜๊ณผ ์„น์…˜ ๊ฐ„์˜ ๊ธฐ๋ณธ ๋ ˆ์ด์•„์›ƒ ๊ฐ„๊ฒฉ",
351
+ "variable": "--atom-layout-gap"
352
+ }
353
+ }
354
+ },
293
355
  "presets": {
294
356
  "toss": {
295
357
  "name": "ํ† ์Šค ์Šคํƒ€์ผ (Toss)",