@ihabdevteam/core 0.136.0 → 0.138.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 (90) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/components.cjs.js +177 -177
  3. package/dist/components.esm.css +2 -2
  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 +20 -5
  8. package/dist/packages/core/src/components/Breadcrumb.js +1 -0
  9. package/dist/packages/core/src/components/Button.js +10 -1
  10. package/dist/packages/core/src/components/Effect/EffectPartyPopper.js +3 -2
  11. package/dist/packages/core/src/components/Icon.js +4 -1
  12. package/dist/packages/core/src/components/LandingHeader.d.ts +1 -1
  13. package/dist/packages/core/src/components/LandingHeader.js +5 -1
  14. package/dist/packages/core/src/components/PageTitle.js +1 -0
  15. package/dist/packages/core/src/components/Pagination.js +1 -1
  16. package/dist/packages/core/src/components/Panel.css +3 -0
  17. package/dist/packages/core/src/components/Panel.d.ts +11 -1
  18. package/dist/packages/core/src/components/Panel.js +3 -3
  19. package/dist/packages/core/src/components/PanelRow.js +8 -1
  20. package/dist/packages/core/src/components/PassCard/PassCard.js +1 -1
  21. package/dist/packages/core/src/components/PassCard/PassCardBgIHAB.js +1 -0
  22. package/dist/packages/core/src/components/PassCard/PassCardBgLeftColorGrid.js +1 -0
  23. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMove.js +1 -0
  24. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMoveV1.js +1 -0
  25. package/dist/packages/core/src/components/PassCard/PassCardBgTalk.js +1 -0
  26. package/dist/packages/core/src/components/PassCard/PassCardBgTalkV1.js +1 -0
  27. package/dist/packages/core/src/components/PassCard/PassCardBgTwoCircle.js +1 -0
  28. package/dist/packages/core/src/components/Popup/DeviceSideTable.js +8 -1
  29. package/dist/packages/core/src/components/Popup/LoadTablePopup.js +3 -1
  30. package/dist/packages/core/src/components/Popup/Popup.css +10 -0
  31. package/dist/packages/core/src/components/Popup/Popup.d.ts +5 -0
  32. package/dist/packages/core/src/components/Popup/Popup.js +5 -4
  33. package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +6 -1
  34. package/dist/packages/core/src/components/ProgressIndicator.js +1 -0
  35. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDark.js +1 -0
  36. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDeep.js +1 -0
  37. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDiagonal.js +1 -0
  38. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDots.js +1 -0
  39. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgInstagram.js +1 -0
  40. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgMain.js +1 -0
  41. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgNaver.js +1 -0
  42. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgOutline.js +1 -0
  43. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgRadial.js +1 -0
  44. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoft.js +1 -0
  45. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoftSub.js +1 -0
  46. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSub.js +1 -0
  47. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSuccess.js +1 -0
  48. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgWarm.js +1 -0
  49. package/dist/packages/core/src/components/Table.js +4 -1
  50. package/dist/packages/core/src/components/TextField.js +3 -1
  51. package/dist/packages/core/src/components/Tooltip/DescriptionTooltip.js +1 -0
  52. package/dist/packages/core/src/components/Tooltip/MenuTooltip.js +23 -26
  53. package/dist/packages/core/src/components/Training/TrainingBlock.js +20 -3
  54. package/dist/packages/core/src/components/Training/TrainingBlockButton.js +10 -4
  55. package/dist/packages/core/src/components/Training/TrainingCardGroup.js +2 -1
  56. package/dist/packages/core/src/components/Training/TrainingPagePopup.js +20 -5
  57. package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +60 -3
  58. package/dist/packages/core/src/components/Training/TrainingStepCard.js +16 -1
  59. package/dist/packages/core/src/components/Training/TrainingStepConfirm.js +2 -1
  60. package/dist/packages/core/src/components/Training/TrainingStepConfirmWithText.js +26 -6
  61. package/dist/packages/core/src/components/Training/TrainingStepOrderList.d.ts +0 -1
  62. package/dist/packages/core/src/components/Training/TrainingStepOrderList.js +16 -1
  63. package/dist/packages/core/src/components/Training/TrainingStepTextBox.js +18 -3
  64. package/dist/packages/core/src/components/Training/TrainingWordCard.js +28 -5
  65. package/dist/packages/core/src/components/Training/currentSound.d.ts +5 -0
  66. package/dist/packages/core/src/components/Training/currentSound.js +13 -0
  67. package/dist/packages/core/src/components/Training/trainingPopupUtils.js +12 -1
  68. package/dist/packages/core/src/components/Training/useNoiseFade.js +7 -1
  69. package/dist/packages/core/src/components/Training/useTTSPlayback.js +5 -1
  70. package/dist/packages/core/src/components/Word/PhonemeSelectBlock.js +3 -1
  71. package/dist/packages/core/src/components/WordTable.js +25 -7
  72. package/dist/packages/core/src/hooks/useEditableList.js +13 -5
  73. package/dist/packages/core/src/hooks/useFontScale.js +13 -4
  74. package/dist/packages/core/src/hooks/useIcon.js +3 -0
  75. package/dist/packages/core/src/hooks/useLucideIcon.js +3 -0
  76. package/dist/packages/core/src/hooks/useMediaQuery.d.ts +2 -1
  77. package/dist/packages/core/src/hooks/useMediaQuery.js +37 -8
  78. package/dist/packages/core/src/hooks/usePagedList.js +1 -0
  79. package/dist/packages/core/src/hooks/usePasswordChange.js +7 -0
  80. package/dist/packages/core/src/hooks/useTrainingTypeLabels.js +1 -0
  81. package/dist/packages/core/src/hooks/useVisitHistory.js +1 -0
  82. package/dist/packages/core/src/hooks/useWordTrainingDataGeneration.js +18 -3
  83. package/dist/packages/core/src/i18n/locales/en.json +41 -4
  84. package/dist/packages/core/src/i18n/locales/ko.json +41 -4
  85. package/dist/packages/core/src/utils/errorMessage.js +7 -1
  86. package/dist/packages/core/src/utils/wordPairIndex.js +11 -3
  87. package/dist/packages/core/src/version.d.ts +1 -1
  88. package/dist/packages/core/src/version.js +1 -1
  89. package/dist/utils.cjs.js +2 -2
  90. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,104 @@ All notable changes to this project will be documented in this file.
