@internetarchive/collection-browser 1.14.9-alpha.2 → 1.14.9-alpha10

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 (291) hide show
  1. package/.editorconfig +29 -29
  2. package/.husky/pre-commit +4 -4
  3. package/LICENSE +661 -661
  4. package/README.md +83 -83
  5. package/dist/index.d.ts +9 -9
  6. package/dist/index.js +9 -9
  7. package/dist/src/app-root.d.ts +73 -72
  8. package/dist/src/app-root.js +501 -429
  9. package/dist/src/app-root.js.map +1 -1
  10. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  11. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  12. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  13. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  14. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  15. package/dist/src/assets/img/icons/chevron.js +2 -2
  16. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  17. package/dist/src/assets/img/icons/contract.js +2 -2
  18. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  19. package/dist/src/assets/img/icons/empty-query.js +2 -2
  20. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  21. package/dist/src/assets/img/icons/expand.js +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  23. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  24. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  25. package/dist/src/assets/img/icons/eye.js +2 -2
  26. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  27. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  28. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  29. package/dist/src/assets/img/icons/login-required.js +2 -2
  30. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  31. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  32. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  33. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  34. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  35. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  36. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  37. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  38. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  39. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  40. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  41. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  42. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  43. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  44. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  45. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  46. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  47. package/dist/src/assets/img/icons/mediatype/search.js +2 -2
  48. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  49. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  50. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  51. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  52. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  53. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  54. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  55. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  56. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  57. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  58. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  59. package/dist/src/assets/img/icons/null-result.js +2 -2
  60. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  61. package/dist/src/assets/img/icons/restricted.js +2 -2
  62. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  63. package/dist/src/assets/img/icons/reviews.js +2 -2
  64. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  65. package/dist/src/assets/img/icons/upload.js +2 -2
  66. package/dist/src/assets/img/icons/views.d.ts +1 -1
  67. package/dist/src/assets/img/icons/views.js +2 -2
  68. package/dist/src/circular-activity-indicator.d.ts +5 -5
  69. package/dist/src/circular-activity-indicator.js +17 -17
  70. package/dist/src/collection-browser.d.ts +533 -533
  71. package/dist/src/collection-browser.js +1894 -1893
  72. package/dist/src/collection-browser.js.map +1 -1
  73. package/dist/src/collection-facets/facet-row.d.ts +30 -0
  74. package/dist/src/collection-facets/facet-row.js +245 -0
  75. package/dist/src/collection-facets/facet-row.js.map +1 -0
  76. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  77. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  78. package/dist/src/collection-facets/facets-template.d.ts +17 -20
  79. package/dist/src/collection-facets/facets-template.js +122 -264
  80. package/dist/src/collection-facets/facets-template.js.map +1 -1
  81. package/dist/src/collection-facets/more-facets-content.d.ts +77 -77
  82. package/dist/src/collection-facets/more-facets-content.js +359 -359
  83. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  84. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  85. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  86. package/dist/src/collection-facets/toggle-switch.js +94 -94
  87. package/dist/src/collection-facets.d.ts +104 -104
  88. package/dist/src/collection-facets.js +506 -506
  89. package/dist/src/empty-placeholder.d.ts +23 -23
  90. package/dist/src/empty-placeholder.js +74 -74
  91. package/dist/src/expanded-date-picker.d.ts +43 -43
  92. package/dist/src/expanded-date-picker.js +109 -109
  93. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  94. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  95. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  96. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  97. package/dist/src/manage/manage-bar.d.ts +26 -26
  98. package/dist/src/manage/manage-bar.js +53 -53
  99. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  100. package/dist/src/mediatype/mediatype-config.js +91 -91
  101. package/dist/src/models.d.ts +180 -164
  102. package/dist/src/models.js +269 -269
  103. package/dist/src/models.js.map +1 -1
  104. package/dist/src/restoration-state-handler.d.ts +70 -70
  105. package/dist/src/restoration-state-handler.js +355 -355
  106. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  107. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  108. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  109. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  110. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  111. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  112. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  113. package/dist/src/sort-filter-bar/img/list.js +2 -2
  114. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  115. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  116. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  117. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  118. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  119. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  120. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  121. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  122. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  123. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  124. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +208 -208
  125. package/dist/src/sort-filter-bar/sort-filter-bar.js +637 -637
  126. package/dist/src/styles/item-image-styles.d.ts +8 -8
  127. package/dist/src/styles/item-image-styles.js +9 -9
  128. package/dist/src/styles/sr-only.d.ts +1 -1
  129. package/dist/src/styles/sr-only.js +2 -2
  130. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  131. package/dist/src/tiles/base-tile-component.js +63 -63
  132. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  133. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  134. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  135. package/dist/src/tiles/grid/account-tile.js +72 -72
  136. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  137. package/dist/src/tiles/grid/collection-tile.js +80 -80
  138. package/dist/src/tiles/grid/item-tile.d.ts +27 -27
  139. package/dist/src/tiles/grid/item-tile.js +134 -134
  140. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  141. package/dist/src/tiles/grid/search-tile.js +51 -51
  142. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  143. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  144. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  145. package/dist/src/tiles/grid/tile-stats.js +48 -48
  146. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  147. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  148. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  149. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  150. package/dist/src/tiles/image-block.d.ts +17 -17
  151. package/dist/src/tiles/image-block.js +73 -73
  152. package/dist/src/tiles/item-image.d.ts +36 -36
  153. package/dist/src/tiles/item-image.js +127 -127
  154. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  155. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  156. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  157. package/dist/src/tiles/list/tile-list-compact.js +114 -114
  158. package/dist/src/tiles/list/tile-list.d.ts +46 -46
  159. package/dist/src/tiles/list/tile-list.js +302 -302
  160. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  161. package/dist/src/tiles/mediatype-icon.js +47 -47
  162. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  163. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  164. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  165. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  166. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  167. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  168. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  169. package/dist/src/tiles/text-snippet-block.js +73 -73
  170. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  171. package/dist/src/tiles/tile-dispatcher.js +231 -231
  172. package/dist/src/tiles/tile-display-value-provider.d.ts +43 -43
  173. package/dist/src/tiles/tile-display-value-provider.js +80 -80
  174. package/dist/src/utils/analytics-events.d.ts +25 -25
  175. package/dist/src/utils/analytics-events.js +27 -27
  176. package/dist/src/utils/array-equals.d.ts +4 -4
  177. package/dist/src/utils/array-equals.js +10 -10
  178. package/dist/src/utils/format-count.d.ts +7 -7
  179. package/dist/src/utils/format-count.js +76 -76
  180. package/dist/src/utils/format-date.d.ts +2 -2
  181. package/dist/src/utils/format-date.js +25 -25
  182. package/dist/src/utils/format-unit-size.d.ts +2 -2
  183. package/dist/src/utils/format-unit-size.js +33 -33
  184. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  185. package/dist/src/utils/local-date-from-utc.js +15 -15
  186. package/dist/src/utils/sha1.d.ts +2 -2
  187. package/dist/src/utils/sha1.js +8 -8
  188. package/dist/test/collection-browser.test.d.ts +1 -1
  189. package/dist/test/collection-browser.test.js +1130 -1098
  190. package/dist/test/collection-browser.test.js.map +1 -1
  191. package/dist/test/collection-facets/facet-row.test.d.ts +1 -0
  192. package/dist/test/collection-facets/facet-row.test.js +235 -0
  193. package/dist/test/collection-facets/facet-row.test.js.map +1 -0
  194. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  195. package/dist/test/collection-facets/facets-template.test.js +110 -141
  196. package/dist/test/collection-facets/facets-template.test.js.map +1 -1
  197. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  198. package/dist/test/collection-facets/more-facets-content.test.js +133 -133
  199. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  200. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  201. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  202. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  203. package/dist/test/collection-facets.test.d.ts +2 -2
  204. package/dist/test/collection-facets.test.js +651 -682
  205. package/dist/test/collection-facets.test.js.map +1 -1
  206. package/dist/test/empty-placeholder.test.d.ts +1 -1
  207. package/dist/test/empty-placeholder.test.js +63 -63
  208. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  209. package/dist/test/expanded-date-picker.test.js +95 -95
  210. package/dist/test/icon-overlay.test.d.ts +1 -1
  211. package/dist/test/icon-overlay.test.js +24 -24
  212. package/dist/test/image-block.test.d.ts +1 -1
  213. package/dist/test/image-block.test.js +48 -48
  214. package/dist/test/item-image.test.d.ts +1 -1
  215. package/dist/test/item-image.test.js +86 -86
  216. package/dist/test/manage/manage-bar.test.d.ts +1 -1
  217. package/dist/test/manage/manage-bar.test.js +72 -72
  218. package/dist/test/mediatype-config.test.d.ts +1 -1
  219. package/dist/test/mediatype-config.test.js +16 -16
  220. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  221. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  222. package/dist/test/mocks/mock-collection-name-cache.d.ts +9 -9
  223. package/dist/test/mocks/mock-collection-name-cache.js +17 -17
  224. package/dist/test/mocks/mock-search-responses.d.ts +21 -21
  225. package/dist/test/mocks/mock-search-responses.js +709 -709
  226. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  227. package/dist/test/mocks/mock-search-service.js +50 -50
  228. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  229. package/dist/test/restoration-state-handler.test.js +270 -270
  230. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  231. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  232. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  233. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  234. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  235. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +378 -378
  236. package/dist/test/text-overlay.test.d.ts +1 -1
  237. package/dist/test/text-overlay.test.js +48 -48
  238. package/dist/test/text-snippet-block.test.d.ts +1 -1
  239. package/dist/test/text-snippet-block.test.js +57 -57
  240. package/dist/test/tile-stats.test.d.ts +1 -1
  241. package/dist/test/tile-stats.test.js +33 -33
  242. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  243. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  244. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  245. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  246. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  247. package/dist/test/tiles/grid/item-tile.test.js +254 -254
  248. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  249. package/dist/test/tiles/grid/search-tile.test.js +51 -51
  250. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  251. package/dist/test/tiles/hover/hover-pane-controller.test.js +258 -258
  252. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  253. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  254. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  255. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  256. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  257. package/dist/test/tiles/list/tile-list.test.js +242 -242
  258. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  259. package/dist/test/tiles/tile-dispatcher.test.js +94 -94
  260. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  261. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  262. package/dist/test/utils/array-equals.test.d.ts +1 -1
  263. package/dist/test/utils/array-equals.test.js +26 -26
  264. package/dist/test/utils/format-count.test.d.ts +1 -1
  265. package/dist/test/utils/format-count.test.js +23 -23
  266. package/dist/test/utils/format-date.test.d.ts +1 -1
  267. package/dist/test/utils/format-date.test.js +17 -17
  268. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  269. package/dist/test/utils/format-unit-size.test.js +17 -17
  270. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  271. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  272. package/local.archive.org.cert +86 -86
  273. package/local.archive.org.key +27 -27
  274. package/package.json +2 -2
  275. package/renovate.json +6 -6
  276. package/src/app-root.ts +159 -82
  277. package/src/collection-browser.ts +25 -22
  278. package/src/collection-facets/facet-row.ts +274 -0
  279. package/src/collection-facets/facets-template.ts +49 -196
  280. package/src/models.ts +18 -2
  281. package/test/collection-browser.test.ts +36 -4
  282. package/test/collection-facets/facet-row.test.ts +328 -0
  283. package/test/collection-facets/facets-template.test.ts +72 -110
  284. package/test/collection-facets.test.ts +69 -101
  285. package/tsconfig.json +21 -21
  286. package/web-dev-server.config.mjs +30 -30
  287. package/web-test-runner.config.mjs +41 -41
  288. package/dist/src/selected-facets.d.ts +0 -67
  289. package/dist/src/selected-facets.js +0 -149
  290. package/dist/src/selected-facets.js.map +0 -1
  291. package/src/selected-facets.ts +0 -216
