@ihabdevteam/core 0.133.0 → 0.135.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.
Files changed (69) hide show
  1. package/CHANGELOG.md +122 -0
  2. package/dist/components.cjs.js +176 -176
  3. package/dist/components.esm.css +1 -1
  4. package/dist/hooks.cjs.js +1 -1
  5. package/dist/i18n.cjs.js +3 -3
  6. package/dist/ihabdevteam-core.cjs.js +182 -182
  7. package/dist/ihabdevteam-core.d.ts +8 -2
  8. package/dist/packages/core/src/components/BarChart.js +3 -1
  9. package/dist/packages/core/src/components/Breadcrumb.js +5 -1
  10. package/dist/packages/core/src/components/Dialog.js +32 -9
  11. package/dist/packages/core/src/components/Header.css +2 -0
  12. package/dist/packages/core/src/components/Header.js +4 -1
  13. package/dist/packages/core/src/components/LandingHeader.js +18 -1
  14. package/dist/packages/core/src/components/Pagination.js +5 -2
  15. package/dist/packages/core/src/components/Panel.d.ts +1 -1
  16. package/dist/packages/core/src/components/Panel.js +4 -1
  17. package/dist/packages/core/src/components/PassCard/passCardProduct.js +6 -0
  18. package/dist/packages/core/src/components/PaymentPlan.d.ts +6 -0
  19. package/dist/packages/core/src/components/PaymentPlan.js +5 -3
  20. package/dist/packages/core/src/components/Popup/ConfirmPopup.js +34 -21
  21. package/dist/packages/core/src/components/Popup/CouponInputPopup.js +4 -1
  22. package/dist/packages/core/src/components/Popup/ListPopup.js +7 -2
  23. package/dist/packages/core/src/components/Popup/SaveTablePopup.js +13 -3
  24. package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +5 -1
  25. package/dist/packages/core/src/components/PromoBanner.js +1 -1
  26. package/dist/packages/core/src/components/Report/ReportDocument.js +35 -10
  27. package/dist/packages/core/src/components/RingChart.js +14 -3
  28. package/dist/packages/core/src/components/SideNav.js +1 -1
  29. package/dist/packages/core/src/components/SoundCompass.js +10 -1
  30. package/dist/packages/core/src/components/Table.js +15 -5
  31. package/dist/packages/core/src/components/Tooltip/MenuTooltip.js +7 -2
  32. package/dist/packages/core/src/components/Training/TrainingBlockButton.js +3 -1
  33. package/dist/packages/core/src/components/Training/TrainingPagePopup.js +28 -2
  34. package/dist/packages/core/src/components/Training/TrainingStepOrderList.js +11 -7
  35. package/dist/packages/core/src/components/Training/TrainingStepTextBox.js +1 -1
  36. package/dist/packages/core/src/components/Training/TrainingWordCard.js +4 -0
  37. package/dist/packages/core/src/components/Training/useNoiseFade.js +22 -1
  38. package/dist/packages/core/src/components/Training/useTTSPlayback.js +9 -0
  39. package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +3 -2
  40. package/dist/packages/core/src/components/Word/WordTableBlock.js +2 -1
  41. package/dist/packages/core/src/components/barChartData.d.ts +8 -0
  42. package/dist/packages/core/src/components/barChartData.js +21 -0
  43. package/dist/packages/core/src/components/useBarChartControl.js +5 -3
  44. package/dist/packages/core/src/hooks/useDailyTrainingSelection.js +17 -1
  45. package/dist/packages/core/src/hooks/useEditableList.d.ts +6 -0
  46. package/dist/packages/core/src/hooks/useEditableList.js +20 -1
  47. package/dist/packages/core/src/hooks/useTablePaging.js +4 -0
  48. package/dist/packages/core/src/hooks/useVisitHistory.js +2 -2
  49. package/dist/packages/core/src/hooks/useVisitSchedule.js +5 -4
  50. package/dist/packages/core/src/hooks/useWordMeanings.js +13 -4
  51. package/dist/packages/core/src/hooks/useWordTrainingFilter.js +9 -4
  52. package/dist/packages/core/src/hooks/wordTrainingFilterModel.d.ts +1 -1
  53. package/dist/packages/core/src/hooks/wordTrainingFilterModel.js +7 -2
  54. package/dist/packages/core/src/i18n/locales/en.json +13 -1
  55. package/dist/packages/core/src/i18n/locales/ko.json +13 -1
  56. package/dist/packages/core/src/utils/format.js +17 -1
  57. package/dist/packages/core/src/utils/getTrainingData.js +11 -4
  58. package/dist/packages/core/src/utils/imageConfig.js +6 -3
  59. package/dist/packages/core/src/utils/koreanPronunciation.js +7 -0
  60. package/dist/packages/core/src/utils/pressable.js +4 -0
  61. package/dist/packages/core/src/utils/savedWordTables.js +2 -1
  62. package/dist/packages/core/src/utils/wordTrainingPool.d.ts +7 -0
  63. package/dist/packages/core/src/utils/wordTrainingPool.js +30 -0
  64. package/dist/packages/core/src/utils/wordTrainingRuntime.d.ts +1 -1
  65. package/dist/packages/core/src/utils/wordTrainingRuntime.js +38 -17
  66. package/dist/packages/core/src/version.d.ts +1 -1
  67. package/dist/packages/core/src/version.js +1 -1
  68. package/dist/utils.cjs.js +2 -2
  69. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,128 @@ All notable changes to this project will be documented in this file.
