keyboard-ui-profiles 0.0.30 → 0.0.32

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 (405) hide show
  1. package/dist/chunk-QGM4M3NI.js +33 -0
  2. package/dist/components/Atoms/BottomNavButton/BottomNavButton.js +1 -1
  3. package/dist/components/Atoms/BottomNavButton/BottomNavButton.js.map +1 -1
  4. package/dist/components/Atoms/Dropdown/Dropdown.js +2 -3
  5. package/dist/components/Atoms/Dropdown/Dropdown.js.map +1 -1
  6. package/dist/components/Atoms/ExtractedDiagramView/ExtractedDiagramView.d.ts +1 -1
  7. package/dist/components/Atoms/ExtractedDiagramView/ExtractedDiagramView.js +3 -2
  8. package/dist/components/Atoms/ExtractedDiagramView/ExtractedDiagramView.js.map +1 -1
  9. package/dist/components/Atoms/GlobalButton/ButtonUtils.d.ts +87 -0
  10. package/dist/components/Atoms/GlobalButton/ButtonUtils.js +114 -0
  11. package/dist/components/Atoms/GlobalButton/ButtonUtils.js.map +1 -1
  12. package/dist/components/Atoms/GlobalButton/GlobalButton.js +66 -0
  13. package/dist/components/Atoms/GlobalButton/GlobalButton.js.map +1 -1
  14. package/dist/components/Atoms/Pagination/Pagination.js +2 -3
  15. package/dist/components/Atoms/Pagination/Pagination.js.map +1 -1
  16. package/dist/components/Atoms/Pagination/TablePagination.js +1 -1
  17. package/dist/components/Atoms/Pagination/TablePagination.js.map +1 -1
  18. package/dist/components/Atoms/PrivacyTouchPoint/PrivacyTouchPoint.js +2 -3
  19. package/dist/components/Atoms/PrivacyTouchPoint/PrivacyTouchPoint.js.map +1 -1
  20. package/dist/components/Molecules/AccordianPay4/Accordian.js +11 -8
  21. package/dist/components/Molecules/AccordianPay4/Accordian.js.map +1 -1
  22. package/dist/components/Molecules/AddPostCard/AddPostCard.js +1 -1
  23. package/dist/components/Molecules/AddPostCard/AddPostCard.js.map +1 -1
  24. package/dist/components/Molecules/BottomNav/BottomNav.js +3 -3
  25. package/dist/components/Molecules/BottomNav/BottomNav.js.map +1 -1
  26. package/dist/components/Molecules/BottomNav/BottomNavStyles.d.ts +2 -2
  27. package/dist/components/Molecules/BottomNav/BottomNavStyles.js +4 -2
  28. package/dist/components/Molecules/BottomNav/BottomNavStyles.js.map +1 -1
  29. package/dist/components/Molecules/DashPlayer/DashPlayer.js +12 -19
  30. package/dist/components/Molecules/DashPlayer/DashPlayer.js.map +1 -1
  31. package/dist/components/Molecules/DashPlayer/ShakaPlayer.js +445 -138
  32. package/dist/components/Molecules/DashPlayer/ShakaPlayer.js.map +1 -1
  33. package/dist/components/Molecules/DescriptiveAnswer/DescriptiveAnswerV1.js +54 -31
  34. package/dist/components/Molecules/DescriptiveAnswer/DescriptiveAnswerV1.js.map +1 -1
  35. package/dist/components/Molecules/ExperientialComponents/NewActivityBanner.d.ts +1 -0
  36. package/dist/components/Molecules/ExperientialComponents/NewActivityBanner.js +3 -3
  37. package/dist/components/Molecules/ExperientialComponents/NewActivityBanner.js.map +1 -1
  38. package/dist/components/Molecules/ExperientialComponents/NewActivityCard.js +7 -7
  39. package/dist/components/Molecules/ExperientialComponents/NewActivityCard.js.map +1 -1
  40. package/dist/components/Molecules/ExperientialComponents/NewAddPostCard.d.ts +2 -0
  41. package/dist/components/Molecules/ExperientialComponents/NewAddPostCard.js +48 -3
  42. package/dist/components/Molecules/ExperientialComponents/NewAddPostCard.js.map +1 -1
  43. package/dist/components/Molecules/ExperientialComponents/NewPostCard.js +6 -6
  44. package/dist/components/Molecules/ExperientialComponents/NewPostCard.js.map +1 -1
  45. package/dist/components/Molecules/ExperientialComponents/NewPostInfo.d.ts +3 -0
  46. package/dist/components/Molecules/ExperientialComponents/NewPostInfo.js +41 -18
  47. package/dist/components/Molecules/ExperientialComponents/NewPostInfo.js.map +1 -1
  48. package/dist/components/Molecules/ExperientialComponents/NewPostInfoStyles.d.ts +65 -8
  49. package/dist/components/Molecules/ExperientialComponents/NewPostInfoStyles.js +68 -7
  50. package/dist/components/Molecules/ExperientialComponents/NewPostInfoStyles.js.map +1 -1
  51. package/dist/components/Molecules/ExperientialComponents/NewPostList.d.ts +4 -2
  52. package/dist/components/Molecules/ExperientialComponents/NewPostList.js +3 -3
  53. package/dist/components/Molecules/ExperientialComponents/NewPostList.js.map +1 -1
  54. package/dist/components/Molecules/ExperientialComponents/newActivityBannerStyles.d.ts +0 -7
  55. package/dist/components/Molecules/ExperientialComponents/newActivityBannerStyles.js +0 -7
  56. package/dist/components/Molecules/ExperientialComponents/newActivityBannerStyles.js.map +1 -1
  57. package/dist/components/Molecules/FactualCard/FactualCard.d.ts +5 -1
  58. package/dist/components/Molecules/FactualCard/FactualCard.js +121 -38
  59. package/dist/components/Molecules/FactualCard/FactualCard.js.map +1 -1
  60. package/dist/components/Molecules/FactualCard/FactualCard.style.d.ts +22 -0
  61. package/dist/components/Molecules/FactualCard/FactualCard.style.js +22 -2
  62. package/dist/components/Molecules/FactualCard/FactualCard.style.js.map +1 -1
  63. package/dist/components/Molecules/InvalidSession/InvalidSession.d.ts +1 -0
  64. package/dist/components/Molecules/InvalidSession/InvalidSession.js +3 -3
  65. package/dist/components/Molecules/InvalidSession/InvalidSession.js.map +1 -1
  66. package/dist/components/Molecules/Pay4Use/ExecutionModal.d.ts +2 -0
  67. package/dist/components/Molecules/Pay4Use/ExecutionModal.js +26 -6
  68. package/dist/components/Molecules/Pay4Use/ExecutionModal.js.map +1 -1
  69. package/dist/components/Molecules/PerformanceScreen/PreformanceResultScreen.d.ts +5 -0
  70. package/dist/components/Molecules/PerformanceScreen/PreformanceResultScreen.js +40 -3
  71. package/dist/components/Molecules/PerformanceScreen/PreformanceResultScreen.js.map +1 -1
  72. package/dist/components/Molecules/RequestSent/RequestSent.js +3 -3
  73. package/dist/components/Molecules/RequestSent/RequestSent.js.map +1 -1
  74. package/dist/components/Molecules/RevisionCompleteCard/RevisionCompleteCard.d.ts +2 -0
  75. package/dist/components/Molecules/RevisionCompleteCard/RevisionCompleteCard.js +3 -2
  76. package/dist/components/Molecules/RevisionCompleteCard/RevisionCompleteCard.js.map +1 -1
  77. package/dist/components/Molecules/SLI/SLIChart.d.ts +4 -0
  78. package/dist/components/Molecules/SLI/SLIChart.js +130 -0
  79. package/dist/components/Molecules/SLI/SLIChart.js.map +1 -0
  80. package/dist/components/Molecules/SLI/data.d.ts +14 -0
  81. package/dist/components/Molecules/SLI/data.js +236 -0
  82. package/dist/components/Molecules/SLI/data.js.map +1 -0
  83. package/dist/components/Molecules/SLI/sliUtils.d.ts +246 -0
  84. package/dist/components/Molecules/SLI/sliUtils.js +208 -0
  85. package/dist/components/Molecules/SLI/sliUtils.js.map +1 -0
  86. package/dist/components/Molecules/SmartLearn/SmartLearn.js +8 -8
  87. package/dist/components/Molecules/SmartLearn/SmartLearn.js.map +1 -1
  88. package/dist/components/Molecules/SmartLearn/types.d.ts +2 -0
  89. package/dist/components/Molecules/StaticscreensLearnmore/Staticback.d.ts +3 -2
  90. package/dist/components/Molecules/StaticscreensLearnmore/Staticback.js +3 -4
  91. package/dist/components/Molecules/StaticscreensLearnmore/Staticback.js.map +1 -1
  92. package/dist/components/Molecules/TermsAndPrivacy/components/ContactCard.d.ts +1 -1
  93. package/dist/components/Molecules/TermsAndPrivacy/components/ContactCard.js +4 -4
  94. package/dist/components/Molecules/TermsAndPrivacy/components/ContactCard.js.map +1 -1
  95. package/dist/components/Molecules/Tutor/Assistant/Assistant.js +95 -34
  96. package/dist/components/Molecules/Tutor/Assistant/Assistant.js.map +1 -1
  97. package/dist/components/Molecules/Tutor/Assistant/Assistant.styles.d.ts +67 -0
  98. package/dist/components/Molecules/Tutor/Assistant/Assistant.styles.js +67 -0
  99. package/dist/components/Molecules/Tutor/Assistant/Assistant.styles.js.map +1 -1
  100. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.d.ts +1 -0
  101. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.js +7 -5
  102. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.js.map +1 -1
  103. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.styles.d.ts +6 -0
  104. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.styles.js +6 -0
  105. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.styles.js.map +1 -1
  106. package/dist/components/Molecules/Tutor/Assistant/TutorAssistant.js +16 -15
  107. package/dist/components/Molecules/Tutor/Assistant/TutorAssistant.js.map +1 -1
  108. package/dist/components/Molecules/Tutor/TutorSummary/TutorSummary.js +57 -3
  109. package/dist/components/Molecules/Tutor/TutorSummary/TutorSummary.js.map +1 -1
  110. package/dist/components/Molecules/Tutor/User/User.js +39 -11
  111. package/dist/components/Molecules/Tutor/User/User.js.map +1 -1
  112. package/dist/components/Molecules/VideoView/VideoModal.d.ts +18 -1
  113. package/dist/components/Molecules/VideoView/VideoModal.js +367 -19
  114. package/dist/components/Molecules/VideoView/VideoModal.js.map +1 -1
  115. package/dist/components/Molecules/comprehension/SubQuestionLayout.js +3 -3
  116. package/dist/components/Molecules/comprehension/SubQuestionLayout.js.map +1 -1
  117. package/dist/components/Molecules/optionLayouts/fibtemp.js +1 -2
  118. package/dist/components/Molecules/optionLayouts/fibtemp.js.map +1 -1
  119. package/dist/components/Molecules/optionLayouts/mcqtemp.js +1 -1
  120. package/dist/components/Molecules/optionLayouts/mcqtemp.js.map +1 -1
  121. package/dist/components/Molecules/optionLayouts/scqStudent.js +4 -4
  122. package/dist/components/Molecules/optionLayouts/scqStudent.js.map +1 -1
  123. package/dist/components/Molecules/optionLayouts/scqtemp.js +5 -5
  124. package/dist/components/Molecules/optionLayouts/scqtemp.js.map +1 -1
  125. package/dist/components/Molecules/questionLayouts/QuestionsLayout.js +6 -4
  126. package/dist/components/Molecules/questionLayouts/QuestionsLayout.js.map +1 -1
  127. package/dist/components/Organisms/ChatView/ChatView.d.ts +1 -1
  128. package/dist/components/Organisms/ChatView/ChatView.js +3 -3
  129. package/dist/components/Organisms/ChatView/ChatView.js.map +1 -1
  130. package/dist/components/Organisms/ISEditor-V2/Editor.js +17 -10
  131. package/dist/components/Organisms/ISEditor-V2/Editor.js.map +1 -1
  132. package/dist/components/Organisms/ISEditor-V2/LatexBlock.d.ts +1 -1
  133. package/dist/components/Organisms/ISEditor-V2/LatexBlock.js +2 -3
  134. package/dist/components/Organisms/ISEditor-V2/LatexBlock.js.map +1 -1
  135. package/dist/components/Organisms/ISEditor-V2/TableModal.js +132 -79
  136. package/dist/components/Organisms/ISEditor-V2/TableModal.js.map +1 -1
  137. package/dist/components/Organisms/ISEditor-V2/ToolBar.d.ts +1 -1
  138. package/dist/components/Organisms/ISEditor-V2/ToolBar.js +3 -4
  139. package/dist/components/Organisms/ISEditor-V2/ToolBar.js.map +1 -1
  140. package/dist/components/Organisms/ISEditor-V2/editor.types.d.ts +1 -0
  141. package/dist/components/Organisms/ISEditor-V3/Editor.js +15 -8
  142. package/dist/components/Organisms/ISEditor-V3/Editor.js.map +1 -1
  143. package/dist/components/Organisms/ISEditor-V3/LatexBlock.d.ts +1 -1
  144. package/dist/components/Organisms/ISEditor-V3/LatexBlock.js +2 -3
  145. package/dist/components/Organisms/ISEditor-V3/LatexBlock.js.map +1 -1
  146. package/dist/components/Organisms/ISEditor-V3/TableModal.js +132 -79
  147. package/dist/components/Organisms/ISEditor-V3/TableModal.js.map +1 -1
  148. package/dist/components/Organisms/ISEditor-V3/ToolBar.d.ts +1 -1
  149. package/dist/components/Organisms/ISEditor-V3/ToolBar.js +18 -8
  150. package/dist/components/Organisms/ISEditor-V3/ToolBar.js.map +1 -1
  151. package/dist/components/Organisms/ISEditor-V3/editor.types.d.ts +1 -0
  152. package/dist/components/Organisms/LiveStreaming/LiveStreaming.js +2 -2
  153. package/dist/components/Organisms/LiveStreaming/LiveStreaming.js.map +1 -1
  154. package/dist/components/Organisms/NewActivityList/NewActivityList.js +1 -1
  155. package/dist/components/Organisms/NewActivityList/NewActivityList.js.map +1 -1
  156. package/dist/components/Organisms/PostDetails/ImageGallery.d.ts +1 -1
  157. package/dist/components/Organisms/PostDetails/ImageGallery.js +15 -5
  158. package/dist/components/Organisms/PostDetails/ImageGallery.js.map +1 -1
  159. package/dist/components/Organisms/ProgressView/ProgressView.js +8 -8
  160. package/dist/components/Organisms/ProgressView/ProgressView.js.map +1 -1
  161. package/dist/components/Organisms/ReviewComponent/ChatPresenter.js +4 -2
  162. package/dist/components/Organisms/ReviewComponent/ChatPresenter.js.map +1 -1
  163. package/dist/components/Organisms/ReviewComponent/KeyTakeAway.js +3 -3
  164. package/dist/components/Organisms/ReviewComponent/KeyTakeAway.js.map +1 -1
  165. package/dist/components/Organisms/ReviewComponent/MoreQuestions.js +1 -1
  166. package/dist/components/Organisms/ReviewComponent/MoreQuestions.js.map +1 -1
  167. package/dist/components/Organisms/ReviewComponent/Review.d.ts +5 -1
  168. package/dist/components/Organisms/ReviewComponent/Review.js +29 -52
  169. package/dist/components/Organisms/ReviewComponent/Review.js.map +1 -1
  170. package/dist/components/Organisms/ReviewComponent/ReviewPresenter.d.ts +5 -1
  171. package/dist/components/Organisms/ReviewComponent/ReviewPresenter.js +2 -2
  172. package/dist/components/Organisms/ReviewComponent/ReviewPresenter.js.map +1 -1
  173. package/dist/components/Organisms/ReviewComponent/ReviewPresenter.stories.d.ts +76 -2
  174. package/dist/components/Organisms/ReviewComponent/ReviewPresenter.stories.js +64 -3
  175. package/dist/components/Organisms/ReviewComponent/ReviewPresenter.stories.js.map +1 -1
  176. package/dist/components/Organisms/ReviewComponent/reviewUtils.d.ts +145 -0
  177. package/dist/components/Organisms/ReviewComponent/reviewUtils.js +525 -151
  178. package/dist/components/Organisms/ReviewComponent/reviewUtils.js.map +1 -1
  179. package/dist/components/Organisms/StudentEditor/components/EditorComponent.js +4 -4
  180. package/dist/components/Organisms/StudentEditor/components/MathKeyboard.d.ts +2 -1
  181. package/dist/components/Organisms/StudentEditor/components/MathKeyboard.js +2 -3
  182. package/dist/components/Organisms/StudentEditor/components/MathKeyboard.js.map +1 -1
  183. package/dist/components/Organisms/StudentEditor/components/MathKeyboardSME.d.ts +2 -1
  184. package/dist/components/Organisms/StudentEditor/components/MathKeyboardSME.js +9 -10
  185. package/dist/components/Organisms/StudentEditor/components/MathKeyboardSME.js.map +1 -1
  186. package/dist/components/Organisms/StudentEditor/components/MathModalSME.js +37 -12
  187. package/dist/components/Organisms/StudentEditor/components/MathModalSME.js.map +1 -1
  188. package/dist/components/Organisms/StudentEditor/components/TextEditor.js +16 -5
  189. package/dist/components/Organisms/StudentEditor/components/TextEditor.js.map +1 -1
  190. package/dist/components/Organisms/TutorFeedback/TutorFeedback.js +5 -4
  191. package/dist/components/Organisms/TutorFeedback/TutorFeedback.js.map +1 -1
  192. package/dist/index.cjs +69487 -0
  193. package/dist/index.d.mts +633 -0
  194. package/dist/index.d.ts +8 -0
  195. package/dist/index.js +17 -1
  196. package/dist/index.js.map +1 -1
  197. package/dist/shaka-player.compiled-V6AWNSFJ.js +33160 -0
  198. package/dist/utils/common-utils.d.ts +2 -0
  199. package/dist/utils/common-utils.js +149 -1
  200. package/dist/utils/common-utils.js.map +1 -1
  201. package/dist/utils/tutor-utils.d.ts +1 -1
  202. package/dist/utils/tutor-utils.js +4 -1
  203. package/dist/utils/tutor-utils.js.map +1 -1
  204. package/package.json +2 -3
  205. package/dist/components/Atoms/BottomInput/BottomInput.stories.d.ts +0 -3
  206. package/dist/components/Atoms/BottomInput/BottomInput.stories.js +0 -41
  207. package/dist/components/Atoms/BottomInput/BottomInput.stories.js.map +0 -1
  208. package/dist/components/Atoms/BottomNavButton/BottomNavButton.stories.d.ts +0 -4
  209. package/dist/components/Atoms/BottomNavButton/BottomNavButton.stories.js +0 -49
  210. package/dist/components/Atoms/BottomNavButton/BottomNavButton.stories.js.map +0 -1
  211. package/dist/components/Atoms/BottomNavMenu/BottomNavMenu.stories.d.ts +0 -4
  212. package/dist/components/Atoms/BottomNavMenu/BottomNavMenu.stories.js +0 -78
  213. package/dist/components/Atoms/BottomNavMenu/BottomNavMenu.stories.js.map +0 -1
  214. package/dist/components/Atoms/BottomNavToast/BottomNavToast.stories.d.ts +0 -3
  215. package/dist/components/Atoms/BottomNavToast/BottomNavToast.stories.js +0 -24
  216. package/dist/components/Atoms/BottomNavToast/BottomNavToast.stories.js.map +0 -1
  217. package/dist/components/Atoms/BottomTopicChapter/BottomTopicChapter.stories.d.ts +0 -3
  218. package/dist/components/Atoms/BottomTopicChapter/BottomTopicChapter.stories.js +0 -26
  219. package/dist/components/Atoms/BottomTopicChapter/BottomTopicChapter.stories.js.map +0 -1
  220. package/dist/components/Atoms/CustomButton/CustomButton.stories.d.ts +0 -3
  221. package/dist/components/Atoms/CustomButton/CustomButton.stories.js +0 -20
  222. package/dist/components/Atoms/CustomButton/CustomButton.stories.js.map +0 -1
  223. package/dist/components/Atoms/Dropdown/Dropdown.stories.d.ts +0 -3
  224. package/dist/components/Atoms/Dropdown/Dropdown.stories.js +0 -24
  225. package/dist/components/Atoms/Dropdown/Dropdown.stories.js.map +0 -1
  226. package/dist/components/Atoms/ExtractedDiagramView/ExtractedDiagramView.stories.d.ts +0 -4
  227. package/dist/components/Atoms/ExtractedDiagramView/ExtractedDiagramView.stories.js +0 -53
  228. package/dist/components/Atoms/ExtractedDiagramView/ExtractedDiagramView.stories.js.map +0 -1
  229. package/dist/components/Atoms/GlobalButton/GlobalButton.stories.d.ts +0 -7
  230. package/dist/components/Atoms/GlobalButton/GlobalButton.stories.js +0 -51
  231. package/dist/components/Atoms/GlobalButton/GlobalButton.stories.js.map +0 -1
  232. package/dist/components/Atoms/GlobalButtonV2/GlobalButtonV2.stories.d.ts +0 -4
  233. package/dist/components/Atoms/GlobalButtonV2/GlobalButtonV2.stories.js +0 -27
  234. package/dist/components/Atoms/GlobalButtonV2/GlobalButtonV2.stories.js.map +0 -1
  235. package/dist/components/Atoms/LatexRenderView/LatexRenderView.stories.d.ts +0 -3
  236. package/dist/components/Atoms/LatexRenderView/LatexRenderView.stories.js +0 -21
  237. package/dist/components/Atoms/LatexRenderView/LatexRenderView.stories.js.map +0 -1
  238. package/dist/components/Atoms/MenuNavbar/MenuNavbar.stories.d.ts +0 -3
  239. package/dist/components/Atoms/MenuNavbar/MenuNavbar.stories.js +0 -22
  240. package/dist/components/Atoms/MenuNavbar/MenuNavbar.stories.js.map +0 -1
  241. package/dist/components/Atoms/Pagination/TablePagination.stories.d.ts +0 -3
  242. package/dist/components/Atoms/Pagination/TablePagination.stories.js +0 -26
  243. package/dist/components/Atoms/Pagination/TablePagination.stories.js.map +0 -1
  244. package/dist/components/Atoms/TranscriptionImagePreview/TranscriptionImagePreview.stories.d.ts +0 -4
  245. package/dist/components/Atoms/TranscriptionImagePreview/TranscriptionImagePreview.stories.js +0 -69
  246. package/dist/components/Atoms/TranscriptionImagePreview/TranscriptionImagePreview.stories.js.map +0 -1
  247. package/dist/components/Molecules/AccordianPay4/Accordian.stories.d.ts +0 -11
  248. package/dist/components/Molecules/AccordianPay4/Accordian.stories.js +0 -82
  249. package/dist/components/Molecules/AccordianPay4/Accordian.stories.js.map +0 -1
  250. package/dist/components/Molecules/ActivityBanner/ActivityBanner.stories.d.ts +0 -4
  251. package/dist/components/Molecules/ActivityBanner/ActivityBanner.stories.js +0 -97
  252. package/dist/components/Molecules/ActivityBanner/ActivityBanner.stories.js.map +0 -1
  253. package/dist/components/Molecules/AddPostCard/AddPostCard.stories.d.ts +0 -5
  254. package/dist/components/Molecules/AddPostCard/AddPostCard.stories.js +0 -56
  255. package/dist/components/Molecules/AddPostCard/AddPostCard.stories.js.map +0 -1
  256. package/dist/components/Molecules/BottomNav/BottomNav.stories.d.ts +0 -3
  257. package/dist/components/Molecules/BottomNav/BottomNav.stories.js +0 -120
  258. package/dist/components/Molecules/BottomNav/BottomNav.stories.js.map +0 -1
  259. package/dist/components/Molecules/DashPlayer/DashPlayer.stories.d.ts +0 -5
  260. package/dist/components/Molecules/DashPlayer/DashPlayer.stories.js +0 -32
  261. package/dist/components/Molecules/DashPlayer/DashPlayer.stories.js.map +0 -1
  262. package/dist/components/Molecules/DescriptiveAnswer/DescriptiveAnswer.stories.d.ts +0 -17
  263. package/dist/components/Molecules/DescriptiveAnswer/DescriptiveAnswer.stories.js +0 -568
  264. package/dist/components/Molecules/DescriptiveAnswer/DescriptiveAnswer.stories.js.map +0 -1
  265. package/dist/components/Molecules/HighChart/HighCharts.stories.d.ts +0 -3
  266. package/dist/components/Molecules/HighChart/HighCharts.stories.js +0 -208
  267. package/dist/components/Molecules/HighChart/HighCharts.stories.js.map +0 -1
  268. package/dist/components/Molecules/ImageView/ImageModal.stories.d.ts +0 -3
  269. package/dist/components/Molecules/ImageView/ImageModal.stories.js +0 -19
  270. package/dist/components/Molecules/ImageView/ImageModal.stories.js.map +0 -1
  271. package/dist/components/Molecules/InvalidSession/InvalidSession.stories.d.ts +0 -6
  272. package/dist/components/Molecules/InvalidSession/InvalidSession.stories.js +0 -17
  273. package/dist/components/Molecules/InvalidSession/InvalidSession.stories.js.map +0 -1
  274. package/dist/components/Molecules/LatexRender/LatexRender.stories.d.ts +0 -3
  275. package/dist/components/Molecules/LatexRender/LatexRender.stories.js +0 -22
  276. package/dist/components/Molecules/LatexRender/LatexRender.stories.js.map +0 -1
  277. package/dist/components/Molecules/Pay4Use/ExecutionModal.stories.d.ts +0 -9
  278. package/dist/components/Molecules/Pay4Use/ExecutionModal.stories.js +0 -92
  279. package/dist/components/Molecules/Pay4Use/ExecutionModal.stories.js.map +0 -1
  280. package/dist/components/Molecules/Pay4Use/PayToUsePrompt.stories.d.ts +0 -3
  281. package/dist/components/Molecules/Pay4Use/PayToUsePrompt.stories.js +0 -22
  282. package/dist/components/Molecules/Pay4Use/PayToUsePrompt.stories.js.map +0 -1
  283. package/dist/components/Molecules/PerformanceScreen/PreformanceResultScreen.stories.d.ts +0 -21
  284. package/dist/components/Molecules/PerformanceScreen/PreformanceResultScreen.stories.js +0 -94
  285. package/dist/components/Molecules/PerformanceScreen/PreformanceResultScreen.stories.js.map +0 -1
  286. package/dist/components/Molecules/PostCard/PostCard.stories.d.ts +0 -7
  287. package/dist/components/Molecules/PostCard/PostCard.stories.js +0 -180
  288. package/dist/components/Molecules/PostCard/PostCard.stories.js.map +0 -1
  289. package/dist/components/Molecules/RequestSent/RequestSent.stories.d.ts +0 -7
  290. package/dist/components/Molecules/RequestSent/RequestSent.stories.js +0 -46
  291. package/dist/components/Molecules/RequestSent/RequestSent.stories.js.map +0 -1
  292. package/dist/components/Molecules/RevisionCompleteCard/RevisionCompleteCard.stories.d.ts +0 -7
  293. package/dist/components/Molecules/RevisionCompleteCard/RevisionCompleteCard.stories.js +0 -53
  294. package/dist/components/Molecules/RevisionCompleteCard/RevisionCompleteCard.stories.js.map +0 -1
  295. package/dist/components/Molecules/RevisionIntroCard/RevisionCard.stories.d.ts +0 -6
  296. package/dist/components/Molecules/RevisionIntroCard/RevisionCard.stories.js +0 -23
  297. package/dist/components/Molecules/RevisionIntroCard/RevisionCard.stories.js.map +0 -1
  298. package/dist/components/Molecules/SmartLearn/SmartLearn.stories.d.ts +0 -10
  299. package/dist/components/Molecules/SmartLearn/SmartLearn.stories.js +0 -87
  300. package/dist/components/Molecules/SmartLearn/SmartLearn.stories.js.map +0 -1
  301. package/dist/components/Molecules/SortMenu/SortMenu.stories.d.ts +0 -4
  302. package/dist/components/Molecules/SortMenu/SortMenu.stories.js +0 -56
  303. package/dist/components/Molecules/SortMenu/SortMenu.stories.js.map +0 -1
  304. package/dist/components/Molecules/StaticscreensLearnmore/Staticback.stories.d.ts +0 -12
  305. package/dist/components/Molecules/StaticscreensLearnmore/Staticback.stories.js +0 -178
  306. package/dist/components/Molecules/StaticscreensLearnmore/Staticback.stories.js.map +0 -1
  307. package/dist/components/Molecules/TermsAndPrivacy/Privacy.stories.d.ts +0 -7
  308. package/dist/components/Molecules/TermsAndPrivacy/Privacy.stories.js +0 -54
  309. package/dist/components/Molecules/TermsAndPrivacy/Privacy.stories.js.map +0 -1
  310. package/dist/components/Molecules/TermsAndPrivacy/TermsAndConditions.stories.d.ts +0 -6
  311. package/dist/components/Molecules/TermsAndPrivacy/TermsAndConditions.stories.js +0 -46
  312. package/dist/components/Molecules/TermsAndPrivacy/TermsAndConditions.stories.js.map +0 -1
  313. package/dist/components/Molecules/TimerClock/TimerClock.stories.d.ts +0 -4
  314. package/dist/components/Molecules/TimerClock/TimerClock.stories.js +0 -30
  315. package/dist/components/Molecules/TimerClock/TimerClock.stories.js.map +0 -1
  316. package/dist/components/Molecules/Tutor/Assistant/Assistant.stories.d.ts +0 -7
  317. package/dist/components/Molecules/Tutor/Assistant/Assistant.stories.js +0 -102
  318. package/dist/components/Molecules/Tutor/Assistant/Assistant.stories.js.map +0 -1
  319. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.stories.d.ts +0 -4
  320. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.stories.js +0 -30
  321. package/dist/components/Molecules/Tutor/Assistant/AssistantV2.stories.js.map +0 -1
  322. package/dist/components/Molecules/Tutor/TutorSummary/TutorSummary.stories.d.ts +0 -7
  323. package/dist/components/Molecules/Tutor/TutorSummary/TutorSummary.stories.js +0 -165
  324. package/dist/components/Molecules/Tutor/TutorSummary/TutorSummary.stories.js.map +0 -1
  325. package/dist/components/Molecules/Tutor/User/User.stories.d.ts +0 -6
  326. package/dist/components/Molecules/Tutor/User/User.stories.js +0 -117
  327. package/dist/components/Molecules/Tutor/User/User.stories.js.map +0 -1
  328. package/dist/components/Molecules/VideoView/VideoModal.stories.d.ts +0 -3
  329. package/dist/components/Molecules/VideoView/VideoModal.stories.js +0 -23
  330. package/dist/components/Molecules/VideoView/VideoModal.stories.js.map +0 -1
  331. package/dist/components/Molecules/WallBanner/WallBanner.stories.d.ts +0 -6
  332. package/dist/components/Molecules/WallBanner/WallBanner.stories.js +0 -45
  333. package/dist/components/Molecules/WallBanner/WallBanner.stories.js.map +0 -1
  334. package/dist/components/Molecules/WallCard/WallCard.stories.d.ts +0 -5
  335. package/dist/components/Molecules/WallCard/WallCard.stories.js +0 -67
  336. package/dist/components/Molecules/WallCard/WallCard.stories.js.map +0 -1
  337. package/dist/components/Organisms/ActivityList/ActivityList.stories.d.ts +0 -3
  338. package/dist/components/Organisms/ActivityList/ActivityList.stories.js +0 -76
  339. package/dist/components/Organisms/ActivityList/ActivityList.stories.js.map +0 -1
  340. package/dist/components/Organisms/ChatView/ChatView.stories.d.ts +0 -3
  341. package/dist/components/Organisms/ChatView/ChatView.stories.js +0 -73
  342. package/dist/components/Organisms/ChatView/ChatView.stories.js.map +0 -1
  343. package/dist/components/Organisms/FlashCardNode/FlashcardNode.stories.d.ts +0 -15
  344. package/dist/components/Organisms/FlashCardNode/FlashcardNode.stories.js +0 -301
  345. package/dist/components/Organisms/FlashCardNode/FlashcardNode.stories.js.map +0 -1
  346. package/dist/components/Organisms/ISEditor-V2/ISEditor.stories.d.ts +0 -5
  347. package/dist/components/Organisms/ISEditor-V2/ISEditor.stories.js +0 -309
  348. package/dist/components/Organisms/ISEditor-V2/ISEditor.stories.js.map +0 -1
  349. package/dist/components/Organisms/LiveStreaming/LiveStreaming.stories.d.ts +0 -4
  350. package/dist/components/Organisms/LiveStreaming/LiveStreaming.stories.js +0 -29
  351. package/dist/components/Organisms/LiveStreaming/LiveStreaming.stories.js.map +0 -1
  352. package/dist/components/Organisms/PostDetails/PostDetails.stories.d.ts +0 -4
  353. package/dist/components/Organisms/PostDetails/PostDetails.stories.js +0 -376
  354. package/dist/components/Organisms/PostDetails/PostDetails.stories.js.map +0 -1
  355. package/dist/components/Organisms/PostsList/PostList.stories.d.ts +0 -6
  356. package/dist/components/Organisms/PostsList/PostList.stories.js +0 -130
  357. package/dist/components/Organisms/PostsList/PostList.stories.js.map +0 -1
  358. package/dist/components/Organisms/RecapGraph/Example.stories.d.ts +0 -3
  359. package/dist/components/Organisms/RecapGraph/Example.stories.js +0 -60
  360. package/dist/components/Organisms/RecapGraph/Example.stories.js.map +0 -1
  361. package/dist/components/Organisms/StudentEditor/StudentEditor.stories.d.ts +0 -10
  362. package/dist/components/Organisms/StudentEditor/StudentEditor.stories.js +0 -332
  363. package/dist/components/Organisms/StudentEditor/StudentEditor.stories.js.map +0 -1
  364. package/dist/components/Organisms/TableComponent/TableComponent.stories.d.ts +0 -3
  365. package/dist/components/Organisms/TableComponent/TableComponent.stories.js +0 -189
  366. package/dist/components/Organisms/TableComponent/TableComponent.stories.js.map +0 -1
  367. package/dist/components/Organisms/TutorFeedback/TutorFeedback.stories.d.ts +0 -4
  368. package/dist/components/Organisms/TutorFeedback/TutorFeedback.stories.js +0 -103
  369. package/dist/components/Organisms/TutorFeedback/TutorFeedback.stories.js.map +0 -1
  370. package/dist/stories/Button.stories.d.ts +0 -6
  371. package/dist/stories/Button.stories.js +0 -45
  372. package/dist/stories/Button.stories.js.map +0 -1
  373. package/dist/stories/Checkbox.stories.d.ts +0 -4
  374. package/dist/stories/Checkbox.stories.js +0 -35
  375. package/dist/stories/Checkbox.stories.js.map +0 -1
  376. package/dist/stories/FloatingButton.stories.d.ts +0 -11
  377. package/dist/stories/FloatingButton.stories.js +0 -52
  378. package/dist/stories/FloatingButton.stories.js.map +0 -1
  379. package/dist/stories/Input.stories.d.ts +0 -4
  380. package/dist/stories/Input.stories.js +0 -35
  381. package/dist/stories/Input.stories.js.map +0 -1
  382. package/dist/stories/Modal.stories.d.ts +0 -4
  383. package/dist/stories/Modal.stories.js +0 -39
  384. package/dist/stories/Modal.stories.js.map +0 -1
  385. package/dist/stories/Radio.stories.d.ts +0 -4
  386. package/dist/stories/Radio.stories.js +0 -33
  387. package/dist/stories/Radio.stories.js.map +0 -1
  388. package/dist/stories/Select.stories.d.ts +0 -4
  389. package/dist/stories/Select.stories.js +0 -36
  390. package/dist/stories/Select.stories.js.map +0 -1
  391. package/dist/stories/Spinner.stories.d.ts +0 -4
  392. package/dist/stories/Spinner.stories.js +0 -32
  393. package/dist/stories/Spinner.stories.js.map +0 -1
  394. package/dist/stories/Switch.stories.d.ts +0 -4
  395. package/dist/stories/Switch.stories.js +0 -33
  396. package/dist/stories/Switch.stories.js.map +0 -1
  397. package/dist/stories/Textarea.stories.d.ts +0 -4
  398. package/dist/stories/Textarea.stories.js +0 -32
  399. package/dist/stories/Textarea.stories.js.map +0 -1
  400. package/dist/stories/Toast.stories.d.ts +0 -4
  401. package/dist/stories/Toast.stories.js +0 -32
  402. package/dist/stories/Toast.stories.js.map +0 -1
  403. package/dist/stories/Typography.stories.d.ts +0 -4
  404. package/dist/stories/Typography.stories.js +0 -35
  405. package/dist/stories/Typography.stories.js.map +0 -1
