@infomind-ux/infoux-mcp 0.2.0 → 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.
- package/README.md +2 -2
- package/bin/server.js +192 -4
- package/data/icons.json +1291 -0
- package/data/manifest.json +43 -13
- package/data/profiles.json +1 -1
- package/data/references/accessibility.md +22 -1
- package/data/references/art-direction.md +1 -1
- package/data/references/html-semantics.md +56 -12
- package/data/references/krds-components.md +651 -18
- package/data/references/krds-tokens.md +12 -12
- package/data/references/project-profiles.md +1 -1
- package/data/references/release-checklist.md +2 -0
- package/data/references/tailwind-mapping.md +1 -1
- package/data/references/trade-off-rules.md +5 -0
- package/data/rules.json +62 -3
- package/data/snippets/error-page.md +107 -0
- package/data/snippets/footer.md +150 -0
- package/data/snippets/header.md +6 -3
- package/data/snippets/icon.md +102 -0
- package/data/snippets/main-menu.md +78 -11
- package/data/snippets/mobile-menu.md +99 -0
- package/data/snippets/notice-bar.md +85 -0
- package/package.json +1 -1
package/data/manifest.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
|
-
"version": "
|
|
2
|
+
"version": "113663a",
|
|
3
3
|
"generated": "scripts/build-mcp.js",
|
|
4
4
|
"references": [
|
|
5
5
|
{
|
|
6
6
|
"id": "accessibility",
|
|
7
7
|
"file": "accessibility.md",
|
|
8
|
-
"chars":
|
|
8
|
+
"chars": 6196,
|
|
9
9
|
"summary": "KRDS는 **WCAG 2.1 Level AA 이상 + KWCAG 2.1/2.2** 준수를 강제한다. 본 스킬도 이를 그대로 따른다."
|
|
10
10
|
},
|
|
11
11
|
{
|
|
12
12
|
"id": "art-direction",
|
|
13
13
|
"file": "art-direction.md",
|
|
14
|
-
"chars":
|
|
14
|
+
"chars": 12387,
|
|
15
15
|
"summary": "brand.json과 `--font-*` 토큰에 무엇을 넣을지, 표현 수위를 어디까지 열지 판단하는 기준. 수치 정본은 `contracts/art-direction.json`, 팔레트 hex 정본은 `tokens/presets/`이며, 이 문서의 표는 build-art-direct..."
|
|
16
16
|
},
|
|
17
17
|
{
|
|
@@ -29,13 +29,13 @@
|
|
|
29
29
|
{
|
|
30
30
|
"id": "html-semantics",
|
|
31
31
|
"file": "html-semantics.md",
|
|
32
|
-
"chars":
|
|
32
|
+
"chars": 23716,
|
|
33
33
|
"summary": "1. **시맨틱 우선** — 의미가 일치하는 HTML5 태그를 최우선 (`<button>` `<nav>` `<article>` `<dialog>` 등)."
|
|
34
34
|
},
|
|
35
35
|
{
|
|
36
36
|
"id": "krds-components",
|
|
37
37
|
"file": "krds-components.md",
|
|
38
|
-
"chars":
|
|
38
|
+
"chars": 58889,
|
|
39
39
|
"summary": "아래 카탈로그에 없는 컴포넌트는 임의 생성 금지. § \"카탈로그에 없는 컴포넌트 요구 시\" 절차 따름."
|
|
40
40
|
},
|
|
41
41
|
{
|
|
@@ -47,19 +47,19 @@
|
|
|
47
47
|
{
|
|
48
48
|
"id": "krds-tokens",
|
|
49
49
|
"file": "krds-tokens.md",
|
|
50
|
-
"chars":
|
|
50
|
+
"chars": 6945,
|
|
51
51
|
"summary": "색상, 기본 폰트, 브레이크포인트는 이 문서의 토큰을 사용한다. 임의 hex/rgb/hsl 색상 작성은 금지한다. 간격·크기·타이포 스케일·모션·z-index는 토큰 카탈로그 대상이 아니며 CSS/Tailwind 직접값으로 작성한다."
|
|
52
52
|
},
|
|
53
53
|
{
|
|
54
54
|
"id": "project-profiles",
|
|
55
55
|
"file": "project-profiles.md",
|
|
56
|
-
"chars":
|
|
56
|
+
"chars": 8144,
|
|
57
57
|
"summary": "KRDS 체크리스트는 모든 프로젝트에 같은 방식으로 적용하지 않는다. 코드 생성 전 사이트 유형을 먼저 판정하고, 공통 품질 규칙과 조건부 정부/공공 규칙을 분리한다."
|
|
58
58
|
},
|
|
59
59
|
{
|
|
60
60
|
"id": "release-checklist",
|
|
61
61
|
"file": "release-checklist.md",
|
|
62
|
-
"chars":
|
|
62
|
+
"chars": 2373,
|
|
63
63
|
"summary": "자동검사가 통과했다고 배포해도 되는 것은 아니다. `npm run check`는 규칙 위반을 잡을 뿐, \"이 화면이 쓸 만한가\"는 판단하지 못한다."
|
|
64
64
|
},
|
|
65
65
|
{
|
|
@@ -71,13 +71,13 @@
|
|
|
71
71
|
{
|
|
72
72
|
"id": "tailwind-mapping",
|
|
73
73
|
"file": "tailwind-mapping.md",
|
|
74
|
-
"chars":
|
|
74
|
+
"chars": 1713,
|
|
75
75
|
"summary": "INFOUX는 Tailwind v4 `@theme`에 색상과 폰트만 공개한다."
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
"id": "trade-off-rules",
|
|
79
79
|
"file": "trade-off-rules.md",
|
|
80
|
-
"chars":
|
|
80
|
+
"chars": 2127,
|
|
81
81
|
"summary": "좋은 원칙끼리 부딪히는 순간이 실제 작업의 대부분이다. \"접근성도 중요하고 브랜드도 중요하다\"는 말은 결정을 미룰 뿐이다. 아래는 **무엇이 무엇을 이기는지**를 미리 정한 것이다."
|
|
82
82
|
}
|
|
83
83
|
],
|
|
@@ -192,12 +192,24 @@
|
|
|
192
192
|
"chars": 1026,
|
|
193
193
|
"summary": "단일 \"더보기/접기\" 토글. Accordion(다중 그룹)과 달리 단독 토글에 사용."
|
|
194
194
|
},
|
|
195
|
+
{
|
|
196
|
+
"id": "error-page",
|
|
197
|
+
"file": "error-page.md",
|
|
198
|
+
"chars": 4668,
|
|
199
|
+
"summary": "요청한 페이지를 보여줄 수 없을 때(404 · 403 · 500 · 점검) 한 화면으로 보여주는 패턴. 사용자는 이 화면을 구경하러 온 것이 아니라 **빠져나가러** 왔다. 장식보다 탈출 경로가 먼저다."
|
|
200
|
+
},
|
|
195
201
|
{
|
|
196
202
|
"id": "file-upload",
|
|
197
203
|
"file": "file-upload.md",
|
|
198
204
|
"chars": 815,
|
|
199
205
|
"summary": "```html"
|
|
200
206
|
},
|
|
207
|
+
{
|
|
208
|
+
"id": "footer",
|
|
209
|
+
"file": "footer.md",
|
|
210
|
+
"chars": 6338,
|
|
211
|
+
"summary": "페이지 하단 공통 영역. 페이지 shell의 `footer#footer` 랜드마크 안에 쓴다. 사이트 유형에 따라 구성 요소를 덜어 쓰는 패턴이라, 모든 요소를 채우는 것이 목표가 아니다."
|
|
212
|
+
},
|
|
201
213
|
{
|
|
202
214
|
"id": "form",
|
|
203
215
|
"file": "form.md",
|
|
@@ -207,7 +219,7 @@
|
|
|
207
219
|
{
|
|
208
220
|
"id": "header",
|
|
209
221
|
"file": "header.md",
|
|
210
|
-
"chars":
|
|
222
|
+
"chars": 1914,
|
|
211
223
|
"summary": "사이트 유형과 무관하게 사용할 수 있는 공통 헤더 패턴. 브랜드 + 주 메뉴 + 액션 영역을 기본으로 하며, 공식 배너·정부 상징·운영기관 식별자는 공공서비스/공공기관에서 적용 대상이 확인된 경우에만 별도 추가한다."
|
|
212
224
|
},
|
|
213
225
|
{
|
|
@@ -216,6 +228,12 @@
|
|
|
216
228
|
"chars": 1506,
|
|
217
229
|
"summary": "화면 가로 전체를 쓰는 도입 섹션이다. section 자체에 클래스를 얹어 쓰고, 내부 `.container`가 본문 폭을 잡는다. 배경 이미지 위에 텍스트를 얹을 때는 `--scrim`을 함께 쓴다."
|
|
218
230
|
},
|
|
231
|
+
{
|
|
232
|
+
"id": "icon",
|
|
233
|
+
"file": "icon.md",
|
|
234
|
+
"chars": 2888,
|
|
235
|
+
"summary": "카탈로그에 등재된 아이콘만 쓴다. 목록은 `npm run icons:sheet`로 보거나"
|
|
236
|
+
},
|
|
219
237
|
{
|
|
220
238
|
"id": "list",
|
|
221
239
|
"file": "list.md",
|
|
@@ -225,8 +243,14 @@
|
|
|
225
243
|
{
|
|
226
244
|
"id": "main-menu",
|
|
227
245
|
"file": "main-menu.md",
|
|
228
|
-
"chars":
|
|
229
|
-
"summary": "
|
|
246
|
+
"chars": 4419,
|
|
247
|
+
"summary": "드롭다운형·메가형 주 내비게이션. 헤더 안에서 사용한다. 하위 메뉴는 **disclosure 패턴**(버튼이 링크 목록을 열고 닫는다)이다."
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
"id": "mobile-menu",
|
|
251
|
+
"file": "mobile-menu.md",
|
|
252
|
+
"chars": 4161,
|
|
253
|
+
"summary": "헤더 햄버거로 여는 전체 화면 메뉴. 1280px 미만(모바일·태블릿)에서 [주 메뉴](main-menu.md)를 대신한다. 화면 전체를 덮으므로 모달처럼 초점을 가둔다."
|
|
230
254
|
},
|
|
231
255
|
{
|
|
232
256
|
"id": "modal",
|
|
@@ -234,6 +258,12 @@
|
|
|
234
258
|
"chars": 1546,
|
|
235
259
|
"summary": "```html"
|
|
236
260
|
},
|
|
261
|
+
{
|
|
262
|
+
"id": "notice-bar",
|
|
263
|
+
"file": "notice-bar.md",
|
|
264
|
+
"chars": 3230,
|
|
265
|
+
"summary": "페이지 최상단에서 사이트 방문자 모두에게 한 번 알리는 공지. 점검·휴무·운영 변경처럼 **기간이 있는 안내**에 쓴다."
|
|
266
|
+
},
|
|
237
267
|
{
|
|
238
268
|
"id": "pagination",
|
|
239
269
|
"file": "pagination.md",
|
package/data/profiles.json
CHANGED
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
"sectionPaddingMobile": "2.4rem",
|
|
20
20
|
"formRowGap": "1.6rem",
|
|
21
21
|
"tableCellPadding": "1rem",
|
|
22
|
-
"note": "반복 작업 화면. 스크롤과 클릭 수를 줄이는 쪽을 우선한다. 터치
|
|
22
|
+
"note": "반복 작업 화면. 스크롤과 클릭 수를 줄이는 쪽을 우선한다. 터치 입력 기기에서는 44px 하한을 그대로 지키고(R-13), 마우스 기반 데스크탑 화면에는 강제하지 않는다."
|
|
23
23
|
}
|
|
24
24
|
},
|
|
25
25
|
"expressionLevels": {
|
|
@@ -75,6 +75,24 @@ button:focus { outline: 0; }
|
|
|
75
75
|
|
|
76
76
|
**`div/span 클릭 핸들러 패턴` 절대 금지.** 클릭 가능한 요소는 button 또는 a.
|
|
77
77
|
|
|
78
|
+
### 새 창 링크 (KWCAG)
|
|
79
|
+
|
|
80
|
+
`target="_blank"`는 사용자가 예측하지 못한 맥락 전환이다 — **열기 전에 예고한다.**
|
|
81
|
+
|
|
82
|
+
```html
|
|
83
|
+
<!-- 텍스트에 고지 -->
|
|
84
|
+
<a href="..." target="_blank" rel="noopener">이용약관 <span class="sr-only">(새 창 열림)</span></a>
|
|
85
|
+
|
|
86
|
+
<!-- 아이콘으로 고지할 때 — 아이콘은 장식, 고지는 텍스트가 담당 -->
|
|
87
|
+
<a href="..." target="_blank" rel="noopener" aria-label="이용약관 (새 창 열림)">
|
|
88
|
+
이용약관 <i class="icon-external" aria-hidden="true"></i>
|
|
89
|
+
</a>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
- `target="_blank"`에는 `rel="noopener"` 필수
|
|
93
|
+
- 고지는 시각(아이콘·문구)과 스크린리더(`sr-only`·`aria-label`) 양쪽에 전달한다
|
|
94
|
+
- 예고 없는 새 창은 KWCAG 심사에서 걸린다 — 꼭 필요한 곳에만 쓰고, 기본은 같은 창 이동
|
|
95
|
+
|
|
78
96
|
---
|
|
79
97
|
|
|
80
98
|
## 5. 폼 접근성
|
|
@@ -194,6 +212,7 @@ button:focus { outline: 0; }
|
|
|
194
212
|
- `prefers-reduced-motion: reduce` 미디어 쿼리로 **자동 비활성화** — 불필요한 transition·animation은 모션 감소 시 제거
|
|
195
213
|
- **자동 재생 슬라이드/캐러셀 금지** (사용자가 명시 활성화 안 했으면 OFF) — WCAG 2.2.2
|
|
196
214
|
- 자동 재생 시 **일시정지 버튼 필수**
|
|
215
|
+
- **초당 3회를 넘는 번쩍임 금지** — WCAG 2.3.1 / KWCAG 광과민성 발작 예방. 점멸 배너·경고 강조·로딩 효과 전부 해당하며, 예외 없이 금지다
|
|
197
216
|
|
|
198
217
|
```css
|
|
199
218
|
@media (prefers-reduced-motion: reduce) {
|
|
@@ -239,5 +258,7 @@ KRDS는 **light + high-contrast** 두 모드 시스템 차원에서 지원.
|
|
|
239
258
|
- [ ] Skip link 제공?
|
|
240
259
|
- [ ] 다크/고대비 토글 시 깨지지 않음 (raw 색 0건이면 자동)?
|
|
241
260
|
- [ ] `prefers-reduced-motion` 대응?
|
|
261
|
+
- [ ] `target="_blank"` 링크에 새 창 예고 + `rel="noopener"`?
|
|
262
|
+
- [ ] 초당 3회 넘는 번쩍임 0건?
|
|
242
263
|
|
|
243
|
-
위
|
|
264
|
+
위 14개 중 하나라도 No → 작업 미완으로 간주.
|
|
@@ -172,7 +172,7 @@ krds-heritage 용법 제한 — trust-blue의 크림슨 point는 금지 밴드·
|
|
|
172
172
|
5. 근거 없는 통계 히어로·가짜 후기 캐러셀. [owner: art-direction / 수치 근거는 수동 검수]
|
|
173
173
|
6. 직역 마케팅 카피 — "지금 시작하세요"·"당신"·느낌표 남발. [owner: microcopy — 세부 위임]
|
|
174
174
|
7. 어두운 오버레이+중앙 흰 문구+스크롤 화살표 히어로. [owner: art-direction]
|
|
175
|
-
8. 무한 롤링 로고 마키·scroll-jacking·
|
|
175
|
+
8. 무한 롤링 로고 마키·scroll-jacking·500ms 초과 장식 모션·**장식/스크롤 진입 모션의** overshoot easing. 모달·토스트·인풋 전환 같은 컴포넌트 피드백 모션의 Spring 프리셋은 이 금지의 대상이 아니다 — interaction-timing 소유(등급 무관, `contracts/profiles.json` 모션 note). [owner: interaction-timing / R-22]
|
|
176
176
|
9. 요구에 없는 다크모드 토글 — infoUX는 high-contrast 2모드 체계다. [owner: tokens]
|
|
177
177
|
10. weight 700 남발·영문 display 폰트의 한글 fallback 미설계. [owner: art-direction hangul / R-26]
|
|
178
178
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
# HTML 구조 매핑 — KRDS 컴포넌트 28종
|
|
1
|
+
# HTML 구조 매핑 — KRDS 컴포넌트 28종 + infoUX 확장 4종
|
|
2
2
|
|
|
3
|
-
> **단일 소스(SoT).** 28개
|
|
3
|
+
> **단일 소스(SoT).** 28개 KRDS 컴포넌트와 infoUX 확장 4종(`footer` · `mobile-menu` · `notice-bar` · `error-page`)의 Root 태그 · 자식 시맨틱 · 필수 ARIA · 키보드 패턴을 KRDS 표준에 따라 명시한다.
|
|
4
4
|
> 출처: KRDS-uiux v1.0.0 / WAI-ARIA 1.2 Authoring Practices / `src/snippets/*.md` 실측.
|
|
5
5
|
> 본 문서의 매핑과 다른 마크업은 **R-15 위반**으로 자동 차단된다.
|
|
6
6
|
|
|
@@ -77,6 +77,7 @@ Section modifier는 목적 기반 archetype만 사용한다.
|
|
|
77
77
|
| `check-radio` | `.check`, `.radio` | 두 변형이 같은 카테고리, 각자 BEM Block |
|
|
78
78
|
| `form` | `.form-field` | 폼 필드 한 단위가 BEM Block |
|
|
79
79
|
| `header` | `.site-header` | 사이트 헤더 — semantic의 `<header>`와 구분 |
|
|
80
|
+
| `footer` | `.site-footer` | 사이트 푸터 — semantic의 `<footer>`와 구분 |
|
|
80
81
|
| `tooltip` | `.tooltip` (요소), `.tooltip-trigger` (트리거), `.tooltip-wrap` (래퍼) | 세 BEM Block의 협업 |
|
|
81
82
|
| `toast` | `.toast` (개별), `.toast-stack` (컨테이너) | 두 BEM Block |
|
|
82
83
|
| `table` | `.table` (요소), `.table-wrap` (반응형 래퍼) | 두 BEM Block |
|
|
@@ -210,7 +211,7 @@ Section modifier는 목적 기반 archetype만 사용한다.
|
|
|
210
211
|
|
|
211
212
|
---
|
|
212
213
|
|
|
213
|
-
## 3. 그룹 C — 내비게이션 (
|
|
214
|
+
## 3. 그룹 C — 내비게이션 (6종)
|
|
214
215
|
|
|
215
216
|
### `breadcrumb` — 빵부스러기
|
|
216
217
|
|
|
@@ -230,14 +231,35 @@ Section modifier는 목적 기반 archetype만 사용한다.
|
|
|
230
231
|
| 필수 ARIA | 페이지에 nav가 여러 개면 각 nav에 `aria-label` 필수 |
|
|
231
232
|
| 키보드 | Tab 흐름 자연스럽게 (브랜드 → 메뉴 → 유틸) |
|
|
232
233
|
|
|
234
|
+
### `footer` — 사이트 푸터
|
|
235
|
+
|
|
236
|
+
| 항목 | 값 |
|
|
237
|
+
|------|-----|
|
|
238
|
+
| Root 태그 | `<footer id="footer" class="site-footer">` (페이지에 하나, `main` 바깥) |
|
|
239
|
+
| 자식 시맨틱 | `.container` → `div.site-footer__top`(`a.site-footer__brand` · `nav.site-footer__nav aria-label="푸터 메뉴"` → `div.site-footer__group` → `h2.site-footer__heading` + `ul.site-footer__list aria-labelledby`) → `div.site-footer__bottom`(`nav.site-footer__legal aria-label="약관 및 정책"` · `address.site-footer__address` · `small.site-footer__copy` · `details.site-footer__family`) |
|
|
240
|
+
| 필수 ARIA | 푸터 안 `nav`가 여럿이면 각각 `aria-label` · 그룹 목록은 제목 id로 `aria-labelledby` |
|
|
241
|
+
| 키보드 | 네이티브 (Tab) · 패밀리 사이트 `details`는 `Enter`/`Space`로 열고 닫는다 |
|
|
242
|
+
| 금지 | 패밀리 사이트를 `<select>` 선택만으로 이동시키지 않는다(WCAG 3.2.2) · 법정 고지 문구를 지어내지 않는다(R-23) |
|
|
243
|
+
|
|
233
244
|
### `main-menu` — 주 메뉴
|
|
234
245
|
|
|
235
246
|
| 항목 | 값 |
|
|
236
247
|
|------|-----|
|
|
237
|
-
| Root 태그 | `<nav class="main-menu" aria-label="주 메뉴">` |
|
|
238
|
-
| 자식 시맨틱 | `<ul class="main-menu__list">` → `<li class="main-menu__item">` → `<a class="main-menu__link">` / 하위
|
|
239
|
-
| 필수 ARIA | `<nav aria-label>` ·
|
|
240
|
-
|
|
|
248
|
+
| Root 태그 | `<nav class="main-menu" aria-label="주 메뉴">` (메가형은 `.main-menu--mega` 추가) |
|
|
249
|
+
| 자식 시맨틱 | `<ul class="main-menu__list">` → `<li class="main-menu__item">` → `<a class="main-menu__link">` / 하위 패널 트리거는 `<button class="main-menu__toggle" aria-expanded aria-controls="panel-id">`. 패널은 드롭다운 `ul.main-menu__submenu` 또는 메가 `div.main-menu__panel` → `.container.main-menu__groups` → `div.main-menu__group` → `p.main-menu__group-title` + `ul.main-menu__group-list aria-labelledby` |
|
|
250
|
+
| 필수 ARIA | `<nav aria-label>` · 하위 패널 트리거에 `aria-expanded` + `aria-controls`(대상 id 실존) · 현재 페이지에 `aria-current="page"` |
|
|
251
|
+
| 쓰지 않는 것 | `role="menu"` · `role="menuitem"` · `aria-haspopup` — 링크 목록을 여닫는 disclosure 패턴이라 메뉴 위젯 역할을 선언하지 않는다(APG Disclosure Navigation). 선언하면 스크린리더가 방향키 운용을 기대한다 |
|
|
252
|
+
| 키보드 | `Enter`/`Space` 패널 열기·닫기 · `Esc` 패널 닫기 + 토글로 초점 복귀 · `Tab`이 링크를 순서대로 지난다. 방향키 운용은 없다 |
|
|
253
|
+
|
|
254
|
+
### `mobile-menu` — 모바일 메뉴
|
|
255
|
+
|
|
256
|
+
| 항목 | 값 |
|
|
257
|
+
|------|-----|
|
|
258
|
+
| Root 태그 | `<div id="mobile-menu" class="mobile-menu" role="dialog" aria-modal="true" aria-labelledby="mobile-menu-title" hidden>` (`header` 바깥) |
|
|
259
|
+
| 자식 시맨틱 | `div.mobile-menu__header`(`p.mobile-menu__title#mobile-menu-title` · `button.mobile-menu__close aria-label`) → `nav.mobile-menu__nav aria-label="주 메뉴"` → `ul.mobile-menu__list` → `li.mobile-menu__item` → `a.mobile-menu__link` / `details.mobile-menu__group` → `summary.mobile-menu__summary` + `ul.mobile-menu__sublist` |
|
|
260
|
+
| 트리거 | `<button class="site-header__toggle" aria-label="전체 메뉴" aria-expanded aria-controls="mobile-menu" data-mobile-menu-open="mobile-menu">` — 라벨은 고정, 열림은 `aria-expanded`가 전한다 |
|
|
261
|
+
| 필수 ARIA | 패널 `role="dialog"` + `aria-modal="true"` + `aria-labelledby` · 트리거 `aria-expanded` + `aria-controls`(= `data-mobile-menu-open` 값) · 닫기 버튼 `aria-label` |
|
|
262
|
+
| 키보드 | 열림 시 닫기 버튼으로 초점 이동 · `Tab`/`Shift+Tab` 패널 안 순환(포커스 트랩) · `Esc` 닫기 + 트리거로 초점 복귀 · `summary`는 `Enter`/`Space` |
|
|
241
263
|
|
|
242
264
|
### `pagination` — 페이지네이션
|
|
243
265
|
|
|
@@ -250,7 +272,7 @@ Section modifier는 목적 기반 archetype만 사용한다.
|
|
|
250
272
|
|
|
251
273
|
---
|
|
252
274
|
|
|
253
|
-
## 4. 그룹 D — 피드백 (
|
|
275
|
+
## 4. 그룹 D — 피드백 (9종)
|
|
254
276
|
|
|
255
277
|
### `alert` — 알림
|
|
256
278
|
|
|
@@ -261,6 +283,17 @@ Section modifier는 목적 기반 archetype만 사용한다.
|
|
|
261
283
|
| 필수 ARIA | `role="alert"` (assertive) 또는 `role="status"` (polite) · 장식 아이콘에 `aria-hidden="true"` · 닫기 버튼에 `aria-label` |
|
|
262
284
|
| 키보드 | 닫기 버튼 Tab 가능, Enter/Space로 닫기 |
|
|
263
285
|
|
|
286
|
+
### `notice-bar` — 공지 띠
|
|
287
|
+
|
|
288
|
+
| 항목 | 값 |
|
|
289
|
+
|------|-----|
|
|
290
|
+
| Root 태그 | `<section class="notice-bar notice-bar--info" aria-label="사이트 공지" data-notice-id="…">` (건너뛰기 링크 다음, `header#header` 앞) |
|
|
291
|
+
| 자식 시맨틱 | `.container.notice-bar__inner` → `span.notice-bar__label`(분류 텍스트) → `p.notice-bar__message` → `a.notice-bar__link` → `button.notice-bar__close aria-label="공지 닫기"` |
|
|
292
|
+
| 필수 ARIA | `section`의 `aria-label` · 닫기 버튼 `aria-label` · 장식 아이콘 `aria-hidden="true"` |
|
|
293
|
+
| 쓰지 않는 것 | `role="alert"` · `aria-live` — 로드 때 이미 있는 정적 안내라 낭독을 강제하지 않는다. 동적으로 삽입하는 긴급 안내는 `alert`를 쓴다 |
|
|
294
|
+
| 금지 | 자동 전환·롤링·마키(WCAG 2.2.2) · 동시에 둘 이상 노출 · 색만으로 톤 전달(라벨 텍스트 병기) |
|
|
295
|
+
| 키보드 | 링크·닫기 버튼 Tab 가능, Enter/Space로 닫기. 닫은 뒤 초점은 헤더의 첫 링크·버튼으로 옮긴다 |
|
|
296
|
+
|
|
264
297
|
### `badge` — 뱃지
|
|
265
298
|
|
|
266
299
|
| 항목 | 값 |
|
|
@@ -323,7 +356,7 @@ Section modifier는 목적 기반 archetype만 사용한다.
|
|
|
323
356
|
|
|
324
357
|
---
|
|
325
358
|
|
|
326
|
-
## 5. 그룹 E — 콘텐츠/표현 (
|
|
359
|
+
## 5. 그룹 E — 콘텐츠/표현 (5종)
|
|
327
360
|
|
|
328
361
|
### `calendar` — 달력
|
|
329
362
|
|
|
@@ -344,6 +377,17 @@ Section modifier는 목적 기반 archetype만 사용한다.
|
|
|
344
377
|
| 자동 재생 금지 (KRDS) | 사용자가 명시 활성화 안 했으면 OFF. 활성화 시 일시정지 버튼 필수 |
|
|
345
378
|
| 키보드 | `←→` 슬라이드 이동 · `Esc` 또는 일시정지 버튼으로 정지 |
|
|
346
379
|
|
|
380
|
+
### `error-page` — 오류 페이지
|
|
381
|
+
|
|
382
|
+
| 항목 | 값 |
|
|
383
|
+
|------|-----|
|
|
384
|
+
| Root 태그 | `<div class="error-page">` — `main > section > .container` 안의 컴포넌트 루트 (section은 `aria-labelledby`로 `h1`에 연결) |
|
|
385
|
+
| 자식 시맨틱 | `h1.error-page__title`(페이지 `h1` 하나) → `p.error-page__desc` → `div.error-page__actions` → (선택) `form.error-page__search role="search"` → `nav.error-page__help aria-labelledby`(`h2.error-page__help-title` + `ul.error-page__help-list`) → (선택) `p.error-page__contact` · 선택 요소 `.error-page__code` · `.error-page__visual` |
|
|
386
|
+
| 필수 ARIA | 검색 입력에 `<label>` · 바로가기 `nav`에 `aria-labelledby` · 장식 일러스트 `alt=""` |
|
|
387
|
+
| 쓰지 않는 것 | 제목·안내의 `role="alert"` · 움직이는 장식 · 내부 오류 코드를 문장에 노출 |
|
|
388
|
+
| 서버 측 | 실제 HTTP 상태 코드로 응답(soft 404 금지) · 없는 주소를 홈으로 자동 이동하지 않는다 · `<title>`에 오류 명시 + `noindex` |
|
|
389
|
+
| 수위 | 사이트 등급과 무관하게 utility~restrained (art-direction §1 원칙 3) |
|
|
390
|
+
|
|
347
391
|
### `list` — 목록
|
|
348
392
|
|
|
349
393
|
| 항목 | 값 |
|
|
@@ -399,9 +443,9 @@ ARIA로 연결되는 ID는 충돌 방지를 위해 다음 패턴:
|
|
|
399
443
|
- 톤: `--info`, `--success`, `--warning`, `--danger`, `--inverse`
|
|
400
444
|
- 레이아웃: `--horizontal`, `--vertical`, `--block`, `--inline`
|
|
401
445
|
|
|
402
|
-
### 6.4 키보드 트랩 — modal/side-panel만
|
|
446
|
+
### 6.4 키보드 트랩 — modal/side-panel/mobile-menu만
|
|
403
447
|
|
|
404
|
-
`<dialog>` 또는 `role="dialog" aria-modal="true"`에서만 포커스 트랩. 그 외
|
|
448
|
+
`<dialog>` 또는 `role="dialog" aria-modal="true"`에서만 포커스 트랩. 화면 전체를 덮는 모바일 메뉴(`mobile-menu`)도 이에 해당한다. 그 외 컴포넌트(`main-menu` 패널 포함)는 자연스러운 Tab 흐름 유지.
|
|
405
449
|
|
|
406
450
|
### 6.5 라이브 영역 (`aria-live`) 선택 가이드
|
|
407
451
|
|
|
@@ -455,7 +499,7 @@ ARIA로 연결되는 ID는 충돌 방지를 위해 다음 패턴:
|
|
|
455
499
|
|
|
456
500
|
1. **R-14/R-15** — page shell의 skip link, `header#header`, `main#main`, `footer#footer`, `main > section > .container`, section 접근 이름
|
|
457
501
|
2. **R-15** — 컴포넌트 BEM Block(`.card`/`.modal` 등) 사용 시 root 태그가 매핑과 일치하는지
|
|
458
|
-
3. **R-16** — 인터랙티브 컴포넌트(`modal`/`tab`/`accordion`/`tooltip`/`disclosure`/`carousel`/`calendar`)
|
|
502
|
+
3. **R-16** — 인터랙티브 컴포넌트(`modal`/`tab`/`accordion`/`tooltip`/`disclosure`/`carousel`/`calendar`/`mobile-menu`/`notice-bar`)와 disclosure 내비게이션(`main-menu__toggle` · `data-mobile-menu-open` 햄버거)은 필수 ARIA 속성 누락 시 error. 토글에 `aria-haspopup`/`role="menu"`를 붙이면 warn
|
|
459
503
|
4. **R-17** — `.is-*`/`.has-*` 비-BEM 상태 클래스 사용 시 warn → 1개월 후 error 승급
|
|
460
504
|
5. **R-18** — § 6.3 금지 단어 modifier 사용 시 error
|
|
461
505
|
|