package/src/app-root.ts CHANGED
@@ -229,91 +229,93 @@ export class AppRoot extends LitElement {
229
229
  >
230
230
  </div>
231
231
 
232
- <div id="cell-controls" class="hidden">
233
- <div id="cell-size-control">
234
- <div>
235
- <label for="cell-width-slider">Min cell width:</label>
236
- <input
237
- type="range"
238
- min="10"
239
- max="100"
240
- value="18"
241
- step="0.1"
242
- id="cell-width-slider"
243
- @input=${this.widthChanged}
244
- />
245
- <span>${this.cellWidth}rem</span>
246
- </div>
247
- <div>
248
- <label for="cell-height-slider">Cell height:</label>
249
- <input
250
- type="range"
251
- min="10"
252
- max="100"
253
- value="29"
254
- step="0.1"
255
- id="cell-height-slider"
256
- @input=${this.heightChanged}
257
- />
258
- <span>${this.cellHeight}rem</span>
259
- </div>
232
+ <fieldset class="cell-controls">
233
+ <legend>Cell Controls</legend>
234
+ <div>
235
+ <label for="cell-width-slider">Cell width:</label>
236
+ <input
237
+ type="range"
238
+ min="10"
239
+ max="100"
240
+ value="18"
241
+ step="0.1"
242
+ id="cell-width-slider"
243
+ @input=${this.widthChanged}
244
+ />
245
+ <span>${this.cellWidth}rem</span>
260
246
  </div>
261
- <div id="cell-gap-control">
262
- <div>
263
- <label for="cell-row-gap-slider">Row gap:</label>
264
- <input
265
- type="range"
266
- min="0"
267
- max="5"
268
- value="1.7"
269
- step="0.1"
270
- id="cell-row-gap-slider"
271
- @input=${this.rowGapChanged}
272
- />
273
- <span>${this.rowGap}rem</span>
274
- </div>
275
- <div>
276
- <label for="cell-col-gap-slider">Col gap:</label>
277
- <input
278
- type="range"
279
- min="0"
280
- max="5"
281
- value="1.7"
282
- step="0.1"
283
- id="cell-col-gap-slider"
284
- @input=${this.colGapChanged}
285
- />
286
- <span>${this.colGap}rem</span>
287
- </div>
247
+ <div>
248
+ <label for="cell-height-slider">Cell height:</label>
249
+ <input
250
+ type="range"
251
+ min="10"
252
+ max="100"
253
+ value="29"
254
+ step="0.1"
255
+ id="cell-height-slider"
256
+ @input=${this.heightChanged}
257
+ />
258
+ <span>${this.cellHeight}rem</span>
288
259
  </div>
289
- </div>
290
- <div id="checkbox-controls">
260
+ <div>
261
+ <label for="cell-row-gap-slider">Row gap:</label>
262
+ <input
263
+ type="range"
264
+ min="0"
265
+ max="5"
266
+ value="1.7"
267
+ step="0.1"
268
+ id="cell-row-gap-slider"
269
+ @input=${this.rowGapChanged}
270
+ />
271
+ <span>${this.rowGap}rem</span>
272
+ </div>
273
+ <div>
274
+ <label for="cell-col-gap-slider">Col gap:</label>
275
+ <input
276
+ type="range"
277
+ min="0"
278
+ max="5"
279
+ value="1.7"
280
+ step="0.1"
281
+ id="cell-col-gap-slider"
282
+ @input=${this.colGapChanged}
283
+ />
284
+ <span>${this.colGap}rem</span>
285
+ </div>
286
+ </fieldset>
287
+
288
+ <fieldset class="other-controls">
289
+ <legend>Other Controls</legend>
291
290
  <div class="checkbox-control">
292
291
  <input
293
292
  type="checkbox"
294
- id="show-outline-check"
295
- @click=${this.outlineChanged}
293
+ id="simulate-login"
294
+ @click=${this.loginChanged}
296
295
  />
297
- <label for="show-outline-check">Show cell outlines</label>
296
+ <label for="simulate-login">Simulate login</label>
298
297
  </div>
299
298
  <div class="checkbox-control">
300
299
  <input
301
300
  type="checkbox"
302
- id="show-facet-group-outline-check"
303
- @click=${this.toggleFacetGroupOutline}
301
+ id="enable-date-picker"
302
+ checked
303
+ @click=${this.datePickerChanged}
304
304
  />
305
- <label for="show-facet-group-outline-check">
306
- Show facet group outlines
307
- </label>
305
+ <label for="enable-date-picker">Enable date picker</label>
308
306
  </div>
309
307
  <div class="checkbox-control">
310
308
  <input
311
309
  type="checkbox"
312
- id="simulate-login"
313
- @click=${this.loginChanged}
310
+ id="enable-management"
311
+ @click=${this.manageModeCheckboxChanged}
314
312
  />
315
- <label for="simulate-login">Simulate login</label>
313
+ <label for="enable-management">Enable manage mode</label>
316
314
  </div>
315
+ </fieldset>
316
+
317
+ <fieldset class="cb-visual-appearance">
318
+ <legend>CB Visual Appearance</legend>
317
319
  <div class="checkbox-control">
318
320
  <input
319
321
  type="checkbox"
@@ -325,27 +327,34 @@ export class AppRoot extends LitElement {
325
327
  <div class="checkbox-control">
326
328
  <input
327
329
  type="checkbox"
328
- id="enable-date-picker"
329
- checked
330
- @click=${this.datePickerChanged}
330
+ id="show-facet-group-outline-check"
331
+ @click=${this.toggleFacetGroupOutline}
331
332
  />
332
- <label for="enable-date-picker">Enable date picker</label>
333
+ <label for="show-facet-group-outline-check">
334
+ Show facet group outlines
335
+ </label>
333
336
  </div>
334
337
  <div class="checkbox-control">
335
338
  <input
336
339
  type="checkbox"
337
- id="enable-management"
338
- @click=${this.manageModeCheckboxChanged}
340
+ id="show-outline-check"
341
+ @click=${this.outlineChanged}
339
342
  />
340
- <label for="enable-management">Enable manage mode</label>
343
+ <label for="show-outline-check">Show cell outlines</label>
341
344
  </div>
345
+ </fieldset>
346
+
347
+ <fieldset class="user-profile-controls">
348
+ <legend>User Profile Controls</legend>
342
349
  <div class="checkbox-control">
343
350
  <input
344
351
  type="checkbox"
345
- id="enable-facet-top-view"
346
- @click=${this.facetTopViewCheckboxChanged}
352
+ id="enable-result-last-tile-view"
353
+ @click=${this.resultLastTileViewCheckboxChanged}
347
354
  />
348
- <label for="enable-facet-top-view">Show facet top view</label>
355
+ <label for="enable-result-last-tile-view"
356
+ >Show result last tile view</label
357
+ >
349
358
  </div>
350
359
  <div class="checkbox-control">
351
360
  <input
@@ -355,7 +364,15 @@ export class AppRoot extends LitElement {
355
364
  />
356
365
  <label for="enable-cb-top-view">Show CB top view</label>
357
366
  </div>
358
- </div>
367
+ <div class="checkbox-control">
368
+ <input
369
+ type="checkbox"
370
+ id="enable-facet-top-view"
371
+ @click=${this.facetTopViewCheckboxChanged}
372
+ />
373
+ <label for="enable-facet-top-view">Show facet top view</label>
374
+ </div>
375
+ </fieldset>
359
376
  </div>
360
377
  <button id="toggle-dev-tools-btn" @click=${this.toggleDevTools}>
361
378
  Toggle Search Controls
@@ -558,6 +575,26 @@ export class AppRoot extends LitElement {
558
575
  }
559
576
  }
560
577
 
578
+ private resultLastTileViewCheckboxChanged(e: Event) {
579
+ const target = e.target as HTMLInputElement;
580
+
581
+ const div = document.createElement('div');
582
+ const title = document.createElement('h3');
583
+ title.textContent = 'Upload';
584
+
585
+ div.setAttribute('slot', 'result-last-tile');
586
+ div.setAttribute('class', 'result-last-tile');
587
+ div.appendChild(title);
588
+
589
+ if (target.checked) {
590
+ this.collectionBrowser.appendChild(div);
591
+ } else {
592
+ this.collectionBrowser.removeChild(
593
+ this.collectionBrowser.lastElementChild as Element
594
+ );
595
+ }
596
+ }
597
+
561
598
  /**
562
599
  * Handler for when the dev panel's "Show cb top view" checkbox is changed.
563
600
  */
@@ -706,7 +743,6 @@ export class AppRoot extends LitElement {
706
743
  padding: 0.5rem 1rem;
707
744
  border: 1px solid black;
708
745
  font-size: 1.4rem;
709
- width: 75%;
710
746
  background: #ffffffb3;
711
747
  }
712
748
 
@@ -749,11 +785,17 @@ export class AppRoot extends LitElement {
749
785
  margin-right: 1rem;
750
786
  }
751
787
 
752
- #cell-controls {
788
+ .cell-controls {
753
789
  display: flex;
754
790
  flex-wrap: wrap;
755
791
  }
756
-
792
+ .cell-controls div {
793
+ display: flex;
794
+ align-items: center;
795
+ }
796
+ .cell-controls input[type='range'] {
797
+ width: 120px;
798
+ }
757
799
  #cell-controls label {
758
800
  display: inline-block;
759
801
  width: 10rem;
@@ -777,6 +819,9 @@ export class AppRoot extends LitElement {
777
819
  .checkbox-control {
778
820
  flex-basis: 50%;
779
821
  }
822
+ .checkbox-control label {
823
+ user-select: none;
824
+ }
780
825
 
781
826
  #last-event {
782
827
  background-color: aliceblue;
@@ -799,5 +844,37 @@ export class AppRoot extends LitElement {
799
844
  background-color: aliceblue;
800
845
  font-size: 1.6rem;
801
846
  }
847
+
848
+ /* user profile controls */
849
+ .user-profile-controls {
850
+ width: fit-content;
851
+ }
852
+
853
+ fieldset {
854
+ display: inline-block !important;
855
+ }
856
+
857
+ .result-last-tile {
858
+ border-radius: 4px;
859
+ background-color: white;
860
+ border: 3px dashed #555;
861
+ box-shadow: none;
862
+ display: grid;
863
+ align-content: center;
864
+ }
865
+ .result-last-tile:hover {
866
+ box-shadow: rgba(8, 8, 32, 0.8) 0 0 6px 2px;
867
+ transition: box-shadow 0.1s ease 0s;
868
+ cursor: pointer;
869
+ border: 3px dashed #4b64ff;
870
+ }
871
+ .result-last-tile h3 {
872
+ margin-bottom: 4rem;
873
+ margin: 0px auto;
874
+ font-size: 2.8rem;
875
+ color: rgb(44, 44, 44);
876
+ font-weight: 200;
877
+ text-align: center;
878
+ }
802
879
  `;
803
880
  }
@@ -586,7 +586,10 @@ export class CollectionBrowser
586
586
  .placeholderCellTemplate=${this.placeholderCellTemplate}
587
587
  @scrollThresholdReached=${this.scrollThresholdReached}
588
588
  @visibleCellsChanged=${this.visibleCellsChanged}
589
- ></infinite-scroller>`;
589
+ >${this.displayMode === 'grid'
590
+ ? html`<slot name="result-last-tile" slot="result-last-tile"></slot>`
591
+ : nothing}
592
+ </infinite-scroller>`;
590
593
  }
591
594
 
592
595
  private get infiniteScrollerClasses() {
@@ -1411,15 +1414,16 @@ export class CollectionBrowser
1411
1414
  }
1412
1415
 
1413
1416
  private async handleQueryChange() {
1414
- console.log('handlequerychange');
1415
1417
  // only reset if the query has actually changed
1416
1418
  if (!this.searchService || this.pageFetchQueryKey === this.previousQueryKey)
1417
1419
  return;
1418
- console.log(1);
1419
1420
 
1420
1421
  // If the new state prevents us from updating the search results, don't reset
1421
- if (!this.canPerformSearch && !(this.clearResultsOnEmptyQuery && this.baseQuery === '')) return;
1422
- console.log(2);
1422
+ if (
1423
+ !this.canPerformSearch &&
1424
+ !(this.clearResultsOnEmptyQuery && this.baseQuery === '')
1425
+ )
1426
+ return;
1423
1427
 
1424
1428
  this.previousQueryKey = this.pageFetchQueryKey;
1425
1429
 
@@ -1750,27 +1754,26 @@ export class CollectionBrowser
1750
1754
  }
1751
1755
 
1752
1756
  facetClickHandler({
1753
- detail: { key, state: facetState, negative },
1757
+ detail: { facetType, bucket, negative },
1754
1758
  }: CustomEvent<FacetEventDetails>): void {
1759
+ let action: analyticsActions;
1755
1760
  if (negative) {
1756
- this.analyticsHandler?.sendEvent({
1757
- category: this.searchContext,
1758
- action:
1759
- facetState !== 'none'
1760
- ? analyticsActions.facetNegativeSelected
1761
- : analyticsActions.facetNegativeDeselected,
1762
- label: key,
1763
- });
1761
+ action =
1762
+ bucket.state !== 'none'
1763
+ ? analyticsActions.facetNegativeSelected
1764
+ : analyticsActions.facetNegativeDeselected;
1764
1765
  } else {
1765
- this.analyticsHandler?.sendEvent({
1766
- category: this.searchContext,
1767
- action:
1768
- facetState !== 'none'
1769
- ? analyticsActions.facetSelected
1770
- : analyticsActions.facetDeselected,
1771
- label: key,
1772
- });
1766
+ action =
1767
+ bucket.state !== 'none'
1768
+ ? analyticsActions.facetSelected
1769
+ : analyticsActions.facetDeselected;
1773
1770
  }
1771
+
1772
+ this.analyticsHandler?.sendEvent({
1773
+ category: this.searchContext,
1774
+ action,
1775
+ label: facetType,
1776
+ });
1774
1777
  }
1775
1778
 
1776
1779
  private async fetchFacets() {
@@ -0,0 +1,274 @@
1
+ import {
2
+ css,
3
+ html,
4
+ LitElement,
5
+ TemplateResult,
6
+ CSSResultGroup,
7
+ nothing,
8
+ } from 'lit';
9
+ import { customElement, property } from 'lit/decorators.js';
10
+ import type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
11
+ import eyeIcon from '../assets/img/icons/eye';
12
+ import eyeClosedIcon from '../assets/img/icons/eye-closed';
13
+ import type {
14
+ FacetOption,
15
+ FacetBucket,
16
+ FacetEventDetails,
17
+ FacetState,
18
+ } from '../models';
19
+
20
+ @customElement('facet-row')
21
+ export class FacetRow extends LitElement {
22
+ //
23
+ // UI STATE
24
+ //
25
+
26
+ /** The name of the facet group to which this facet belongs (e.g., "mediatype") */
27
+ @property({ type: String }) facetType?: FacetOption;
28
+
29
+ /** The facet bucket containing details about the state, count, and key for this row */
30
+ @property({ type: Object }) bucket?: FacetBucket;
31
+
32
+ /** The collection name cache for converting collection identifiers to titles */
33
+ @property({ type: Object })
34
+ collectionNameCache?: CollectionNameCacheInterface;
35
+
36
+ //
37
+ // COMPONENT LIFECYCLE METHODS
38
+ //
39
+
40
+ render() {
41
+ return html`${this.facetRowTemplate}`;
42
+ }
43
+
44
+ //
45
+ // TEMPLATE GETTERS
46
+ //
47
+
48
+ /**
49
+ * Template for the full facet row, including the positive/negative checks,
50
+ * the display name, and the count.
51
+ */
52
+ private get facetRowTemplate(): TemplateResult | typeof nothing {
53
+ const { bucket, facetType } = this;
54
+ if (!bucket || !facetType) return nothing;
55
+
56
+ const showOnlyCheckboxId = `${facetType}:${bucket.key}-show-only`;
57
+ const negativeCheckboxId = `${facetType}:${bucket.key}-negative`;
58
+
59
+ // For collections, we need to asynchronously load the collection name
60
+ // so we use the `async-collection-name` widget.
61
+ // For other facet types, we just have a static value to use.
62
+ const bucketTextDisplay =
63
+ facetType !== 'collection'
64
+ ? html`${bucket.displayText ?? bucket.key}`
65
+ : html`<a href="/details/${bucket.key}">
66
+ <async-collection-name
67
+ .collectionNameCache=${this.collectionNameCache}
68
+ .identifier=${bucket.key}
69
+ placeholder="-"
70
+ ></async-collection-name>
71
+ </a> `;
72
+
73
+ const facetHidden = bucket.state === 'hidden';
74
+ const facetSelected = bucket.state === 'selected';
75
+
76
+ const titleText = `${facetType}: ${bucket.displayText ?? bucket.key}`;
77
+ const onlyShowText = facetSelected
78
+ ? `Show all ${facetType}s`
79
+ : `Only show ${titleText}`;
80
+ const hideText = `Hide ${titleText}`;
81
+ const unhideText = `Unhide ${titleText}`;
82
+ const showHideText = facetHidden ? unhideText : hideText;
83
+ const ariaLabel = `${titleText}, ${bucket.count} results`;
84
+
85
+ return html`
86
+ <div class="facet-row-container">
87
+ <div class="facet-checkboxes">
88
+ <input
89
+ type="checkbox"
90
+ .name=${facetType}
91
+ .value=${bucket.key}
92
+ @click=${(e: Event) => {
93
+ this.facetClicked(e, false);
94
+ }}
95
+ .checked=${facetSelected}
96
+ class="select-facet-checkbox"
97
+ title=${onlyShowText}
98
+ id=${showOnlyCheckboxId}
99
+ />
100
+ <input
101
+ type="checkbox"
102
+ id=${negativeCheckboxId}
103
+ .name=${facetType}
104
+ .value=${bucket.key}
105
+ @click=${(e: Event) => {
106
+ this.facetClicked(e, true);
107
+ }}
108
+ .checked=${facetHidden}
109
+ class="hide-facet-checkbox"
110
+ />
111
+ <label
112
+ for=${negativeCheckboxId}
113
+ class="hide-facet-icon${facetHidden ? ' active' : ''}"
114
+ title=${showHideText}
115
+ >
116
+ <span class="eye">${eyeIcon}</span>
117
+ <span class="eye-closed">${eyeClosedIcon}</span>
118
+ </label>
119
+ </div>
120
+ <label
121
+ for=${showOnlyCheckboxId}
122
+ class="facet-info-display"
123
+ title=${onlyShowText}
124
+ aria-label=${ariaLabel}
125
+ >
126
+ <div class="facet-title">${bucketTextDisplay}</div>
127
+ <div class="facet-count">${bucket.count.toLocaleString()}</div>
128
+ </label>
129
+ </div>
130
+ `;
131
+ }
132
+
133
+ //
134
+ // EVENT HANDLERS & DISPATCHERS
135
+ //
136
+
137
+ /**
138
+ * Handler for whenever this facet is clicked & its state changes
139
+ */
140
+ private facetClicked(e: Event, negative: boolean) {
141
+ const { bucket, facetType } = this;
142
+ if (!bucket || !facetType) return;
143
+
144
+ const target = e.target as HTMLInputElement;
145
+ const { checked } = target;
146
+ bucket.state = FacetRow.getFacetState(checked, negative);
147
+
148
+ this.dispatchFacetClickEvent({
149
+ facetType,
150
+ bucket,
151
+ negative,
152
+ });
153
+ }
154
+
155
+ /**
156
+ * Emits a `facetClick` event with details about this facet & its current state
157
+ */
158
+ private dispatchFacetClickEvent(detail: FacetEventDetails) {
159
+ const event = new CustomEvent<FacetEventDetails>('facetClick', {
160
+ detail,
161
+ });
162
+ this.dispatchEvent(event);
163
+ }
164
+
165
+ //
166
+ // OTHER METHODS
167
+ //
168
+
169
+ /**
170
+ * Returns the composed facet state corresponding to a positive or negative facet's checked state
171
+ */
172
+ static getFacetState(checked: boolean, negative: boolean): FacetState {
173
+ let state: FacetState;
174
+ if (checked) {
175
+ state = negative ? 'hidden' : 'selected';
176
+ } else {
177
+ state = 'none';
178
+ }
179
+ return state;
180
+ }
181
+
182
+ //
183
+ // STYLES
184
+ //
185
+
186
+ static get styles(): CSSResultGroup {
187
+ const facetRowBorderTop = css`var(--facet-row-border-top, 1px solid transparent)`;
188
+ const facetRowBorderBottom = css`var(--facet-row-border-bottom, 1px solid transparent)`;
189
+
190
+ return css`
191
+ async-collection-name {
192
+ display: contents;
193
+ }
194
+ .facet-checkboxes {
195
+ margin: 0 5px 0 0;
196
+ display: flex;
197
+ height: 15px;
198
+ }
199
+ .facet-checkboxes input:first-child {
200
+ margin-right: 5px;
201
+ }
202
+ .facet-checkboxes input {
203
+ height: 15px;
204
+ width: 15px;
205
+ margin: 0;
206
+ }
207
+ .facet-row-container {
208
+ display: flex;
209
+ font-weight: 500;
210
+ font-size: 1.2rem;
211
+ margin: 2.5px auto;
212
+ height: auto;
213
+ border-top: ${facetRowBorderTop};
214
+ border-bottom: ${facetRowBorderBottom};
215
+ overflow: hidden;
216
+ }
217
+ .facet-info-display {
218
+ display: flex;
219
+ flex: 1 1 0%;
220
+ cursor: pointer;
221
+ flex-wrap: wrap;
222
+ }
223
+ .facet-title {
224
+ word-break: break-word;
225
+ display: inline-block;
226
+ flex: 1 1 0%;
227
+ }
228
+ .facet-count {
229
+ text-align: right;
230
+ }
231
+ .select-facet-checkbox {
232
+ cursor: pointer;
233
+ display: inline-block;
234
+ }
235
+ .hide-facet-checkbox {
236
+ display: none;
237
+ }
238
+ .hide-facet-icon {
239
+ width: 15px;
240
+ height: 15px;
241
+ cursor: pointer;
242
+ opacity: 0.3;
243
+ display: inline-block;
244
+ }
245
+ .hide-facet-icon:hover,
246
+ .active {
247
+ opacity: 1;
248
+ }
249
+ .hide-facet-icon:hover .eye,
250
+ .hide-facet-icon .eye-closed {
251
+ display: none;
252
+ }
253
+ .hide-facet-icon:hover .eye-closed,
254
+ .hide-facet-icon.active .eye-closed {
255
+ display: inline;
256
+ }
257
+ .hide-facet-icon.active .eye {
258
+ display: none;
259
+ }
260
+ .sorting-icon {
261
+ cursor: pointer;
262
+ }
263
+
264
+ a:link,
265
+ a:visited {
266
+ text-decoration: none;
267
+ color: var(--ia-theme-link-color, #4b64ff);
268
+ }
269
+ a:hover {
270
+ text-decoration: underline;
271
+ }
272
+ `;
273
+ }
274
+ }