@internetarchive/elements 0.2.14-webdev-8969.0 → 0.2.14-webdev-9022.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (284) hide show
  1. package/README.md +20 -0
  2. package/dist/src/elements/ia-image-viewer/ia-image-viewer.d.ts +147 -0
  3. package/dist/src/elements/ia-image-viewer/ia-image-viewer.d.ts.map +1 -0
  4. package/dist/src/elements/ia-image-viewer/ia-image-viewer.js +533 -0
  5. package/dist/src/elements/ia-image-viewer/ia-image-viewer.js.map +1 -0
  6. package/dist/src/elements/ia-image-viewer/ia-imgview-controls.d.ts +22 -0
  7. package/dist/src/elements/ia-image-viewer/ia-imgview-controls.d.ts.map +1 -0
  8. package/dist/src/elements/ia-image-viewer/ia-imgview-controls.js +145 -0
  9. package/dist/src/elements/ia-image-viewer/ia-imgview-controls.js.map +1 -0
  10. package/dist/src/elements/ia-image-viewer/ia-imgview-slide.d.ts +44 -0
  11. package/dist/src/elements/ia-image-viewer/ia-imgview-slide.d.ts.map +1 -0
  12. package/dist/src/elements/ia-image-viewer/ia-imgview-slide.js +213 -0
  13. package/dist/src/elements/ia-image-viewer/ia-imgview-slide.js.map +1 -0
  14. package/dist/src/elements/ia-image-viewer/image-viewer-gestures.d.ts +79 -0
  15. package/dist/src/elements/ia-image-viewer/image-viewer-gestures.d.ts.map +1 -0
  16. package/dist/src/elements/ia-image-viewer/image-viewer-gestures.js +254 -0
  17. package/dist/src/elements/ia-image-viewer/image-viewer-gestures.js.map +1 -0
  18. package/dist/src/elements/ia-image-viewer/models.d.ts +20 -0
  19. package/dist/src/elements/ia-image-viewer/models.d.ts.map +1 -0
  20. package/dist/src/elements/ia-image-viewer/models.js.map +1 -0
  21. package/dist/src/elements/ia-item-navigator/ia-item-navigator.d.ts +97 -0
  22. package/dist/src/elements/ia-item-navigator/ia-item-navigator.d.ts.map +1 -0
  23. package/dist/src/elements/ia-item-navigator/ia-item-navigator.js +588 -0
  24. package/dist/src/elements/ia-item-navigator/ia-item-navigator.js.map +1 -0
  25. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.d.ts +39 -0
  26. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.d.ts.map +1 -0
  27. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.js +249 -0
  28. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.js.map +1 -0
  29. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.d.ts +55 -0
  30. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.d.ts.map +1 -0
  31. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.js +394 -0
  32. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.js.map +1 -0
  33. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.d.ts +20 -0
  34. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.d.ts.map +1 -0
  35. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.js +102 -0
  36. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.js.map +1 -0
  37. package/dist/src/elements/ia-item-navigator/icons/collapse-sidebar.svg +7 -0
  38. package/dist/src/elements/ia-item-navigator/icons/ellipses.svg +7 -0
  39. package/dist/src/elements/ia-item-navigator/icons.d.ts +13 -0
  40. package/dist/src/elements/ia-item-navigator/icons.d.ts.map +1 -0
  41. package/dist/src/elements/ia-item-navigator/icons.js +16 -0
  42. package/dist/src/elements/ia-item-navigator/icons.js.map +1 -0
  43. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.d.ts +41 -0
  44. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.d.ts.map +1 -0
  45. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.js +2 -0
  46. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.js.map +1 -0
  47. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.d.ts +23 -0
  48. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.d.ts.map +1 -0
  49. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.js +2 -0
  50. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.js.map +1 -0
  51. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.d.ts +47 -0
  52. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.d.ts.map +1 -0
  53. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.js +352 -0
  54. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.js.map +1 -0
  55. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.d.ts +22 -0
  56. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.d.ts.map +1 -0
  57. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.js +137 -0
  58. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.js.map +1 -0
  59. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.d.ts +40 -0
  60. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.d.ts.map +1 -0
  61. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js +217 -0
  62. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js.map +1 -0
  63. package/dist/src/elements/ia-item-navigator/menus/icons/email.svg +6 -0
  64. package/dist/src/elements/ia-item-navigator/menus/icons/facebook.svg +6 -0
  65. package/dist/src/elements/ia-item-navigator/menus/icons/link.svg +6 -0
  66. package/dist/src/elements/ia-item-navigator/menus/icons/list.svg +3 -0
  67. package/dist/src/elements/ia-item-navigator/menus/icons/pinterest.svg +6 -0
  68. package/dist/src/elements/ia-item-navigator/menus/icons/share.svg +6 -0
  69. package/dist/src/elements/ia-item-navigator/menus/icons/sort-asc.svg +22 -0
  70. package/dist/src/elements/ia-item-navigator/menus/icons/sort-desc.svg +21 -0
  71. package/dist/src/elements/ia-item-navigator/menus/icons/sort-neutral.svg +13 -0
  72. package/dist/src/elements/ia-item-navigator/menus/icons/tumblr.svg +6 -0
  73. package/dist/src/elements/ia-item-navigator/menus/icons/twitter.svg +6 -0
  74. package/dist/src/elements/ia-item-navigator/menus/icons/viewable-files.svg +6 -0
  75. package/dist/src/elements/ia-item-navigator/menus/models.d.ts +17 -0
  76. package/dist/src/elements/ia-item-navigator/menus/models.d.ts.map +1 -0
  77. package/dist/src/elements/ia-item-navigator/menus/models.js.map +1 -0
  78. package/dist/src/elements/ia-item-navigator/menus/share-icons.d.ts +16 -0
  79. package/dist/src/elements/ia-item-navigator/menus/share-icons.d.ts.map +1 -0
  80. package/dist/src/elements/ia-item-navigator/menus/share-icons.js +23 -0
  81. package/dist/src/elements/ia-item-navigator/menus/share-icons.js.map +1 -0
  82. package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts +51 -5
  83. package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts.map +1 -1
  84. package/dist/src/elements/ia-status-indicator/ia-status-indicator.js +156 -16
  85. package/dist/src/elements/ia-status-indicator/ia-status-indicator.js.map +1 -1
  86. package/dist/src/elements/ia-status-indicator/icons/audio.svg +5 -0
  87. package/dist/src/elements/ia-status-indicator/icons/collection.svg +5 -0
  88. package/dist/src/elements/ia-status-indicator/icons/etree.svg +5 -0
  89. package/dist/src/elements/ia-status-indicator/icons/images.svg +6 -0
  90. package/dist/src/elements/ia-status-indicator/icons/search.svg +10 -0
  91. package/dist/src/elements/ia-status-indicator/icons/software.svg +6 -0
  92. package/dist/src/elements/ia-status-indicator/icons/texts.svg +6 -0
  93. package/dist/src/elements/ia-status-indicator/icons/tv.svg +5 -0
  94. package/dist/src/elements/ia-status-indicator/icons/video.svg +6 -0
  95. package/dist/src/elements/ia-status-indicator/icons/web.svg +6 -0
  96. package/dist/src/elements/index.d.ts +5 -27
  97. package/dist/src/elements/index.d.ts.map +1 -1
  98. package/dist/src/elements/index.js +5 -27
  99. package/dist/src/elements/index.js.map +1 -1
  100. package/dist/src/util/masked-icon.d.ts +24 -0
  101. package/dist/src/util/masked-icon.d.ts.map +1 -0
  102. package/dist/src/util/masked-icon.js +30 -0
  103. package/dist/src/util/masked-icon.js.map +1 -0
  104. package/dist/src/util/prefers-reduced-motion.d.ts +10 -0
  105. package/dist/src/util/prefers-reduced-motion.d.ts.map +1 -0
  106. package/dist/src/util/prefers-reduced-motion.js +12 -0
  107. package/dist/src/util/prefers-reduced-motion.js.map +1 -0
  108. package/package.json +1 -1
  109. package/dist/src/elements/ia-audio-element/ia-audio-element.d.ts +0 -72
  110. package/dist/src/elements/ia-audio-element/ia-audio-element.d.ts.map +0 -1
  111. package/dist/src/elements/ia-audio-element/ia-audio-element.js +0 -173
  112. package/dist/src/elements/ia-audio-element/ia-audio-element.js.map +0 -1
  113. package/dist/src/elements/ia-audio-element/models.d.ts +0 -13
  114. package/dist/src/elements/ia-audio-element/models.d.ts.map +0 -1
  115. package/dist/src/elements/ia-audio-element/models.js.map +0 -1
  116. package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.d.ts +0 -3
  117. package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.d.ts.map +0 -1
  118. package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.js +0 -28
  119. package/dist/src/elements/ia-expandable-search-bar/assets/clear-results.js.map +0 -1
  120. package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.d.ts +0 -3
  121. package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.d.ts.map +0 -1
  122. package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.js +0 -26
  123. package/dist/src/elements/ia-expandable-search-bar/assets/disclosure.js.map +0 -1
  124. package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.d.ts +0 -3
  125. package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.d.ts.map +0 -1
  126. package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.js +0 -22
  127. package/dist/src/elements/ia-expandable-search-bar/assets/magnifying-glass.js.map +0 -1
  128. package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.d.ts +0 -53
  129. package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.d.ts.map +0 -1
  130. package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.js +0 -352
  131. package/dist/src/elements/ia-expandable-search-bar/ia-expandable-search-bar.js.map +0 -1
  132. package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.d.ts +0 -19
  133. package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.d.ts.map +0 -1
  134. package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.js +0 -115
  135. package/dist/src/elements/ia-expandable-search-bar/ia-quick-search.js.map +0 -1
  136. package/dist/src/elements/ia-expandable-search-bar/models.d.ts +0 -13
  137. package/dist/src/elements/ia-expandable-search-bar/models.d.ts.map +0 -1
  138. package/dist/src/elements/ia-expandable-search-bar/models.js.map +0 -1
  139. package/dist/src/elements/ia-playback-controls/assets/next-section.d.ts +0 -3
  140. package/dist/src/elements/ia-playback-controls/assets/next-section.d.ts.map +0 -1
  141. package/dist/src/elements/ia-playback-controls/assets/next-section.js +0 -16
  142. package/dist/src/elements/ia-playback-controls/assets/next-section.js.map +0 -1
  143. package/dist/src/elements/ia-playback-controls/assets/pause.d.ts +0 -3
  144. package/dist/src/elements/ia-playback-controls/assets/pause.d.ts.map +0 -1
  145. package/dist/src/elements/ia-playback-controls/assets/pause.js +0 -17
  146. package/dist/src/elements/ia-playback-controls/assets/pause.js.map +0 -1
  147. package/dist/src/elements/ia-playback-controls/assets/play.d.ts +0 -3
  148. package/dist/src/elements/ia-playback-controls/assets/play.d.ts.map +0 -1
  149. package/dist/src/elements/ia-playback-controls/assets/play.js +0 -18
  150. package/dist/src/elements/ia-playback-controls/assets/play.js.map +0 -1
  151. package/dist/src/elements/ia-playback-controls/assets/playback-speed.d.ts +0 -3
  152. package/dist/src/elements/ia-playback-controls/assets/playback-speed.d.ts.map +0 -1
  153. package/dist/src/elements/ia-playback-controls/assets/playback-speed.js +0 -28
  154. package/dist/src/elements/ia-playback-controls/assets/playback-speed.js.map +0 -1
  155. package/dist/src/elements/ia-playback-controls/assets/previous-section.d.ts +0 -3
  156. package/dist/src/elements/ia-playback-controls/assets/previous-section.d.ts.map +0 -1
  157. package/dist/src/elements/ia-playback-controls/assets/previous-section.js +0 -16
  158. package/dist/src/elements/ia-playback-controls/assets/previous-section.js.map +0 -1
  159. package/dist/src/elements/ia-playback-controls/assets/replay.d.ts +0 -3
  160. package/dist/src/elements/ia-playback-controls/assets/replay.d.ts.map +0 -1
  161. package/dist/src/elements/ia-playback-controls/assets/replay.js +0 -28
  162. package/dist/src/elements/ia-playback-controls/assets/replay.js.map +0 -1
  163. package/dist/src/elements/ia-playback-controls/assets/skip-ahead.d.ts +0 -3
  164. package/dist/src/elements/ia-playback-controls/assets/skip-ahead.d.ts.map +0 -1
  165. package/dist/src/elements/ia-playback-controls/assets/skip-ahead.js +0 -29
  166. package/dist/src/elements/ia-playback-controls/assets/skip-ahead.js.map +0 -1
  167. package/dist/src/elements/ia-playback-controls/assets/volume-full.d.ts +0 -3
  168. package/dist/src/elements/ia-playback-controls/assets/volume-full.d.ts.map +0 -1
  169. package/dist/src/elements/ia-playback-controls/assets/volume-full.js +0 -19
  170. package/dist/src/elements/ia-playback-controls/assets/volume-full.js.map +0 -1
  171. package/dist/src/elements/ia-playback-controls/assets/volume-medium.d.ts +0 -3
  172. package/dist/src/elements/ia-playback-controls/assets/volume-medium.d.ts.map +0 -1
  173. package/dist/src/elements/ia-playback-controls/assets/volume-medium.js +0 -24
  174. package/dist/src/elements/ia-playback-controls/assets/volume-medium.js.map +0 -1
  175. package/dist/src/elements/ia-playback-controls/assets/volume-mute.d.ts +0 -3
  176. package/dist/src/elements/ia-playback-controls/assets/volume-mute.d.ts.map +0 -1
  177. package/dist/src/elements/ia-playback-controls/assets/volume-mute.js +0 -35
  178. package/dist/src/elements/ia-playback-controls/assets/volume-mute.js.map +0 -1
  179. package/dist/src/elements/ia-playback-controls/ia-playback-controls.d.ts +0 -57
  180. package/dist/src/elements/ia-playback-controls/ia-playback-controls.d.ts.map +0 -1
  181. package/dist/src/elements/ia-playback-controls/ia-playback-controls.js +0 -320
  182. package/dist/src/elements/ia-playback-controls/ia-playback-controls.js.map +0 -1
  183. package/dist/src/elements/ia-playback-controls/models.d.ts +0 -13
  184. package/dist/src/elements/ia-playback-controls/models.d.ts.map +0 -1
  185. package/dist/src/elements/ia-playback-controls/models.js +0 -12
  186. package/dist/src/elements/ia-playback-controls/models.js.map +0 -1
  187. package/dist/src/elements/ia-radio-player/assets/next-result.d.ts +0 -3
  188. package/dist/src/elements/ia-radio-player/assets/next-result.d.ts.map +0 -1
  189. package/dist/src/elements/ia-radio-player/assets/next-result.js +0 -27
  190. package/dist/src/elements/ia-radio-player/assets/next-result.js.map +0 -1
  191. package/dist/src/elements/ia-radio-player/assets/previous-result.d.ts +0 -3
  192. package/dist/src/elements/ia-radio-player/assets/previous-result.d.ts.map +0 -1
  193. package/dist/src/elements/ia-radio-player/assets/previous-result.js +0 -27
  194. package/dist/src/elements/ia-radio-player/assets/previous-result.js.map +0 -1
  195. package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts +0 -130
  196. package/dist/src/elements/ia-radio-player/ia-radio-player.d.ts.map +0 -1
  197. package/dist/src/elements/ia-radio-player/ia-radio-player.js +0 -748
  198. package/dist/src/elements/ia-radio-player/ia-radio-player.js.map +0 -1
  199. package/dist/src/elements/ia-radio-player/ia-search-results-switcher.d.ts +0 -22
  200. package/dist/src/elements/ia-radio-player/ia-search-results-switcher.d.ts.map +0 -1
  201. package/dist/src/elements/ia-radio-player/ia-search-results-switcher.js +0 -137
  202. package/dist/src/elements/ia-radio-player/ia-search-results-switcher.js.map +0 -1
  203. package/dist/src/elements/ia-radio-player/models.d.ts +0 -29
  204. package/dist/src/elements/ia-radio-player/models.d.ts.map +0 -1
  205. package/dist/src/elements/ia-radio-player/models.js +0 -2
  206. package/dist/src/elements/ia-radio-player/models.js.map +0 -1
  207. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.d.ts +0 -38
  208. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.d.ts.map +0 -1
  209. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.js +0 -64
  210. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-backend.js.map +0 -1
  211. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.d.ts +0 -94
  212. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.d.ts.map +0 -1
  213. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.js +0 -56
  214. package/dist/src/elements/ia-radio-player/search/backends/full-text-search-response.js.map +0 -1
  215. package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.d.ts +0 -15
  216. package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.d.ts.map +0 -1
  217. package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.js +0 -26
  218. package/dist/src/elements/ia-radio-player/search/backends/local-search-backend.js.map +0 -1
  219. package/dist/src/elements/ia-radio-player/search/backends/search-backend.d.ts +0 -12
  220. package/dist/src/elements/ia-radio-player/search/backends/search-backend.d.ts.map +0 -1
  221. package/dist/src/elements/ia-radio-player/search/backends/search-backend.js +0 -2
  222. package/dist/src/elements/ia-radio-player/search/backends/search-backend.js.map +0 -1
  223. package/dist/src/elements/ia-radio-player/search/models.d.ts +0 -38
  224. package/dist/src/elements/ia-radio-player/search/models.d.ts.map +0 -1
  225. package/dist/src/elements/ia-radio-player/search/models.js +0 -17
  226. package/dist/src/elements/ia-radio-player/search/models.js.map +0 -1
  227. package/dist/src/elements/ia-radio-player/search/search-handler.d.ts +0 -49
  228. package/dist/src/elements/ia-radio-player/search/search-handler.d.ts.map +0 -1
  229. package/dist/src/elements/ia-radio-player/search/search-handler.js +0 -128
  230. package/dist/src/elements/ia-radio-player/search/search-handler.js.map +0 -1
  231. package/dist/src/elements/ia-radio-player/search/search-helper.d.ts +0 -9
  232. package/dist/src/elements/ia-radio-player/search/search-helper.d.ts.map +0 -1
  233. package/dist/src/elements/ia-radio-player/search/search-helper.js +0 -15
  234. package/dist/src/elements/ia-radio-player/search/search-helper.js.map +0 -1
  235. package/dist/src/elements/ia-radio-player/search/transcript-index.d.ts +0 -45
  236. package/dist/src/elements/ia-radio-player/search/transcript-index.d.ts.map +0 -1
  237. package/dist/src/elements/ia-radio-player/search/transcript-index.js +0 -48
  238. package/dist/src/elements/ia-radio-player/search/transcript-index.js.map +0 -1
  239. package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.d.ts +0 -3
  240. package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.d.ts.map +0 -1
  241. package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.js +0 -18
  242. package/dist/src/elements/ia-scrubber-bar/assets/next-section-marker.js.map +0 -1
  243. package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.d.ts +0 -3
  244. package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.d.ts.map +0 -1
  245. package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.js +0 -18
  246. package/dist/src/elements/ia-scrubber-bar/assets/previous-section-marker.js.map +0 -1
  247. package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.d.ts +0 -82
  248. package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.d.ts.map +0 -1
  249. package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.js +0 -387
  250. package/dist/src/elements/ia-scrubber-bar/ia-scrubber-bar.js.map +0 -1
  251. package/dist/src/elements/ia-scrubber-bar/ia-section-marker.d.ts +0 -16
  252. package/dist/src/elements/ia-scrubber-bar/ia-section-marker.d.ts.map +0 -1
  253. package/dist/src/elements/ia-scrubber-bar/ia-section-marker.js +0 -109
  254. package/dist/src/elements/ia-scrubber-bar/ia-section-marker.js.map +0 -1
  255. package/dist/src/elements/ia-scrubber-bar/models.d.ts +0 -21
  256. package/dist/src/elements/ia-scrubber-bar/models.d.ts.map +0 -1
  257. package/dist/src/elements/ia-scrubber-bar/models.js +0 -20
  258. package/dist/src/elements/ia-scrubber-bar/models.js.map +0 -1
  259. package/dist/src/elements/ia-transcript-view/duration-formatter.d.ts +0 -13
  260. package/dist/src/elements/ia-transcript-view/duration-formatter.d.ts.map +0 -1
  261. package/dist/src/elements/ia-transcript-view/duration-formatter.js +0 -25
  262. package/dist/src/elements/ia-transcript-view/duration-formatter.js.map +0 -1
  263. package/dist/src/elements/ia-transcript-view/ia-transcript-entry.d.ts +0 -25
  264. package/dist/src/elements/ia-transcript-view/ia-transcript-entry.d.ts.map +0 -1
  265. package/dist/src/elements/ia-transcript-view/ia-transcript-entry.js +0 -51
  266. package/dist/src/elements/ia-transcript-view/ia-transcript-entry.js.map +0 -1
  267. package/dist/src/elements/ia-transcript-view/ia-transcript-view.d.ts +0 -81
  268. package/dist/src/elements/ia-transcript-view/ia-transcript-view.d.ts.map +0 -1
  269. package/dist/src/elements/ia-transcript-view/ia-transcript-view.js +0 -546
  270. package/dist/src/elements/ia-transcript-view/ia-transcript-view.js.map +0 -1
  271. package/dist/src/elements/ia-transcript-view/models.d.ts +0 -34
  272. package/dist/src/elements/ia-transcript-view/models.d.ts.map +0 -1
  273. package/dist/src/elements/ia-transcript-view/models.js +0 -38
  274. package/dist/src/elements/ia-transcript-view/models.js.map +0 -1
  275. package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.d.ts +0 -62
  276. package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.d.ts.map +0 -1
  277. package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.js +0 -217
  278. package/dist/src/elements/ia-waveform-progress/ia-waveform-progress.js.map +0 -1
  279. package/dist/src/elements/ia-waveform-progress/models.d.ts +0 -13
  280. package/dist/src/elements/ia-waveform-progress/models.d.ts.map +0 -1
  281. package/dist/src/elements/ia-waveform-progress/models.js +0 -2
  282. package/dist/src/elements/ia-waveform-progress/models.js.map +0 -1
  283. /package/dist/src/elements/{ia-audio-element → ia-image-viewer}/models.js +0 -0
  284. /package/dist/src/elements/{ia-expandable-search-bar → ia-item-navigator/menus}/models.js +0 -0
