@magmamath/students-features 0.10.0 → 0.11.0-rc.10

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 (538) hide show
  1. package/dist/commonjs/features/celebrations/helpers.js +4 -1
  2. package/dist/commonjs/features/celebrations/helpers.js.map +1 -1
  3. package/dist/commonjs/features/chatbot/TTS_HIGHLIGHTING.md +120 -0
  4. package/dist/commonjs/features/chatbot/components/Chat/Chat.js +229 -45
  5. package/dist/commonjs/features/chatbot/components/Chat/Chat.js.map +1 -1
  6. package/dist/commonjs/features/chatbot/components/Chat/CloseButton.js +39 -0
  7. package/dist/commonjs/features/chatbot/components/Chat/CloseButton.js.map +1 -0
  8. package/dist/commonjs/features/chatbot/components/Chat/GradientFade.js +44 -0
  9. package/dist/commonjs/features/chatbot/components/Chat/GradientFade.js.map +1 -0
  10. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js +46 -54
  11. package/dist/commonjs/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  12. package/dist/commonjs/features/chatbot/components/ChatInput/ChatInput.js +1 -1
  13. package/dist/commonjs/features/chatbot/components/ChatInput/ChatInput.js.map +1 -1
  14. package/dist/commonjs/features/chatbot/components/ChatInput/FreeText/ChatTextInput.js +2 -2
  15. package/dist/commonjs/features/chatbot/components/ChatInput/FreeText/ChatTextInput.js.map +1 -1
  16. package/dist/commonjs/features/chatbot/components/ChatInput/FreeText/SendMessageButton.js +1 -1
  17. package/dist/commonjs/features/chatbot/components/ChatMessage/AnimatedMessage.js +41 -0
  18. package/dist/commonjs/features/chatbot/components/ChatMessage/AnimatedMessage.js.map +1 -0
  19. package/dist/commonjs/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -1
  20. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageContent.js +16 -4
  21. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageContent.js.map +1 -1
  22. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageLoader.js +14 -34
  23. package/dist/commonjs/features/chatbot/components/ChatMessage/MessageLoader.js.map +1 -1
  24. package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js +20 -15
  25. package/dist/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
  26. package/dist/commonjs/features/chatbot/components/ChatMessage/SentMessage.js +1 -1
  27. package/dist/commonjs/features/chatbot/components/Chatbot.js +30 -7
  28. package/dist/commonjs/features/chatbot/components/Chatbot.js.map +1 -1
  29. package/dist/commonjs/features/chatbot/constants.js +2 -1
  30. package/dist/commonjs/features/chatbot/constants.js.map +1 -1
  31. package/dist/commonjs/features/chatbot/helpers/ttsHighlight.js +29 -0
  32. package/dist/commonjs/features/chatbot/helpers/ttsHighlight.js.map +1 -0
  33. package/dist/commonjs/features/chatbot/helpers.js +19 -2
  34. package/dist/commonjs/features/chatbot/helpers.js.map +1 -1
  35. package/dist/commonjs/features/chatbot/index.js.map +1 -1
  36. package/dist/commonjs/features/chatbot/model/ChatBotModel.js +65 -17
  37. package/dist/commonjs/features/chatbot/model/ChatBotModel.js.map +1 -1
  38. package/dist/commonjs/features/chatbot/model/ChatBotThreadManager.js +2 -2
  39. package/dist/commonjs/features/chatbot/model/ChatBotThreadManager.js.map +1 -1
  40. package/dist/commonjs/features/chatbot/model/ChatBoxTextManager.js +2 -1
  41. package/dist/commonjs/features/chatbot/model/ChatBoxTextManager.js.map +1 -1
  42. package/dist/commonjs/features/chatbot/model/ChatTTSHighlightModel.js +56 -0
  43. package/dist/commonjs/features/chatbot/model/ChatTTSHighlightModel.js.map +1 -0
  44. package/dist/commonjs/features/chatbot/model/ChatTTSModel.js +154 -0
  45. package/dist/commonjs/features/chatbot/model/ChatTTSModel.js.map +1 -0
  46. package/dist/commonjs/features/chatbot/model/ChatbotApi.js +1 -1
  47. package/dist/commonjs/features/chatbot/model/ChatbotApi.js.map +1 -1
  48. package/dist/commonjs/features/chatbot/model/ChatbotTranslation.js +1 -1
  49. package/dist/commonjs/features/chatbot/model/ChatbotTranslation.js.map +1 -1
  50. package/dist/commonjs/features/chatbot/model/ChatsCacheModel.js +9 -0
  51. package/dist/commonjs/features/chatbot/model/ChatsCacheModel.js.map +1 -1
  52. package/dist/commonjs/features/chatbot/types/model.types.js.map +1 -1
  53. package/dist/commonjs/features/chatbot/types/t2s.types.js.map +1 -1
  54. package/dist/commonjs/features/feedback/model/model.js.map +1 -1
  55. package/dist/commonjs/features/feedback/model/sockets.js +8 -5
  56. package/dist/commonjs/features/feedback/model/sockets.js.map +1 -1
  57. package/dist/commonjs/features/keyboard/components/AlgebraLayout/AlgebraLayout.js +2 -2
  58. package/dist/commonjs/features/keyboard/components/AlgebraLayout/AlgebraLayout.js.map +1 -1
  59. package/dist/commonjs/features/keyboard/components/BasicLayout/BasicLayout.js +2 -2
  60. package/dist/commonjs/features/keyboard/components/BasicLayout/BasicLayout.js.map +1 -1
  61. package/dist/commonjs/features/keyboard/components/BasicPlusLayout/keyboardGroups.js +4 -4
  62. package/dist/commonjs/features/keyboard/components/BasicPlusLayout/keyboardGroups.js.map +1 -1
  63. package/dist/commonjs/features/keyboard/components/BasicPlusPlusLayout/BasicPlusPlusLayout.js +2 -2
  64. package/dist/commonjs/features/keyboard/components/BasicPlusPlusLayout/BasicPlusPlusLayout.js.map +1 -1
  65. package/dist/commonjs/features/keyboard/components/BasicPlusPlusLayout/keyboardGroups.js +4 -4
  66. package/dist/commonjs/features/keyboard/components/BasicPlusPlusLayout/keyboardGroups.js.map +1 -1
  67. package/dist/commonjs/features/keyboard/components/Keyboard.js +4 -2
  68. package/dist/commonjs/features/keyboard/components/Keyboard.js.map +1 -1
  69. package/dist/commonjs/features/keyboard/components/MainLayout/MainLayout.js +1 -6
  70. package/dist/commonjs/features/keyboard/components/MainLayout/MainLayout.js.map +1 -1
  71. package/dist/commonjs/features/keyboard/components/UnitsLayout/UnitTabs.js +1 -1
  72. package/dist/commonjs/features/keyboard/components/UnitsLayout/helpers.js +3 -1
  73. package/dist/commonjs/features/keyboard/components/UnitsLayout/helpers.js.map +1 -1
  74. package/dist/commonjs/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.js +27 -6
  75. package/dist/commonjs/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.js.map +1 -1
  76. package/dist/commonjs/features/keyboard/components/UnitsLayout/keyboardGroups.js +9 -1
  77. package/dist/commonjs/features/keyboard/components/UnitsLayout/keyboardGroups.js.map +1 -1
  78. package/dist/commonjs/features/keyboard/components/UnitsLayout/types.js +1 -0
  79. package/dist/commonjs/features/keyboard/components/UnitsLayout/types.js.map +1 -1
  80. package/dist/commonjs/features/keyboard/constants/constants.js +1 -1
  81. package/dist/commonjs/features/keyboard/constants/keyboardGroupsByLocale.js +2 -1
  82. package/dist/commonjs/features/keyboard/constants/keyboardGroupsByLocale.js.map +1 -1
  83. package/dist/commonjs/features/keyboard/constants/keyboardLayouts.js +20 -4
  84. package/dist/commonjs/features/keyboard/constants/keyboardLayouts.js.map +1 -1
  85. package/dist/commonjs/features/keyboard/helpers.js +7 -0
  86. package/dist/commonjs/features/keyboard/helpers.js.map +1 -1
  87. package/dist/commonjs/features/keyboard/types/MathKeysGroups/basicOperators.js +20 -3
  88. package/dist/commonjs/features/keyboard/types/MathKeysGroups/basicOperators.js.map +1 -1
  89. package/dist/commonjs/features/keyboard/types/MathKeysGroups/units.js +6 -3
  90. package/dist/commonjs/features/keyboard/types/MathKeysGroups/units.js.map +1 -1
  91. package/dist/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.js +34 -0
  92. package/dist/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.js.map +1 -0
  93. package/dist/commonjs/features/openEnded/components/OpenEndedScoreLabel.js +77 -0
  94. package/dist/commonjs/features/openEnded/components/OpenEndedScoreLabel.js.map +1 -0
  95. package/dist/commonjs/features/openEnded/index.js +48 -0
  96. package/dist/commonjs/features/openEnded/index.js.map +1 -0
  97. package/dist/commonjs/features/openEnded/oe.helpers.js +26 -0
  98. package/dist/commonjs/features/openEnded/oe.helpers.js.map +1 -0
  99. package/dist/commonjs/features/openEnded/oe.types.js +14 -0
  100. package/dist/commonjs/features/openEnded/oe.types.js.map +1 -0
  101. package/dist/commonjs/index.js +13 -1
  102. package/dist/commonjs/index.js.map +1 -1
  103. package/dist/commonjs/lib/components/ConditionalWrapper.js +23 -0
  104. package/dist/commonjs/lib/components/ConditionalWrapper.js.map +1 -0
  105. package/dist/commonjs/shared/common.constants.js +9 -0
  106. package/dist/commonjs/shared/common.constants.js.map +1 -0
  107. package/dist/commonjs/shared/icons/TimeIcon.js +37 -0
  108. package/dist/commonjs/shared/icons/TimeIcon.js.map +1 -0
  109. package/dist/commonjs/shared/icons/keyboard/CDotIcon/CDotIcon.js +4 -4
  110. package/dist/commonjs/shared/icons/keyboard/CDotIcon/CDotIcon.js.map +1 -1
  111. package/dist/commonjs/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.js +32 -0
  112. package/dist/commonjs/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.js.map +1 -0
  113. package/dist/commonjs/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.js +32 -0
  114. package/dist/commonjs/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.js.map +1 -0
  115. package/dist/commonjs/shared/translation/localization/ca.json +4 -2
  116. package/dist/commonjs/shared/translation/localization/de.json +4 -2
  117. package/dist/commonjs/shared/translation/localization/en.json +4 -2
  118. package/dist/commonjs/shared/translation/localization/gb.json +4 -2
  119. package/dist/commonjs/shared/translation/localization/sct.json +4 -2
  120. package/dist/commonjs/shared/translation/localization/sw.json +4 -2
  121. package/dist/commonjs/types/common.types.js +4 -0
  122. package/dist/module/features/celebrations/helpers.js +4 -1
  123. package/dist/module/features/celebrations/helpers.js.map +1 -1
  124. package/dist/module/features/chatbot/TTS_HIGHLIGHTING.md +120 -0
  125. package/dist/module/features/chatbot/components/Chat/Chat.js +231 -47
  126. package/dist/module/features/chatbot/components/Chat/Chat.js.map +1 -1
  127. package/dist/module/features/chatbot/components/Chat/CloseButton.js +33 -0
  128. package/dist/module/features/chatbot/components/Chat/CloseButton.js.map +1 -0
  129. package/dist/module/features/chatbot/components/Chat/GradientFade.js +39 -0
  130. package/dist/module/features/chatbot/components/Chat/GradientFade.js.map +1 -0
  131. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js +46 -55
  132. package/dist/module/features/chatbot/components/ChatControls/ChatControls.js.map +1 -1
  133. package/dist/module/features/chatbot/components/ChatInput/ChatInput.js +1 -1
  134. package/dist/module/features/chatbot/components/ChatInput/ChatInput.js.map +1 -1
  135. package/dist/module/features/chatbot/components/ChatInput/FreeText/ChatTextInput.js +2 -2
  136. package/dist/module/features/chatbot/components/ChatInput/FreeText/ChatTextInput.js.map +1 -1
  137. package/dist/module/features/chatbot/components/ChatInput/FreeText/SendMessageButton.js +1 -1
  138. package/dist/module/features/chatbot/components/ChatMessage/AnimatedMessage.js +34 -0
  139. package/dist/module/features/chatbot/components/ChatMessage/AnimatedMessage.js.map +1 -0
  140. package/dist/module/features/chatbot/components/ChatMessage/ChatMessage.js.map +1 -1
  141. package/dist/module/features/chatbot/components/ChatMessage/MessageContent.js +16 -4
  142. package/dist/module/features/chatbot/components/ChatMessage/MessageContent.js.map +1 -1
  143. package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js +17 -36
  144. package/dist/module/features/chatbot/components/ChatMessage/MessageLoader.js.map +1 -1
  145. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js +19 -14
  146. package/dist/module/features/chatbot/components/ChatMessage/ReceivedMessage.js.map +1 -1
  147. package/dist/module/features/chatbot/components/ChatMessage/SentMessage.js +1 -1
  148. package/dist/module/features/chatbot/components/Chatbot.js +28 -6
  149. package/dist/module/features/chatbot/components/Chatbot.js.map +1 -1
  150. package/dist/module/features/chatbot/constants.js +1 -0
  151. package/dist/module/features/chatbot/constants.js.map +1 -1
  152. package/dist/module/features/chatbot/helpers/ttsHighlight.js +23 -0
  153. package/dist/module/features/chatbot/helpers/ttsHighlight.js.map +1 -0
  154. package/dist/module/features/chatbot/helpers.js +19 -2
  155. package/dist/module/features/chatbot/helpers.js.map +1 -1
  156. package/dist/module/features/chatbot/index.js.map +1 -1
  157. package/dist/module/features/chatbot/model/ChatBotModel.js +65 -17
  158. package/dist/module/features/chatbot/model/ChatBotModel.js.map +1 -1
  159. package/dist/module/features/chatbot/model/ChatBotThreadManager.js +2 -2
  160. package/dist/module/features/chatbot/model/ChatBotThreadManager.js.map +1 -1
  161. package/dist/module/features/chatbot/model/ChatBoxTextManager.js +2 -1
  162. package/dist/module/features/chatbot/model/ChatBoxTextManager.js.map +1 -1
  163. package/dist/module/features/chatbot/model/ChatTTSHighlightModel.js +52 -0
  164. package/dist/module/features/chatbot/model/ChatTTSHighlightModel.js.map +1 -0
  165. package/dist/module/features/chatbot/model/ChatTTSModel.js +149 -0
  166. package/dist/module/features/chatbot/model/ChatTTSModel.js.map +1 -0
  167. package/dist/module/features/chatbot/model/ChatbotApi.js +1 -1
  168. package/dist/module/features/chatbot/model/ChatbotApi.js.map +1 -1
  169. package/dist/module/features/chatbot/model/ChatbotTranslation.js +1 -1
  170. package/dist/module/features/chatbot/model/ChatbotTranslation.js.map +1 -1
  171. package/dist/module/features/chatbot/model/ChatsCacheModel.js +9 -0
  172. package/dist/module/features/chatbot/model/ChatsCacheModel.js.map +1 -1
  173. package/dist/module/features/chatbot/types/model.types.js.map +1 -1
  174. package/dist/module/features/chatbot/types/t2s.types.js.map +1 -1
  175. package/dist/module/features/feedback/model/model.js.map +1 -1
  176. package/dist/module/features/feedback/model/sockets.js +8 -5
  177. package/dist/module/features/feedback/model/sockets.js.map +1 -1
  178. package/dist/module/features/keyboard/components/AlgebraLayout/AlgebraLayout.js +3 -3
  179. package/dist/module/features/keyboard/components/AlgebraLayout/AlgebraLayout.js.map +1 -1
  180. package/dist/module/features/keyboard/components/BasicLayout/BasicLayout.js +2 -2
  181. package/dist/module/features/keyboard/components/BasicLayout/BasicLayout.js.map +1 -1
  182. package/dist/module/features/keyboard/components/BasicPlusLayout/keyboardGroups.js +4 -4
  183. package/dist/module/features/keyboard/components/BasicPlusLayout/keyboardGroups.js.map +1 -1
  184. package/dist/module/features/keyboard/components/BasicPlusPlusLayout/BasicPlusPlusLayout.js +2 -2
  185. package/dist/module/features/keyboard/components/BasicPlusPlusLayout/BasicPlusPlusLayout.js.map +1 -1
  186. package/dist/module/features/keyboard/components/BasicPlusPlusLayout/keyboardGroups.js +4 -4
  187. package/dist/module/features/keyboard/components/BasicPlusPlusLayout/keyboardGroups.js.map +1 -1
  188. package/dist/module/features/keyboard/components/Keyboard.js +4 -2
  189. package/dist/module/features/keyboard/components/Keyboard.js.map +1 -1
  190. package/dist/module/features/keyboard/components/KeysList/KeysList.js.map +1 -1
  191. package/dist/module/features/keyboard/components/MainLayout/MainLayout.js +2 -7
  192. package/dist/module/features/keyboard/components/MainLayout/MainLayout.js.map +1 -1
  193. package/dist/module/features/keyboard/components/UnitsLayout/UnitTabs.js +1 -1
  194. package/dist/module/features/keyboard/components/UnitsLayout/helpers.js +2 -1
  195. package/dist/module/features/keyboard/components/UnitsLayout/helpers.js.map +1 -1
  196. package/dist/module/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.js +27 -6
  197. package/dist/module/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.js.map +1 -1
  198. package/dist/module/features/keyboard/components/UnitsLayout/keyboardGroups.js +9 -1
  199. package/dist/module/features/keyboard/components/UnitsLayout/keyboardGroups.js.map +1 -1
  200. package/dist/module/features/keyboard/components/UnitsLayout/types.js +1 -0
  201. package/dist/module/features/keyboard/components/UnitsLayout/types.js.map +1 -1
  202. package/dist/module/features/keyboard/constants/constants.js +1 -1
  203. package/dist/module/features/keyboard/constants/keyboardGroupsByLocale.js +3 -2
  204. package/dist/module/features/keyboard/constants/keyboardGroupsByLocale.js.map +1 -1
  205. package/dist/module/features/keyboard/constants/keyboardLayouts.js +19 -4
  206. package/dist/module/features/keyboard/constants/keyboardLayouts.js.map +1 -1
  207. package/dist/module/features/keyboard/helpers.js +5 -0
  208. package/dist/module/features/keyboard/helpers.js.map +1 -1
  209. package/dist/module/features/keyboard/types/MathKeysGroups/basicOperators.js +20 -3
  210. package/dist/module/features/keyboard/types/MathKeysGroups/basicOperators.js.map +1 -1
  211. package/dist/module/features/keyboard/types/MathKeysGroups/units.js +6 -3
  212. package/dist/module/features/keyboard/types/MathKeysGroups/units.js.map +1 -1
  213. package/dist/module/features/openEnded/components/OpenEndedAttemptsLimit.js +28 -0
  214. package/dist/module/features/openEnded/components/OpenEndedAttemptsLimit.js.map +1 -0
  215. package/dist/module/features/openEnded/components/OpenEndedScoreLabel.js +71 -0
  216. package/dist/module/features/openEnded/components/OpenEndedScoreLabel.js.map +1 -0
  217. package/dist/module/features/openEnded/index.js +7 -0
  218. package/dist/module/features/openEnded/index.js.map +1 -0
  219. package/dist/module/features/openEnded/oe.helpers.js +21 -0
  220. package/dist/module/features/openEnded/oe.helpers.js.map +1 -0
  221. package/dist/module/features/openEnded/oe.types.js +10 -0
  222. package/dist/module/features/openEnded/oe.types.js.map +1 -0
  223. package/dist/module/index.js +1 -0
  224. package/dist/module/index.js.map +1 -1
  225. package/dist/module/lib/components/ConditionalWrapper.js +17 -0
  226. package/dist/module/lib/components/ConditionalWrapper.js.map +1 -0
  227. package/dist/module/shared/common.constants.js +5 -0
  228. package/dist/module/shared/common.constants.js.map +1 -0
  229. package/dist/module/shared/icons/TimeIcon.js +29 -0
  230. package/dist/module/shared/icons/TimeIcon.js.map +1 -0
  231. package/dist/module/shared/icons/keyboard/CDotIcon/CDotIcon.js +4 -4
  232. package/dist/module/shared/icons/keyboard/CDotIcon/CDotIcon.js.map +1 -1
  233. package/dist/module/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.js +24 -0
  234. package/dist/module/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.js.map +1 -0
  235. package/dist/module/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.js +24 -0
  236. package/dist/module/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.js.map +1 -0
  237. package/dist/module/shared/translation/localization/ca.json +4 -2
  238. package/dist/module/shared/translation/localization/de.json +4 -2
  239. package/dist/module/shared/translation/localization/en.json +4 -2
  240. package/dist/module/shared/translation/localization/gb.json +4 -2
  241. package/dist/module/shared/translation/localization/sct.json +4 -2
  242. package/dist/module/shared/translation/localization/sw.json +4 -2
  243. package/dist/module/types/common.types.js +2 -0
  244. package/dist/typescript/commonjs/features/celebrations/helpers.d.ts.map +1 -1
  245. package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts +7 -2
  246. package/dist/typescript/commonjs/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
  247. package/dist/typescript/commonjs/features/chatbot/components/Chat/CloseButton.d.ts +7 -0
  248. package/dist/typescript/commonjs/features/chatbot/components/Chat/CloseButton.d.ts.map +1 -0
  249. package/dist/typescript/commonjs/features/chatbot/components/Chat/GradientFade.d.ts +10 -0
  250. package/dist/typescript/commonjs/features/chatbot/components/Chat/GradientFade.d.ts.map +1 -0
  251. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts +3 -2
  252. package/dist/typescript/commonjs/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  253. package/dist/typescript/commonjs/features/chatbot/components/ChatInput/ChatInput.d.ts.map +1 -1
  254. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/AnimatedMessage.d.ts +7 -0
  255. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/AnimatedMessage.d.ts.map +1 -0
  256. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts +4 -2
  257. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -1
  258. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageContent.d.ts +4 -2
  259. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageContent.d.ts.map +1 -1
  260. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageLoader.d.ts +2 -3
  261. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/MessageLoader.d.ts.map +1 -1
  262. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +1 -1
  263. package/dist/typescript/commonjs/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -1
  264. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts +5 -1
  265. package/dist/typescript/commonjs/features/chatbot/components/Chatbot.d.ts.map +1 -1
  266. package/dist/typescript/commonjs/features/chatbot/constants.d.ts +1 -0
  267. package/dist/typescript/commonjs/features/chatbot/constants.d.ts.map +1 -1
  268. package/dist/typescript/commonjs/features/chatbot/helpers/ttsHighlight.d.ts +8 -0
  269. package/dist/typescript/commonjs/features/chatbot/helpers/ttsHighlight.d.ts.map +1 -0
  270. package/dist/typescript/commonjs/features/chatbot/helpers.d.ts.map +1 -1
  271. package/dist/typescript/commonjs/features/chatbot/index.d.ts +3 -2
  272. package/dist/typescript/commonjs/features/chatbot/index.d.ts.map +1 -1
  273. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts +6 -3
  274. package/dist/typescript/commonjs/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  275. package/dist/typescript/commonjs/features/chatbot/model/ChatBotThreadManager.d.ts +4 -3
  276. package/dist/typescript/commonjs/features/chatbot/model/ChatBotThreadManager.d.ts.map +1 -1
  277. package/dist/typescript/commonjs/features/chatbot/model/ChatBoxTextManager.d.ts.map +1 -1
  278. package/dist/typescript/commonjs/features/chatbot/model/ChatTTSHighlightModel.d.ts +25 -0
  279. package/dist/typescript/commonjs/features/chatbot/model/ChatTTSHighlightModel.d.ts.map +1 -0
  280. package/dist/typescript/commonjs/features/chatbot/model/ChatTTSModel.d.ts +38 -0
  281. package/dist/typescript/commonjs/features/chatbot/model/ChatTTSModel.d.ts.map +1 -0
  282. package/dist/typescript/commonjs/features/chatbot/model/ChatsCacheModel.d.ts +1 -0
  283. package/dist/typescript/commonjs/features/chatbot/model/ChatsCacheModel.d.ts.map +1 -1
  284. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts +28 -16
  285. package/dist/typescript/commonjs/features/chatbot/types/api.types.d.ts.map +1 -1
  286. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts +15 -11
  287. package/dist/typescript/commonjs/features/chatbot/types/model.types.d.ts.map +1 -1
  288. package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts +25 -0
  289. package/dist/typescript/commonjs/features/chatbot/types/t2s.types.d.ts.map +1 -1
  290. package/dist/typescript/commonjs/features/chatbot/types/units.types.d.ts +1 -0
  291. package/dist/typescript/commonjs/features/chatbot/types/units.types.d.ts.map +1 -1
  292. package/dist/typescript/commonjs/features/feedback/model/model.d.ts +4 -1
  293. package/dist/typescript/commonjs/features/feedback/model/model.d.ts.map +1 -1
  294. package/dist/typescript/commonjs/features/feedback/model/sockets.d.ts.map +1 -1
  295. package/dist/typescript/commonjs/features/keyboard/components/AlgebraLayout/AlgebraLayout.d.ts.map +1 -1
  296. package/dist/typescript/commonjs/features/keyboard/components/BasicPlusLayout/keyboardGroups.d.ts.map +1 -1
  297. package/dist/typescript/commonjs/features/keyboard/components/BasicPlusPlusLayout/BasicPlusPlusLayout.d.ts.map +1 -1
  298. package/dist/typescript/commonjs/features/keyboard/components/BasicPlusPlusLayout/keyboardGroups.d.ts.map +1 -1
  299. package/dist/typescript/commonjs/features/keyboard/components/Keyboard.d.ts +2 -1
  300. package/dist/typescript/commonjs/features/keyboard/components/Keyboard.d.ts.map +1 -1
  301. package/dist/typescript/commonjs/features/keyboard/components/MainLayout/MainLayout.d.ts.map +1 -1
  302. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/helpers.d.ts +1 -0
  303. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/helpers.d.ts.map +1 -1
  304. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.d.ts +4 -7
  305. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.d.ts.map +1 -1
  306. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/keyboardGroups.d.ts +1 -0
  307. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/keyboardGroups.d.ts.map +1 -1
  308. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/types.d.ts +7 -1
  309. package/dist/typescript/commonjs/features/keyboard/components/UnitsLayout/types.d.ts.map +1 -1
  310. package/dist/typescript/commonjs/features/keyboard/constants/constants.d.ts +1 -1
  311. package/dist/typescript/commonjs/features/keyboard/constants/keyboardGroupsByLocale.d.ts.map +1 -1
  312. package/dist/typescript/commonjs/features/keyboard/constants/keyboardLayouts.d.ts +4 -0
  313. package/dist/typescript/commonjs/features/keyboard/constants/keyboardLayouts.d.ts.map +1 -1
  314. package/dist/typescript/commonjs/features/keyboard/helpers.d.ts +1 -0
  315. package/dist/typescript/commonjs/features/keyboard/helpers.d.ts.map +1 -1
  316. package/dist/typescript/commonjs/features/keyboard/types/MathKeysGroups/basicOperators.d.ts +10 -0
  317. package/dist/typescript/commonjs/features/keyboard/types/MathKeysGroups/basicOperators.d.ts.map +1 -1
  318. package/dist/typescript/commonjs/features/keyboard/types/MathKeysGroups/units.d.ts +36 -0
  319. package/dist/typescript/commonjs/features/keyboard/types/MathKeysGroups/units.d.ts.map +1 -1
  320. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.d.ts +7 -0
  321. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedAttemptsLimit.d.ts.map +1 -0
  322. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedScoreLabel.d.ts +12 -0
  323. package/dist/typescript/commonjs/features/openEnded/components/OpenEndedScoreLabel.d.ts.map +1 -0
  324. package/dist/typescript/commonjs/features/openEnded/index.d.ts +5 -0
  325. package/dist/typescript/commonjs/features/openEnded/index.d.ts.map +1 -0
  326. package/dist/typescript/commonjs/features/openEnded/oe.helpers.d.ts +13 -0
  327. package/dist/typescript/commonjs/features/openEnded/oe.helpers.d.ts.map +1 -0
  328. package/dist/typescript/commonjs/features/openEnded/oe.types.d.ts +7 -0
  329. package/dist/typescript/commonjs/features/openEnded/oe.types.d.ts.map +1 -0
  330. package/dist/typescript/commonjs/index.d.ts +1 -0
  331. package/dist/typescript/commonjs/index.d.ts.map +1 -1
  332. package/dist/typescript/commonjs/lib/components/ConditionalWrapper.d.ts +9 -0
  333. package/dist/typescript/commonjs/lib/components/ConditionalWrapper.d.ts.map +1 -0
  334. package/dist/typescript/commonjs/lib/effector/createControllerEffect.d.ts +1 -1
  335. package/dist/typescript/commonjs/lib/effector/createControllerEffect.d.ts.map +1 -1
  336. package/dist/typescript/commonjs/shared/common.constants.d.ts +2 -0
  337. package/dist/typescript/commonjs/shared/common.constants.d.ts.map +1 -0
  338. package/dist/typescript/commonjs/shared/icons/TimeIcon.d.ts +4 -0
  339. package/dist/typescript/commonjs/shared/icons/TimeIcon.d.ts.map +1 -0
  340. package/dist/typescript/commonjs/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.d.ts +4 -0
  341. package/dist/typescript/commonjs/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.d.ts.map +1 -0
  342. package/dist/typescript/commonjs/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.d.ts +4 -0
  343. package/dist/typescript/commonjs/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.d.ts.map +1 -0
  344. package/dist/typescript/commonjs/shared/translation/constants.d.ts +12 -0
  345. package/dist/typescript/commonjs/shared/translation/constants.d.ts.map +1 -1
  346. package/dist/typescript/commonjs/shared/translation/model.d.ts +4 -0
  347. package/dist/typescript/commonjs/shared/translation/model.d.ts.map +1 -1
  348. package/dist/typescript/commonjs/types/common.types.d.ts +2 -0
  349. package/dist/typescript/commonjs/types/common.types.d.ts.map +1 -1
  350. package/dist/typescript/module/features/celebrations/helpers.d.ts.map +1 -1
  351. package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts +7 -2
  352. package/dist/typescript/module/features/chatbot/components/Chat/Chat.d.ts.map +1 -1
  353. package/dist/typescript/module/features/chatbot/components/Chat/CloseButton.d.ts +7 -0
  354. package/dist/typescript/module/features/chatbot/components/Chat/CloseButton.d.ts.map +1 -0
  355. package/dist/typescript/module/features/chatbot/components/Chat/GradientFade.d.ts +10 -0
  356. package/dist/typescript/module/features/chatbot/components/Chat/GradientFade.d.ts.map +1 -0
  357. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts +3 -2
  358. package/dist/typescript/module/features/chatbot/components/ChatControls/ChatControls.d.ts.map +1 -1
  359. package/dist/typescript/module/features/chatbot/components/ChatInput/ChatInput.d.ts.map +1 -1
  360. package/dist/typescript/module/features/chatbot/components/ChatMessage/AnimatedMessage.d.ts +7 -0
  361. package/dist/typescript/module/features/chatbot/components/ChatMessage/AnimatedMessage.d.ts.map +1 -0
  362. package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts +4 -2
  363. package/dist/typescript/module/features/chatbot/components/ChatMessage/ChatMessage.d.ts.map +1 -1
  364. package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageContent.d.ts +4 -2
  365. package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageContent.d.ts.map +1 -1
  366. package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageLoader.d.ts +2 -3
  367. package/dist/typescript/module/features/chatbot/components/ChatMessage/MessageLoader.d.ts.map +1 -1
  368. package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts +1 -1
  369. package/dist/typescript/module/features/chatbot/components/ChatMessage/ReceivedMessage.d.ts.map +1 -1
  370. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts +5 -1
  371. package/dist/typescript/module/features/chatbot/components/Chatbot.d.ts.map +1 -1
  372. package/dist/typescript/module/features/chatbot/constants.d.ts +1 -0
  373. package/dist/typescript/module/features/chatbot/constants.d.ts.map +1 -1
  374. package/dist/typescript/module/features/chatbot/helpers/ttsHighlight.d.ts +8 -0
  375. package/dist/typescript/module/features/chatbot/helpers/ttsHighlight.d.ts.map +1 -0
  376. package/dist/typescript/module/features/chatbot/helpers.d.ts.map +1 -1
  377. package/dist/typescript/module/features/chatbot/index.d.ts +3 -2
  378. package/dist/typescript/module/features/chatbot/index.d.ts.map +1 -1
  379. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts +6 -3
  380. package/dist/typescript/module/features/chatbot/model/ChatBotModel.d.ts.map +1 -1
  381. package/dist/typescript/module/features/chatbot/model/ChatBotThreadManager.d.ts +4 -3
  382. package/dist/typescript/module/features/chatbot/model/ChatBotThreadManager.d.ts.map +1 -1
  383. package/dist/typescript/module/features/chatbot/model/ChatBoxTextManager.d.ts.map +1 -1
  384. package/dist/typescript/module/features/chatbot/model/ChatTTSHighlightModel.d.ts +25 -0
  385. package/dist/typescript/module/features/chatbot/model/ChatTTSHighlightModel.d.ts.map +1 -0
  386. package/dist/typescript/module/features/chatbot/model/ChatTTSModel.d.ts +38 -0
  387. package/dist/typescript/module/features/chatbot/model/ChatTTSModel.d.ts.map +1 -0
  388. package/dist/typescript/module/features/chatbot/model/ChatsCacheModel.d.ts +1 -0
  389. package/dist/typescript/module/features/chatbot/model/ChatsCacheModel.d.ts.map +1 -1
  390. package/dist/typescript/module/features/chatbot/types/api.types.d.ts +28 -16
  391. package/dist/typescript/module/features/chatbot/types/api.types.d.ts.map +1 -1
  392. package/dist/typescript/module/features/chatbot/types/model.types.d.ts +15 -11
  393. package/dist/typescript/module/features/chatbot/types/model.types.d.ts.map +1 -1
  394. package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts +25 -0
  395. package/dist/typescript/module/features/chatbot/types/t2s.types.d.ts.map +1 -1
  396. package/dist/typescript/module/features/chatbot/types/units.types.d.ts +1 -0
  397. package/dist/typescript/module/features/chatbot/types/units.types.d.ts.map +1 -1
  398. package/dist/typescript/module/features/feedback/model/model.d.ts +4 -1
  399. package/dist/typescript/module/features/feedback/model/model.d.ts.map +1 -1
  400. package/dist/typescript/module/features/feedback/model/sockets.d.ts.map +1 -1
  401. package/dist/typescript/module/features/keyboard/components/AlgebraLayout/AlgebraLayout.d.ts.map +1 -1
  402. package/dist/typescript/module/features/keyboard/components/BasicPlusLayout/keyboardGroups.d.ts.map +1 -1
  403. package/dist/typescript/module/features/keyboard/components/BasicPlusPlusLayout/BasicPlusPlusLayout.d.ts.map +1 -1
  404. package/dist/typescript/module/features/keyboard/components/BasicPlusPlusLayout/keyboardGroups.d.ts.map +1 -1
  405. package/dist/typescript/module/features/keyboard/components/Keyboard.d.ts +2 -1
  406. package/dist/typescript/module/features/keyboard/components/Keyboard.d.ts.map +1 -1
  407. package/dist/typescript/module/features/keyboard/components/MainLayout/MainLayout.d.ts.map +1 -1
  408. package/dist/typescript/module/features/keyboard/components/UnitsLayout/helpers.d.ts +1 -0
  409. package/dist/typescript/module/features/keyboard/components/UnitsLayout/helpers.d.ts.map +1 -1
  410. package/dist/typescript/module/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.d.ts +4 -7
  411. package/dist/typescript/module/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.d.ts.map +1 -1
  412. package/dist/typescript/module/features/keyboard/components/UnitsLayout/keyboardGroups.d.ts +1 -0
  413. package/dist/typescript/module/features/keyboard/components/UnitsLayout/keyboardGroups.d.ts.map +1 -1
  414. package/dist/typescript/module/features/keyboard/components/UnitsLayout/types.d.ts +7 -1
  415. package/dist/typescript/module/features/keyboard/components/UnitsLayout/types.d.ts.map +1 -1
  416. package/dist/typescript/module/features/keyboard/constants/constants.d.ts +1 -1
  417. package/dist/typescript/module/features/keyboard/constants/keyboardGroupsByLocale.d.ts.map +1 -1
  418. package/dist/typescript/module/features/keyboard/constants/keyboardLayouts.d.ts +4 -0
  419. package/dist/typescript/module/features/keyboard/constants/keyboardLayouts.d.ts.map +1 -1
  420. package/dist/typescript/module/features/keyboard/helpers.d.ts +1 -0
  421. package/dist/typescript/module/features/keyboard/helpers.d.ts.map +1 -1
  422. package/dist/typescript/module/features/keyboard/types/MathKeysGroups/basicOperators.d.ts +10 -0
  423. package/dist/typescript/module/features/keyboard/types/MathKeysGroups/basicOperators.d.ts.map +1 -1
  424. package/dist/typescript/module/features/keyboard/types/MathKeysGroups/units.d.ts +36 -0
  425. package/dist/typescript/module/features/keyboard/types/MathKeysGroups/units.d.ts.map +1 -1
  426. package/dist/typescript/module/features/openEnded/components/OpenEndedAttemptsLimit.d.ts +7 -0
  427. package/dist/typescript/module/features/openEnded/components/OpenEndedAttemptsLimit.d.ts.map +1 -0
  428. package/dist/typescript/module/features/openEnded/components/OpenEndedScoreLabel.d.ts +12 -0
  429. package/dist/typescript/module/features/openEnded/components/OpenEndedScoreLabel.d.ts.map +1 -0
  430. package/dist/typescript/module/features/openEnded/index.d.ts +5 -0
  431. package/dist/typescript/module/features/openEnded/index.d.ts.map +1 -0
  432. package/dist/typescript/module/features/openEnded/oe.helpers.d.ts +13 -0
  433. package/dist/typescript/module/features/openEnded/oe.helpers.d.ts.map +1 -0
  434. package/dist/typescript/module/features/openEnded/oe.types.d.ts +7 -0
  435. package/dist/typescript/module/features/openEnded/oe.types.d.ts.map +1 -0
  436. package/dist/typescript/module/index.d.ts +1 -0
  437. package/dist/typescript/module/index.d.ts.map +1 -1
  438. package/dist/typescript/module/lib/components/ConditionalWrapper.d.ts +9 -0
  439. package/dist/typescript/module/lib/components/ConditionalWrapper.d.ts.map +1 -0
  440. package/dist/typescript/module/lib/effector/createControllerEffect.d.ts +1 -1
  441. package/dist/typescript/module/lib/effector/createControllerEffect.d.ts.map +1 -1
  442. package/dist/typescript/module/shared/common.constants.d.ts +2 -0
  443. package/dist/typescript/module/shared/common.constants.d.ts.map +1 -0
  444. package/dist/typescript/module/shared/icons/TimeIcon.d.ts +4 -0
  445. package/dist/typescript/module/shared/icons/TimeIcon.d.ts.map +1 -0
  446. package/dist/typescript/module/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.d.ts +4 -0
  447. package/dist/typescript/module/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.d.ts.map +1 -0
  448. package/dist/typescript/module/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.d.ts +4 -0
  449. package/dist/typescript/module/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.d.ts.map +1 -0
  450. package/dist/typescript/module/shared/translation/constants.d.ts +12 -0
  451. package/dist/typescript/module/shared/translation/constants.d.ts.map +1 -1
  452. package/dist/typescript/module/shared/translation/model.d.ts +4 -0
  453. package/dist/typescript/module/shared/translation/model.d.ts.map +1 -1
  454. package/dist/typescript/module/types/common.types.d.ts +2 -0
  455. package/dist/typescript/module/types/common.types.d.ts.map +1 -1
  456. package/package.json +3 -1
  457. package/src/features/celebrations/helpers.ts +35 -33
  458. package/src/features/chatbot/TTS_HIGHLIGHTING.md +120 -0
  459. package/src/features/chatbot/components/Chat/Chat.tsx +301 -57
  460. package/src/features/chatbot/components/Chat/CloseButton.tsx +31 -0
  461. package/src/features/chatbot/components/Chat/GradientFade.tsx +43 -0
  462. package/src/features/chatbot/components/ChatControls/ChatControls.tsx +47 -60
  463. package/src/features/chatbot/components/ChatInput/ChatInput.tsx +2 -1
  464. package/src/features/chatbot/components/ChatInput/FreeText/ChatTextInput.tsx +2 -2
  465. package/src/features/chatbot/components/ChatInput/FreeText/SendMessageButton.tsx +1 -1
  466. package/src/features/chatbot/components/ChatMessage/AnimatedMessage.tsx +30 -0
  467. package/src/features/chatbot/components/ChatMessage/ChatMessage.tsx +4 -2
  468. package/src/features/chatbot/components/ChatMessage/MessageContent.tsx +25 -3
  469. package/src/features/chatbot/components/ChatMessage/MessageLoader.tsx +17 -33
  470. package/src/features/chatbot/components/ChatMessage/ReceivedMessage.tsx +17 -12
  471. package/src/features/chatbot/components/ChatMessage/SentMessage.tsx +1 -1
  472. package/src/features/chatbot/components/Chatbot.tsx +30 -3
  473. package/src/features/chatbot/constants.ts +2 -0
  474. package/src/features/chatbot/helpers/ttsHighlight.ts +25 -0
  475. package/src/features/chatbot/helpers.ts +14 -1
  476. package/src/features/chatbot/index.ts +17 -2
  477. package/src/features/chatbot/model/ChatBotModel.ts +74 -16
  478. package/src/features/chatbot/model/ChatBotThreadManager.ts +12 -4
  479. package/src/features/chatbot/model/ChatBoxTextManager.ts +1 -0
  480. package/src/features/chatbot/model/ChatTTSHighlightModel.ts +64 -0
  481. package/src/features/chatbot/model/ChatTTSModel.ts +168 -0
  482. package/src/features/chatbot/model/ChatbotApi.ts +1 -1
  483. package/src/features/chatbot/model/ChatbotTranslation.ts +1 -1
  484. package/src/features/chatbot/model/ChatsCacheModel.ts +11 -0
  485. package/src/features/chatbot/types/api.types.ts +25 -19
  486. package/src/features/chatbot/types/model.types.ts +24 -12
  487. package/src/features/chatbot/types/t2s.types.ts +33 -0
  488. package/src/features/chatbot/types/units.types.ts +1 -0
  489. package/src/features/feedback/model/model.ts +4 -1
  490. package/src/features/feedback/model/sockets.ts +8 -6
  491. package/src/features/keyboard/components/AlgebraLayout/AlgebraLayout.tsx +4 -3
  492. package/src/features/keyboard/components/BasicLayout/BasicLayout.tsx +2 -2
  493. package/src/features/keyboard/components/BasicPlusLayout/keyboardGroups.ts +27 -17
  494. package/src/features/keyboard/components/BasicPlusPlusLayout/BasicPlusPlusLayout.tsx +3 -2
  495. package/src/features/keyboard/components/BasicPlusPlusLayout/keyboardGroups.ts +30 -24
  496. package/src/features/keyboard/components/Keyboard.tsx +14 -4
  497. package/src/features/keyboard/components/KeysList/KeysList.tsx +1 -1
  498. package/src/features/keyboard/components/MainLayout/MainLayout.tsx +2 -6
  499. package/src/features/keyboard/components/UnitsLayout/UnitTabs.tsx +1 -1
  500. package/src/features/keyboard/components/UnitsLayout/helpers.tsx +3 -0
  501. package/src/features/keyboard/components/UnitsLayout/hooks/useUnitTabs.ts +36 -22
  502. package/src/features/keyboard/components/UnitsLayout/keyboardGroups.ts +11 -0
  503. package/src/features/keyboard/components/UnitsLayout/types.ts +7 -0
  504. package/src/features/keyboard/constants/constants.ts +1 -1
  505. package/src/features/keyboard/constants/keyboardGroupsByLocale.ts +2 -0
  506. package/src/features/keyboard/constants/keyboardLayouts.ts +18 -1
  507. package/src/features/keyboard/helpers.ts +6 -0
  508. package/src/features/keyboard/types/MathKeysGroups/basicOperators.tsx +15 -3
  509. package/src/features/keyboard/types/MathKeysGroups/units.tsx +3 -0
  510. package/src/features/openEnded/components/OpenEndedAttemptsLimit.tsx +26 -0
  511. package/src/features/openEnded/components/OpenEndedScoreLabel.tsx +81 -0
  512. package/src/features/openEnded/index.ts +4 -0
  513. package/src/features/openEnded/oe.helpers.ts +31 -0
  514. package/src/features/openEnded/oe.types.ts +6 -0
  515. package/src/index.ts +1 -0
  516. package/src/lib/components/ConditionalWrapper.tsx +15 -0
  517. package/src/lib/effector/createControllerEffect.ts +1 -1
  518. package/src/shared/common.constants.ts +3 -0
  519. package/src/shared/icons/TimeIcon.tsx +23 -0
  520. package/src/shared/icons/keyboard/CDotIcon/CDotIcon.tsx +2 -2
  521. package/src/shared/icons/keyboard/RoundBracketLeftIcon/RoundBracketLeftIcon.tsx +18 -0
  522. package/src/shared/icons/keyboard/RoundBracketRightIcon/RoundBracketRightIcon.tsx +18 -0
  523. package/src/shared/translation/localization/ca.json +4 -2
  524. package/src/shared/translation/localization/de.json +4 -2
  525. package/src/shared/translation/localization/en.json +4 -2
  526. package/src/shared/translation/localization/gb.json +4 -2
  527. package/src/shared/translation/localization/sct.json +4 -2
  528. package/src/shared/translation/localization/sw.json +4 -2
  529. package/src/types/common.types.ts +4 -0
  530. package/dist/commonjs/features/chatbot/model/t2s.js +0 -107
  531. package/dist/commonjs/features/chatbot/model/t2s.js.map +0 -1
  532. package/dist/module/features/chatbot/model/t2s.js +0 -102
  533. package/dist/module/features/chatbot/model/t2s.js.map +0 -1
  534. package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts +0 -34
  535. package/dist/typescript/commonjs/features/chatbot/model/t2s.d.ts.map +0 -1
  536. package/dist/typescript/module/features/chatbot/model/t2s.d.ts +0 -34
  537. package/dist/typescript/module/features/chatbot/model/t2s.d.ts.map +0 -1
  538. package/src/features/chatbot/model/t2s.ts +0 -123
