@ihabdevteam/core 0.252.0 → 0.254.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/CHANGELOG.md +83 -0
- package/dist/components.cjs.js +174 -174
- package/dist/components.esm.css +1 -1
- package/dist/hooks.cjs.js +2 -2
- package/dist/i18n.cjs.js +2 -2
- package/dist/ihabdevteam-core.cjs.js +179 -179
- package/dist/ihabdevteam-core.d.ts +1 -1
- package/dist/packages/core/src/components/Table.css +31 -2
- package/dist/packages/core/src/components/Table.js +76 -33
- package/dist/packages/core/src/i18n/locales/en.json +2 -1
- package/dist/packages/core/src/i18n/locales/ko.json +2 -1
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,89 @@ All notable changes to this project will be documented in this file.
|
|
|
7
7
|
> 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
|
|
8
8
|
> 제 이야기를 못 찾는다.
|
|
9
9
|
|
|
10
|
+
## 0.254.0
|
|
11
|
+
|
|
12
|
+
### 접히는 머리의 **단추 안 단추**를 걷는다 — `Table` (사장님 지시)
|
|
13
|
+
|
|
14
|
+
0.253.0 에서 남겨 둔 자리다. `.table-header` 가 접을 수 있을 때 `role="button"` ·
|
|
15
|
+
`tabIndex=0` 이었는데, **그 안에 이미 진짜 `<button>`("접기"/"펼치기")이 있었다.**
|
|
16
|
+
|
|
17
|
+
- **단추 안 단추** — `role="button"` 안에 초점 받는 단추가 또 있다(HTML·ARIA 위반).
|
|
18
|
+
- **한 가지 일에 탭 정지점이 둘** — 자판으로 도는 사람은 같은 '접기' 를 두 번 잡는다.
|
|
19
|
+
- `.table` 이 `role="table"` 이 된 뒤로는 그 단추가 나무에서 **표의 바로 아래 아이**로 서서
|
|
20
|
+
표의 꼴까지 흐렸다. (56) 전에는 "표 안" 이라는 것 자체가 없었으니 **이 어긋남은 0.253.0 이
|
|
21
|
+
만든 것**이다.
|
|
22
|
+
|
|
23
|
+
이제 머리는 **늘 `caption`** 이다. 역할·정지점·여닫힘(`aria-expanded`)을 **안쪽 진짜 단추**로
|
|
24
|
+
옮겼다 — 여는 것이 그것이니 상태도 그것이 말해야 한다. 손으로 붙이던 `onKeyDown` 은 지웠다:
|
|
25
|
+
진짜 단추라 Enter·Space 는 브라우저가 처리하고, "머리 안 단추에서 누른 키는 그 단추 몫"
|
|
26
|
+
이라는 가드도 저절로 선다.
|
|
27
|
+
|
|
28
|
+
**머리 아무 데나 눌러 접는 손맛은 그대로다** — `onClick` 이 그대로 있고, 안쪽 단추가 낸
|
|
29
|
+
클릭도 머리로 올라와 **한 번만** 불린다.
|
|
30
|
+
|
|
31
|
+
> **markup 이 바뀌었다** — 손 모양·hover 를 `.table-header[role="button"]` 로 잡던 것을
|
|
32
|
+
> `.table-header--clickable` 클래스로 옮겼다(`.table-row--clickable` 과 같은 결). 앱이
|
|
33
|
+
> `.table-header[role="button"]` 을 제 CSS 로 겨누고 있으면 그 줄을 클래스로 바꿔야 한다.
|
|
34
|
+
|
|
35
|
+
> **실측** (놀이터 `#table`, 2026-10-02): 표의 바로 아래 아이가
|
|
36
|
+
> `caption · presentation · rowgroup` 셋뿐이고 그중 `button` 은 없다.
|
|
37
|
+
> `caption > button "접기"` 가 `aria-expanded="true"` 를 들고, 접으면 `펼치기` ·
|
|
38
|
+
> `aria-expanded="false"` 로 뒤집힌다. 머리를 눌러 접고 안쪽 단추로 펴는 길이
|
|
39
|
+
> **각각 한 번씩** 불린다(두 번 불리면 접자마자 다시 펴진다).
|
|
40
|
+
|
|
41
|
+
## 0.253.0
|
|
42
|
+
|
|
43
|
+
### `Table` 이 **진짜 표**가 된다 — 말귀 요청 (56), 사장님 결정 **(가)**
|
|
44
|
+
|
|
45
|
+
전에는 `Table` 에 역할이 하나도 없었다. 그래서 둘이 망가져 있었다.
|
|
46
|
+
|
|
47
|
+
1. **머리 칸의 `aria-sort` 가 통째로 버려졌다.** `columnheader` 는 `row` 안에, 그 `row` 는
|
|
48
|
+
`table` 안에 있어야 뜻이 생긴다. 사슬이 없으니 속성만 달려 있었고, 낭독기는 "이름, 버튼"
|
|
49
|
+
까지만 읽었다 — **눈에는 화살표가 보여** 오래 안 드러났다.
|
|
50
|
+
2. **줄이 `role="button"` 이라 칸이 낱낱으로 안 읽혔다.** 줄이 단추면 안의 칸은 그 단추의
|
|
51
|
+
이름 재료일 뿐이다 — `홍길동 010-1234-5678 2026-09-30 활성` 이 한 호흡에 나갔다.
|
|
52
|
+
|
|
53
|
+
이제 사슬을 잇는다: `table` → (`rowgroup`) → `row` → `cell` · `columnheader`. 자리 잡기를
|
|
54
|
+
위해 씌운 겉싸개(`.table-row-wrap` · `.table-fields-strip`)는 `presentation` 으로 **나무에서
|
|
55
|
+
지운다** — 역할 없는 마디가 한 군데라도 끼면 그 아래가 표의 줄로 안 잡힌다.
|
|
56
|
+
|
|
57
|
+
| 자리 | 전 | 후 |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `.table` | — | `role="table"` (+ 제목과 `aria-labelledby`) |
|
|
60
|
+
| `.table-header` | 접힐 때만 `button` | 접히면 `button`, 아니면 **`caption`** |
|
|
61
|
+
| `.table-fields` · `.table-row` | — | `role="row"` |
|
|
62
|
+
| `.table-cell` | — | `role="cell"` |
|
|
63
|
+
| `.table-field` | `columnheader`(사슬 없음) | `columnheader` (**이제 뜻이 산다**) |
|
|
64
|
+
| 머리 묶음 칸 | — | `columnheader` + `aria-colspan` |
|
|
65
|
+
| 빈 줄 · 기다리는 줄 · 펼친 줄 | 역할 없는 `div` | `row` + `cell`(`aria-colspan`) |
|
|
66
|
+
|
|
67
|
+
**치른 값 — 줄이 "단추" 라는 말을 잃는다.** 고객 목록처럼 **줄 자체가 상세로 가는 유일한 길**
|
|
68
|
+
인 화면에서는 그 말이 실제로 필요하다. 그래서 `tabIndex`·Enter·Space 는 **그대로 두고**,
|
|
69
|
+
`aria-describedby` 로 `줄을 누르면 자세히 봅니다`(`table.rowActionHint`)를 건다 — 줄을 누를 수
|
|
70
|
+
있는 표에서만 그 글을 그린다. 줄 안에 **진짜 단추**를 세우는 쪽은 다음 걸음이고, 그때는 줄
|
|
71
|
+
이름을 알려 주는 prop 이 하나 필요하다(단어 관리 첫 칸이 체크박스라 코어가 줄 이름을 못 읽는다).
|
|
72
|
+
|
|
73
|
+
**`grid` 는 쓰지 않았다** — 그건 화살표로 칸을 옮기는 것까지 약속하는 역할이다(ARIA APG).
|
|
74
|
+
|
|
75
|
+
> **실측으로 확인했다** — jsdom 은 역할 사슬을 셈하지 않으므로 시험만으로는 모른다.
|
|
76
|
+
> 놀이터 `#table` 의 표 열셋을 브라우저 접근성 나무로 읽었다(2026-10-02):
|
|
77
|
+
> `table > rowgroup > row > cell "Alice"`, 체크박스 첫 칸은 `cell > checkbox "Alice"`,
|
|
78
|
+
> 기다리는 줄은 `row > cell > status`, 펼친 줄은 `row > cell > generic`,
|
|
79
|
+
> 머리를 누르면 `이름=ascending`.
|
|
80
|
+
>
|
|
81
|
+
> `display: contents` 인 칸(펼친 자리)이 **나무에서 빠지지 않는다**는 것도 그 자리에서
|
|
82
|
+
> 확인했다 — 빠질까 봐 flex 설정을 안쪽으로 옮길 준비를 했는데, `role` 을 들고 있으면
|
|
83
|
+
> 그대로 선다. 그래서 **자리 잡기를 하나도 안 건드렸다.**
|
|
84
|
+
>
|
|
85
|
+
> **알려진 한계**: 되돌리기 단추와 접을 수 있는 머리가 나무에서 `table` 의 바로 아래
|
|
86
|
+
> 아이로 선다(줄·칸이 잡히는 데는 지장이 없다 — 위 실측). 접을 수 있는 머리는 그 안에
|
|
87
|
+
> 이미 진짜 `<button>`("접기")을 품고 있어 **단추 안 단추**이기도 하다. 그 자리는 따로 본다.
|
|
88
|
+
|
|
89
|
+
> 옛 시험 셋이 `role="button"` 을 글자 그대로 박고 있었다 — 그 역할이 바로 이번에 걷은
|
|
90
|
+
> 것이다. 지키려던 참뜻("누를 것이 없는 표가 헛 정지점을 만들지 않는다")은 `tabIndex` 로
|
|
91
|
+
> 그대로 묻게 고쳤다.
|
|
92
|
+
|
|
10
93
|
## 0.252.0
|
|
11
94
|
|
|
12
95
|
### `6일 남음` 과 `98%` 가 한 카드에 나란히 섰다 — `PassCard`
|