@ihabdevteam/core 0.330.0 → 0.332.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 +123 -0
- package/dist/components.cjs.js +184 -184
- package/dist/components.esm.css +1 -1
- package/dist/hooks.cjs.js +1 -1
- package/dist/i18n.cjs.js +1 -1
- package/dist/ihabdevteam-core.cjs.js +187 -187
- package/dist/ihabdevteam-core.d.ts +22 -1
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.css +8 -4
- package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +71 -10
- package/dist/packages/core/src/components/Training/questionSoundRoute.d.ts +11 -0
- package/dist/packages/core/src/components/Training/questionSoundRoute.js +66 -0
- package/dist/packages/core/src/components/barChartData.d.ts +0 -2
- package/dist/packages/core/src/components/barChartData.js +4 -2
- package/dist/packages/core/src/components/barChartMonthKey.d.ts +39 -15
- package/dist/packages/core/src/components/barChartMonthKey.js +46 -18
- package/dist/packages/core/src/components.d.ts +1 -0
- package/dist/packages/core/src/components.js +3 -0
- 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,129 @@ All notable changes to this project will be documented in this file.
|
|
|
7
7
|
> 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
|
|
8
8
|
> 제 이야기를 못 찾는다.
|
|
9
9
|
|
|
10
|
+
## 0.332.0 — 달 열쇠를 `"2026-10"` 으로 — 자리표와 이름표를 가른다
|
|
11
|
+
|
|
12
|
+
사장님이 바꾸라고 하셨다. 0.329.0 에서 **꼴을 아는 자리를 하나로 모아 둔** 덕에 코어 쪽은
|
|
13
|
+
`barChartMonthKey.ts` 한 파일이면 됐다.
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
달 열쇠 "2026년 10월" → "2026-10"
|
|
17
|
+
주 값 "2026년 10월#2" → "2026-10#2"
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
### 왜 바꾸나 — 한국어처럼 생긴 **자리표**라 이름표와 섞였다
|
|
21
|
+
|
|
22
|
+
0.325.0 의 결함이 바로 그 섞임이었다. 달 드롭다운에 열쇠 글자가 그대로 떴고, **한국어
|
|
23
|
+
화면에서는 그럴듯해 보여** 영어 화면에서만 티가 났다. `"2026-10"` 은 누가 봐도 이름표가
|
|
24
|
+
아니다. 보이는 글은 `yearMonthLabel` 이 Intl 로 짓는다 — 그쪽은 **안 바뀐다.**
|
|
25
|
+
|
|
26
|
+
**달은 두 자리로 채운다**(`2026-01`). 안 채우면 글자 차례가 달 차례와 어긋난다(`2026-10` 이
|
|
27
|
+
`2026-9` 앞에 선다). `parseMonthKey` 는 **안 채운 것도, `2026-13` 도 거절한다** — 받아 주면
|
|
28
|
+
짓는 쪽과 뜯는 쪽이 어긋나도 조용하고, 그 조용함이 바로 열쇠가 안 맞는 결함이다.
|
|
29
|
+
|
|
30
|
+
### 소비자와 **맞춰서** 했다
|
|
31
|
+
|
|
32
|
+
말귀_1 이 먼저 그쪽 자리를 느슨하게 하고, 그 뒤에 코어가 바꿨다. **담아 두는 자리는 양쪽 다
|
|
33
|
+
없다**(`localStorage` 등) — 옛 열쇠가 남아 빈 칸이 되는 길은 없다. 양쪽이 따로 훑어 셌다.
|
|
34
|
+
|
|
35
|
+
> **주 값은 코어가 뜯지 않는다.** `getControlDateRange` 는 `weekRanges.find(o => o.value ===
|
|
36
|
+
> weekRange)` 로 맞춰 보고 구조화된 `year`·`month`·`week` 만 읽는다. 앱이 제 꼴을 써도 된다.
|
|
37
|
+
|
|
38
|
+
### 세는 자리도 함께 — **셈을 두 번 틀렸다**
|
|
39
|
+
|
|
40
|
+
- **소비자 자리를 열일곱이라 셌는데 열하나였다.** 여섯은 **이름표**였다(창 제목·날 이름표).
|
|
41
|
+
`'2026년 9월'` 이라는 글자만 보고 세어, 이 저장소가 늘 경계하던 섞임을 제 셈에서 저질렀다.
|
|
42
|
+
말귀_1 이 바로잡아 주었다.
|
|
43
|
+
- **코어 시험 73 군데를 바꾸며 한 자리를 잘못 바꿨다.** `dateBoundaryFixes0915` 의 한 줄이
|
|
44
|
+
DatePicker 가 **보여 주는** 달 이름표였는데 열쇠인 줄 알고 바꿨다 — 못이 울어 되돌렸다.
|
|
45
|
+
이름표 쪽 파일 셋은 처음부터 손대지 않았다.
|
|
46
|
+
|
|
47
|
+
### 못이 제 몫을 했다
|
|
48
|
+
|
|
49
|
+
`barChartMonthKey` 하나만 고쳤는데 **닻**(`test/monthKeyOneDecision.test.ts`)이 *"주인 파일에
|
|
50
|
+
그 꼴이 없다"* 고 울어, 못의 꼴도 함께 고쳐야 한다는 것을 그 자리에서 말했다.
|
|
51
|
+
|
|
52
|
+
못을 고치며 한 가지를 바꿨다 — 옛 꼴(`…년 …월`)은 글자가 뚜렷해 저장소 전체에서 세도
|
|
53
|
+
헛걸림이 없었는데, 새 꼴은 `${…}-${…}` 라 **저장소에 서른넷이 걸린다**(날짜·전화·아이디…).
|
|
54
|
+
그래서 **짓는 쪽은 막대판 식구 안에서만** 세고, 뜯는 쪽(정규식)은 전체에서 센다. 틀은
|
|
55
|
+
**두 토막으로 끝나는 것**만 집는다 — 안 그러면 같은 식구의 ISO 날짜 한 줄이 헛으로 걸린다
|
|
56
|
+
(실제로 걸렸다).
|
|
57
|
+
|
|
58
|
+
### **내보낸다** — 안 그러면 꼴을 아는 자리가 저장소를 건넌다
|
|
59
|
+
|
|
60
|
+
`monthKeyOf` · `monthKeyOfDate` · `parseMonthKey` · `weekValueOf` 를 공개했다.
|
|
61
|
+
|
|
62
|
+
`buildMonthChartData` 가 돌려주는 꾸러미를 소비자가 **열쇠로 찾아야** 하는데, 꼴을 알 길이
|
|
63
|
+
없으면 제 손으로 짓는다 — 실제로 오늘 소비자 쪽에 `monthKeyShape.ts` 가 생길 뻔했다.
|
|
64
|
+
그러면 꼴을 아는 자리가 **저장소를 건너 둘**이 되고, 이 파일이 막으려던 바로 그 결함이
|
|
65
|
+
더 먼 자리에서, 더 늦게 난다. 짓는 것도 뜯는 것도 코어 것을 쓰게 한다.
|
|
66
|
+
|
|
67
|
+
### 걷은 덫 — 열쇠를 이름표 자리에 넣어 두었다
|
|
68
|
+
|
|
69
|
+
`genMonthOptions` 가 `label: v` 로 **열쇠를 그대로** 이름표에 넣고 있었다. 아무도 안 읽어
|
|
70
|
+
조용했지만, 읽는 날 화면에 자리표가 그대로 뜬다 — 0.325.0 이 그 꼴이었다. 뗐다.
|
|
71
|
+
|
|
72
|
+
### 곁다리 — 시험 하나가 **여유 37ms** 로 서 있었다
|
|
73
|
+
|
|
74
|
+
`dailySelectionHasData` 가 훅의 포기(10초)를 15초 시한으로 기다렸다. 재 보니 실제로는
|
|
75
|
+
**14,963ms** 다 — `40 × 250ms = 10초` 는 **틱 사이 일을 안 센 값**이고, 매 틱의 다시 그림과
|
|
76
|
+
2초마다의 받기 기다림이 얹힌다. 기계가 조금만 바빠도 울었다. 게다가 그 줄의 주석은
|
|
77
|
+
*"시간을 앞당긴다"* 고 적혀 있었는데 **가짜 타이머가 없었다** — 글이 하는 일과 달랐다.
|
|
78
|
+
시한을 넉넉히 주고 **잰 값을 적었다.**
|
|
79
|
+
|
|
80
|
+
## 0.331.0 — (307) 다시 듣기 셋 — 사장님 지적 · 말귀_1 실측
|
|
81
|
+
|
|
82
|
+
### ① 줄을 **가운데**로 맞춘다 — `baseline` 이 아니다
|
|
83
|
+
|
|
84
|
+
`baseline` 이면 `display:flex` 인 단추의 **제 안 아이콘 바닥**이 기준선이 된다. 그래서 32px
|
|
85
|
+
단추가 줄 높이를 정하고 26px 낱말이 위로 밀렸다. 브라우저 실측(놀이터 1280px, 한 줄짜리
|
|
86
|
+
여섯 줄): `baseline` → **3.5px** 어긋남, `center` → **0**. 말귀_1 이 앱에서 3px 로 같은 것을 쟀다.
|
|
87
|
+
|
|
88
|
+
> 0.328.0 에서 단추에만 `align-self: center` 를 건 것은 **아무 일도 안 했다** — 단추가 이미
|
|
89
|
+
> 줄을 꽉 채우니 제 안에서 가운데로 가도 그대로다. 줄을 맞춰야 한다. 그 글이 남아 있으면
|
|
90
|
+
> 다음 사람이 또 그 길로 가므로 함께 걷었다.
|
|
91
|
+
|
|
92
|
+
### ② 단추가 **변형을 받지 않는다** — 기본이다
|
|
93
|
+
|
|
94
|
+
사장님이 화면에서 두 번 짚으셨다. 앱은 이 자리를 못 바꾼다 — 코어가 넘기는 prop 이고,
|
|
95
|
+
앱 CSS 로 코어를 겨누지 않는 것이 이 집 규약이다. 그래서 코어가 뗀다.
|
|
96
|
+
|
|
97
|
+
### ③ **코어가 그 문항을 읽을 때 쓴 길을 그대로 탄다**
|
|
98
|
+
|
|
99
|
+
0.328.0 은 부르는 쪽이 넘긴 주소 하나만 봤다. 그래서 **정식 음원이 없는 낱말에는 단추가
|
|
100
|
+
아예 안 섰다** — 말귀_1 실측으로 다섯 줄 중 둘(다른 판에서는 다섯 중 셋)이 그랬다.
|
|
101
|
+
그런데 **훈련 중에는 다 들렸다**: 코어가 리졸버와 합성으로 읽어 주고 있었다. 다시 듣기만
|
|
102
|
+
반쪽을 보고 있었던 것이다.
|
|
103
|
+
|
|
104
|
+
길은 넷이다 — ① 넘긴 날 주소 ② `urlResolver`(저장소의 정식 음원) ③ `fallbackUrlResolver`
|
|
105
|
+
(그때 합성) ④ 브라우저 `speechSynthesis`. 이 차례가 `TrainingWordCard` 와
|
|
106
|
+
`TrainingStepAudioPlayer` 에 **두 벌**로 적혀 있었고, 팝업에 세 벌째를 쓰지 않으려고
|
|
107
|
+
`src/components/Training/questionSoundRoute.ts` 하나로 모았다. **재생과 임자(자물쇠)는 거기서
|
|
108
|
+
안 다룬다** — 부르는 쪽마다 쥐는 법이 다르고 그 다름이 각자의 내력에 적혀 있다.
|
|
109
|
+
|
|
110
|
+
이제 단추가 서는 조건은 "주소를 받았나" 가 아니라 **"코어가 이것을 읽을 길이 있나"** 다.
|
|
111
|
+
앱이 주소를 지어 넘기지 않아도 된다.
|
|
112
|
+
|
|
113
|
+
**날 주소는 누름 그 자리에서 튼다.** 차례를 다 모은 뒤에 틀도록 짰더니 `await` 가 하나
|
|
114
|
+
끼었고, 그러면 자동재생 막음이 `play()` 를 거절할 수 있다 — 누름의 표가 `await` 를 못 넘는
|
|
115
|
+
브라우저가 있다. 시험 셋이 그 바뀜을 잡았다.
|
|
116
|
+
|
|
117
|
+
**임자 셈으로 "못 틀었다" 와 "사람이 멈췄다" 를 가른다.** `done` 은 둘 다 거짓이다. 그것만
|
|
118
|
+
보고 다음 주소로 넘어가면 **멈추라고 누른 사람이 다음 소리를 듣는다.**
|
|
119
|
+
|
|
120
|
+
브라우저 끝까지 실측(놀이터, 주소가 하나도 없는 여섯 줄): 단추 6/6 · 누르니
|
|
121
|
+
`speechSynthesis.speaking === true` · 이름표가 `1번 듣기 멈춤` · 다시 누르니 멈춤 · 오류 0.
|
|
122
|
+
|
|
123
|
+
### 옛 결정 하나를 **고쳐 적는다**
|
|
124
|
+
|
|
125
|
+
(303) 때 *"못 찾으면 단추를 안 그린다 — 안 넘기는 쪽은 지금과 똑같아야 한다"* 로 적어 둔
|
|
126
|
+
것이 반쪽이었다. 그 글을 시험 머리말에서 고치고, 길이 **하나도 없을 때만** 안 선다로 바꿨다.
|
|
127
|
+
그 둘을 세던 못도 다시 적었다 — jsdom 에 말소리가 없어 **우연히** 초록이던 자리다.
|
|
128
|
+
|
|
129
|
+
못 일곱을 더 세우고 **다섯 가지로 깨 봤다**(단추 조건을 옛 꼴로 · 폴백을 길에서 빼기 ·
|
|
130
|
+
임자 셈 빼기 · `baseline` 되돌리기 · 변형 되살리기). 임자 셈 깨기는 **처음에 안 울렸다** —
|
|
131
|
+
고리 머리의 검사가 남아 반만 뺀 것이었다. 제대로 빼니 울었다.
|
|
132
|
+
|
|
10
133
|
## 0.330.0 — (304) 문턱이 **헛돌았다** — 말귀_1 실측 (0.328.0 회귀)
|
|
11
134
|
|
|
12
135
|
말귀_1 이 앱에서 쟀다: 375×812 채점지에서 그려진 재생 단추가 **9.5px** 인데
|