@makitt.io/mds-mcp-server 0.1.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/README.md +149 -0
- package/dist/data/catalog.json +10567 -0
- package/dist/data/playbook/ai-fill.md +175 -0
- package/dist/data/playbook/anti-patterns.md +188 -0
- package/dist/data/playbook/array-input.md +249 -0
- package/dist/data/playbook/async-states.md +137 -0
- package/dist/data/playbook/data-grid.md +192 -0
- package/dist/data/playbook/feedback.md +238 -0
- package/dist/data/playbook/form.md +259 -0
- package/dist/data/playbook/overlay.md +222 -0
- package/dist/data/playbook/page-layout.md +222 -0
- package/dist/data/playbook/responsive-tokens.md +191 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +329 -0
- package/dist/index.js.map +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,222 @@
|
|
|
1
|
+
# MDS Playbook — Page Layout (Shell / Sidebar / PageHeader / padding / max-width)
|
|
2
|
+
|
|
3
|
+
페이지 의 layout 약속.
|
|
4
|
+
|
|
5
|
+
> 모든 셀러 admin 페이지가 **같은 layout structure** 따라야 균일. mds 의 shells 활용.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 표준 Page 구조
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
<AppShell>
|
|
13
|
+
<Sidebar>
|
|
14
|
+
{/* nav items */}
|
|
15
|
+
</Sidebar>
|
|
16
|
+
<Page>
|
|
17
|
+
<PageHeader title="..." actions={...} />
|
|
18
|
+
{/* content — section / Card / DataGrid / form 등 */}
|
|
19
|
+
</Page>
|
|
20
|
+
</AppShell>
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
| Shell 컴포넌트 | 역할 | 위치 |
|
|
24
|
+
|---|---|---|
|
|
25
|
+
| `AppShell` | top-level wrapper (Sidebar + Page) | route layout (Next.js) |
|
|
26
|
+
| `Sidebar` | nav menu (sticky left) | desktop left, mobile drawer |
|
|
27
|
+
| `Topbar` (선택) | global header (logo / user / breadcrumb) | top sticky |
|
|
28
|
+
| `Page` | content area | sidebar 우측 |
|
|
29
|
+
| `PageHeader` | title + breadcrumb + actions | content 상단 |
|
|
30
|
+
| `Section` (선택) | content 안 의미 단위 분할 | Page 안 |
|
|
31
|
+
|
|
32
|
+
---
|
|
33
|
+
|
|
34
|
+
## 2. Content max-width — 큰 모니터 대응
|
|
35
|
+
|
|
36
|
+
### 결정 표
|
|
37
|
+
|
|
38
|
+
| 페이지 종류 | max-width | 이유 |
|
|
39
|
+
|---|---|---|
|
|
40
|
+
| **DataGrid list 페이지** (customers / orders) | **full-bleed** (max-width X) | table 의 column 다 보임. 큰 모니터에서 더 좋음 |
|
|
41
|
+
| **단순 form 페이지** (회원가입 / 단일 entity) | **640px** (modal-sm 와 같음) | 가독성 (긴 가로 input 어색) |
|
|
42
|
+
| **복잡 form 페이지** (상품 등록 — Section + AnchorNav) | **content 자체 max-width X**, AnchorNav 좌측 + form 우측 (둘 다 fill) | 큰 form 은 넓은 공간 활용 |
|
|
43
|
+
| **분석 / dashboard** (KPI + chart) | **full-bleed** | grid layout 의 cols 활용 |
|
|
44
|
+
| **정보 페이지** (about / docs / blog) | **800-960px** | 글 가독성 |
|
|
45
|
+
|
|
46
|
+
→ **default = full-bleed**. 가독성 필요한 경우 (form / 정보) 만 max-width.
|
|
47
|
+
|
|
48
|
+
### 이전 발견 (apps/web 의 max-width 답답함)
|
|
49
|
+
|
|
50
|
+
기존 apps/web 의 content 가 `max-w-7xl` (1280px) 같은 작은 fix → 1920px+ 모니터에서 양쪽 빔. **수정 필요**:
|
|
51
|
+
- DataGrid 페이지 → full-bleed
|
|
52
|
+
- form 페이지 → 명시적 max-width (640 or 800)
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## 3. Padding 표준
|
|
57
|
+
|
|
58
|
+
| Level | Padding token | 사용 |
|
|
59
|
+
|---|---|---|
|
|
60
|
+
| Page (content area 의 outer) | `var(--space-6)` ~ `var(--space-8)` (24~32px) | desktop |
|
|
61
|
+
| Page (mobile) | `var(--space-4)` (16px) | mobile |
|
|
62
|
+
| Section gap | `var(--section-gap)` (theme 별 — admin-light = 48px) | section 사이 |
|
|
63
|
+
| Card padding | `var(--space-4)` (16px) — default | Card 안 |
|
|
64
|
+
| Form 안 row gap | `var(--space-3)` (12px) | field 사이 |
|
|
65
|
+
|
|
66
|
+
> Padding 의 mobile 자동 — Page shell 의 prop 또는 SCSS `@media (max-width: 768px)` 분기.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## 4. Sidebar — desktop vs mobile
|
|
71
|
+
|
|
72
|
+
| State | Desktop | Mobile |
|
|
73
|
+
|---|---|---|
|
|
74
|
+
| 항상 표시 | `Sidebar` (sticky left) | drawer (top trigger 의 hamburger menu) |
|
|
75
|
+
| Collapsed (icon only) | `Sidebar collapsed` | drawer + 그대로 |
|
|
76
|
+
| Active route | `Sidebar.SubItem` 의 `data-active="true"` (Sidebar.subItemActive style) | drawer 안 동일 |
|
|
77
|
+
|
|
78
|
+
> Mobile 변환 — `useIsBreakpointUp('lg')` (1024px) — 그 미만 = drawer.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 5. PageHeader 표준
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
<PageHeader
|
|
86
|
+
title="주문"
|
|
87
|
+
description="결제 / 발송 / 환불 관리"
|
|
88
|
+
breadcrumb={[{ label: '홈', href: '/' }, { label: '주문' }]}
|
|
89
|
+
actions={
|
|
90
|
+
<>
|
|
91
|
+
<Button variant="ghost">필터 reset</Button>
|
|
92
|
+
<Button>+ 새 주문</Button>
|
|
93
|
+
</>
|
|
94
|
+
}
|
|
95
|
+
/>
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
| Slot | 사용 |
|
|
99
|
+
|---|---|
|
|
100
|
+
| `title` | h1 — 페이지 이름 |
|
|
101
|
+
| `description` | 부제 (optional) |
|
|
102
|
+
| `breadcrumb` | 위치 (홈 → category → 현 페이지) |
|
|
103
|
+
| `actions` | 우측 primary / secondary buttons (예: "+ 새 주문") |
|
|
104
|
+
| `tabs` | (선택) 페이지 안 sub-section 탭 |
|
|
105
|
+
|
|
106
|
+
> PageHeader 의 actions = **페이지 단위 primary action**. row-level action 은 DataGrid 의 column action.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## 6. Section + AnchorNav (큰 form / 다단 페이지)
|
|
111
|
+
|
|
112
|
+
### 사용 시점 (form.md §2 참조)
|
|
113
|
+
|
|
114
|
+
- 6+ section 의 큰 form (상품 등록)
|
|
115
|
+
- 의미 단위 분명 (기본정보 / 이미지 / 변형 / 가격 / 정책 / 추천 / SEO 등)
|
|
116
|
+
|
|
117
|
+
### Layout
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
<Page>
|
|
121
|
+
<PageHeader title="상품 등록" actions={<Button>저장</Button>} />
|
|
122
|
+
<div style={{ display: 'grid', gridTemplateColumns: '200px 1fr', gap: 'var(--space-6)' }}>
|
|
123
|
+
<AnchorNav sticky>
|
|
124
|
+
<AnchorNav.Item href="#basic">기본 정보</AnchorNav.Item>
|
|
125
|
+
<AnchorNav.Item href="#images">이미지</AnchorNav.Item>
|
|
126
|
+
{/* ... */}
|
|
127
|
+
</AnchorNav>
|
|
128
|
+
<div>
|
|
129
|
+
<Section id="basic" title="기본 정보">...</Section>
|
|
130
|
+
<Section id="images" title="이미지">...</Section>
|
|
131
|
+
{/* ... */}
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
</Page>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
> Mobile — AnchorNav → drawer (top trigger). Section 만 표시 + smooth scroll.
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 7. 결정 표 (lookup)
|
|
142
|
+
|
|
143
|
+
| 케이스 | 답 |
|
|
144
|
+
|---|---|
|
|
145
|
+
| "list 페이지 (DataGrid)" | full-bleed AppShell + PageHeader + DataGrid |
|
|
146
|
+
| "단일 entity form" | AppShell + PageHeader + max-width 640 form |
|
|
147
|
+
| "큰 form (상품 등록)" | AppShell + PageHeader + Section/AnchorNav layout |
|
|
148
|
+
| "dashboard (KPI + chart)" | full-bleed AppShell + Grid cols=4 (KPI) + Grid cols=2 (chart) |
|
|
149
|
+
| "단순 정보 페이지" | AppShell + max-width 800 + body text |
|
|
150
|
+
| "mobile" | Sidebar → drawer (`useIsBreakpointUp('lg')`) + Page padding 축소 |
|
|
151
|
+
| "settings 페이지 (다 section)" | AppShell + PageHeader + Section/AnchorNav (left nav) |
|
|
152
|
+
| "page 안 sub-page tabs" | PageHeader 의 `tabs` slot |
|
|
153
|
+
|
|
154
|
+
---
|
|
155
|
+
|
|
156
|
+
## 8. Mobile 변형
|
|
157
|
+
|
|
158
|
+
| Desktop | Mobile (< lg) |
|
|
159
|
+
|---|---|
|
|
160
|
+
| Sidebar (left sticky) | Drawer (top trigger의 hamburger) |
|
|
161
|
+
| Page padding (24-32px) | Page padding 16px |
|
|
162
|
+
| Section/AnchorNav (2-col) | Section only + AnchorNav drawer |
|
|
163
|
+
| DataGrid (table) | Card list (data-grid.md §3) |
|
|
164
|
+
| PageHeader (1줄) | PageHeader (vertical stack — title / breadcrumb / actions 분리) |
|
|
165
|
+
| max-width 640 form | full-width form |
|
|
166
|
+
|
|
167
|
+
---
|
|
168
|
+
|
|
169
|
+
## 9. 안티 패턴
|
|
170
|
+
|
|
171
|
+
- ❌ **Page 마다 다른 layout** (사용자 mental model 깨짐) — 모든 페이지 같은 AppShell + PageHeader
|
|
172
|
+
- ❌ **DataGrid 페이지에 max-width** — content 가 자연스럽지 못함. full-bleed
|
|
173
|
+
- ❌ **form 페이지에 max-width 없음** — 1920px 의 가로 input 한 줄 어색
|
|
174
|
+
- ❌ **PageHeader 의 actions 가 row-level** (예: row 의 "edit" 버튼) — DataGrid column action
|
|
175
|
+
- ❌ **Sidebar 안 sub-Item 3 단계 이상** — 깊이 제한 (mental load)
|
|
176
|
+
- ❌ **section 사이 gap 의 hardcoded px** — `var(--section-gap)` 사용
|
|
177
|
+
- ❌ **page padding 의 hardcoded** — `var(--space-*)` token
|
|
178
|
+
- ❌ **mobile 에서 Sidebar 그대로 left sticky** — drawer 변환 필수
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 10. Cross-cutting
|
|
183
|
+
|
|
184
|
+
| Axis | 적용 |
|
|
185
|
+
|---|---|
|
|
186
|
+
| **Responsive** | Sidebar → drawer / padding 축소 / Section/AnchorNav 변환 / DataGrid → card list |
|
|
187
|
+
| **A11y** | Sidebar `<nav>` semantic / PageHeader `<h1>` / Breadcrumb aria-label |
|
|
188
|
+
| **i18n** | nav label / title / breadcrumb 모두 `t()` |
|
|
189
|
+
| **Permission** | Sidebar.Item 의 권한별 hide (Step 7 Web Playbook) |
|
|
190
|
+
| **Telemetry** | nav click / page view 자동 log (Step 7) |
|
|
191
|
+
|
|
192
|
+
---
|
|
193
|
+
|
|
194
|
+
## 11. apps/web 의 실 사용 (Step 7 Web Playbook 의 baseline)
|
|
195
|
+
|
|
196
|
+
| Route | Layout |
|
|
197
|
+
|---|---|
|
|
198
|
+
| `/merchant/customers`, `/merchant/orders` etc. | AppShell + PageHeader + DataGrid (full-bleed) |
|
|
199
|
+
| `/merchant/products/new`, `/merchant/products/[id]` | AppShell + PageHeader + Section/AnchorNav (큰 form) |
|
|
200
|
+
| `/merchant/shop/business-info`, `/merchant/account/security` | AppShell + PageHeader + max-width 640 단순 form |
|
|
201
|
+
| `/merchant/dashboard` (home) | AppShell + PageHeader + Grid (KPI / chart) full-bleed |
|
|
202
|
+
| `/merchant/shop` (settings 종합) | AppShell + PageHeader + Section/AnchorNav (다 section) |
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## 12. TBD
|
|
207
|
+
|
|
208
|
+
1. **max-width 정확 px** — form 640? 720? 800? 페이지 종류별 정확 token
|
|
209
|
+
2. **Sidebar collapsed (icon only) trigger** — 자동 (viewport 작음) vs 사용자 button
|
|
210
|
+
3. **PageHeader sticky** — 스크롤 시 항상 위 또는 page top 만
|
|
211
|
+
4. **AnchorNav drawer (mobile)** — top trigger vs bottom Sheet
|
|
212
|
+
5. **Section gap responsive** — desktop 48px / mobile 32px 자동
|
|
213
|
+
6. **container queries** — Page 안 Card 의 internal layout 이 Page width 아닌 Card width 기반
|
|
214
|
+
|
|
215
|
+
---
|
|
216
|
+
|
|
217
|
+
## Related Playbooks
|
|
218
|
+
|
|
219
|
+
- [form.md](./form.md) — page-form / Section + AnchorNav (Step 4.1)
|
|
220
|
+
- [data-grid.md](./data-grid.md) — DataGrid 가 Page 안 위치 (Step 4.3)
|
|
221
|
+
- [overlay.md](./overlay.md) — Modal / Drawer 의 page 위 표시 (Step 4.4)
|
|
222
|
+
- [async-states.md](./async-states.md) — Page-level loading / error (Step 4.7)
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# MDS Playbook — Responsive Tokens
|
|
2
|
+
|
|
3
|
+
mds 의 "Responsive by default" 의 token 측 구현 — caller 의 코드 변경 없이 mobile 별 visual scale 자동 적용.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## 1. 결정 — 2 방식 의 조합
|
|
8
|
+
|
|
9
|
+
| 방식 | 적용 | 의도 |
|
|
10
|
+
|---|---|---|
|
|
11
|
+
| **Token responsive** (CSS @media) | 단순 visual scale (font-size / spacing) | caller 코드 변경 없이 자동 |
|
|
12
|
+
| **JS breakpoint hook** (`useBreakpoint`) | layout 분기 (DataGrid → card list 같은 큰 변형) | 의도 명시 + reactive |
|
|
13
|
+
| **Tailwind utility** (`text-3xl md:text-4xl`) | 페이지 별 override 또는 의도된 단계 | caller 명시 |
|
|
14
|
+
|
|
15
|
+
> **default = token responsive** (자동). 큰 layout 변형 만 hook / utility 명시.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 2. Token 의 `$extensions.mds.responsive`
|
|
20
|
+
|
|
21
|
+
W3C DTCG 표준 의 `$extensions` field 활용 — vendor 별 metadata.
|
|
22
|
+
|
|
23
|
+
```jsonc
|
|
24
|
+
// packages/mds/src/tokens/global/typography.json
|
|
25
|
+
"3xl": {
|
|
26
|
+
"$value": "24px",
|
|
27
|
+
"$type": "fontSize",
|
|
28
|
+
"$description": "Tone 1 h1 (Stripe slim). Mobile (max-sm): 20px (0.83x).",
|
|
29
|
+
"$extensions": {
|
|
30
|
+
"mds.responsive": {
|
|
31
|
+
"max-sm": "20px"
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
### 지원 breakpoint key
|
|
38
|
+
|
|
39
|
+
| Key | CSS @media | 의도 |
|
|
40
|
+
|---|---|---|
|
|
41
|
+
| `max-sm` | `(max-width: 639px)` | mobile (< 640px) |
|
|
42
|
+
| `max-md` | `(max-width: 767px)` | mobile + small tablet |
|
|
43
|
+
| `max-lg` | `(max-width: 1023px)` | 모든 portrait device |
|
|
44
|
+
| `max-xl` | `(max-width: 1279px)` | non-wide desktop |
|
|
45
|
+
|
|
46
|
+
> `min-*` 도 추후 추가 가능 (현재 mobile-first compress 만 — desktop 의 base 가 더 큰 size, mobile 이 축소). 의도 다르면 추가 cycle.
|
|
47
|
+
|
|
48
|
+
---
|
|
49
|
+
|
|
50
|
+
## 3. Build pipeline
|
|
51
|
+
|
|
52
|
+
`packages/mds/scripts/lib/formats.ts` 의 `cssThemeFormat` 가 `$extensions.mds.responsive` 인식.
|
|
53
|
+
|
|
54
|
+
### Output 예 (dist/css/global.css)
|
|
55
|
+
|
|
56
|
+
```css
|
|
57
|
+
:root, [data-theme="light"] {
|
|
58
|
+
--text-3xl: 24px;
|
|
59
|
+
--text-4xl: 30px;
|
|
60
|
+
--space-8: 32px;
|
|
61
|
+
--space-12: 48px;
|
|
62
|
+
--space-20: 80px;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@media (max-width: 639px) {
|
|
66
|
+
:root, [data-theme="light"] {
|
|
67
|
+
--space-8: 16px;
|
|
68
|
+
--space-10: 20px;
|
|
69
|
+
--space-12: 24px;
|
|
70
|
+
--space-16: 32px;
|
|
71
|
+
--space-20: 40px;
|
|
72
|
+
--text-3xl: 20px;
|
|
73
|
+
--text-4xl: 24px;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
→ 3 theme (admin-light / admin-dark / marketing) 모두 동일.
|
|
79
|
+
|
|
80
|
+
---
|
|
81
|
+
|
|
82
|
+
## 4. 현재 적용 token
|
|
83
|
+
|
|
84
|
+
### Typography (`typography.json`)
|
|
85
|
+
|
|
86
|
+
| Token | desktop | max-sm (mobile) | 의도 |
|
|
87
|
+
|---|---|---|---|
|
|
88
|
+
| `text-3xl` | 24px | 20px (0.83x) | h1 heading |
|
|
89
|
+
| `text-4xl` | 30px | 24px (0.8x) | display heading |
|
|
90
|
+
| `text-2xl` 이하 | 그대로 | (override 없음) | small 이미 mobile-OK |
|
|
91
|
+
| `display-1/2/3` | `clamp(...)` | (clamp 자체 vw 기반 자동) | marketing hero |
|
|
92
|
+
|
|
93
|
+
### Space (`space.json`)
|
|
94
|
+
|
|
95
|
+
| Token | desktop | max-sm (mobile) | 의도 |
|
|
96
|
+
|---|---|---|---|
|
|
97
|
+
| `space-8` | 32px | 16px (0.5x) | page padding x |
|
|
98
|
+
| `space-10` | 40px | 20px (0.5x) | (특수) |
|
|
99
|
+
| `space-12` | 48px | 24px (0.5x) | section gap (default) |
|
|
100
|
+
| `space-16` | 64px | 32px (0.5x) | large section gap |
|
|
101
|
+
| `space-20` | 80px | 40px (0.5x) | bottom page padding |
|
|
102
|
+
| `space-6` 이하 | 그대로 | (override 없음) | small 이미 mobile-OK |
|
|
103
|
+
|
|
104
|
+
---
|
|
105
|
+
|
|
106
|
+
## 5. Caller — 활용
|
|
107
|
+
|
|
108
|
+
### A. 자동 (default)
|
|
109
|
+
|
|
110
|
+
```tsx
|
|
111
|
+
// 코드 변경 없이 mobile 자동 적용
|
|
112
|
+
<h1 style={{ fontSize: 'var(--text-3xl)' }}>제목</h1>
|
|
113
|
+
<section style={{ marginBottom: 'var(--space-12)' }}>...</section>
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### B. Tailwind 통한 (token reference)
|
|
117
|
+
|
|
118
|
+
```tsx
|
|
119
|
+
<h1 className="text-3xl">제목</h1>
|
|
120
|
+
<section className="mb-12">...</section>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
Tailwind preset 의 `text-3xl` 가 `var(--text-3xl)` reference → 자동 mobile.
|
|
124
|
+
|
|
125
|
+
### C. JS 분기 (큰 layout 변형 만)
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
import { useBreakpoint, useIsBreakpointUp } from '@makitt/mds';
|
|
129
|
+
|
|
130
|
+
const bp = useBreakpoint();
|
|
131
|
+
const isDesktop = useIsBreakpointUp('lg');
|
|
132
|
+
|
|
133
|
+
if (bp === null) return <MobileList />; // < sm
|
|
134
|
+
if (!isDesktop) return <TabletGrid />; // sm 이상 lg 미만
|
|
135
|
+
return <DesktopDataGrid />;
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
> 단순 visual scale (font-size / spacing) 에 hook 사용 = anti-pattern. token responsive 활용.
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## 6. 결정 표 (lookup)
|
|
143
|
+
|
|
144
|
+
| 케이스 | 답 |
|
|
145
|
+
|---|---|
|
|
146
|
+
| "h1 의 mobile 의 size 축소" | token responsive — `$extensions.mds.responsive.max-sm` |
|
|
147
|
+
| "DataGrid → mobile 의 card list" | `useBreakpoint() === null` 의 분기 (큰 변형) |
|
|
148
|
+
| "Sidebar → mobile 의 drawer 모드" | `useIsBreakpointUp('md')` 의 분기 (또는 mds 의 AppShell 자체 처리) |
|
|
149
|
+
| "특정 페이지 의 큰 hero size" | Tailwind `text-4xl md:text-6xl` 또는 token clamp (display-*) |
|
|
150
|
+
| "section gap 의 mobile 축소" | token responsive — `space-12` 의 `max-sm` |
|
|
151
|
+
| "특정 페이지 의 unique padding" | inline / Tailwind utility (token override 보다 caller 직접) |
|
|
152
|
+
|
|
153
|
+
---
|
|
154
|
+
|
|
155
|
+
## 7. 안티 패턴
|
|
156
|
+
|
|
157
|
+
- ❌ **inline JS 분기 의 padding / font-size** (`style={{ padding: bp === null ? 16 : 32 }}`) — token responsive 활용
|
|
158
|
+
- ❌ **DataGrid → card list 전환 의 token 만 의지** — layout 큰 변형 = JS 분기 필요
|
|
159
|
+
- ❌ **token 의 한 size 만 mobile 안 적용** (다른 size 는 mobile 자동 인데) — 일관성. token responsive 의 metadata 통일
|
|
160
|
+
- ❌ **`@media` block 의 직접 inline** (component SCSS 의 `@media (max-width: 640px) { ... }`) — token responsive 가 자동
|
|
161
|
+
- ❌ **breakpoint 의 hardcoded px** (`@media (max-width: 700px)`) — token sm/md/lg/xl 통해
|
|
162
|
+
- ❌ **mobile 의 "고정" size** (clamp 대신 max-sm = 12px 같은 너무 작은) — 사용자 가 읽을 size 보장 (≥ 14px body)
|
|
163
|
+
|
|
164
|
+
---
|
|
165
|
+
|
|
166
|
+
## 8. TBD (별도 cycle)
|
|
167
|
+
|
|
168
|
+
1. **min-* breakpoint** — desktop 이 더 큰 size 의 의도 (mobile-first 보다 의도 다름). 현재 max-* 만
|
|
169
|
+
2. **breakpoint 의 dynamic mapping** — `formats.ts` 의 `RESPONSIVE_BREAKPOINT_QUERIES` 가 hardcoded. `breakpoint.json` read 후 dynamic 가능
|
|
170
|
+
3. **추가 token 의 mobile fallback** — line-height / radius / shadow / icon-size 의 mobile 의도. 추가 token JSON 의 `$extensions` metadata
|
|
171
|
+
4. **Tailwind preset 의 responsive** — Tailwind 의 `text-3xl md:text-4xl` 같은 utility 의 자동 generation (token 의 mobile / desktop 양쪽 활용)
|
|
172
|
+
5. **Storybook viewport addon** — Storybook 의 viewport addon 의 standard viewport 추가 (mobile 375 / tablet 768 / desktop 1280)
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
|
|
176
|
+
## 9. Cross-cutting
|
|
177
|
+
|
|
178
|
+
| Axis | 적용 |
|
|
179
|
+
|---|---|
|
|
180
|
+
| **A11y** | mobile 의 최소 font-size (14px body 기준) + tap target (44x44px 권장) 따로 |
|
|
181
|
+
| **i18n** | 한국어 의 폰 size 별 가독성 (CJK 가 라틴 보다 작은 px 에 어려움) — mobile 의 base 가 너무 작지 않게 |
|
|
182
|
+
| **AI fill** | token 명 의 catalog 가 mds_components_get 통해 (Step 5) — AI 가 `var(--text-3xl)` 자동 권장 |
|
|
183
|
+
| **Catalog** | token / 페이지 별 사용 의 inventory (TBD — 추가 catalog) |
|
|
184
|
+
|
|
185
|
+
---
|
|
186
|
+
|
|
187
|
+
## Related Playbooks
|
|
188
|
+
|
|
189
|
+
- [page-layout.md](./page-layout.md) — Page / Section / Sidebar 의 responsive 변형
|
|
190
|
+
- [data-grid.md](./data-grid.md) — DataGrid → mobile card list 변형 (큰 변형)
|
|
191
|
+
- [form.md](./form.md) — Form 의 mobile 변형 표 (각 § 의 Mobile 컬럼)
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* @makitt/mds-mcp-server — MCP server for mds.
|
|
4
|
+
*
|
|
5
|
+
* AI (Claude Code / Cursor) 가 mds catalog + playbook 자동 query 가능.
|
|
6
|
+
* Fabrication 0 의 최종 layer — 사용자가 mds 의 props / 안티패턴 / 사용 약속 정확 lookup.
|
|
7
|
+
*
|
|
8
|
+
* Tools:
|
|
9
|
+
* - mds_components_list — 모든 컴포넌트 list (layer 필터)
|
|
10
|
+
* - mds_components_get — 특정 컴포넌트 의 full spec (props/types/description)
|
|
11
|
+
* - mds_components_search — text search (name / description / prop)
|
|
12
|
+
* - mds_playbook_list — 모든 Playbook area list
|
|
13
|
+
* - mds_playbook_get — 특정 Playbook 의 content (form / feedback / data-grid 등)
|
|
14
|
+
* - mds_playbook_search — Playbook 의 decision matrix / 안티패턴 검색
|
|
15
|
+
*
|
|
16
|
+
* Transport: stdio (Claude Code / Cursor 호환)
|
|
17
|
+
*
|
|
18
|
+
* Setup:
|
|
19
|
+
* 1. Build: `pnpm build`
|
|
20
|
+
* 2. Claude Code MCP config: ~/.claude/claude_desktop_config.json
|
|
21
|
+
* {
|
|
22
|
+
* "mcpServers": {
|
|
23
|
+
* "mds": { "command": "node", "args": ["/path/to/mds-mcp-server/dist/index.js"] }
|
|
24
|
+
* }
|
|
25
|
+
* }
|
|
26
|
+
*/
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG"}
|