@ihabdevteam/core 0.8.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 (848) hide show
  1. package/README.md +591 -0
  2. package/dist/components.cjs.css +19 -0
  3. package/dist/components.cjs.js +975 -0
  4. package/dist/components.esm.css +19 -0
  5. package/dist/components.esm.js +975 -0
  6. package/dist/hooks.cjs.css +1 -0
  7. package/dist/hooks.cjs.js +799 -0
  8. package/dist/hooks.esm.css +1 -0
  9. package/dist/hooks.esm.js +799 -0
  10. package/dist/ihabdevteam-core-tokens.css +1 -0
  11. package/dist/ihabdevteam-core.cjs.js +993 -0
  12. package/dist/ihabdevteam-core.css +1 -0
  13. package/dist/ihabdevteam-core.d.ts +8272 -0
  14. package/dist/ihabdevteam-core.esm.js +993 -0
  15. package/dist/logo/Logo_APEB.svg +53 -0
  16. package/dist/logo/Logo_APEB_black.svg +42 -0
  17. package/dist/logo/Logo_APEB_white.svg +42 -0
  18. package/dist/logo/Logo_HTP_kr.svg +21 -0
  19. package/dist/logo/Logo_HTP_kr_black.svg +17 -0
  20. package/dist/logo/Logo_HTP_kr_white.svg +17 -0
  21. package/dist/logo/Logo_IHAB_en.svg +18 -0
  22. package/dist/logo/Logo_IHAB_en_black.svg +14 -0
  23. package/dist/logo/Logo_IHAB_en_white.svg +14 -0
  24. package/dist/logo/Logo_IHAB_kr.svg +18 -0
  25. package/dist/logo/Logo_IHAB_kr_black.svg +14 -0
  26. package/dist/logo/Logo_IHAB_kr_white.svg +14 -0
  27. package/dist/logo/Logo_SDS_kr.svg +22 -0
  28. package/dist/logo/Logo_SDS_kr_black.svg +18 -0
  29. package/dist/logo/Logo_SDS_kr_white.svg +18 -0
  30. package/dist/logo/Logo_speechearManager_kr.svg +20 -0
  31. package/dist/logo/Logo_speechearManager_kr_black.svg +21 -0
  32. package/dist/logo/Logo_speechearManager_kr_textWhite.svg +45 -0
  33. package/dist/logo/Logo_speechearManager_kr_white.svg +21 -0
  34. package/dist/logo/Logo_speechear_kr.svg +17 -0
  35. package/dist/logo/Logo_speechear_kr_black.svg +16 -0
  36. package/dist/logo/Logo_speechear_kr_textWhite.svg +42 -0
  37. package/dist/logo/Logo_speechear_kr_white.svg +16 -0
  38. package/dist/logo/Symbol_APEB.svg +34 -0
  39. package/dist/logo/Symbol_APEB_black.svg +15 -0
  40. package/dist/logo/Symbol_APEB_white.svg +15 -0
  41. package/dist/logo/Symbol_HTP.svg +14 -0
  42. package/dist/logo/Symbol_HTP_black.svg +10 -0
  43. package/dist/logo/Symbol_HTP_white.svg +10 -0
  44. package/dist/logo/Symbol_IHAB.svg +14 -0
  45. package/dist/logo/Symbol_IHAB_black.svg +10 -0
  46. package/dist/logo/Symbol_IHAB_white.svg +10 -0
  47. package/dist/logo/Symbol_SDS.svg +14 -0
  48. package/dist/logo/Symbol_SDS_black.svg +10 -0
  49. package/dist/logo/Symbol_SDS_white.svg +10 -0
  50. package/dist/logo/Symbol_speechear.svg +15 -0
  51. package/dist/logo/Symbol_speechear_black.svg +16 -0
  52. package/dist/logo/Symbol_speechear_white.svg +16 -0
  53. package/dist/logo/qr_speechear.svg +1 -0
  54. package/dist/packages/core/src/CoreScope.d.ts +40 -0
  55. package/dist/packages/core/src/CoreScope.js +19 -0
  56. package/dist/packages/core/src/components/Accordion.css +125 -0
  57. package/dist/packages/core/src/components/Accordion.d.ts +19 -0
  58. package/dist/packages/core/src/components/Accordion.js +33 -0
  59. package/dist/packages/core/src/components/ActionCard.css +109 -0
  60. package/dist/packages/core/src/components/ActionCard.d.ts +33 -0
  61. package/dist/packages/core/src/components/ActionCard.js +28 -0
  62. package/dist/packages/core/src/components/Alert.css +76 -0
  63. package/dist/packages/core/src/components/Alert.d.ts +18 -0
  64. package/dist/packages/core/src/components/Alert.js +28 -0
  65. package/dist/packages/core/src/components/AudioMeter.css +80 -0
  66. package/dist/packages/core/src/components/AudioMeter.d.ts +49 -0
  67. package/dist/packages/core/src/components/AudioMeter.js +91 -0
  68. package/dist/packages/core/src/components/Avatar.css +42 -0
  69. package/dist/packages/core/src/components/Avatar.d.ts +21 -0
  70. package/dist/packages/core/src/components/Avatar.js +31 -0
  71. package/dist/packages/core/src/components/Badge.css +166 -0
  72. package/dist/packages/core/src/components/Badge.d.ts +82 -0
  73. package/dist/packages/core/src/components/Badge.js +62 -0
  74. package/dist/packages/core/src/components/BarChart.css +142 -0
  75. package/dist/packages/core/src/components/BarChart.d.ts +16 -0
  76. package/dist/packages/core/src/components/BarChart.js +187 -0
  77. package/dist/packages/core/src/components/Board.css +85 -0
  78. package/dist/packages/core/src/components/Board.d.ts +39 -0
  79. package/dist/packages/core/src/components/Board.js +12 -0
  80. package/dist/packages/core/src/components/BottomNav.css +105 -0
  81. package/dist/packages/core/src/components/BottomNav.d.ts +32 -0
  82. package/dist/packages/core/src/components/BottomNav.js +92 -0
  83. package/dist/packages/core/src/components/Breadcrumb.css +62 -0
  84. package/dist/packages/core/src/components/Breadcrumb.d.ts +13 -0
  85. package/dist/packages/core/src/components/Breadcrumb.js +10 -0
  86. package/dist/packages/core/src/components/BulkBar.css +75 -0
  87. package/dist/packages/core/src/components/BulkBar.d.ts +22 -0
  88. package/dist/packages/core/src/components/BulkBar.js +40 -0
  89. package/dist/packages/core/src/components/Button.css +655 -0
  90. package/dist/packages/core/src/components/Button.d.ts +5 -0
  91. package/dist/packages/core/src/components/Button.js +202 -0
  92. package/dist/packages/core/src/components/Calendar.css +249 -0
  93. package/dist/packages/core/src/components/Calendar.d.ts +23 -0
  94. package/dist/packages/core/src/components/Calendar.js +92 -0
  95. package/dist/packages/core/src/components/ChartSection.css +191 -0
  96. package/dist/packages/core/src/components/ChartSection.d.ts +42 -0
  97. package/dist/packages/core/src/components/ChartSection.js +22 -0
  98. package/dist/packages/core/src/components/Checkbox.css +94 -0
  99. package/dist/packages/core/src/components/Checkbox.d.ts +16 -0
  100. package/dist/packages/core/src/components/Checkbox.js +15 -0
  101. package/dist/packages/core/src/components/ChoiceChips.css +65 -0
  102. package/dist/packages/core/src/components/ChoiceChips.d.ts +15 -0
  103. package/dist/packages/core/src/components/ChoiceChips.js +8 -0
  104. package/dist/packages/core/src/components/CircleBadge.d.ts +31 -0
  105. package/dist/packages/core/src/components/CircleBadge.js +20 -0
  106. package/dist/packages/core/src/components/CodeBox.css +62 -0
  107. package/dist/packages/core/src/components/CodeBox.d.ts +18 -0
  108. package/dist/packages/core/src/components/CodeBox.js +132 -0
  109. package/dist/packages/core/src/components/ColorPicker.css +40 -0
  110. package/dist/packages/core/src/components/ColorPicker.d.ts +17 -0
  111. package/dist/packages/core/src/components/ColorPicker.js +23 -0
  112. package/dist/packages/core/src/components/CompanyMeta.css +33 -0
  113. package/dist/packages/core/src/components/CompanyMeta.d.ts +14 -0
  114. package/dist/packages/core/src/components/CompanyMeta.js +12 -0
  115. package/dist/packages/core/src/components/CountTile.css +47 -0
  116. package/dist/packages/core/src/components/CountTile.d.ts +22 -0
  117. package/dist/packages/core/src/components/CountTile.js +24 -0
  118. package/dist/packages/core/src/components/DatePicker.css +151 -0
  119. package/dist/packages/core/src/components/DatePicker.d.ts +13 -0
  120. package/dist/packages/core/src/components/DatePicker.js +107 -0
  121. package/dist/packages/core/src/components/Dialog.css +98 -0
  122. package/dist/packages/core/src/components/Dialog.d.ts +31 -0
  123. package/dist/packages/core/src/components/Dialog.js +51 -0
  124. package/dist/packages/core/src/components/Divider.css +33 -0
  125. package/dist/packages/core/src/components/Divider.d.ts +13 -0
  126. package/dist/packages/core/src/components/Divider.js +14 -0
  127. package/dist/packages/core/src/components/Dropdown.css +175 -0
  128. package/dist/packages/core/src/components/Dropdown.d.ts +23 -0
  129. package/dist/packages/core/src/components/Dropdown.js +117 -0
  130. package/dist/packages/core/src/components/Effect/EffectPartyPopper.css +25 -0
  131. package/dist/packages/core/src/components/Effect/EffectPartyPopper.d.ts +11 -0
  132. package/dist/packages/core/src/components/Effect/EffectPartyPopper.js +298 -0
  133. package/dist/packages/core/src/components/Effect/EffectPartyPopperHost.d.ts +5 -0
  134. package/dist/packages/core/src/components/Effect/EffectPartyPopperHost.js +13 -0
  135. package/dist/packages/core/src/components/EmptyState.css +23 -0
  136. package/dist/packages/core/src/components/EmptyState.d.ts +19 -0
  137. package/dist/packages/core/src/components/EmptyState.js +7 -0
  138. package/dist/packages/core/src/components/ErrorState.css +2 -0
  139. package/dist/packages/core/src/components/ErrorState.d.ts +18 -0
  140. package/dist/packages/core/src/components/ErrorState.js +11 -0
  141. package/dist/packages/core/src/components/FileUpload.css +114 -0
  142. package/dist/packages/core/src/components/FileUpload.d.ts +25 -0
  143. package/dist/packages/core/src/components/FileUpload.js +111 -0
  144. package/dist/packages/core/src/components/FilterPanel.css +188 -0
  145. package/dist/packages/core/src/components/FilterPanel.d.ts +34 -0
  146. package/dist/packages/core/src/components/FilterPanel.js +82 -0
  147. package/dist/packages/core/src/components/FilterSectionInfo.d.ts +12 -0
  148. package/dist/packages/core/src/components/FilterSectionInfo.js +15 -0
  149. package/dist/packages/core/src/components/Footer.css +186 -0
  150. package/dist/packages/core/src/components/Footer.d.ts +18 -0
  151. package/dist/packages/core/src/components/Footer.js +19 -0
  152. package/dist/packages/core/src/components/Header.css +274 -0
  153. package/dist/packages/core/src/components/Header.d.ts +44 -0
  154. package/dist/packages/core/src/components/Header.js +98 -0
  155. package/dist/packages/core/src/components/HearingDeviceInfo.css +48 -0
  156. package/dist/packages/core/src/components/HearingDeviceInfo.d.ts +22 -0
  157. package/dist/packages/core/src/components/HearingDeviceInfo.js +13 -0
  158. package/dist/packages/core/src/components/Icon.d.ts +14 -0
  159. package/dist/packages/core/src/components/Icon.js +73 -0
  160. package/dist/packages/core/src/components/IconGridMenu.css +141 -0
  161. package/dist/packages/core/src/components/IconGridMenu.d.ts +20 -0
  162. package/dist/packages/core/src/components/IconGridMenu.js +45 -0
  163. package/dist/packages/core/src/components/LandingBottomSticky.css +114 -0
  164. package/dist/packages/core/src/components/LandingBottomSticky.d.ts +26 -0
  165. package/dist/packages/core/src/components/LandingBottomSticky.js +20 -0
  166. package/dist/packages/core/src/components/LandingHeader.css +192 -0
  167. package/dist/packages/core/src/components/LandingHeader.d.ts +67 -0
  168. package/dist/packages/core/src/components/LandingHeader.js +40 -0
  169. package/dist/packages/core/src/components/Loader.css +88 -0
  170. package/dist/packages/core/src/components/Loader.d.ts +14 -0
  171. package/dist/packages/core/src/components/Loader.js +12 -0
  172. package/dist/packages/core/src/components/NoticeBox.css +79 -0
  173. package/dist/packages/core/src/components/NoticeBox.d.ts +21 -0
  174. package/dist/packages/core/src/components/NoticeBox.js +19 -0
  175. package/dist/packages/core/src/components/PageTitle.css +27 -0
  176. package/dist/packages/core/src/components/PageTitle.d.ts +23 -0
  177. package/dist/packages/core/src/components/PageTitle.js +10 -0
  178. package/dist/packages/core/src/components/Pagination.css +11 -0
  179. package/dist/packages/core/src/components/Pagination.d.ts +22 -0
  180. package/dist/packages/core/src/components/Pagination.js +20 -0
  181. package/dist/packages/core/src/components/Panel.css +361 -0
  182. package/dist/packages/core/src/components/Panel.d.ts +166 -0
  183. package/dist/packages/core/src/components/Panel.js +162 -0
  184. package/dist/packages/core/src/components/PassCard/PassCard.css +289 -0
  185. package/dist/packages/core/src/components/PassCard/PassCard.d.ts +56 -0
  186. package/dist/packages/core/src/components/PassCard/PassCard.js +313 -0
  187. package/dist/packages/core/src/components/PassCard/PassCardBg.css +39 -0
  188. package/dist/packages/core/src/components/PassCard/PassCardBg.d.ts +8 -0
  189. package/dist/packages/core/src/components/PassCard/PassCardBg.js +6 -0
  190. package/dist/packages/core/src/components/PassCard/PassCardBgIHAB.css +25 -0
  191. package/dist/packages/core/src/components/PassCard/PassCardBgIHAB.d.ts +7 -0
  192. package/dist/packages/core/src/components/PassCard/PassCardBgIHAB.js +18 -0
  193. package/dist/packages/core/src/components/PassCard/PassCardBgLeftColorGrid.css +45 -0
  194. package/dist/packages/core/src/components/PassCard/PassCardBgLeftColorGrid.d.ts +9 -0
  195. package/dist/packages/core/src/components/PassCard/PassCardBgLeftColorGrid.js +19 -0
  196. package/dist/packages/core/src/components/PassCard/PassCardBgSoundLine.css +19 -0
  197. package/dist/packages/core/src/components/PassCard/PassCardBgSoundLine.d.ts +9 -0
  198. package/dist/packages/core/src/components/PassCard/PassCardBgSoundLine.js +23 -0
  199. package/dist/packages/core/src/components/PassCard/PassCardBgSoundLineV1.css +15 -0
  200. package/dist/packages/core/src/components/PassCard/PassCardBgSoundLineV1.d.ts +9 -0
  201. package/dist/packages/core/src/components/PassCard/PassCardBgSoundLineV1.js +24 -0
  202. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMove.css +16 -0
  203. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMove.d.ts +9 -0
  204. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMove.js +31 -0
  205. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMoveV1.css +16 -0
  206. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMoveV1.d.ts +9 -0
  207. package/dist/packages/core/src/components/PassCard/PassCardBgSoundMoveV1.js +32 -0
  208. package/dist/packages/core/src/components/PassCard/PassCardBgTalk.css +33 -0
  209. package/dist/packages/core/src/components/PassCard/PassCardBgTalk.d.ts +9 -0
  210. package/dist/packages/core/src/components/PassCard/PassCardBgTalk.js +18 -0
  211. package/dist/packages/core/src/components/PassCard/PassCardBgTalkV1.css +36 -0
  212. package/dist/packages/core/src/components/PassCard/PassCardBgTalkV1.d.ts +13 -0
  213. package/dist/packages/core/src/components/PassCard/PassCardBgTalkV1.js +22 -0
  214. package/dist/packages/core/src/components/PassCard/PassCardBgTheme.d.ts +38 -0
  215. package/dist/packages/core/src/components/PassCard/PassCardBgTheme.js +34 -0
  216. package/dist/packages/core/src/components/PassCard/PassCardBgTwoCircle.css +36 -0
  217. package/dist/packages/core/src/components/PassCard/PassCardBgTwoCircle.d.ts +9 -0
  218. package/dist/packages/core/src/components/PassCard/PassCardBgTwoCircle.js +18 -0
  219. package/dist/packages/core/src/components/PassCard/PassCard_Back.css +76 -0
  220. package/dist/packages/core/src/components/PassCard/PassCard_Back.d.ts +13 -0
  221. package/dist/packages/core/src/components/PassCard/PassCard_Back.js +20 -0
  222. package/dist/packages/core/src/components/PassCard/ihabOutlinePath.d.ts +12 -0
  223. package/dist/packages/core/src/components/PassCard/ihabOutlinePath.js +19 -0
  224. package/dist/packages/core/src/components/PassCard/passCardProduct.d.ts +48 -0
  225. package/dist/packages/core/src/components/PassCard/passCardProduct.js +56 -0
  226. package/dist/packages/core/src/components/PaymentPlan.css +318 -0
  227. package/dist/packages/core/src/components/PaymentPlan.d.ts +57 -0
  228. package/dist/packages/core/src/components/PaymentPlan.js +126 -0
  229. package/dist/packages/core/src/components/PersonCard.css +72 -0
  230. package/dist/packages/core/src/components/PersonCard.d.ts +27 -0
  231. package/dist/packages/core/src/components/PersonCard.js +11 -0
  232. package/dist/packages/core/src/components/Popup/ConfirmPopup.d.ts +58 -0
  233. package/dist/packages/core/src/components/Popup/ConfirmPopup.js +59 -0
  234. package/dist/packages/core/src/components/Popup/CouponInputPopup.css +28 -0
  235. package/dist/packages/core/src/components/Popup/CouponInputPopup.d.ts +8 -0
  236. package/dist/packages/core/src/components/Popup/CouponInputPopup.js +45 -0
  237. package/dist/packages/core/src/components/Popup/DeviceListPopup.css +78 -0
  238. package/dist/packages/core/src/components/Popup/DeviceListPopup.d.ts +28 -0
  239. package/dist/packages/core/src/components/Popup/DeviceListPopup.js +31 -0
  240. package/dist/packages/core/src/components/Popup/DeviceSideTable.d.ts +41 -0
  241. package/dist/packages/core/src/components/Popup/DeviceSideTable.js +92 -0
  242. package/dist/packages/core/src/components/Popup/ListPopup.css +44 -0
  243. package/dist/packages/core/src/components/Popup/ListPopup.d.ts +75 -0
  244. package/dist/packages/core/src/components/Popup/ListPopup.js +85 -0
  245. package/dist/packages/core/src/components/Popup/LoadTablePopup.css +248 -0
  246. package/dist/packages/core/src/components/Popup/LoadTablePopup.d.ts +12 -0
  247. package/dist/packages/core/src/components/Popup/LoadTablePopup.js +86 -0
  248. package/dist/packages/core/src/components/Popup/Popup.css +136 -0
  249. package/dist/packages/core/src/components/Popup/Popup.d.ts +77 -0
  250. package/dist/packages/core/src/components/Popup/Popup.js +135 -0
  251. package/dist/packages/core/src/components/Popup/SaveTablePopup.css +32 -0
  252. package/dist/packages/core/src/components/Popup/SaveTablePopup.d.ts +25 -0
  253. package/dist/packages/core/src/components/Popup/SaveTablePopup.js +55 -0
  254. package/dist/packages/core/src/components/Popup/TrainingResultPopup.css +277 -0
  255. package/dist/packages/core/src/components/Popup/TrainingResultPopup.d.ts +14 -0
  256. package/dist/packages/core/src/components/Popup/TrainingResultPopup.js +104 -0
  257. package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.css +119 -0
  258. package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.d.ts +12 -0
  259. package/dist/packages/core/src/components/Popup/WordDataUpdatePopup.js +73 -0
  260. package/dist/packages/core/src/components/Popup/customerDetailUtils.d.ts +19 -0
  261. package/dist/packages/core/src/components/Popup/customerDetailUtils.js +45 -0
  262. package/dist/packages/core/src/components/ProgressBar.css +114 -0
  263. package/dist/packages/core/src/components/ProgressBar.d.ts +65 -0
  264. package/dist/packages/core/src/components/ProgressBar.js +51 -0
  265. package/dist/packages/core/src/components/ProgressIndicator.css +41 -0
  266. package/dist/packages/core/src/components/ProgressIndicator.d.ts +18 -0
  267. package/dist/packages/core/src/components/ProgressIndicator.js +45 -0
  268. package/dist/packages/core/src/components/PromoBanner.css +54 -0
  269. package/dist/packages/core/src/components/PromoBanner.d.ts +30 -0
  270. package/dist/packages/core/src/components/PromoBanner.js +54 -0
  271. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBg.css +8 -0
  272. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDark.css +3 -0
  273. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDark.d.ts +11 -0
  274. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDark.js +20 -0
  275. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDeep.css +3 -0
  276. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDeep.d.ts +10 -0
  277. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDeep.js +19 -0
  278. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDiagonal.css +10 -0
  279. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDiagonal.d.ts +10 -0
  280. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDiagonal.js +19 -0
  281. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDots.css +5 -0
  282. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDots.d.ts +10 -0
  283. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgDots.js +19 -0
  284. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgInstagram.css +3 -0
  285. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgInstagram.d.ts +11 -0
  286. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgInstagram.js +20 -0
  287. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgMain.css +3 -0
  288. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgMain.d.ts +12 -0
  289. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgMain.js +21 -0
  290. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgNaver.css +3 -0
  291. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgNaver.d.ts +11 -0
  292. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgNaver.js +20 -0
  293. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgOutline.css +16 -0
  294. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgOutline.d.ts +11 -0
  295. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgOutline.js +20 -0
  296. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgRadial.css +3 -0
  297. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgRadial.d.ts +10 -0
  298. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgRadial.js +19 -0
  299. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoft.css +3 -0
  300. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoft.d.ts +12 -0
  301. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoft.js +21 -0
  302. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoftSub.css +3 -0
  303. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoftSub.d.ts +10 -0
  304. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSoftSub.js +19 -0
  305. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSub.css +3 -0
  306. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSub.d.ts +10 -0
  307. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSub.js +19 -0
  308. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSuccess.css +3 -0
  309. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSuccess.d.ts +11 -0
  310. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgSuccess.js +20 -0
  311. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgTheme.d.ts +32 -0
  312. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgTheme.js +29 -0
  313. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgWarm.css +3 -0
  314. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgWarm.d.ts +11 -0
  315. package/dist/packages/core/src/components/PromoBannerBg/PromoBannerBgWarm.js +20 -0
  316. package/dist/packages/core/src/components/PromoBannerBg/promoBannerBg.d.ts +21 -0
  317. package/dist/packages/core/src/components/PromoBannerBg/promoBannerBg.js +49 -0
  318. package/dist/packages/core/src/components/PublicationCard.css +70 -0
  319. package/dist/packages/core/src/components/PublicationCard.d.ts +31 -0
  320. package/dist/packages/core/src/components/PublicationCard.js +11 -0
  321. package/dist/packages/core/src/components/Radio.css +64 -0
  322. package/dist/packages/core/src/components/Radio.d.ts +13 -0
  323. package/dist/packages/core/src/components/Radio.js +9 -0
  324. package/dist/packages/core/src/components/RadioGroup.css +14 -0
  325. package/dist/packages/core/src/components/RadioGroup.d.ts +21 -0
  326. package/dist/packages/core/src/components/RadioGroup.js +14 -0
  327. package/dist/packages/core/src/components/Rating.css +69 -0
  328. package/dist/packages/core/src/components/Rating.d.ts +21 -0
  329. package/dist/packages/core/src/components/Rating.js +51 -0
  330. package/dist/packages/core/src/components/RingChart.css +50 -0
  331. package/dist/packages/core/src/components/RingChart.d.ts +68 -0
  332. package/dist/packages/core/src/components/RingChart.js +57 -0
  333. package/dist/packages/core/src/components/SearchSummary.css +62 -0
  334. package/dist/packages/core/src/components/SearchSummary.d.ts +32 -0
  335. package/dist/packages/core/src/components/SearchSummary.js +48 -0
  336. package/dist/packages/core/src/components/Section.css +73 -0
  337. package/dist/packages/core/src/components/Section.d.ts +16 -0
  338. package/dist/packages/core/src/components/Section.js +15 -0
  339. package/dist/packages/core/src/components/SectionHeader.css +87 -0
  340. package/dist/packages/core/src/components/SectionHeader.d.ts +31 -0
  341. package/dist/packages/core/src/components/SectionHeader.js +16 -0
  342. package/dist/packages/core/src/components/SegmentedControl.css +67 -0
  343. package/dist/packages/core/src/components/SegmentedControl.d.ts +26 -0
  344. package/dist/packages/core/src/components/SegmentedControl.js +13 -0
  345. package/dist/packages/core/src/components/ShortcutBadge.css +68 -0
  346. package/dist/packages/core/src/components/ShortcutBadge.d.ts +31 -0
  347. package/dist/packages/core/src/components/ShortcutBadge.js +23 -0
  348. package/dist/packages/core/src/components/SideNav.css +281 -0
  349. package/dist/packages/core/src/components/SideNav.d.ts +32 -0
  350. package/dist/packages/core/src/components/SideNav.js +92 -0
  351. package/dist/packages/core/src/components/Slider.css +184 -0
  352. package/dist/packages/core/src/components/Slider.d.ts +67 -0
  353. package/dist/packages/core/src/components/Slider.js +97 -0
  354. package/dist/packages/core/src/components/SoundCompass.css +138 -0
  355. package/dist/packages/core/src/components/SoundCompass.d.ts +42 -0
  356. package/dist/packages/core/src/components/SoundCompass.js +136 -0
  357. package/dist/packages/core/src/components/SplashLogo.css +32 -0
  358. package/dist/packages/core/src/components/SplashLogo.d.ts +35 -0
  359. package/dist/packages/core/src/components/SplashLogo.js +32 -0
  360. package/dist/packages/core/src/components/StatChart.css +83 -0
  361. package/dist/packages/core/src/components/StatChart.d.ts +26 -0
  362. package/dist/packages/core/src/components/StatChart.js +41 -0
  363. package/dist/packages/core/src/components/Table.css +158 -0
  364. package/dist/packages/core/src/components/Table.d.ts +94 -0
  365. package/dist/packages/core/src/components/Table.js +200 -0
  366. package/dist/packages/core/src/components/TableCell.css +12 -0
  367. package/dist/packages/core/src/components/TableField.css +60 -0
  368. package/dist/packages/core/src/components/Tabs.css +55 -0
  369. package/dist/packages/core/src/components/Tabs.d.ts +30 -0
  370. package/dist/packages/core/src/components/Tabs.js +55 -0
  371. package/dist/packages/core/src/components/TextField.css +266 -0
  372. package/dist/packages/core/src/components/TextField.d.ts +86 -0
  373. package/dist/packages/core/src/components/TextField.js +149 -0
  374. package/dist/packages/core/src/components/Timeline.css +62 -0
  375. package/dist/packages/core/src/components/Timeline.d.ts +26 -0
  376. package/dist/packages/core/src/components/Timeline.js +11 -0
  377. package/dist/packages/core/src/components/Toast.css +76 -0
  378. package/dist/packages/core/src/components/Toast.d.ts +10 -0
  379. package/dist/packages/core/src/components/Toast.js +19 -0
  380. package/dist/packages/core/src/components/Toggle.css +61 -0
  381. package/dist/packages/core/src/components/Toggle.d.ts +18 -0
  382. package/dist/packages/core/src/components/Toggle.js +7 -0
  383. package/dist/packages/core/src/components/Toolbar.css +86 -0
  384. package/dist/packages/core/src/components/Toolbar.d.ts +52 -0
  385. package/dist/packages/core/src/components/Toolbar.js +20 -0
  386. package/dist/packages/core/src/components/Tooltip/DebugTooltip.css +27 -0
  387. package/dist/packages/core/src/components/Tooltip/DebugTooltip.d.ts +12 -0
  388. package/dist/packages/core/src/components/Tooltip/DebugTooltip.js +79 -0
  389. package/dist/packages/core/src/components/Tooltip/DescriptionTooltip.css +50 -0
  390. package/dist/packages/core/src/components/Tooltip/DescriptionTooltip.d.ts +16 -0
  391. package/dist/packages/core/src/components/Tooltip/DescriptionTooltip.js +11 -0
  392. package/dist/packages/core/src/components/Tooltip/InfoTooltip.css +39 -0
  393. package/dist/packages/core/src/components/Tooltip/InfoTooltip.d.ts +13 -0
  394. package/dist/packages/core/src/components/Tooltip/InfoTooltip.js +10 -0
  395. package/dist/packages/core/src/components/Tooltip/MenuTooltip.css +93 -0
  396. package/dist/packages/core/src/components/Tooltip/MenuTooltip.d.ts +30 -0
  397. package/dist/packages/core/src/components/Tooltip/MenuTooltip.js +92 -0
  398. package/dist/packages/core/src/components/Tooltip/TextBoxTooltip.css +95 -0
  399. package/dist/packages/core/src/components/Tooltip/TextBoxTooltip.d.ts +13 -0
  400. package/dist/packages/core/src/components/Tooltip/TextBoxTooltip.js +55 -0
  401. package/dist/packages/core/src/components/Tooltip/Tooltip.css +120 -0
  402. package/dist/packages/core/src/components/Tooltip/Tooltip.d.ts +25 -0
  403. package/dist/packages/core/src/components/Tooltip/Tooltip.js +296 -0
  404. package/dist/packages/core/src/components/Tooltip/TrainingTooltip.css +67 -0
  405. package/dist/packages/core/src/components/Tooltip/TrainingTooltip.d.ts +16 -0
  406. package/dist/packages/core/src/components/Tooltip/TrainingTooltip.js +40 -0
  407. package/dist/packages/core/src/components/Tooltip/WordImageTooltip.css +61 -0
  408. package/dist/packages/core/src/components/Tooltip/WordImageTooltip.d.ts +12 -0
  409. package/dist/packages/core/src/components/Tooltip/WordImageTooltip.js +39 -0
  410. package/dist/packages/core/src/components/Tooltip/tooltipConstants.d.ts +44 -0
  411. package/dist/packages/core/src/components/Tooltip/tooltipConstants.js +38 -0
  412. package/dist/packages/core/src/components/TopBanner.css +100 -0
  413. package/dist/packages/core/src/components/TopBanner.d.ts +25 -0
  414. package/dist/packages/core/src/components/TopBanner.js +36 -0
  415. package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.d.ts +17 -0
  416. package/dist/packages/core/src/components/Training/AudioPlayerWaveForm.js +237 -0
  417. package/dist/packages/core/src/components/Training/CategoryIcon.css +85 -0
  418. package/dist/packages/core/src/components/Training/CategoryIcon.d.ts +16 -0
  419. package/dist/packages/core/src/components/Training/CategoryIcon.js +79 -0
  420. package/dist/packages/core/src/components/Training/NoisePlayerContext.d.ts +43 -0
  421. package/dist/packages/core/src/components/Training/NoisePlayerContext.js +26 -0
  422. package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.css +52 -0
  423. package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.d.ts +13 -0
  424. package/dist/packages/core/src/components/Training/NoiseSettingsTooltip.js +81 -0
  425. package/dist/packages/core/src/components/Training/TrainingBlock.css +33 -0
  426. package/dist/packages/core/src/components/Training/TrainingBlock.d.ts +45 -0
  427. package/dist/packages/core/src/components/Training/TrainingBlock.js +44 -0
  428. package/dist/packages/core/src/components/Training/TrainingBlockButton.css +337 -0
  429. package/dist/packages/core/src/components/Training/TrainingBlockButton.d.ts +5 -0
  430. package/dist/packages/core/src/components/Training/TrainingBlockButton.js +193 -0
  431. package/dist/packages/core/src/components/Training/TrainingCard.css +178 -0
  432. package/dist/packages/core/src/components/Training/TrainingCard.d.ts +24 -0
  433. package/dist/packages/core/src/components/Training/TrainingCard.js +29 -0
  434. package/dist/packages/core/src/components/Training/TrainingCardGroup.css +73 -0
  435. package/dist/packages/core/src/components/Training/TrainingCardGroup.d.ts +41 -0
  436. package/dist/packages/core/src/components/Training/TrainingCardGroup.js +16 -0
  437. package/dist/packages/core/src/components/Training/TrainingPagePopup.css +210 -0
  438. package/dist/packages/core/src/components/Training/TrainingPagePopup.d.ts +91 -0
  439. package/dist/packages/core/src/components/Training/TrainingPagePopup.js +799 -0
  440. package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.css +45 -0
  441. package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.d.ts +14 -0
  442. package/dist/packages/core/src/components/Training/TrainingPagePopupBottom.js +60 -0
  443. package/dist/packages/core/src/components/Training/TrainingPagePopupContext.d.ts +13 -0
  444. package/dist/packages/core/src/components/Training/TrainingPagePopupContext.js +12 -0
  445. package/dist/packages/core/src/components/Training/TrainingPagePopupTitle.css +77 -0
  446. package/dist/packages/core/src/components/Training/TrainingPagePopupTitle.d.ts +21 -0
  447. package/dist/packages/core/src/components/Training/TrainingPagePopupTitle.js +41 -0
  448. package/dist/packages/core/src/components/Training/TrainingStep.css +236 -0
  449. package/dist/packages/core/src/components/Training/TrainingStep.d.ts +15 -0
  450. package/dist/packages/core/src/components/Training/TrainingStep.js +89 -0
  451. package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.css +320 -0
  452. package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.d.ts +5 -0
  453. package/dist/packages/core/src/components/Training/TrainingStepAudioPlayer.js +971 -0
  454. package/dist/packages/core/src/components/Training/TrainingStepBullet.css +148 -0
  455. package/dist/packages/core/src/components/Training/TrainingStepBullet.d.ts +6 -0
  456. package/dist/packages/core/src/components/Training/TrainingStepBullet.js +11 -0
  457. package/dist/packages/core/src/components/Training/TrainingStepCard.css +0 -0
  458. package/dist/packages/core/src/components/Training/TrainingStepCard.d.ts +36 -0
  459. package/dist/packages/core/src/components/Training/TrainingStepCard.js +110 -0
  460. package/dist/packages/core/src/components/Training/TrainingStepCardOrder.d.ts +15 -0
  461. package/dist/packages/core/src/components/Training/TrainingStepCardOrder.js +58 -0
  462. package/dist/packages/core/src/components/Training/TrainingStepComponents.d.ts +35 -0
  463. package/dist/packages/core/src/components/Training/TrainingStepComponents.js +60 -0
  464. package/dist/packages/core/src/components/Training/TrainingStepConfirm.d.ts +24 -0
  465. package/dist/packages/core/src/components/Training/TrainingStepConfirm.js +117 -0
  466. package/dist/packages/core/src/components/Training/TrainingStepConfirmWithText.d.ts +16 -0
  467. package/dist/packages/core/src/components/Training/TrainingStepConfirmWithText.js +60 -0
  468. package/dist/packages/core/src/components/Training/TrainingStepListen.d.ts +27 -0
  469. package/dist/packages/core/src/components/Training/TrainingStepListen.js +13 -0
  470. package/dist/packages/core/src/components/Training/TrainingStepOrderList.css +221 -0
  471. package/dist/packages/core/src/components/Training/TrainingStepOrderList.d.ts +7 -0
  472. package/dist/packages/core/src/components/Training/TrainingStepOrderList.js +445 -0
  473. package/dist/packages/core/src/components/Training/TrainingStepTextBox.css +111 -0
  474. package/dist/packages/core/src/components/Training/TrainingStepTextBox.d.ts +8 -0
  475. package/dist/packages/core/src/components/Training/TrainingStepTextBox.js +74 -0
  476. package/dist/packages/core/src/components/Training/TrainingStepTitle.css +89 -0
  477. package/dist/packages/core/src/components/Training/TrainingStepTitle.d.ts +21 -0
  478. package/dist/packages/core/src/components/Training/TrainingStepTitle.js +91 -0
  479. package/dist/packages/core/src/components/Training/TrainingWordCard.css +266 -0
  480. package/dist/packages/core/src/components/Training/TrainingWordCard.d.ts +43 -0
  481. package/dist/packages/core/src/components/Training/TrainingWordCard.js +229 -0
  482. package/dist/packages/core/src/components/Training/WordTablePopup.css +56 -0
  483. package/dist/packages/core/src/components/Training/WordTablePopup.d.ts +61 -0
  484. package/dist/packages/core/src/components/Training/WordTablePopup.js +105 -0
  485. package/dist/packages/core/src/components/Training/audioPlaybackRules.d.ts +95 -0
  486. package/dist/packages/core/src/components/Training/audioPlaybackRules.js +125 -0
  487. package/dist/packages/core/src/components/Training/audioWaits.d.ts +27 -0
  488. package/dist/packages/core/src/components/Training/audioWaits.js +64 -0
  489. package/dist/packages/core/src/components/Training/currentSound.d.ts +26 -0
  490. package/dist/packages/core/src/components/Training/currentSound.js +46 -0
  491. package/dist/packages/core/src/components/Training/pagePopupTiming.d.ts +17 -0
  492. package/dist/packages/core/src/components/Training/pagePopupTiming.js +17 -0
  493. package/dist/packages/core/src/components/Training/trainingBlockButtonTypes.d.ts +79 -0
  494. package/dist/packages/core/src/components/Training/trainingBlockButtonTypes.js +27 -0
  495. package/dist/packages/core/src/components/Training/trainingMissStats.d.ts +148 -0
  496. package/dist/packages/core/src/components/Training/trainingMissStats.js +163 -0
  497. package/dist/packages/core/src/components/Training/trainingPopupUtils.d.ts +108 -0
  498. package/dist/packages/core/src/components/Training/trainingPopupUtils.js +226 -0
  499. package/dist/packages/core/src/components/Training/trainingScenario.d.ts +42 -0
  500. package/dist/packages/core/src/components/Training/trainingScenario.js +25 -0
  501. package/dist/packages/core/src/components/Training/trainingStepAudioPlayerTypes.d.ts +37 -0
  502. package/dist/packages/core/src/components/Training/trainingStepAudioPlayerTypes.js +20 -0
  503. package/dist/packages/core/src/components/Training/trainingStepOrderListTypes.d.ts +34 -0
  504. package/dist/packages/core/src/components/Training/trainingStepOrderListTypes.js +5 -0
  505. package/dist/packages/core/src/components/Training/useAnchorRect.d.ts +26 -0
  506. package/dist/packages/core/src/components/Training/useAnchorRect.js +52 -0
  507. package/dist/packages/core/src/components/Training/useAudioPreview.d.ts +11 -0
  508. package/dist/packages/core/src/components/Training/useAudioPreview.js +178 -0
  509. package/dist/packages/core/src/components/Training/useNoiseFade.d.ts +24 -0
  510. package/dist/packages/core/src/components/Training/useNoiseFade.js +303 -0
  511. package/dist/packages/core/src/components/Training/useObjectUrls.d.ts +25 -0
  512. package/dist/packages/core/src/components/Training/useObjectUrls.js +56 -0
  513. package/dist/packages/core/src/components/Training/useProgressTicker.d.ts +33 -0
  514. package/dist/packages/core/src/components/Training/useProgressTicker.js +74 -0
  515. package/dist/packages/core/src/components/Training/useTTSPlayback.d.ts +30 -0
  516. package/dist/packages/core/src/components/Training/useTTSPlayback.js +172 -0
  517. package/dist/packages/core/src/components/Training/useWaveReady.d.ts +36 -0
  518. package/dist/packages/core/src/components/Training/useWaveReady.js +65 -0
  519. package/dist/packages/core/src/components/UpdateAlert.css +116 -0
  520. package/dist/packages/core/src/components/UpdateAlert.d.ts +23 -0
  521. package/dist/packages/core/src/components/UpdateAlert.js +25 -0
  522. package/dist/packages/core/src/components/Word/ContrastFilterPanel.d.ts +25 -0
  523. package/dist/packages/core/src/components/Word/ContrastFilterPanel.js +69 -0
  524. package/dist/packages/core/src/components/Word/PhonemeFilterPanel.d.ts +24 -0
  525. package/dist/packages/core/src/components/Word/PhonemeFilterPanel.js +15 -0
  526. package/dist/packages/core/src/components/Word/PhonemeSelectBlock.css +272 -0
  527. package/dist/packages/core/src/components/Word/PhonemeSelectBlock.d.ts +45 -0
  528. package/dist/packages/core/src/components/Word/PhonemeSelectBlock.js +71 -0
  529. package/dist/packages/core/src/components/Word/TableFilterPanel.d.ts +56 -0
  530. package/dist/packages/core/src/components/Word/TableFilterPanel.js +42 -0
  531. package/dist/packages/core/src/components/Word/WordSearchFilterPanel.d.ts +23 -0
  532. package/dist/packages/core/src/components/Word/WordSearchFilterPanel.js +14 -0
  533. package/dist/packages/core/src/components/Word/WordSearchResultBlock.css +130 -0
  534. package/dist/packages/core/src/components/Word/WordSearchResultBlock.d.ts +47 -0
  535. package/dist/packages/core/src/components/Word/WordSearchResultBlock.js +141 -0
  536. package/dist/packages/core/src/components/Word/WordTableBlock.css +85 -0
  537. package/dist/packages/core/src/components/Word/WordTableBlock.d.ts +5 -0
  538. package/dist/packages/core/src/components/Word/WordTableBlock.js +297 -0
  539. package/dist/packages/core/src/components/Word/WordTableButton.css +185 -0
  540. package/dist/packages/core/src/components/Word/WordTableButton.d.ts +48 -0
  541. package/dist/packages/core/src/components/Word/WordTableButton.js +28 -0
  542. package/dist/packages/core/src/components/Word/WordTableThumbnail.css +56 -0
  543. package/dist/packages/core/src/components/Word/WordTableThumbnail.d.ts +10 -0
  544. package/dist/packages/core/src/components/Word/WordTableThumbnail.js +21 -0
  545. package/dist/packages/core/src/components/Word/generatedDraft.d.ts +39 -0
  546. package/dist/packages/core/src/components/Word/generatedDraft.js +69 -0
  547. package/dist/packages/core/src/components/Word/phonemeSelectBlockUtils.d.ts +14 -0
  548. package/dist/packages/core/src/components/Word/phonemeSelectBlockUtils.js +10 -0
  549. package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.d.ts +35 -0
  550. package/dist/packages/core/src/components/Word/useWordTableDisplaySettings.js +82 -0
  551. package/dist/packages/core/src/components/Word/useWordTablePrint.d.ts +31 -0
  552. package/dist/packages/core/src/components/Word/useWordTablePrint.js +43 -0
  553. package/dist/packages/core/src/components/Word/wordScoreStats.d.ts +77 -0
  554. package/dist/packages/core/src/components/Word/wordScoreStats.js +100 -0
  555. package/dist/packages/core/src/components/Word/wordTableBlockTypes.d.ts +85 -0
  556. package/dist/packages/core/src/components/Word/wordTableBlockTypes.js +3 -0
  557. package/dist/packages/core/src/components/Word/wordTablePrint.d.ts +14 -0
  558. package/dist/packages/core/src/components/Word/wordTablePrint.js +210 -0
  559. package/dist/packages/core/src/components/Word/wordTableRecommend.d.ts +67 -0
  560. package/dist/packages/core/src/components/Word/wordTableRecommend.js +91 -0
  561. package/dist/packages/core/src/components/Word/wordTableReview.d.ts +49 -0
  562. package/dist/packages/core/src/components/Word/wordTableReview.js +112 -0
  563. package/dist/packages/core/src/components/Word/wordTableScoring.d.ts +100 -0
  564. package/dist/packages/core/src/components/Word/wordTableScoring.js +126 -0
  565. package/dist/packages/core/src/components/Word/wordTableSettings.d.ts +56 -0
  566. package/dist/packages/core/src/components/Word/wordTableSettings.js +140 -0
  567. package/dist/packages/core/src/components/WordTable.css +424 -0
  568. package/dist/packages/core/src/components/WordTable.d.ts +75 -0
  569. package/dist/packages/core/src/components/WordTable.js +184 -0
  570. package/dist/packages/core/src/components/barChartData.d.ts +48 -0
  571. package/dist/packages/core/src/components/barChartData.js +111 -0
  572. package/dist/packages/core/src/components/barChartTypes.d.ts +82 -0
  573. package/dist/packages/core/src/components/barChartTypes.js +22 -0
  574. package/dist/packages/core/src/components/buttonTypes.d.ts +102 -0
  575. package/dist/packages/core/src/components/buttonTypes.js +1 -0
  576. package/dist/packages/core/src/components/tableTrackList.d.ts +9 -0
  577. package/dist/packages/core/src/components/tableTrackList.js +32 -0
  578. package/dist/packages/core/src/components/useAnchoredMenu.d.ts +28 -0
  579. package/dist/packages/core/src/components/useAnchoredMenu.js +72 -0
  580. package/dist/packages/core/src/components/useBarChartControl.d.ts +8 -0
  581. package/dist/packages/core/src/components/useBarChartControl.js +76 -0
  582. package/dist/packages/core/src/components/useCalendarMonth.d.ts +12 -0
  583. package/dist/packages/core/src/components/useCalendarMonth.js +50 -0
  584. package/dist/packages/core/src/components/useComboboxSuggestions.d.ts +22 -0
  585. package/dist/packages/core/src/components/useComboboxSuggestions.js +60 -0
  586. package/dist/packages/core/src/components/useFitScale.d.ts +16 -0
  587. package/dist/packages/core/src/components/useFitScale.js +43 -0
  588. package/dist/packages/core/src/components/useSoundCompassExam.d.ts +54 -0
  589. package/dist/packages/core/src/components/useSoundCompassExam.js +128 -0
  590. package/dist/packages/core/src/components/useToastLifecycle.d.ts +16 -0
  591. package/dist/packages/core/src/components/useToastLifecycle.js +140 -0
  592. package/dist/packages/core/src/components/wordTableLayout.d.ts +76 -0
  593. package/dist/packages/core/src/components/wordTableLayout.js +162 -0
  594. package/dist/packages/core/src/components.d.ts +314 -0
  595. package/dist/packages/core/src/components.js +232 -0
  596. package/dist/packages/core/src/context/I18nContext.d.ts +11 -0
  597. package/dist/packages/core/src/context/I18nContext.js +20 -0
  598. package/dist/packages/core/src/context/I18nProvider.d.ts +9 -0
  599. package/dist/packages/core/src/context/I18nProvider.js +15 -0
  600. package/dist/packages/core/src/context/WordDataContext.d.ts +25 -0
  601. package/dist/packages/core/src/context/WordDataContext.js +6 -0
  602. package/dist/packages/core/src/context/WordDataProvider.d.ts +5 -0
  603. package/dist/packages/core/src/context/WordDataProvider.js +5 -0
  604. package/dist/packages/core/src/hooks/bodyScrollLock.d.ts +5 -0
  605. package/dist/packages/core/src/hooks/bodyScrollLock.js +62 -0
  606. package/dist/packages/core/src/hooks/escStack.d.ts +2 -0
  607. package/dist/packages/core/src/hooks/escStack.js +38 -0
  608. package/dist/packages/core/src/hooks/useBackgroundUrl.d.ts +2 -0
  609. package/dist/packages/core/src/hooks/useBackgroundUrl.js +13 -0
  610. package/dist/packages/core/src/hooks/useCacheManagement.d.ts +34 -0
  611. package/dist/packages/core/src/hooks/useCacheManagement.js +107 -0
  612. package/dist/packages/core/src/hooks/useDailyTrainingSelection.d.ts +17 -0
  613. package/dist/packages/core/src/hooks/useDailyTrainingSelection.js +87 -0
  614. package/dist/packages/core/src/hooks/useDeviceManagement.d.ts +37 -0
  615. package/dist/packages/core/src/hooks/useDeviceManagement.js +40 -0
  616. package/dist/packages/core/src/hooks/useDocumentTitle.d.ts +22 -0
  617. package/dist/packages/core/src/hooks/useDocumentTitle.js +49 -0
  618. package/dist/packages/core/src/hooks/useEditableList.d.ts +20 -0
  619. package/dist/packages/core/src/hooks/useEditableList.js +73 -0
  620. package/dist/packages/core/src/hooks/useEscToClose.d.ts +19 -0
  621. package/dist/packages/core/src/hooks/useEscToClose.js +30 -0
  622. package/dist/packages/core/src/hooks/useFocusTrap.d.ts +19 -0
  623. package/dist/packages/core/src/hooks/useFocusTrap.js +50 -0
  624. package/dist/packages/core/src/hooks/useFontScale.d.ts +20 -0
  625. package/dist/packages/core/src/hooks/useFontScale.js +51 -0
  626. package/dist/packages/core/src/hooks/useHoverAnchor.d.ts +33 -0
  627. package/dist/packages/core/src/hooks/useHoverAnchor.js +49 -0
  628. package/dist/packages/core/src/hooks/useIcon.d.ts +7 -0
  629. package/dist/packages/core/src/hooks/useIcon.js +124 -0
  630. package/dist/packages/core/src/hooks/useLatestRef.d.ts +12 -0
  631. package/dist/packages/core/src/hooks/useLatestRef.js +17 -0
  632. package/dist/packages/core/src/hooks/useLucideIcon.d.ts +15 -0
  633. package/dist/packages/core/src/hooks/useLucideIcon.js +71 -0
  634. package/dist/packages/core/src/hooks/useMediaQuery.d.ts +17 -0
  635. package/dist/packages/core/src/hooks/useMediaQuery.js +45 -0
  636. package/dist/packages/core/src/hooks/usePagedList.d.ts +23 -0
  637. package/dist/packages/core/src/hooks/usePagedList.js +26 -0
  638. package/dist/packages/core/src/hooks/useParentBgTheme.d.ts +8 -0
  639. package/dist/packages/core/src/hooks/useParentBgTheme.js +18 -0
  640. package/dist/packages/core/src/hooks/usePasswordChange.d.ts +28 -0
  641. package/dist/packages/core/src/hooks/usePasswordChange.js +54 -0
  642. package/dist/packages/core/src/hooks/useRelativeDay.d.ts +12 -0
  643. package/dist/packages/core/src/hooks/useRelativeDay.js +30 -0
  644. package/dist/packages/core/src/hooks/useTablePaging.d.ts +46 -0
  645. package/dist/packages/core/src/hooks/useTablePaging.js +63 -0
  646. package/dist/packages/core/src/hooks/useToastState.d.ts +15 -0
  647. package/dist/packages/core/src/hooks/useToastState.js +29 -0
  648. package/dist/packages/core/src/hooks/useTrainingSessionLog.d.ts +7 -0
  649. package/dist/packages/core/src/hooks/useTrainingSessionLog.js +26 -0
  650. package/dist/packages/core/src/hooks/useTrainingTypeLabels.d.ts +16 -0
  651. package/dist/packages/core/src/hooks/useTrainingTypeLabels.js +25 -0
  652. package/dist/packages/core/src/hooks/useVisitAllPanel.d.ts +30 -0
  653. package/dist/packages/core/src/hooks/useVisitAllPanel.js +43 -0
  654. package/dist/packages/core/src/hooks/useVisitHistory.d.ts +38 -0
  655. package/dist/packages/core/src/hooks/useVisitHistory.js +59 -0
  656. package/dist/packages/core/src/hooks/useVisitSchedule.d.ts +31 -0
  657. package/dist/packages/core/src/hooks/useVisitSchedule.js +101 -0
  658. package/dist/packages/core/src/hooks/useWindowEvent.d.ts +11 -0
  659. package/dist/packages/core/src/hooks/useWindowEvent.js +27 -0
  660. package/dist/packages/core/src/hooks/useWordAttributeFilter.d.ts +70 -0
  661. package/dist/packages/core/src/hooks/useWordAttributeFilter.js +115 -0
  662. package/dist/packages/core/src/hooks/useWordDataStats.d.ts +22 -0
  663. package/dist/packages/core/src/hooks/useWordDataStats.js +40 -0
  664. package/dist/packages/core/src/hooks/useWordImage.d.ts +19 -0
  665. package/dist/packages/core/src/hooks/useWordImage.js +28 -0
  666. package/dist/packages/core/src/hooks/useWordMeanings.d.ts +39 -0
  667. package/dist/packages/core/src/hooks/useWordMeanings.js +62 -0
  668. package/dist/packages/core/src/hooks/useWordTrainingDataGeneration.d.ts +34 -0
  669. package/dist/packages/core/src/hooks/useWordTrainingDataGeneration.js +98 -0
  670. package/dist/packages/core/src/hooks/useWordTrainingFilter.d.ts +91 -0
  671. package/dist/packages/core/src/hooks/useWordTrainingFilter.js +549 -0
  672. package/dist/packages/core/src/hooks/wordTrainingFilterModel.d.ts +61 -0
  673. package/dist/packages/core/src/hooks/wordTrainingFilterModel.js +102 -0
  674. package/dist/packages/core/src/hooks.d.ts +27 -0
  675. package/dist/packages/core/src/hooks.js +28 -0
  676. package/dist/packages/core/src/i18n/index.d.ts +21 -0
  677. package/dist/packages/core/src/i18n/index.js +68 -0
  678. package/dist/packages/core/src/i18n/locales/en.json +4055 -0
  679. package/dist/packages/core/src/i18n/locales/ko.json +4052 -0
  680. package/dist/packages/core/src/icon/none.svg +4 -0
  681. package/dist/packages/core/src/icon/null.svg +3 -0
  682. package/dist/packages/core/src/index.d.ts +16 -0
  683. package/dist/packages/core/src/index.js +25 -0
  684. package/dist/packages/core/src/logo/Logo_APEB.svg +53 -0
  685. package/dist/packages/core/src/logo/Logo_APEB_black.svg +42 -0
  686. package/dist/packages/core/src/logo/Logo_APEB_white.svg +42 -0
  687. package/dist/packages/core/src/logo/Logo_HTP_kr.svg +21 -0
  688. package/dist/packages/core/src/logo/Logo_HTP_kr_black.svg +17 -0
  689. package/dist/packages/core/src/logo/Logo_HTP_kr_white.svg +17 -0
  690. package/dist/packages/core/src/logo/Logo_IHAB_en.svg +18 -0
  691. package/dist/packages/core/src/logo/Logo_IHAB_en_black.svg +14 -0
  692. package/dist/packages/core/src/logo/Logo_IHAB_en_white.svg +14 -0
  693. package/dist/packages/core/src/logo/Logo_IHAB_kr.svg +18 -0
  694. package/dist/packages/core/src/logo/Logo_IHAB_kr_black.svg +14 -0
  695. package/dist/packages/core/src/logo/Logo_IHAB_kr_white.svg +14 -0
  696. package/dist/packages/core/src/logo/Logo_SDS_kr.svg +22 -0
  697. package/dist/packages/core/src/logo/Logo_SDS_kr_black.svg +18 -0
  698. package/dist/packages/core/src/logo/Logo_SDS_kr_white.svg +18 -0
  699. package/dist/packages/core/src/logo/Logo_speechearManager_kr.svg +20 -0
  700. package/dist/packages/core/src/logo/Logo_speechearManager_kr_black.svg +21 -0
  701. package/dist/packages/core/src/logo/Logo_speechearManager_kr_textWhite.svg +45 -0
  702. package/dist/packages/core/src/logo/Logo_speechearManager_kr_white.svg +21 -0
  703. package/dist/packages/core/src/logo/Logo_speechear_kr.svg +17 -0
  704. package/dist/packages/core/src/logo/Logo_speechear_kr_black.svg +16 -0
  705. package/dist/packages/core/src/logo/Logo_speechear_kr_textWhite.svg +42 -0
  706. package/dist/packages/core/src/logo/Logo_speechear_kr_white.svg +16 -0
  707. package/dist/packages/core/src/logo/Symbol_APEB.svg +34 -0
  708. package/dist/packages/core/src/logo/Symbol_APEB_black.svg +15 -0
  709. package/dist/packages/core/src/logo/Symbol_APEB_white.svg +15 -0
  710. package/dist/packages/core/src/logo/Symbol_HTP.svg +14 -0
  711. package/dist/packages/core/src/logo/Symbol_HTP_black.svg +10 -0
  712. package/dist/packages/core/src/logo/Symbol_HTP_white.svg +10 -0
  713. package/dist/packages/core/src/logo/Symbol_IHAB.svg +14 -0
  714. package/dist/packages/core/src/logo/Symbol_IHAB_black.svg +10 -0
  715. package/dist/packages/core/src/logo/Symbol_IHAB_white.svg +10 -0
  716. package/dist/packages/core/src/logo/Symbol_SDS.svg +14 -0
  717. package/dist/packages/core/src/logo/Symbol_SDS_black.svg +10 -0
  718. package/dist/packages/core/src/logo/Symbol_SDS_white.svg +10 -0
  719. package/dist/packages/core/src/logo/Symbol_speechear.svg +15 -0
  720. package/dist/packages/core/src/logo/Symbol_speechear_black.svg +16 -0
  721. package/dist/packages/core/src/logo/Symbol_speechear_white.svg +16 -0
  722. package/dist/packages/core/src/logo/qr_speechear.svg +1 -0
  723. package/dist/packages/core/src/sounds/noiseAssets.d.ts +6 -0
  724. package/dist/packages/core/src/sounds/noiseAssets.js +24 -0
  725. package/dist/packages/core/src/styles.css +144 -0
  726. package/dist/packages/core/src/tokens.css +407 -0
  727. package/dist/packages/core/src/types/audio.d.ts +11 -0
  728. package/dist/packages/core/src/types/audio.js +1 -0
  729. package/dist/packages/core/src/types/device.d.ts +10 -0
  730. package/dist/packages/core/src/types/device.js +1 -0
  731. package/dist/packages/core/src/types/filterPanel.d.ts +63 -0
  732. package/dist/packages/core/src/types/filterPanel.js +8 -0
  733. package/dist/packages/core/src/types/geometry.d.ts +14 -0
  734. package/dist/packages/core/src/types/geometry.js +1 -0
  735. package/dist/packages/core/src/types/training.d.ts +131 -0
  736. package/dist/packages/core/src/types/training.js +1 -0
  737. package/dist/packages/core/src/types/wordSearch.d.ts +49 -0
  738. package/dist/packages/core/src/types/wordSearch.js +1 -0
  739. package/dist/packages/core/src/types.d.ts +3 -0
  740. package/dist/packages/core/src/types.js +1 -0
  741. package/dist/packages/core/src/utils/CategoryData.d.ts +91 -0
  742. package/dist/packages/core/src/utils/CategoryData.js +57 -0
  743. package/dist/packages/core/src/utils/array.d.ts +20 -0
  744. package/dist/packages/core/src/utils/array.js +36 -0
  745. package/dist/packages/core/src/utils/assets.d.ts +41 -0
  746. package/dist/packages/core/src/utils/assets.js +62 -0
  747. package/dist/packages/core/src/utils/audioMeter.d.ts +19 -0
  748. package/dist/packages/core/src/utils/audioMeter.js +70 -0
  749. package/dist/packages/core/src/utils/categories.d.ts +67 -0
  750. package/dist/packages/core/src/utils/categories.js +70 -0
  751. package/dist/packages/core/src/utils/clipboard.d.ts +10 -0
  752. package/dist/packages/core/src/utils/clipboard.js +46 -0
  753. package/dist/packages/core/src/utils/companyTypes.d.ts +2 -0
  754. package/dist/packages/core/src/utils/companyTypes.js +6 -0
  755. package/dist/packages/core/src/utils/csv.d.ts +22 -0
  756. package/dist/packages/core/src/utils/csv.js +35 -0
  757. package/dist/packages/core/src/utils/cx.d.ts +7 -0
  758. package/dist/packages/core/src/utils/cx.js +9 -0
  759. package/dist/packages/core/src/utils/dailySelectionUtils.d.ts +15 -0
  760. package/dist/packages/core/src/utils/dailySelectionUtils.js +68 -0
  761. package/dist/packages/core/src/utils/date.d.ts +86 -0
  762. package/dist/packages/core/src/utils/date.js +171 -0
  763. package/dist/packages/core/src/utils/deviceKind.d.ts +13 -0
  764. package/dist/packages/core/src/utils/deviceKind.js +19 -0
  765. package/dist/packages/core/src/utils/encoding.d.ts +26 -0
  766. package/dist/packages/core/src/utils/encoding.js +33 -0
  767. package/dist/packages/core/src/utils/errorMessage.d.ts +44 -0
  768. package/dist/packages/core/src/utils/errorMessage.js +63 -0
  769. package/dist/packages/core/src/utils/fontScale.d.ts +10 -0
  770. package/dist/packages/core/src/utils/fontScale.js +28 -0
  771. package/dist/packages/core/src/utils/format.d.ts +48 -0
  772. package/dist/packages/core/src/utils/format.js +122 -0
  773. package/dist/packages/core/src/utils/gameScoreLogger.d.ts +48 -0
  774. package/dist/packages/core/src/utils/gameScoreLogger.js +42 -0
  775. package/dist/packages/core/src/utils/getTrainingData.d.ts +61 -0
  776. package/dist/packages/core/src/utils/getTrainingData.js +156 -0
  777. package/dist/packages/core/src/utils/imageConfig.d.ts +48 -0
  778. package/dist/packages/core/src/utils/imageConfig.js +159 -0
  779. package/dist/packages/core/src/utils/josa.d.ts +29 -0
  780. package/dist/packages/core/src/utils/josa.js +103 -0
  781. package/dist/packages/core/src/utils/koreanPronunciation.d.ts +16 -0
  782. package/dist/packages/core/src/utils/koreanPronunciation.js +223 -0
  783. package/dist/packages/core/src/utils/koreanSyllable.d.ts +174 -0
  784. package/dist/packages/core/src/utils/koreanSyllable.js +654 -0
  785. package/dist/packages/core/src/utils/lucideIconSet.d.ts +16 -0
  786. package/dist/packages/core/src/utils/lucideIconSet.js +350 -0
  787. package/dist/packages/core/src/utils/lucideLoader.d.ts +44 -0
  788. package/dist/packages/core/src/utils/lucideLoader.js +76 -0
  789. package/dist/packages/core/src/utils/noiseSettingsStore.d.ts +22 -0
  790. package/dist/packages/core/src/utils/noiseSettingsStore.js +36 -0
  791. package/dist/packages/core/src/utils/phonemeConvert.d.ts +9 -0
  792. package/dist/packages/core/src/utils/phonemeConvert.js +53 -0
  793. package/dist/packages/core/src/utils/phonemeGroups.d.ts +22 -0
  794. package/dist/packages/core/src/utils/phonemeGroups.js +29 -0
  795. package/dist/packages/core/src/utils/phonemePairSearch.d.ts +22 -0
  796. package/dist/packages/core/src/utils/phonemePairSearch.js +583 -0
  797. package/dist/packages/core/src/utils/phonemePairSearchTypes.d.ts +46 -0
  798. package/dist/packages/core/src/utils/phonemePairSearchTypes.js +1 -0
  799. package/dist/packages/core/src/utils/planFeatures.d.ts +61 -0
  800. package/dist/packages/core/src/utils/planFeatures.js +168 -0
  801. package/dist/packages/core/src/utils/pronunciationConfig.d.ts +7 -0
  802. package/dist/packages/core/src/utils/pronunciationConfig.js +21 -0
  803. package/dist/packages/core/src/utils/savedWordTables.d.ts +18 -0
  804. package/dist/packages/core/src/utils/savedWordTables.js +70 -0
  805. package/dist/packages/core/src/utils/sortValue.d.ts +24 -0
  806. package/dist/packages/core/src/utils/sortValue.js +26 -0
  807. package/dist/packages/core/src/utils/speak.d.ts +7 -0
  808. package/dist/packages/core/src/utils/speak.js +35 -0
  809. package/dist/packages/core/src/utils/storage.d.ts +102 -0
  810. package/dist/packages/core/src/utils/storage.js +118 -0
  811. package/dist/packages/core/src/utils/theme.d.ts +11 -0
  812. package/dist/packages/core/src/utils/theme.js +28 -0
  813. package/dist/packages/core/src/utils/trainingItemResults.d.ts +60 -0
  814. package/dist/packages/core/src/utils/trainingItemResults.js +72 -0
  815. package/dist/packages/core/src/utils/trainingLogger.d.ts +58 -0
  816. package/dist/packages/core/src/utils/trainingLogger.js +50 -0
  817. package/dist/packages/core/src/utils/trainingPalette.d.ts +12 -0
  818. package/dist/packages/core/src/utils/trainingPalette.js +12 -0
  819. package/dist/packages/core/src/utils/ttsConfig.d.ts +78 -0
  820. package/dist/packages/core/src/utils/ttsConfig.js +89 -0
  821. package/dist/packages/core/src/utils/ttsResolver.d.ts +17 -0
  822. package/dist/packages/core/src/utils/ttsResolver.js +56 -0
  823. package/dist/packages/core/src/utils/wordContrast.d.ts +54 -0
  824. package/dist/packages/core/src/utils/wordContrast.js +198 -0
  825. package/dist/packages/core/src/utils/wordPairIndex.d.ts +26 -0
  826. package/dist/packages/core/src/utils/wordPairIndex.js +194 -0
  827. package/dist/packages/core/src/utils/wordPool.d.ts +34 -0
  828. package/dist/packages/core/src/utils/wordPool.js +20 -0
  829. package/dist/packages/core/src/utils/wordSuggestionPolicy.d.ts +55 -0
  830. package/dist/packages/core/src/utils/wordSuggestionPolicy.js +97 -0
  831. package/dist/packages/core/src/utils/wordTrainingGenerators.d.ts +122 -0
  832. package/dist/packages/core/src/utils/wordTrainingGenerators.js +560 -0
  833. package/dist/packages/core/src/utils/wordTrainingGroups.d.ts +10 -0
  834. package/dist/packages/core/src/utils/wordTrainingGroups.js +69 -0
  835. package/dist/packages/core/src/utils/wordTrainingPool.d.ts +51 -0
  836. package/dist/packages/core/src/utils/wordTrainingPool.js +436 -0
  837. package/dist/packages/core/src/utils/wordTrainingRuntime.d.ts +38 -0
  838. package/dist/packages/core/src/utils/wordTrainingRuntime.js +641 -0
  839. package/dist/packages/core/src/utils/wordTrainingRuntimeTypes.d.ts +89 -0
  840. package/dist/packages/core/src/utils/wordTrainingRuntimeTypes.js +77 -0
  841. package/dist/packages/core/src/utils.d.ts +57 -0
  842. package/dist/packages/core/src/utils.js +46 -0
  843. package/dist/tsdoc-metadata.json +11 -0
  844. package/dist/types.cjs.js +1 -0
  845. package/dist/types.esm.js +1 -0
  846. package/dist/utils.cjs.js +20 -0
  847. package/dist/utils.esm.js +20 -0
  848. package/package.json +171 -0
