@internetarchive/elements 0.2.14-webdev-8969.0 → 0.3.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 (94) hide show
  1. package/README.md +20 -0
  2. package/dist/src/elements/ia-item-navigator/ia-item-navigator.d.ts +97 -0
  3. package/dist/src/elements/ia-item-navigator/ia-item-navigator.d.ts.map +1 -0
  4. package/dist/src/elements/ia-item-navigator/ia-item-navigator.js +588 -0
  5. package/dist/src/elements/ia-item-navigator/ia-item-navigator.js.map +1 -0
  6. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.d.ts +39 -0
  7. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.d.ts.map +1 -0
  8. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.js +249 -0
  9. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-button.js.map +1 -0
  10. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.d.ts +55 -0
  11. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.d.ts.map +1 -0
  12. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.js +394 -0
  13. package/dist/src/elements/ia-item-navigator/ia-itemnav-menu-slider.js.map +1 -0
  14. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.d.ts +20 -0
  15. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.d.ts.map +1 -0
  16. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.js +102 -0
  17. package/dist/src/elements/ia-item-navigator/ia-itemnav-no-theater-available.js.map +1 -0
  18. package/dist/src/elements/ia-item-navigator/icons/collapse-sidebar.svg +7 -0
  19. package/dist/src/elements/ia-item-navigator/icons/ellipses.svg +7 -0
  20. package/dist/src/elements/ia-item-navigator/icons.d.ts +13 -0
  21. package/dist/src/elements/ia-item-navigator/icons.d.ts.map +1 -0
  22. package/dist/src/elements/ia-item-navigator/icons.js +16 -0
  23. package/dist/src/elements/ia-item-navigator/icons.js.map +1 -0
  24. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.d.ts +41 -0
  25. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.d.ts.map +1 -0
  26. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.js +2 -0
  27. package/dist/src/elements/ia-item-navigator/interfaces/event-interfaces.js.map +1 -0
  28. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.d.ts +23 -0
  29. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.d.ts.map +1 -0
  30. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.js +2 -0
  31. package/dist/src/elements/ia-item-navigator/interfaces/menu-interfaces.js.map +1 -0
  32. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.d.ts +47 -0
  33. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.d.ts.map +1 -0
  34. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.js +352 -0
  35. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-share-panel.js.map +1 -0
  36. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.d.ts +22 -0
  37. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.d.ts.map +1 -0
  38. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.js +137 -0
  39. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-sort-files-button.js.map +1 -0
  40. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.d.ts +40 -0
  41. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.d.ts.map +1 -0
  42. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js +217 -0
  43. package/dist/src/elements/ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js.map +1 -0
  44. package/dist/src/elements/ia-item-navigator/menus/icons/email.svg +6 -0
  45. package/dist/src/elements/ia-item-navigator/menus/icons/facebook.svg +6 -0
  46. package/dist/src/elements/ia-item-navigator/menus/icons/link.svg +6 -0
  47. package/dist/src/elements/ia-item-navigator/menus/icons/list.svg +3 -0
  48. package/dist/src/elements/ia-item-navigator/menus/icons/pinterest.svg +6 -0
  49. package/dist/src/elements/ia-item-navigator/menus/icons/share.svg +6 -0
  50. package/dist/src/elements/ia-item-navigator/menus/icons/sort-asc.svg +22 -0
  51. package/dist/src/elements/ia-item-navigator/menus/icons/sort-desc.svg +21 -0
  52. package/dist/src/elements/ia-item-navigator/menus/icons/sort-neutral.svg +13 -0
  53. package/dist/src/elements/ia-item-navigator/menus/icons/tumblr.svg +6 -0
  54. package/dist/src/elements/ia-item-navigator/menus/icons/twitter.svg +6 -0
  55. package/dist/src/elements/ia-item-navigator/menus/icons/viewable-files.svg +6 -0
  56. package/dist/src/elements/ia-item-navigator/menus/models.d.ts +17 -0
  57. package/dist/src/elements/ia-item-navigator/menus/models.d.ts.map +1 -0
  58. package/dist/src/elements/ia-item-navigator/menus/models.js +2 -0
  59. package/dist/src/elements/ia-item-navigator/menus/models.js.map +1 -0
  60. package/dist/src/elements/ia-item-navigator/menus/share-icons.d.ts +16 -0
  61. package/dist/src/elements/ia-item-navigator/menus/share-icons.d.ts.map +1 -0
  62. package/dist/src/elements/ia-item-navigator/menus/share-icons.js +23 -0
  63. package/dist/src/elements/ia-item-navigator/menus/share-icons.js.map +1 -0
  64. package/dist/src/elements/ia-playback-controls/ia-playback-controls.d.ts +12 -3
  65. package/dist/src/elements/ia-playback-controls/ia-playback-controls.d.ts.map +1 -1
  66. package/dist/src/elements/ia-playback-controls/ia-playback-controls.js +26 -9
  67. package/dist/src/elements/ia-playback-controls/ia-playback-controls.js.map +1 -1
  68. package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts +51 -5
  69. package/dist/src/elements/ia-status-indicator/ia-status-indicator.d.ts.map +1 -1
  70. package/dist/src/elements/ia-status-indicator/ia-status-indicator.js +156 -16
  71. package/dist/src/elements/ia-status-indicator/ia-status-indicator.js.map +1 -1
  72. package/dist/src/elements/ia-status-indicator/icons/audio.svg +5 -0
  73. package/dist/src/elements/ia-status-indicator/icons/collection.svg +5 -0
  74. package/dist/src/elements/ia-status-indicator/icons/etree.svg +5 -0
  75. package/dist/src/elements/ia-status-indicator/icons/images.svg +6 -0
  76. package/dist/src/elements/ia-status-indicator/icons/search.svg +10 -0
  77. package/dist/src/elements/ia-status-indicator/icons/software.svg +6 -0
  78. package/dist/src/elements/ia-status-indicator/icons/texts.svg +6 -0
  79. package/dist/src/elements/ia-status-indicator/icons/tv.svg +5 -0
  80. package/dist/src/elements/ia-status-indicator/icons/video.svg +6 -0
  81. package/dist/src/elements/ia-status-indicator/icons/web.svg +6 -0
  82. package/dist/src/elements/ia-transcript-view/ia-transcript-view.d.ts +6 -0
  83. package/dist/src/elements/ia-transcript-view/ia-transcript-view.d.ts.map +1 -1
  84. package/dist/src/elements/ia-transcript-view/ia-transcript-view.js +20 -1
  85. package/dist/src/elements/ia-transcript-view/ia-transcript-view.js.map +1 -1
  86. package/dist/src/elements/index.d.ts +4 -0
  87. package/dist/src/elements/index.d.ts.map +1 -1
  88. package/dist/src/elements/index.js +4 -0
  89. package/dist/src/elements/index.js.map +1 -1
  90. package/dist/src/util/masked-icon.d.ts +24 -0
  91. package/dist/src/util/masked-icon.d.ts.map +1 -0
  92. package/dist/src/util/masked-icon.js +30 -0
  93. package/dist/src/util/masked-icon.js.map +1 -0
  94. package/package.json +1 -1