@@ -1,39 +1,41 @@
1
- import { ParticlesBatch } from './components/ParticleBatch';
2
- import { Spark } from './components/Spark';
3
- import { CELEBRATION_ICON_CONFIG, CELEBRATION_VARIANTS } from './config';
4
- import { CelebrationVariant } from './types';
1
+ import { ParticlesBatch } from './components/ParticleBatch'
2
+ import { Spark } from './components/Spark'
3
+ import { CELEBRATION_ICON_CONFIG, CELEBRATION_VARIANTS } from './config'
4
+ import { CelebrationVariant } from './types'
5
5
 
6
- export const randomRange = (min: number, max: number) => Math.random() * (max - min) + min;
6
+ export const randomRange = (min: number, max: number) => Math.random() * (max - min) + min
7
7
 
8
8
  const isDateInRange = (currentDate: Date, startDateStr: string, endDateStr: string) => {
9
- const [startDay, startMonth] = startDateStr.split('-').map(Number);
10
- const [endDay, endMonth] = endDateStr.split('-').map(Number);
9
+ const [startDay, startMonth] = startDateStr.split('-').map(Number)
10
+ const [endDay, endMonth] = endDateStr.split('-').map(Number)
11
11
 
12
- const currentYear = currentDate.getFullYear();
13
- const startDate = new Date(currentYear, startMonth - 1, startDay);
14
- const endDate = new Date(currentYear, endMonth - 1, endDay + 1);
12
+ const currentYear = currentDate.getFullYear()
13
+ const startDate = new Date(currentYear, startMonth - 1, startDay)
15
14
 
16
- return currentDate >= startDate && currentDate <= endDate;
17
- };
15
+ // If end month is earlier than start month, it spans to next year
16
+ const endYear = endMonth < startMonth ? currentYear + 1 : currentYear
17
+ const endDate = new Date(endYear, endMonth - 1, endDay + 1)
18
+
19
+ return currentDate >= startDate && currentDate <= endDate
20
+ }
18
21
 
