@makitt.io/mds-mcp-server 0.1.2 → 0.2.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 +142 -41
- package/dist/catalog.d.ts +16 -0
- package/dist/catalog.d.ts.map +1 -0
- package/dist/catalog.js +383 -0
- package/dist/catalog.js.map +1 -0
- package/dist/data/catalog.json +42535 -5019
- package/dist/data/playbook/ai-fill.md +62 -49
- package/dist/data/playbook/anti-patterns.md +112 -110
- package/dist/data/playbook/array-input.md +95 -50
- package/dist/data/playbook/async-states.md +71 -61
- package/dist/data/playbook/data-grid.md +177 -80
- package/dist/data/playbook/feedback.md +107 -88
- package/dist/data/playbook/form.md +164 -134
- package/dist/data/playbook/overlay.md +98 -89
- package/dist/data/playbook/page-layout.md +96 -77
- package/dist/data/playbook/responsive-tokens.md +78 -59
- package/dist/data/recipes/admin-list-page.md +86 -0
- package/dist/data/recipes/async-state-section.md +60 -0
- package/dist/data/recipes/dashboard-overview.md +65 -0
- package/dist/data/recipes/detail-drawer.md +69 -0
- package/dist/data/recipes/modal-form.md +67 -0
- package/dist/data/recipes/settings-form-page.md +79 -0
- package/dist/index.d.ts +4 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +25 -339
- package/dist/index.js.map +1 -1
- package/dist/loaders.d.ts +8 -0
- package/dist/loaders.d.ts.map +1 -0
- package/dist/loaders.js +120 -0
- package/dist/loaders.js.map +1 -0
- package/dist/recipes.d.ts +13 -0
- package/dist/recipes.d.ts.map +1 -0
- package/dist/recipes.js +82 -0
- package/dist/recipes.js.map +1 -0
- package/dist/responses.d.ts +8 -0
- package/dist/responses.d.ts.map +1 -0
- package/dist/responses.js +25 -0
- package/dist/responses.js.map +1 -0
- package/dist/text.d.ts +4 -0
- package/dist/text.d.ts.map +1 -0
- package/dist/text.js +20 -0
- package/dist/text.js.map +1 -0
- package/dist/tool-definitions.d.ts +3 -0
- package/dist/tool-definitions.d.ts.map +1 -0
- package/dist/tool-definitions.js +199 -0
- package/dist/tool-definitions.js.map +1 -0
- package/dist/tools.d.ts +4 -0
- package/dist/tools.d.ts.map +1 -0
- package/dist/tools.js +233 -0
- package/dist/tools.js.map +1 -0
- package/dist/types.d.ts +107 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/package.json +20 -16
|
@@ -1,44 +1,48 @@
|
|
|
1
1
|
# MDS Playbook — Feedback (Toast / Notification / Banner / Modal Dialog)
|
|
2
2
|
|
|
3
|
-
사용자에게 메시지 / 알림 / 결정
|
|
3
|
+
사용자에게 메시지 / 알림 / 결정 강제를 적용하는 약속.
|
|
4
4
|
|
|
5
|
-
> 4 채널 명확 분리. **일시 vs 영속 / 인박스 vs 페이지 / 자유 vs 강제** 가 결정
|
|
5
|
+
> 4 채널 명확 분리. **일시 vs 영속 / 인박스 vs 페이지 / 자유 vs 강제** 가 결정
|
|
6
|
+
> 기준.
|
|
6
7
|
|
|
7
8
|
---
|
|
8
9
|
|
|
9
10
|
## 1. 4 채널 의도 분리
|
|
10
11
|
|
|
11
|
-
| 채널
|
|
12
|
-
|
|
13
|
-
| **Toast**
|
|
14
|
-
| **Notification** (영속) | **놓치면 안 되는 경고** (사용자가 명시적 닫을 때까지 유지) | 명시 닫기 또는 action
|
|
15
|
-
| **Banner** (inline)
|
|
16
|
-
| **Modal Dialog**
|
|
12
|
+
| 채널 | 의도 | 사용자 액션 | mental model | 컴포넌트 |
|
|
13
|
+
| ----------------------- | ---------------------------------------------------------- | ---------------------- | -------------------------------------------- | ---------------------------------------------------------------- |
|
|
14
|
+
| **Toast** | **일시적 알림** (1회 표시 후 사라짐) | 무시 가능 | 화면 corner 의 작은 알림 (자동 dismiss 4~6s) | `toast.success/error/info/warning(message, {description})` |
|
|
15
|
+
| **Notification** (영속) | **놓치면 안 되는 경고** (사용자가 명시적 닫을 때까지 유지) | 명시 닫기 또는 action | 화면 상단/사이드의 banner (Inbox 같은 느낌) | `<Notification tone="warning" persistent>` — TBD (mds 추가 예정) |
|
|
16
|
+
| **Banner** (inline) | **페이지 내 inline 안내** (해당 페이지의 상태) | 무시 가능 또는 dismiss | 페이지 내 box (정보/경고/에러) | `<Banner tone="info" variant="soft">` |
|
|
17
|
+
| **Modal Dialog** | **결정 강제** (사용자 응답 받아야 진행) | confirm / cancel 필수 | 작업 중단 + 짧은 결정 | `Modal.confirm / alert / prompt` (overlay.md §5) |
|
|
17
18
|
|
|
18
19
|
### 핵심 차이
|
|
19
20
|
|
|
20
|
-
- **시간** — Toast (일시 4-6s) / Banner (페이지 동안) / Notification (영속) /
|
|
21
|
-
|
|
22
|
-
-
|
|
21
|
+
- **시간** — Toast (일시 4-6s) / Banner (페이지 동안) / Notification (영속) /
|
|
22
|
+
Dialog (응답까지)
|
|
23
|
+
- **위치** — Toast (corner) / Banner (페이지 inline) / Notification (상단/사이드
|
|
24
|
+
inbox) / Dialog (centered overlay)
|
|
25
|
+
- **간섭** — Toast (무시 가능) / Banner (무시 가능) / Notification (명시 닫기) /
|
|
26
|
+
Dialog (응답 필수)
|
|
23
27
|
|
|
24
28
|
---
|
|
25
29
|
|
|
26
30
|
## 2. 결정 표 (lookup)
|
|
27
31
|
|
|
28
|
-
| 케이스
|
|
29
|
-
|
|
30
|
-
| "저장됐어요"
|
|
31
|
-
| "서버 500 에러"
|
|
32
|
-
| "백그라운드 동기화 중"
|
|
33
|
-
| "비밀번호 강도 약함" (input 안 hint)
|
|
34
|
-
| "form 422 검증 에러 요약" (상단)
|
|
35
|
-
| "라이선스 만료 7일 남음" (영속)
|
|
36
|
-
| "결제 카드 만료" (매번 페이지 진입 시)
|
|
37
|
-
| "이 페이지는 베타입니다" (페이지 inline) | `<Banner tone="info" variant="soft">`
|
|
38
|
-
| "정말 삭제할까요?"
|
|
39
|
-
| "환불 사유 입력해주세요"
|
|
40
|
-
| "주문 완료" 페이지 진입 시 일회성
|
|
41
|
-
| "주문 완료" 페이지에 항상 표시
|
|
32
|
+
| 케이스 | 답 |
|
|
33
|
+
| ---------------------------------------- | -------------------------------------------------------------------------- |
|
|
34
|
+
| "저장됐어요" | `toast.success("저장됨")` |
|
|
35
|
+
| "서버 500 에러" | `toast.error("저장 실패", { description: getErrorDisplayMessage(error) })` |
|
|
36
|
+
| "백그라운드 동기화 중" | `toast.info("동기화 중")` 또는 silent (Step 4.7 async-states) |
|
|
37
|
+
| "비밀번호 강도 약함" (input 안 hint) | `Field.Hint` (form.md §3) |
|
|
38
|
+
| "form 422 검증 에러 요약" (상단) | `<Banner tone="danger">` |
|
|
39
|
+
| "라이선스 만료 7일 남음" (영속) | `<Notification tone="warning" persistent>` (mds 추가 예정) |
|
|
40
|
+
| "결제 카드 만료" (매번 페이지 진입 시) | `<Notification persistent>` 또는 dashboard 의 `<Banner>` |
|
|
41
|
+
| "이 페이지는 베타입니다" (페이지 inline) | `<Banner tone="info" variant="soft">` |
|
|
42
|
+
| "정말 삭제할까요?" | `Modal.confirm` (Dialog) |
|
|
43
|
+
| "환불 사유 입력해주세요" | `Modal.prompt` (Dialog with input) |
|
|
44
|
+
| "주문 완료" 페이지 진입 시 일회성 | `toast.success` (즉시 사라짐) |
|
|
45
|
+
| "주문 완료" 페이지에 항상 표시 | `<Banner tone="success">` (페이지 안 inline) |
|
|
42
46
|
|
|
43
47
|
---
|
|
44
48
|
|
|
@@ -46,12 +50,12 @@
|
|
|
46
50
|
|
|
47
51
|
### Toast tone
|
|
48
52
|
|
|
49
|
-
| Tone
|
|
50
|
-
|
|
51
|
-
| success | 저장 / 완료 / 성공
|
|
52
|
-
| error
|
|
53
|
-
| warning | 주의 / 약한 에러 / 부분 성공
|
|
54
|
-
| info
|
|
53
|
+
| Tone | 사용 | 색 |
|
|
54
|
+
| ------- | ----------------------------- | ----- |
|
|
55
|
+
| success | 저장 / 완료 / 성공 | green |
|
|
56
|
+
| error | 실패 / 5xx / network | red |
|
|
57
|
+
| warning | 주의 / 약한 에러 / 부분 성공 | amber |
|
|
58
|
+
| info | 정보 / 진행 / 백그라운드 알림 | blue |
|
|
55
59
|
|
|
56
60
|
### Toast 패턴
|
|
57
61
|
|
|
@@ -80,8 +84,9 @@ toast.promise(saveOrder(), {
|
|
|
80
84
|
|
|
81
85
|
### Toast 위치
|
|
82
86
|
|
|
83
|
-
- mds 의 `<Toaster position="top-right">` (root layout
|
|
84
|
-
- position 변경 — `Toaster`
|
|
87
|
+
- mds 의 `<Toaster position="top-right">` (root layout 에 mount)
|
|
88
|
+
- position 변경 — `Toaster` prop (top-left / top-right / top-center / bottom-\*
|
|
89
|
+
/ etc.)
|
|
85
90
|
- mobile = top-center 권장 (TBD)
|
|
86
91
|
|
|
87
92
|
---
|
|
@@ -110,20 +115,21 @@ import { Banner } from '@makitt/mds';
|
|
|
110
115
|
|
|
111
116
|
### Banner tone + variant
|
|
112
117
|
|
|
113
|
-
| Tone
|
|
114
|
-
|
|
115
|
-
| info
|
|
116
|
-
| success
|
|
117
|
-
| warning
|
|
118
|
-
| danger
|
|
119
|
-
| (각 tone) | solid
|
|
120
|
-
| (각 tone) | outline
|
|
118
|
+
| Tone | variant | 의도 |
|
|
119
|
+
| --------- | -------------- | --------------------------------------- |
|
|
120
|
+
| info | soft (default) | 일반 정보 안내 |
|
|
121
|
+
| success | soft | 페이지 단위 성공 (예: "주문 완료") |
|
|
122
|
+
| warning | soft | 주의 / 만료 임박 |
|
|
123
|
+
| danger | soft | 페이지 에러 / 결제 만료 |
|
|
124
|
+
| (각 tone) | solid | 강조 — 큰 announcement (시스템 점검 등) |
|
|
125
|
+
| (각 tone) | outline | 약한 정보 |
|
|
121
126
|
|
|
122
127
|
---
|
|
123
128
|
|
|
124
129
|
## 5. Notification (영속) — `overlays/Notification/` (Step 14 완료)
|
|
125
130
|
|
|
126
|
-
영속 알림 inbox + Compound API. `notificationStore` (sessionStorage persist) +
|
|
131
|
+
영속 알림 inbox + Compound API. `notificationStore` (sessionStorage persist) +
|
|
132
|
+
`useNotification()` hook.
|
|
127
133
|
|
|
128
134
|
### Compound API
|
|
129
135
|
|
|
@@ -134,12 +140,15 @@ import { Notification, useNotification } from '@makitt/mds';
|
|
|
134
140
|
<Drawer.Root>
|
|
135
141
|
<Drawer.Trigger>알림</Drawer.Trigger>
|
|
136
142
|
<Drawer.Content side="right">
|
|
137
|
-
<Drawer.Header
|
|
143
|
+
<Drawer.Header>
|
|
144
|
+
<Drawer.Title>알림</Drawer.Title>
|
|
145
|
+
<Drawer.Close />
|
|
146
|
+
</Drawer.Header>
|
|
138
147
|
<Drawer.Body>
|
|
139
|
-
<Notification.Root />
|
|
148
|
+
<Notification.Root /> {/* store-bound list 자동 render */}
|
|
140
149
|
</Drawer.Body>
|
|
141
150
|
</Drawer.Content>
|
|
142
|
-
</Drawer.Root
|
|
151
|
+
</Drawer.Root>;
|
|
143
152
|
|
|
144
153
|
// (B) imperative API — 알림 추가
|
|
145
154
|
const { push, markRead, dismiss, clear } = useNotification();
|
|
@@ -154,11 +163,16 @@ push({
|
|
|
154
163
|
|
|
155
164
|
### 핵심
|
|
156
165
|
|
|
157
|
-
- **`overlays/Notification/`** layer — 알림 센터 는 Drawer / Popover overlay 안
|
|
158
|
-
|
|
159
|
-
- **`
|
|
160
|
-
|
|
161
|
-
-
|
|
166
|
+
- **`overlays/Notification/`** layer — 알림 센터 는 Drawer / Popover overlay 안
|
|
167
|
+
mount (caller 위치 결정, mds 강요 X)
|
|
168
|
+
- **`notificationStore`** — sessionStorage persist (새 session 시 자동 clear,
|
|
169
|
+
동일 session 의 dismiss state 유지)
|
|
170
|
+
- **`useNotification()`** hook — items / unreadCount / push / markRead /
|
|
171
|
+
markAllRead / dismiss / clear
|
|
172
|
+
- **Compound parts** — `Notification.Root` (store-bound list + header + auto
|
|
173
|
+
empty state)
|
|
174
|
+
- **4 level** — info / success / warning / danger (axe-pass: `role="alert"` for
|
|
175
|
+
warning/danger, `role="status"` for info/success)
|
|
162
176
|
|
|
163
177
|
### Banner 와 차이
|
|
164
178
|
|
|
@@ -169,24 +183,25 @@ push({
|
|
|
169
183
|
### TBD (별도 cycle)
|
|
170
184
|
|
|
171
185
|
- Server-side dismiss persistence (현재 = sessionStorage client only)
|
|
172
|
-
- Sub-component 분리 export (`Notification.Header`, `Notification.Item`,
|
|
186
|
+
- Sub-component 분리 export (`Notification.Header`, `Notification.Item`,
|
|
187
|
+
`Notification.EmptyState`)
|
|
173
188
|
|
|
174
189
|
---
|
|
175
190
|
|
|
176
191
|
## 6. Modal Dialog — 결정 강제 (overlay.md §5 참조)
|
|
177
192
|
|
|
178
|
-
| Dialog
|
|
179
|
-
|
|
193
|
+
| Dialog | 사용 |
|
|
194
|
+
| --------------- | -------------------------------------- |
|
|
180
195
|
| `Modal.confirm` | 위험 액션 ("정말 삭제?"), 영향 큰 결정 |
|
|
181
|
-
| `Modal.alert`
|
|
182
|
-
| `Modal.prompt`
|
|
196
|
+
| `Modal.alert` | 정보 알림 (응답 필수 — 그러나 OK 만) |
|
|
197
|
+
| `Modal.prompt` | 단일 input + 응답 |
|
|
183
198
|
|
|
184
199
|
### Dialog vs Toast
|
|
185
200
|
|
|
186
|
-
| 의도
|
|
187
|
-
|
|
188
|
-
| 사용자 결정 받아야 진행
|
|
189
|
-
| 알림만 (사용자 응답 필요 X) | **Toast**
|
|
201
|
+
| 의도 | 채널 |
|
|
202
|
+
| --------------------------- | ---------- |
|
|
203
|
+
| 사용자 결정 받아야 진행 | **Dialog** |
|
|
204
|
+
| 알림만 (사용자 응답 필요 X) | **Toast** |
|
|
190
205
|
|
|
191
206
|
→ Toast 로 "OK" 응답 받지 말 것. Dialog 가 정답.
|
|
192
207
|
|
|
@@ -194,39 +209,40 @@ push({
|
|
|
194
209
|
|
|
195
210
|
## 7. Mobile 변형
|
|
196
211
|
|
|
197
|
-
| 채널
|
|
198
|
-
|
|
199
|
-
| Toast
|
|
200
|
-
| Banner
|
|
201
|
-
| Notification | top of viewport (sidebar inbox X)
|
|
202
|
-
| Dialog
|
|
212
|
+
| 채널 | Mobile 변형 |
|
|
213
|
+
| ------------ | ---------------------------------------------- |
|
|
214
|
+
| Toast | position = top-center (default top-right 대신) |
|
|
215
|
+
| Banner | full-width, padding 줄임 |
|
|
216
|
+
| Notification | top of viewport (sidebar inbox X) |
|
|
217
|
+
| Dialog | 그대로 또는 bottom Sheet (Step 4.4 overlay) |
|
|
203
218
|
|
|
204
219
|
---
|
|
205
220
|
|
|
206
221
|
## 8. 안티 패턴
|
|
207
222
|
|
|
208
|
-
- ❌ **Toast 로 "정말 삭제?"** — Toast 는 dismissible. 응답 못 받음. **Dialog 가
|
|
223
|
+
- ❌ **Toast 로 "정말 삭제?"** — Toast 는 dismissible. 응답 못 받음. **Dialog 가
|
|
224
|
+
정답**
|
|
209
225
|
- ❌ **Notification 으로 "저장됨"** — 영속 의도 아님. **Toast 가 정답**
|
|
210
226
|
- ❌ **Banner 와 Toast 동일 메시지 동시** — 한 곳만
|
|
211
|
-
- ❌ **Toast 5+ 동시** — 사용자
|
|
227
|
+
- ❌ **Toast 5+ 동시** — 사용자 인지 한계. mds 의 stacking 제한 활용
|
|
212
228
|
- ❌ **Dialog 안 form (input multiple)** — `Modal.prompt` 또는 form Modal
|
|
213
229
|
- ❌ **Banner 의 너무 긴 텍스트** (2 줄 이상) — collapse 또는 Modal 로
|
|
214
|
-
- ❌ **영속 Notification
|
|
230
|
+
- ❌ **영속 Notification 에 dismiss 없음** — 사용자가 직접 닫을 수 있어야 (a11y)
|
|
215
231
|
|
|
216
232
|
---
|
|
217
233
|
|
|
218
234
|
## 9. 일시 vs 영속 의사결정 매트릭스
|
|
219
235
|
|
|
220
|
-
| 시나리오
|
|
221
|
-
|
|
222
|
-
| 저장 success
|
|
223
|
-
| 서버 에러 (한번 발생)
|
|
224
|
-
| 백그라운드 동기화
|
|
225
|
-
| 라이선스 만료 (전체 영향)
|
|
226
|
-
| 결제 카드 만료 (모든 페이지)
|
|
227
|
-
| 이 페이지 특정 상태 (예: 베타)
|
|
228
|
-
| 페이지 안 form 의 422 에러 요약 | —
|
|
229
|
-
| 시스템 점검 announce
|
|
236
|
+
| 시나리오 | 일시 (Toast) | 영속 (Banner / Notification) |
|
|
237
|
+
| ------------------------------- | ------------ | ---------------------------- |
|
|
238
|
+
| 저장 success | ✓ | — |
|
|
239
|
+
| 서버 에러 (한번 발생) | ✓ | — |
|
|
240
|
+
| 백그라운드 동기화 | ✓ | — |
|
|
241
|
+
| 라이선스 만료 (전체 영향) | — | ✓ (Notification) |
|
|
242
|
+
| 결제 카드 만료 (모든 페이지) | — | ✓ (Notification) |
|
|
243
|
+
| 이 페이지 특정 상태 (예: 베타) | — | ✓ (Banner) |
|
|
244
|
+
| 페이지 안 form 의 422 에러 요약 | — | ✓ (Banner) |
|
|
245
|
+
| 시스템 점검 announce | — | ✓ (Banner solid) |
|
|
230
246
|
|
|
231
247
|
> 핵심 — **놓치면 안 되는가** 가 영속 결정. Toast 는 놓쳐도 OK.
|
|
232
248
|
|
|
@@ -234,22 +250,24 @@ push({
|
|
|
234
250
|
|
|
235
251
|
## 10. Cross-cutting
|
|
236
252
|
|
|
237
|
-
| Axis
|
|
238
|
-
|
|
239
|
-
| **Responsive** | Toast position 모바일 변환 / Banner full-width
|
|
240
|
-
| **A11y**
|
|
241
|
-
| **Telemetry**
|
|
242
|
-
| **i18n**
|
|
243
|
-
| **AI fill**
|
|
253
|
+
| Axis | 적용 |
|
|
254
|
+
| -------------- | ------------------------------------------------------------------------------------------------------------------- |
|
|
255
|
+
| **Responsive** | Toast position 모바일 변환 / Banner full-width |
|
|
256
|
+
| **A11y** | `role="status"` (success/info) / `role="alert"` (error/warning) / `aria-live="polite"` (info) / `assertive` (error) |
|
|
257
|
+
| **Telemetry** | error toast / banner click 추적 (Step 7) |
|
|
258
|
+
| **i18n** | 모든 메시지 `t()` 통과 |
|
|
259
|
+
| **AI fill** | AI 가 form 채운 후 `<FormFillApprovalBanner>` (Banner 형태) — Step 4.8 |
|
|
244
260
|
|
|
245
261
|
---
|
|
246
262
|
|
|
247
263
|
## 11. TBD
|
|
248
264
|
|
|
249
|
-
1. **Notification 영속 컴포넌트 mds 추가** — design + mount 위치 + persistence
|
|
265
|
+
1. **Notification 영속 컴포넌트 mds 추가** — design + mount 위치 + persistence
|
|
266
|
+
(sessionStorage / 서버)
|
|
250
267
|
2. **Toast position mobile** — top-center default 자동 변환
|
|
251
268
|
3. **Toast stacking 최대** — 현재 5 권장? 정확 결정
|
|
252
|
-
4. **Dialog 외 영구 alert** (예: 시스템 maintenance) — `<Banner solid>` 또는
|
|
269
|
+
4. **Dialog 외 영구 alert** (예: 시스템 maintenance) — `<Banner solid>` 또는
|
|
270
|
+
별도
|
|
253
271
|
5. **Notification 의 read/unread 상태** — inbox 패턴 (Slack 처럼) 필요 여부
|
|
254
272
|
|
|
255
273
|
---
|
|
@@ -258,5 +276,6 @@ push({
|
|
|
258
276
|
|
|
259
277
|
- [form.md](./form.md) — Form 의 검증 에러 (Banner + Field.Error) (Step 4.1)
|
|
260
278
|
- [overlay.md](./overlay.md) — Modal.confirm / alert / prompt (Step 4.4)
|
|
261
|
-
- [async-states.md](./async-states.md) — Background loading 의 toast vs silent
|
|
279
|
+
- [async-states.md](./async-states.md) — Background loading 의 toast vs silent
|
|
280
|
+
(Step 4.7)
|
|
262
281
|
- [ai-fill.md](./ai-fill.md) — FormFillApprovalBanner (Step 4.8)
|