@ihabdevteam/core 0.251.0 → 0.253.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 CHANGED
@@ -7,6 +7,88 @@ All notable changes to this project will be documented in this file.
7
7
  > 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
8
8
  > 제 이야기를 못 찾는다.
9
9
 
10
+ ## 0.253.0
11
+
12
+ ### `Table` 이 **진짜 표**가 된다 — 말귀 요청 (56), 사장님 결정 **(가)**
13
+
14
+ 전에는 `Table` 에 역할이 하나도 없었다. 그래서 둘이 망가져 있었다.
15
+
16
+ 1. **머리 칸의 `aria-sort` 가 통째로 버려졌다.** `columnheader` 는 `row` 안에, 그 `row` 는
17
+ `table` 안에 있어야 뜻이 생긴다. 사슬이 없으니 속성만 달려 있었고, 낭독기는 "이름, 버튼"
18
+ 까지만 읽었다 — **눈에는 화살표가 보여** 오래 안 드러났다.
19
+ 2. **줄이 `role="button"` 이라 칸이 낱낱으로 안 읽혔다.** 줄이 단추면 안의 칸은 그 단추의
20
+ 이름 재료일 뿐이다 — `홍길동 010-1234-5678 2026-09-30 활성` 이 한 호흡에 나갔다.
21
+
22
+ 이제 사슬을 잇는다: `table` → (`rowgroup`) → `row` → `cell` · `columnheader`. 자리 잡기를
23
+ 위해 씌운 겉싸개(`.table-row-wrap` · `.table-fields-strip`)는 `presentation` 으로 **나무에서
24
+ 지운다** — 역할 없는 마디가 한 군데라도 끼면 그 아래가 표의 줄로 안 잡힌다.
25
+
26
+ | 자리 | 전 | 후 |
27
+ |---|---|---|
28
+ | `.table` | — | `role="table"` (+ 제목과 `aria-labelledby`) |
29
+ | `.table-header` | 접힐 때만 `button` | 접히면 `button`, 아니면 **`caption`** |
30
+ | `.table-fields` · `.table-row` | — | `role="row"` |
31
+ | `.table-cell` | — | `role="cell"` |
32
+ | `.table-field` | `columnheader`(사슬 없음) | `columnheader` (**이제 뜻이 산다**) |
33
+ | 머리 묶음 칸 | — | `columnheader` + `aria-colspan` |
34
+ | 빈 줄 · 기다리는 줄 · 펼친 줄 | 역할 없는 `div` | `row` + `cell`(`aria-colspan`) |
35
+
36
+ **치른 값 — 줄이 "단추" 라는 말을 잃는다.** 고객 목록처럼 **줄 자체가 상세로 가는 유일한 길**
37
+ 인 화면에서는 그 말이 실제로 필요하다. 그래서 `tabIndex`·Enter·Space 는 **그대로 두고**,
38
+ `aria-describedby` 로 `줄을 누르면 자세히 봅니다`(`table.rowActionHint`)를 건다 — 줄을 누를 수
39
+ 있는 표에서만 그 글을 그린다. 줄 안에 **진짜 단추**를 세우는 쪽은 다음 걸음이고, 그때는 줄
40
+ 이름을 알려 주는 prop 이 하나 필요하다(단어 관리 첫 칸이 체크박스라 코어가 줄 이름을 못 읽는다).
41
+
42
+ **`grid` 는 쓰지 않았다** — 그건 화살표로 칸을 옮기는 것까지 약속하는 역할이다(ARIA APG).
43
+
44
+ > **실측으로 확인했다** — jsdom 은 역할 사슬을 셈하지 않으므로 시험만으로는 모른다.
45
+ > 놀이터 `#table` 의 표 열셋을 브라우저 접근성 나무로 읽었다(2026-10-02):
46
+ > `table > rowgroup > row > cell "Alice"`, 체크박스 첫 칸은 `cell > checkbox "Alice"`,
47
+ > 기다리는 줄은 `row > cell > status`, 펼친 줄은 `row > cell > generic`,
48
+ > 머리를 누르면 `이름=ascending`.
49
+ >
50
+ > `display: contents` 인 칸(펼친 자리)이 **나무에서 빠지지 않는다**는 것도 그 자리에서
51
+ > 확인했다 — 빠질까 봐 flex 설정을 안쪽으로 옮길 준비를 했는데, `role` 을 들고 있으면
52
+ > 그대로 선다. 그래서 **자리 잡기를 하나도 안 건드렸다.**
53
+ >
54
+ > **알려진 한계**: 되돌리기 단추와 접을 수 있는 머리가 나무에서 `table` 의 바로 아래
55
+ > 아이로 선다(줄·칸이 잡히는 데는 지장이 없다 — 위 실측). 접을 수 있는 머리는 그 안에
56
+ > 이미 진짜 `<button>`("접기")을 품고 있어 **단추 안 단추**이기도 하다. 그 자리는 따로 본다.
57
+
58
+ > 옛 시험 셋이 `role="button"` 을 글자 그대로 박고 있었다 — 그 역할이 바로 이번에 걷은
59
+ > 것이다. 지키려던 참뜻("누를 것이 없는 표가 헛 정지점을 만들지 않는다")은 `tabIndex` 로
60
+ > 그대로 묻게 고쳤다.
61
+
62
+ ## 0.252.0
63
+
64
+ ### `6일 남음` 과 `98%` 가 한 카드에 나란히 섰다 — `PassCard`
65
+
66
+ 둘 다 맞는데 **눈금이 달라 서로를 부정하는 것처럼 보인다.** 말귀 라이브 실측(이용 현황 ›
67
+ 보유한 말귀 이용권, 7일 이용권 `paused_remaining_seconds = 598706` = 6.929일):
68
+
69
+ | | 전 | 후 |
70
+ |---|---|---|
71
+ | 7일권, 6.929일 남음 | `6일 남음` · **98%** | `6일 남음` · **85%** |
72
+ | 1년권, 364.9일 남음 | `364일 남음` · 99% | `364일 남음` · 99% (그대로) |
73
+
74
+ `formatRemaining` 은 일 단위로 **내리고**(6.929 → `6일`), % 는 초를 그대로 내렸다
75
+ (598706/604800 → 98). 눈으로는 6/7 = 86% 인데 고리는 거의 꽉 찼다. **짧은 이용권일수록
76
+ 벌어진다** — 3일권이 2.9일 남으면 `2일 남음 · 96%`. 1년짜리는 364/365 라 차이가 안 보여
77
+ 여태 안 걸렸다.
78
+
79
+ 이제 % 가 **글에 적히는 값**을 센다. 사다리가 같으므로 하루 미만에서도 함께 움직인다 —
80
+ `23시간 남음` 이면 13%(전에는 14%).
81
+
82
+ > **되돌리는 쪽(날을 올려 `7일 남음`)으로는 가지 않았다.** 그건 있지도 않은 정밀도를
83
+ > 부풀리는 쪽이고, **한 번도 안 쓴 새 이용권과 구별이 안 된다** — 이 조각이 원래
84
+ > `pending` + 100% 를 숨기는 까닭이 바로 그것이다.
85
+ >
86
+ > **날짜(`endDate`)로 셈하는 길은 아무것도 안 바뀐다** — 거기는 이미 날 단위 정수로
87
+ > 스냅한다. 벌어지던 것은 초를 그대로 받는 `remainingSeconds` 쪽이었다.
88
+ >
89
+ > 코어에서 % 를 세는 다른 자리들(`RingChart` · `BarChart` · `WordDataUpdatePopup`)도
90
+ > 함께 셌다 — **낱낱의 수에서 세므로 눈금이 어긋날 자리가 없다.** 이 집안은 한 자리뿐이다.
91
+
10
92
  ## 0.251.0
11
93
 
12
94
  ### 이름 없는 고르개가 **둘 서면** 개발 중에 알린다 — `SegmentedControl`