@@ -1,546 +0,0 @@
1
- var IATranscriptView_1;
2
- import { __decorate } from "tslib";
3
- import { css, html, LitElement, nothing, } from 'lit';
4
- import { customElement, property, query, state } from 'lit/decorators.js';
5
- import { ifDefined } from 'lit/directives/if-defined.js';
6
- import { msg } from '@lit/localize';
7
- import { formatDuration } from './duration-formatter.js';
8
- import './ia-transcript-entry.js';
9
- /**
10
- * Event names emitted by this component
11
- */
12
- const Events = {
13
- TranscriptEntrySelected: 'transcriptEntrySelected',
14
- CurrentEntriesUpdated: 'currentEntriesUpdated',
15
- AutoScrollChanged: 'autoScrollChanged',
16
- };
17
- /** How long a scroll animation runs, in seconds */
18
- const SCROLL_DURATION_SECONDS = 1;
19
- /**
20
- * A scrolling transcript that follows playback.
21
- *
22
- * It keeps itself scrolled to whatever is being spoken, steps aside when the
23
- * listener scrolls by hand, and picks the job back up once they've stopped.
24
- */
25
- let IATranscriptView = IATranscriptView_1 = class IATranscriptView extends LitElement {
26
- constructor() {
27
- super(...arguments);
28
- /** Playback position, in seconds into the track */
29
- this.currentTime = 0;
30
- /** How much room to leave above the entry being spoken, in pixels */
31
- this.topContextHeight = 50;
32
- /** How much room to leave below the entry being spoken, in pixels */
33
- this.bottomContextHeight = 50;
34
- /** Whether the transcript follows playback */
35
- this.autoScroll = true;
36
- /** Which search result is currently being looked at */
37
- this.selectedSearchResultIndex = 0;
38
- /** Whether to outline the context zones, for working on the scrolling */
39
- this.showContextZones = false;
40
- /** How long to wait after a manual scroll before following playback again */
41
- this.scrollTimerDelay = 15000;
42
- this.timeScrollTop = 0;
43
- this.currentEntries = [];
44
- }
45
- disconnectedCallback() {
46
- super.disconnectedCallback();
47
- clearTimeout(this.scrollResumeTimerId);
48
- this.cancelScrollAnimation();
49
- }
50
- render() {
51
- return html `
52
- <div class="container">
53
- ${this.showContextZones ? this.contextZoneTemplates : nothing}
54
-
55
- <div
56
- class="scroll-container"
57
- id="scroll-container"
58
- @wheel=${this.didScroll}
59
- @touchmove=${this.didScroll}
60
- >
61
- <div class="col time">${this.timeDisplayTemplate}</div>
62
-
63
- <div class="col">
64
- ${this.autoScrollButtonTemplate}
65
- ${this.transcriptEntries.map((entry) => this.transcriptEntryTemplate(entry))}
66
- </div>
67
- </div>
68
- </div>
69
- `;
70
- }
71
- /** Scrolls the selected search result into view. */
72
- scrollToSelectedSearchResult() {
73
- const { selectedSearchResult } = this;
74
- if (!selectedSearchResult)
75
- return;
76
- this.autoScroll = false;
77
- this.scrollToElement(selectedSearchResult);
78
- }
79
- /** The id of the entry starting closest to a given time, if there is one. */
80
- entryIdentifierClosestToTime(time) {
81
- const entries = this.transcriptEntries;
82
- if (entries.length === 0)
83
- return null;
84
- let closest = entries[0];
85
- let smallestDelta = Math.abs(time - closest.start);
86
- for (const entry of entries) {
87
- const delta = Math.abs(time - entry.start);
88
- if (delta < smallestDelta) {
89
- smallestDelta = delta;
90
- closest = entry;
91
- }
92
- }
93
- return closest.id;
94
- }
95
- get autoScrollButtonTemplate() {
96
- return html `
97
- <button
98
- class="auto-scroll-button ${this.autoScroll ? 'hidden' : ''}"
99
- @click=${this.enableAutoScroll}
100
- >
101
- ${msg('Scroll text with audio')}
102
- </button>
103
- `;
104
- }
105
- get timeDisplayTemplate() {
106
- return html `
107
- <div class="time-display" style="top: ${this.timeScrollTop}px">
108
- ${formatDuration(this.currentTime)}
109
- </div>
110
- `;
111
- }
112
- transcriptEntryTemplate(entry) {
113
- const isActive = this.currentEntries.some((currentEntry) => currentEntry.id === entry.id);
114
- return html `
115
- <ia-transcript-entry
116
- .entry=${entry}
117
- ?isActive=${isActive}
118
- ?isSelected=${entry.searchMatchIndex === this.selectedSearchResultIndex}
119
- ?isSearchResult=${entry.searchMatchIndex !== undefined}
120
- ?isMusicEntry=${entry.isMusic}
121
- isClickable
122
- data-search-result-index=${ifDefined(entry.searchMatchIndex)}
123
- data-identifier=${entry.id}
124
- @click=${this.transcriptEntrySelected}
125
- ></ia-transcript-entry>
126
- `;
127
- }
128
- get contextZoneTemplates() {
129
- return html `
130
- <div
131
- class="top context-overlay"
132
- style="height: ${this.topContextHeight}px"
133
- ></div>
134
- <div
135
- class="bottom context-overlay"
136
- style="height: ${this.bottomContextHeight}px"
137
- ></div>
138
- `;
139
- }
140
- get transcriptEntries() {
141
- return this.config?.entries ?? [];
142
- }
143
- updated(changedProperties) {
144
- if (changedProperties.has('currentTime'))
145
- this.handleCurrentTimeChange();
146
- if (changedProperties.has('selectedSearchResultIndex')) {
147
- this.scrollToSelectedSearchResult();
148
- }
149
- if (changedProperties.has('currentEntries')) {
150
- this.scrollToClosestEntry();
151
- this.updateTimePosition();
152
- }
153
- if (changedProperties.has('autoScroll')) {
154
- this.dispatchEvent(new CustomEvent(Events.AutoScrollChanged, {
155
- detail: { autoScroll: this.autoScroll },
156
- }));
157
- }
158
- if (changedProperties.has('config')) {
159
- this.selectedSearchResultIndex = 0;
160
- this.scrollToSelectedSearchResult();
161
- }
162
- }
163
- transcriptEntrySelected(e) {
164
- const { entry } = e.currentTarget;
165
- if (!entry)
166
- return;
167
- this.dispatchEvent(new CustomEvent(Events.TranscriptEntrySelected, { detail: { entry } }));
168
- if (entry.searchMatchIndex !== undefined) {
169
- this.selectedSearchResultIndex = entry.searchMatchIndex;
170
- }
171
- this.autoScroll = false;
172
- }
173
- /**
174
- * Works out which entries are being spoken now.
175
- *
176
- * Runs on every time update, several times a second, so it only touches the
177
- * rendered state when the set of entries has actually changed.
178
- */
179
- handleCurrentTimeChange() {
180
- const entries = this.transcriptEntries;
181
- if (entries.length === 0)
182
- return;
183
- const activeEntries = entries.filter((entry) => this.currentTime >= entry.start && this.currentTime <= entry.end);
184
- if (IATranscriptView_1.entryArraysMatch(activeEntries, this.currentEntries)) {
185
- return;
186
- }
187
- this.dispatchEvent(new Event(Events.CurrentEntriesUpdated));
188
- this.currentEntries = activeEntries;
189
- }
190
- static entryArraysMatch(a, b) {
191
- if (a.length !== b.length)
192
- return false;
193
- const aIds = a.map((entry) => entry.id).sort((x, y) => x - y);
194
- const bIds = b.map((entry) => entry.id).sort((x, y) => x - y);
195
- return aIds.every((id, index) => bIds[index] === id);
196
- }
197
- elementClosestToTime(time) {
198
- const closestIdentifier = this.entryIdentifierClosestToTime(time);
199
- // Compared against null rather than tested for truthiness, so an entry
200
- // whose id is 0 is still found.
201
- if (closestIdentifier === null)
202
- return null;
203
- return this.elementForIdentifier(closestIdentifier);
204
- }
205
- elementForIdentifier(identifier) {
206
- return (this.shadowRoot?.querySelector(`ia-transcript-entry[data-identifier="${identifier}"]`) ?? null);
207
- }
208
- /**
209
- * Steps auto-scroll aside when the listener scrolls by hand, and arranges to
210
- * pick it back up once they've left it alone for a while.
211
- */
212
- didScroll() {
213
- this.autoScroll = false;
214
- clearTimeout(this.scrollResumeTimerId);
215
- this.scrollResumeTimerId = setTimeout(() => {
216
- this.autoScroll = true;
217
- }, this.scrollTimerDelay);
218
- }
219
- enableAutoScroll() {
220
- this.autoScroll = true;
221
- this.scrollToClosestEntry();
222
- }
223
- get activeTranscriptEntry() {
224
- return (this.shadowRoot?.querySelector('ia-transcript-entry[isActive]') ?? null);
225
- }
226
- get selectedSearchResult() {
227
- return (this.shadowRoot?.querySelector(`ia-transcript-entry[data-search-result-index="${this.selectedSearchResultIndex}"]`) ?? null);
228
- }
229
- get closestEntryToCurrentTime() {
230
- return (this.activeTranscriptEntry ?? this.elementClosestToTime(this.currentTime));
231
- }
232
- scrollToClosestEntry() {
233
- if (!this.autoScroll)
234
- return;
235
- const closestEntry = this.closestEntryToCurrentTime;
236
- if (closestEntry)
237
- this.scrollToElement(closestEntry);
238
- }
239
- /**
240
- * Scrolls an entry to the top of the focus area, if it isn't in there
241
- * already.
242
- */
243
- scrollToElement(element) {
244
- const { scrollView } = this;
245
- if (!scrollView)
246
- return;
247
- const containerRect = scrollView.getBoundingClientRect();
248
- const entryRect = element.getBoundingClientRect();
249
- const focusBottom = containerRect.height - this.bottomContextHeight;
250
- const isBelowFocusArea = entryRect.bottom > containerRect.top + focusBottom;
251
- const isAboveFocusArea = entryRect.top < containerRect.top;
252
- if (!isBelowFocusArea && !isAboveFocusArea)
253
- return;
254
- this.scrollToOffset(entryRect.top -
255
- containerRect.top +
256
- scrollView.scrollTop -
257
- this.topContextHeight);
258
- }
259
- updateTimePosition() {
260
- const scrollToEntry = this.closestEntryToCurrentTime;
261
- if (!scrollToEntry)
262
- return;
263
- const parent = scrollToEntry.parentNode;
264
- if (!parent)
265
- return;
266
- this.timeScrollTop =
267
- scrollToEntry.getBoundingClientRect().top -
268
- parent.getBoundingClientRect().top;
269
- }
270
- /**
271
- * Eases the scroll container to an offset.
272
- *
273
- * Only one animation runs at a time: playback ticks arrive faster than an
274
- * animation finishes, and two loops writing `scrollTop` fight each other.
275
- */
276
- scrollToOffset(offset) {
277
- const { scrollView } = this;
278
- if (!scrollView)
279
- return;
280
- this.cancelScrollAnimation();
281
- const start = scrollView.scrollTop;
282
- const change = offset - start;
283
- const startTime = performance.now();
284
- const easeInOutQuad = (time) => time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time;
285
- const animate = () => {
286
- const elapsed = (performance.now() - startTime) / 1000;
287
- // Clamped so the last frame lands exactly on the target rather than
288
- // overshooting past it.
289
- const progress = Math.min(elapsed / SCROLL_DURATION_SECONDS, 1);
290
- scrollView.scrollTop = start + change * easeInOutQuad(progress);
291
- if (progress < 1) {
292
- this.scrollAnimationId = requestAnimationFrame(animate);
293
- }
294
- else {
295
- this.scrollAnimationId = undefined;
296
- }
297
- };
298
- animate();
299
- }
300
- cancelScrollAnimation() {
301
- if (this.scrollAnimationId === undefined)
302
- return;
303
- cancelAnimationFrame(this.scrollAnimationId);
304
- this.scrollAnimationId = undefined;
305
- }
306
- static get styles() {
307
- return css `
308
- :host {
309
- --transcript-height--: var(--ia-theme-transcript-height, 200px);
310
-
311
- --transcript-normal-text-color--: var(
312
- --ia-theme-transcript-normal-text-color,
313
- gray
314
- );
315
- --transcript-active-text-color--: var(
316
- --ia-theme-transcript-active-text-color,
317
- white
318
- );
319
- --transcript-hover-text-color--: var(
320
- --ia-theme-transcript-hover-text-color,
321
- silver
322
- );
323
-
324
- --transcript-music-normal-text-color--: var(
325
- --ia-theme-transcript-music-normal-text-color,
326
- gray
327
- );
328
- --transcript-music-active-text-color--: var(
329
- --ia-theme-transcript-music-active-text-color,
330
- white
331
- );
332
- --transcript-music-hover-text-color--: var(
333
- --ia-theme-transcript-music-hover-text-color,
334
- silver
335
- );
336
-
337
- --transcript-search-result-inactive-border-color--: var(
338
- --ia-theme-transcript-search-result-inactive-border-color,
339
- gray
340
- );
341
- --transcript-search-result-active-border-color--: var(
342
- --ia-theme-transcript-search-result-active-border-color,
343
- green
344
- );
345
-
346
- --transcript-time-color--: var(--ia-theme-transcript-time-color, white);
347
- --transcript-time-column-width--: var(
348
- --ia-theme-transcript-time-column-width,
349
- 3rem
350
- );
351
- --transcript-time-font-size--: var(
352
- --ia-theme-transcript-time-font-size,
353
- 1em
354
- );
355
- --transcript-time-line-height--: var(
356
- --ia-theme-transcript-time-line-height,
357
- 1em
358
- );
359
- --transcript-time-display--: var(
360
- --ia-theme-transcript-time-display,
361
- block
362
- );
363
-
364
- --transcript-auto-scroll-button-color--: var(
365
- --ia-theme-transcript-auto-scroll-button-color,
366
- black
367
- );
368
- --transcript-auto-scroll-button-background--: var(
369
- --ia-theme-transcript-auto-scroll-button-background,
370
- white
371
- );
372
- --transcript-auto-scroll-button-width--: var(
373
- --ia-theme-transcript-auto-scroll-button-width,
374
- 12rem
375
- );
376
- --transcript-auto-scroll-button-font-size--: var(
377
- --ia-theme-transcript-auto-scroll-button-font-size,
378
- 1em
379
- );
380
-
381
- color: var(--transcript-normal-text-color--);
382
- }
383
-
384
- .container {
385
- position: relative;
386
- }
387
-
388
- .auto-scroll-button {
389
- position: absolute;
390
- left: 0;
391
- right: 0;
392
- bottom: 1rem;
393
- margin: auto;
394
- width: var(--transcript-auto-scroll-button-width--);
395
- border-radius: 1em;
396
- border: 0;
397
- display: inline-block;
398
- color: var(--transcript-auto-scroll-button-color--);
399
- background-color: var(--transcript-auto-scroll-button-background--);
400
- font-size: var(--transcript-auto-scroll-button-font-size--);
401
- cursor: pointer;
402
- z-index: 10;
403
- }
404
-
405
- .auto-scroll-button.hidden {
406
- display: none;
407
- }
408
-
409
- .context-overlay {
410
- position: absolute;
411
- left: 0;
412
- width: 100%;
413
- height: 0;
414
- /* Purely a guide. It sits over the top and bottom of the scroll area,
415
- so without this it would swallow the wheel and the entry clicks
416
- there, breaking the scrolling it exists to help you look at. */
417
- pointer-events: none;
418
- }
419
-
420
- .context-overlay.top {
421
- top: 0;
422
- border-bottom: 1px solid green;
423
- }
424
-
425
- .context-overlay.bottom {
426
- bottom: 0;
427
- border-top: 1px solid green;
428
- }
429
-
430
- .time {
431
- display: var(--transcript-time-display--);
432
- flex: 0 0 var(--transcript-time-column-width--);
433
- color: var(--transcript-time-color--);
434
- position: relative;
435
- }
436
-
437
- .time-display {
438
- position: absolute;
439
- top: 0;
440
- font-size: var(--transcript-time-font-size--);
441
- line-height: var(--transcript-time-line-height--);
442
- transition: top 1s;
443
- }
444
-
445
- .scroll-container {
446
- display: flex;
447
- overflow-y: auto;
448
- -ms-overflow-style: none;
449
- scrollbar-width: none;
450
- height: var(--transcript-height--);
451
- }
452
-
453
- .scroll-container::-webkit-scrollbar {
454
- display: none;
455
- }
456
-
457
- ia-transcript-entry {
458
- cursor: pointer;
459
- }
460
-
461
- ia-transcript-entry:hover {
462
- color: var(--transcript-hover-text-color--);
463
- }
464
-
465
- ia-transcript-entry[ismusicentry] {
466
- color: var(--transcript-music-normal-text-color--);
467
- display: block;
468
- font-style: italic;
469
- }
470
-
471
- ia-transcript-entry[ismusicentry]:hover {
472
- color: var(--transcript-music-hover-text-color--);
473
- }
474
-
475
- ia-transcript-entry[ismusicentry][isactive] {
476
- color: var(--transcript-music-active-text-color--);
477
- }
478
-
479
- ia-transcript-entry[isactive] {
480
- color: var(--transcript-active-text-color--);
481
- }
482
-
483
- ia-transcript-entry[issearchresult] {
484
- /* Inline-block, or the outline adds a space to the right of the text */
485
- display: inline-block;
486
- padding: 0 5px;
487
- position: relative;
488
- }
489
-
490
- ia-transcript-entry[issearchresult]:after {
491
- content: '';
492
- display: block;
493
- position: absolute;
494
- top: 0;
495
- bottom: 0;
496
- left: 0;
497
- right: 0;
498
- border: 2px solid
499
- var(--transcript-search-result-inactive-border-color--);
500
- border-radius: 5px;
501
- }
502
-
503
- ia-transcript-entry[issearchresult][isselected]:after {
504
- border: 2px solid var(--transcript-search-result-active-border-color--);
505
- }
506
- `;
507
- }
508
- };
509
- __decorate([
510
- property({ type: Object })
511
- ], IATranscriptView.prototype, "config", void 0);
512
- __decorate([
513
- property({ type: Number })
514
- ], IATranscriptView.prototype, "currentTime", void 0);
515
- __decorate([
516
- property({ type: Number })
517
- ], IATranscriptView.prototype, "topContextHeight", void 0);
518
- __decorate([
519
- property({ type: Number })
520
- ], IATranscriptView.prototype, "bottomContextHeight", void 0);
521
- __decorate([
522
- property({ type: Boolean })
523
- ], IATranscriptView.prototype, "autoScroll", void 0);
524
- __decorate([
525
- property({ type: Number })
526
- ], IATranscriptView.prototype, "selectedSearchResultIndex", void 0);
527
- __decorate([
528
- property({ type: Boolean })
529
- ], IATranscriptView.prototype, "showContextZones", void 0);
530
- __decorate([
531
- property({ type: Number })
532
- ], IATranscriptView.prototype, "scrollTimerDelay", void 0);
533
- __decorate([
534
- state()
535
- ], IATranscriptView.prototype, "timeScrollTop", void 0);
536
- __decorate([
537
- state()
538
- ], IATranscriptView.prototype, "currentEntries", void 0);
539
- __decorate([
540
- query('#scroll-container')
541
- ], IATranscriptView.prototype, "scrollView", void 0);
542
- IATranscriptView = IATranscriptView_1 = __decorate([
543
- customElement('ia-transcript-view')
544
- ], IATranscriptView);
545
- export { IATranscriptView };
546
- //# sourceMappingURL=ia-transcript-view.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ia-transcript-view.js","sourceRoot":"","sources":["../../../../src/elements/ia-transcript-view/ia-transcript-view.ts"],"names":[],"mappings":";;AAAA,OAAO,EACL,GAAG,EACH,IAAI,EACJ,UAAU,EACV,OAAO,GAIR,MAAM,KAAK,CAAC;AACb,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAEpC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAItD,OAAO,uBAAuB,CAAC;AAE/B;;GAEG;AACH,MAAM,MAAM,GAAG;IACb,uBAAuB,EAAE,yBAAyB;IAClD,qBAAqB,EAAE,uBAAuB;IAC9C,iBAAiB,EAAE,mBAAmB;CACvC,CAAC;AAEF,mDAAmD;AACnD,MAAM,uBAAuB,GAAG,CAAC,CAAC;AAElC;;;;;GAKG;AAEI,IAAM,gBAAgB,wBAAtB,MAAM,gBAAiB,SAAQ,UAAU;IAAzC;;QAIL,mDAAmD;QACvB,gBAAW,GAAG,CAAC,CAAC;QAE5C,qEAAqE;QACzC,qBAAgB,GAAG,EAAE,CAAC;QAElD,qEAAqE;QACzC,wBAAmB,GAAG,EAAE,CAAC;QAErD,8CAA8C;QACjB,eAAU,GAAG,IAAI,CAAC;QAE/C,uDAAuD;QAC3B,8BAAyB,GAAG,CAAC,CAAC;QAE1D,yEAAyE;QAC5C,qBAAgB,GAAG,KAAK,CAAC;QAEtD,6EAA6E;QACjD,qBAAgB,GAAG,KAAK,CAAC;QAEpC,kBAAa,GAAG,CAAC,CAAC;QAElB,mBAAc,GAA4B,EAAE,CAAC;IA8hBhE,CAAC;IAthBC,oBAAoB;QAClB,KAAK,CAAC,oBAAoB,EAAE,CAAC;QAC7B,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACvC,IAAI,CAAC,qBAAqB,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;UAEL,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,OAAO;;;;;mBAKlD,IAAI,CAAC,SAAS;uBACV,IAAI,CAAC,SAAS;;kCAEH,IAAI,CAAC,mBAAmB;;;cAG5C,IAAI,CAAC,wBAAwB;cAC7B,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACrC,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC,CACpC;;;;KAIR,CAAC;IACJ,CAAC;IAED,oDAAoD;IACpD,4BAA4B;QAC1B,MAAM,EAAE,oBAAoB,EAAE,GAAG,IAAI,CAAC;QACtC,IAAI,CAAC,oBAAoB;YAAE,OAAO;QAElC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,CAAC;IAC7C,CAAC;IAED,6EAA6E;IAC7E,4BAA4B,CAAC,IAAY;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC;QAEtC,IAAI,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;QAEnD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,KAAK,GAAG,aAAa,EAAE,CAAC;gBAC1B,aAAa,GAAG,KAAK,CAAC;gBACtB,OAAO,GAAG,KAAK,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC,EAAE,CAAC;IACpB,CAAC;IAED,IAAY,wBAAwB;QAClC,OAAO,IAAI,CAAA;;oCAEqB,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE;iBAClD,IAAI,CAAC,gBAAgB;;UAE5B,GAAG,CAAC,wBAAwB,CAAC;;KAElC,CAAC;IACJ,CAAC;IAED,IAAY,mBAAmB;QAC7B,OAAO,IAAI,CAAA;8CAC+B,IAAI,CAAC,aAAa;UACtD,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;;KAErC,CAAC;IACJ,CAAC;IAEO,uBAAuB,CAC7B,KAA4B;QAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CACvC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,EAAE,KAAK,KAAK,CAAC,EAAE,CAC/C,CAAC;QAEF,OAAO,IAAI,CAAA;;iBAEE,KAAK;oBACF,QAAQ;sBACN,KAAK,CAAC,gBAAgB,KAAK,IAAI,CAAC,yBAAyB;0BACrD,KAAK,CAAC,gBAAgB,KAAK,SAAS;wBACtC,KAAK,CAAC,OAAO;;mCAEF,SAAS,CAAC,KAAK,CAAC,gBAAgB,CAAC;0BAC1C,KAAK,CAAC,EAAE;iBACjB,IAAI,CAAC,uBAAuB;;KAExC,CAAC;IACJ,CAAC;IAED,IAAY,oBAAoB;QAC9B,OAAO,IAAI,CAAA;;;yBAGU,IAAI,CAAC,gBAAgB;;;;yBAIrB,IAAI,CAAC,mBAAmB;;KAE5C,CAAC;IACJ,CAAC;IAED,IAAY,iBAAiB;QAC3B,OAAO,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IACpC,CAAC;IAED,OAAO,CAAC,iBAAiC;QACvC,IAAI,iBAAiB,CAAC,GAAG,CAAC,aAAa,CAAC;YAAE,IAAI,CAAC,uBAAuB,EAAE,CAAC;QACzE,IAAI,iBAAiB,CAAC,GAAG,CAAC,2BAA2B,CAAC,EAAE,CAAC;YACvD,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACtC,CAAC;QACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC5C,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;YACxC,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAA0B,MAAM,CAAC,iBAAiB,EAAE;gBACjE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE;aACxC,CAAC,CACH,CAAC;QACJ,CAAC;QACD,IAAI,iBAAiB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,4BAA4B,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAEO,uBAAuB,CAAC,CAAQ;QACtC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC,aAAkC,CAAC;QACvD,IAAI,CAAC,KAAK;YAAE,OAAO;QAEnB,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CACb,MAAM,CAAC,uBAAuB,EAC9B,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,CACtB,CACF,CAAC;QAEF,IAAI,KAAK,CAAC,gBAAgB,KAAK,SAAS,EAAE,CAAC;YACzC,IAAI,CAAC,yBAAyB,GAAG,KAAK,CAAC,gBAAgB,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACK,uBAAuB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,iBAAiB,CAAC;QACvC,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEjC,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAClC,CAAC,KAAK,EAAE,EAAE,CACR,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,KAAK,IAAI,IAAI,CAAC,WAAW,IAAI,KAAK,CAAC,GAAG,CACnE,CAAC;QAEF,IAAI,kBAAgB,CAAC,gBAAgB,CAAC,aAAa,EAAE,IAAI,CAAC,cAAc,CAAC,EAAE,CAAC;YAC1E,OAAO;QACT,CAAC;QAED,IAAI,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC,CAAC;QAC5D,IAAI,CAAC,cAAc,GAAG,aAAa,CAAC;IACtC,CAAC;IAEO,MAAM,CAAC,gBAAgB,CAC7B,CAA0B,EAC1B,CAA0B;QAE1B,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAExC,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAC9D,MAAM,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAE9D,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACvD,CAAC;IAEO,oBAAoB,CAAC,IAAY;QACvC,MAAM,iBAAiB,GAAG,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC;QAClE,uEAAuE;QACvE,gCAAgC;QAChC,IAAI,iBAAiB,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAE5C,OAAO,IAAI,CAAC,oBAAoB,CAAC,iBAAiB,CAAC,CAAC;IACtD,CAAC;IAEO,oBAAoB,CAAC,UAAkB;QAC7C,OAAO,CACL,IAAI,CAAC,UAAU,EAAE,aAAa,CAC5B,wCAAwC,UAAU,IAAI,CACvD,IAAI,IAAI,CACV,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,SAAS;QACf,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAExB,YAAY,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QACvC,IAAI,CAAC,mBAAmB,GAAG,UAAU,CAAC,GAAG,EAAE;YACzC,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACzB,CAAC,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;IAC5B,CAAC;IAEO,gBAAgB;QACtB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;QACvB,IAAI,CAAC,oBAAoB,EAAE,CAAC;IAC9B,CAAC;IAED,IAAY,qBAAqB;QAC/B,OAAO,CACL,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,+BAA+B,CAAC,IAAI,IAAI,CACxE,CAAC;IACJ,CAAC;IAED,IAAY,oBAAoB;QAC9B,OAAO,CACL,IAAI,CAAC,UAAU,EAAE,aAAa,CAC5B,iDAAiD,IAAI,CAAC,yBAAyB,IAAI,CACpF,IAAI,IAAI,CACV,CAAC;IACJ,CAAC;IAED,IAAY,yBAAyB;QACnC,OAAO,CACL,IAAI,CAAC,qBAAqB,IAAI,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,WAAW,CAAC,CAC1E,CAAC;IACJ,CAAC;IAEO,oBAAoB;QAC1B,IAAI,CAAC,IAAI,CAAC,UAAU;YAAE,OAAO;QAE7B,MAAM,YAAY,GAAG,IAAI,CAAC,yBAAyB,CAAC;QACpD,IAAI,YAAY;YAAE,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC;IACvD,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,OAAoB;QAC1C,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,MAAM,aAAa,GAAG,UAAU,CAAC,qBAAqB,EAAE,CAAC;QACzD,MAAM,SAAS,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;QAClD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC;QAEpE,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,GAAG,aAAa,CAAC,GAAG,GAAG,WAAW,CAAC;QAC5E,MAAM,gBAAgB,GAAG,SAAS,CAAC,GAAG,GAAG,aAAa,CAAC,GAAG,CAAC;QAC3D,IAAI,CAAC,gBAAgB,IAAI,CAAC,gBAAgB;YAAE,OAAO;QAEnD,IAAI,CAAC,cAAc,CACjB,SAAS,CAAC,GAAG;YACX,aAAa,CAAC,GAAG;YACjB,UAAU,CAAC,SAAS;YACpB,IAAI,CAAC,gBAAgB,CACxB,CAAC;IACJ,CAAC;IAEO,kBAAkB;QACxB,MAAM,aAAa,GAAG,IAAI,CAAC,yBAAyB,CAAC;QACrD,IAAI,CAAC,aAAa;YAAE,OAAO;QAE3B,MAAM,MAAM,GAAG,aAAa,CAAC,UAAgC,CAAC;QAC9D,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,IAAI,CAAC,aAAa;YAChB,aAAa,CAAC,qBAAqB,EAAE,CAAC,GAAG;gBACzC,MAAM,CAAC,qBAAqB,EAAE,CAAC,GAAG,CAAC;IACvC,CAAC;IAED;;;;;OAKG;IACK,cAAc,CAAC,MAAc;QACnC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,UAAU;YAAE,OAAO;QAExB,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAE7B,MAAM,KAAK,GAAG,UAAU,CAAC,SAAS,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;QAC9B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAU,EAAE,CAC7C,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAE5D,MAAM,OAAO,GAAG,GAAS,EAAE;YACzB,MAAM,OAAO,GAAG,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,GAAG,IAAI,CAAC;YACvD,oEAAoE;YACpE,wBAAwB;YACxB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,uBAAuB,EAAE,CAAC,CAAC,CAAC;YAEhE,UAAU,CAAC,SAAS,GAAG,KAAK,GAAG,MAAM,GAAG,aAAa,CAAC,QAAQ,CAAC,CAAC;YAEhE,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;gBACjB,IAAI,CAAC,iBAAiB,GAAG,qBAAqB,CAAC,OAAO,CAAC,CAAC;YAC1D,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;YACrC,CAAC;QACH,CAAC,CAAC;QAEF,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,qBAAqB;QAC3B,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS;YAAE,OAAO;QAEjD,oBAAoB,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7C,IAAI,CAAC,iBAAiB,GAAG,SAAS,CAAC;IACrC,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAuMT,CAAC;IACJ,CAAC;CACF,CAAA;AAvjB6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAA2B;AAG1B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;qDAAiB;AAGhB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0DAAuB;AAGtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6DAA0B;AAGxB;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;oDAAmB;AAGnB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mEAA+B;AAG7B;IAA5B,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;0DAA0B;AAG1B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;0DAA0B;AAEpC;IAAhB,KAAK,EAAE;uDAA2B;AAElB;IAAhB,KAAK,EAAE;wDAAsD;AAE1B;IAAnC,KAAK,CAAC,mBAAmB,CAAC;oDAAyC;AA7BzD,gBAAgB;IAD5B,aAAa,CAAC,oBAAoB,CAAC;GACvB,gBAAgB,CAyjB5B","sourcesContent":["import {\n css,\n html,\n LitElement,\n nothing,\n type CSSResultGroup,\n type PropertyValues,\n type TemplateResult,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { msg } from '@lit/localize';\n\nimport { formatDuration } from './duration-formatter';\nimport type { TranscriptConfig, TranscriptEntryConfig } from './models';\nimport type { IATranscriptEntry } from './ia-transcript-entry';\n\nimport './ia-transcript-entry';\n\n/**\n * Event names emitted by this component\n */\nconst Events = {\n TranscriptEntrySelected: 'transcriptEntrySelected',\n CurrentEntriesUpdated: 'currentEntriesUpdated',\n AutoScrollChanged: 'autoScrollChanged',\n};\n\n/** How long a scroll animation runs, in seconds */\nconst SCROLL_DURATION_SECONDS = 1;\n\n/**\n * A scrolling transcript that follows playback.\n *\n * It keeps itself scrolled to whatever is being spoken, steps aside when the\n * listener scrolls by hand, and picks the job back up once they've stopped.\n */\n@customElement('ia-transcript-view')\nexport class IATranscriptView extends LitElement {\n /** The transcript to render */\n @property({ type: Object }) config?: TranscriptConfig;\n\n /** Playback position, in seconds into the track */\n @property({ type: Number }) currentTime = 0;\n\n /** How much room to leave above the entry being spoken, in pixels */\n @property({ type: Number }) topContextHeight = 50;\n\n /** How much room to leave below the entry being spoken, in pixels */\n @property({ type: Number }) bottomContextHeight = 50;\n\n /** Whether the transcript follows playback */\n @property({ type: Boolean }) autoScroll = true;\n\n /** Which search result is currently being looked at */\n @property({ type: Number }) selectedSearchResultIndex = 0;\n\n /** Whether to outline the context zones, for working on the scrolling */\n @property({ type: Boolean }) showContextZones = false;\n\n /** How long to wait after a manual scroll before following playback again */\n @property({ type: Number }) scrollTimerDelay = 15000;\n\n @state() private timeScrollTop = 0;\n\n @state() private currentEntries: TranscriptEntryConfig[] = [];\n\n @query('#scroll-container') private scrollView?: HTMLElement | null;\n\n private scrollResumeTimerId?: ReturnType<typeof setTimeout>;\n\n private scrollAnimationId?: number;\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n clearTimeout(this.scrollResumeTimerId);\n this.cancelScrollAnimation();\n }\n\n render(): TemplateResult {\n return html`\n <div class=\"container\">\n ${this.showContextZones ? this.contextZoneTemplates : nothing}\n\n <div\n class=\"scroll-container\"\n id=\"scroll-container\"\n @wheel=${this.didScroll}\n @touchmove=${this.didScroll}\n >\n <div class=\"col time\">${this.timeDisplayTemplate}</div>\n\n <div class=\"col\">\n ${this.autoScrollButtonTemplate}\n ${this.transcriptEntries.map((entry) =>\n this.transcriptEntryTemplate(entry),\n )}\n </div>\n </div>\n </div>\n `;\n }\n\n /** Scrolls the selected search result into view. */\n scrollToSelectedSearchResult(): void {\n const { selectedSearchResult } = this;\n if (!selectedSearchResult) return;\n\n this.autoScroll = false;\n this.scrollToElement(selectedSearchResult);\n }\n\n /** The id of the entry starting closest to a given time, if there is one. */\n entryIdentifierClosestToTime(time: number): number | null {\n const entries = this.transcriptEntries;\n if (entries.length === 0) return null;\n\n let closest = entries[0];\n let smallestDelta = Math.abs(time - closest.start);\n\n for (const entry of entries) {\n const delta = Math.abs(time - entry.start);\n if (delta < smallestDelta) {\n smallestDelta = delta;\n closest = entry;\n }\n }\n\n return closest.id;\n }\n\n private get autoScrollButtonTemplate(): TemplateResult {\n return html`\n <button\n class=\"auto-scroll-button ${this.autoScroll ? 'hidden' : ''}\"\n @click=${this.enableAutoScroll}\n >\n ${msg('Scroll text with audio')}\n </button>\n `;\n }\n\n private get timeDisplayTemplate(): TemplateResult {\n return html`\n <div class=\"time-display\" style=\"top: ${this.timeScrollTop}px\">\n ${formatDuration(this.currentTime)}\n </div>\n `;\n }\n\n private transcriptEntryTemplate(\n entry: TranscriptEntryConfig,\n ): TemplateResult {\n const isActive = this.currentEntries.some(\n (currentEntry) => currentEntry.id === entry.id,\n );\n\n return html`\n <ia-transcript-entry\n .entry=${entry}\n ?isActive=${isActive}\n ?isSelected=${entry.searchMatchIndex === this.selectedSearchResultIndex}\n ?isSearchResult=${entry.searchMatchIndex !== undefined}\n ?isMusicEntry=${entry.isMusic}\n isClickable\n data-search-result-index=${ifDefined(entry.searchMatchIndex)}\n data-identifier=${entry.id}\n @click=${this.transcriptEntrySelected}\n ></ia-transcript-entry>\n `;\n }\n\n private get contextZoneTemplates(): TemplateResult {\n return html`\n <div\n class=\"top context-overlay\"\n style=\"height: ${this.topContextHeight}px\"\n ></div>\n <div\n class=\"bottom context-overlay\"\n style=\"height: ${this.bottomContextHeight}px\"\n ></div>\n `;\n }\n\n private get transcriptEntries(): TranscriptEntryConfig[] {\n return this.config?.entries ?? [];\n }\n\n updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('currentTime')) this.handleCurrentTimeChange();\n if (changedProperties.has('selectedSearchResultIndex')) {\n this.scrollToSelectedSearchResult();\n }\n if (changedProperties.has('currentEntries')) {\n this.scrollToClosestEntry();\n this.updateTimePosition();\n }\n if (changedProperties.has('autoScroll')) {\n this.dispatchEvent(\n new CustomEvent<{ autoScroll: boolean }>(Events.AutoScrollChanged, {\n detail: { autoScroll: this.autoScroll },\n }),\n );\n }\n if (changedProperties.has('config')) {\n this.selectedSearchResultIndex = 0;\n this.scrollToSelectedSearchResult();\n }\n }\n\n private transcriptEntrySelected(e: Event): void {\n const { entry } = e.currentTarget as IATranscriptEntry;\n if (!entry) return;\n\n this.dispatchEvent(\n new CustomEvent<{ entry: TranscriptEntryConfig }>(\n Events.TranscriptEntrySelected,\n { detail: { entry } },\n ),\n );\n\n if (entry.searchMatchIndex !== undefined) {\n this.selectedSearchResultIndex = entry.searchMatchIndex;\n }\n this.autoScroll = false;\n }\n\n /**\n * Works out which entries are being spoken now.\n *\n * Runs on every time update, several times a second, so it only touches the\n * rendered state when the set of entries has actually changed.\n */\n private handleCurrentTimeChange(): void {\n const entries = this.transcriptEntries;\n if (entries.length === 0) return;\n\n const activeEntries = entries.filter(\n (entry) =>\n this.currentTime >= entry.start && this.currentTime <= entry.end,\n );\n\n if (IATranscriptView.entryArraysMatch(activeEntries, this.currentEntries)) {\n return;\n }\n\n this.dispatchEvent(new Event(Events.CurrentEntriesUpdated));\n this.currentEntries = activeEntries;\n }\n\n private static entryArraysMatch(\n a: TranscriptEntryConfig[],\n b: TranscriptEntryConfig[],\n ): boolean {\n if (a.length !== b.length) return false;\n\n const aIds = a.map((entry) => entry.id).sort((x, y) => x - y);\n const bIds = b.map((entry) => entry.id).sort((x, y) => x - y);\n\n return aIds.every((id, index) => bIds[index] === id);\n }\n\n private elementClosestToTime(time: number): HTMLElement | null {\n const closestIdentifier = this.entryIdentifierClosestToTime(time);\n // Compared against null rather than tested for truthiness, so an entry\n // whose id is 0 is still found.\n if (closestIdentifier === null) return null;\n\n return this.elementForIdentifier(closestIdentifier);\n }\n\n private elementForIdentifier(identifier: number): HTMLElement | null {\n return (\n this.shadowRoot?.querySelector(\n `ia-transcript-entry[data-identifier=\"${identifier}\"]`,\n ) ?? null\n );\n }\n\n /**\n * Steps auto-scroll aside when the listener scrolls by hand, and arranges to\n * pick it back up once they've left it alone for a while.\n */\n private didScroll(): void {\n this.autoScroll = false;\n\n clearTimeout(this.scrollResumeTimerId);\n this.scrollResumeTimerId = setTimeout(() => {\n this.autoScroll = true;\n }, this.scrollTimerDelay);\n }\n\n private enableAutoScroll(): void {\n this.autoScroll = true;\n this.scrollToClosestEntry();\n }\n\n private get activeTranscriptEntry(): HTMLElement | null {\n return (\n this.shadowRoot?.querySelector('ia-transcript-entry[isActive]') ?? null\n );\n }\n\n private get selectedSearchResult(): HTMLElement | null {\n return (\n this.shadowRoot?.querySelector(\n `ia-transcript-entry[data-search-result-index=\"${this.selectedSearchResultIndex}\"]`,\n ) ?? null\n );\n }\n\n private get closestEntryToCurrentTime(): HTMLElement | null {\n return (\n this.activeTranscriptEntry ?? this.elementClosestToTime(this.currentTime)\n );\n }\n\n private scrollToClosestEntry(): void {\n if (!this.autoScroll) return;\n\n const closestEntry = this.closestEntryToCurrentTime;\n if (closestEntry) this.scrollToElement(closestEntry);\n }\n\n /**\n * Scrolls an entry to the top of the focus area, if it isn't in there\n * already.\n */\n private scrollToElement(element: HTMLElement): void {\n const { scrollView } = this;\n if (!scrollView) return;\n\n const containerRect = scrollView.getBoundingClientRect();\n const entryRect = element.getBoundingClientRect();\n const focusBottom = containerRect.height - this.bottomContextHeight;\n\n const isBelowFocusArea = entryRect.bottom > containerRect.top + focusBottom;\n const isAboveFocusArea = entryRect.top < containerRect.top;\n if (!isBelowFocusArea && !isAboveFocusArea) return;\n\n this.scrollToOffset(\n entryRect.top -\n containerRect.top +\n scrollView.scrollTop -\n this.topContextHeight,\n );\n }\n\n private updateTimePosition(): void {\n const scrollToEntry = this.closestEntryToCurrentTime;\n if (!scrollToEntry) return;\n\n const parent = scrollToEntry.parentNode as HTMLElement | null;\n if (!parent) return;\n\n this.timeScrollTop =\n scrollToEntry.getBoundingClientRect().top -\n parent.getBoundingClientRect().top;\n }\n\n /**\n * Eases the scroll container to an offset.\n *\n * Only one animation runs at a time: playback ticks arrive faster than an\n * animation finishes, and two loops writing `scrollTop` fight each other.\n */\n private scrollToOffset(offset: number): void {\n const { scrollView } = this;\n if (!scrollView) return;\n\n this.cancelScrollAnimation();\n\n const start = scrollView.scrollTop;\n const change = offset - start;\n const startTime = performance.now();\n\n const easeInOutQuad = (time: number): number =>\n time < 0.5 ? 2 * time * time : -1 + (4 - 2 * time) * time;\n\n const animate = (): void => {\n const elapsed = (performance.now() - startTime) / 1000;\n // Clamped so the last frame lands exactly on the target rather than\n // overshooting past it.\n const progress = Math.min(elapsed / SCROLL_DURATION_SECONDS, 1);\n\n scrollView.scrollTop = start + change * easeInOutQuad(progress);\n\n if (progress < 1) {\n this.scrollAnimationId = requestAnimationFrame(animate);\n } else {\n this.scrollAnimationId = undefined;\n }\n };\n\n animate();\n }\n\n private cancelScrollAnimation(): void {\n if (this.scrollAnimationId === undefined) return;\n\n cancelAnimationFrame(this.scrollAnimationId);\n this.scrollAnimationId = undefined;\n }\n\n static get styles(): CSSResultGroup {\n return css`\n :host {\n --transcript-height--: var(--ia-theme-transcript-height, 200px);\n\n --transcript-normal-text-color--: var(\n --ia-theme-transcript-normal-text-color,\n gray\n );\n --transcript-active-text-color--: var(\n --ia-theme-transcript-active-text-color,\n white\n );\n --transcript-hover-text-color--: var(\n --ia-theme-transcript-hover-text-color,\n silver\n );\n\n --transcript-music-normal-text-color--: var(\n --ia-theme-transcript-music-normal-text-color,\n gray\n );\n --transcript-music-active-text-color--: var(\n --ia-theme-transcript-music-active-text-color,\n white\n );\n --transcript-music-hover-text-color--: var(\n --ia-theme-transcript-music-hover-text-color,\n silver\n );\n\n --transcript-search-result-inactive-border-color--: var(\n --ia-theme-transcript-search-result-inactive-border-color,\n gray\n );\n --transcript-search-result-active-border-color--: var(\n --ia-theme-transcript-search-result-active-border-color,\n green\n );\n\n --transcript-time-color--: var(--ia-theme-transcript-time-color, white);\n --transcript-time-column-width--: var(\n --ia-theme-transcript-time-column-width,\n 3rem\n );\n --transcript-time-font-size--: var(\n --ia-theme-transcript-time-font-size,\n 1em\n );\n --transcript-time-line-height--: var(\n --ia-theme-transcript-time-line-height,\n 1em\n );\n --transcript-time-display--: var(\n --ia-theme-transcript-time-display,\n block\n );\n\n --transcript-auto-scroll-button-color--: var(\n --ia-theme-transcript-auto-scroll-button-color,\n black\n );\n --transcript-auto-scroll-button-background--: var(\n --ia-theme-transcript-auto-scroll-button-background,\n white\n );\n --transcript-auto-scroll-button-width--: var(\n --ia-theme-transcript-auto-scroll-button-width,\n 12rem\n );\n --transcript-auto-scroll-button-font-size--: var(\n --ia-theme-transcript-auto-scroll-button-font-size,\n 1em\n );\n\n color: var(--transcript-normal-text-color--);\n }\n\n .container {\n position: relative;\n }\n\n .auto-scroll-button {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 1rem;\n margin: auto;\n width: var(--transcript-auto-scroll-button-width--);\n border-radius: 1em;\n border: 0;\n display: inline-block;\n color: var(--transcript-auto-scroll-button-color--);\n background-color: var(--transcript-auto-scroll-button-background--);\n font-size: var(--transcript-auto-scroll-button-font-size--);\n cursor: pointer;\n z-index: 10;\n }\n\n .auto-scroll-button.hidden {\n display: none;\n }\n\n .context-overlay {\n position: absolute;\n left: 0;\n width: 100%;\n height: 0;\n /* Purely a guide. It sits over the top and bottom of the scroll area,\n so without this it would swallow the wheel and the entry clicks\n there, breaking the scrolling it exists to help you look at. */\n pointer-events: none;\n }\n\n .context-overlay.top {\n top: 0;\n border-bottom: 1px solid green;\n }\n\n .context-overlay.bottom {\n bottom: 0;\n border-top: 1px solid green;\n }\n\n .time {\n display: var(--transcript-time-display--);\n flex: 0 0 var(--transcript-time-column-width--);\n color: var(--transcript-time-color--);\n position: relative;\n }\n\n .time-display {\n position: absolute;\n top: 0;\n font-size: var(--transcript-time-font-size--);\n line-height: var(--transcript-time-line-height--);\n transition: top 1s;\n }\n\n .scroll-container {\n display: flex;\n overflow-y: auto;\n -ms-overflow-style: none;\n scrollbar-width: none;\n height: var(--transcript-height--);\n }\n\n .scroll-container::-webkit-scrollbar {\n display: none;\n }\n\n ia-transcript-entry {\n cursor: pointer;\n }\n\n ia-transcript-entry:hover {\n color: var(--transcript-hover-text-color--);\n }\n\n ia-transcript-entry[ismusicentry] {\n color: var(--transcript-music-normal-text-color--);\n display: block;\n font-style: italic;\n }\n\n ia-transcript-entry[ismusicentry]:hover {\n color: var(--transcript-music-hover-text-color--);\n }\n\n ia-transcript-entry[ismusicentry][isactive] {\n color: var(--transcript-music-active-text-color--);\n }\n\n ia-transcript-entry[isactive] {\n color: var(--transcript-active-text-color--);\n }\n\n ia-transcript-entry[issearchresult] {\n /* Inline-block, or the outline adds a space to the right of the text */\n display: inline-block;\n padding: 0 5px;\n position: relative;\n }\n\n ia-transcript-entry[issearchresult]:after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n border: 2px solid\n var(--transcript-search-result-inactive-border-color--);\n border-radius: 5px;\n }\n\n ia-transcript-entry[issearchresult][isselected]:after {\n border: 2px solid var(--transcript-search-result-active-border-color--);\n }\n `;\n }\n}\n"]}
@@ -1,34 +0,0 @@
1
- /**
2
- * One line of a transcript: a stretch of time and the words spoken in it.
3
- */
4
- export declare class TranscriptEntryConfig {
5
- /** Identifies this entry within its transcript. */
6
- id: number;
7
- /** When the entry starts, in seconds into the track. */
8
- start: number;
9
- /** When the entry ends, in seconds into the track. */
10
- end: number;
11
- /** Whether this stretch is music rather than speech. */
12
- isMusic: boolean;
13
- /** Where this entry falls in the search results, if it is one. */
14
- searchMatchIndex?: number;
15
- /** The transcribed words. */
16
- rawText: string;
17
- constructor(id: number, start: number, end: number, rawText: string, isMusic: boolean, searchMatchIndex?: number);
18
- /**
19
- * What to show for this entry.
20
- *
21
- * Music stretches carry no words worth reading, so they say so instead.
22
- */
23
- get displayText(): string;
24
- }
25
- /**
26
- * A whole transcript, as an ordered list of entries.
27
- */
28
- export declare class TranscriptConfig {
29
- entries: TranscriptEntryConfig[];
30
- constructor(entries: TranscriptEntryConfig[]);
31
- /** Just the entries that matched the current search. */
32
- get searchResults(): TranscriptEntryConfig[];
33
- }
34
- //# sourceMappingURL=models.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-transcript-view/models.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,qBAAa,qBAAqB;IAChC,mDAAmD;IACnD,EAAE,EAAE,MAAM,CAAC;IAEX,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IAEd,sDAAsD;IACtD,GAAG,EAAE,MAAM,CAAC;IAEZ,wDAAwD;IACxD,OAAO,EAAE,OAAO,CAAC;IAEjB,kEAAkE;IAClE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAE1B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,CAAC;gBAGd,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,OAAO,EAChB,gBAAgB,CAAC,EAAE,MAAM;IAU3B;;;;OAIG;IACH,IAAI,WAAW,IAAI,MAAM,CAIxB;CACF;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,EAAE,qBAAqB,EAAE,CAAM;gBAE1B,OAAO,EAAE,qBAAqB,EAAE;IAI5C,wDAAwD;IACxD,IAAI,aAAa,IAAI,qBAAqB,EAAE,CAE3C;CACF"}
@@ -1,38 +0,0 @@
1
- import { msg } from '@lit/localize';
2
- /**
3
- * One line of a transcript: a stretch of time and the words spoken in it.
4
- */
5
- export class TranscriptEntryConfig {
6
- constructor(id, start, end, rawText, isMusic, searchMatchIndex) {
7
- this.id = id;
8
- this.start = start;
9
- this.end = end;
10
- this.rawText = rawText;
11
- this.isMusic = isMusic;
12
- this.searchMatchIndex = searchMatchIndex;
13
- }
14
- /**
15
- * What to show for this entry.
16
- *
17
- * Music stretches carry no words worth reading, so they say so instead.
18
- */
19
- get displayText() {
20
- if (this.isMusic)
21
- return msg('[Transcript unavailable]');
22
- return this.rawText;
23
- }
24
- }
25
- /**
26
- * A whole transcript, as an ordered list of entries.
27
- */
28
- export class TranscriptConfig {
29
- constructor(entries) {
30
- this.entries = [];
31
- this.entries = entries;
32
- }
33
- /** Just the entries that matched the current search. */
34
- get searchResults() {
35
- return this.entries.filter((entry) => entry.searchMatchIndex !== undefined);
36
- }
37
- }
38
- //# sourceMappingURL=models.js.map