@@ -25,13 +25,59 @@ var __importStar = (this && this.__importStar) || function (mod) {
25
25
  Object.defineProperty(exports, "__esModule", { value: true });
26
26
  const jsx_runtime_1 = require("react/jsx-runtime");
27
27
  const react_1 = __importStar(require("react"));
28
- const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = false, poster, controls = false, authToken, startTime = null, endTime = null, onPlay, onPause, onEnded, onError, onReady, onBuffer, style = {}, onSeek, onRateChange, onVolumeChange, onMuteToggle, }, ref) => {
28
+ // ─── Helpers ──────────────────────────────────────────────────────────────────
29
+ const formatTime = (seconds) => {
30
+ if (!seconds || isNaN(seconds))
31
+ return "0:00";
32
+ const h = Math.floor(seconds / 3600);
33
+ const m = Math.floor((seconds % 3600) / 60);
34
+ const s = Math.floor(seconds % 60);
35
+ if (h > 0)
36
+ return `${h}:${m.toString().padStart(2, "0")}:${s.toString().padStart(2, "0")}`;
37
+ return `${m}:${s.toString().padStart(2, "0")}`;
38
+ };
39
+ const SPEED_OPTIONS = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
40
+ const DEFAULT_SEGMENT_COLORS = [
41
+ "rgba(99, 179, 237, 0.45)",
42
+ "rgba(154, 230, 180, 0.45)",
43
+ "rgba(252, 211, 77, 0.45)",
44
+ "rgba(252, 129, 74, 0.45)",
45
+ "rgba(183, 148, 244, 0.45)",
46
+ ];
47
+ // ─── SVG Icons ────────────────────────────────────────────────────────────────
48
+ const IconPlay = () => ((0, jsx_runtime_1.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: (0, jsx_runtime_1.jsx)("polygon", { points: "4,2 14,9 4,16" }) }));
49
+ const IconPause = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: [(0, jsx_runtime_1.jsx)("rect", { x: "3", y: "2", width: "4", height: "14", rx: "1" }), (0, jsx_runtime_1.jsx)("rect", { x: "11", y: "2", width: "4", height: "14", rx: "1" })] }));
50
+ const IconSkipPrev = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: [(0, jsx_runtime_1.jsx)("rect", { x: "3", y: "3", width: "2.5", height: "12", rx: "1" }), (0, jsx_runtime_1.jsx)("polygon", { points: "14,3 6,9 14,15" })] }));
51
+ const IconSkipNext = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: [(0, jsx_runtime_1.jsx)("polygon", { points: "4,3 12,9 4,15" }), (0, jsx_runtime_1.jsx)("rect", { x: "12.5", y: "3", width: "2.5", height: "12", rx: "1" })] }));
52
+ const IconVolume = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: [(0, jsx_runtime_1.jsx)("polygon", { points: "2,6 2,12 6,12 10,16 10,2 6,6" }), (0, jsx_runtime_1.jsx)("path", { d: "M12.5 5.5 C14.5 7 14.5 11 12.5 12.5", stroke: "white", strokeWidth: "1.5", fill: "none", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("path", { d: "M14.5 3.5 C17.5 6 17.5 12 14.5 14.5", stroke: "white", strokeWidth: "1.5", fill: "none", strokeLinecap: "round" })] }));
53
+ const IconMuted = () => ((0, jsx_runtime_1.jsxs)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: [(0, jsx_runtime_1.jsx)("polygon", { points: "2,6 2,12 6,12 10,16 10,2 6,6" }), (0, jsx_runtime_1.jsx)("line", { x1: "13", y1: "6", x2: "17", y2: "12", stroke: "white", strokeWidth: "1.8", strokeLinecap: "round" }), (0, jsx_runtime_1.jsx)("line", { x1: "17", y1: "6", x2: "13", y2: "12", stroke: "white", strokeWidth: "1.8", strokeLinecap: "round" })] }));
54
+ const IconFullscreen = () => ((0, jsx_runtime_1.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: (0, jsx_runtime_1.jsx)("path", { d: "M2 6V2h4M12 2h4v4M16 12v4h-4M6 16H2v-4", stroke: "white", strokeWidth: "1.8", fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }));
55
+ const IconExitFullscreen = () => ((0, jsx_runtime_1.jsx)("svg", { width: "18", height: "18", viewBox: "0 0 18 18", fill: "white", children: (0, jsx_runtime_1.jsx)("path", { d: "M6 2v4H2M16 6h-4V2M2 12h4v4M12 16v-4h4", stroke: "white", strokeWidth: "1.8", fill: "none", strokeLinecap: "round", strokeLinejoin: "round" }) }));
56
+ // ─── Control button with hover border ─────────────────────────────────────────
57
+ const CtrlBtn = ({ onClick, label, children, disabled = false }) => {
58
+ const [hovered, setHovered] = (0, react_1.useState)(false);
59
+ return ((0, jsx_runtime_1.jsx)("button", { onClick: disabled ? undefined : onClick, "aria-label": label, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
60
+ background: hovered && !disabled ? "rgba(255,255,255,0.1)" : "none",
61
+ border: `1px solid ${hovered && !disabled ? "rgba(255,255,255,0.4)" : "rgba(255,255,255,0.18)"}`,
62
+ cursor: disabled ? "default" : "pointer",
63
+ padding: "5px",
64
+ display: "flex",
65
+ alignItems: "center",
66
+ justifyContent: "center",
67
+ borderRadius: "8px",
68
+ opacity: disabled ? 0.35 : 1,
69
+ flexShrink: 0,
70
+ transition: "border-color 0.15s ease, background-color 0.15s ease",
71
+ }, children: children }));
72
+ };
73
+ // ─── ShakaPlayer ──────────────────────────────────────────────────────────────
74
+ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = false, poster, controls = true, authToken, startTime = null, endTime = null, onPlay, onPause, onEnded, onError, onReady, onBuffer, style = {}, onSeek, onRateChange, onVolumeChange, onMuteToggle, segments = [], }, ref) => {
29
75
  const videoRef = (0, react_1.useRef)(null);
30
76
  const [playerInstance, setPlayerInstance] = (0, react_1.useState)(null);
31
77
  const [isPlayerReady, setIsPlayerReady] = (0, react_1.useState)(false);
32
- const [isPlayingOnHover, setIsPlayingOnHover] = (0, react_1.useState)(playing);
78
+ const [, setIsPlayingOnHover] = (0, react_1.useState)(playing);
33
79
  const endTimeCheckInterval = (0, react_1.useRef)(null);
34
- // Track watch time data
80
+ // Watch time tracking
35
81
  const watchStartTime = (0, react_1.useRef)(null);
36
82
  const totalWatchTime = (0, react_1.useRef)(0);
37
83
  const lastTime = (0, react_1.useRef)(0);
@@ -40,33 +86,194 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
40
86
  const lastRate = (0, react_1.useRef)(1);
41
87
  const wallClockStart = (0, react_1.useRef)(null);
42
88
  const wallClockTotal = (0, react_1.useRef)(0);
43
- // Track whether event handlers are attached
44
89
  const eventHandlersAttached = (0, react_1.useRef)(false);
90
+ // ── UI state (for custom controls rendering) ──────────────────────────────
91
+ const [uiCurrentTime, setUiCurrentTime] = (0, react_1.useState)(0);
92
+ const [uiDuration, setUiDuration] = (0, react_1.useState)(0);
93
+ const [uiPlaying, setUiPlaying] = (0, react_1.useState)(false);
94
+ const [uiMuted, setUiMuted] = (0, react_1.useState)(muted);
95
+ const [uiPlaybackRate, setUiPlaybackRate] = (0, react_1.useState)(1);
96
+ const [hoveredSegmentId, setHoveredSegmentId] = (0, react_1.useState)(null);
97
+ const [showSpeedMenu, setShowSpeedMenu] = (0, react_1.useState)(false);
98
+ const [isFullscreen, setIsFullscreen] = (0, react_1.useState)(false);
99
+ const [seekingUI, setSeekingUI] = (0, react_1.useState)(false);
100
+ const [showControls, setShowControls] = (0, react_1.useState)(true);
101
+ const seekbarRef = (0, react_1.useRef)(null);
102
+ const containerRef = (0, react_1.useRef)(null);
103
+ const speedMenuRef = (0, react_1.useRef)(null);
104
+ const hideTimerRef = (0, react_1.useRef)(null);
105
+ const revealControls = () => {
106
+ setShowControls(true);
107
+ clearTimeout(hideTimerRef.current);
108
+ hideTimerRef.current = setTimeout(() => setShowControls(false), 3000);
109
+ };
110
+ const handleContainerMouseMove = () => revealControls();
111
+ const handleContainerMouseLeave = () => {
112
+ clearTimeout(hideTimerRef.current);
113
+ hideTimerRef.current = setTimeout(() => setShowControls(false), 500);
114
+ };
115
+ const handleContainerClick = () => revealControls();
116
+ // ── Imperative handle ────────────────────────────────────────────────────
45
117
  (0, react_1.useImperativeHandle)(ref, () => ({
46
- getCurrentTime: () => {
47
- return videoRef?.current?.currentTime || 0;
48
- },
118
+ getCurrentTime: () => videoRef?.current?.currentTime || 0,
49
119
  getTotalWatchTime: () => {
50
- if (watchStartTime.current !== null &&
51
- wallClockStart.current !== null &&
52
- !videoRef.current.paused) {
120
+ if (watchStartTime.current !== null && wallClockStart.current !== null && !videoRef.current.paused) {
53
121
  const elapsed = (Date.now() - wallClockStart.current) / 1000;
54
122
  return wallClockTotal.current + elapsed;
55
123
  }
56
124
  return wallClockTotal.current;
57
125
  },
58
- logWatchTime: () => {
59
- logWatchTime();
126
+ logWatchTime: () => logWatchTime(),
127
+ seekTo: (seconds) => {
128
+ if (videoRef.current) {
129
+ videoRef.current.currentTime = seconds;
130
+ setUiCurrentTime(seconds);
131
+ }
60
132
  },
61
133
  }));
62
134
  const logWatchTime = () => {
63
135
  if (watchStartTime.current !== null && wallClockStart.current !== null) {
64
- const elapsed = (Date.now() - wallClockStart.current) / 1000; // seconds
136
+ const elapsed = (Date.now() - wallClockStart.current) / 1000;
65
137
  wallClockTotal.current += elapsed;
66
138
  watchStartTime.current = null;
67
139
  wallClockStart.current = null;
68
140
  }
69
141
  };
142
+ // ── UI state sync (timeupdate, durationchange, etc.) ─────────────────────
143
+ (0, react_1.useEffect)(() => {
144
+ const video = videoRef.current;
145
+ if (!video)
146
+ return;
147
+ const onTimeUpdateUI = () => setUiCurrentTime(video.currentTime);
148
+ const onDurationUI = () => { if (video.duration && !isNaN(video.duration))
149
+ setUiDuration(video.duration); };
150
+ const onPlayUI = () => setUiPlaying(true);
151
+ const onPauseUI = () => setUiPlaying(false);
152
+ const onEndedUI = () => setUiPlaying(false);
153
+ const onVolumeChangeUI = () => setUiMuted(video.muted);
154
+ const onRateChangeUI = () => setUiPlaybackRate(video.playbackRate);
155
+ video.addEventListener("timeupdate", onTimeUpdateUI);
156
+ video.addEventListener("durationchange", onDurationUI);
157
+ video.addEventListener("loadedmetadata", onDurationUI);
158
+ video.addEventListener("play", onPlayUI);
159
+ video.addEventListener("pause", onPauseUI);
160
+ video.addEventListener("ended", onEndedUI);
161
+ video.addEventListener("volumechange", onVolumeChangeUI);
162
+ video.addEventListener("ratechange", onRateChangeUI);
163
+ return () => {
164
+ video.removeEventListener("timeupdate", onTimeUpdateUI);
165
+ video.removeEventListener("durationchange", onDurationUI);
166
+ video.removeEventListener("loadedmetadata", onDurationUI);
167
+ video.removeEventListener("play", onPlayUI);
168
+ video.removeEventListener("pause", onPauseUI);
169
+ video.removeEventListener("ended", onEndedUI);
170
+ video.removeEventListener("volumechange", onVolumeChangeUI);
171
+ video.removeEventListener("ratechange", onRateChangeUI);
172
+ };
173
+ }, []);
174
+ // ── Fullscreen sync ───────────────────────────────────────────────────────
175
+ (0, react_1.useEffect)(() => {
176
+ const onChange = () => setIsFullscreen(!!document.fullscreenElement);
177
+ document.addEventListener("fullscreenchange", onChange);
178
+ return () => document.removeEventListener("fullscreenchange", onChange);
179
+ }, []);
180
+ // ── Speed menu click-outside ──────────────────────────────────────────────
181
+ (0, react_1.useEffect)(() => {
182
+ if (!showSpeedMenu)
183
+ return;
184
+ const handler = (e) => {
185
+ if (speedMenuRef.current && !speedMenuRef.current.contains(e.target)) {
186
+ setShowSpeedMenu(false);
187
+ }
188
+ };
189
+ document.addEventListener("mousedown", handler);
190
+ return () => document.removeEventListener("mousedown", handler);
191
+ }, [showSpeedMenu]);
192
+ // ── Seekbar drag ──────────────────────────────────────────────────────────
193
+ const seekToClientX = (clientX) => {
194
+ const bar = seekbarRef.current;
195
+ const video = videoRef.current;
196
+ if (!bar || !video || !uiDuration)
197
+ return;
198
+ const { left, width } = bar.getBoundingClientRect();
199
+ const fraction = Math.min(Math.max((clientX - left) / width, 0), 1);
200
+ video.currentTime = fraction * uiDuration;
201
+ setUiCurrentTime(fraction * uiDuration);
202
+ };
203
+ (0, react_1.useEffect)(() => {
204
+ if (!seekingUI)
205
+ return;
206
+ const onMove = (e) => seekToClientX(e.clientX);
207
+ const onUp = (e) => { setSeekingUI(false); seekToClientX(e.clientX); };
208
+ window.addEventListener("mousemove", onMove);
209
+ window.addEventListener("mouseup", onUp);
210
+ return () => {
211
+ window.removeEventListener("mousemove", onMove);
212
+ window.removeEventListener("mouseup", onUp);
213
+ };
214
+ }, [seekingUI, uiDuration]);
215
+ // ── Control handlers ──────────────────────────────────────────────────────
216
+ const handleTogglePlay = () => {
217
+ const video = videoRef.current;
218
+ if (!video)
219
+ return;
220
+ video.paused ? video.play() : video.pause();
221
+ };
222
+ const handleToggleMute = () => {
223
+ const video = videoRef.current;
224
+ if (!video)
225
+ return;
226
+ video.muted = !video.muted;
227
+ setUiMuted(video.muted);
228
+ };
229
+ const handleFullscreen = () => {
230
+ if (!document.fullscreenElement) {
231
+ containerRef.current?.requestFullscreen();
232
+ }
233
+ else {
234
+ document.exitFullscreen();
235
+ }
236
+ };
237
+ const handleSpeedChange = (rate) => {
238
+ if (videoRef.current)
239
+ videoRef.current.playbackRate = rate;
240
+ setUiPlaybackRate(rate);
241
+ setShowSpeedMenu(false);
242
+ };
243
+ // ── Segment helpers ───────────────────────────────────────────────────────
244
+ console.log("[ShakaPlayer] segments prop:", segments, "| length:", segments.length);
245
+ console.log("[ShakaPlayer] uiDuration:", uiDuration, "| controls:", controls, "| showControls:", showControls);
246
+ const segmentBands = segments.map((seg, i) => ({
247
+ ...seg,
248
+ end: seg.end ?? segments[i + 1]?.start ?? uiDuration,
249
+ }));
250
+ console.log("[ShakaPlayer] segmentBands (computed):", JSON.stringify(segmentBands));
251
+ console.log("[ShakaPlayer] Will render segment bands?", uiDuration > 0 && segmentBands.length > 0);
252
+ const activeSegment = segmentBands.find((seg) => uiCurrentTime >= seg.start && uiCurrentTime < seg.end) ?? null;
253
+ const activeSegmentId = activeSegment?.id ?? null;
254
+ const activeIdx = segmentBands.findIndex((s) => s.id === activeSegmentId);
255
+ const nextSegment = activeIdx >= 0 ? segmentBands[activeIdx + 1] ?? null : null;
256
+ const prevSegment = activeIdx > 0 ? segmentBands[activeIdx - 1] : segmentBands[0] ?? null;
257
+ const handleSkipPrev = () => {
258
+ if (!prevSegment || !videoRef.current)
259
+ return;
260
+ videoRef.current.currentTime = prevSegment.start;
261
+ setUiCurrentTime(prevSegment.start);
262
+ };
263
+ const handleSkipNext = () => {
264
+ if (!nextSegment || !videoRef.current)
265
+ return;
266
+ videoRef.current.currentTime = nextSegment.start;
267
+ setUiCurrentTime(nextSegment.start);
268
+ };
269
+ const handleSegmentMouseDown = (e, seg) => {
270
+ e.stopPropagation();
271
+ if (!videoRef.current)
272
+ return;
273
+ videoRef.current.currentTime = seg.start;
274
+ setUiCurrentTime(seg.start);
275
+ };
276
+ // ── Existing Shaka init & lifecycle effects ────────────────────────────────
70
277
  const initShakaPlayer = async () => {
71
278
  if (playerInstance) {
72
279
  try {
@@ -85,13 +292,10 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
85
292
  onError({ type: "browser-not-supported" });
86
293
  return;
87
294
  }
88
- const player = new shaka.Player(); // ✅ new way
89
- await player.attach(videoRef.current); // ✅ attach media element
90
- player.addEventListener("error", (event) => {
91
- console.error("Shaka Player Error:", event);
92
- if (onError)
93
- onError(event);
94
- });
295
+ const player = new shaka.Player();
296
+ await player.attach(videoRef.current);
297
+ player.addEventListener("error", (event) => { console.error("Shaka Player Error:", event); if (onError)
298
+ onError(event); });
95
299
  player.addEventListener("loaded", () => {
96
300
  setIsPlayerReady(true);
97
301
  if (startTime !== null && videoRef.current) {
@@ -106,30 +310,22 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
106
310
  if (onReady)
107
311
  onReady();
108
312
  });
109
- player.addEventListener("buffering", (event) => {
110
- const isBuffering = event.buffering;
111
- if (onBuffer)
112
- onBuffer(isBuffering);
113
- });
313
+ player.addEventListener("buffering", (event) => { if (onBuffer)
314
+ onBuffer(event.buffering); });
114
315
  if (authToken) {
115
- player
116
- .getNetworkingEngine()
117
- .registerRequestFilter((type, request) => {
316
+ player.getNetworkingEngine().registerRequestFilter((_type, request) => {
118
317
  if (request && request.uris && request.uris.length > 0) {
119
318
  request.headers = request.headers || {};
120
319
  request.headers["Authorization"] = authToken;
121
320
  }
122
- else {
123
- console.error("Request has no URIs defined");
124
- }
125
321
  });
126
322
  }
127
323
  try {
128
324
  await player.load(url);
129
325
  if (videoRef.current) {
130
326
  videoRef.current.muted = muted;
327
+ videoRef.current.controls = false; // always disabled — using custom controls
131
328
  lastMuted.current = muted;
132
- videoRef.current.controls = controls;
133
329
  if (startTime !== null) {
134
330
  try {
135
331
  videoRef.current.currentTime = startTime;
@@ -143,16 +339,16 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
143
339
  try {
144
340
  const playPromise = videoRef.current.play();
145
341
  if (playPromise !== undefined) {
146
- playPromise
147
- .then(() => {
148
- setIsPlayingOnHover(true);
149
- })
150
- .catch((err) => {
342
+ playPromise.then(() => setIsPlayingOnHover(true)).catch((err) => {
151
343
  console.error("Autoplay prevented:", err);
152
344
  setIsPlayingOnHover(false);
153
- if (err.name === "NotAllowedError") {
154
- console.error("Waiting for user interaction to enable playback");
155
- }
345
+ const handleFirstInteraction = () => {
346
+ if (videoRef.current && videoRef.current.paused) {
347
+ videoRef.current.play().then(() => setIsPlayingOnHover(true)).catch((e) => console.error("User interaction play failed:", e));
348
+ }
349
+ };
350
+ document.addEventListener("click", handleFirstInteraction, { once: true });
351
+ document.addEventListener("touchstart", handleFirstInteraction, { once: true });
156
352
  });
157
353
  }
158
354
  }
@@ -177,30 +373,15 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
177
373
  onError(e);
178
374
  }
179
375
  };
180
- // Setup event handlers
181
376
  (0, react_1.useEffect)(() => {
182
377
  if (!videoRef.current || eventHandlersAttached.current)
183
378
  return;
184
- // Play handler
185
- const handlePlay = () => {
186
- watchStartTime.current = videoRef.current.currentTime;
187
- wallClockStart.current = Date.now();
188
- if (onPlay)
189
- onPlay();
190
- };
191
- // Pause handler
192
- const handlePause = () => {
193
- logWatchTime();
194
- if (onPause)
195
- onPause(totalWatchTime.current);
196
- };
197
- // Ended handler
198
- const handleEnded = () => {
199
- logWatchTime();
200
- if (onEnded)
201
- onEnded(totalWatchTime.current);
202
- };
203
- // Time update / seek handler
379
+ const handlePlay = () => { watchStartTime.current = videoRef.current.currentTime; wallClockStart.current = Date.now(); if (onPlay)
380
+ onPlay(); };
381
+ const handlePause = () => { logWatchTime(); if (onPause)
382
+ onPause(totalWatchTime.current); };
383
+ const handleEnded = () => { logWatchTime(); if (onEnded)
384
+ onEnded(totalWatchTime.current); };
204
385
  const handleTimeUpdate = () => {
205
386
  const currentTime = videoRef.current.currentTime;
206
387
  if (Math.abs(currentTime - lastTime.current) > 2) {
@@ -210,20 +391,15 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
210
391
  wallClockStart.current = Date.now();
211
392
  }
212
393
  if (onSeek)
213
- onSeek({
214
- from: lastTime.current,
215
- to: currentTime,
216
- });
394
+ onSeek({ from: lastTime.current, to: currentTime });
217
395
  }
218
396
  lastTime.current = currentTime;
219
- // Check for end time
220
397
  if (endTime !== null && currentTime >= endTime) {
221
398
  videoRef.current.pause();
222
399
  if (onEnded)
223
400
  onEnded(totalWatchTime.current);
224
401
  }
225
402
  };
226
- // Rate change handler
227
403
  const handleRateChange = () => {
228
404
  const newRate = videoRef.current.playbackRate;
229
405
  if (newRate !== lastRate.current) {
@@ -232,24 +408,20 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
232
408
  lastRate.current = newRate;
233
409
  }
234
410
  };
235
- // Volume change handler
236
411
  const handleVolumeChange = () => {
237
412
  const volume = videoRef.current.volume;
238
413
  const isMuted = videoRef.current.muted;
239
- // Handle mute toggle first
240
414
  if (isMuted !== lastMuted.current) {
241
415
  if (onMuteToggle)
242
416
  onMuteToggle(isMuted);
243
417
  lastMuted.current = isMuted;
244
418
  }
245
- // Handle volume change
246
419
  if (volume !== lastVolume.current) {
247
420
  if (onVolumeChange)
248
421
  onVolumeChange(volume);
249
422
  lastVolume.current = volume;
250
423
  }
251
424
  };
252
- // Add all event listeners
253
425
  videoRef.current.addEventListener("play", handlePlay);
254
426
  videoRef.current.addEventListener("pause", handlePause);
255
427
  videoRef.current.addEventListener("ended", handleEnded);
@@ -257,7 +429,6 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
257
429
  videoRef.current.addEventListener("ratechange", handleRateChange);
258
430
  videoRef.current.addEventListener("volumechange", handleVolumeChange);
259
431
  eventHandlersAttached.current = true;
260
- // Clean up function
261
432
  return () => {
262
433
  if (videoRef.current) {
263
434
  videoRef.current.removeEventListener("play", handlePlay);
@@ -269,16 +440,7 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
269
440
  }
270
441
  eventHandlersAttached.current = false;
271
442
  };
272
- }, [
273
- onPlay,
274
- onPause,
275
- onEnded,
276
- onSeek,
277
- onRateChange,
278
- onVolumeChange,
279
- onMuteToggle,
280
- endTime,
281
- ]);
443
+ }, [onPlay, onPause, onEnded, onSeek, onRateChange, onVolumeChange, onMuteToggle, endTime]);
282
444
  (0, react_1.useEffect)(() => {
283
445
  if (!isPlayerReady || !videoRef.current)
284
446
  return;
@@ -286,27 +448,18 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
286
448
  if (playing && videoRef.current.paused) {
287
449
  const playPromise = videoRef.current.play();
288
450
  if (playPromise !== undefined) {
289
- playPromise
290
- .then(() => {
291
- setIsPlayingOnHover(true);
292
- })
293
- .catch((err) => {
451
+ playPromise.then(() => setIsPlayingOnHover(true)).catch((err) => {
294
452
  console.error("Play prevented on prop change:", err);
295
453
  setIsPlayingOnHover(false);
296
454
  if (err.name === "NotAllowedError") {
297
455
  const handleUserInteraction = () => {
298
456
  if (videoRef.current && videoRef.current.paused) {
299
- videoRef.current
300
- .play()
301
- .then(() => setIsPlayingOnHover(true))
302
- .catch((e) => console.error("User interaction play failed:", e));
457
+ videoRef.current.play().then(() => setIsPlayingOnHover(true)).catch((e) => console.error("User interaction play failed:", e));
303
458
  }
304
459
  document.removeEventListener("click", handleUserInteraction);
305
460
  document.removeEventListener("touchstart", handleUserInteraction);
306
461
  };
307
- document.addEventListener("click", handleUserInteraction, {
308
- once: true,
309
- });
462
+ document.addEventListener("click", handleUserInteraction, { once: true });
310
463
  document.addEventListener("touchstart", handleUserInteraction, { once: true });
311
464
  }
312
465
  });
@@ -321,17 +474,14 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
321
474
  console.error("Error updating play state:", err);
322
475
  }
323
476
  }, [playing, isPlayerReady]);
324
- (0, react_1.useEffect)(() => {
325
- if (videoRef.current) {
326
- videoRef.current.muted = muted;
327
- lastMuted.current = muted;
328
- }
329
- }, [muted]);
330
- (0, react_1.useEffect)(() => {
331
- if (videoRef.current) {
332
- videoRef.current.controls = controls;
333
- }
334
- }, [controls]);
477
+ (0, react_1.useEffect)(() => { if (videoRef.current) {
478
+ videoRef.current.muted = muted;
479
+ lastMuted.current = muted;
480
+ setUiMuted(muted);
481
+ } }, [muted]);
482
+ // Always disable native controls (custom controls handle UI)
483
+ (0, react_1.useEffect)(() => { if (videoRef.current)
484
+ videoRef.current.controls = false; }, [controls]);
335
485
  (0, react_1.useEffect)(() => {
336
486
  if (videoRef.current && isPlayerReady && startTime !== null) {
337
487
  try {
@@ -344,25 +494,7 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
344
494
  }
345
495
  }, [startTime, isPlayerReady]);
346
496
  (0, react_1.useEffect)(() => {
347
- const handleUserInteraction = () => {
348
- if (playing && videoRef.current && videoRef.current.paused) {
349
- videoRef.current
350
- .play()
351
- .then(() => setIsPlayingOnHover(true))
352
- .catch((e) => console.error("User interaction play failed:", e));
353
- }
354
- };
355
- document.addEventListener("click", handleUserInteraction);
356
- document.addEventListener("touchstart", handleUserInteraction);
357
- return () => {
358
- document.removeEventListener("click", handleUserInteraction);
359
- document.removeEventListener("touchstart", handleUserInteraction);
360
- };
361
- }, [playing]);
362
- (0, react_1.useEffect)(() => {
363
- if (typeof window !== "undefined" &&
364
- typeof navigator !== "undefined" &&
365
- url) {
497
+ if (typeof window !== "undefined" && typeof navigator !== "undefined" && url) {
366
498
  initShakaPlayer();
367
499
  }
368
500
  }, [url]);
@@ -370,28 +502,203 @@ const ShakaPlayer = (0, react_1.forwardRef)(({ url, playing = false, muted = fal
370
502
  return () => {
371
503
  if (playerInstance) {
372
504
  try {
373
- playerInstance
374
- .destroy()
375
- .then(() => {
376
- console.log("Shaka player destroyed cleanly");
377
- })
378
- .catch((e) => {
379
- console.error("Error destroying player:", e);
380
- });
505
+ playerInstance.destroy().then(() => { }).catch((e) => console.error("Error destroying player:", e));
381
506
  }
382
507
  catch (e) {
383
508
  console.error("Error calling destroy on player:", e);
384
509
  }
385
510
  }
386
- if (endTimeCheckInterval.current) {
511
+ if (endTimeCheckInterval.current)
387
512
  clearInterval(endTimeCheckInterval.current);
388
- }
513
+ clearTimeout(hideTimerRef.current);
389
514
  };
390
515
  }, [playerInstance]);
391
- const videoStyle = style && (style.width || style.height)
392
- ? style
393
- : { display: "block", width: "100%", height: "100%" };
394
- return ((0, jsx_runtime_1.jsx)("video", { poster: poster, ref: videoRef, style: videoStyle, muted: muted, controls: controls, preload: "auto", disablePictureInPicture: true }));
516
+ // ── Render ────────────────────────────────────────────────────────────────
517
+ const containerStyle = {
518
+ position: "relative",
519
+ backgroundColor: "#000",
520
+ borderRadius: "8px",
521
+ overflow: "hidden",
522
+ ...(style.width ? { width: style.width } : { width: "100%" }),
523
+ ...(style.height ? { height: style.height } : {}),
524
+ };
525
+ const played = uiDuration > 0 ? uiCurrentTime / uiDuration : 0;
526
+ return ((0, jsx_runtime_1.jsxs)("div", { ref: containerRef, style: containerStyle, onMouseMove: handleContainerMouseMove, onMouseLeave: handleContainerMouseLeave, onClick: handleContainerClick, children: [(0, jsx_runtime_1.jsx)("video", { poster: poster, ref: videoRef, style: { display: "block", width: "100%" }, muted: muted, controls: false, preload: "auto", disablePictureInPicture: true }), controls && showControls && ((0, jsx_runtime_1.jsxs)("div", { style: ctrlStyles.container, children: [(0, jsx_runtime_1.jsx)("div", { style: ctrlStyles.seekbarRow, children: (0, jsx_runtime_1.jsxs)("div", { ref: seekbarRef, style: ctrlStyles.seekbarTrack, onMouseDown: (e) => { setSeekingUI(true); seekToClientX(e.clientX); }, children: [uiDuration > 0 && segmentBands.map((seg, i) => {
527
+ const isHovered = hoveredSegmentId === seg.id;
528
+ const isActive = activeSegmentId === seg.id;
529
+ const baseColor = seg.color ?? DEFAULT_SEGMENT_COLORS[i % DEFAULT_SEGMENT_COLORS.length];
530
+ return ((0, jsx_runtime_1.jsx)("div", { title: seg.label, onMouseEnter: () => setHoveredSegmentId(seg.id), onMouseLeave: () => setHoveredSegmentId(null), onMouseDown: (e) => handleSegmentMouseDown(e, seg), style: {
531
+ ...ctrlStyles.segmentBand,
532
+ left: `${(seg.start / uiDuration) * 100}%`,
533
+ width: `${((seg.end - seg.start) / uiDuration) * 100}%`,
534
+ backgroundColor: baseColor,
535
+ ...(isHovered && !isActive && { transform: "translateY(-4px)", zIndex: 2, boxShadow: "0 4px 8px rgba(0,0,0,0.5)" }),
536
+ ...(isActive && !isHovered && { transform: "translateY(-6px)", zIndex: 3, boxShadow: "0 6px 12px rgba(0,0,0,0.6)" }),
537
+ ...(isHovered && isActive && { transform: "translateY(-8px)", zIndex: 4, boxShadow: "0 8px 16px rgba(0,0,0,0.7)" }),
538
+ } }, seg.id));
539
+ }), uiDuration > 0 && segmentBands.slice(1).map((seg, i) => ((0, jsx_runtime_1.jsx)("div", { style: { ...ctrlStyles.segmentMarker, left: `${(seg.start / uiDuration) * 100}%` } }, `marker-${i}`))), (0, jsx_runtime_1.jsx)("div", { style: { ...ctrlStyles.seekbarFill, width: `${played * 100}%` } }), (0, jsx_runtime_1.jsx)("div", { style: { ...ctrlStyles.seekbarThumb, left: `${played * 100}%` } })] }) }), (0, jsx_runtime_1.jsxs)("div", { style: ctrlStyles.controlsRow, children: [(0, jsx_runtime_1.jsxs)("div", { style: ctrlStyles.controlsLeft, children: [(0, jsx_runtime_1.jsx)(CtrlBtn, { onClick: handleTogglePlay, label: uiPlaying ? "Pause" : "Play", children: uiPlaying ? (0, jsx_runtime_1.jsx)(IconPause, {}) : (0, jsx_runtime_1.jsx)(IconPlay, {}) }), segments.length > 0 && ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(CtrlBtn, { onClick: handleSkipPrev, label: "Previous segment", disabled: activeIdx <= 0 && activeSegmentId === segmentBands[0]?.id, children: (0, jsx_runtime_1.jsx)(IconSkipPrev, {}) }), (0, jsx_runtime_1.jsx)(CtrlBtn, { onClick: handleSkipNext, label: "Next segment", disabled: !nextSegment, children: (0, jsx_runtime_1.jsx)(IconSkipNext, {}) })] })), (0, jsx_runtime_1.jsx)(CtrlBtn, { onClick: handleToggleMute, label: uiMuted ? "Unmute" : "Mute", children: uiMuted ? (0, jsx_runtime_1.jsx)(IconMuted, {}) : (0, jsx_runtime_1.jsx)(IconVolume, {}) }), (0, jsx_runtime_1.jsxs)("div", { style: ctrlStyles.time, children: [formatTime(uiCurrentTime), " / ", formatTime(uiDuration)] })] }), segments.length > 0 && activeSegment && ((0, jsx_runtime_1.jsx)("div", { style: ctrlStyles.controlsCenter, children: (0, jsx_runtime_1.jsx)("span", { style: ctrlStyles.segmentLabel, children: activeSegment.label }) })), (0, jsx_runtime_1.jsxs)("div", { style: ctrlStyles.controlsRight, children: [(0, jsx_runtime_1.jsxs)("div", { ref: speedMenuRef, style: { position: "relative", flexShrink: 0 }, children: [(0, jsx_runtime_1.jsx)(SpeedBtn, { label: uiPlaybackRate === 1 ? "1x" : `${uiPlaybackRate}x`, onClick: () => setShowSpeedMenu((v) => !v) }), showSpeedMenu && ((0, jsx_runtime_1.jsx)("div", { style: ctrlStyles.speedMenu, children: SPEED_OPTIONS.map((rate) => ((0, jsx_runtime_1.jsx)(SpeedOption, { rate: rate, active: uiPlaybackRate === rate, onClick: () => handleSpeedChange(rate) }, rate))) }))] }), (0, jsx_runtime_1.jsx)(CtrlBtn, { onClick: handleFullscreen, label: isFullscreen ? "Exit fullscreen" : "Fullscreen", children: isFullscreen ? (0, jsx_runtime_1.jsx)(IconExitFullscreen, {}) : (0, jsx_runtime_1.jsx)(IconFullscreen, {}) })] })] })] }))] }));
395
540
  });
541
+ // ─── Speed sub-components ─────────────────────────────────────────────────────
542
+ const SpeedBtn = ({ label, onClick }) => {
543
+ const [hovered, setHovered] = (0, react_1.useState)(false);
544
+ return ((0, jsx_runtime_1.jsx)("button", { onClick: onClick, "aria-label": "Playback speed", onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
545
+ background: hovered ? "rgba(255,255,255,0.1)" : "none",
546
+ border: `1px solid ${hovered ? "rgba(255,255,255,0.4)" : "rgba(255,255,255,0.18)"}`,
547
+ borderRadius: "8px",
548
+ color: "#fff",
549
+ fontSize: "12px",
550
+ fontWeight: 600,
551
+ cursor: "pointer",
552
+ padding: "5px 8px",
553
+ minWidth: "38px",
554
+ textAlign: "center",
555
+ transition: "border-color 0.15s ease, background-color 0.15s ease",
556
+ }, children: label }));
557
+ };
558
+ const SpeedOption = ({ rate, active, onClick }) => {
559
+ const [hovered, setHovered] = (0, react_1.useState)(false);
560
+ return ((0, jsx_runtime_1.jsx)("button", { onClick: onClick, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), style: {
561
+ display: "block",
562
+ width: "100%",
563
+ background: active || hovered ? "rgba(255,255,255,0.1)" : "none",
564
+ border: "none",
565
+ color: active ? "#fff" : "#ccc",
566
+ fontSize: "13px",
567
+ fontWeight: active ? 600 : 400,
568
+ padding: "7px 14px",
569
+ textAlign: "left",
570
+ cursor: "pointer",
571
+ whiteSpace: "nowrap",
572
+ transition: "background-color 0.1s ease",
573
+ }, children: rate === 1 ? "Normal" : `${rate}x` }));
574
+ };
575
+ // ─── Styles ───────────────────────────────────────────────────────────────────
576
+ const ctrlStyles = {
577
+ container: {
578
+ position: "absolute",
579
+ bottom: 0,
580
+ left: 0,
581
+ right: 0,
582
+ backgroundColor: "rgba(17, 17, 17, 0.92)",
583
+ paddingBottom: "4px",
584
+ zIndex: 10,
585
+ transition: "opacity 0.25s ease",
586
+ },
587
+ seekbarRow: {
588
+ padding: "10px 12px 6px",
589
+ },
590
+ seekbarTrack: {
591
+ position: "relative",
592
+ height: "4px",
593
+ backgroundColor: "rgba(255,255,255,0.2)",
594
+ borderRadius: "2px",
595
+ cursor: "pointer",
596
+ overflow: "visible",
597
+ },
598
+ segmentBand: {
599
+ position: "absolute",
600
+ top: 0,
601
+ height: "100%",
602
+ cursor: "pointer",
603
+ borderRadius: "2px",
604
+ transition: "transform 0.15s ease, box-shadow 0.15s ease",
605
+ zIndex: 1,
606
+ },
607
+ segmentMarker: {
608
+ position: "absolute",
609
+ top: "-3px",
610
+ width: "2px",
611
+ height: "10px",
612
+ backgroundColor: "#fff",
613
+ transform: "translateX(-50%)",
614
+ pointerEvents: "none",
615
+ borderRadius: "1px",
616
+ zIndex: 5,
617
+ },
618
+ seekbarFill: {
619
+ position: "absolute",
620
+ top: 0,
621
+ left: 0,
622
+ height: "100%",
623
+ backgroundColor: "rgba(255,255,255,0.85)",
624
+ borderRadius: "2px",
625
+ pointerEvents: "none",
626
+ zIndex: 6,
627
+ },
628
+ seekbarThumb: {
629
+ position: "absolute",
630
+ top: "50%",
631
+ width: "12px",
632
+ height: "12px",
633
+ backgroundColor: "#fff",
634
+ borderRadius: "50%",
635
+ transform: "translate(-50%, -50%)",
636
+ pointerEvents: "none",
637
+ boxShadow: "0 0 4px rgba(0,0,0,0.6)",
638
+ zIndex: 7,
639
+ },
640
+ controlsRow: {
641
+ display: "flex",
642
+ alignItems: "center",
643
+ justifyContent: "space-between",
644
+ padding: "2px 8px 4px",
645
+ gap: "8px",
646
+ },
647
+ controlsLeft: {
648
+ display: "flex",
649
+ alignItems: "center",
650
+ gap: "6px",
651
+ flexShrink: 0,
652
+ },
653
+ controlsCenter: {
654
+ display: "flex",
655
+ alignItems: "center",
656
+ flex: 1,
657
+ overflow: "hidden",
658
+ justifyContent: "flex-start",
659
+ paddingLeft: "8px",
660
+ },
661
+ segmentLabel: {
662
+ color: "#e0e0e0",
663
+ fontSize: "12px",
664
+ fontWeight: 500,
665
+ whiteSpace: "nowrap",
666
+ overflow: "hidden",
667
+ textOverflow: "ellipsis",
668
+ maxWidth: "220px",
669
+ padding: "5px 8px",
670
+ border: "1px solid rgba(255,255,255,0.18)",
671
+ borderRadius: "8px",
672
+ display: "inline-block",
673
+ },
674
+ controlsRight: {
675
+ display: "flex",
676
+ alignItems: "center",
677
+ gap: "6px",
678
+ flexShrink: 0,
679
+ },
680
+ time: {
681
+ color: "#ccc",
682
+ fontSize: "12px",
683
+ fontVariantNumeric: "tabular-nums",
684
+ whiteSpace: "nowrap",
685
+ padding: "5px 8px",
686
+ border: "1px solid rgba(255,255,255,0.18)",
687
+ borderRadius: "8px",
688
+ flexShrink: 0,
689
+ },
690
+ speedMenu: {
691
+ position: "absolute",
692
+ bottom: "calc(100% + 6px)",
693
+ right: 0,
694
+ backgroundColor: "#1e1e1e",
695
+ border: "1px solid rgba(255,255,255,0.15)",
696
+ borderRadius: "8px",
697
+ overflow: "hidden",
698
+ zIndex: 20,
699
+ minWidth: "90px",
700
+ boxShadow: "0 4px 16px rgba(0,0,0,0.6)",
701
+ },
702
+ };
396
703
  exports.default = ShakaPlayer;
397
704
  //# sourceMappingURL=ShakaPlayer.js.map