@ihabdevteam/core 0.231.0 → 0.233.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,80 @@ All notable changes to this project will be documented in this file.
7
7
  > 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
8
8
  > 제 이야기를 못 찾는다.
9
9
 
10
+ ## 0.233.0
11
+
12
+ ### 수 배지에 **이름**이 붙는다 — `WordTableButton` 의 좋아요·가져간 수 (말귀 요청 ㊼)
13
+
14
+ 말귀자료실 카드에서 두 수가 낭독기에 **`2` · `5` 맨 숫자 두 마디**로만 갔다. 그림은
15
+ `aria-hidden` 이라 무엇의 수인지 알 길이 없다 — 바로 위 썸네일·이름·게시자·날짜는 다
16
+ 읽히는데 바닥만 그랬다.
17
+
18
+ ```
19
+ 전 "2" "5"
20
+ 후 "좋아요 2" "가져간 수 5"
21
+ ```
22
+
23
+ `Badge` 는 진작 `aria-label` 을 받고, 주면 `role="img"` 까지 붙여 **한 덩어리로** 읽게 한다.
24
+ `CountTile` 이 쓰던 길이고 여기만 안 따라가 있었다 — ㊺(`더보기`)와 같은 꼴이다. 프롭은 안
25
+ 늘렸다: `likeCount`·`downloadCount` 가 이미 수를 들고 있다.
26
+
27
+ **0 에도 붙인다.** 0 이야말로 무엇의 0 인지 알아야 한다.
28
+
29
+ ### 곁들여 — `BulkBar` 의 `3 / 20` 도 맨 숫자였다
30
+
31
+ ㊼ 를 받고 **코어 안을 같은 눈으로 훑다가** 나왔다. 보이는 것은 `3 / 20` 인데 낭독기로는 뜻이
32
+ 안 선다. 위 `role="status"` 가 고른 수(`3개 선택됨`)는 말하지만 **천장(`max`)은 이 배지에만
33
+ 있다.** `최대 20개 중 3개` 로 읽힌다.
34
+
35
+ > 말귀가 "`label` 이 숫자뿐이고 `ariaLabel` 이 없는 꼴을 지킴이로 잡을 거리가 되나" 고 물어
36
+ > 코어 전체를 훑었다. 실제로 걸린 것은 이 하나였고, 나머지 한 건은 화살표 함수 안의 `>` 에
37
+ > 정규식이 걸린 **거짓 양성**이었다. 지킴이는 **안 만든다** — JSX 를 정규식으로 가르는 문은
38
+ > 거짓 양성을 내고, 거짓으로 우는 문은 사람이 곧 끄게 된다. 훑는 것은 손으로 한 번이면 된다.
39
+
40
+ ## 0.232.0
41
+
42
+ ### `TextField` 의 자동완성이 **글자 하나보다 두꺼운 줄**을 받는다 (말귀 요청 ㊻)
43
+
44
+ 코어는 콤보박스를 **이미 할 줄 안다** — `role="combobox"` · `aria-autocomplete` · `aria-haspopup` ·
45
+ `aria-expanded` · `aria-controls` · `aria-activedescendant` 를 스스로 셈해 붙이고, 목록을 포털로
46
+ 그리고, ↓↑ 와 한글 조합 가리기까지 쥔다. 그런데 `suggestions` 가 `string[]` 뿐이라 **담기지
47
+ 않는 자리**가 있었다: 줄 하나가 `이름 + 갈래` 이고, 거르는 셈이 초성이며, 고르는 것이 '값
48
+ 채우기' 가 아니라 '어디로 가기' 인 화면 찾기.
49
+
50
+ 그래서 말귀는 `querySelector('input')` 으로 `role`·`aria-*` 를 손수 붙이고 목록·줄·↓↑·조합
51
+ 가리기를 **통째로 다시 적고** 있었다. 코어가 쥔 것을 못 쓰고 베끼는 꼴이다.
52
+
53
+ ```ts
54
+ suggestions?: (string | TextFieldSuggestion)[] // { id, label, hint? }
55
+ filterSuggestions?: false | ((후보, 글) => 후보) // false 면 안 거른다
56
+ onSelectSuggestion?: (item) => void // 주면 칸에 값을 안 넣는다
57
+ autoActiveFirst?: boolean // 열자마자 첫 줄을 짚는다
58
+ ```
59
+
60
+ - **`hint`** 는 줄 오른쪽에 흐리게 서는 갈래 글자(`숙제` · `나의 단어표`). 좁으면 **이름이 먼저
61
+ 줄고 갈래는 안 줄인다** — 같은 이름 둘을 가리는 것이 그 글자가 선 까닭이라 잘리면 뜻이 없다.
62
+ - **`filterSuggestions: false`** 는 빈 값에서도 그대로 낸다. 부르는 쪽이 이미 고른 것을 여기서
63
+ 또 비우면 그 셈을 버리는 꼴이다. 초성 찾기(`matchesChoseongSearch`, 이 꾸러미의 `utils`)처럼
64
+ 셈이 다른 자리에 쓴다.
65
+ - **`autoActiveFirst`** 는 `onSelectSuggestion` 과 **안 묶었다.** 고르는 것이 가기인데도 친
66
+ 글자를 그대로 쓰고 싶은 칸이 있다(검색어를 그대로 보내는 자리) — 서로 다른 결정이다.
67
+
68
+ **기존 쓰임은 그대로다.** `string[]` 을 주면 전과 한 글자도 안 달라진다. `useComboboxSuggestions`
69
+ 는 넘긴 꼴을 그대로 돌려주는 **제네릭**이 되어, `filtered` 로 목록을 그리던 코드도 안 바뀐다.
70
+
71
+ ### 고를 것이 없다는 말을 **들려준다**
72
+
73
+ 전에는 걸리는 후보가 0 이면 목록을 안 그리고 끝이었다. 눈으로는 "아무것도 안 떴다" 가
74
+ 보이지만 **낭독기로는 아무 일도 안 일어난 것과 못 가린다** — 쳤는데 반응이 없는지, 맞는 것이
75
+ 없는지를 모른다. `role="status"` 한 줄이 `맞는 항목이 없습니다` 를 알린다(영어도 있다).
76
+
77
+ **칸은 늘 서 있고 글만 드나든다.** 영역째 세웠다 치우면 낭독기가 첫 글을 놓친다 — 사는 영역은
78
+ 미리 있어야 바뀐 것을 읽는다. `suggestions` 를 안 쓰는 칸에는 아예 안 선다.
79
+
80
+ ### 새 공개 타입 — `TextFieldSuggestion`
81
+
82
+ `import { type TextFieldSuggestion } from '@ihabdevteam/core/components'`.
83
+
10
84
  ## 0.231.0
11
85
 
12
86
  ### `TrainingBlockButton` 의 '더보기' 가 **그 칸 이름**을 읽는다 (말귀 요청 ㊺)