19
22
  export const getIconForCurrentDate = () => {
20
- const currentDate = new Date();
23
+ const currentDate = new Date()
21
24
 
22
25
  for (const celebration of CELEBRATION_ICON_CONFIG) {
23
26
  if (celebration.activePeriod) {
24
- const { start, end } = celebration.activePeriod;
27
+ const { start, end } = celebration.activePeriod
25
28
  if (isDateInRange(currentDate, start, end)) {
26
- return celebration.Icon;
29
+ return celebration.Icon
27
30
  }
28
31
  }
29
32
  }
30
33
 
31
- return CELEBRATION_ICON_CONFIG[0].Icon;
32
- };
34
+ return CELEBRATION_ICON_CONFIG[0].Icon
35
+ }
33
36
 
34
- const MainIcon = getIconForCurrentDate();
35
- export const generateParticle = (variant: CelebrationVariant
36
- ) => {
37
+ const MainIcon = getIconForCurrentDate()
38
+ export const generateParticle = (variant: CelebrationVariant) => {
37
39
  const {
38
40
  elementsCount,
39
41
  angle,
@@ -44,20 +46,20 @@ export const generateParticle = (variant: CelebrationVariant
44
46
  friction,
45
47
  life,
46
48
  angularAcceleration,
47
- speedRange
48
- } = CELEBRATION_VARIANTS[variant];
49
+ speedRange,
50
+ } = CELEBRATION_VARIANTS[variant]
49
51
 
50
52
  const sparkSpeedMin = speedRange?.spark?.[0]
51
53
  const sparkSpeedMax = speedRange?.spark?.[1]
52
54
  const mainSpeedMin = speedRange?.main?.[0]
53
55
  const mainSpeedMax = speedRange?.main?.[1]
54
56
 
55
- const particles: ParticlesBatch[] = [];
57
+ const particles: ParticlesBatch[] = []
56
58
 
57
59
  for (let i = 0; i < elementsCount.spark; i++) {
58
- const randomAngle = randomRange((angle.from * Math.PI) / 180, (angle.to * Math.PI) / 180);
59
- const randomSpeed = randomRange(sparkSpeedMin, sparkSpeedMax);
60
- const randomAngularAcceleration = randomRange(angularAcceleration.from, angularAcceleration.to);
60
+ const randomAngle = randomRange((angle.from * Math.PI) / 180, (angle.to * Math.PI) / 180)
61
+ const randomSpeed = randomRange(sparkSpeedMin, sparkSpeedMax)
62
+ const randomAngularAcceleration = randomRange(angularAcceleration.from, angularAcceleration.to)
61
63
 
62
64
  particles.push({
63
65
  id: Math.random(),
@@ -74,12 +76,12 @@ export const generateParticle = (variant: CelebrationVariant
74
76
  friction,
75
77
  Component: Spark,
76
78
  life,
77
- });
79
+ })
78
80
  }
79
81
  for (let i = 0; i < elementsCount.star; i++) {
80
- const randomAngle = randomRange((angle.from * Math.PI) / 180, (angle.to * Math.PI) / 180);
81
- const randomSpeed = randomRange(mainSpeedMin, mainSpeedMax);
82
- const randomAngularAcceleration = randomRange(angularAcceleration.from, angularAcceleration.to);
82
+ const randomAngle = randomRange((angle.from * Math.PI) / 180, (angle.to * Math.PI) / 180)
83
+ const randomSpeed = randomRange(mainSpeedMin, mainSpeedMax)
84
+ const randomAngularAcceleration = randomRange(angularAcceleration.from, angularAcceleration.to)
83
85
 
84
86
  particles.push({
85
87
  id: Math.random(),
@@ -96,8 +98,8 @@ export const generateParticle = (variant: CelebrationVariant
96
98
  friction,
97
99
  Component: MainIcon,
98
100
  life,
99
- });
101
+ })
100
102
  }