@@ -0,0 +1,560 @@
1
+ /**
2
+ * 단어훈련 문제생성 **공유 코어** (F19 통합).
3
+ * 편집기 미리보기(WordTrainingTypePreview)와 러너/런타임(wordTrainingRuntime)이
4
+ * 각자 중복 구현하던 "대립쌍 오답 생성" 규칙을 단일 출처로 모은다.
5
+ *
6
+ * 순수 함수만 둔다 — 오디오코드/id/async/이미지체크는 각 소비처 어댑터 책임.
7
+ * 발음 조회는 pronMap(단어→표준발음)을 인자로 받는다(런타임은 getPronMap(), 편집기는 자체 Map 주입).
8
+ */
9
+ import { parseSyllable, composeSyllable, CHOSEONG, JUNGSEONG, JONGSEONG } from './koreanSyllable';
10
+ import { finalToPhoneme } from './phonemeConvert';
11
+ import { shuffle as shuffled } from './array';
12
+ import { hasSel } from './wordContrast';
13
+ import { cardGroupOf } from './wordTrainingRuntimeTypes';
14
+ /** 받침 유무로 '와/과' 조사. 한글 아니면 '와'. */
15
+ function josaWaGwa(w) {
16
+ const code = (w.charCodeAt((w.length || 1) - 1)) || 0;
17
+ if (code < 0xAC00 || code > 0xD7A3)
18
+ return '와';
19
+ return (code - 0xAC00) % 28 === 0 ? '와' : '과';
20
+ }
21
+ /** 받침 유무로 '을/를' 조사. 한글 아니면 '를'. */
22
+ function josaEulReul(w) {
23
+ const code = (w.charCodeAt((w.length || 1) - 1)) || 0;
24
+ if (code < 0xAC00 || code > 0xD7A3)
25
+ return '를';
26
+ return (code - 0xAC00) % 28 === 0 ? '를' : '을';
27
+ }
28
+ /** 받침에 따라 '으로/로' 조사. 받침 없음 또는 ㄹ받침이면 '로', 그 외 '으로'. 한글 아니면 '로'. */
29
+ function josaEuRo(w) {
30
+ const code = (w.charCodeAt((w.length || 1) - 1)) || 0;
31
+ if (code < 0xAC00 || code > 0xD7A3)
32
+ return '로';
33
+ const jong = (code - 0xAC00) % 28;
34
+ return (jong === 0 || jong === 8) ? '로' : '으로';
35
+ }
36
+ /** 받침 유무로 '이/가' 조사. 자음 자모(ㄱ 등)는 낱자 이름이 받침으로 끝나므로 '이'. 그 외 비한글은 '가'. */
37
+ function josaIga(w) {
38
+ const ch = w.charAt((w.length || 1) - 1);
39
+ const code = ch.charCodeAt(0) || 0;
40
+ if (code >= 0xAC00 && code <= 0xD7A3)
41
+ return (code - 0xAC00) % 28 === 0 ? '가' : '이';
42
+ return /[ㄱ-ㅎ]/.test(ch) ? '이' : '가';
43
+ }
44
+ /**
45
+ * 자모 → 낱자 이름(TTS가 음소를 정확히 읽도록). 자음은 명칭(ㄱ→기역), 모음은 소릿값(ㅏ→아).
46
+ * bare 자모('ㄱ')를 그대로 TTS에 넣으면 엔진이 '그/가'처럼 잘못 읽어, 음소 합치기 문장에서 이름으로 치환한다.
47
+ */
48
+ const JAMO_NAME = {
49
+ // 자음(초성·종성 공용 낱자 이름)
50
+ 'ㄱ': '기역', 'ㄲ': '쌍기역', 'ㄴ': '니은', 'ㄷ': '디귿', 'ㄸ': '쌍디귿', 'ㄹ': '리을',
51
+ 'ㅁ': '미음', 'ㅂ': '비읍', 'ㅃ': '쌍비읍', 'ㅅ': '시옷', 'ㅆ': '쌍시옷', 'ㅇ': '이응',
52
+ 'ㅈ': '지읒', 'ㅉ': '쌍지읒', 'ㅊ': '치읓', 'ㅋ': '키읔', 'ㅌ': '티읕', 'ㅍ': '피읖', 'ㅎ': '히읗',
53
+ // 겹받침(홑받침만 쓰지만 방어적으로 포함)
54
+ 'ㄳ': '기역시옷', 'ㄵ': '니은지읒', 'ㄶ': '니은히읗', 'ㄺ': '리을기역', 'ㄻ': '리을미음',
55
+ 'ㄼ': '리을비읍', 'ㄽ': '리을시옷', 'ㄾ': '리을티읕', 'ㄿ': '리을피읖', 'ㅀ': '리을히읗', 'ㅄ': '비읍시옷',
56
+ // 모음(소릿값 = 낱자 이름)
57
+ 'ㅏ': '아', 'ㅐ': '애', 'ㅑ': '야', 'ㅒ': '얘', 'ㅓ': '어', 'ㅔ': '에', 'ㅕ': '여', 'ㅖ': '예',
58
+ 'ㅗ': '오', 'ㅘ': '와', 'ㅙ': '왜', 'ㅚ': '외', 'ㅛ': '요', 'ㅜ': '우', 'ㅝ': '워', 'ㅞ': '웨',
59
+ 'ㅟ': '위', 'ㅠ': '유', 'ㅡ': '으', 'ㅢ': '의', 'ㅣ': '이',
60
+ };
61
+ /**
62
+ * @public 1음절 단어를 합치기용 음소(초성 자음 + 중성 모음 [+ 종성])로 분해. 음소 합치기 문제용.
63
+ * 예: '가' → ['ㄱ','ㅏ'], '강' → ['ㄱ','ㅏ','ㅇ']. 파싱 실패 시 [word].
64
+ */
65
+ export function phonemePartsOf(word) {
66
+ // parseSyllable 은 첫 글자만 본다. 길이를 안 재면 '가방'이 조용히 ['ㄱ','ㅏ'] 가 돼
67
+ // 둘째 음절이 사라진 채 문제가 만들어진다 — 계약대로 1음절이 아니면 통째로 돌려준다.
68
+ if ([...word].length !== 1)
69
+ return [word];
70
+ const s = parseSyllable(word);
71
+ if (!s)
72
+ return [word];
73
+ const parts = [CHOSEONG[s.cho], JUNGSEONG[s.jung]];
74
+ if (s.jong !== 0)
75
+ parts.push(JONGSEONG[s.jong]);
76
+ return parts;
77
+ }
78
+ /**
79
+ * @public 합치기 문제 **표시** 문장 — 미리보기·러너 공용. 음절/음소 모두 원문(자모는 자모 그대로: 'ㄱ','ㅏ')로 표시한다.
80
+ * TTS로 읽을 땐 자모를 낱자 이름으로 바꿔야 하지만(그건 jamoToNamesForSpeech가 합성 경로에서 처리), 화면 표기는 자모 유지.
81
+ * 예: ['아','냐'] → `"아"와 "냐"를 합치면 어떤 단어가 되나요?` / ['ㄱ','ㅏ'] → `"ㄱ"와 "ㅏ"를 합치면 어떤 소리가 되나요?`
82
+ */
83
+ export function mergeQuestionText(parts, phoneme = false) {
84
+ const p = parts.filter(Boolean);
85
+ if (p.length < 2)
86
+ return '';
87
+ // 글자는 자모 그대로 표시하되, 조사는 '읽는 형태'(자모면 낱자 이름)의 받침 기준으로 붙인다.
88
+ // 예: 'ㄸ'는 화면엔 'ㄸ'로 두되 조사는 '쌍디귿' 기준 → "ㄸ"과. 'ㅇ' → 이응 → "ㅇ"을.
89
+ const josaBase = (x) => JAMO_NAME[x] ?? x;
90
+ const head = p.slice(0, -1).map(x => `"${x}"${josaWaGwa(josaBase(x))}`).join(' ');
91
+ const lastWord = p[p.length - 1];
92
+ const last = `"${lastWord}"${josaEulReul(josaBase(lastWord))}`;
93
+ return `${head} ${last} 합치면 어떤 ${phoneme ? '소리' : '단어'}가 되나요?`;
94
+ }
95
+ /**
96
+ * @public 합치기 카드 질문 문장 — 러너(재생)·프리워밍 공용 단일 출처. typeKey로 음소 여부를 판별해 mergeQuestionText 호출.
97
+ */
98
+ export function getMergeCardTitle(typeKey, parts) {
99
+ return mergeQuestionText(parts, typeKey === 'MERGE_2_PHONEMES' || typeKey === 'MERGE_3_PHONEMES');
100
+ }
101
+ /**
102
+ * @public 바꾸기(대치) 카드 질문 문장 — 러너·프리워밍 공용. item의 word/changedFrom/changedTo로 구성.
103
+ * 프리워밍이 만든 문장이 러너 재생 문장과 문자 단위로 같아야 캐시 키가 일치하므로 반드시 이 함수를 공유한다.
104
+ */
105
+ export function getChangeCardTitle(typeKey, item) {
106
+ const word = String(item?.word ?? item?.original ?? '');
107
+ const changedFrom = String(item?.changedFrom ?? '');
108
+ const changedTo = String(item?.changedTo ?? '');
109
+ if (typeKey === 'CHANGE_1_PHONEME_IN_1SYLL') {
110
+ // 1음절 단어 전체가 바뀌는 케이스 — "에서 X를" 없이 단순 표현
111
+ return `"${word}"${josaEulReul(word)} "${changedTo}"${josaEuRo(changedTo)} 바꾸면 무엇이 되나요?`;
112
+ }
113
+ return `"${word}"에서 "${changedFrom}"${josaEulReul(changedFrom)} "${changedTo}"${josaEuRo(changedTo)} 바꾸면 무엇이 되나요?`;
114
+ }
115
+ /**
116
+ * @public 탈락(삭제) 카드 질문 문장 — 러너·프리워밍 공용. item의 word/dropped/missingConsonant로 구성.
117
+ */
118
+ export function getDropCardTitle(typeKey, item) {
119
+ const word = String(item?.word ?? item?.original ?? item?.base ?? '');
120
+ const dropped = String(item?.dropped ?? '');
121
+ if (typeKey === 'DROP_FINAL_CONSONANT_FROM_1SYLL') {
122
+ return `"${word}"에서 받침이 없어지면 어떤 말이 되나요?`;
123
+ }
124
+ if (typeKey === 'REMOVE_CONSONANT_AND_IDENTIFY_PHONEME') {
125
+ const consonant = String(item?.missingConsonant ?? '');
126
+ return `"${word}"에서 "${consonant}"${josaIga(consonant)} 없어지면 어떤 소리가 되나요?`;
127
+ }
128
+ return `"${word}"에서 "${dropped}"${josaIga(dropped)} 없어지면 어떤 말이 되나요?`;
129
+ }
130
+ /**
131
+ * @public 카드형(합치기/바꾸기/탈락) 질문 문장을 반환한다. 카드형이 아니면 '' (빈 문자열).
132
+ * 러너(WordManipulationTrainingPagePopup.getCardStepMeta)와 프리워밍(앱)의 **단일 출처** — 그룹 판정(cardGroupOf)과
133
+ * 문장 문구를 한 곳에 모아, 프리워밍이 만든 문장과 러너가 재생하는 문장이 항상 문자 단위로 일치하게 한다.
134
+ */
135
+ export function cardQuestionTitle(typeKey, item, parts) {
136
+ switch (cardGroupOf(typeKey)) {
137
+ case 'synthesis': return getMergeCardTitle(typeKey, parts);
138
+ case 'substitution': return getChangeCardTitle(typeKey, item);
139
+ case 'deletion': return getDropCardTitle(typeKey, item);
140
+ default: return '';
141
+ }
142
+ }
143
+ /**
144
+ * @public TTS 전용 변환 — 문장 속 따옴표로 감싼 낱개 자모("ㄱ")를 낱자 이름("기역")으로 치환하고 뒤 조사를 맞춘다.
145
+ * 표시 텍스트는 자모 그대로 두고(교육용 표기), 합성·캐시 키에만 이 변환을 적용한다. 자음은 명칭(ㄱ→기역),
146
+ * 모음은 소릿값(ㅏ→아). 음소 합치기뿐 아니라 음소 바꾸기·자음 탈락 등 자모가 든 모든 문장에 공통 적용된다.
147
+ */
148
+ export function jamoToNamesForSpeech(text) {
149
+ return text.replace(/"([ㄱ-ㅣ])"(으로|와|과|을|를|이|가|은|는|로)?/g, (m, jamo, josa) => {
150
+ const name = JAMO_NAME[jamo];
151
+ if (!name)
152
+ return m;
153
+ if (!josa)
154
+ return `"${name}"`;
155
+ const jong = (name.charCodeAt(name.length - 1) - 0xAC00) % 28;
156
+ const hasJong = jong !== 0;
157
+ let j = josa;
158
+ if (josa === '와' || josa === '과')
159
+ j = hasJong ? '과' : '와';
160
+ else if (josa === '을' || josa === '를')
161
+ j = hasJong ? '을' : '를';
162
+ else if (josa === '이' || josa === '가')
163
+ j = hasJong ? '이' : '가';
164
+ else if (josa === '은' || josa === '는')
165
+ j = hasJong ? '은' : '는';
166
+ else if (josa === '으로' || josa === '로')
167
+ j = (jong === 0 || jong === 8) ? '로' : '으로';
168
+ return `"${name}"${j}`;
169
+ });
170
+ }
171
+ /** 표준발음 조회 — 없으면 단어 자체(발음 데이터 없는 경우의 안전한 폴백). */
172
+ function pronOf(word, pronMap) {
173
+ return pronMap.get(word) || word;
174
+ }
175
+ const asArr = (v) => (v == null ? [] : Array.isArray(v) ? v : [v]);
176
+ /**
177
+ * @public 음절 끝소리 규칙 — 종성을 7종성(ㄱㄴㄷㄹㅁㅂㅇ)으로 중화한 '표준발음' 음절.
178
+ * 합성 음절(대립쌍 오답)은 pronMap에 없어 발음이 비므로 단일 음절 발음을 계산해 채운다.
179
+ * (초성 그대로, 종성만 중화. 겹받침은 대표음. 단일 음절이 아니면 '' — 다음절 단어를 잘못 자르지 않게.)
180
+ */
181
+ export function syllablePron(ch) {
182
+ if ([...ch].length !== 1)
183
+ return '';
184
+ const s = parseSyllable(ch);
185
+ if (!s)
186
+ return '';
187
+ const neut = finalToPhoneme(JONGSEONG[s.jong]);
188
+ const jongIdx = neut === '' ? 0 : JONGSEONG.indexOf(neut);
189
+ return composeSyllable(s.cho, s.jung, jongIdx < 0 ? 0 : jongIdx);
190
+ }
191
+ /**
192
+ * @public 음절의 실제 소리(표준발음). pronMap에 있으면 그것, 없으면(합성 음절) 끝소리 규칙 발음, 그래도 없으면 철자.
193
+ * (예: '밡'·'밖'은 모두 [박] — 소리 기준 중복 판정에 쓴다.)
194
+ */
195
+ export function soundOf(syll, pronMap) {
196
+ return pronMap.get(syll) || syllablePron(syll) || syll;
197
+ }
198
+ /** @public comp에서 실제로 선택된 파트 1개(초성 우선)를 반환. 없으면 null. */
199
+ export function primarySelPart(comp) {
200
+ if (!comp)
201
+ return null;
202
+ if (hasSel(comp.cho))
203
+ return 'cho';
204
+ if (hasSel(comp.jung))
205
+ return 'jung';
206
+ if (hasSel(comp.jong))
207
+ return 'jong';
208
+ return null;
209
+ }
210
+ /** @public 음절(분해값 s)이 comp의 선택 파트들과 모두 일치하는지(=선택 음소를 가진 음절). */
211
+ export function syllMatchesComp(s, comp) {
212
+ const ok = (arr, val) => !hasSel(arr) || asArr(arr).includes(val);
213
+ return ok(comp.cho, CHOSEONG[s.cho]) && ok(comp.jung, JUNGSEONG[s.jung]) && ok(comp.jong, JONGSEONG[s.jong]);
214
+ }
215
+ /**
216
+ * @public 발음 모드에서 comp 매칭에 쓸 음절 배열. 표준발음(pronMap)의 음절수가 철자와 같으면 발음 음절로,
217
+ * 아니면(연음 등으로 정렬 불가) 철자 음절로 매칭한다. 대립 오답 생성은 항상 철자 기준(소리로 중복제거).
218
+ */
219
+ export function matchSyllables(word, pronMap, phonemeView) {
220
+ const chars = [...word];
221
+ if (phonemeView !== 'pron')
222
+ return chars.map(c => parseSyllable(c));
223
+ const pronChars = [...(pronMap.get(word) || word)];
224
+ if (pronChars.length !== chars.length)
225
+ return chars.map(c => parseSyllable(c));
226
+ return pronChars.map(c => parseSyllable(c));
227
+ }
228
+ /**
229
+ * @public 정답 음절(분해 cs)의 지정 파트를 다른 음소로 바꿔 대립쌍 음절 n개 생성.
230
+ * 중복 배제는 '실제 발음(soundOf)' 기준 — 소리가 같은 오답(밡/밖→박)이 함께 나오지 않게 한다.
231
+ */
232
+ export function syllableContrasts(cs, part, correct, n, pronMap) {
233
+ const arr = part === 'cho' ? CHOSEONG : part === 'jung' ? JUNGSEONG : JONGSEONG;
234
+ const cur = cs[part];
235
+ const out = [];
236
+ const usedSound = new Set([soundOf(correct, pronMap)]);
237
+ const idxs = shuffled(arr.map((_, i) => i).filter(i => i !== cur
238
+ && (part !== 'cho' || arr[i] !== 'ㅇ') // 초성 대립은 무음(ㅇ) 제외 — 구조가 바뀜
239
+ && (part !== 'jong' || i !== 0))); // 종성 대립은 '받침 없음'(0) 제외 — 구조가 바뀜
240
+ for (const idx of idxs) {
241
+ if (out.length >= n)
242
+ break;
243
+ const syll = part === 'cho' ? composeSyllable(idx, cs.jung, cs.jong)
244
+ : part === 'jung' ? composeSyllable(cs.cho, idx, cs.jong)
245
+ : composeSyllable(cs.cho, cs.jung, idx);
246
+ const p = soundOf(syll, pronMap);
247
+ if (usedSound.has(p))
248
+ continue;
249
+ usedSound.add(p);
250
+ out.push(syll);
251
+ }
252
+ return out;
253
+ }
254
+ /**
255
+ * @public 2음절 단어 → [문제단어, 남는 1음절(정답), 대립쌍 오답 2]. 정답·오답 모두 '실단어'(wordSet)만 인정.
256
+ * 음소가 든 음절(T)을 남기고 다른 음절 탈락 → 남는 1음절이 실단어이고, 그 음절의 초성/중성/종성 대립 실단어가
257
+ * 2개 이상인 경우만 채택. 음소 미선택 시 무작위 음절. (편집기 미리보기·런타임 자동생성 공용.)
258
+ */
259
+ export function buildDropContrastProblem(word, comp, pronMap, phonemeView, wordSet, dropPos = null) {
260
+ const chars = [...word];
261
+ if (chars.length !== 2)
262
+ return null;
263
+ const spellSS = chars.map(c => parseSyllable(c));
264
+ if (spellSS.some(p => !p))
265
+ return null;
266
+ const matchSS = matchSyllables(word, pronMap, phonemeView);
267
+ if (matchSS.some(p => !p))
268
+ return null;
269
+ const part = primarySelPart(comp);
270
+ let tCandidates = (part && comp)
271
+ ? matchSS.map((s, i) => (syllMatchesComp(s, comp) ? i : -1)).filter(i => i >= 0)
272
+ : [0, 1];
273
+ // 위치(탈락시킬 음절) 지정 시 남는 음절(T)은 그 자리가 아니어야 한다.
274
+ if (dropPos != null)
275
+ tCandidates = tCandidates.filter(i => i !== dropPos);
276
+ if (!tCandidates.length)
277
+ return null;
278
+ for (const tIdx of shuffled(tCandidates)) {
279
+ const remain = chars[tIdx]; // T가 아닌 음절 탈락 → 남는 1음절 = T
280
+ if (!wordSet.has(remain))
281
+ continue;
282
+ const contrastSylls = syllableContrasts(spellSS[tIdx], part ?? 'cho', remain, 40, pronMap);
283
+ const wrongs = [];
284
+ for (const cs of contrastSylls) {
285
+ if (cs !== remain && wordSet.has(cs) && !wrongs.includes(cs))
286
+ wrongs.push(cs);
287
+ if (wrongs.length >= 2)
288
+ break;
289
+ }
290
+ if (wrongs.length < 2)
291
+ continue;
292
+ return { question: word, distractors: [remain, ...wrongs] };
293
+ }
294
+ return null;
295
+ }
296
+ /**
297
+ * @public 3음절 단어 → [문제단어, 남는 2음절(정답), 대립쌍 오답 2]. 정답·오답 모두 '실단어'만 인정.
298
+ * 음소가 든 음절(T)은 남기고 나머지 중 1개를 탈락시켜 2음절 정답을 만든 뒤, 정답 안 T 음절의 지정 파트만
299
+ * 바꿔 2음절 오답을 만든다. 음소 미선택 시 무작위. (편집기·런타임 공용.)
300
+ */
301
+ export function buildDropContrast3Problem(word, comp, pronMap, phonemeView, wordSet, dropPos = null) {
302
+ const chars = [...word];
303
+ if (chars.length !== 3)
304
+ return null;
305
+ const spellSS = chars.map(c => parseSyllable(c));
306
+ if (spellSS.some(p => !p))
307
+ return null;
308
+ const matchSS = matchSyllables(word, pronMap, phonemeView);
309
+ if (matchSS.some(p => !p))
310
+ return null;
311
+ const part = primarySelPart(comp);
312
+ const tCandidates = (part && comp)
313
+ ? matchSS.map((s, i) => (syllMatchesComp(s, comp) ? i : -1)).filter(i => i >= 0)
314
+ : [0, 1, 2];
315
+ if (!tCandidates.length)
316
+ return null;
317
+ for (const tIdx of shuffled(tCandidates)) {
318
+ for (const dropIdx of shuffled([0, 1, 2].filter(i => i !== tIdx && (dropPos == null || i === dropPos)))) {
319
+ const answerIdxs = [0, 1, 2].filter(i => i !== dropIdx);
320
+ const remain = answerIdxs.map(i => chars[i]).join('');
321
+ if (!wordSet.has(remain))
322
+ continue;
323
+ const tPos = answerIdxs.indexOf(tIdx);
324
+ const contrastSylls = syllableContrasts(spellSS[tIdx], part ?? 'cho', chars[tIdx], 40, pronMap);
325
+ const wrongs = [];
326
+ for (const cs of contrastSylls) {
327
+ const a = answerIdxs.map(i => chars[i]);
328
+ a[tPos] = cs;
329
+ const w = a.join('');
330
+ if (w !== remain && wordSet.has(w) && !wrongs.includes(w))
331
+ wrongs.push(w);
332
+ if (wrongs.length >= 2)
333
+ break;
334
+ }
335
+ if (wrongs.length < 2)
336
+ continue;
337
+ return { question: word, distractors: [remain, ...wrongs] };
338
+ }
339
+ }
340
+ return null;
341
+ }
342
+ /**
343
+ * @public 합성어 부분 탈락 → [문제단어(합성어), 남는 실단어(정답), 그 단어의 대립쌍 실단어 오답 2].
344
+ * 합성어 근사: 앞/뒤로 나눈 두 조각이 '둘 다 실단어'(wordSet)인 첫 조합을 채택(예: 손수건=손+수건).
345
+ * 정답·오답 전부 실단어라 발음이 그대로. comp(훈련음소) 지정 시 남는 단어의 그 자리를 대립, 없으면 전 음절.
346
+ * dropPos: 0=어두 어근(앞) 탈락, 1=어말 어근(뒤) 탈락. 편집기·런타임 공용.
347
+ */
348
+ export function buildDropCompoundProblem(word, comp, pronMap, phonemeView, wordSet, dropPos = null) {
349
+ const chars = [...word];
350
+ const n = chars.length;
351
+ if (n < 2)
352
+ return null;
353
+ const candidates = [];
354
+ for (let len = 1; len <= n - 1; len++) {
355
+ candidates.push({ remain: chars.slice(0, len).join(''), dropped: chars.slice(len).join(''), droppedEnd: 1 }); // 접두 남김, 뒤(어말) 탈락
356
+ candidates.push({ remain: chars.slice(n - len).join(''), dropped: chars.slice(0, n - len).join(''), droppedEnd: 0 }); // 접미 남김, 앞(어두) 탈락
357
+ }
358
+ const part = primarySelPart(comp);
359
+ for (const { remain, dropped, droppedEnd } of shuffled(candidates)) {
360
+ if (dropPos != null && droppedEnd !== dropPos)
361
+ continue; // 위치(삭제할 어근) 지정 시 그 끝만.
362
+ if (remain === word || !wordSet.has(remain) || !wordSet.has(dropped))
363
+ continue;
364
+ const rChars = [...remain];
365
+ const spellSS = rChars.map(c => parseSyllable(c));
366
+ if (spellSS.some(p => !p))
367
+ continue;
368
+ const matchSS = matchSyllables(remain, pronMap, phonemeView);
369
+ if (matchSS.some(p => !p))
370
+ continue;
371
+ const tCandidates = (part && comp)
372
+ ? matchSS.map((s, i) => (syllMatchesComp(s, comp) ? i : -1)).filter(i => i >= 0)
373
+ : rChars.map((_, i) => i);
374
+ if (!tCandidates.length)
375
+ continue;
376
+ for (const tIdx of shuffled(tCandidates)) {
377
+ const contrastSylls = syllableContrasts(spellSS[tIdx], part ?? 'cho', rChars[tIdx], 40, pronMap);
378
+ const wrongs = [];
379
+ for (const cs of contrastSylls) {
380
+ const a = [...rChars];
381
+ a[tIdx] = cs;
382
+ const w = a.join('');
383
+ if (w !== remain && wordSet.has(w) && !wrongs.includes(w))
384
+ wrongs.push(w);
385
+ if (wrongs.length >= 2)
386
+ break;
387
+ }
388
+ if (wrongs.length >= 2)
389
+ return { question: word, distractors: [remain, ...wrongs] };
390
+ }
391
+ }
392
+ return null;
393
+ }
394
+ /**
395
+ * @public 1음절 받침 탈락 → [문제단어, 받침 뗀 음절(정답), 초성 대립 오답 2]. 받침 있는 1음절만.
396
+ *
397
+ * 정답 음절은 표준발음에서 만든다 — '넷(낻)'의 받침을 떼면 들리는 소리는 '네'가 아니라 '내'다.
398
+ * (1음절 단어는 고립형이라 문맥에 따른 변동이 없어, 표준발음이 곧 실제로 들리는 소리다.
399
+ * 2음절 이상 탈락훈련은 반대로 철자 기준이 맞다 — '놀이(노리)'에서 '놀'을 빼면 '리'가 아니라 '이'다.)
400
+ */
401
+ export function buildDropFinalConsonantProblem(word, _comp, pronMap, _pv, _ws, _dropPos = null) {
402
+ if ([...word].length !== 1)
403
+ return null;
404
+ const s = parseSyllable(pronMap.get(word) || word);
405
+ if (!s || s.jong === 0)
406
+ return null;
407
+ const answer = composeSyllable(s.cho, s.jung, 0); // 받침 제거
408
+ const wrongs = syllableContrasts({ cho: s.cho, jung: s.jung, jong: 0 }, 'cho', answer, 2, pronMap);
409
+ if (wrongs.length < 2)
410
+ return null;
411
+ return { question: word, distractors: [answer, ...wrongs] };
412
+ }
413
+ const _IEUNG_CHO_IDX = CHOSEONG.indexOf('ㅇ');
414
+ /**
415
+ * @public 1음절 자음(초성) 탈락 → [문제단어(받침 없는 자음 초성 1음절), 초성 뗀 순수 모음(정답), 모음 대립 오답 2].
416
+ * 자음을 빼면 ㅇ+모음만 남으므로(가→아) 오답도 ㅇ+다른 모음(아→오·우).
417
+ *
418
+ * 남는 모음은 표준발음에서 뽑는다 — '게(개)'에서 'ㄱ'을 빼면 들리는 소리는 '에'가 아니라 '애'다.
419
+ * 이 데이터의 ㅔ→ㅐ·ㅖ→ㅒ·ㅚ/ㅞ→ㅙ 정규화는 문맥과 무관해 고립 음절에도 그대로 적용된다.
420
+ */
421
+ export function buildRemoveConsonantProblem(word, _comp, pronMap, _pv, _ws, _dropPos = null) {
422
+ if ([...word].length !== 1)
423
+ return null;
424
+ const s = parseSyllable(pronMap.get(word) || word);
425
+ if (!s || s.jong !== 0 || s.cho === _IEUNG_CHO_IDX)
426
+ return null;
427
+ const answer = composeSyllable(_IEUNG_CHO_IDX, s.jung, 0); // 초성(자음) 제거 → 순수 모음
428
+ const wrongs = syllableContrasts({ cho: _IEUNG_CHO_IDX, jung: s.jung, jong: 0 }, 'jung', answer, 2, pronMap);
429
+ if (wrongs.length < 2)
430
+ return null;
431
+ return { question: word, distractors: [answer, ...wrongs] };
432
+ }
433
+ // ── CHANGE 음절 바꾸기(완전히 다른 음절) 공유 생성기 ─────────────────────────
434
+ // 편집기·런타임 공용. "한 음절만 2음소↑ 다른 실단어"로 교체(최소대립쌍과 구분).
435
+ /** 위치 p를 와일드카드('*')로 마스킹한 "나머지 음절이 같은" 2·3음절 실단어 그룹(O(1) 조회). */
436
+ export function buildSyllableMaskIndex(wordSet) {
437
+ const index = new Map();
438
+ for (const w of wordSet) {
439
+ const chars = [...w];
440
+ const n = chars.length;
441
+ if (n < 2 || n > 3)
442
+ continue;
443
+ for (let p = 0; p < n; p++) {
444
+ let k = n + '|' + p + '|';
445
+ for (let i = 0; i < n; i++)
446
+ k += (i === p ? '*' : chars[i]);
447
+ const b = index.get(k);
448
+ if (b)
449
+ b.push(w);
450
+ else
451
+ index.set(k, [w]);
452
+ }
453
+ }
454
+ return index;
455
+ }
456
+ /**
457
+ * 음절 바꾸기 — 한 음절을 '완전히 다른 음절'(minDiff=2음소↑ 차이)로 교체한 실단어를 정답으로.
458
+ * 같은 위치 1음절만, 2음소↑ 차, 발음 상이, 실단어(데이터)만. 합성 없음.
459
+ * compFrom=원래 음절 필터, compTo=바뀐 음절 필터, targetPos=바꿀 위치.
460
+ */
461
+ export function buildChangeWholeSyllableProblem(word, compFrom, pronMap, phonemeView, maskIndex, targetPos = null, compTo = null, minDiff = 2) {
462
+ const chars = [...word];
463
+ const n = chars.length;
464
+ if (n < 2 || n > 3)
465
+ return null;
466
+ const dW = chars.map(c => parseSyllable(c));
467
+ if (dW.some(p => !p))
468
+ return null;
469
+ const matchSS = matchSyllables(word, pronMap, phonemeView);
470
+ if (matchSS.some(p => !p))
471
+ return null;
472
+ const pw = (w) => pronMap.get(w) ?? w;
473
+ const wPron = pw(word);
474
+ const fromSel = !!compFrom && (hasSel(compFrom.cho) || hasSel(compFrom.jung) || hasSel(compFrom.jong));
475
+ const toSel = !!compTo && (hasSel(compTo.cho) || hasSel(compTo.jung) || hasSel(compTo.jong));
476
+ const maskKey = (p) => { let k = n + '|' + p + '|'; for (let i = 0; i < n; i++)
477
+ k += (i === p ? '*' : chars[i]); return k; };
478
+ let positions;
479
+ if (targetPos != null) {
480
+ if (targetPos >= n)
481
+ return null;
482
+ if (fromSel && !syllMatchesComp(matchSS[targetPos], compFrom))
483
+ return null;
484
+ positions = [targetPos];
485
+ }
486
+ else if (fromSel) {
487
+ positions = matchSS.map((s, i) => (syllMatchesComp(s, compFrom) ? i : -1)).filter(i => i >= 0);
488
+ }
489
+ else {
490
+ positions = Array.from({ length: n }, (_, i) => i);
491
+ }
492
+ for (const p of shuffled(positions)) {
493
+ const group = maskIndex.get(maskKey(p)) ?? [];
494
+ const swaps = []; // 정답 후보 (toSel이면 바뀐 음절이 compTo 일치, 아니면 전부)
495
+ const nonMatch = []; // 오답 후보 (toSel일 때 compTo 불일치) — 정답만 유일하게 'TO로 바뀐' 단어가 되게
496
+ for (const x of group) {
497
+ if (x === word)
498
+ continue;
499
+ const dx = [...x].map(c => parseSyllable(c));
500
+ const a = dW[p], b = dx[p];
501
+ if (!a || !b)
502
+ continue;
503
+ let d = 0;
504
+ if (a.cho !== b.cho)
505
+ d++;
506
+ if (a.jung !== b.jung)
507
+ d++;
508
+ if (a.jong !== b.jong)
509
+ d++;
510
+ if (d < minDiff || pw(x) === wPron)
511
+ continue;
512
+ if (toSel) {
513
+ const mx = matchSyllables(x, pronMap, phonemeView)[p];
514
+ if (mx && syllMatchesComp(mx, compTo))
515
+ swaps.push(x);
516
+ else
517
+ nonMatch.push(x); // TO에 맞지 않는 음절교체 → 오답 풀
518
+ }
519
+ else {
520
+ swaps.push(x);
521
+ }
522
+ }
523
+ if (!swaps.length)
524
+ continue;
525
+ const answer = shuffled(swaps)[0];
526
+ const wrongs = [];
527
+ const usedPron = new Set([wPron, pw(answer)]);
528
+ // 오답 풀: TO 지정 시 'TO에 맞지 않는' 단어(정답만 유일하게 TO 만족 → '모두 정답' 방지),
529
+ // 미지정 시 다른 음절교체 단어(카드가 특정 음절 교체를 명시해 유일 정답).
530
+ const wrongPool = toSel ? nonMatch : swaps.filter(x => x !== answer);
531
+ for (const x of shuffled(wrongPool)) {
532
+ const xp = pw(x);
533
+ if (usedPron.has(xp))
534
+ continue;
535
+ usedPron.add(xp);
536
+ wrongs.push(x);
537
+ if (wrongs.length >= 2)
538
+ break;
539
+ }
540
+ // TO 미지정(whole-syllable)만 부족 시 group에서 보충(기존 동작 유지). TO 지정은 보충하지 않는다(TO 불일치만 오답).
541
+ if (!toSel && wrongs.length < 2) {
542
+ for (const x of shuffled(group)) {
543
+ if (x === word || x === answer)
544
+ continue;
545
+ const xp = pw(x);
546
+ if (usedPron.has(xp))
547
+ continue;
548
+ usedPron.add(xp);
549
+ wrongs.push(x);
550
+ if (wrongs.length >= 2)
551
+ break;
552
+ }
553
+ }
554
+ if (wrongs.length < 2)
555
+ continue;
556
+ return { question: word, distractors: [answer, ...wrongs] };
557
+ }
558
+ return null;
559
+ }
560
+ export { pronOf as pronFromMap };
@@ -0,0 +1,10 @@
1
+ import { type WordTrainingType } from '../hooks/useWordTrainingDataGeneration';
2
+ export interface TrainingGroup {
3
+ key: string;
4
+ label: string;
5
+ disc: string;
6
+ icon: string;
7
+ types: WordTrainingType[];
8
+ }
9
+ /** @public 단어 훈련 그룹/유형 메타(라벨·아이콘·색). 통계 표시 등에서 재사용 */
10
+ export declare const WORD_TRAINING_GROUPS: TrainingGroup[];
@@ -0,0 +1,69 @@
1
+ import { TRAINING_PALETTE } from './trainingPalette';
2
+ // 카테고리별 색상 (파스텔 톤) — 공용 팔레트 단일 소스
3
+ const COLOR_SOUND = TRAINING_PALETTE.blue;
4
+ const COLOR_MERGE = TRAINING_PALETTE.green;
5
+ const COLOR_DROP = TRAINING_PALETTE.amber;
6
+ const COLOR_CHANGE = TRAINING_PALETTE.purple;
7
+ const COLOR_ATTN = TRAINING_PALETTE.pink;
8
+ /** @public 단어 훈련 그룹/유형 메타(라벨·아이콘·색). 통계 표시 등에서 재사용 */
9
+ export const WORD_TRAINING_GROUPS = [
10
+ {
11
+ key: 'discrimination',
12
+ label: '변별훈련',
13
+ disc: '두 소리가 같은지 다른지, 또는 특정 소리를 구별하는 훈련입니다.',
14
+ icon: 'ear',
15
+ types: [
16
+ { key: 'SAME_SOUND_PICK', label: '같은 소리 고르기', icon: 'volume-2', color: COLOR_SOUND, subTitle: '들은 소리와 같은 단어 카드를 고르세요.' },
17
+ { key: 'SAME_OR_DIFF', label: '같은지 다른지 맞히기', icon: 'diff', color: COLOR_SOUND, subTitle: '두 소리가 같은지, 다른지 구분하세요.' },
18
+ { key: 'HEAR_AND_PICK_SAME', label: '일치하는 단어 맞히기', icon: 'headphones', color: COLOR_SOUND, subTitle: '들은 소리의 단어 카드를 고르세요.' },
19
+ { key: 'HEAR_AND_PICK_INCLUDED', label: '한 음절 포함 단어 맞히기', icon: 'scan-search', color: COLOR_SOUND, subTitle: '들은 음절이 포함된 단어 카드를 고르세요.' },
20
+ { key: 'STARTS_WITH_SAME_SOUND', label: '첫 음절이 같은 단어 맞히기', icon: 'play-circle', color: COLOR_SOUND, subTitle: '들은 단어와 같은 소리로 시작하는 단어를 고르세요.' },
21
+ ],
22
+ },
23
+ {
24
+ key: 'synthesis',
25
+ label: '합성훈련',
26
+ disc: '두 개 이상의 음절이나 음소를 합쳐 단어를 만드는 훈련입니다.',
27
+ icon: 'git-merge',
28
+ types: [
29
+ { key: 'MERGE_2_SYLLABLES', label: '음절 2개 합치기', icon: 'link-2', color: COLOR_MERGE, subTitle: '두 음절을 합치면 어떤 단어가 될까요?' },
30
+ { key: 'MERGE_3_SYLLABLES', label: '음절 3개 합치기', icon: 'git-merge', color: COLOR_MERGE, subTitle: '세 음절을 합치면 어떤 단어가 될까요?' },
31
+ { key: 'MERGE_2_PHONEMES', label: '음소 2개 합치기', icon: 'combine', color: COLOR_MERGE, subTitle: '두 음소를 합치면 어떤 소리가 될까요?' },
32
+ { key: 'MERGE_3_PHONEMES', label: '음소 3개 합치기', icon: 'braces', color: COLOR_MERGE, subTitle: '세 음소를 합치면 어떤 소리가 될까요?' },
33
+ ],
34
+ },
35
+ {
36
+ key: 'deletion',
37
+ label: '탈락훈련',
38
+ disc: '단어에서 음절이나 음소를 제거했을 때 남는 소리를 인식하는 훈련입니다.',
39
+ icon: 'scissors',
40
+ types: [
41
+ { key: 'DROP_1_FROM_2SYLL', label: '2음절에서 1음절 탈락', icon: 'scissors', color: COLOR_DROP, subTitle: '2음절 단어에서 한 음절을 빼면 어떤 소리가 될까요?' },
42
+ { key: 'DROP_1_FROM_3SYLL', label: '3음절에서 1음절 탈락', icon: 'minus-circle', color: COLOR_DROP, subTitle: '3음절 단어에서 한 음절을 빼면 어떤 소리가 될까요?' },
43
+ { key: 'DROP_PART_FROM_COMPOUND', label: '합성어에서 부분탈락', icon: 'unlink', color: COLOR_DROP, subTitle: '합성어의 일부를 빼면 어떤 단어가 될까요?' },
44
+ { key: 'DROP_FINAL_CONSONANT_FROM_1SYLL', label: '1음절에서 받침 탈락', icon: 'eraser', color: COLOR_DROP, subTitle: '받침을 빼면 어떤 소리가 될까요?' },
45
+ { key: 'REMOVE_CONSONANT_AND_IDENTIFY_PHONEME', label: '1음절에서 자음 탈락', icon: 'audio-lines', color: COLOR_DROP, subTitle: '자음을 빼면 어떤 소리가 남을까요?' },
46
+ ],
47
+ },
48
+ {
49
+ key: 'substitution',
50
+ label: '대치훈련',
51
+ disc: '단어의 일부 음절이나 음소를 바꾸어 새로운 소리를 만드는 훈련입니다.',
52
+ icon: 'replace',
53
+ types: [
54
+ { key: 'CHANGE_1_SYLL_IN_2SYLL', label: '2음절에서 한 음절 바꾸기', icon: 'replace', color: COLOR_CHANGE, subTitle: '2음절 단어의 한 음절을 바꿔 새 단어를 만드세요.' },
55
+ { key: 'CHANGE_1_SYLL_IN_3SYLL', label: '3음절에서 한 음절 바꾸기', icon: 'shuffle', color: COLOR_CHANGE, subTitle: '3음절 단어의 한 음절을 바꿔 새 단어를 만드세요.' },
56
+ { key: 'CHANGE_1_PHONEME_IN_1SYLL', label: '1음절에서 한 음소 바꾸기', icon: 'arrow-right-left', color: COLOR_CHANGE, subTitle: '1음절 단어의 한 음소를 바꿔 새 소리를 만드세요.' },
57
+ { key: 'CHANGE_1_PHONEME_IN_2SYLL', label: '2음절에서 한 음소 바꾸기', icon: 'flip-horizontal', color: COLOR_CHANGE, subTitle: '2음절 단어의 한 음소를 바꿔 새 단어를 만드세요.' },
58
+ ],
59
+ },
60
+ {
61
+ key: 'attention',
62
+ label: '청각적주의력훈련',
63
+ disc: '여러 소리를 듣고 순서를 기억하는 주의력과 단기 기억 훈련입니다.',
64
+ icon: 'list-ordered',
65
+ types: [
66
+ { key: 'LISTEN_AND_REMEMBER_ORDER', label: '듣고 순서대로 기억하기', icon: 'list-ordered', color: COLOR_ATTN, subTitle: '세 단어를 들은 순서대로 카드를 선택하세요.' },
67
+ ],
68
+ },
69
+ ];