@ihabdevteam/core 0.318.0 → 0.322.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 +336 -0
- package/dist/components.cjs.js +22 -22
- package/dist/components.esm.css +2 -2
- package/dist/hooks.cjs.js +3 -3
- package/dist/i18n.cjs.js +3 -3
- package/dist/ihabdevteam-core.cjs.js +188 -188
- package/dist/ihabdevteam-core.d.ts +144 -63
- package/dist/packages/core/src/components/HearingDeviceInfo.d.ts +5 -5
- package/dist/packages/core/src/components/HearingDeviceInfo.js +2 -2
- package/dist/packages/core/src/components/PanelRow.d.ts +2 -4
- package/dist/packages/core/src/components/PanelRow.js +2 -2
- package/dist/packages/core/src/components/Popup/DeviceListPopup.d.ts +4 -8
- package/dist/packages/core/src/components/Popup/DeviceListPopup.js +1 -1
- package/dist/packages/core/src/components/Popup/DeviceSideTable.js +3 -3
- package/dist/packages/core/src/components/Popup/ListPopup.js +3 -3
- package/dist/packages/core/src/components/Popup/LoadTablePopup.js +3 -3
- package/dist/packages/core/src/components/Training/NoisePlayerContext.d.ts +7 -4
- package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.css +19 -0
- package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.d.ts +16 -1
- package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.js +8 -6
- package/dist/packages/core/src/components/Training/TrainingBlock.js +2 -2
- package/dist/packages/core/src/components/Training/TrainingCardGroup.d.ts +20 -1
- package/dist/packages/core/src/components/Training/TrainingCardGroup.js +2 -2
- package/dist/packages/core/src/components/Training/TrainingPagePopup.d.ts +15 -0
- package/dist/packages/core/src/components/Training/TrainingPagePopup.js +4 -4
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.d.ts +16 -1
- package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.js +2 -2
- package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +2 -2
- package/dist/packages/core/src/components/Training/TrainingStepCardOrder.js +14 -1
- package/dist/packages/core/src/components/Training/TrainingStepConfirm.d.ts +3 -1
- package/dist/packages/core/src/components/Training/TrainingStepConfirm.js +42 -30
- package/dist/packages/core/src/components/Training/TrainingStepTextBox.js +2 -2
- package/dist/packages/core/src/components/Training/oneShotSound.d.ts +1 -1
- package/dist/packages/core/src/components/Training/oneShotSound.js +3 -3
- package/dist/packages/core/src/components/Training/stepAnswerable.d.ts +60 -10
- package/dist/packages/core/src/components/Training/trainingMissStats.js +2 -2
- package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +9 -9
- package/dist/packages/core/src/components/Word/WordTableBlock.css +25 -0
- package/dist/packages/core/src/components/Word/WordTableBlock.js +2 -2
- package/dist/packages/core/src/components/Word/wordScoreStats.js +2 -2
- package/dist/packages/core/src/components/Word/wordTableRecommend.js +2 -2
- package/dist/packages/core/src/components/wordTableLayout.d.ts +5 -3
- package/dist/packages/core/src/hooks/inputModality.d.ts +1 -1
- package/dist/packages/core/src/hooks/inputModality.js +1 -1
- package/dist/packages/core/src/hooks/useDeviceManagement.d.ts +5 -17
- package/dist/packages/core/src/hooks/useDeviceManagement.js +20 -8
- package/dist/packages/core/src/hooks/usePageResetOnChange.d.ts +3 -3
- package/dist/packages/core/src/hooks/usePageResetOnChange.js +6 -6
- package/dist/packages/core/src/hooks/useTablePaging.d.ts +16 -5
- package/dist/packages/core/src/hooks/useTablePaging.js +20 -9
- package/dist/packages/core/src/hooks/useWordAttributeFilter.d.ts +10 -1
- package/dist/packages/core/src/hooks/useWordAttributeFilter.js +11 -2
- package/dist/packages/core/src/hooks/useWordTrainingFilter.d.ts +8 -4
- package/dist/packages/core/src/hooks/useWordTrainingFilter.js +44 -7
- package/dist/packages/core/src/i18n/locales/en.json +8 -5
- package/dist/packages/core/src/i18n/locales/ko.json +8 -5
- package/dist/packages/core/src/utils/devWarn.d.ts +2 -2
- package/dist/packages/core/src/utils/devWarn.js +5 -5
- package/dist/packages/core/src/utils/filterPanelSummary.d.ts +1 -1
- package/dist/packages/core/src/utils/filterPanelSummary.js +4 -4
- package/dist/packages/core/src/utils/navScroll.d.ts +2 -2
- package/dist/packages/core/src/utils/navScroll.js +4 -4
- package/dist/packages/core/src/utils/phonemePairSearch.js +10 -3
- package/dist/packages/core/src/utils/pressable.d.ts +1 -1
- package/dist/packages/core/src/utils/pressable.js +3 -3
- package/dist/packages/core/src/utils/sessionTab.d.ts +7 -7
- package/dist/packages/core/src/utils/sessionTab.js +9 -9
- package/dist/packages/core/src/utils/textSort.d.ts +15 -5
- package/dist/packages/core/src/utils/textSort.js +19 -9
- package/dist/packages/core/src/utils/wordAttributeFilterCodes.d.ts +37 -0
- package/dist/packages/core/src/utils/wordAttributeFilterCodes.js +60 -3
- package/dist/packages/core/src/utils/wordTrainingPool.js +3 -2
- package/dist/packages/core/src/version.d.ts +1 -1
- package/dist/packages/core/src/version.js +1 -1
- package/dist/utils.cjs.js +7 -3
- package/package.json +2 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,8 +7,333 @@ All notable changes to this project will be documented in this file.
|
|
|
7
7
|
> 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
|
|
8
8
|
> 제 이야기를 못 찾는다.
|
|
9
9
|
|
|
10
|
+
## 0.322.0 — 공개 API 를 영어로
|
|
11
|
+
|
|
12
|
+
### 공개 API 의 이름을 영어로 — **값은 그대로**(그날 아침)
|
|
13
|
+
|
|
14
|
+
안쪽은 한글로 쓰는 저장소지만, **배포 `d.ts` 는 소비자 편집기에 그대로 보인다.** 거기 한글로
|
|
15
|
+
나가던 자리를 영어로 돌렸다(사장님 지시 2026-10-13). **옮기기 전에 사용처를 먼저 셌다** —
|
|
16
|
+
소리방향성·kscan 은 모든 이름에서 0 이다.
|
|
17
|
+
|
|
18
|
+
| 자리 | 전 | 후 | 소비자 사용처 |
|
|
19
|
+
|---|---|---|---|
|
|
20
|
+
| `effectiveSpeechVolume`·`effectiveNoiseVolume`·`noiseElementVolume` 이 받는 타입 | `비율설정` | `SpeechVolumeSettings` | 0 — 타입 이름을 적는 곳이 없다 |
|
|
21
|
+
| `posLabels`·`wordTypeLabels` 가 받는 타입 | `번역` | `Translate` | 0 |
|
|
22
|
+
| 등급 설명 줄 | `등급설명` | `gradeDescriptions` | 0 — 말귀의 같은 이름 함수는 제 지역 것이다(`./gradeInfoLines`) |
|
|
23
|
+
| `HearingDeviceInfo`·`PanelRow`·`DeviceListPopup` 의 `devices`·`deviceHistory` | `{ 좌: …; 우: … }` | `Record<DeviceSide, …>` | 모양만 바뀌어 호출부는 그대로 |
|
|
24
|
+
| `useTableSort()` 가 돌려주는 것 | `{ 정렬, 칸 }` | `{ sort, field }` + 옛 이름 유지 | 말귀 **77 줄** — 한 번에 걷으면 통째로 빨개진다 |
|
|
25
|
+
|
|
26
|
+
**`useTableSort` 는 영어 이름을 더하고 한글 이름을 `@deprecated` 로 남겼다** — `sort`·`field`
|
|
27
|
+
가 정본이고 `정렬`·`칸` 은 같은 값을 가리킨다. 소비자가 옮긴 뒤 걷는다. 그래서 이번 판은
|
|
28
|
+
**아무 호출부도 안 깨진다.**
|
|
29
|
+
|
|
30
|
+
**`DeviceSide = '좌' | '우'` 는 그대로다 — 그것은 이름이 아니라 값이다.** 서버의 `side` 열과
|
|
31
|
+
그대로 오가는 자료라(말귀 `direction` ↔ `row.side`, 앱·어드민 **21 파일·80 줄**이 그 값을
|
|
32
|
+
적는다) 바꾸려면 **DB 결정**이 필요하다. 칸 사이 선 값(`'표시'`·`'점선'`·`'코너'`·`'미표시'`)도
|
|
33
|
+
같은 몫으로 뒀다. **그날 저녁 `DeviceSide` 에 결정이 나 값까지 옮겼다 — 아래 절을 본다.**
|
|
34
|
+
|
|
35
|
+
다시 생기지 않게 문을 뒀다(`test/publicApiEnglishNames1013.test.ts`) — **주석을 걷고** 한글
|
|
36
|
+
선언·인자 이름을 세고, 옛 이름으로 남겨 둔 것만 허락하며, **옛 이름 옆에 영어 이름이 함께
|
|
37
|
+
있는지**와 `DeviceSide` 값이 그대로인지까지 본다. (이 못은 처음에 배포 `d.ts` 를 셌다 —
|
|
38
|
+
**헌 몸을 보고 있었다.** 같은 날 말귀가 짚어 소스를 세도록 고쳤다. 아래 ★ 를 본다.)
|
|
39
|
+
|
|
40
|
+
### 남은 공개 한글 이름 일곱 + 서명 속 인자 열 — 말귀가 세어 왔다
|
|
41
|
+
|
|
42
|
+
아침에 다섯 자리를 옮긴 뒤 **말귀가 링크를 걸고 다시 셌다**(2026-10-13). 일곱이 더 있었다.
|
|
43
|
+
제 저장소 식별자를 통째로 영어로 옮기는 중이라(1,884파일·7,149이름) 코어 쪽 자리도 함께 짚어 왔다.
|
|
44
|
+
|
|
45
|
+
| 이름 | 자리 | 전 → 후 | 들여오는 소비자 |
|
|
46
|
+
|---|---|---|---|
|
|
47
|
+
| 칸 견주개 | `utils/textSort.ts` | `칸순` → **`compareCell`** | 말귀 `import` **5줄** — 옛 이름 남김 |
|
|
48
|
+
| 빈 값 뒤로 | `utils/textSort.ts` | `칸순빈값뒤` → **`compareCellBlankLast`** | 0 |
|
|
49
|
+
| 한국어 차례 | `utils/textSort.ts` | `한글순` → **`compareKorean`** | 0 |
|
|
50
|
+
| 등급 빔 판정 | `utils/wordAttributeFilterCodes.ts` | `빈등급인가` → **`isBlankGrade`** | 0 |
|
|
51
|
+
| 기본 통 고르개 | `utils/navScroll.ts` | `기본통고르개` → **`DEFAULT_SCROLL_SELECTOR`** | 0 |
|
|
52
|
+
| 단계 상태 타입 | `components/Training/stepAnswerable.ts` | `단계상태` → **`StepState`** | 0 |
|
|
53
|
+
| 마지막 입력 | `hooks/inputModality.ts` | `키보드로눌렀나` → **`wasKeyboardPress`** | 0 |
|
|
54
|
+
|
|
55
|
+
**`칸순` 만 영어 이름을 더하고 옛 이름을 `@deprecated` 로 남겼다** — 나머지 여섯은 코어 바깥에
|
|
56
|
+
쓰는 데가 없어 그냥 바꿨다. 내 쪽에서도 세어 보고 옮겼다: 말귀 `src` 의 `import` 5줄,
|
|
57
|
+
어드민의 세 줄은 **주석**이고, kscan·소리방향성은 **파일 0개**다.
|
|
58
|
+
|
|
59
|
+
**서명 속 인자·멤버 이름 열도 영어로.** 안 깨지지만 소비자 편집기 툴팁에 그대로 뜨던 자리다 —
|
|
60
|
+
`buildFilterSummary(…, allLabel)` · `isSessionForThisTab(incoming, thisTab)` ·
|
|
61
|
+
`devWarnOnce(key, …args)` · `scrollNavTargetToTop(…, from)` · `pressable(…, options)` ·
|
|
62
|
+
`usePageResetOnChange(key, …)` · `useTableSort().sortRows(rows, getValue)`.
|
|
63
|
+
|
|
64
|
+
### `DeviceSide` 의 **값**을 영어로 — `'좌' | '우'` → `'left' | 'right'`
|
|
65
|
+
|
|
66
|
+
**이것은 이름이 아니라 값이다.** 서버 `managed_device.direction` 열에 그대로 오가는 자료라
|
|
67
|
+
코어가 혼자 정할 수 없어 아침에는 손대지 않고 **사장님 판단거리로 올렸다.** 그 사이 말귀가
|
|
68
|
+
라이브를 읽어 왔다 — 그 값을 담는 열은 **하나**(`public.managed_device.direction`, text,
|
|
69
|
+
nullable), 줄은 **15줄**(`좌` 9 · `우` 6), CHECK 제약 **없음**, 그 값을 보는 함수 **0개**,
|
|
70
|
+
정책·색인은 값에 안 기댄다. **바꾸는 값이 `UPDATE` 두 줄**이라는 것을 알고 정하셨다
|
|
71
|
+
(2026-10-13 사장님 지시 "left, right 로 바꾸고 계속 진행해").
|
|
72
|
+
|
|
73
|
+
**가름이 틀렸던 것이 아니라, 가름 덕에 결정을 기다릴 수 있었다.**
|
|
74
|
+
|
|
75
|
+
| 바뀐 것 | 안 바뀐 것 |
|
|
76
|
+
|---|---|
|
|
77
|
+
| `DeviceSide` · `useDeviceManagement` 의 `Side` 타입 값 | **화면에 찍히는 글자** — 사전이 쥔다(`t('device.direction.left', '좌')`) |
|
|
78
|
+
| `devices` · `deviceHistory` 의 열쇠(`{ left, right }`) | 사전 열쇠 `device.direction.left`·`.right` |
|
|
79
|
+
| `DeviceRow.side` · `onAddDevice`·`onOpenList`·`onRemoveDevice`·`onRelease` 가 주는 값 | `DeviceForm.direction` 의 타입(`string` 그대로) |
|
|
80
|
+
|
|
81
|
+
`'좌'`·`'우'` 가 코어에 남은 자리는 **사전이 빌 때의 되돌이 글자** 셋뿐이다(`HearingDeviceInfo`
|
|
82
|
+
· `PanelRow` · `DeviceSideTable`) — 그것은 값이 아니다. `test/panelRowDevice.test.tsx:89` 가
|
|
83
|
+
그 글자가 그대로 `'좌'` 로 찍히는 것을 잰다. 값만 바뀌고 **화면은 그대로**라는 증거다.
|
|
84
|
+
|
|
85
|
+
**너그럽게 받는 몫은 소비자가 진다**(사장님 결정). 코어의 `toSide` 는 `'left'`·`'right'` 만
|
|
86
|
+
받고, 옛 값이 오면 **조용히 `null`** 이다 — 터지지도 찍지도 않고 기기가 안 골라진다. 그래서
|
|
87
|
+
소비자는 **코어에 넘기기 전에** 옮긴다. 말귀는 DB 와 오가는 길목 한 자리에 세워 두었다
|
|
88
|
+
(`toDbDirection`/`fromDbDirection`, 말귀 `15c483ced`) — DB `UPDATE` 가 끝나면 항등식이 되어
|
|
89
|
+
걷힌다. 코어에서 함께 받으면 두 자리가 같은 일을 하고, 나중에 **어느 쪽이 걷혔는지 아무도
|
|
90
|
+
모르게 된다.**
|
|
91
|
+
|
|
92
|
+
`wordTrainingGenerators.ts` 의 `'ㅜ': '우'` 는 **홀소리 표**라 손대지 않았다 — 값이 같은
|
|
93
|
+
글자라서 일괄 치환하면 여기가 조용히 깨진다. 자리마다 세어 고쳤다.
|
|
94
|
+
|
|
95
|
+
### ★ 그 못은 **헌 `dist`** 를 보고 있었다 — 말귀가 짚었다
|
|
96
|
+
|
|
97
|
+
아침에 세운 `publicApiEnglishNames1013` 은 배포 `d.ts` 만 셌다. 말귀가 링크로 읽어 보니
|
|
98
|
+
`비율설정` → `SpeechVolumeSettings` 를 **커밋한 뒤에도** `dist/ihabdevteam-core.d.ts` 에는
|
|
99
|
+
옛 이름이 그대로 있었다. 묶기 전에 돌면 그 못은 **없어진 이름을 보고 판정한다.**
|
|
100
|
+
|
|
101
|
+
묶은 몸으로 이름을 세면 **묶인 때**에 매인다. 이름 규칙은 **소스**에서 센다.
|
|
102
|
+
|
|
103
|
+
그래서 **소스를 센다** — `src` 안의 `export` 이름과 **공개 함수의 인자 이름**까지. `exports` 가
|
|
104
|
+
`./utils/*` 를 열어 두니 `src` 의 `export` 는 사실상 다 공개다(말귀가 `utils/textSort` 를 바로
|
|
105
|
+
들여오는 것이 그 증거다). `dist` 는 곁셈으로만 보고, **소스보다 새것일 때만** 본다 — 헌것이면
|
|
106
|
+
*"안 쟀다"* 고 적는다. 안 센 것을 초록이라 말하지 않는다.
|
|
107
|
+
|
|
108
|
+
같은 때 셈을 `npm run dist:fresh` 가 이미 하고 있었다 — 이 못은 그것을 **이름 셈 안으로** 들였다.
|
|
109
|
+
|
|
110
|
+
## 0.321.0
|
|
111
|
+
|
|
112
|
+
### (209) `TrainingCardGroup.beforeSort` — 정렬 드롭다운 **왼쪽** 자리
|
|
113
|
+
|
|
114
|
+
사장님 지시(노션 QA *"단어표, 대립쌍표의 그룹 순서 변경 기능 필요"*): *"그룹 자체를 드래그
|
|
115
|
+
하거나 **정렬 왼쪽에 올림 내림 버튼**을 넣어서 동작하도록 해줘"*. 그룹 짓기·이름 바꾸기·
|
|
116
|
+
지우기는 있는데 **차례를 바꿀 길이 없었다.** 머리줄이 `제목 … sort … actions` 라 소비자가
|
|
117
|
+
쓸 수 있는 자리는 정렬 **오른쪽**(`actions`) 하나뿐이었다.
|
|
118
|
+
|
|
119
|
+
**코어가 여는 것은 자리 하나다.** 사장님이 말씀하신 두 길(끄는 손잡이 · ↑↓ 단추)이 **둘 다
|
|
120
|
+
이 자리에 든다** — 무엇을 세울지와 차례를 간수하는 것은 부르는 쪽 몫이다(차례는 DB 에
|
|
121
|
+
조직 공용으로 둔다).
|
|
122
|
+
|
|
123
|
+
- `actions` 와 **같은 감싸개** 안이라 누름이 **접기 토글로 안 번진다.** 밖에 두면 ↑ 를 누를
|
|
124
|
+
때마다 그 그룹이 접힌다.
|
|
125
|
+
- **정렬이 없어도 혼자 선다** — `sort || actions` 에만 자리를 열면 정렬 없는 목록에서 조용히
|
|
126
|
+
안 그려진다.
|
|
127
|
+
- 안 주면 지금과 같다.
|
|
128
|
+
|
|
129
|
+
> **낭독기 이름은 부르는 쪽이 단다** — (54)① 와 같은 규칙이다. `위로` 가 그룹 수만큼 서면
|
|
130
|
+
> 단추 목록에서 못 가린다. `'국어' 그룹 위로` 꼴로 지어 넘긴다.
|
|
131
|
+
|
|
132
|
+
> 못은 **"왼쪽" 과 "안 번짐"** 을 함께 센다 — 있나/없나만 세면 오른쪽에 붙여도 초록이라
|
|
133
|
+
> 문서 차례(`compareDocumentPosition`)로 센다. 넷으로 깨 봤다(오른쪽에 두기 · 감싸개 밖에
|
|
134
|
+
> 두기 · 정렬 있어야만 열기 · 번짐 막느라 토글까지 죽이기), 넷 다 운다.
|
|
135
|
+
|
|
136
|
+
> 소비자 할 일: 세 자리(`WordTableGroup` · `TrainingGroupList` · `TrainingPlanListBody`)에
|
|
137
|
+
> `beforeSort` 로 차례 손잡이를 넘긴다. **코어가 열었다고 화면이 바뀌지는 않는다.**
|
|
138
|
+
|
|
139
|
+
### (210) `모두 선택 해제`·`모두 다른 …으로` 를 **표 바로 아래**로
|
|
140
|
+
|
|
141
|
+
사장님 지시(대립쌍표 만들기 화면을 짚으시며): *"모두 선택해제, 모두 다른 대립쌍으로 버튼을
|
|
142
|
+
**표 바로 아래**에 두도록 해줘"*.
|
|
143
|
+
|
|
144
|
+
**가름은 처음부터 있었고, 자리가 그 가름을 안 보였다.** 액션 줄 가운데 주석에 *"표를 손보는
|
|
145
|
+
단추들 끝 — 아래부터는 표를 드나드는 단추들이다"* 라고 적어 두고도 둘을 **한 줄에** 뒀다.
|
|
146
|
+
그 줄은 이름·설명 칸 **아래**라, 손보는 단추가 제가 손보는 표에서 멀찍이 떨어져 섰다
|
|
147
|
+
(말귀 실측 1403 폭: 표 바닥 → 그 줄까지 **440px**). 눈은 표를 보는데 손은 화면 끝으로 간다.
|
|
148
|
+
|
|
149
|
+
표를 손보는 것 `모두 선택 해제` · `actionsLeftExtra` → **표 바로 아래**(새 줄)
|
|
150
|
+
표를 드나드는 것 `불러오기` · `새 창으로 보기` · 인쇄 · 저장 → 아래 액션 줄 그대로
|
|
151
|
+
|
|
152
|
+
**고르개를 안 뒀다.** 이 조각을 쓰는 소비자는 한 곳뿐이고(대립쌍표 만들기 · 단어표 만들기),
|
|
153
|
+
**둘 다 옮긴다**(사장님 결정). 고르개를 두면 아무도 안 돌리는 손잡이가 남는다.
|
|
154
|
+
|
|
155
|
+
> 계약 못(`wordTableBlockActionsLeftExtra`)이 묻는 것은 안 바뀌었다 — 덧붙은 것이 *손보는
|
|
156
|
+
> 무리에, `모두 선택 해제` 다음에* 드는가. 바뀐 것은 그 무리가 **어느 줄에 서는가**뿐이다.
|
|
157
|
+
> 새 줄은 **표보다 뒤이고 이름칸보다 앞**인지를 둘 다 묻는다 — 하나만 물으면 **반쯤 되돌려도
|
|
158
|
+
> 안 운다**(실제로 그 반쪽 되돌림을 깨서 확인했다).
|
|
159
|
+
|
|
160
|
+
> 소비자 할 일: **없다.** `actionsLeftExtra` 는 그대로 넘기면 새 자리에 선다.
|
|
161
|
+
|
|
162
|
+
### (211) 그 줄을 **가운데**로, 단추는 **48** 로
|
|
163
|
+
|
|
164
|
+
사장님 지시(화면 보시고): *"가운데 배치"* · *"size 48"*. (210) 으로 옮긴 줄이 왼쪽 끝에
|
|
165
|
+
붙어, 가운데 선 종이와 한 덩이로 안 읽혔다(말귀 실측 1403 폭: 줄 폭 1272, 단추 둘이 왼끝).
|
|
166
|
+
|
|
167
|
+
**크기는 이웃을 따라간다.** 아래 액션 줄에 섰을 때 40 이었던 것은 맞았다 — 거기서는
|
|
168
|
+
`불러오기`·`새 창으로 보기` 와 한 무리였다. 표 밑으로 오면서 **이웃이 바뀌었고**, 부르는
|
|
169
|
+
쪽이 `actionsLeftExtra` 로 넘기는 짝이 48 이라 40 으로 두면 한 줄에서 키가 어긋난다.
|
|
170
|
+
**자리를 옮기면서 크기를 안 따져 본 것이 (210) 의 빠뜨림이다.**
|
|
171
|
+
|
|
172
|
+
놀이터 실측: `justify-content: center` · 단추 `button48` · **줄 가운데 647 = 단추 가운데
|
|
173
|
+
647 = 표 가운데 647** — 세 축이 같다. 폰에서 두 칸 격자는 그대로다(`1fr` 두 칸이라 남는
|
|
174
|
+
자리가 없어 가운데가 아무 일도 안 한다).
|
|
175
|
+
|
|
176
|
+
> 아래 액션 줄은 `space-between` 그대로 둔다 — 거기는 **양끝에 갈라 세우는** 줄이다.
|
|
177
|
+
|
|
178
|
+
> 소비자 할 일: 없다. 짝이 되는 단추를 48 로 넘기면 키가 맞는다(말귀는 이미 올렸다).
|
|
179
|
+
|
|
180
|
+
## 0.320.0
|
|
181
|
+
|
|
182
|
+
### (206) 여럿 고르기의 `확인` 단추를 걷었다 — **내는 자리가 하나가 됐다**
|
|
183
|
+
|
|
184
|
+
사장님 지시: *"확인버튼 제거 하라고 했어"* · *"UX 바꾸지 마"*(뒤 말은 **고치는 방식**을
|
|
185
|
+
바꾸지 말라는 뜻이다). 내는 자리가 `결과보기` 하나가 되었으니 **갈래가 없어졌다** —
|
|
186
|
+
이제 다섯 자리가 `canAnswerStep` 하나를 쓴다(`Card` · `ConfirmWithText` · `Confirm` 두
|
|
187
|
+
갈래 다 · `CardOrder`).
|
|
188
|
+
|
|
189
|
+
**막이 한 줄을 함께 열었다.** 단추만 걷으면 `multiSelect && currentState !== 'active'`
|
|
190
|
+
가 남아 **고름이 첫 한 번에 얼어붙고**, 그러면 지키라 하신 *"수정할 수 있어야 해"* 를
|
|
191
|
+
**단추를 걷어서 어기는** 꼴이 된다.
|
|
192
|
+
|
|
193
|
+
**빈 집합도 보고한다.** 처음에는 `next.size > 0` 으로 막았는데 제 못에 걸렸다 — 하나를
|
|
194
|
+
골랐다 되눌러 빼면 화면은 비는데 기록은 `['물']` 로 남았다(옛 결함과 같은 꼴). *"기억이
|
|
195
|
+
안 난다"* 와 *"안 풀었다"* 는 **값이 아니라 부름 자취**가 가른다 — 한 번도 안 누르면
|
|
196
|
+
`onDone` 이 아예 안 나가고, 골랐다 뺀 사람은 **빈 집합으로** 나간다.
|
|
197
|
+
|
|
198
|
+
**(102) 가 틀렸던 것이 아니다 — 내는 자리가 옮겨졌다.** 그때 세운 두 까닭(① 개수가 과제가
|
|
199
|
+
되면 안 된다 · ② 덜 기억한 답도 그 사람의 답이다)은 **지금도 안 깨진다.** 못을 그 두
|
|
200
|
+
까닭으로 다시 적었다 — *단추가 있나* 는 꼴이고, 묻는 것은 **까닭이 아직 서는가**다.
|
|
201
|
+
|
|
202
|
+
> 소비자 할 일: **없다.** 코어가 단추를 안 그리므로 앱은 그대로다.
|
|
203
|
+
|
|
204
|
+
### (207) `hideNoiseRows` — 소음 두 줄을 **안 그린다**
|
|
205
|
+
|
|
206
|
+
`TrainingPagePopup` → `TrainingPagePopupBottom` → `NoiseSettingsTooltip` 세 자리를 지나는
|
|
207
|
+
칸 하나. 켜면 `소음 종류`·`소음 비율` 두 줄이 **사라진다**(`전체 소리`·`재생 속도` 는 그대로).
|
|
208
|
+
|
|
209
|
+
- **흐리게가 아니라 안 그린다.** 흐린 줄은 *"지금은 못 바꾼다"* 를 말하는데, 할 말은
|
|
210
|
+
*"이 훈련에는 소음이 없다"* 다.
|
|
211
|
+
- **`noiseOverride` 와 따로다** — 덮개는 *값*, 이 칸은 *보임*. 묶으면 *"덮개는 걸되 줄은
|
|
212
|
+
보이게"* 를 못 한다(소음 하 문장 듣기의 제안 갈래가 그 꼴이다).
|
|
213
|
+
|
|
214
|
+
> 소비자 할 일: 소음 없는 세 훈련(짧은 이야기 듣기 · 긴 이야기 듣기 · 문장 순서화)에서
|
|
215
|
+
> `hideNoiseRows` 를 켠다. **`noiseOverride` 만으로는 줄이 안 사라진다** — 그쪽은 값이다.
|
|
216
|
+
|
|
217
|
+
### (208) 소음 두 줄을 감춰도 설정 창 **가로 폭은 그대로**
|
|
218
|
+
|
|
219
|
+
(207) 을 화면에서 보신 사장님이 바로 짚으셨다 — *"팝업 길이가 짧아지네? 짧아지지 않도록"*
|
|
220
|
+
(**가로 폭만**, 높이는 두 줄만큼 줄어든다). 이 창의 폭은 `소음 종류` 세그먼트가 정한다 —
|
|
221
|
+
보기 다섯 × 단추 최소폭 — 이고 슬라이더 줄은 폭이 없어 그 줄을 따라 늘어난다. 두 줄을
|
|
222
|
+
빼면 슬라이더가 제 최소폭으로 줄어 **528 → 301** 이 됐다(말귀_2 · 놀이터 실측 같은 값).
|
|
223
|
+
|
|
224
|
+
**숫자를 베끼지 않았다.** `min-width: 528px` 로 박으면 보기 글자(영어)나 단추 최소폭 토큰이
|
|
225
|
+
바뀔 때 어긋나고 아무도 안 센다. 대신 **같은 세그먼트를 보이지 않게 한 줄 더 세워**
|
|
226
|
+
(`noise-settings__width-ghost`, `aria-hidden` + `inert`, 높이 0) 브라우저가 폭을 재게 했다 —
|
|
227
|
+
참 줄과 같은 보기 배열·같은 `PanelRow`·같은 크기라 어느 언어에서든 같은 폭이 된다.
|
|
228
|
+
|
|
229
|
+
놀이터 실측: 두 줄 있을 때 **528 / 530**(패널/툴팁) · 두 줄 없을 때 **528 / 530** · 그림자 높이
|
|
230
|
+
**0**. 폰 폭(375)에서는 `max-width: calc(100vw - 40px)` 가 먼저 걸려 **335**, 넘침 없음
|
|
231
|
+
(`scrollWidth` = 375). 빈 라벨(`""`)로는 라벨 칸(72)이 안 그려져 440 이 나왔다 — 빈 칸(nbsp)으로
|
|
232
|
+
둔다.
|
|
233
|
+
|
|
234
|
+
> 실측에서 `.panel-row__label` 을 세면 **셋**이 나온다 — 셋째는 그림자의 빈 칸이다. 글자로
|
|
235
|
+
> 세면 둘이다. `[aria-label="소음 종류"]` 는 여전히 0.
|
|
236
|
+
|
|
237
|
+
### (205) 등급 필터에 `없음` — 등급이 **빈** 단어도 고른다
|
|
238
|
+
|
|
239
|
+
사장님 지시: *"빈 칸도 인정하는 걸로. 등급은 `없음` 으로 표현해"*. **다섯** 자리를 함께 고쳤다 —
|
|
240
|
+
코드 목록(`GRADE_NONE`) · 사전(`없음`/`None`) · 필터 줄(`buildGradeSection`, 맨 끝) ·
|
|
241
|
+
맞추개(`matchesFilters`) · **단어훈련 풀과 훅**(`wordTrainingPool` · `useWordTrainingFilter`).
|
|
242
|
+
|
|
243
|
+
> 처음엔 *넷* 이라 적고 묶었다. 말귀_1 이 재서 다섯째를 찾았다 — 매니저 단어표는 맞는데
|
|
244
|
+
> **단어훈련 페이지**에서는 `없음` 칩이 영영 안 켜지고 `[""]` 가 저장됐다. 단어훈련 풀이 같은
|
|
245
|
+
> 거름 결정을 **두 줄로 따로** 갖고 있었고(`!w.grade || !gradeSet.has(w.grade)`), 훅은 라벨에서
|
|
246
|
+
> 숫자만 남겨 코드를 만들었다. **같은 결정이 세 자리에 적혀 있으면 하나는 안 따라온다** —
|
|
247
|
+
> 거르는 결정을 `matchesGradeCodes` **하나**로 모았고, 못이 *그 밖에 그 결정을 적은 자리가
|
|
248
|
+
> 없는지* 를 글로 센다. 저장돼 있던 `[""]` 는 되읽을 때 버린다(`isGradeCode`).
|
|
249
|
+
|
|
250
|
+
**이것은 값이 아니라 빔이다.** `'1'`~`'4'` 는 단어의 `grade` 에 그 글자가 들어 있지만
|
|
251
|
+
어느 단어의 `grade` 도 `'none'` 이 아니다 — 가리키는 것은 **`grade` 가 비어 있다**는
|
|
252
|
+
사실이다(`undefined`·`null`·`''`, 공백만 든 것도). 그래서 맞추개가 이 코드만 `빈등급인가`
|
|
253
|
+
로 간다.
|
|
254
|
+
|
|
255
|
+
`GRADE_NONE` · `빈등급인가` 는 **공개 API 가 아니다** — `wordAttributeFilterCodes` 모듈
|
|
256
|
+
전체가 내부다(`wordAttributeValueCodeOf` 도 안 나간다). 소비자가 쓰는 것은 필터 줄을
|
|
257
|
+
내주는 `buildGradeSection` 쪽이고, 그쪽은 공개다. 처음에 *"새 공개 손잡이 둘"* 이라
|
|
258
|
+
적었다가 묶은 `.d.ts` 를 세어 보고 고쳤다 — **공개인지는 소스가 아니라 묶은 알맹이가
|
|
259
|
+
말한다.**
|
|
260
|
+
|
|
261
|
+
> **되거름이 거짓 초록을 만들 수 있던 자리를 막았다.** 맞추개에는 코드로 못 읽은 라벨에서
|
|
262
|
+
> 숫자만 남기는 길이 있는데(`'3등급'` → `'3'`), `'없음'` 은 숫자가 없어 `''` 가 되고 그러면
|
|
263
|
+
> `word.grade === ''` 로 **빈 등급이 우연히 걸린다.** 사전에서 라벨이 빠진 날 *겉보기에는
|
|
264
|
+
> 되는* 꼴이 되어 그 다음 흠을 못 찾는다. **빈 되거름은 아무것도 안 맞춘다.**
|
|
265
|
+
|
|
266
|
+
> 소비자 할 일: 없다. 쓰던 필터 구성은 그대로 읽힌다(`없음` 을 안 고르면 전과 같다).
|
|
267
|
+
|
|
268
|
+
### `npm run dist:fresh` — 묶인 **때**를 센다
|
|
269
|
+
|
|
270
|
+
링크로 코어를 보는 쪽이 **"소스는 새것, 몸은 헌것"** 을 읽는 것을 막는다. `src` 에서 가장
|
|
271
|
+
늦게 고친 파일과 `dist` 들목, 그리고 **걸린 소비자의 산 vite 캐시**까지 견준다.
|
|
272
|
+
|
|
273
|
+
같은 날 말귀 둘이 같이 속았다 — 판 이름만 `0.319.0` 이고 `dist` 는 48분 헌것이었다.
|
|
274
|
+
**이름으로는 셀 수 없다**(묶으면 `canAnswerStep` → `ra` 로 줄어 **새것이어도 0건**) —
|
|
275
|
+
그래서 때를 센다. 눈먼 자리도 적어 뒀다: 때는 *"몸이 바뀜"* 과 *"때만 밀림"* 을 못 가른다.
|
|
276
|
+
놓치면 한 시간, 헛울면 30초 — **헛울기를 골랐다.**
|
|
277
|
+
|
|
278
|
+
`CONSUMING.md §2-0-5` 의 `rm -rf node_modules/.vite-core*` 를 `.vite*` 로 고쳤다 —
|
|
279
|
+
소비자가 `VITE_CACHE_DIR` 로 딴 이름을 쓰면 **안 잡혔다.** 이름을 짐작하지 않는다.
|
|
280
|
+
|
|
281
|
+
## 0.319.0
|
|
282
|
+
|
|
283
|
+
### (201) 을 **재서** 넓혔다 — 넷이 열리고, 하나는 이 집안이 아니었다
|
|
284
|
+
|
|
285
|
+
말귀가 네 조각을 **화면에서 다 쟀다**(2026-10-12). 짐작으로 넓히지 않고 **잰 것만** 옮겼다:
|
|
286
|
+
|
|
287
|
+
Confirm(한 개 고르기) 오늘의 듣기 › 짧은 이야기 `농구` 뒤 `축구` 를 눌러도 안 옮겨짐 · disabled:false
|
|
288
|
+
CardOrder 단어훈련 › 듣고 순서대로 기억하기 3번을 다시 눌러도 안 풀림
|
|
289
|
+
(앞서 0.318.0) Card · ConfirmWithText
|
|
290
|
+
|
|
291
|
+
**`Confirm` 은 갈래를 갈랐다.** *"여럿 고르기는 `확인` 이 틈을 메운다"* 는 제 면제가 **한 개 고르기
|
|
292
|
+
갈래에는 안 걸린다**(말귀가 짚었다) — 거기는 `확인` 이 없고 **고르는 순간이 곧 답**이다. 그래서
|
|
293
|
+
한 개 고르기만 열고, **여럿 고르기는 그대로 막는다**: 고름만 열면 `확인`(`handleMultiSubmit`)이
|
|
294
|
+
아직 막혀 **선택은 바뀌는데 못 내는** 꼴이 된다 — 옛 막이가 막으려던 바로 그 어긋남이다.
|
|
295
|
+
그 갈래를 쓰는 화면을 말귀가 **못 찾아 재지 못했으니** 둘을 함께 열어야 한다.
|
|
296
|
+
|
|
297
|
+
**`CardOrder` 는 풀기만 열었다.** 이 갈래는 **마지막 한 장이 단계를 넘기므로**(`every(v => v !== null)`)
|
|
298
|
+
세 번째를 잘못 누르는 순간 판이 끝났다 — 앞의 둘은 풀리는데 **마지막만 못 푸는** 꼴이다.
|
|
299
|
+
`onDone` 조건은 **그대로 뒀다**(새로 채워 다 찼을 때만) — 그래서 **미완성 답이 점수로 남지 않는다**:
|
|
300
|
+
풀면 화면만 비고, 고쳐 다시 채우는 순간 `onDone` 이 **고친 차례**로 나간다.
|
|
301
|
+
|
|
302
|
+
### 제 셈이 틀렸다 — `OrderList` 는 이 집안이 아니다
|
|
303
|
+
|
|
304
|
+
처음에 같은 막이를 **여섯**으로 셌는데, `TrainingStepOrderList` 의 `!== 'active'` 는 **조작 막이가
|
|
305
|
+
아니라** `useEffect` 안의 **첫 보고 문**이다((103) 의 `initial`). 글자가 같아서 같은 꼴로 세어졌다 —
|
|
306
|
+
**"글로 자리를 집을 때는 그 글이 하나인지 먼저 센다"** 를 어제 적어 두고 **내 셈에서 밟았다.**
|
|
307
|
+
|
|
308
|
+
말귀가 재서 바로잡았다: 그 `move` 는 **원래 안 막혀 있고**(끝낸 단계에서 또 옮겨 차례가 바뀌는
|
|
309
|
+
것을 확인) 한때 `done` 에서 닫았다가 **되돌린 기록**(`92b71ac`, 2026-09-14)이 그 파일에 있다 —
|
|
310
|
+
*한 번 옮기는 순간 단추가 모두 사라져 문장 순서화를 끝까지 맞출 수 없었다.* **셋째 갈래로 적었다**:
|
|
311
|
+
*옮긴 넷 · 아직 막는 하나 · 이 집안 아님 하나.*
|
|
312
|
+
|
|
313
|
+
### 옛 계약 시험을 **세 번째로** 고쳤다
|
|
314
|
+
|
|
315
|
+
`TrainingStepDoneReadonly` 를 오늘 세 번 고쳤다(한 조각 → 둘 → 넷). 고칠 때마다 **값이 들어와서**
|
|
316
|
+
고친 것이고, 그 셋을 머리말에 그대로 뒀다 — **"넷이 같아야 한다 로 되돌리지 말 것. 갈라진 것은
|
|
317
|
+
재서 갈라진 것이다."**
|
|
318
|
+
|
|
10
319
|
## 0.318.0
|
|
11
320
|
|
|
321
|
+
### (205) 등급 툴팁을 **한 열쇠에 배열로** 둔다 (말귀 청, 같은 날)
|
|
322
|
+
|
|
323
|
+
처음엔 `difficultyInfo1`~`5` 로 나눴는데 셋이 나빴다. **①** 말귀 못(`deadI18nKeys`)이 **산 열쇠를
|
|
324
|
+
죽은 것으로** 셌다 — 그 못은 `a.b.${x}` 처럼 **점 자리에서 잘린 앞머리**를 쓰는 것으로 세는데, 이것은
|
|
325
|
+
*마지막 마디 뒤에 숫자를 붙여* 안 걸린다(그쪽이 얼린 목록에 다섯 줄을 넣어 트리를 돌렸다 — 배열이면
|
|
326
|
+
그 다섯 줄이 함께 걷힌다). **②** 줄 수가 다섯에 **못 박힌다**. **③** 앱이 이미 배열(`returnObjects`)을 쓴다.
|
|
327
|
+
|
|
328
|
+
`wordPairs.filter.difficultyInfo` 를 **배열 하나**로 두고 `등급설명(t)` 이 받는다 — 사전이 배열을 안
|
|
329
|
+
주면(옛 사전을 덮어쓴 소비자 등) **한국어 원문으로 물러선다**(빈 줄을 안 띄운다). 재 보고 적는다:
|
|
330
|
+
`returnObjects` 는 배열을 그대로 주고 `defaultValue` 도 배열로 물러선다(i18next 26.4.1).
|
|
331
|
+
못은 *배열인가 · 숫자 열쇠가 안 남았나 · 두 사전의 줄 수가 같나 · 배열이 아닐 때 물러서나* 를 센다.
|
|
332
|
+
|
|
333
|
+
> **"글로 자리를 집을 때는 그 글이 하나인지 먼저 센다" 의 반대쪽**이다(말귀가 줄인 말). 오늘 두 번은
|
|
334
|
+
> *한 글이 여러 자리*라서 틀렸고, 여기는 **못이 세는 꼴과 부르는 꼴이 어긋나** 산 열쇠가 죽은 것으로
|
|
335
|
+
> 보였다.
|
|
336
|
+
|
|
12
337
|
### (205) 등급 툴팁 — **세 화면이 한 말을 한다**
|
|
13
338
|
|
|
14
339
|
코어는 *"국립국어원의 기초 어휘 등급이 결과에 반영됩니다"* **한 줄**이었다. 그 말로는 **1등급이
|
|
@@ -148,6 +473,10 @@ All notable changes to this project will be documented in this file.
|
|
|
148
473
|
앱이 다른 화면 날짜를 모은 뒤, **말귀매니저에 남은 점 꼴은 기기 탭 그 둘뿐**이었다 — 한 창 안에서
|
|
149
474
|
기기 탭의 `2026.09.09` 와 프로필·보고서의 `2026년 9월 9일` 이 나란히 섰다.
|
|
150
475
|
|
|
476
|
+
**소비자 시험의 흉내에 `i18n` 이 필요해진다** — `PanelRow` 가 이제 `i18n.language` 를 읽으므로,
|
|
477
|
+
`useTranslation` 을 `t` 만 주도록 흉내 낸 시험은 **거짓 빨강**이 난다(말귀_1 이 받자마자 넷 겪었다 —
|
|
478
|
+
`i18n: { language: 'ko' }` 한 줄로 풀렸다). *코드가 쓰는 길을 흉내가 안 받아 주면 거짓 빨강이다.*
|
|
479
|
+
|
|
151
480
|
`lang` 을 받아 `formatDateLocale` 로 넘긴다(한국어 `2026년 9월 9일` · 영어 `Sep 9, 2026` — 앱이 모은
|
|
152
481
|
그 꼴과 같다). **반쪽 값**(연도만 · 연월만)은 그 말로 옮길 수가 없어 점 꼴 그대로다(서버에 월·일이
|
|
153
482
|
`null` 로 오는 옛 기록이 있다). `lang` 을 안 주면 예전 그대로다.
|
|
@@ -185,6 +514,13 @@ All notable changes to this project will be documented in this file.
|
|
|
185
514
|
|
|
186
515
|
### (120) `ListPopup.onSelect` 가 **선택**이 됐다
|
|
187
516
|
|
|
517
|
+
> **쓰는 쪽이 한 걸음 더 해야 끝난다**(말귀_1 실측 2026-10-12에 드러남). 코어가 연 것은 *안 넘길
|
|
518
|
+
> 수 있게* 한 것이고, **넘기면 그 꾸밈은 그대로 선다** — 받고 바로 재니 줄이 여전히
|
|
519
|
+
> `cursor:pointer`·`tabindex="0"`·낭독 설명을 달고 있었다. 앱이 **빈 함수를 계속 넘기고** 있었기
|
|
520
|
+
> 때문이다. 앱 세 자리(`TrainingListPopup` · `customerPickPurposes` · `CustomerPickPopup`)에서
|
|
521
|
+
> 그것을 걷고 나서야 `cursor:auto` · 정지점 없음 · 설명 없음이 됐다. **열어 주는 고침은 "소비자가
|
|
522
|
+
> 무엇을 바꿔야 끝나는가" 를 함께 적어야 한다** — 이 줄이 그 몫이다.
|
|
523
|
+
|
|
188
524
|
그 값이 그대로 `Table` 의 `onRowClick` 이 되고, `Table` 은 **그것이 있다는 것만 보고** 줄을 꾸민다
|
|
189
525
|
(손가락 커서 · `tabindex="0"` · *"줄을 누르면 자세히 봅니다"*). 그래서 누를 것이 없는 표도 **빈 함수를
|
|
190
526
|
넘겨야** 했고 그 꾸밈이 그대로 섰다 — 자판으로 쓰는 사람은 **줄마다 멈췄다**(스무 줄이면 스무 번).
|