101
103
 
102
- return particles;
103
- };
104
+ return particles
105
+ }
@@ -0,0 +1,120 @@
1
+ # TTS Word-by-Word Highlighting
2
+
3
+ ## Overview
4
+
5
+ Word-by-word text highlighting synchronized with text-to-speech playback in the chatbot. The feature is optional and enabled via `isWordHighlightEnabled` config flag.
6
+
7
+ ## How It Works
8
+
9
+ ```
10
+ ┌─────────────────────────────────────────────────────────────────┐
11
+ │ 1. User clicks TTS button on a message │
12
+ │ ↓ │
13
+ │ 2. Text is converted to SSML with word marks │
14
+ │ "Hello world" → <speak><mark name="w_0"/>Hello │
15
+ │ <mark name="w_1"/>world</speak> │
16
+ │ ↓ │
17
+ │ 3. Google TTS API returns audio + timepoints │
18
+ │ [{ markName: "w_0", timeSeconds: 0.0 }, │
19
+ │ { markName: "w_1", timeSeconds: 0.5 }] │
20
+ │ ↓ │
21
+ │ 4. Audio plays, onTimeUpdate fires via RAF loop │
22
+ │ ↓ │
23
+ │ 5. Current time → find matching timepoint → word index │
24
+ │ ↓ │
25
+ │ 6. $highlightedWordIndex updates → UI re-renders highlighted │
26
+ └─────────────────────────────────────────────────────────────────┘
27
+ ```
28
+
29
+ ## Usage
30
+
31
+ ```tsx
32
+ // In students-web model setup
33
+ chatModel.bot.setUpT2S({
34
+ audioProvider: createT2SAudioProvider(),
35
+ textSanitizer: removeKatexPartFromTextToSpeech,
36
+ isWordHighlightEnabled: true,
37
+ })
38
+ ```
39
+
40
+ ## Architecture
41
+
42
+ ### ChatTTSModel (ChatTTSModel.ts)
43
+
44
+ Handles TTS playback and word highlighting. Key design decisions:
45
+
46
+ - **Map-based cache** — `audioCache: Map<string, AudioCache>` stores both `audioPath` and `timepoints` per message. When highlighting is off, `timepoints` is `[]`. Cache lives for the model's lifetime (cleared when user leaves the problem).
47
+ - **`fetchAudio()` method** — encapsulates API call + audioContent decoding. Highlight vs non-highlight differences are ternaries (SSML vs plain text, `enableTimePointing`).
48
+ - **`play()` is linear** — cache lookup → fetch if miss → store → activate highlight if enabled → play audio. No branching between highlight/non-highlight paths.
49
+ - **Pause/resume guards** — `wordHighlightEnabled` check before toggling `setIsActive(false)`/`setIsActive(true)` on pause/resume.
50
+ - **`wordHighlightEnabled` (private)** — stored result of `!!isWordHighlightEnabled && !!audioProvider.onTimeUpdate`. Set once at `setConfig`.
51
+ - **`isWordHighlightEnabled` (public getter)** — read-only access for external consumers (e.g. `Chat.tsx`).
52
+
53
+ ### AudioProvider type
54
+
55
+ ```typescript
56
+ type AudioProvider = {
57
+ play: (audioPath: string, onPlaybackComplete: () => void) => Promise<void>
58
+ pause: () => void
59
+ resume: () => void
60
+ stop: () => void
61
+ onTimeUpdate?: OnTimeUpdate // optional — presence enables highlight capability
62
+ }
63
+ ```
64
+
65
+ `onTimeUpdate` is optional. It's the mechanism that syncs audio playback time with word highlights via a RAF loop. If the provider doesn't have it, highlighting won't activate even if `isWordHighlightEnabled: true`.
66
+
67
+ ### ChatTTSHighlightModel (ChatTTSHighlightModel.ts)
68
+
69
+ Manages highlight state using Effector stores with declarative reset. Receives `OnTimeUpdate` callback directly (not the whole `AudioProvider`).
70
+
71
+ - **`$isActive`** — gates `$highlightedWordIndex` computation. Toggled on pause/resume without resetting timepoints.
72
+ - **`$highlightedWordIndex`** — derived store, returns `-1` when inactive or no match. Parses mark name via `WORD_MARK_REGEX`.
73
+ - **`activate(timepoints, onTimeUpdate)`** — sets timepoints, enables highlighting, registers time update callback. Only triggers store updates when the highlighted word actually changes (`lastMark` comparison).
74
+ - **`deactivate(onTimeUpdate)`** — stops listening, resets all state via declarative `.reset()` chain.
75
+ - **All stores use `.reset(this.reset)`** — single `reset` event clears `$time`, `$timepoints`, and `$isActive`.
76
+
77
+ ### Helpers (helpers/ttsHighlight.ts)
78
+
79
+ - **`textToSSML(text)`** — converts plain text to SSML with `<mark>` tags for word timing.
80
+ - **`findCurrentMark(timepoints, time)`** — iterates backwards through timepoints to find the current mark. Efficient for linear playback.
81
+
82
+ ### Constants (constants.ts)
83
+
84
+ - **`WORD_MARK_REGEX`** — `/^w_(\d+)$/` — extracts word index from mark names like `w_0`, `w_1`.
85
+
86
+ ### Naming conventions
87
+
88
+ | Name | Scope | Purpose |
89
+ |------|-------|---------|
90
+ | `wordHighlight` | public instance | `ChatTTSHighlightModel` instance on `ChatTTSModel` |
91
+ | `wordHighlightEnabled` | private field | Whether highlighting is active (set once at config) |
92
+ | `isWordHighlightEnabled` | public getter | Read-only access to `wordHighlightEnabled` for external consumers |
93
+ | `isWordHighlightEnabled` | T2SConfig field | Config flag passed to `setUpT2S()` |
94
+
95
+ ## Data Flow
96
+
97
+ ```
98
+ AudioProvider.onTimeUpdate(callback)
99
+
100
+ ChatTTSHighlightModel.activate(timepoints, onTimeUpdate)
101
+
102
+ RAF loop → audio.currentTime → findCurrentMark() → only updates when mark changes
103
+
104
+ $highlightedWordIndex = parse mark name "w_N" → N (or -1 if inactive/no match)
105
+
106
+ Chat.tsx: model.t2s.isWordHighlightEnabled && isPlayingMessage ? highlightedWordIndex : -1
107
+
108
+ ChatMessage → MessageContent → TTSHighlightRenderer({ text, highlightedIndex })
109
+ ```
110
+
111
+ ## Key Files
112
+
113
+ | File | Purpose |
114
+ |------|---------|
115
+ | `model/ChatTTSModel.ts` | `ChatTTSModel` — TTS playback, caching, highlight orchestration |
116
+ | `model/ChatTTSHighlightModel.ts` | Highlight state — timepoints, current time, `$isActive`, derived word index |
117
+ | `helpers/ttsHighlight.ts` | `textToSSML` + `findCurrentMark` — SSML conversion and playback position lookup |
118
+ | `constants.ts` | `WORD_MARK_REGEX` and audio config defaults |
119
+ | `types/t2s.types.ts` | `AudioProvider`, `OnTimeUpdate`, `AudioStatus`, `AudioCache`, `TTSHighlightRendererProps` types |
120
+ | `components/Chat/Chat.tsx` | Reads `isWordHighlightEnabled` and `$highlightedWordIndex`, passes to messages |
@@ -1,115 +1,359 @@
1
- import React, { useRef } from 'react'
2
- import { Platform, ScrollView, StyleSheet, useWindowDimensions, View } from 'react-native'
1
+ import React, {
2
+ ComponentType,
3
+ PropsWithChildren,
4
+ useCallback,
5
+ useEffect,
6
+ useMemo,
7
+ useRef,
8
+ useState,
9
+ } from 'react'
10
+ import {
11
+ FlatList,
12
+ ListRenderItemInfo,
13
+ NativeScrollEvent,
14
+ NativeSyntheticEvent,
15
+ Platform,
16
+ StyleSheet,
17
+ useWindowDimensions,
18
+ View,
19
+ } from 'react-native'
3
20
  import { useStoreMap, useUnit } from 'effector-react'