7
7
  > 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
8
8
  > 제 이야기를 못 찾는다.
9
9
 
10
+ ## 0.135.0
11
+
12
+ 3차·4차 검수 판이다 — 훈련 단계 UI·차트·리포트·팝업·방문 훅을 훑어 **재현된** 결함만 고쳤다. 항목마다 시험을 붙이고 고친 줄을
13
+ 되돌리면 붉어지는 것을 확인했다. 걷은 prop·타입·열쇠는 없다. 사전 열쇠 `wordTable.save.copyName` 을 더했다.
14
+
15
+ ### 소비자에게 먼저
16
+
17
+ - **문장 순서화(92b71ac 되돌림)**: 끝낸 단계에서도 옮기기 단추·끌어놓기가 열린다. 옮기면 onChange 로 점수가 따라간다.
18
+ 그 결정을 굳혀 둔 코어 시험 둘을 까닭과 함께 고쳤다.
19
+ - **useEditableList**(방문 훅): 비지 않은 **같은 id** 면 다른 객체여도 같은 항목으로 본다(지우기·고른 항목 옮기기). id 가 없으면
20
+ 전과 같이 참조로 견준다.
21
+ - **훈련 결과 창**: 어두운 바탕을 눌러도 닫히지 않는다(완료·다시하기·Esc 로 닫는다).
22
+ - 나머지는 API 그대로다 — 소비자 코드 수정은 필요 없다.
23
+
24
+ ### 바뀜 — 훈련
25
+
26
+ - **문장 순서화**: 카드를 한 번 옮기는 순간(첫 이동의 onDone 이 단계를 넘긴다) 단추·끌어놓기가 모두 사라져 **끝까지 맞출 수 없었다.**
27
+ - **TrainingWordCard**: 카드 안 '소리 듣기' 에서 Enter·Space 를 누르면 소리 대신 **그 카드가 답으로** 골라졌다.
28
+ - **TrainingBlockButton**: '더보기'·'미리 듣기' 에서 누른 Enter 를 가로채 훈련 팝업을 열었다(메뉴를 키보드로 못 엶).
29
+ - **TrainingResultPopup**: 닫기가 곧 '완료'(기록 확정)인데 바탕 누르기로도 닫혀, 잘못 누르면 다시하기를 쓸 수 없었다.
30
+ - **다시하기**: 단계들을 처음부터 다시 그린다 — 같은 문항을 다시 풀면 옛 선택 강조·옛 배치가 남았다.
31
+ - **다음 문제**: 누르면 곧바로 비활성이 되어 포커스가 body 로 빠졌다 — 새 문제의 첫 칸으로.
32
+ - **useDailyTrainingSelection**: 화면을 열어 둔 채 KST 자정을 넘기면 어제 시드의 세트가 '오늘' 로 남았다(폴백 경로).
33
+ - **loadTrainingData**: 도중에 형식 오류로 멈추면 넣던 것이 남은 채 재시도가 또 넣어 풀에 중복이 쌓였다.
34
+ - **precomputeCommonCombinations**: 화면과 다른 열쇠(count·난이도)로 예열해 계산을 전부 버렸다 — 화면 열쇠로.
35
+ - **useWordMeanings**: 뜻 없는 낱말·정렬만 바뀐 행·취소된 조회를 되풀이해 조회하던 것.
36
+
37
+ ### 바뀜 — 차트·리포트·표
38
+
39
+ - **BarChart 집계**: 앞 달에 자료가 없으면 첫 월요일 이전 날(9/1~9/6)이 **어느 막대에도 안 들어갔고**(말귀 훈련 현황 — 신규·한 달
40
+ 쉰 회원의 달 초 훈련), 주 보기 기본이 미래 주로 갔다. 월 옵션을 모듈 로드 때 한 번 세어 자정을 넘긴 탭에서 이번 달이 빠졌다.
41
+ - **BarChart 눈금**: 가운데 값을 반올림한 채 절반 높이에 두어 선과 숫자가 어긋났다 — 값의 높이에.
42
+ - **RingChart**: NaN 구간 하나가 뒤 구간을 전부 지웠다. 199/200 이 반올림으로 '100%'(링 끝은 비어 있음) — 다 채우기 전에는 99 까지.
43
+ - **ReportDocument**: 블록 수가 줄면 옛 쪽 나눔 번호로 새 blocks 를 읽어 **렌더가 깨졌다**(kscan 결과지). 머리 높이를 첫 갈래 것
44
+ 하나로 재어 제목 있는 뒤 갈래의 장이 넘쳤다 — 갈래마다. 숨김→보임에서 다시 잰다.
45
+ - **Table**: 저장 칸 폭을 마운트 때만 읽어 열쇠가 바뀌어도 앞 열쇠 폭이 씌워졌다. 0·음수·NaN 저장값을 받던 것.
46
+ - **useTablePaging**: 행이 줄어 끝 쪽에 붙은 뒤 다시 늘면 예전 쪽 번호로 튀었다.
47
+
48
+ ### 바뀜 — 팝업·방문
49
+
50
+ - **ConfirmPopup**: 잠금을 onConfirm 이 끝나자마자 풀어 닫힘 애니메이션 동안 한 번 더 누르면 **또 불렸다**(말귀 단어표·이용권 삭제가
51
+ 두 번). 닫지 않고 끝나면 처리 중 꺼진 단추로 떨어진 포커스를 되돌린다.
52
+ - **방문 훅**(useEditableList·useVisitSchedule·useVisitHistory): 수정 저장 → 재조회(새 객체) → 같은 상세에서 '방문' 을 누르면 예정이
53
+ 안 지워져 **방문예정·방문완료 양쪽에** 떴다(말귀 CustomerDetailPopup). 취소·서버 거절 되돌림 뒤에도 편집 폼이 거절된 값을 들었다.
54
+ 예정→방문이 id 를 버려 이어서 수정할 때 서버가 행을 못 찾았다.
55
+ - **CouponInputPopup**: 한글 조합 중 Enter 가 적용을 보냈고, 오류 뒤 입력칸으로 포커스가 안 돌아왔다.
56
+ - **SaveTablePopup**: 저장 단추의 닫힘 동안 이름칸 Enter 로 onSave 가 두 번.
57
+ - **ListPopup**: 목록이 줄어 보던 쪽이 범위를 넘으면 '항목이 없습니다' 와 '총 N개' 가 함께 떴다.
58
+ - **WordTableBlock**: '다른 이름으로 저장' 기본 이름 '(복사)' 가 박혀 있었다(`wordTable.save.copyName`).
59
+ - **checkImageExists**: 망 끊김·5xx 까지 '이미지 없음' 으로 영구 캐시해 망이 돌아와도 그 단어가 '이미지 있음' 필터에서 빠졌다.
60
+
61
+ ### 고치지 않은 것 — 결정·확인이 필요하다
62
+
63
+ - 숫자 보기(`[2,3,4]`)에서 `selected` 가 값인지 자리 번호인지 API 가 가르지 못한다(지금 쓰는 소비자 없음).
64
+ - `useRelativeDay` 는 날짜 경계가 아니라 24시간 단위로 센다 — 주석상 의도라 두었다.
65
+ - `useVisitHistory.today()` 가 기기 시간대 날짜를 쓴다(KST 기기에서는 같다).
66
+ - 0.134.0 에 적은 결정 넷(SoundCompass 화면 번호 · wordCount 품사/어종 · 결과 캐시 · 편집 중 서버 목록)은 그대로.
67
+
68
+ ## 0.134.0
69
+
70
+ 0.133.0 뒤 2차 검수 판이다 — 소리방향성(SoundCompass)·단어 기능·레이아웃/결제를 새로 훑었다. 항목마다 시험을 붙이고 고친 줄을
71
+ 되돌리면 붉어지는 것을 확인했다. 걷은 것은 없다. **새 선택 prop 하나**(`PaymentPlanTier.onceOnly` — 안 주면 전과 같음)과 사전 열쇠
72
+ `soundCompass.state.*`·`breadcrumb.ariaLabel` 을 더했다.
73
+
74
+ ### 소비자에게 먼저
75
+
76
+ - **말귀 `admin/src/libs/phone.test.ts` "고치는 대상이 실재한다" 가 붉어진다 — 의도다.** 코어 `formatPhone` 이 050X·0303 을 네 자리
77
+ 앞자리로 끊는다. 시험에 적힌 대로 `formatPhoneKr` 을 걷어도 된다.
78
+ - **영어 결제 화면을 고치려면 말귀 `paymentProducts` 의 오픈 특가 tier 에 `onceOnly: true`** 를 넣는다(아래 PaymentPlan). 안 넣으면
79
+ 한국어 화면은 전과 같고 영어 화면만 그대로 남는다.
80
+ - SoundCompass 스피커 단추 이름이 상태를 붙인다("13, 정답"). 이름으로 찾는 시험은 고친다(지금 소비자 시험엔 없음).
81
+ - 모바일 Header 햄버거 단추 이름이 읽지 않은 알림이 있을 때 "메뉴 열기, N개".
82
+
83
+ ### 바뀜 — 훈련
84
+
85
+ - **실단어 생성기가 필터를 따른다**: MERGE_2/3_PHONEMES·DROP_FINAL_CONSONANT_FROM_1SYLL·REMOVE_CONSONANT_AND_IDENTIFY_PHONEME 가
86
+ 난이도 등급·단어 구성(초성/중성/종성·음절 수)을 무시해 초성 ㄱ·1등급으로 설정해도 '카·라·파…' 가 나왔다. CHANGE_1_SYLL_IN_2/3SYLL 은
87
+ 등급이 빠졌다. `buildUsablePool` 과 같은 정답 거르개를 건다 — 조건에 맞는 단어가 없으면 빈 결과(카드 비활성)가 된다.
88
+ - **SAME_OR_DIFF**: 같음·다름이 늘 교대(같음·다름·같음…)라 듣지 않고도 맞힐 수 있었고 같은 단어가 반복됐다 — 절반씩 섞고 겹치지 않게.
89
+ - **단어 훈련 필터**: 글자↔발음 보기를 오가면 종성 선택이 대표음으로 바뀌어(ㅅ → ㄷ, ㄳ → ㄱ) 훈련 대상이 달라진 채 저장되던 것.
90
+ `resetKey` 초기화가 `defaultImageOnly` 를 무시하던 것.
91
+ - **useTTSPlayback**: Chrome·Safari 는 cancel() 한 발화에도 end 를 내 **정지가 문항 완료로** 세졌고, 떠난 뒤 온 end 가 완료를 알렸다.
92
+ - **useNoiseFade**: 소음 종류를 바꾸는 150ms 안에 다른 페이드가 끼면 표시·파형은 새 종류인데 **소리는 이전 파일**이던 것.
93
+ - **발음 추천**: 받침 ㅎ(ㄶ·ㅀ) 뒤 ㅅ(표준발음법 제12항 2) — 놓소 → 노쏘, 많소 → 만쏘(전에는 녿쏘·만소).
94
+
95
+ ### 바뀜 — 소리방향성
96
+
97
+ - **SoundCompass**: 스피커 상태(소리 나는 중·들음·정답·오답)가 색과 이름 없는 아이콘으로만 보여 낭독기는 번호만 읽었다 —
98
+ 이름에 붙이고(`soundCompass.state.*`), 고른 칸은 `aria-pressed`.
99
+
100
+ ### 바뀜 — 오버레이·레이아웃
101
+
102
+ - **Dialog**: 스크롤 잠금을 제 손으로 되돌려 Popup 과 엇갈리면 스크롤이 일찍 풀리거나 **영영 굳던** 것(공유 카운터로), 인라인 `onClose`
103
+ 로 다시 그려질 때마다 ESC 스택 맨 위로 끼어들던 것, `closeOnEscape={false}` 인데 Esc 가 아래 팝업을 닫던 것(이제 삼킨다), 판 안에서
104
+ 누르고 바탕에서 떼면 닫히던 것. (지금 소비자 넷 모두 Dialog 를 쓰지 않는다.)
105
+ - **Header 모바일 햄버거**: 알림이 메뉴 안에만 있어 열어 봐야 새 알림을 알았다 — SideNav 알림과 같은 원형 배지, 이름에 수.
106
+ - **MenuTooltip**: 항목 배지 수가 단추 이름에서 빠져 "알림" 으로만 읽혔다(BottomNav 더보기·Header 유틸 메뉴).
107
+ - **pressable**(LandingBottomSticky·Calendar 방문 표시·LoadTablePopup): 안에 든 단추에서 누른 Enter 를 바깥 자리가 가로채 그 단추의
108
+ click 을 막던 것.
109
+ - **LandingHeader**: 서랍이 Esc 로 닫히지 않던 것, 넓은 화면을 거쳐 돌아오면 서랍이 다시 펼쳐지던 것.
110
+ - **Pagination**: 범위 밖 쪽(page > totalPages)에서 '이전' 이 범위 안으로 돌아오지 않던 것. **Panel** `empty`: 자식이 `false` 면 안 뜨던 것.
111
+ - **WordSearchResultBlock**: 결과 수가 같은 다른 검색이면 보던 쪽 번호가 남던 것 — 검색어가 바뀌면 1쪽.
112
+ - PromoBanner·TrainingStepTextBox 단추에 `htmlType="button"`. Breadcrumb `aria-label` 이 영어 'breadcrumb' 으로 박혀 있던 것(`breadcrumb.ariaLabel`).
113
+
114
+ ### 바뀜 — 결제·표시
115
+
116
+ - **PaymentPlan `tier.onceOnly`(새 선택 prop)**: 계정당 1회 tier 를 라벨의 '오픈 특가' 로만 판정해, 영어 화면에서 이미 산 특가 카드가 남고
117
+ **정가 30일권을 살 길이 없었다.** 주면 그것으로 판정한다(안 주면 예전처럼 라벨). 무료 판정도 '무료'·'0원' 글자만 봐 '₩0' 을 놓쳤다 —
118
+ 숫자가 모두 0 인 가격은 무료.
119
+ - **derivePassCard**: 영어 상품 이름('Open Special 30-Day Plan')에서 기간을 못 뽑아 영어 랜딩 요금 카드에 이름 전체가 큰 글씨로 찍혔다.
120
+ - **formatPhone**: 050X 안심번호·0303 은 앞자리 네 자리(`0507-1234-5678` 이 마지막 자리를 잃은 채 검증을 통과했다), 대표번호 여덟 자리는
121
+ 4-4(`1588-1234`).
122
+ - **duplicateTable**: 사본이 설명·검색 구성·묶음을 잃던 것.
123
+
124
+ ### 고치지 않은 것 — 결정이 필요하다
125
+
126
+ - **SoundCompass 화면 번호**가 스피커 id 가 아니라 배열 순번(idx+1)이다. 소리방향성은 `label=String(id)` 를 넘겨 낭독기 이름(13)과 화면
127
+ 숫자(7)가 어긋나고, 같은 앱의 격자 배치(id 표시)와도 다르다. 검사 화면에 보이는 숫자를 바꾸는 일이라 두었다.
128
+ - **useWordTrainingFilter `wordCount`** 가 품사·어종 필터를 반영하지 않는다 — 생성 런타임이 품사·어종을 모르는 구조라 따로 설계가 필요하다.
129
+ - **결과 캐시**가 같은 조건이면 세션 내내 같은 문제 세트를 돌려준다 — 성능을 위한 것인지 의도 확인이 필요하다.
130
+ - **useEditableList**: 편집 중에 온 서버 목록을 버린다 — 방금 저장한 편집과 어느 쪽이 이겨야 하는지 정해야 한다.
131
+
10
132
  ## 0.133.0
11
133
 
12
134
  2026-09-14 저녁 검수 판이다 — 오버레이·입력·훅·유틸을 네 갈래로 훑어 **실제로 재현된** 결함만 고쳤다. 항목마다 시험을 붙이고,