@ihabdevteam/core 0.310.0 → 0.312.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 (37) hide show
  1. package/CHANGELOG.md +90 -0
  2. package/dist/components.cjs.js +176 -176
  3. package/dist/components.esm.css +2 -2
  4. package/dist/hooks.cjs.js +3 -3
  5. package/dist/i18n.cjs.js +3 -3
  6. package/dist/ihabdevteam-core.cjs.js +185 -185
  7. package/dist/ihabdevteam-core.d.ts +101 -6
  8. package/dist/packages/core/src/components/CountTile.css +4 -0
  9. package/dist/packages/core/src/components/CountTile.d.ts +11 -1
  10. package/dist/packages/core/src/components/CountTile.js +2 -2
  11. package/dist/packages/core/src/components/Popup/LoadTablePopup.js +3 -1
  12. package/dist/packages/core/src/components/Popup/Popup.css +12 -0
  13. package/dist/packages/core/src/components/Popup/Popup.d.ts +11 -0
  14. package/dist/packages/core/src/components/Popup/Popup.js +4 -2
  15. package/dist/packages/core/src/components/SideNav.js +24 -5
  16. package/dist/packages/core/src/components/Tooltip/Tooltip.js +16 -1
  17. package/dist/packages/core/src/components/Tooltip/TrainingTooltip.d.ts +31 -3
  18. package/dist/packages/core/src/components/Tooltip/TrainingTooltip.js +25 -13
  19. package/dist/packages/core/src/components/Training/TrainingBlock.css +18 -0
  20. package/dist/packages/core/src/components/Training/TrainingBlockGrid.d.ts +27 -0
  21. package/dist/packages/core/src/components/Training/TrainingBlockGrid.js +65 -0
  22. package/dist/packages/core/src/components/Training/TrainingStep.d.ts +3 -2
  23. package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +14 -9
  24. package/dist/packages/core/src/components.d.ts +3 -1
  25. package/dist/packages/core/src/components.js +1 -0
  26. package/dist/packages/core/src/context/WordDataProvider.d.ts +1 -1
  27. package/dist/packages/core/src/context/WordDataProvider.js +13 -1
  28. package/dist/packages/core/src/i18n/locales/en.json +0 -1
  29. package/dist/packages/core/src/i18n/locales/ko.json +0 -1
  30. package/dist/packages/core/src/utils/blockGrid.d.ts +16 -0
  31. package/dist/packages/core/src/utils/blockGrid.js +28 -0
  32. package/dist/packages/core/src/utils.d.ts +1 -0
  33. package/dist/packages/core/src/utils.js +1 -0
  34. package/dist/packages/core/src/version.d.ts +1 -1
  35. package/dist/packages/core/src/version.js +1 -1
  36. package/dist/utils.cjs.js +1 -1
  37. package/package.json +1 -1
package/CHANGELOG.md CHANGED
@@ -7,6 +7,96 @@ All notable changes to this project will be documented in this file.
7
7
  > 적은 글이라, 지금 이름으로 고쳐 놓으면 그 시절에 그 이름으로 받은 사람이
8
8
  > 제 이야기를 못 찾는다.
9
9
 