@@ -0,0 +1,5 @@
1
+ <svg viewBox="0 0 300 300"
2
+ xmlns="http://www.w3.org/2000/svg">
3
+ <path d="m237.917039 64.413845c0-9.2252653-7.280839-16.7597371-16.145202-16.7597371h-143.5076619c-8.8913162 0-16.1755245 7.5344718-16.1755245 16.7597371v90.110532c0 9.218529 7.2842083 16.756369 16.1755245 16.756369h143.5076619c8.864363 0 16.145202-7.53784 16.145202-16.756369zm26.070862 112.508493c.347027 17.780275-6.761982 22.667409-22.50288 21.923056-19.861428-.943072-39.773394-.2324-59.668515-.2324h-3.584827c0 .121252.067384.222296.067384.343548 0 5.530444-3.416368 10.161601-8.163569 11.970278l34.729703 56.607899c2.368547 3.859859 1.165743 8.905294-2.712205 11.246134-3.867841 2.37452-8.894686 1.175471-11.243017-2.684388l-39.436475-64.283831h-7.280839l-37.556461 61.255897c-2.378655 3.856491-7.3987611 5.055539-11.2666016 2.687755-3.8577329-2.35768-5.0639061-7.403116-2.708836-11.259607l34.0558636-55.503156c-2.951418-2.344208-5.003261-5.884096-5.003261-10.036981 0-.134725.064015-.242504.064015-.370493-26.0169545-.07073-45.1472665-.740985-64.1124877.296394-16.711227.879078-21.9402239-6.069342-21.653842-22.839183.8153462-44.310913.7917618-88.6218257.033692-132.9327384-.2931203-16.5138648 4.4945115-23.3275602 21.3775677-23.1052646 61.993262.7544576 124.003369.6332055 186.023585.0505217 15.302902-.1481971 20.723943 5.6011742 20.477991 21.3572132-.636778 45.1563095-.808608 90.3564041.064015 135.5093461z" fill="black" fill-rule="evenodd" transform="matrix(1 0 0 -1 0 300)"/>
4
+
5
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg viewBox="0 0 300 300"
2
+ xmlns="http://www.w3.org/2000/svg">
3
+ <path d="m272 280h-9.268431c.276116-.74734.440961-1.53597.440961-2.365889v-6.775607c0-3.831666-3.082608-6.920121-6.882294-6.920121h-12.701336c-3.795565 0-6.882294 3.100842-6.882294 6.920121v6.775607c0 .829919.164845 1.626807.432719 2.365889h-172.3623223c.2678738-.74734.4368403-1.53597.4368403-2.365889v-6.775607c0-3.831666-3.0826085-6.920121-6.8864155-6.920121h-12.6930937c-3.803807 0-6.8905366 3.100842-6.8905366 6.920121v6.775607c0 .829919.1689665 1.626807.4368402 2.365889h-11.1806374v-260h11.1806374c-.2678737.74734-.4368402 1.5359695-.4368402 2.3700175v6.7673495c0 3.8399238 3.0826085 6.9242496 6.8905366 6.9242496h12.6930937c3.7955647 0 6.8864155-3.0967127 6.8864155-6.9242496v-6.7673495c0-.8381769-.1689665-1.6309354-.4368403-2.3700175h172.3664433c-.271995.74734-.43684 1.5359695-.43684 2.3700175v6.7673495c0 3.8399238 3.078487 6.9242496 6.882294 6.9242496h12.701336c3.795565 0 6.882294-3.0967127 6.882294-6.9242496v-6.7673495c0-.8381769-.164845-1.6309354-.43684-2.3700175h9.26431zm-206.786157-222.1333969c0-3.8357948-3.0826085-6.9242496-6.8864155-6.9242496h-12.6930937c-3.803807 0-6.8905366 3.1008417-6.8905366 6.9242496v6.7714785c0 3.8399238 3.0826085 6.9283786 6.8905366 6.9283786h12.6930937c3.7955647 0 6.8864155-3.1008417 6.8864155-6.9283786zm0 35.5007147c0-3.8357949-3.0826085-6.9242497-6.8864155-6.9242497h-12.6930937c-3.803807 0-6.8905366 3.1008417-6.8905366 6.9242497v6.7714782c0 3.835795 3.0826085 6.920121 6.8905366 6.920121h12.6930937c3.7955647 0 6.8864155-3.096713 6.8864155-6.920121zm0 35.4965852c0-3.839923-3.0826085-6.924249-6.8864155-6.924249h-12.6930937c-3.803807 0-6.8905366 3.100841-6.8905366 6.924249v6.771479c0 3.839924 3.0826085 6.92425 6.8905366 6.92425h12.6930937c3.7955647 0 6.8864155-3.100842 6.8864155-6.92425zm0 35.500715c0-3.839924-3.0826085-6.92425-6.8864155-6.92425h-12.6930937c-3.803807 0-6.8905366 3.096713-6.8905366 6.92425v6.771479c0 3.839923 3.0826085 6.928378 6.8905366 6.928378h12.6930937c3.7955647 0 6.8864155-3.10497 6.8864155-6.928378zm0 35.496586c0-3.827537-3.0826085-6.92425-6.8864155-6.92425h-12.6930937c-3.803807 0-6.8905366 3.104971-6.8905366 6.92425v6.771478c0 3.839924 3.0826085 6.928379 6.8905366 6.928379h12.6930937c3.7955647 0 6.8864155-3.104971 6.8864155-6.928379zm0 35.500714c0-3.835794-3.0826085-6.924249-6.8864155-6.924249h-12.6930937c-3.803807 0-6.8905366 3.10497-6.8905366 6.924249v6.771479c0 3.835795 3.0826085 6.928378 6.8905366 6.928378h12.6930937c3.7955647 0 6.8864155-3.10497 6.8864155-6.928378zm155.247251-186.2734632c0-5.8672383-4.805242-10.6692075-10.673738-10.6692075h-119.5788334c-5.8684952 0-10.6737379 4.8019692-10.6737379 10.6692075v74.7009692c0 5.867238 4.8052427 10.665078 10.6737379 10.665078h119.5788334c5.868496 0 10.673738-4.79784 10.673738-10.665078zm.366781 121.3663652c0-5.90027-4.83409-10.727013-10.731434-10.727013h-120.1970034c-5.8973433 0-10.7273127 4.826743-10.7273127 10.727013v75.084961c0 5.896141 4.8299694 10.718755 10.7273127 10.718755h120.1970034c5.897344 0 10.731434-4.822614 10.731434-10.718755zm42.344655-112.5882169c0-3.8357948-3.082608-6.9242496-6.882294-6.9242496h-12.701336c-3.795565 0-6.882294 3.1008417-6.882294 6.9242496v6.7714785c0 3.8399238 3.078487 6.9283786 6.882294 6.9283786h12.701336c3.795565 0 6.882294-3.1008417 6.882294-6.9283786zm0 35.5007147c0-3.8357949-3.082608-6.9242497-6.882294-6.9242497h-12.701336c-3.795565 0-6.882294 3.1008417-6.882294 6.9242497v6.7714782c0 3.835795 3.078487 6.920121 6.882294 6.920121h12.701336c3.795565 0 6.882294-3.096713 6.882294-6.920121zm0 35.4965852c0-3.839923-3.082608-6.924249-6.882294-6.924249h-12.701336c-3.795565 0-6.882294 3.100841-6.882294 6.924249v6.771479c0 3.839924 3.078487 6.92425 6.882294 6.92425h12.701336c3.795565 0 6.882294-3.100842 6.882294-6.92425zm0 35.500715c0-3.839924-3.082608-6.92425-6.882294-6.92425h-12.701336c-3.795565 0-6.882294 3.096713-6.882294 6.92425v6.771479c0 3.839923 3.078487 6.928378 6.882294 6.928378h12.701336c3.795565 0 6.882294-3.10497 6.882294-6.928378zm0 35.496586c0-3.827537-3.082608-6.92425-6.882294-6.92425h-12.701336c-3.795565 0-6.882294 3.104971-6.882294 6.92425v6.771478c0 3.839924 3.078487 6.928379 6.882294 6.928379h12.701336c3.795565 0 6.882294-3.104971 6.882294-6.928379zm0 35.500714c0-3.835794-3.082608-6.924249-6.882294-6.924249h-12.701336c-3.795565 0-6.882294 3.10497-6.882294 6.924249v6.771479c0 3.835795 3.078487 6.928378 6.882294 6.928378h12.701336c3.795565 0 6.882294-3.10497 6.882294-6.928378z" fill="black" fill-rule="evenodd" transform="matrix(1 0 0 -1 0 300)"/>
4
+
5
+
6
+ </svg>
@@ -0,0 +1,6 @@
1
+ <svg viewBox="0 72 300 228"
2
+ xmlns="http://www.w3.org/2000/svg">
3
+ <path d="m261.437982 261.890554h-28.778763v-28.083112h28.778763zm-42.442013 0h-28.793735v-28.083112h28.793735zm40.645399-150.356298v75.703472 19.821613h-219.2617757v-19.821613-75.703472zm-84.228262 150.356298h-134.608315v-27.499419h134.608315zm-155.413106-169.890554v87.643734 100.356266h260v-100.356266-87.643734z" fill="black" transform="matrix(1 0 0 -1 0 372)"/>
4
+
5
+
6
+ </svg>
@@ -55,8 +55,14 @@ export declare class IATranscriptView extends LitElement {
55
55
  /**
56
56
  * Steps auto-scroll aside when the listener scrolls by hand, and arranges to
57
57
  * pick it back up once they've left it alone for a while.
58
+ *
59
+ * A wheel that the transcript cannot act on, such as a wheel-up when it is
60
+ * already at the top, is ignored: the listener sees nothing move, so taking
61
+ * auto-scroll away from them reads as the page misbehaving.
58
62
  */
59
63
  private didScroll;
64
+ /** Whether the transcript has anywhere left to go in `deltaY`'s direction. */
65
+ private canScrollBy;
60
66
  private enableAutoScroll;
61
67
  private get activeTranscriptEntry();
62
68
  private get selectedSearchResult();
@@ -1 +1 @@
1
- {"version":3,"file":"ia-transcript-view.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-transcript-view/ia-transcript-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EAEV,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAMb,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,UAAU,CAAC;AAGxE,OAAO,uBAAuB,CAAC;AAc/B;;;;;GAKG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,+BAA+B;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAEtD,mDAAmD;IACvB,WAAW,SAAK;IAE5C,qEAAqE;IACzC,gBAAgB,SAAM;IAElD,qEAAqE;IACzC,mBAAmB,SAAM;IAErD,8CAA8C;IACjB,UAAU,UAAQ;IAE/C,uDAAuD;IAC3B,yBAAyB,SAAK;IAE1D,yEAAyE;IAC5C,gBAAgB,UAAS;IAEtD,6EAA6E;IACjD,gBAAgB,SAAS;IAE5C,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,cAAc,CAA+B;IAElC,OAAO,CAAC,UAAU,CAAC,CAAqB;IAEpE,OAAO,CAAC,mBAAmB,CAAC,CAAgC;IAE5D,OAAO,CAAC,iBAAiB,CAAC,CAAS;IAEnC,oBAAoB,IAAI,IAAI;IAM5B,MAAM,IAAI,cAAc;IAwBxB,oDAAoD;IACpD,4BAA4B,IAAI,IAAI;IAQpC,6EAA6E;IAC7E,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkBzD,OAAO,KAAK,wBAAwB,GASnC;IAED,OAAO,KAAK,mBAAmB,GAM9B;IAED,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,KAAK,oBAAoB,GAW/B;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAsBhD,OAAO,CAAC,uBAAuB;IAiB/B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,oBAAoB;IAQ5B;;;OAGG;IACH,OAAO,CAAC,SAAS;IASjB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,KAAK,qBAAqB,GAIhC;IAED,OAAO,KAAK,oBAAoB,GAM/B;IAED,OAAO,KAAK,yBAAyB,GAIpC;IAED,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,kBAAkB;IAY1B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,qBAAqB;IAO7B,MAAM,KAAK,MAAM,IAAI,cAAc,CAyMlC;CACF"}
1
+ {"version":3,"file":"ia-transcript-view.d.ts","sourceRoot":"","sources":["../../../../src/elements/ia-transcript-view/ia-transcript-view.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,UAAU,EAEV,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,cAAc,EACpB,MAAM,KAAK,CAAC;AAMb,OAAO,KAAK,EAAE,gBAAgB,EAAyB,MAAM,UAAU,CAAC;AAGxE,OAAO,uBAAuB,CAAC;AAc/B;;;;;GAKG;AACH,qBACa,gBAAiB,SAAQ,UAAU;IAC9C,+BAA+B;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAEtD,mDAAmD;IACvB,WAAW,SAAK;IAE5C,qEAAqE;IACzC,gBAAgB,SAAM;IAElD,qEAAqE;IACzC,mBAAmB,SAAM;IAErD,8CAA8C;IACjB,UAAU,UAAQ;IAE/C,uDAAuD;IAC3B,yBAAyB,SAAK;IAE1D,yEAAyE;IAC5C,gBAAgB,UAAS;IAEtD,6EAA6E;IACjD,gBAAgB,SAAS;IAE5C,OAAO,CAAC,aAAa,CAAK;IAE1B,OAAO,CAAC,cAAc,CAA+B;IAElC,OAAO,CAAC,UAAU,CAAC,CAAqB;IAEpE,OAAO,CAAC,mBAAmB,CAAC,CAAgC;IAE5D,OAAO,CAAC,iBAAiB,CAAC,CAAS;IAEnC,oBAAoB,IAAI,IAAI;IAM5B,MAAM,IAAI,cAAc;IAwBxB,oDAAoD;IACpD,4BAA4B,IAAI,IAAI;IAQpC,6EAA6E;IAC7E,4BAA4B,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAkBzD,OAAO,KAAK,wBAAwB,GAUnC;IAED,OAAO,KAAK,mBAAmB,GAM9B;IAED,OAAO,CAAC,uBAAuB;IAsB/B,OAAO,KAAK,oBAAoB,GAW/B;IAED,OAAO,KAAK,iBAAiB,GAE5B;IAED,OAAO,CAAC,iBAAiB,EAAE,cAAc,GAAG,IAAI;IAsBhD,OAAO,CAAC,uBAAuB;IAiB/B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;IAiB/B,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAY/B,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,oBAAoB;IAQ5B;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IAWjB,8EAA8E;IAC9E,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,KAAK,qBAAqB,GAIhC;IAED,OAAO,KAAK,oBAAoB,GAM/B;IAED,OAAO,KAAK,yBAAyB,GAIpC;IAED,OAAO,CAAC,oBAAoB;IAO5B;;;OAGG;IACH,OAAO,CAAC,eAAe;IAoBvB,OAAO,CAAC,kBAAkB;IAY1B;;;;;OAKG;IACH,OAAO,CAAC,cAAc;IA+BtB,OAAO,CAAC,qBAAqB;IAO7B,MAAM,KAAK,MAAM,IAAI,cAAc,CAyMlC;CACF"}
@@ -95,6 +95,7 @@ let IATranscriptView = IATranscriptView_1 = class IATranscriptView extends LitEl
95
95
  get autoScrollButtonTemplate() {
96
96
  return html `
97
97
  <button
98
+ type="button"
98
99
  class="auto-scroll-button ${this.autoScroll ? 'hidden' : ''}"
99
100
  @click=${this.enableAutoScroll}
100
101
  >
@@ -208,14 +209,32 @@ let IATranscriptView = IATranscriptView_1 = class IATranscriptView extends LitEl
208
209
  /**
209
210
  * Steps auto-scroll aside when the listener scrolls by hand, and arranges to
210
211
  * pick it back up once they've left it alone for a while.
212
+ *
213
+ * A wheel that the transcript cannot act on, such as a wheel-up when it is
214
+ * already at the top, is ignored: the listener sees nothing move, so taking
215
+ * auto-scroll away from them reads as the page misbehaving.
211
216
  */
212
- didScroll() {
217
+ didScroll(event) {
218
+ if (event instanceof WheelEvent && !this.canScrollBy(event.deltaY))
219
+ return;
213
220
  this.autoScroll = false;
214
221
  clearTimeout(this.scrollResumeTimerId);
215
222
  this.scrollResumeTimerId = setTimeout(() => {
216
223
  this.autoScroll = true;
217
224
  }, this.scrollTimerDelay);
218
225
  }
226
+ /** Whether the transcript has anywhere left to go in `deltaY`'s direction. */
227
+ canScrollBy(deltaY) {
228
+ const { scrollView } = this;
229
+ if (!scrollView)
230
+ return false;
231
+ const { scrollTop, scrollHeight, clientHeight } = scrollView;
232
+ if (deltaY < 0)
233
+ return scrollTop > 0;
234
+ if (deltaY > 0)
235
+ return Math.ceil(scrollTop + clientHeight) < scrollHeight;
236
+ return false;
237
+ }
219
238
  enableAutoScroll() {
220
239
  this.autoScroll = true;
221
240
  this.scrollToClosestEntry();
@@ -1 +1 @@
1
- {"version":3,"file":"ia-transcript-view.js","sourceRoot":"","sources":["../../../../src/elements/ia-transcript-view/ia-transcript-view.ts"],"names":[],"mappings":"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","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
+ {"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;IAgjBhE,CAAC;IAxiBC,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;;;oCAGqB,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;;;;;;;OAOG;IACK,SAAS,CAAC,KAAY;QAC5B,IAAI,KAAK,YAAY,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC;YAAE,OAAO;QAE3E,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;IAED,8EAA8E;IACtE,WAAW,CAAC,MAAc;QAChC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAE9B,MAAM,EAAE,SAAS,EAAE,YAAY,EAAE,YAAY,EAAE,GAAG,UAAU,CAAC;QAC7D,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,SAAS,GAAG,CAAC,CAAC;QACrC,IAAI,MAAM,GAAG,CAAC;YAAE,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,YAAY,CAAC,GAAG,YAAY,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,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;AAzkB6B;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,CA2kB5B","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 type=\"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 * A wheel that the transcript cannot act on, such as a wheel-up when it is\n * already at the top, is ignored: the listener sees nothing move, so taking\n * auto-scroll away from them reads as the page misbehaving.\n */\n private didScroll(event: Event): void {\n if (event instanceof WheelEvent && !this.canScrollBy(event.deltaY)) return;\n\n this.autoScroll = false;\n\n clearTimeout(this.scrollResumeTimerId);\n this.scrollResumeTimerId = setTimeout(() => {\n this.autoScroll = true;\n }, this.scrollTimerDelay);\n }\n\n /** Whether the transcript has anywhere left to go in `deltaY`'s direction. */\n private canScrollBy(deltaY: number): boolean {\n const { scrollView } = this;\n if (!scrollView) return false;\n\n const { scrollTop, scrollHeight, clientHeight } = scrollView;\n if (deltaY < 0) return scrollTop > 0;\n if (deltaY > 0) return Math.ceil(scrollTop + clientHeight) < scrollHeight;\n return false;\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"]}
@@ -6,6 +6,10 @@ export * from './ia-dropdown-search-bar/ia-dropdown-search-bar.js';
6
6
  export * from './ia-expandable-search-bar/ia-expandable-search-bar.js';
7
7
  export * from './ia-expandable-search-bar/ia-quick-search.js';
8
8
  export * from './ia-expandable-search-bar/models.js';
9
+ export * from './ia-item-navigator/ia-item-navigator.js';
10
+ export * from './ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js';
11
+ export * from './ia-item-navigator/menus/ia-itemnav-sort-files-button.js';
12
+ export * from './ia-item-navigator/menus/ia-itemnav-share-panel.js';
9
13
  export * from './ia-playback-controls/ia-playback-controls.js';
10
14
  export * from './ia-playback-controls/models.js';
11
15
  export * from './ia-radio-player/ia-radio-player.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2DAA2D,CAAC;AAC1E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC"}
@@ -6,6 +6,10 @@ export * from './ia-dropdown-search-bar/ia-dropdown-search-bar.js';
6
6
  export * from './ia-expandable-search-bar/ia-expandable-search-bar.js';
7
7
  export * from './ia-expandable-search-bar/ia-quick-search.js';
8
8
  export * from './ia-expandable-search-bar/models.js';
9
+ export * from './ia-item-navigator/ia-item-navigator.js';
10
+ export * from './ia-item-navigator/menus/ia-itemnav-viewable-files-panel.js';
11
+ export * from './ia-item-navigator/menus/ia-itemnav-sort-files-button.js';
12
+ export * from './ia-item-navigator/menus/ia-itemnav-share-panel.js';
9
13
  export * from './ia-playback-controls/ia-playback-controls.js';
10
14
  export * from './ia-playback-controls/models.js';
11
15
  export * from './ia-radio-player/ia-radio-player.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './ia-audio-element/ia-audio-element';\nexport * from './ia-audio-element/models';\nexport * from './ia-button/ia-button';\nexport * from './ia-combo-box/ia-combo-box';\nexport * from './ia-dropdown-search-bar/ia-dropdown-search-bar';\nexport * from './ia-expandable-search-bar/ia-expandable-search-bar';\nexport * from './ia-expandable-search-bar/ia-quick-search';\nexport * from './ia-expandable-search-bar/models';\nexport * from './ia-playback-controls/ia-playback-controls';\nexport * from './ia-playback-controls/models';\nexport * from './ia-radio-player/ia-radio-player';\nexport * from './ia-radio-player/ia-search-results-switcher';\nexport * from './ia-radio-player/models';\nexport * from './ia-radio-player/search/backends/full-text-search-backend';\nexport * from './ia-radio-player/search/backends/full-text-search-response';\nexport * from './ia-radio-player/search/backends/local-search-backend';\nexport * from './ia-radio-player/search/backends/search-backend';\nexport * from './ia-radio-player/search/models';\nexport * from './ia-radio-player/search/search-handler';\nexport * from './ia-radio-player/search/search-helper';\nexport * from './ia-radio-player/search/transcript-index';\nexport * from './ia-scrubber-bar/ia-scrubber-bar';\nexport * from './ia-scrubber-bar/ia-section-marker';\nexport * from './ia-scrubber-bar/models';\nexport * from './ia-transcript-view/duration-formatter';\nexport * from './ia-transcript-view/ia-transcript-entry';\nexport * from './ia-transcript-view/ia-transcript-view';\nexport * from './ia-transcript-view/models';\nexport * from './ia-waveform-progress/ia-waveform-progress';\nexport * from './ia-waveform-progress/models';\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/elements/index.ts"],"names":[],"mappings":"AAAA,cAAc,qCAAqC,CAAC;AACpD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,uBAAuB,CAAC;AACtC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,iDAAiD,CAAC;AAChE,cAAc,qDAAqD,CAAC;AACpE,cAAc,4CAA4C,CAAC;AAC3D,cAAc,mCAAmC,CAAC;AAClD,cAAc,uCAAuC,CAAC;AACtD,cAAc,2DAA2D,CAAC;AAC1E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC;AAC9C,cAAc,mCAAmC,CAAC;AAClD,cAAc,8CAA8C,CAAC;AAC7D,cAAc,0BAA0B,CAAC;AACzC,cAAc,4DAA4D,CAAC;AAC3E,cAAc,6DAA6D,CAAC;AAC5E,cAAc,wDAAwD,CAAC;AACvE,cAAc,kDAAkD,CAAC;AACjE,cAAc,iCAAiC,CAAC;AAChD,cAAc,yCAAyC,CAAC;AACxD,cAAc,wCAAwC,CAAC;AACvD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,mCAAmC,CAAC;AAClD,cAAc,qCAAqC,CAAC;AACpD,cAAc,0BAA0B,CAAC;AACzC,cAAc,yCAAyC,CAAC;AACxD,cAAc,0CAA0C,CAAC;AACzD,cAAc,yCAAyC,CAAC;AACxD,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6CAA6C,CAAC;AAC5D,cAAc,+BAA+B,CAAC","sourcesContent":["export * from './ia-audio-element/ia-audio-element';\nexport * from './ia-audio-element/models';\nexport * from './ia-button/ia-button';\nexport * from './ia-combo-box/ia-combo-box';\nexport * from './ia-dropdown-search-bar/ia-dropdown-search-bar';\nexport * from './ia-expandable-search-bar/ia-expandable-search-bar';\nexport * from './ia-expandable-search-bar/ia-quick-search';\nexport * from './ia-expandable-search-bar/models';\nexport * from './ia-item-navigator/ia-item-navigator';\nexport * from './ia-item-navigator/menus/ia-itemnav-viewable-files-panel';\nexport * from './ia-item-navigator/menus/ia-itemnav-sort-files-button';\nexport * from './ia-item-navigator/menus/ia-itemnav-share-panel';\nexport * from './ia-playback-controls/ia-playback-controls';\nexport * from './ia-playback-controls/models';\nexport * from './ia-radio-player/ia-radio-player';\nexport * from './ia-radio-player/ia-search-results-switcher';\nexport * from './ia-radio-player/models';\nexport * from './ia-radio-player/search/backends/full-text-search-backend';\nexport * from './ia-radio-player/search/backends/full-text-search-response';\nexport * from './ia-radio-player/search/backends/local-search-backend';\nexport * from './ia-radio-player/search/backends/search-backend';\nexport * from './ia-radio-player/search/models';\nexport * from './ia-radio-player/search/search-handler';\nexport * from './ia-radio-player/search/search-helper';\nexport * from './ia-radio-player/search/transcript-index';\nexport * from './ia-scrubber-bar/ia-scrubber-bar';\nexport * from './ia-scrubber-bar/ia-section-marker';\nexport * from './ia-scrubber-bar/models';\nexport * from './ia-transcript-view/duration-formatter';\nexport * from './ia-transcript-view/ia-transcript-entry';\nexport * from './ia-transcript-view/ia-transcript-view';\nexport * from './ia-transcript-view/models';\nexport * from './ia-waveform-progress/ia-waveform-progress';\nexport * from './ia-waveform-progress/models';\n"]}
@@ -0,0 +1,24 @@
1
+ import { type TemplateResult } from 'lit';
2
+ /**
3
+ * Renders an icon from a standalone `.svg` file as a CSS-masked element.
4
+ *
5
+ * The glyphs live as `.svg` assets rather than inline templates so their path
6
+ * data stays out of the JS bundle. They are drawn with `mask-image` (not
7
+ * `<img>`) so host components can still recolor them: the mask supplies the
8
+ * shape and `background-color` supplies the paint, which keeps the
9
+ * `--item-navigator-icon-color` theming working.
10
+ *
11
+ * The mask geometry is set inline so an icon renders correctly wherever it is
12
+ * slotted — including inside a consumer's shadow DOM, for the icons this
13
+ * package exports publicly. Hosts only supply `background-color` and a size,
14
+ * both of which legitimately vary per host. Icons are decorative (always
15
+ * labelled by adjacent text or an `aria-label` on the control), so the span is
16
+ * `aria-hidden`.
17
+ *
18
+ * The `url()` is quoted deliberately: bundlers inline small SVGs as `data:`
19
+ * URIs whose markup contains apostrophes, and an *unquoted* CSS `url()` token
20
+ * cannot contain them — the whole `mask-image` declaration would be dropped
21
+ * and the glyph would paint as a solid block.
22
+ */
23
+ export declare const maskedIcon: (url: string) => TemplateResult;
24
+ //# sourceMappingURL=masked-icon.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masked-icon.d.ts","sourceRoot":"","sources":["../../../src/util/masked-icon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,cAAc,EAAE,MAAM,KAAK,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,UAAU,GAAI,KAAK,MAAM,KAAG,cAMxC,CAAC"}
@@ -0,0 +1,30 @@
1
+ import { html } from 'lit';
2
+ /**
3
+ * Renders an icon from a standalone `.svg` file as a CSS-masked element.
4
+ *
5
+ * The glyphs live as `.svg` assets rather than inline templates so their path
6
+ * data stays out of the JS bundle. They are drawn with `mask-image` (not
7
+ * `<img>`) so host components can still recolor them: the mask supplies the
8
+ * shape and `background-color` supplies the paint, which keeps the
9
+ * `--item-navigator-icon-color` theming working.
10
+ *
11
+ * The mask geometry is set inline so an icon renders correctly wherever it is
12
+ * slotted — including inside a consumer's shadow DOM, for the icons this
13
+ * package exports publicly. Hosts only supply `background-color` and a size,
14
+ * both of which legitimately vary per host. Icons are decorative (always
15
+ * labelled by adjacent text or an `aria-label` on the control), so the span is
16
+ * `aria-hidden`.
17
+ *
18
+ * The `url()` is quoted deliberately: bundlers inline small SVGs as `data:`
19
+ * URIs whose markup contains apostrophes, and an *unquoted* CSS `url()` token
20
+ * cannot contain them — the whole `mask-image` declaration would be dropped
21
+ * and the glyph would paint as a solid block.
22
+ */
23
+ export const maskedIcon = (url) => html `
24
+ <span
25
+ class="ia-icon"
26
+ aria-hidden="true"
27
+ style='-webkit-mask-image:url("${url}");mask-image:url("${url}");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain;display:inline-block'
28
+ ></span>
29
+ `;
30
+ //# sourceMappingURL=masked-icon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"masked-icon.js","sourceRoot":"","sources":["../../../src/util/masked-icon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAuB,MAAM,KAAK,CAAC;AAEhD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,GAAW,EAAkB,EAAE,CAAC,IAAI,CAAA;;;;qCAI1B,GAAG,sBAAsB,GAAG;;CAEhE,CAAC","sourcesContent":["import { html, type TemplateResult } from 'lit';\n\n/**\n * Renders an icon from a standalone `.svg` file as a CSS-masked element.\n *\n * The glyphs live as `.svg` assets rather than inline templates so their path\n * data stays out of the JS bundle. They are drawn with `mask-image` (not\n * `<img>`) so host components can still recolor them: the mask supplies the\n * shape and `background-color` supplies the paint, which keeps the\n * `--item-navigator-icon-color` theming working.\n *\n * The mask geometry is set inline so an icon renders correctly wherever it is\n * slotted — including inside a consumer's shadow DOM, for the icons this\n * package exports publicly. Hosts only supply `background-color` and a size,\n * both of which legitimately vary per host. Icons are decorative (always\n * labelled by adjacent text or an `aria-label` on the control), so the span is\n * `aria-hidden`.\n *\n * The `url()` is quoted deliberately: bundlers inline small SVGs as `data:`\n * URIs whose markup contains apostrophes, and an *unquoted* CSS `url()` token\n * cannot contain them — the whole `mask-image` declaration would be dropped\n * and the glyph would paint as a solid block.\n */\nexport const maskedIcon = (url: string): TemplateResult => html`\n <span\n class=\"ia-icon\"\n aria-hidden=\"true\"\n style='-webkit-mask-image:url(\"${url}\");mask-image:url(\"${url}\");-webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain;display:inline-block'\n ></span>\n`;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@internetarchive/elements",
3
- "version": "0.2.14-webdev-8969.0",
3
+ "version": "0.3.0",
4
4
  "description": "A web component library from the Internet Archive.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "types": "./dist/src/elements/index.d.ts",