7
7
  > 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
8
8
  > 제 이야기를 못 찾는다.
9
9
 
10
+ ## 0.138.0
11
+
12
+ 7차 검수 판이다 — 가로지르는 검수 셋(마운트 뒤 props 변경·비동기 경합·키보드와 낭독기)에서 **재현된** 결함을 고쳤다. 항목마다
13
+ 시험을 붙이고 고친 줄을 되돌리면 붉어지는 것을 확인했다. 걷은 prop·타입·열쇠는 없다. 더한 공개 API 도 없다.
14
+
15
+ ### 소비자에게 먼저
16
+
17
+ - **useEditableList**(useVisitHistory·useVisitSchedule): 편집 중 들어온 목록을 **편집을 취소하면** 받는다(전에는 끝내 안 받음).
18
+ 커밋(`commitEdit`)으로 끝나면 방금 편집을 옛 목록으로 덮지 않는다.
19
+ - **TrainingStepAudioPlayer**: 대기 중이던 재생을 멈춤·정지로 끊으면 다시 시도하지 않는다. 큰 '듣기' 를 초점으로 누르면 초점이
20
+ '재생 / 멈춤' 으로 간다.
21
+ - **Button**: 막혔다 풀릴 때 키보드로 잡은 초점은 놓지 않는다(마우스로 잡힌 초점만 푼다).
22
+ - **MenuTooltip**: 하위 메뉴의 목록을 매 렌더 지금의 `columns` 에서 꺼낸다 — 부모가 바꾼 선택 표시가 하위 메뉴에도 보인다.
23
+
24
+ ### 바뀜 — 훈련
25
+
26
+ - **TrainingStepAudioPlayer**: 버퍼링 중 멈춤·정지하면 AbortError 재시도로 **정지했는데 소리가 다시 났다**. 트랙 이동이 파형을
27
+ 기다리는 중 정지·✓ 를 눌러도 기다림 뒤 재생했다. 늦게 resume 되면 떠난 플레이어의 미터를 다시 등록했다(useNoiseFade 도).
28
+ - **TrainingWordCard**: 합성 폴백 주소를 기다리는 사이 다른 카드를 누르면 늦게 온 주소로 두 소리가 겹쳤고, 같은 카드를 두 번
29
+ 누르면 두 번 울렸다. 같은 낱말에 발음이 새로 오거나 동음이의어 번호가 바뀌어도 앞면이 앞 값이었다.
30
+ - **TrainingPagePopup**: 결과 계산이 비동기일 때 다시하기 뒤 늦게 온 결과가 새 판에 결과 창을 띄우거나 2회차 결과를 덮었다.
31
+ - **TrainingStepConfirmWithText·TrainingStepConfirm·TrainingStepCard**: 보기만 바뀐 문항·같은 문장의 다음 쪽·같은 카드 묶음의 다음 쪽
32
+ 에서 앞 선택이 남았다. `demoSelected` 변경을 안 따랐다.
33
+ - **TrainingStepTextBox·TrainingBlock**: '문장 미리보기'·마지막 '더보기' 를 누르면 초점이 body 로 떨어졌다.
34
+ - **TrainingCardGroup**: 접기 단추에 `aria-expanded`.
35
+
36
+ ### 바뀜 — 그 밖
37
+
38
+ - **WordTable 칸**: 같은 칸의 낱말이 바뀐 뒤 새 소리 주소를 받는 동안 누르면 앞 낱말 소리가 났다.
39
+ - **usePasswordChange**: 처리 중 다시 누르면 변경이 두 번 나가 성공 뒤 늦은 오류 문구가 남았다.
40
+ - **buildPairIndex**: 빌드 중 `clearPairIndexCache()` 뒤 늦게 끝난 옛 빌드가 캐시를 되살리거나 새 인덱스를 덮었다.
41
+ - **LoadTablePopup**: 고른 표가 목록에서 빠져도 '불러오기' 가 켜진 채였다.
42
+ - **Table 접기 머리**: `headerActions` 안 단추에서 Enter/Space 를 누르면 표가 접혔다.
43
+ - **PassCard**: 메뉴를 여는 카드에 `aria-haspopup`·`aria-expanded`. **PhonemeSelectBlock**: 좁은 화면 '유의사항' 단추에 이름.
44
+
45
+ ### 고치지 않은 것 — 결정·확인이 필요하다
46
+
47
+ - 훈련 창 안 '훈련 설정'·'문장 미리보기' 떠 있는 창이 판 밖이라 키보드·낭독기로 닿지 못한다 — 판 안에 그릴지, 초점을 넣고 가둠
48
+ 예외를 둘지.
49
+ - 초점 중인 단추가 막히는 자리(Pagination 끝 쪽·순서 목록 위로·BarChart 넘김·선택 초기화·글자 크기 끝값), BulkBar 가 비며 inert,
50
+ Alert·NoticeBox·UpdateAlert 닫기 뒤 초점 자리, 여닫이 단추의 `aria-pressed` → `aria-expanded`.
51
+ - 결과 계산 중 완료를 누르면 total null 완료 기록 / 소음 설정 저장 순서 / '모두 듣기' 중 사용자가 카드를 누를 때.
52
+ - ReportDocument 는 블록 구성이 같으면 content 가 바뀌어도 쪽을 다시 안 잰다(문서화된 동작).
53
+ - 앞 판에 적은 결정은 그대로.
54
+
55
+ ## 0.137.0
56
+
57
+ 6차 검수 판이다 — 이번에는 가로지르는 검수 넷(서버 렌더 안전·StrictMode 부작용·언마운트 뒤 남는 것·영어 화면의 한국어)과
58
+ 훅·기본 컴포넌트 2차 검수에서 **재현된** 결함을 고쳤다. 항목마다 시험을 붙이고 고친 줄을 되돌리면 붉어지는 것을 확인했다.
59
+ 말귀 훈련 계획 창이 덮어쓰던 규칙을 prop 으로 더 가져왔다. 걷은 prop·타입·열쇠는 없다. 사전 열쇠를 더했다
60
+ (`wordTable.info.*`·`wordTable.pos.*`·`common.networkError`·`training.audioStatus.*`·`device.type.*`·`header.menuClose`).
61
+
62
+ ### 소비자에게 먼저
63
+
64
+ - **Popup `height`**: 인라인 `height` 대신 CSS 변수 `--popup-height` + `.popup-panel--has-height` 로 건다 — 앱의
65
+ `.x .popup-panel { height }` 미디어 규칙이 이긴다. 패널 `style.height` 를 읽는 시험은 `style.getPropertyValue('--popup-height')` 로.
66
+ - **useMediaQuery**(React 18+): 서버 렌더 HTML 을 붙일 때 첫 렌더는 `false`(서버와 같게), 붙인 뒤 곧바로 실제 값. 서버 렌더가
67
+ 아닌 첫 렌더는 전과 같이 실제 값이다. React 16/17 은 예전 그대로.
68
+ - **'use client'**: 훅을 쓰는 모듈 30곳에 지시문을 달았다(Icon·PageTitle·Breadcrumb·ProgressIndicator·DescriptionTooltip·
69
+ TrainingCardGroup·PassCardBg*·PromoBannerBg*·usePagedList·useTrainingTypeLabels·useVisitHistory). 빠뜨림을 잡는 시험을 둔다.
70
+ - **영어 화면**: 훈련 블록 유형·카테고리, 팝업 아이콘 툴팁, 낱말 정보 툴팁, 네트워크 오류 안내(`toUserErrorMessage` —
71
+ `NETWORK_ERROR_MESSAGE` 상수는 그대로), 오디오 불러오기 상태, 기기 종류 배지, LandingHeader 기본 메뉴 이름이 사전을 거친다.
72
+ 한국어 화면의 글자는 그대로다.
73
+ - **Pagination** `totalPages=0`: `"1 / 1"`(전에는 `"1 / 0"`).
74
+ - **Icon**: `label` 이 요소면 `img alt=""`(전에는 `"[object Object]"`).
75
+
76
+ ### 더함 (말귀 요청)
77
+
78
+ - **Popup `fillBody`**: 본문은 굴리지 않고 안쪽이 세로 flex·높이 100% — 안의 한 칸만 굴린다.
79
+ - **Panel `scrollbarGutter`**: `'auto'`(기본) | `'stable'`.
80
+ - **Panel `compactRows`**: 행 최소 높이 46px·위아래 3px — `size="small"` 행 하나짜리 패널이 테두리까지 48px.
81
+
82
+ ### 바뀜 — 훈련
83
+
84
+ - **TrainingStepOrderList**: `context` 를 안 주면 렌더가 끝없이 돌았다(CPU 100%). 끌기 첫 프레임 전에 끝내거나 떠나면 rAF 루프가
85
+ 영영 돌았다. StrictMode 에서 처음 배치 알림이 두 번(첫 알림은 화면에 안 뜬 배치).
86
+ - **useNoiseFade**(StrictMode·`<Activity>`): 소음 요소를 다시 만들면 파일이 안 물려, 소음이 켜진 채 마운트된 단계에서 소음이 안 났다.
87
+ - **TrainingWordCard·TrainingStepCard**: 음성 합성으로 듣는 중·합성 주소를 기다리는 중·'모두 듣기' 중에 떠나면 소리가 계속 났다 —
88
+ 떠날 때 제가 쥔 소리만 끊는다.
89
+ - **TrainingStepAudioPlayer**: 불러오는 중 떠나면 늦게 온 소리로 blob 주소를 남기고 떼어진 `<audio>` 를 불러왔다.
90
+ - **useTTSPlayback**: 마운트만 한 단계가 떠날 때 다른 곳의 음성 합성을 끊었다.
91
+ - **TrainingResultPopup** 폭죽 신호 · **EffectPartyPopper** 움직임 줄이기 `onComplete`: StrictMode 에서 두 번.
92
+ - **useWordTrainingDataGeneration**: `types` 가 늦게 오면 끝까지 안 만들었고, 언어를 바꿔도 단추 제목이 옛 언어였다.
93
+
94
+ ### 바뀜 — 훅·기본 컴포넌트
95
+
96
+ - **useFontScale**: `storageKey` 가 바뀌면 앞 값으로 새 열쇠의 저장값을 덮었다. 저장소를 못 읽으면 범위를 안 조였다.
97
+ - **Icon·useIcon**: 다른 SVG 로 바꾸는 동안 앞 아이콘이 그려졌다. 그림 파일 경로를 lucide 이름으로 찾아 개발 경고를 냈다.
98
+ - **TextField**: 서버 렌더(React 18)에서 `useLayoutEffect` 경고.
99
+
100
+ ### 고치지 않은 것 — 결정·확인이 필요하다
101
+
102
+ - i18n 이 불러오는 순간 저장된 언어로 시작해, 서버 렌더 앱에서 저장 언어가 en 이면 hydration 이 어긋난다(말귀 SPA 에는 장점).
103
+ - Calendar·BarChart·useRelativeDay 가 렌더 중 '지금' 을 읽는다 — 서버·브라우저 날짜가 다르면 어긋난다.
104
+ - `/images/brand/check.svg` 같은 파일 경로가 lucide `check` 로 그려진다. PanelRowDevice·HearingDeviceInfo 좌·우 단추 이름이 같다.
105
+ - `reviewTableName` "N차 복습"·`duplicateTable` "(복사)" 가 저장 이름에 한국어로 붙는다. 한국어 원본 상수(POS_LABEL 등)를 계속 공개할지.
106
+ - 앞 판에 적은 결정(저장 실패 반환·오프셋 없는 시각·Board 빈 문구·Rating 조작 소수·ConfirmPopup 거절)은 그대로.
107
+
10
108
  ## 0.136.0
11
109
 
12
110
  5차 검수 판이다 — 이번에는 아직 깊이 안 본 곳(context·i18n·유틸, 입력·표시 컴포넌트, 팝업·툴팁·단어표 도구, 훈련 단계)을