@internetarchive/collection-browser 3.3.2 → 3.3.3

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 (532) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +27 -27
  3. package/.github/workflows/gh-pages-main.yml +39 -39
  4. package/.github/workflows/npm-publish.yml +39 -39
  5. package/.github/workflows/pr-preview.yml +38 -38
  6. package/.husky/pre-commit +4 -4
  7. package/.prettierignore +1 -1
  8. package/LICENSE +661 -661
  9. package/README.md +83 -83
  10. package/dist/index.d.ts +16 -0
  11. package/dist/index.js.map +1 -0
  12. package/dist/src/app-root.d.ts +105 -0
  13. package/dist/src/app-root.js +1076 -0
  14. package/dist/src/app-root.js.map +1 -0
  15. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -0
  16. package/dist/src/assets/img/icons/arrow-left.js +10 -0
  17. package/dist/src/assets/img/icons/arrow-left.js.map +1 -0
  18. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -0
  19. package/dist/src/assets/img/icons/arrow-right.js +10 -0
  20. package/dist/src/assets/img/icons/arrow-right.js.map +1 -0
  21. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  22. package/dist/src/assets/img/icons/chevron.js +4 -0
  23. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  24. package/dist/src/assets/img/icons/close-circle-dark.d.ts +2 -0
  25. package/dist/src/assets/img/icons/close-circle-dark.js +5 -0
  26. package/dist/src/assets/img/icons/close-circle-dark.js.map +1 -0
  27. package/dist/src/assets/img/icons/contract.d.ts +2 -0
  28. package/dist/src/assets/img/icons/contract.js +9 -0
  29. package/dist/src/assets/img/icons/contract.js.map +1 -0
  30. package/dist/src/assets/img/icons/empty-query.d.ts +2 -0
  31. package/dist/src/assets/img/icons/empty-query.js +5 -0
  32. package/dist/src/assets/img/icons/empty-query.js.map +1 -0
  33. package/dist/src/assets/img/icons/expand.d.ts +2 -0
  34. package/dist/src/assets/img/icons/expand.js +9 -0
  35. package/dist/src/assets/img/icons/expand.js.map +1 -0
  36. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  37. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  38. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  39. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  40. package/dist/src/assets/img/icons/eye.js +5 -0
  41. package/dist/src/assets/img/icons/eye.js.map +1 -0
  42. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -0
  43. package/dist/src/assets/img/icons/favorite-filled.js +10 -0
  44. package/dist/src/assets/img/icons/favorite-filled.js.map +1 -0
  45. package/dist/src/assets/img/icons/favorite-unfilled.d.ts +1 -0
  46. package/dist/src/assets/img/icons/favorite-unfilled.js +9 -0
  47. package/dist/src/assets/img/icons/favorite-unfilled.js.map +1 -0
  48. package/dist/src/assets/img/icons/filter.d.ts +2 -0
  49. package/dist/src/assets/img/icons/filter.js +10 -0
  50. package/dist/src/assets/img/icons/filter.js.map +1 -0
  51. package/dist/src/assets/img/icons/login-required.d.ts +1 -0
  52. package/dist/src/assets/img/icons/login-required.js +18 -0
  53. package/dist/src/assets/img/icons/login-required.js.map +1 -0
  54. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -0
  55. package/dist/src/assets/img/icons/mediatype/account.js +14 -0
  56. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -0
  57. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -0
  58. package/dist/src/assets/img/icons/mediatype/audio.js +14 -0
  59. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -0
  60. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -0
  61. package/dist/src/assets/img/icons/mediatype/collection.js +12 -0
  62. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -0
  63. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  64. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  65. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  66. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -0
  67. package/dist/src/assets/img/icons/mediatype/etree.js +14 -0
  68. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -0
  69. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -0
  70. package/dist/src/assets/img/icons/mediatype/film.js +14 -0
  71. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -0
  72. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -0
  73. package/dist/src/assets/img/icons/mediatype/images.js +13 -0
  74. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -0
  75. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  76. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  77. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  78. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -0
  79. package/dist/src/assets/img/icons/mediatype/search.js +14 -0
  80. package/dist/src/assets/img/icons/mediatype/search.js.map +1 -0
  81. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -0
  82. package/dist/src/assets/img/icons/mediatype/software.js +13 -0
  83. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -0
  84. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -0
  85. package/dist/src/assets/img/icons/mediatype/texts.js +13 -0
  86. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -0
  87. package/dist/src/assets/img/icons/mediatype/tv-commercial.d.ts +1 -0
  88. package/dist/src/assets/img/icons/mediatype/tv-commercial.js +12 -0
  89. package/dist/src/assets/img/icons/mediatype/tv-commercial.js.map +1 -0
  90. package/dist/src/assets/img/icons/mediatype/tv-fact-check.d.ts +1 -0
  91. package/dist/src/assets/img/icons/mediatype/tv-fact-check.js +12 -0
  92. package/dist/src/assets/img/icons/mediatype/tv-fact-check.js.map +1 -0
  93. package/dist/src/assets/img/icons/mediatype/tv-quote.d.ts +1 -0
  94. package/dist/src/assets/img/icons/mediatype/tv-quote.js +12 -0
  95. package/dist/src/assets/img/icons/mediatype/tv-quote.js.map +1 -0
  96. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -0
  97. package/dist/src/assets/img/icons/mediatype/tv.js +14 -0
  98. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -0
  99. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -0
  100. package/dist/src/assets/img/icons/mediatype/video.js +14 -0
  101. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -0
  102. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -0
  103. package/dist/src/assets/img/icons/mediatype/web.js +13 -0
  104. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -0
  105. package/dist/src/assets/img/icons/null-result.d.ts +2 -0
  106. package/dist/src/assets/img/icons/null-result.js +5 -0
  107. package/dist/src/assets/img/icons/null-result.js.map +1 -0
  108. package/dist/src/assets/img/icons/quote.d.ts +1 -0
  109. package/dist/src/assets/img/icons/quote.js +7 -0
  110. package/dist/src/assets/img/icons/quote.js.map +1 -0
  111. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  112. package/dist/src/assets/img/icons/restricted.js +13 -0
  113. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  114. package/dist/src/assets/img/icons/reviews.d.ts +1 -0
  115. package/dist/src/assets/img/icons/reviews.js +11 -0
  116. package/dist/src/assets/img/icons/reviews.js.map +1 -0
  117. package/dist/src/assets/img/icons/upload.d.ts +1 -0
  118. package/dist/src/assets/img/icons/upload.js +12 -0
  119. package/dist/src/assets/img/icons/upload.js.map +1 -0
  120. package/dist/src/assets/img/icons/views.d.ts +1 -0
  121. package/dist/src/assets/img/icons/views.js +11 -0
  122. package/dist/src/assets/img/icons/views.js.map +1 -0
  123. package/dist/src/circular-activity-indicator.d.ts +5 -0
  124. package/dist/src/circular-activity-indicator.js +66 -0
  125. package/dist/src/circular-activity-indicator.js.map +1 -0
  126. package/dist/src/collection-browser.d.ts +684 -0
  127. package/dist/src/collection-browser.js +2567 -0
  128. package/dist/src/collection-browser.js.map +1 -0
  129. package/dist/src/collection-facets/facet-row.d.ts +30 -0
  130. package/dist/src/collection-facets/facet-row.js +265 -0
  131. package/dist/src/collection-facets/facet-row.js.map +1 -0
  132. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -0
  133. package/dist/src/collection-facets/facet-tombstone-row.js +43 -0
  134. package/dist/src/collection-facets/facet-tombstone-row.js.map +1 -0
  135. package/dist/src/collection-facets/facets-template.d.ts +13 -0
  136. package/dist/src/collection-facets/facets-template.js +68 -0
  137. package/dist/src/collection-facets/facets-template.js.map +1 -0
  138. package/dist/src/collection-facets/models.d.ts +9 -0
  139. package/dist/src/collection-facets/models.js +10 -0
  140. package/dist/src/collection-facets/models.js.map +1 -0
  141. package/dist/src/collection-facets/more-facets-content.d.ts +109 -0
  142. package/dist/src/collection-facets/more-facets-content.js +547 -0
  143. package/dist/src/collection-facets/more-facets-content.js.map +1 -0
  144. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -0
  145. package/dist/src/collection-facets/more-facets-pagination.js +264 -0
  146. package/dist/src/collection-facets/more-facets-pagination.js.map +1 -0
  147. package/dist/src/collection-facets/smart-facets/dedupe.d.ts +10 -0
  148. package/dist/src/collection-facets/smart-facets/dedupe.js +35 -0
  149. package/dist/src/collection-facets/smart-facets/dedupe.js.map +1 -0
  150. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.d.ts +5 -0
  151. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.js +24 -0
  152. package/dist/src/collection-facets/smart-facets/heuristics/browser-language/browser-language-heuristic.js.map +1 -0
  153. package/dist/src/collection-facets/smart-facets/heuristics/index.d.ts +3 -0
  154. package/dist/src/collection-facets/smart-facets/heuristics/index.js +4 -0
  155. package/dist/src/collection-facets/smart-facets/heuristics/index.js.map +1 -0
  156. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.d.ts +4 -0
  157. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.js +14 -0
  158. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-heuristic.js.map +1 -0
  159. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.d.ts +6 -0
  160. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.js +68 -0
  161. package/dist/src/collection-facets/smart-facets/heuristics/query-keywords/query-keywords-map.js.map +1 -0
  162. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.d.ts +9 -0
  163. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.js +69 -0
  164. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-entity-map.js.map +1 -0
  165. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.d.ts +21 -0
  166. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js +76 -0
  167. package/dist/src/collection-facets/smart-facets/heuristics/wikidata/wikidata-heuristic.js.map +1 -0
  168. package/dist/src/collection-facets/smart-facets/models.d.ts +30 -0
  169. package/dist/src/collection-facets/smart-facets/models.js +2 -0
  170. package/dist/src/collection-facets/smart-facets/models.js.map +1 -0
  171. package/dist/src/collection-facets/smart-facets/smart-facet-bar.d.ts +54 -0
  172. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js +383 -0
  173. package/dist/src/collection-facets/smart-facets/smart-facet-bar.js.map +1 -0
  174. package/dist/src/collection-facets/smart-facets/smart-facet-button.d.ts +11 -0
  175. package/dist/src/collection-facets/smart-facets/smart-facet-button.js +133 -0
  176. package/dist/src/collection-facets/smart-facets/smart-facet-button.js.map +1 -0
  177. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.d.ts +28 -0
  178. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js +172 -0
  179. package/dist/src/collection-facets/smart-facets/smart-facet-dropdown.js.map +1 -0
  180. package/dist/src/collection-facets/smart-facets/smart-facet-equals.d.ts +2 -0
  181. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js +13 -0
  182. package/dist/src/collection-facets/smart-facets/smart-facet-equals.js.map +1 -0
  183. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.d.ts +5 -0
  184. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js +18 -0
  185. package/dist/src/collection-facets/smart-facets/smart-facet-heuristics.js.map +1 -0
  186. package/dist/src/collection-facets/toggle-switch.d.ts +41 -0
  187. package/dist/src/collection-facets/toggle-switch.js +174 -0
  188. package/dist/src/collection-facets/toggle-switch.js.map +1 -0
  189. package/dist/src/collection-facets.d.ts +113 -0
  190. package/dist/src/collection-facets.js +872 -0
  191. package/dist/src/collection-facets.js.map +1 -0
  192. package/dist/src/data-source/collection-browser-data-source-interface.d.ts +261 -0
  193. package/dist/src/data-source/collection-browser-data-source-interface.js +2 -0
  194. package/dist/src/data-source/collection-browser-data-source-interface.js.map +1 -0
  195. package/dist/src/data-source/collection-browser-data-source.d.ts +400 -0
  196. package/dist/src/data-source/collection-browser-data-source.js +1103 -0
  197. package/dist/src/data-source/collection-browser-data-source.js.map +1 -0
  198. package/dist/src/data-source/collection-browser-query-state.d.ts +49 -0
  199. package/dist/src/data-source/collection-browser-query-state.js +2 -0
  200. package/dist/src/data-source/collection-browser-query-state.js.map +1 -0
  201. package/dist/src/data-source/models.d.ts +32 -0
  202. package/dist/src/data-source/models.js +9 -0
  203. package/dist/src/data-source/models.js.map +1 -0
  204. package/dist/src/empty-placeholder.d.ts +23 -0
  205. package/dist/src/empty-placeholder.js +165 -0
  206. package/dist/src/empty-placeholder.js.map +1 -0
  207. package/dist/src/expanded-date-picker.d.ts +50 -0
  208. package/dist/src/expanded-date-picker.js +182 -0
  209. package/dist/src/expanded-date-picker.js.map +1 -0
  210. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  211. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  212. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  213. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  214. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  215. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  216. package/dist/src/manage/manage-bar.d.ts +58 -0
  217. package/dist/src/manage/manage-bar.js +237 -0
  218. package/dist/src/manage/manage-bar.js.map +1 -0
  219. package/dist/src/manage/remove-items-modal-content.d.ts +9 -0
  220. package/dist/src/manage/remove-items-modal-content.js +104 -0
  221. package/dist/src/manage/remove-items-modal-content.js.map +1 -0
  222. package/dist/src/mediatype/mediatype-config.d.ts +11 -0
  223. package/dist/src/mediatype/mediatype-config.js +116 -0
  224. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  225. package/dist/src/models.d.ts +302 -0
  226. package/dist/src/models.js +511 -0
  227. package/dist/src/models.js.map +1 -0
  228. package/dist/src/restoration-state-handler.d.ts +75 -0
  229. package/dist/src/restoration-state-handler.js +403 -0
  230. package/dist/src/restoration-state-handler.js.map +1 -0
  231. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -0
  232. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +60 -0
  233. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -0
  234. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -0
  235. package/dist/src/sort-filter-bar/alpha-bar.js +241 -0
  236. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -0
  237. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  238. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  239. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  240. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  241. package/dist/src/sort-filter-bar/img/list.js +5 -0
  242. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  243. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -0
  244. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +15 -0
  245. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js.map +1 -0
  246. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -0
  247. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +17 -0
  248. package/dist/src/sort-filter-bar/img/sort-toggle-down.js.map +1 -0
  249. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -0
  250. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +17 -0
  251. package/dist/src/sort-filter-bar/img/sort-toggle-up.js.map +1 -0
  252. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  253. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  254. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  255. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  256. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  257. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  258. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +278 -0
  259. package/dist/src/sort-filter-bar/sort-filter-bar.js +1161 -0
  260. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -0
  261. package/dist/src/styles/ia-button.d.ts +2 -0
  262. package/dist/src/styles/ia-button.js +134 -0
  263. package/dist/src/styles/ia-button.js.map +1 -0
  264. package/dist/src/styles/item-image-styles.d.ts +8 -0
  265. package/dist/src/styles/item-image-styles.js +123 -0
  266. package/dist/src/styles/item-image-styles.js.map +1 -0
  267. package/dist/src/styles/sr-only.d.ts +1 -0
  268. package/dist/src/styles/sr-only.js +18 -0
  269. package/dist/src/styles/sr-only.js.map +1 -0
  270. package/dist/src/tiles/base-tile-component.d.ts +27 -0
  271. package/dist/src/tiles/base-tile-component.js +82 -0
  272. package/dist/src/tiles/base-tile-component.js.map +1 -0
  273. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  274. package/dist/src/tiles/collection-browser-loading-tile.js +29 -0
  275. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  276. package/dist/src/tiles/grid/account-tile.d.ts +18 -0
  277. package/dist/src/tiles/grid/account-tile.js +111 -0
  278. package/dist/src/tiles/grid/account-tile.js.map +1 -0
  279. package/dist/src/tiles/grid/collection-tile.d.ts +15 -0
  280. package/dist/src/tiles/grid/collection-tile.js +160 -0
  281. package/dist/src/tiles/grid/collection-tile.js.map +1 -0
  282. package/dist/src/tiles/grid/item-tile.d.ts +41 -0
  283. package/dist/src/tiles/grid/item-tile.js +321 -0
  284. package/dist/src/tiles/grid/item-tile.js.map +1 -0
  285. package/dist/src/tiles/grid/search-tile.d.ts +10 -0
  286. package/dist/src/tiles/grid/search-tile.js +95 -0
  287. package/dist/src/tiles/grid/search-tile.js.map +1 -0
  288. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -0
  289. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +128 -0
  290. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -0
  291. package/dist/src/tiles/grid/tile-stats.d.ts +58 -0
  292. package/dist/src/tiles/grid/tile-stats.js +204 -0
  293. package/dist/src/tiles/grid/tile-stats.js.map +1 -0
  294. package/dist/src/tiles/hover/hover-pane-controller.d.ts +228 -0
  295. package/dist/src/tiles/hover/hover-pane-controller.js +446 -0
  296. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -0
  297. package/dist/src/tiles/hover/tile-hover-pane.d.ts +20 -0
  298. package/dist/src/tiles/hover/tile-hover-pane.js +185 -0
  299. package/dist/src/tiles/hover/tile-hover-pane.js.map +1 -0
  300. package/dist/src/tiles/image-block.d.ts +19 -0
  301. package/dist/src/tiles/image-block.js +175 -0
  302. package/dist/src/tiles/image-block.js.map +1 -0
  303. package/dist/src/tiles/item-image.d.ts +40 -0
  304. package/dist/src/tiles/item-image.js +191 -0
  305. package/dist/src/tiles/item-image.js.map +1 -0
  306. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -0
  307. package/dist/src/tiles/list/tile-list-compact-header.js +85 -0
  308. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  309. package/dist/src/tiles/list/tile-list-compact.d.ts +19 -0
  310. package/dist/src/tiles/list/tile-list-compact.js +223 -0
  311. package/dist/src/tiles/list/tile-list-compact.js.map +1 -0
  312. package/dist/src/tiles/list/tile-list.d.ts +54 -0
  313. package/dist/src/tiles/list/tile-list.js +621 -0
  314. package/dist/src/tiles/list/tile-list.js.map +1 -0
  315. package/dist/src/tiles/models.d.ts +1 -0
  316. package/dist/src/tiles/models.js +2 -0
  317. package/dist/src/tiles/models.js.map +1 -0
  318. package/dist/src/tiles/overlay/icon-overlay.d.ts +8 -0
  319. package/dist/src/tiles/overlay/icon-overlay.js +55 -0
  320. package/dist/src/tiles/overlay/icon-overlay.js.map +1 -0
  321. package/dist/src/tiles/overlay/text-overlay.d.ts +9 -0
  322. package/dist/src/tiles/overlay/text-overlay.js +74 -0
  323. package/dist/src/tiles/overlay/text-overlay.js.map +1 -0
  324. package/dist/src/tiles/review-block.d.ts +12 -0
  325. package/dist/src/tiles/review-block.js +134 -0
  326. package/dist/src/tiles/review-block.js.map +1 -0
  327. package/dist/src/tiles/text-snippet-block.d.ts +27 -0
  328. package/dist/src/tiles/text-snippet-block.js +132 -0
  329. package/dist/src/tiles/text-snippet-block.js.map +1 -0
  330. package/dist/src/tiles/tile-dispatcher.d.ts +71 -0
  331. package/dist/src/tiles/tile-dispatcher.js +472 -0
  332. package/dist/src/tiles/tile-dispatcher.js.map +1 -0
  333. package/dist/src/tiles/tile-display-value-provider.d.ts +47 -0
  334. package/dist/src/tiles/tile-display-value-provider.js +95 -0
  335. package/dist/src/tiles/tile-display-value-provider.js.map +1 -0
  336. package/dist/src/tiles/tile-mediatype-icon.d.ts +27 -0
  337. package/dist/src/tiles/tile-mediatype-icon.js +130 -0
  338. package/dist/src/tiles/tile-mediatype-icon.js.map +1 -0
  339. package/dist/src/utils/analytics-events.d.ts +28 -0
  340. package/dist/src/utils/analytics-events.js +31 -0
  341. package/dist/src/utils/analytics-events.js.map +1 -0
  342. package/dist/src/utils/array-equals.d.ts +4 -0
  343. package/dist/src/utils/array-equals.js +11 -0
  344. package/dist/src/utils/array-equals.js.map +1 -0
  345. package/dist/src/utils/collapse-repeated-quotes.d.ts +11 -0
  346. package/dist/src/utils/collapse-repeated-quotes.js +14 -0
  347. package/dist/src/utils/collapse-repeated-quotes.js.map +1 -0
  348. package/dist/src/utils/facet-utils.d.ts +83 -0
  349. package/dist/src/utils/facet-utils.js +152 -0
  350. package/dist/src/utils/facet-utils.js.map +1 -0
  351. package/dist/src/utils/format-count.d.ts +7 -0
  352. package/dist/src/utils/format-count.js +76 -0
  353. package/dist/src/utils/format-count.js.map +1 -0
  354. package/dist/src/utils/format-date.d.ts +16 -0
  355. package/dist/src/utils/format-date.js +33 -0
  356. package/dist/src/utils/format-date.js.map +1 -0
  357. package/dist/src/utils/format-unit-size.d.ts +2 -0
  358. package/dist/src/utils/format-unit-size.js +34 -0
  359. package/dist/src/utils/format-unit-size.js.map +1 -0
  360. package/dist/src/utils/local-date-from-utc.d.ts +9 -0
  361. package/dist/src/utils/local-date-from-utc.js +16 -0
  362. package/dist/src/utils/local-date-from-utc.js.map +1 -0
  363. package/dist/src/utils/log.d.ts +7 -0
  364. package/dist/src/utils/log.js +14 -0
  365. package/dist/src/utils/log.js.map +1 -0
  366. package/dist/src/utils/resolve-mediatype.d.ts +8 -0
  367. package/dist/src/utils/resolve-mediatype.js +24 -0
  368. package/dist/src/utils/resolve-mediatype.js.map +1 -0
  369. package/dist/src/utils/sha1.d.ts +2 -0
  370. package/dist/src/utils/sha1.js +9 -0
  371. package/dist/src/utils/sha1.js.map +1 -0
  372. package/dist/test/collection-browser.test.d.ts +1 -0
  373. package/dist/test/collection-browser.test.js +1711 -0
  374. package/dist/test/collection-browser.test.js.map +1 -0
  375. package/dist/test/collection-facets/facet-row.test.d.ts +1 -0
  376. package/dist/test/collection-facets/facet-row.test.js +274 -0
  377. package/dist/test/collection-facets/facet-row.test.js.map +1 -0
  378. package/dist/test/collection-facets/facets-template.test.d.ts +1 -0
  379. package/dist/test/collection-facets/facets-template.test.js +101 -0
  380. package/dist/test/collection-facets/facets-template.test.js.map +1 -0
  381. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -0
  382. package/dist/test/collection-facets/more-facets-content.test.js +169 -0
  383. package/dist/test/collection-facets/more-facets-content.test.js.map +1 -0
  384. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -0
  385. package/dist/test/collection-facets/more-facets-pagination.test.js +132 -0
  386. package/dist/test/collection-facets/more-facets-pagination.test.js.map +1 -0
  387. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -0
  388. package/dist/test/collection-facets/toggle-switch.test.js +96 -0
  389. package/dist/test/collection-facets/toggle-switch.test.js.map +1 -0
  390. package/dist/test/collection-facets.test.d.ts +2 -0
  391. package/dist/test/collection-facets.test.js +745 -0
  392. package/dist/test/collection-facets.test.js.map +1 -0
  393. package/dist/test/data-source/collection-browser-data-source.test.d.ts +1 -0
  394. package/dist/test/data-source/collection-browser-data-source.test.js +102 -0
  395. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -0
  396. package/dist/test/empty-placeholder.test.d.ts +1 -0
  397. package/dist/test/empty-placeholder.test.js +63 -0
  398. package/dist/test/empty-placeholder.test.js.map +1 -0
  399. package/dist/test/expanded-date-picker.test.d.ts +1 -0
  400. package/dist/test/expanded-date-picker.test.js +130 -0
  401. package/dist/test/expanded-date-picker.test.js.map +1 -0
  402. package/dist/test/icon-overlay.test.d.ts +1 -0
  403. package/dist/test/icon-overlay.test.js +30 -0
  404. package/dist/test/icon-overlay.test.js.map +1 -0
  405. package/dist/test/image-block.test.d.ts +1 -0
  406. package/dist/test/image-block.test.js +218 -0
  407. package/dist/test/image-block.test.js.map +1 -0
  408. package/dist/test/item-image.test.d.ts +1 -0
  409. package/dist/test/item-image.test.js +196 -0
  410. package/dist/test/item-image.test.js.map +1 -0
  411. package/dist/test/manage/manage-bar.test.d.ts +2 -0
  412. package/dist/test/manage/manage-bar.test.js +106 -0
  413. package/dist/test/manage/manage-bar.test.js.map +1 -0
  414. package/dist/test/manage/remove-items-modal-content.test.d.ts +1 -0
  415. package/dist/test/manage/remove-items-modal-content.test.js +65 -0
  416. package/dist/test/manage/remove-items-modal-content.test.js.map +1 -0
  417. package/dist/test/mediatype-config.test.d.ts +1 -0
  418. package/dist/test/mediatype-config.test.js +11 -0
  419. package/dist/test/mediatype-config.test.js.map +1 -0
  420. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -0
  421. package/dist/test/mocks/mock-analytics-handler.js +16 -0
  422. package/dist/test/mocks/mock-analytics-handler.js.map +1 -0
  423. package/dist/test/mocks/mock-search-responses.d.ts +31 -0
  424. package/dist/test/mocks/mock-search-responses.js +1241 -0
  425. package/dist/test/mocks/mock-search-responses.js.map +1 -0
  426. package/dist/test/mocks/mock-search-service.d.ts +16 -0
  427. package/dist/test/mocks/mock-search-service.js +65 -0
  428. package/dist/test/mocks/mock-search-service.js.map +1 -0
  429. package/dist/test/restoration-state-handler.test.d.ts +1 -0
  430. package/dist/test/restoration-state-handler.test.js +375 -0
  431. package/dist/test/restoration-state-handler.test.js.map +1 -0
  432. package/dist/test/review-block.test.d.ts +1 -0
  433. package/dist/test/review-block.test.js +48 -0
  434. package/dist/test/review-block.test.js.map +1 -0
  435. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -0
  436. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +13 -0
  437. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -0
  438. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -0
  439. package/dist/test/sort-filter-bar/alpha-bar.test.js +74 -0
  440. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -0
  441. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -0
  442. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +609 -0
  443. package/dist/test/sort-filter-bar/sort-filter-bar.test.js.map +1 -0
  444. package/dist/test/text-overlay.test.d.ts +1 -0
  445. package/dist/test/text-overlay.test.js +42 -0
  446. package/dist/test/text-overlay.test.js.map +1 -0
  447. package/dist/test/text-snippet-block.test.d.ts +1 -0
  448. package/dist/test/text-snippet-block.test.js +63 -0
  449. package/dist/test/text-snippet-block.test.js.map +1 -0
  450. package/dist/test/tile-stats.test.d.ts +1 -0
  451. package/dist/test/tile-stats.test.js +128 -0
  452. package/dist/test/tile-stats.test.js.map +1 -0
  453. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -0
  454. package/dist/test/tiles/grid/account-tile.test.js +96 -0
  455. package/dist/test/tiles/grid/account-tile.test.js.map +1 -0
  456. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -0
  457. package/dist/test/tiles/grid/collection-tile.test.js +96 -0
  458. package/dist/test/tiles/grid/collection-tile.test.js.map +1 -0
  459. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -0
  460. package/dist/test/tiles/grid/item-tile.test.js +427 -0
  461. package/dist/test/tiles/grid/item-tile.test.js.map +1 -0
  462. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -0
  463. package/dist/test/tiles/grid/search-tile.test.js +66 -0
  464. package/dist/test/tiles/grid/search-tile.test.js.map +1 -0
  465. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -0
  466. package/dist/test/tiles/hover/hover-pane-controller.test.js +329 -0
  467. package/dist/test/tiles/hover/hover-pane-controller.test.js.map +1 -0
  468. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -0
  469. package/dist/test/tiles/hover/tile-hover-pane.test.js +57 -0
  470. package/dist/test/tiles/hover/tile-hover-pane.test.js.map +1 -0
  471. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -0
  472. package/dist/test/tiles/list/tile-list-compact.test.js +251 -0
  473. package/dist/test/tiles/list/tile-list-compact.test.js.map +1 -0
  474. package/dist/test/tiles/list/tile-list.test.d.ts +1 -0
  475. package/dist/test/tiles/list/tile-list.test.js +469 -0
  476. package/dist/test/tiles/list/tile-list.test.js.map +1 -0
  477. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -0
  478. package/dist/test/tiles/tile-dispatcher.test.js +231 -0
  479. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -0
  480. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -0
  481. package/dist/test/tiles/tile-display-value-provider.test.js +142 -0
  482. package/dist/test/tiles/tile-display-value-provider.test.js.map +1 -0
  483. package/dist/test/tiles/tile-mediatype-icon.test.d.ts +1 -0
  484. package/dist/test/tiles/tile-mediatype-icon.test.js +145 -0
  485. package/dist/test/tiles/tile-mediatype-icon.test.js.map +1 -0
  486. package/dist/test/utils/array-equals.test.d.ts +1 -0
  487. package/dist/test/utils/array-equals.test.js +27 -0
  488. package/dist/test/utils/array-equals.test.js.map +1 -0
  489. package/dist/test/utils/format-count.test.d.ts +1 -0
  490. package/dist/test/utils/format-count.test.js +24 -0
  491. package/dist/test/utils/format-count.test.js.map +1 -0
  492. package/dist/test/utils/format-date.test.d.ts +1 -0
  493. package/dist/test/utils/format-date.test.js +61 -0
  494. package/dist/test/utils/format-date.test.js.map +1 -0
  495. package/dist/test/utils/format-unit-size.test.d.ts +1 -0
  496. package/dist/test/utils/format-unit-size.test.js +18 -0
  497. package/dist/test/utils/format-unit-size.test.js.map +1 -0
  498. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -0
  499. package/dist/test/utils/local-date-from-utc.test.js +27 -0
  500. package/dist/test/utils/local-date-from-utc.test.js.map +1 -0
  501. package/eslint.config.mjs +53 -53
  502. package/index.html +24 -24
  503. package/local.archive.org.cert +86 -86
  504. package/local.archive.org.key +27 -27
  505. package/package.json +118 -117
  506. package/renovate.json +6 -6
  507. package/src/collection-browser.ts +2829 -2829
  508. package/src/collection-facets/more-facets-content.ts +639 -639
  509. package/src/collection-facets.ts +994 -995
  510. package/src/data-source/collection-browser-data-source.ts +1401 -1401
  511. package/src/data-source/collection-browser-query-state.ts +65 -65
  512. package/src/data-source/models.ts +43 -43
  513. package/src/tiles/base-tile-component.ts +65 -65
  514. package/src/tiles/grid/account-tile.ts +113 -113
  515. package/src/tiles/grid/collection-tile.ts +163 -163
  516. package/src/tiles/grid/item-tile.ts +340 -340
  517. package/src/tiles/hover/hover-pane-controller.ts +613 -517
  518. package/src/tiles/hover/tile-hover-pane.ts +184 -180
  519. package/src/tiles/list/tile-list-compact.ts +239 -239
  520. package/src/tiles/list/tile-list.ts +700 -700
  521. package/src/tiles/tile-dispatcher.ts +517 -490
  522. package/src/utils/format-date.ts +62 -62
  523. package/test/collection-browser.test.ts +2403 -2403
  524. package/test/tiles/grid/item-tile.test.ts +520 -520
  525. package/test/tiles/hover/hover-pane-controller.test.ts +418 -353
  526. package/test/tiles/list/tile-list-compact.test.ts +282 -282
  527. package/test/tiles/list/tile-list.test.ts +552 -552
  528. package/test/tiles/tile-dispatcher.test.ts +283 -187
  529. package/test/utils/format-date.test.ts +89 -89
  530. package/tsconfig.json +20 -20
  531. package/web-dev-server.config.mjs +30 -30
  532. package/web-test-runner.config.mjs +41 -41