21
+ import { SPACING } from '@magmamath/react-native-ui'
4
22
 
23
+ import { ConversationMessage } from '../../types/units.types'
5
24
  import { ChatbotModel } from '../../model/ChatBotModel'
25
+ import { ChatbotIcon } from '../../../../shared/icons/ChatbotIcon'
26
+ import { LavaIconInGlasses } from '../../../../shared/icons/LavaIconInGlasses'
27
+ import { AnimatedMessage } from '../ChatMessage/AnimatedMessage'
6
28
  import { ChatMessage } from '../ChatMessage/ChatMessage'
7
29
  import { MessageLoader } from '../ChatMessage/MessageLoader'
8
30
  import { ChatInput } from '../ChatInput/ChatInput'
31
+ import { CloseButton } from './CloseButton'
9
32
  import { MessageVariant } from '../../types/model.types'
10
33
  import { ColorScheme } from '../../types/style.types'
34
+ import { ConditionalWrapper } from '../../../../lib/components/ConditionalWrapper'
35
+ import { TTSHighlightRenderer } from '../../types/t2s.types'
11
36
 
37
+ const SCROLL_BOTTOM_THRESHOLD = 1
12
38
  const TOOLBAR_HEIGHT = 140
13
- const BOTTOM_OFFSET = Platform.select({
14
- web: 265,
15
- default: 294,
39
+ const BOTTOM_OFFSET = Platform.select({ web: 265, default: 294 })
40
+
41
+ const TOP_FADE_MASK = Platform.select({
42
+ web: { maskImage: 'linear-gradient(to top, transparent, black 10%, black)' } as any,
43
+ default: undefined,
16
44
  })
17
45
 
46
+ const Separator = () => <View style={styles.separator} />
47
+
48
+ const BottomFade = ({ visible }: { visible: boolean }) => (
49
+ <View
50
+ style={[styles.bottomFade, { opacity: visible ? 1 : 0 }]}
51
+ pointerEvents="none"
52
+ />
53
+ )
54
+
55
+ type ChatIconProps = {
56
+ isLoading: boolean
57
+ }
58
+
59
+ const ChatIcon = ({ isLoading }: ChatIconProps) => (
60
+ <View style={styles.iconAbsolute}>
61
+ {isLoading ? (
62
+ <LavaIconInGlasses width={53} height={73} />
63
+ ) : (
64
+ <ChatbotIcon width={53} height={73} color={'blue'} />
65
+ )}
66
+ </View>
67
+ )
68
+
69
+ type ChatFooterProps = {
70
+ isHintFeedback: boolean
71
+ isInputDisabled?: boolean
72
+ colorScheme: ColorScheme
73
+ hasMessages: boolean
74
+ onPressClose?: () => void
75
+ }
76
+
77
+ const ChatFooter = ({
78
+ isHintFeedback,
79
+ isInputDisabled,
80
+ colorScheme,
81
+ hasMessages,
82
+ onPressClose,
83
+ }: ChatFooterProps) => (
84
+ <View style={styles.inputRow}>
85
+ <CloseButton onPress={onPressClose} />
86
+ {!isInputDisabled && (
87
+ <ChatInput
88
+ isHintFeedback={isHintFeedback}
89
+ colorScheme={colorScheme}
90
+ hasMessages={hasMessages}
91
+ />
92
+ )}
93
+ </View>
94
+ )
95
+
18
96
  type ChatProps = {
19
97
  model: ChatbotModel
20
98
  isHintFeedback: boolean
21
99
  isTextToSpeechEnabled: boolean
100
+ isInputDisabled?: boolean
22
101
  colorScheme?: ColorScheme
102
+ MessageWrapper?: ComponentType<PropsWithChildren>
103
+ TTSHighlightRenderer?: TTSHighlightRenderer
104
+ onPressClose?: () => void
23
105
  }
24
106
 
25
107
  export const Chat = ({
26
108
  model,
27
109
  isHintFeedback,
28
110
  isTextToSpeechEnabled,
111
+ isInputDisabled,
29
112
  colorScheme = ColorScheme.Blue,
113
+ MessageWrapper,
114
+ TTSHighlightRenderer,
115
+ onPressClose,
30
116
  }: ChatProps) => {
117
+ const ref = useRef<FlatList>(null)
118
+ const maxHeightRef = useRef(0)
31
119
  const dimensions = useWindowDimensions()
32
- const ref = useRef<ScrollView>(null)
33
120
  const isOpen = useUnit(model.$isOpen)
34
121
 
35
122
  const isHelpRequestPending = useUnit(model.sendHelpRequestFx.pending)
36
123
  const isTextToSpeechPending = useUnit(model.api.textToSpeechTextFx.pending)
37
124
 
125
+ const audioStatus = useUnit(model.t2s.$status)
38
126
  const currentPlayingId = useUnit(model.t2s.$currentPlayingId)
127
+ const highlightedWordIndex = useUnit(model.t2s.wordHighlight.$highlightedWordIndex)
128
+
39
129
  const isTranslated = useUnit(model.translation.$isTranslated)
40
- const audioStatus = useUnit(model.t2s.$status)
41
130
  const errorSpottingEnabled = useUnit(model.errorSpotting.$isEnabled)
42
131
 
43
132
  const messages = useStoreMap(model.$currentChatData, ({ messages }) => messages)
44
- const lastMessageId = messages.at(-1)?.id
45
-
133
+ const lastBotMessageId = messages.findLast((m) => !m.isOwnMessage)?.id
46
134
  const MAX_HEIGHT = dimensions.height - TOOLBAR_HEIGHT - BOTTOM_OFFSET
135
+ maxHeightRef.current = MAX_HEIGHT
136
+
137
+ const [isScrollable, setIsScrollable] = useState(false)
138
+ const [showBottomFade, setShowBottomFade] = useState(false)
139
+
140
+ useEffect(() => {
141
+ if (!isOpen) {
142
+ setIsScrollable(false)
143
+ setShowBottomFade(false)
144
+ }
145
+ }, [isOpen])
146
+
147
+ const handleScroll = useCallback((e: NativeSyntheticEvent<NativeScrollEvent>) => {
148
+ const { contentOffset } = e.nativeEvent
149
+ setShowBottomFade(contentOffset.y > SCROLL_BOTTOM_THRESHOLD)
150
+ }, [])
151
+
152
+ const handleContentSizeChange = useCallback((_: number, contentHeight: number) => {
153
+ setIsScrollable(contentHeight >= maxHeightRef.current)
154
+ }, [])
155
+
156
+ const shouldWrapMessage = MessageWrapper && isInputDisabled && messages.length === 1
157
+ const reversedMessages = useMemo(() => [...messages].reverse(), [messages])
158
+ const showAbsoluteIcon = !showBottomFade && !isInputDisabled
159
+
160
+ const renderMessage = useCallback(
161
+ ({ item: message }: ListRenderItemInfo<ConversationMessage>) => {
162
+ const isPlayingMessage = message.id === currentPlayingId
163
+ const messageHighlightIndex =
164
+ model.t2s.isWordHighlightEnabled && isPlayingMessage ? highlightedWordIndex : -1
165
+ const showInlineIcon =
166
+ showBottomFade && !message.isOwnMessage && message.id === lastBotMessageId
167
+
168
+ return (
169
+ <MessageItem
170
+ message={message}
171
+ showInlineIcon={showInlineIcon}
172
+ animate={!isInputDisabled}
173
+ shouldWrapMessage={!!shouldWrapMessage}
174
+ MessageWrapper={MessageWrapper}
175
+ isTranslated={isTranslated}
176
+ colorScheme={colorScheme}
177
+ withIcon={isInputDisabled}
178
+ withErrorSpotting={errorSpottingEnabled && !message.isOwnMessage}
179
+ highlightedWordIndex={messageHighlightIndex}
180
+ TTSHighlightRenderer={TTSHighlightRenderer}
181
+ isTextToSpeechEnabled={isTextToSpeechEnabled && !message.isOwnMessage}
182
+ isPlayingMessage={isPlayingMessage}
183
+ isTextToSpeechPending={isTextToSpeechPending}
184
+ audioStatus={audioStatus}
185
+ />
186
+ )
187
+ },
188
+ [
189
+ currentPlayingId,
190
+ highlightedWordIndex,
191
+ showBottomFade,
192
+ lastBotMessageId,
193
+ shouldWrapMessage,
194
+ isTranslated,
195
+ colorScheme,
196
+ errorSpottingEnabled,
197
+ isTextToSpeechEnabled,
198
+ isTextToSpeechPending,
199
+ audioStatus,
200
+ ],
201
+ )
202
+
203
+ if (!isOpen) return null
47
204
 
48
205
  return (
49
206
  <View style={[styles.container, { maxHeight: MAX_HEIGHT }]}>
50
- <ScrollView
207
+ <FlatList
51
208
  ref={ref}
209
+ inverted
52
210
  bounces={false}
211
+ style={[styles.flatList, isScrollable && TOP_FADE_MASK]}
212
+ data={reversedMessages}
213
+ keyExtractor={keyExtractor}
214
+ renderItem={renderMessage}
53
215
  contentContainerStyle={styles.list}
54
- onContentSizeChange={(_, height) => {
55
- ref.current?.scrollToEnd()
56
-
57
- if (height >= MAX_HEIGHT) {
58
- model.setScrollActive(true)
59
- }
60
- }}
61
- >
62
- {isOpen && (
63
- <View style={styles.gap}>
64
- {messages.map((message) => (
65
- <ChatMessage
66
- key={message.id}
67
- isTranslated={isTranslated}
68
- withIcon={!message.isOwnMessage && message.id === lastMessageId}
69
- message={message}
70
- variant={message.isOwnMessage ? MessageVariant.SENT : MessageVariant.RECEIVED}
71
- colorScheme={colorScheme}
72
- withErrorSpotting={errorSpottingEnabled && !message.isOwnMessage}
73
- t2sState={{
74
- isEnabled: isTextToSpeechEnabled && !message.isOwnMessage,
75
- isActive: message.id === currentPlayingId,
76
- isLoading: isTextToSpeechPending,
77
- status: audioStatus,
78
- disabled: isTextToSpeechPending,
79
- }}
80
- />
81
- ))}
82
-
83
- {isHelpRequestPending && <MessageLoader colorScheme={colorScheme} />}
84
- </View>
85
- )}
86
-
87
- {isOpen && (
88
- <ChatInput
89
- isHintFeedback={isHintFeedback}
90
- colorScheme={colorScheme}
91
- hasMessages={messages.length > 1}
92
- />
93
- )}
94
- </ScrollView>
216
+ onScroll={handleScroll}
217
+ scrollEventThrottle={16}
218
+ onContentSizeChange={handleContentSizeChange}
219
+ ListHeaderComponent={<MessageLoader isLoading={isHelpRequestPending} />}
220
+ ItemSeparatorComponent={Separator}
221
+ />
222
+
223
+ <BottomFade visible={showBottomFade} />
224
+
225
+ {showAbsoluteIcon && <ChatIcon isLoading={isHelpRequestPending} />}
226
+
227
+ <ChatFooter
228
+ isHintFeedback={isHintFeedback}
229
+ isInputDisabled={isInputDisabled}
230
+ colorScheme={colorScheme}
231
+ hasMessages={messages.length > 1}
232
+ onPressClose={onPressClose}
233
+ />
95
234
  </View>
96
235
  )
97
236
  }
98
237
 
238
+ const keyExtractor = (item: ConversationMessage, index: number) => `${item.id}-${index}`
239
+
240
+ type MessageItemProps = {
241
+ message: ConversationMessage
242
+ showInlineIcon: boolean
243
+ animate?: boolean
244
+ shouldWrapMessage?: boolean
245
+ MessageWrapper?: ComponentType<PropsWithChildren>
246
+ isTranslated?: boolean
247
+ colorScheme: ColorScheme
248
+ withIcon?: boolean
249
+ withErrorSpotting?: boolean
250
+ highlightedWordIndex: number
251
+ TTSHighlightRenderer?: TTSHighlightRenderer
252
+ isTextToSpeechEnabled: boolean
253
+ isPlayingMessage: boolean
254
+ isTextToSpeechPending: boolean
255
+ audioStatus: any
256
+ }
257
+
258
+ const MessageItem = ({
259
+ message,
260
+ showInlineIcon,
261
+ animate,
262
+ shouldWrapMessage,
263
+ MessageWrapper,
264
+ isTranslated,
265
+ colorScheme,
266
+ withIcon,
267
+ withErrorSpotting,
268
+ highlightedWordIndex,
269
+ TTSHighlightRenderer,
270
+ isTextToSpeechEnabled,
271
+ isPlayingMessage,
272
+ isTextToSpeechPending,
273
+ audioStatus,
274
+ }: MessageItemProps) => (
275
+ <View style={[styles.messageItem, showInlineIcon && styles.messageWithIcon]}>
276
+ {showInlineIcon && (
277
+ <View style={styles.inlineIcon}>
278
+ <ChatbotIcon width={53} height={73} />
279
+ </View>
280
+ )}
281
+ <AnimatedMessage animate={animate}>
282
+ <ConditionalWrapper withWrapper={shouldWrapMessage} Wrapper={MessageWrapper}>
283
+ <ChatMessage
284
+ withIcon={withIcon}
285
+ isTranslated={isTranslated}
286
+ message={message}
287
+ variant={message.isOwnMessage ? MessageVariant.SENT : MessageVariant.RECEIVED}
288
+ colorScheme={colorScheme}
289
+ withErrorSpotting={withErrorSpotting}
290
+ highlightedWordIndex={highlightedWordIndex}
291
+ TTSHighlightRenderer={TTSHighlightRenderer}
292
+ t2sState={{
293
+ isEnabled: isTextToSpeechEnabled,
294
+ isActive: isPlayingMessage,
295
+ isLoading: isTextToSpeechPending,
296
+ status: audioStatus,
297
+ disabled: isTextToSpeechPending,
298
+ }}
299
+ />
300
+ </ConditionalWrapper>
301
+ </AnimatedMessage>
302
+ </View>
303
+ )
304
+
99
305
  const styles = StyleSheet.create({
100
306
  container: {
101
307
  flex: 1,
102
308
  alignItems: 'flex-end',
103
- width: 378,
309
+ width: 374,
104
310
  height: '100%',
311
+ paddingRight: SPACING['100'],
312
+ },
313
+ flatList: {
314
+ alignSelf: 'stretch',
315
+ paddingTop: SPACING['300'],
105
316
  },
106
317
  list: {
107
- alignItems: 'flex-end',
108
318
  paddingVertical: 2,
109
- paddingRight: 6,
110
319
  },
111
- gap: {
112
- flex: 1,
113
- gap: 8,
320
+ inputRow: {
321
+ flexDirection: 'row',
322
+ alignItems: 'center',
323
+ gap: SPACING['200'],
324
+ minHeight: 52,
325
+ },
326
+ bottomFade: {
327
+ position: 'absolute',
328
+ bottom: 52,
329
+ right: 0,
330
+ width: 370,
331
+ height: 40,
332
+ transition: 'opacity 0.2s ease-in-out',
333
+ ...Platform.select({
334
+ web: {
335
+ backgroundImage:
336
+ 'linear-gradient(to top, rgba(255,255,255,1) 10%, rgba(255,255,255,0.8) 40%, transparent 100%)',
337
+ },
338
+ default: {},
339
+ }),
340
+ } as any,
341
+ iconAbsolute: {
342
+ position: 'absolute',
343
+ bottom: 65,
344
+ left: 4,
345
+ },
346
+ messageItem: {
347
+ alignSelf: 'flex-end',
348
+ },
349
+ messageWithIcon: {
350
+ flexDirection: 'row',
351
+ alignItems: 'flex-end',
352
+ },
353
+ inlineIcon: {
354
+ marginRight: 8,
355
+ },
356
+ separator: {
357
+ height: SPACING['200'],
114
358
  },
115
359
  })
@@ -0,0 +1,31 @@
1
+ import React from 'react'
2
+ import { StyleSheet } from 'react-native'
3
+ import { Button, ButtonColor, ButtonSize, ButtonVariant, COLORS } from '@magmamath/react-native-ui'
4
+ import { CloseIcon } from '../../../../shared/icons/CloseIcon'
5
+
6
+ type CloseButtonProps = {
7
+ onPress?: () => void
8
+ }
9
+
10
+ export const CloseButton = ({ onPress }: CloseButtonProps) => (
11
+ <Button
12
+ onPress={onPress}
13
+ style={{ button: styles.button }}
14
+ variant={ButtonVariant.PRIMARY}
15
+ size={ButtonSize.MEDIUM}
16
+ colorScheme={ButtonColor.WHITE}
17
+ raiseLevel={5}
18
+ >
19
+ <CloseIcon width={18} height={18} />
20
+ </Button>
21
+ )
22
+
23
+ const styles = StyleSheet.create({
24
+ button: {
25
+ width: 38,
26
+ height: 38,
27
+ borderRadius: 36,
28
+ paddingHorizontal: 0,
29
+ borderColor: COLORS.NEUTRAL_5,
30
+ },
31
+ })