10
+ ## 0.312.0
11
+
12
+ 사장님 지시로 돌린 최적화 전수 검수(말귀 `docs/OPTIMIZATION_AUDIT_2026-10-10.md`)에서 코어 몫 셋((113)~(115)).
13
+ 셋 다 **값이 틀린 것이 아니라 같은 일을 여러 번 하는** 자리다 — 그래서 못이 세는 것도 *빠른가* 가 아니라
14
+ *그 일을 한 번만 하나* 다.
15
+
16
+ ### (113) 한국어 글자 견주기는 **콜레이터 하나로** — 30.3ms → 8.1ms
17
+
18
+ `'가'.localeCompare('나', 'ko')` 는 **비교마다 콜레이터를 만든다.** `WordSearchResultBlock` 은 '시작 우선'
19
+ 갈래에서만 만들어 둔 콜레이터를 쓰고 **여섯 갈래는 `localeCompare(…, 'ko')`** 였다 — 하필 기본 정렬이
20
+ `ganada` 라 **주된 길이 느린 쪽**이었다(말귀 실측 6,357개: **30.3ms → 8.1ms**).
21
+
22
+ **자리를 세니 일곱이었다** — 말귀가 짚은 여섯에 `LoadTablePopup` 의 이름 정렬 하나가 더 있었다. 그리고
23
+ 그 파일에 **콜레이터가 하나 더** 있었다(`utils/textSort` 에 이미 있는데 또 만들고 있었다) — 그것도 걷었다.
24
+ 이제 `한글순` 하나다. ISO 날짜·열쇠를 로케일 없이 `localeCompare()` 로 견주는 자리는 **그대로다**(코드포인트
25
+ 차례면 맞고 그쪽이 빠르다).
26
+
27
+ ### (114) `WordDataProvider` 의 값을 **기억해 둔다**
28
+
29
+ 객체 리터럴을 바로 넘겨 **그릴 때마다 새 객체**였다 — 값이 하나도 안 바뀌어도 쓰는 쪽 **열한 자리가 다**
30
+ 다시 그렸다. 이 프로바이더는 앱 전체를 감싼다.
31
+
32
+ > **앱에서는 흠이 아닌 것이 코어에서는 흠이다.** 앱은 React 컴파일러가 이런 자리를 메워 주지만
33
+ > **코어 묶음에는 컴파일러가 안 닿는다**(말귀 실측: `dist` 에 `_c(` 0건). 소비자가 어떤 빌드를 쓰는지
34
+ > 코어는 모르니 **코어는 손으로 적는다.**
35
+
36
+ ### (115) 굴림마다 하는 일을 **틀에 한 번**으로 — 다만 닫는 일은 안 미룬다
37
+
38
+ `SideNav` 가 `scroll` 마다 바로 `setState`(값이 같아도 새 객체라 늘 다시 그렸다), `Tooltip` 이 **문서 전체의
39
+ 굴림을 capture 로** 받아 `computePosition`(레이아웃을 읽는다)을 매번 돌렸다. 둘 다 rAF 로 모으고, `SideNav`
40
+ 는 **값이 그대로면 상태를 안 건드린다.**
41
+
42
+ **닫는 길은 안 미뤘다.** 고정 사각형으로 띄운 툴팁은 굴리면 앵커에서 떨어지므로 그 자리에서 닫아야 한다 —
43
+ 한 틀 미루면 **허공에 한 틀 더** 남는다. 미루는 것은 *자리* 뿐이고, 못이 그 가름을 **둘 다** 센다.
44
+
45
+ ### 못 셋 중 **둘이 처음엔 아무것도 안 지켰다**
46
+
47
+ - (113) 의 인자 뽑개를 `/\.localeCompare\(([^)]*)\)/` 로 썼다. `label(b)` 처럼 인자 안에 괄호가 있으면
48
+ `[^)]*` 가 **첫 `)` 에서 멈춰** 쉼표를 못 본다 — 옛 꼴로 되돌려 돌렸더니 **조용했다.** 괄호를 세게 고쳤고,
49
+ **뽑개 제 시험**을 함께 두었다.
50
+ - (115) 의 `SideNav` 못은 rAF **예약 수**가 `<= 1` 인지만 봤다. 안 모으는 꼴은 예약을 **아예 안 하므로 0** 이고
51
+ 그것도 `<= 1` 이라 통과했다. **한 일**(레이아웃 읽은 횟수)을 세게 고쳤다 — 모았으면 굴림 열 번에 0, 안
52
+ 모았으면 10.
53
+
54
+ > **못은 깨뜨려 보기 전까지 못이 아니다** — 오늘 이 자리에서 세 번째다. 그리고 두 번 다 *세는 수가
55
+ > 한 일이 아니라 거드는 일*이었다(예약 수 · 첫 괄호까지의 글).
56
+
57
+ ## 0.311.0
58
+
59
+ 사용자 지시(2026-10-10): *"오버라이드하거나 반복적으로 주입하는 건 코어에 요청해서 공통으로."* 그 결로
60
+ 말귀가 넷을 청했다((108)~(111)). 넷 다 **앱이 코어 위에 덧칠하거나 코어 치수를 베껴 들고 있던 자리**다.
61
+
62
+ ### (108) `Popup.footerNote` — 바닥 줄 **위**의 한 줄 안내 띠
63
+
64
+ 숙제 창 둘(회원 `info` · 매니저 `.hwd-foot`)이 `.popup-footer` 에 글줄을 싣느라 각자 덧칠했고 **벌써
65
+ 둘이 달랐다**(한쪽만 실선). `footerNote` 한 칸 — 최소 높이 40 · 위로 숨 · 왼쪽 정렬 · `role="note"`.
66
+ 바닥 줄(`buttons`·`footer`·`footerStart/End`)과 **따로** 서고, 바닥 줄이 없어도 선다. 실선은
67
+ `footerNoteDivider` 로 **값으로** 고른다(창마다 있고 없고가 갈리던 자리라서).
68
+
69
+ ### (109) `CountTile.hoverAccent` — 본색 호버 테두리를 prop 하나로
70
+
71
+ 앱이 `.training-card__types .count-tile--interactive:hover { border-color: var(--color-main) }` 로 코어를
72
+ 덮고 있었다. `hoverAccent` 를 켜면 호버 테두리가 `--color-main`. **어디서 켜는지는 앱이 정한다** —
73
+ `TrainingCard` 가 대신 넘기는 꼴로 두면 자리가 둘이 되어 한쪽만 바뀌는 날이 온다. 반응 안 하는 타일에
74
+ 켜도 아무 일이 없다(`--accent` 는 `--interactive` 가 붙을 때만, 색 규칙은 `:hover` 에만 — 쉼 상태까지
75
+ 파랗던 앱 실수 `b43fe2179` 를 코어에 들이지 않는다; 못이 그 규칙이 생기면 운다).
76
+
77
+ ### (110) `TrainingBlockGrid` — 접힐 때만 고르게, **치수는 재서**
78
+
79
+ 정사각 카드 다섯이 넷+하나로 접혀 마지막 한 장이 빈 판 가운데 떠 보였다(사용자 보고). 앱이 코어 치수
80
+ 넷(창 1140 · 좌우 40 · 안쪽 90 실측 · 카드 200/190)을 **베껴 들고** 칸 수를 세어 `--run-cols` 로 주입했다
81
+ — 코어가 하나라도 바꾸면 어긋난다. 새 그리드는 **제 폭과 첫 카드의 폭을 잰다**(`ResizeObserver`) —
82
+ 베낀 수가 **0** 이다. CSS 에 200·190·1140 이 안 적혀 있는 것을 못이 센다. 규칙은 앱의 못이 세어 둔 표
83
+ 그대로(*"무조건이 아니라 개행될 때만"*): 한 줄에 다 들면 그대로, 접히면 5→3+2 · 6→3+3 · 7→4+3.
84
+ 순수 셈 `balancedColumns`·`columnsFitting` 은 `utils` 로도 나간다. 진짜 폭으로 접히는지는 `LIVE-ONLY-CHECKS` 8번.
85
+
86
+ ### (111) `TrainingTooltip.groups` — 자료를 손에 들고 주는 길
87
+
88
+ `plan` 길은 **풀에서 찾는다**. 단어 숙제 세트는 문장 풀에 없어 못 그렸고, 앱이 `tooltip-training__*`
89
+ 클래스를 **빌려** 같은 모양을 손으로 짰다. `groups`(이름표 + `trainingData[]`)로 **같은 상자**를 쓴다 —
90
+ 두 길이 한 모양으로 모여 그려지는 쪽은 어느 길로 왔는지 모른다. `groups` 를 주면 `plan` 은 안 본다.
91
+ `plan` 길은 그대로다 — 넣으며 한 번 "찾은 자료가 있어야 묶음이 선다" 로 바꿨다가 옛 못 넷이 울었다
92
+ (풀에 없는 항목만 든 계획에도 상자·머리글은 떠야 한다 — 타일 호버가 그 상자를 기다린다).
93
+
94
+ ### 걷은 열쇠 — `training.answerLockedHint`
95
+
96
+ 0.310.0 에서 기본 글줄을 걷고 열쇠만 남겼더니 앱 못(`deadI18nKeys`)이 "안 쓰는 열쇠" 로 붉었다. 코어에
97
+ 부르는 곳 0 · 앱에 켤 자리 0 — *아직 안 쓰인 길을 미리 내 둔 것*이다. **걷는다.** 켜는 자리가 생기는 날
98
+ 그 앱 사전에 둔다. 이 열쇠로 `t()` 를 부르던 소비자는 없다(두 저장소 0건).
99
+
10
100
  ## 0.310.0
11
101
 
12
102
  ### `TrainingStep.lockedHint` — **주는 곳에서만 선다, 기본값이 없다** (말귀 요청 (107), 사용자 지시)