@@ -1,353 +1,418 @@
1
- import { expect, fixture } from '@open-wc/testing';
2
- import { html, LitElement, nothing, TemplateResult } from 'lit';
3
- import { customElement, property, query } from 'lit/decorators.js';
4
- import {
5
- HoverPaneController,
6
- HoverPaneControllerInterface,
7
- HoverPaneControllerOptions,
8
- HoverPaneProperties,
9
- HoverPaneProviderInterface,
10
- } from '../../../src/tiles/hover/hover-pane-controller';
11
- import type { TileHoverPane } from '../../../src/tiles/hover/tile-hover-pane';
12
- import { TileModel } from '../../../src/models';
13
-
14
- @customElement('host-element')
15
- class HostElement extends LitElement implements HoverPaneProviderInterface {
16
- @property({ type: Object }) controllerOptions?: HoverPaneControllerOptions;
17
-
18
- @property({ type: Boolean }) suppressHoverPane: boolean = false;
19
-
20
- @query('tile-hover-pane') hoverPane?: TileHoverPane;
21
-
22
- controller?: HoverPaneControllerInterface;
23
-
24
- render(): TemplateResult {
25
- return html` ${this.controller?.getTemplate()} `;
26
- }
27
-
28
- protected firstUpdated(): void {
29
- this.controller = new HoverPaneController(this, this.controllerOptions);
30
- }
31
-
32
- getHoverPane(): HTMLElement | undefined {
33
- return this.suppressHoverPane ? undefined : this.hoverPane;
34
- }
35
-
36
- getHoverPaneProps(): HoverPaneProperties {
37
- const tileModel = new TileModel({});
38
- tileModel.checked = false;
39
- tileModel.collectionFilesCount = 1;
40
- tileModel.collections = ['foo', 'bar'];
41
- tileModel.collectionSize = 1;
42
- tileModel.commentCount = 1;
43
- tileModel.contentWarning = false;
44
- tileModel.creators = ['foo', 'bar'];
45
- tileModel.favCount = 1;
46
- tileModel.identifier = 'foo';
47
- tileModel.itemCount = 1;
48
- tileModel.loginRequired = false;
49
- tileModel.mediatype = 'data';
50
- tileModel.subjects = ['foo', 'bar'];
51
- tileModel.title = 'foo';
52
- tileModel.viewCount = 1;
53
-
54
- return {
55
- model: tileModel,
56
- loggedIn: false,
57
- suppressBlurring: false,
58
- sortParam: null,
59
- };
60
- }
61
- }
62
-
63
- describe('Hover Pane Controller', () => {
64
- let oldMatchMedia: typeof window.matchMedia;
65
- let oldOnTouchStart: typeof window.ontouchstart;
66
-
67
- before(() => {
68
- oldMatchMedia = window.matchMedia;
69
- oldOnTouchStart = window.ontouchstart;
70
- window.matchMedia = () => ({ matches: true }) as MediaQueryList;
71
- window.ontouchstart = () => {};
72
- });
73
-
74
- after(() => {
75
- window.matchMedia = oldMatchMedia;
76
- window.ontouchstart = oldOnTouchStart;
77
- });
78
-
79
- it('should initially provide empty template', async () => {
80
- const host = await fixture<HostElement>(
81
- html`<host-element></host-element>`,
82
- );
83
- expect(host.controller?.getTemplate()).to.equal(nothing);
84
- });
85
-
86
- it('should produce a hover pane template after mousemove, and hide it after mouseleave', async () => {
87
- const host = await fixture<HostElement>(
88
- html`<host-element
89
- .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
90
- ></host-element>`,
91
- );
92
-
93
- host.dispatchEvent(new MouseEvent('mousemove'));
94
- // Need to wait a tick for the event handlers to run
95
- await new Promise(resolve => {
96
- setTimeout(resolve, 0);
97
- });
98
-
99
- expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
100
-
101
- host.dispatchEvent(new MouseEvent('mouseleave'));
102
- // Need to wait for the fade out transition
103
- await new Promise(resolve => {
104
- setTimeout(resolve, 150);
105
- });
106
-
107
- expect(host.controller?.getTemplate()).to.equal(nothing);
108
- });
109
-
110
- it('should produce a hover pane template after mouseenter, even without mousemove', async () => {
111
- const host = await fixture<HostElement>(
112
- html`<host-element
113
- .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
114
- ></host-element>`,
115
- );
116
-
117
- host.dispatchEvent(new MouseEvent('mouseenter'));
118
- // Need to wait a tick for the event handlers to run
119
- await new Promise(resolve => {
120
- setTimeout(resolve, 0);
121
- });
122
-
123
- expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
124
- });
125
-
126
- it('should immediately fade back in if mouse enters while fading out', async () => {
127
- const host = await fixture<HostElement>(
128
- html`<host-element
129
- .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
130
- ></host-element>`,
131
- );
132
-
133
- // Enter the host element and wait for the show handlers to run
134
- host.dispatchEvent(new MouseEvent('mousemove'));
135
- await new Promise(resolve => {
136
- setTimeout(resolve, 0);
137
- });
138
-
139
- // Leave the host element so it begins fading out, but not all the way
140
- host.dispatchEvent(new MouseEvent('mouseleave'));
141
- await new Promise(resolve => {
142
- setTimeout(resolve, 20);
143
- });
144
-
145
- // Re-enter the host element and wait long enough that it would disappear
146
- // if the hide were not cancelled
147
- host.dispatchEvent(new MouseEvent('mousemove'));
148
- await new Promise(resolve => {
149
- setTimeout(resolve, 150);
150
- });
151
-
152
- expect(host.controller?.getTemplate()).not.to.equal(nothing);
153
- });
154
-
155
- it('should flip hover pane if it would overflow the viewport', async () => {
156
- const host = await fixture<HostElement>(
157
- html`<host-element
158
- .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
159
- ></host-element>`,
160
- );
161
-
162
- host.dispatchEvent(
163
- new MouseEvent('mousemove', { clientX: 800, clientY: 600 }),
164
- );
165
- // Need to wait a tick for the event handlers to run
166
- await new Promise(resolve => {
167
- setTimeout(resolve, 0);
168
- });
169
- await host.updateComplete;
170
-
171
- expect(host.controller?.getTemplate()).not.to.equal(nothing);
172
- expect(host.getHoverPane()?.getBoundingClientRect()?.right).to.be.lessThan(
173
- window.innerWidth,
174
- );
175
- expect(host.getHoverPane()?.getBoundingClientRect()?.bottom).to.be.lessThan(
176
- window.innerHeight,
177
- );
178
- });
179
-
180
- it('should gracefully handle undefined hover pane from host element', async () => {
181
- const host = await fixture<HostElement>(
182
- html`<host-element
183
- .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
184
- ?suppressHoverPane=${true}
185
- ></host-element>`,
186
- );
187
-
188
- host.dispatchEvent(new MouseEvent('mousemove'));
189
- // Need to wait a tick for the event handlers to run
190
- await new Promise(resolve => {
191
- setTimeout(resolve, 0);
192
- });
193
-
194
- expect(host.controller?.getTemplate()).not.to.equal(nothing);
195
-
196
- host.dispatchEvent(new MouseEvent('mouseleave'));
197
- await new Promise(resolve => {
198
- setTimeout(resolve, 20);
199
- });
200
-
201
- host.dispatchEvent(new MouseEvent('mousemove'));
202
- await new Promise(resolve => {
203
- setTimeout(resolve, 0);
204
- });
205
-
206
- host.dispatchEvent(new MouseEvent('mouseleave'));
207
- // Need to wait for the fade out transition
208
- await new Promise(resolve => {
209
- setTimeout(resolve, 150);
210
- });
211
-
212
- expect(host.controller?.getTemplate()).to.equal(nothing);
213
- });
214
-
215
- describe('Touch & long-press', () => {
216
- const getTouchStartEvent = (host: EventTarget) =>
217
- new TouchEvent('touchstart', {
218
- touches: [new Touch({ identifier: 0, target: host })],
219
- });
220
-
221
- it('should produce a hover pane after long press', async () => {
222
- const host = await fixture<HostElement>(
223
- html`<host-element
224
- .controllerOptions=${{
225
- showDelay: 0,
226
- longPressDelay: 0,
227
- enableLongPress: true,
228
- }}
229
- ></host-element>`,
230
- );
231
-
232
- // Touch the host element and wait for the long press handlers to run
233
- host.dispatchEvent(getTouchStartEvent(host));
234
- await new Promise(resolve => {
235
- setTimeout(resolve, 0);
236
- });
237
-
238
- expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
239
- });
240
-
241
- it('should cancel a long press by moving', async () => {
242
- const host = await fixture<HostElement>(
243
- html`<host-element
244
- .controllerOptions=${{
245
- showDelay: 0,
246
- longPressDelay: 100,
247
- enableLongPress: true,
248
- }}
249
- ></host-element>`,
250
- );
251
-
252
- // Touch the host element
253
- host.dispatchEvent(getTouchStartEvent(host));
254
- await new Promise(resolve => {
255
- setTimeout(resolve, 0);
256
- });
257
-
258
- // Move the touch point, cancelling the long press
259
- host.dispatchEvent(new TouchEvent('touchmove'));
260
- await new Promise(resolve => {
261
- setTimeout(resolve, 150);
262
- });
263
-
264
- expect(host.controller?.getTemplate()).to.equal(nothing);
265
- });
266
-
267
- it('should cancel a long press by ending touch', async () => {
268
- const host = await fixture<HostElement>(
269
- html`<host-element
270
- .controllerOptions=${{
271
- showDelay: 0,
272
- longPressDelay: 100,
273
- enableLongPress: true,
274
- }}
275
- ></host-element>`,
276
- );
277
-
278
- // Touch the host element
279
- host.dispatchEvent(getTouchStartEvent(host));
280
- await new Promise(resolve => {
281
- setTimeout(resolve, 0);
282
- });
283
-
284
- // Lift the touch point, cancelling the long press
285
- host.dispatchEvent(new TouchEvent('touchend'));
286
- await new Promise(resolve => {
287
- setTimeout(resolve, 150);
288
- });
289
-
290
- expect(host.controller?.getTemplate()).to.equal(nothing);
291
- });
292
-
293
- it('should cancel a long press by cancelling touch (e.g., too many touch points)', async () => {
294
- const host = await fixture<HostElement>(
295
- html`<host-element
296
- .controllerOptions=${{
297
- showDelay: 0,
298
- longPressDelay: 100,
299
- enableLongPress: true,
300
- }}
301
- ></host-element>`,
302
- );
303
-
304
- // Touch the host element
305
- host.dispatchEvent(getTouchStartEvent(host));
306
- await new Promise(resolve => {
307
- setTimeout(resolve, 0);
308
- });
309
-
310
- // Cancel the touch point, also cancelling the long press
311
- host.dispatchEvent(new TouchEvent('touchcancel'));
312
- await new Promise(resolve => {
313
- setTimeout(resolve, 150);
314
- });
315
-
316
- expect(host.controller?.getTemplate()).to.equal(nothing);
317
- });
318
-
319
- it('should close the hover pane on mobile when touching the backdrop', async () => {
320
- const host = await fixture<HostElement>(
321
- html`<host-element
322
- .controllerOptions=${{
323
- showDelay: 0,
324
- hideDelay: 0,
325
- longPressDelay: 0,
326
- enableLongPress: true,
327
- mobileBreakpoint: 9999, // Ensure we get the mobile view
328
- }}
329
- ></host-element>`,
330
- );
331
-
332
- // Touch the host element
333
- host.dispatchEvent(getTouchStartEvent(host));
334
- await new Promise(resolve => {
335
- setTimeout(resolve, 0);
336
- });
337
-
338
- expect(host.controller?.getTemplate()).not.to.equal(nothing);
339
-
340
- await host.updateComplete;
341
-
342
- // Touch the backdrop
343
- host.shadowRoot
344
- ?.querySelector('#touch-backdrop')
345
- ?.dispatchEvent(new TouchEvent('touchstart'));
346
- await new Promise(resolve => {
347
- setTimeout(resolve, 150);
348
- });
349
-
350
- expect(host.controller?.getTemplate()).to.equal(nothing);
351
- });
352
- });
353
- });
1
+ import { expect, fixture } from '@open-wc/testing';
2
+ import { html, LitElement, nothing, TemplateResult } from 'lit';
3
+ import { customElement, property, query } from 'lit/decorators.js';
4
+ import {
5
+ HoverPaneController,
6
+ HoverPaneControllerInterface,
7
+ HoverPaneControllerOptions,
8
+ HoverPaneProperties,
9
+ HoverPaneProviderInterface,
10
+ } from '../../../src/tiles/hover/hover-pane-controller';
11
+ import type { TileHoverPane } from '../../../src/tiles/hover/tile-hover-pane';
12
+ import { TileModel } from '../../../src/models';
13
+ import sinon from 'sinon';
14
+
15
+ @customElement('host-element')
16
+ class HostElement extends LitElement implements HoverPaneProviderInterface {
17
+ @property({ type: Object }) controllerOptions?: HoverPaneControllerOptions;
18
+
19
+ @property({ type: Boolean }) suppressHoverPane: boolean = false;
20
+
21
+ @query('tile-hover-pane') hoverPane?: TileHoverPane;
22
+
23
+ controller?: HoverPaneControllerInterface;
24
+
25
+ render(): TemplateResult {
26
+ return html` ${this.controller?.getTemplate()} `;
27
+ }
28
+
29
+ protected firstUpdated(): void {
30
+ this.controller = new HoverPaneController(this, this.controllerOptions);
31
+ }
32
+
33
+ acquireFocus(): void {}
34
+
35
+ releaseFocus(): void {}
36
+
37
+ getHoverPane(): HTMLElement | undefined {
38
+ return this.suppressHoverPane ? undefined : this.hoverPane;
39
+ }
40
+
41
+ getHoverPaneProps(): HoverPaneProperties {
42
+ const tileModel = new TileModel({});
43
+ tileModel.checked = false;
44
+ tileModel.collectionFilesCount = 1;
45
+ tileModel.collections = ['foo', 'bar'];
46
+ tileModel.collectionSize = 1;
47
+ tileModel.commentCount = 1;
48
+ tileModel.contentWarning = false;
49
+ tileModel.creators = ['foo', 'bar'];
50
+ tileModel.favCount = 1;
51
+ tileModel.identifier = 'foo';
52
+ tileModel.itemCount = 1;
53
+ tileModel.loginRequired = false;
54
+ tileModel.mediatype = 'data';
55
+ tileModel.subjects = ['foo', 'bar'];
56
+ tileModel.title = 'foo';
57
+ tileModel.viewCount = 1;
58
+
59
+ return {
60
+ model: tileModel,
61
+ loggedIn: false,
62
+ suppressBlurring: false,
63
+ sortParam: null,
64
+ };
65
+ }
66
+ }
67
+
68
+ describe('Hover Pane Controller', () => {
69
+ let oldMatchMedia: typeof window.matchMedia;
70
+ let oldOnTouchStart: typeof window.ontouchstart;
71
+
72
+ before(() => {
73
+ oldMatchMedia = window.matchMedia;
74
+ oldOnTouchStart = window.ontouchstart;
75
+ window.matchMedia = () => ({ matches: true }) as MediaQueryList;
76
+ window.ontouchstart = () => {};
77
+ });
78
+
79
+ after(() => {
80
+ window.matchMedia = oldMatchMedia;
81
+ window.ontouchstart = oldOnTouchStart;
82
+ });
83
+
84
+ it('should initially provide empty template', async () => {
85
+ const host = await fixture<HostElement>(
86
+ html`<host-element></host-element>`,
87
+ );
88
+ expect(host.controller?.getTemplate()).to.equal(nothing);
89
+ });
90
+
91
+ it('should produce a hover pane template after mousemove, and hide it after mouseleave', async () => {
92
+ const host = await fixture<HostElement>(
93
+ html`<host-element
94
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
95
+ ></host-element>`,
96
+ );
97
+
98
+ host.dispatchEvent(new MouseEvent('mousemove'));
99
+ // Need to wait a tick for the event handlers to run
100
+ await new Promise(resolve => {
101
+ setTimeout(resolve, 0);
102
+ });
103
+
104
+ expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
105
+
106
+ host.dispatchEvent(new MouseEvent('mouseleave'));
107
+ // Need to wait for the fade out transition
108
+ await new Promise(resolve => {
109
+ setTimeout(resolve, 150);
110
+ });
111
+
112
+ expect(host.controller?.getTemplate()).to.equal(nothing);
113
+ });
114
+
115
+ it('should produce a hover pane template after mouseenter, even without mousemove', async () => {
116
+ const host = await fixture<HostElement>(
117
+ html`<host-element
118
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
119
+ ></host-element>`,
120
+ );
121
+
122
+ host.dispatchEvent(new MouseEvent('mouseenter'));
123
+ // Need to wait a tick for the event handlers to run
124
+ await new Promise(resolve => {
125
+ setTimeout(resolve, 0);
126
+ });
127
+
128
+ expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
129
+ });
130
+
131
+ it('should immediately fade back in if mouse enters while fading out', async () => {
132
+ const host = await fixture<HostElement>(
133
+ html`<host-element
134
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
135
+ ></host-element>`,
136
+ );
137
+
138
+ // Enter the host element and wait for the show handlers to run
139
+ host.dispatchEvent(new MouseEvent('mousemove'));
140
+ await new Promise(resolve => {
141
+ setTimeout(resolve, 0);
142
+ });
143
+
144
+ // Leave the host element so it begins fading out, but not all the way
145
+ host.dispatchEvent(new MouseEvent('mouseleave'));
146
+ await new Promise(resolve => {
147
+ setTimeout(resolve, 20);
148
+ });
149
+
150
+ // Re-enter the host element and wait long enough that it would disappear
151
+ // if the hide were not cancelled
152
+ host.dispatchEvent(new MouseEvent('mousemove'));
153
+ await new Promise(resolve => {
154
+ setTimeout(resolve, 150);
155
+ });
156
+
157
+ expect(host.controller?.getTemplate()).not.to.equal(nothing);
158
+ });
159
+
160
+ it('should flip hover pane if it would overflow the viewport', async () => {
161
+ const host = await fixture<HostElement>(
162
+ html`<host-element
163
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
164
+ ></host-element>`,
165
+ );
166
+
167
+ host.dispatchEvent(
168
+ new MouseEvent('mousemove', { clientX: 800, clientY: 600 }),
169
+ );
170
+ // Need to wait a tick for the event handlers to run
171
+ await new Promise(resolve => {
172
+ setTimeout(resolve, 0);
173
+ });
174
+ await host.updateComplete;
175
+
176
+ expect(host.controller?.getTemplate()).not.to.equal(nothing);
177
+ expect(host.getHoverPane()?.getBoundingClientRect()?.right).to.be.lessThan(
178
+ window.innerWidth,
179
+ );
180
+ expect(host.getHoverPane()?.getBoundingClientRect()?.bottom).to.be.lessThan(
181
+ window.innerHeight,
182
+ );
183
+ });
184
+
185
+ it('should gracefully handle undefined hover pane from host element', async () => {
186
+ const host = await fixture<HostElement>(
187
+ html`<host-element
188
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
189
+ ?suppressHoverPane=${true}
190
+ ></host-element>`,
191
+ );
192
+
193
+ host.dispatchEvent(new MouseEvent('mousemove'));
194
+ // Need to wait a tick for the event handlers to run
195
+ await new Promise(resolve => {
196
+ setTimeout(resolve, 0);
197
+ });
198
+
199
+ expect(host.controller?.getTemplate()).not.to.equal(nothing);
200
+
201
+ host.dispatchEvent(new MouseEvent('mouseleave'));
202
+ await new Promise(resolve => {
203
+ setTimeout(resolve, 20);
204
+ });
205
+
206
+ host.dispatchEvent(new MouseEvent('mousemove'));
207
+ await new Promise(resolve => {
208
+ setTimeout(resolve, 0);
209
+ });
210
+
211
+ host.dispatchEvent(new MouseEvent('mouseleave'));
212
+ // Need to wait for the fade out transition
213
+ await new Promise(resolve => {
214
+ setTimeout(resolve, 150);
215
+ });
216
+
217
+ expect(host.controller?.getTemplate()).to.equal(nothing);
218
+ });
219
+
220
+ describe('Touch & long-press', () => {
221
+ const getTouchStartEvent = (host: EventTarget) =>
222
+ new TouchEvent('touchstart', {
223
+ touches: [new Touch({ identifier: 0, target: host })],
224
+ });
225
+
226
+ it('should produce a hover pane after long press', async () => {
227
+ const host = await fixture<HostElement>(
228
+ html`<host-element
229
+ .controllerOptions=${{
230
+ showDelay: 0,
231
+ longPressDelay: 0,
232
+ enableLongPress: true,
233
+ }}
234
+ ></host-element>`,
235
+ );
236
+
237
+ // Touch the host element and wait for the long press handlers to run
238
+ host.dispatchEvent(getTouchStartEvent(host));
239
+ await new Promise(resolve => {
240
+ setTimeout(resolve, 0);
241
+ });
242
+
243
+ expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
244
+ });
245
+
246
+ it('should cancel a long press by moving', async () => {
247
+ const host = await fixture<HostElement>(
248
+ html`<host-element
249
+ .controllerOptions=${{
250
+ showDelay: 0,
251
+ longPressDelay: 100,
252
+ enableLongPress: true,
253
+ }}
254
+ ></host-element>`,
255
+ );
256
+
257
+ // Touch the host element
258
+ host.dispatchEvent(getTouchStartEvent(host));
259
+ await new Promise(resolve => {
260
+ setTimeout(resolve, 0);
261
+ });
262
+
263
+ // Move the touch point, cancelling the long press
264
+ host.dispatchEvent(new TouchEvent('touchmove'));
265
+ await new Promise(resolve => {
266
+ setTimeout(resolve, 150);
267
+ });
268
+
269
+ expect(host.controller?.getTemplate()).to.equal(nothing);
270
+ });
271
+
272
+ it('should cancel a long press by ending touch', async () => {
273
+ const host = await fixture<HostElement>(
274
+ html`<host-element
275
+ .controllerOptions=${{
276
+ showDelay: 0,
277
+ longPressDelay: 100,
278
+ enableLongPress: true,
279
+ }}
280
+ ></host-element>`,
281
+ );
282
+
283
+ // Touch the host element
284
+ host.dispatchEvent(getTouchStartEvent(host));
285
+ await new Promise(resolve => {
286
+ setTimeout(resolve, 0);
287
+ });
288
+
289
+ // Lift the touch point, cancelling the long press
290
+ host.dispatchEvent(new TouchEvent('touchend'));
291
+ await new Promise(resolve => {
292
+ setTimeout(resolve, 150);
293
+ });
294
+
295
+ expect(host.controller?.getTemplate()).to.equal(nothing);
296
+ });
297
+
298
+ it('should cancel a long press by cancelling touch (e.g., too many touch points)', async () => {
299
+ const host = await fixture<HostElement>(
300
+ html`<host-element
301
+ .controllerOptions=${{
302
+ showDelay: 0,
303
+ longPressDelay: 100,
304
+ enableLongPress: true,
305
+ }}
306
+ ></host-element>`,
307
+ );
308
+
309
+ // Touch the host element
310
+ host.dispatchEvent(getTouchStartEvent(host));
311
+ await new Promise(resolve => {
312
+ setTimeout(resolve, 0);
313
+ });
314
+
315
+ // Cancel the touch point, also cancelling the long press
316
+ host.dispatchEvent(new TouchEvent('touchcancel'));
317
+ await new Promise(resolve => {
318
+ setTimeout(resolve, 150);
319
+ });
320
+
321
+ expect(host.controller?.getTemplate()).to.equal(nothing);
322
+ });
323
+
324
+ it('should close the hover pane on mobile when touching the backdrop', async () => {
325
+ const host = await fixture<HostElement>(
326
+ html`<host-element
327
+ .controllerOptions=${{
328
+ showDelay: 0,
329
+ hideDelay: 0,
330
+ longPressDelay: 0,
331
+ enableLongPress: true,
332
+ mobileBreakpoint: 9999, // Ensure we get the mobile view
333
+ }}
334
+ ></host-element>`,
335
+ );
336
+
337
+ // Touch the host element
338
+ host.dispatchEvent(getTouchStartEvent(host));
339
+ await new Promise(resolve => {
340
+ setTimeout(resolve, 0);
341
+ });
342
+
343
+ expect(host.controller?.getTemplate()).not.to.equal(nothing);
344
+
345
+ await host.updateComplete;
346
+
347
+ // Touch the backdrop
348
+ host.shadowRoot
349
+ ?.querySelector('#touch-backdrop')
350
+ ?.dispatchEvent(new TouchEvent('touchstart'));
351
+ await new Promise(resolve => {
352
+ setTimeout(resolve, 150);
353
+ });
354
+
355
+ expect(host.controller?.getTemplate()).to.equal(nothing);
356
+ });
357
+ });
358
+
359
+ describe('keyboard accessibility', () => {
360
+ it('should call host getBoundingClientRect if anchor is host', async () => {
361
+ const host = await fixture<HostElement>(
362
+ html`<host-element
363
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
364
+ ></host-element>`,
365
+ );
366
+
367
+ const getBoundingClientRectSpy = sinon.spy(host, 'getBoundingClientRect');
368
+
369
+ host.dispatchEvent(new FocusEvent('focus'));
370
+ // Need to wait a tick for the event handlers to run
371
+ await new Promise(resolve => {
372
+ setTimeout(resolve, 0);
373
+ });
374
+
375
+ expect(getBoundingClientRectSpy.called).to.be.true;
376
+ });
377
+
378
+ it('should show hover pane on focus', async () => {
379
+ const host = await fixture<HostElement>(
380
+ html`<host-element
381
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
382
+ ></host-element>`,
383
+ );
384
+
385
+ host.dispatchEvent(new FocusEvent('focus'));
386
+ // Need to wait a tick for the event handlers to run
387
+ await new Promise(resolve => {
388
+ setTimeout(resolve, 0);
389
+ });
390
+
391
+ expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
392
+ });
393
+
394
+ it('should hide hover pane on blur', async () => {
395
+ const host = await fixture<HostElement>(
396
+ html`<host-element
397
+ .controllerOptions=${{ showDelay: 0, hideDelay: 0 }}
398
+ ></host-element>`,
399
+ );
400
+
401
+ host.dispatchEvent(new FocusEvent('focus'));
402
+ // Need to wait a tick for the event handlers to run
403
+ await new Promise(resolve => {
404
+ setTimeout(resolve, 0);
405
+ });
406
+
407
+ expect(host.controller?.getTemplate()).not.to.equal(nothing); // Is a TemplateResult
408
+
409
+ host.dispatchEvent(new FocusEvent('blur'));
410
+ // Need to wait for the fade out transition
411
+ await new Promise(resolve => {
412
+ setTimeout(resolve, 150);
413
+ });
414
+
415
+ expect(host.controller?.getTemplate()).to.equal(nothing);
416
+ });
417
+ });
418
+ });