@internetarchive/collection-browser 1.14.12 → 1.14.13

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 (273) 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 +83 -83
  8. package/dist/src/app-root.js +412 -412
  9. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  10. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  11. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  12. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  13. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  14. package/dist/src/assets/img/icons/chevron.js +2 -2
  15. package/dist/src/assets/img/icons/contract.d.ts +2 -2
  16. package/dist/src/assets/img/icons/contract.js +2 -2
  17. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  18. package/dist/src/assets/img/icons/empty-query.js +2 -2
  19. package/dist/src/assets/img/icons/expand.d.ts +2 -2
  20. package/dist/src/assets/img/icons/expand.js +2 -2
  21. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -2
  22. package/dist/src/assets/img/icons/eye-closed.js +2 -2
  23. package/dist/src/assets/img/icons/eye.d.ts +2 -2
  24. package/dist/src/assets/img/icons/eye.js +2 -2
  25. package/dist/src/assets/img/icons/favorite-filled.d.ts +1 -1
  26. package/dist/src/assets/img/icons/favorite-filled.js +2 -2
  27. package/dist/src/assets/img/icons/login-required.d.ts +1 -1
  28. package/dist/src/assets/img/icons/login-required.js +2 -2
  29. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -1
  30. package/dist/src/assets/img/icons/mediatype/account.js +2 -2
  31. package/dist/src/assets/img/icons/mediatype/audio.d.ts +1 -1
  32. package/dist/src/assets/img/icons/mediatype/audio.js +2 -2
  33. package/dist/src/assets/img/icons/mediatype/collection.d.ts +1 -1
  34. package/dist/src/assets/img/icons/mediatype/collection.js +2 -2
  35. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -1
  36. package/dist/src/assets/img/icons/mediatype/data.js +2 -2
  37. package/dist/src/assets/img/icons/mediatype/etree.d.ts +1 -1
  38. package/dist/src/assets/img/icons/mediatype/etree.js +2 -2
  39. package/dist/src/assets/img/icons/mediatype/film.d.ts +1 -1
  40. package/dist/src/assets/img/icons/mediatype/film.js +2 -2
  41. package/dist/src/assets/img/icons/mediatype/images.d.ts +1 -1
  42. package/dist/src/assets/img/icons/mediatype/images.js +2 -2
  43. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -1
  44. package/dist/src/assets/img/icons/mediatype/radio.js +2 -2
  45. package/dist/src/assets/img/icons/mediatype/search.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/search.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/software.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  55. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  56. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  57. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  58. package/dist/src/assets/img/icons/null-result.js +2 -2
  59. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  60. package/dist/src/assets/img/icons/restricted.js +2 -2
  61. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  62. package/dist/src/assets/img/icons/reviews.js +2 -2
  63. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  64. package/dist/src/assets/img/icons/upload.js +2 -2
  65. package/dist/src/assets/img/icons/views.d.ts +1 -1
  66. package/dist/src/assets/img/icons/views.js +2 -2
  67. package/dist/src/circular-activity-indicator.d.ts +5 -5
  68. package/dist/src/circular-activity-indicator.js +17 -17
  69. package/dist/src/collection-browser.d.ts +534 -534
  70. package/dist/src/collection-browser.js +1897 -1897
  71. package/dist/src/collection-facets/facet-row.d.ts +30 -30
  72. package/dist/src/collection-facets/facet-row.js +115 -115
  73. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  74. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  75. package/dist/src/collection-facets/facets-template.d.ts +17 -17
  76. package/dist/src/collection-facets/facets-template.js +114 -114
  77. package/dist/src/collection-facets/more-facets-content.d.ts +77 -77
  78. package/dist/src/collection-facets/more-facets-content.js +359 -359
  79. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  80. package/dist/src/collection-facets/more-facets-pagination.js +196 -196
  81. package/dist/src/collection-facets/toggle-switch.d.ts +41 -41
  82. package/dist/src/collection-facets/toggle-switch.js +94 -94
  83. package/dist/src/collection-facets.d.ts +104 -104
  84. package/dist/src/collection-facets.js +506 -506
  85. package/dist/src/empty-placeholder.d.ts +23 -23
  86. package/dist/src/empty-placeholder.js +74 -74
  87. package/dist/src/expanded-date-picker.d.ts +43 -43
  88. package/dist/src/expanded-date-picker.js +109 -109
  89. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  90. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  91. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  92. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  93. package/dist/src/manage/manage-bar.d.ts +26 -26
  94. package/dist/src/manage/manage-bar.js +53 -53
  95. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  96. package/dist/src/mediatype/mediatype-config.js +91 -91
  97. package/dist/src/models.d.ts +180 -180
  98. package/dist/src/models.js +269 -269
  99. package/dist/src/restoration-state-handler.d.ts +70 -70
  100. package/dist/src/restoration-state-handler.js +355 -355
  101. package/dist/src/selected-facets.d.ts +67 -0
  102. package/dist/src/selected-facets.js +149 -0
  103. package/dist/src/selected-facets.js.map +1 -0
  104. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -6
  105. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +24 -24
  106. package/dist/src/sort-filter-bar/alpha-bar.d.ts +21 -21
  107. package/dist/src/sort-filter-bar/alpha-bar.js +128 -128
  108. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  109. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  110. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  111. package/dist/src/sort-filter-bar/img/list.js +2 -2
  112. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.d.ts +1 -1
  113. package/dist/src/sort-filter-bar/img/sort-toggle-disabled.js +2 -2
  114. package/dist/src/sort-filter-bar/img/sort-toggle-down.d.ts +1 -1
  115. package/dist/src/sort-filter-bar/img/sort-toggle-down.js +2 -2
  116. package/dist/src/sort-filter-bar/img/sort-toggle-up.d.ts +1 -1
  117. package/dist/src/sort-filter-bar/img/sort-toggle-up.js +2 -2
  118. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  119. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  120. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  121. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  122. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +210 -210
  123. package/dist/src/sort-filter-bar/sort-filter-bar.js +644 -644
  124. package/dist/src/styles/item-image-styles.d.ts +8 -8
  125. package/dist/src/styles/item-image-styles.js +9 -9
  126. package/dist/src/styles/sr-only.d.ts +1 -1
  127. package/dist/src/styles/sr-only.js +2 -2
  128. package/dist/src/tiles/base-tile-component.d.ts +19 -19
  129. package/dist/src/tiles/base-tile-component.js +63 -63
  130. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  131. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  132. package/dist/src/tiles/grid/account-tile.d.ts +18 -18
  133. package/dist/src/tiles/grid/account-tile.js +72 -72
  134. package/dist/src/tiles/grid/collection-tile.d.ts +15 -15
  135. package/dist/src/tiles/grid/collection-tile.js +80 -80
  136. package/dist/src/tiles/grid/item-tile.d.ts +27 -27
  137. package/dist/src/tiles/grid/item-tile.js +134 -134
  138. package/dist/src/tiles/grid/search-tile.d.ts +10 -10
  139. package/dist/src/tiles/grid/search-tile.js +51 -51
  140. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  141. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +8 -8
  142. package/dist/src/tiles/grid/tile-stats.d.ts +11 -11
  143. package/dist/src/tiles/grid/tile-stats.js +48 -48
  144. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -219
  145. package/dist/src/tiles/hover/hover-pane-controller.js +352 -352
  146. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  147. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  148. package/dist/src/tiles/image-block.d.ts +17 -17
  149. package/dist/src/tiles/image-block.js +73 -73
  150. package/dist/src/tiles/item-image.d.ts +36 -36
  151. package/dist/src/tiles/item-image.js +127 -127
  152. package/dist/src/tiles/list/tile-list-compact-header.d.ts +6 -6
  153. package/dist/src/tiles/list/tile-list-compact-header.js +38 -38
  154. package/dist/src/tiles/list/tile-list-compact.d.ts +15 -15
  155. package/dist/src/tiles/list/tile-list-compact.js +114 -114
  156. package/dist/src/tiles/list/tile-list.d.ts +46 -46
  157. package/dist/src/tiles/list/tile-list.js +302 -302
  158. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  159. package/dist/src/tiles/mediatype-icon.js +47 -47
  160. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  161. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  162. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  163. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  164. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  165. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  166. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  167. package/dist/src/tiles/text-snippet-block.js +73 -73
  168. package/dist/src/tiles/tile-dispatcher.d.ts +64 -64
  169. package/dist/src/tiles/tile-dispatcher.js +231 -231
  170. package/dist/src/tiles/tile-display-value-provider.d.ts +43 -43
  171. package/dist/src/tiles/tile-display-value-provider.js +80 -80
  172. package/dist/src/utils/analytics-events.d.ts +25 -25
  173. package/dist/src/utils/analytics-events.js +27 -27
  174. package/dist/src/utils/array-equals.d.ts +4 -4
  175. package/dist/src/utils/array-equals.js +10 -10
  176. package/dist/src/utils/format-count.d.ts +7 -7
  177. package/dist/src/utils/format-count.js +76 -76
  178. package/dist/src/utils/format-date.d.ts +2 -2
  179. package/dist/src/utils/format-date.js +25 -25
  180. package/dist/src/utils/format-unit-size.d.ts +2 -2
  181. package/dist/src/utils/format-unit-size.js +33 -33
  182. package/dist/src/utils/local-date-from-utc.d.ts +9 -9
  183. package/dist/src/utils/local-date-from-utc.js +15 -15
  184. package/dist/src/utils/sha1.d.ts +2 -2
  185. package/dist/src/utils/sha1.js +8 -8
  186. package/dist/test/collection-browser.test.d.ts +1 -1
  187. package/dist/test/collection-browser.test.js +1137 -1137
  188. package/dist/test/collection-facets/facet-row.test.d.ts +1 -1
  189. package/dist/test/collection-facets/facet-row.test.js +206 -206
  190. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  191. package/dist/test/collection-facets/facets-template.test.js +105 -105
  192. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  193. package/dist/test/collection-facets/more-facets-content.test.js +133 -133
  194. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  195. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  196. package/dist/test/collection-facets/toggle-switch.test.d.ts +1 -1
  197. package/dist/test/collection-facets/toggle-switch.test.js +73 -73
  198. package/dist/test/collection-facets.test.d.ts +2 -2
  199. package/dist/test/collection-facets.test.js +651 -651
  200. package/dist/test/empty-placeholder.test.d.ts +1 -1
  201. package/dist/test/empty-placeholder.test.js +63 -63
  202. package/dist/test/expanded-date-picker.test.d.ts +1 -1
  203. package/dist/test/expanded-date-picker.test.js +95 -95
  204. package/dist/test/icon-overlay.test.d.ts +1 -1
  205. package/dist/test/icon-overlay.test.js +24 -24
  206. package/dist/test/image-block.test.d.ts +1 -1
  207. package/dist/test/image-block.test.js +48 -48
  208. package/dist/test/item-image.test.d.ts +1 -1
  209. package/dist/test/item-image.test.js +86 -86
  210. package/dist/test/manage/manage-bar.test.d.ts +1 -1
  211. package/dist/test/manage/manage-bar.test.js +72 -72
  212. package/dist/test/mediatype-config.test.d.ts +1 -1
  213. package/dist/test/mediatype-config.test.js +16 -16
  214. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  215. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  216. package/dist/test/mocks/mock-collection-name-cache.d.ts +9 -9
  217. package/dist/test/mocks/mock-collection-name-cache.js +17 -17
  218. package/dist/test/mocks/mock-search-responses.d.ts +21 -21
  219. package/dist/test/mocks/mock-search-responses.js +709 -709
  220. package/dist/test/mocks/mock-search-service.d.ts +15 -15
  221. package/dist/test/mocks/mock-search-service.js +50 -50
  222. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  223. package/dist/test/restoration-state-handler.test.js +270 -270
  224. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -1
  225. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +12 -12
  226. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  227. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -73
  228. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  229. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +386 -386
  230. package/dist/test/text-overlay.test.d.ts +1 -1
  231. package/dist/test/text-overlay.test.js +48 -48
  232. package/dist/test/text-snippet-block.test.d.ts +1 -1
  233. package/dist/test/text-snippet-block.test.js +57 -57
  234. package/dist/test/tile-stats.test.d.ts +1 -1
  235. package/dist/test/tile-stats.test.js +33 -33
  236. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  237. package/dist/test/tiles/grid/account-tile.test.js +76 -76
  238. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  239. package/dist/test/tiles/grid/collection-tile.test.js +73 -73
  240. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  241. package/dist/test/tiles/grid/item-tile.test.js +254 -254
  242. package/dist/test/tiles/grid/search-tile.test.d.ts +1 -1
  243. package/dist/test/tiles/grid/search-tile.test.js +51 -51
  244. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  245. package/dist/test/tiles/hover/hover-pane-controller.test.js +258 -258
  246. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  247. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  248. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  249. package/dist/test/tiles/list/tile-list-compact.test.js +143 -143
  250. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  251. package/dist/test/tiles/list/tile-list.test.js +242 -242
  252. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -1
  253. package/dist/test/tiles/tile-dispatcher.test.js +94 -94
  254. package/dist/test/tiles/tile-display-value-provider.test.d.ts +1 -1
  255. package/dist/test/tiles/tile-display-value-provider.test.js +141 -141
  256. package/dist/test/utils/array-equals.test.d.ts +1 -1
  257. package/dist/test/utils/array-equals.test.js +26 -26
  258. package/dist/test/utils/format-count.test.d.ts +1 -1
  259. package/dist/test/utils/format-count.test.js +23 -23
  260. package/dist/test/utils/format-date.test.d.ts +1 -1
  261. package/dist/test/utils/format-date.test.js +17 -17
  262. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  263. package/dist/test/utils/format-unit-size.test.js +17 -17
  264. package/dist/test/utils/local-date-from-utc.test.d.ts +1 -1
  265. package/dist/test/utils/local-date-from-utc.test.js +26 -26
  266. package/local.archive.org.cert +86 -86
  267. package/local.archive.org.key +27 -27
  268. package/package.json +4 -4
  269. package/renovate.json +6 -6
  270. package/src/selected-facets.ts +216 -0
  271. package/tsconfig.json +21 -21
  272. package/web-dev-server.config.mjs +30 -30
  273. package/web-test-runner.config.mjs +41 -41
@@ -0,0 +1,67 @@
1
+ import { type FacetBucket, type FacetGroup, type FacetOption, type FacetValue } from './models';
2
+ /**
3
+ * A record of all the facet buckets for a particular facet type, indexed by their bucket key
4
+ */
5
+ export declare type FacetBucketsRecord = Record<FacetValue, FacetBucket>;
6
+ declare type SelectedFacetsModel = Record<FacetOption, FacetBucketsRecord>;
7
+ /**
8
+ * A class to hold, query, and manipulate state about selected/hidden facets.
9
+ */
10
+ export declare class SelectedFacets implements SelectedFacetsModel {
11
+ readonly collection: FacetBucketsRecord;
12
+ readonly creator: FacetBucketsRecord;
13
+ readonly language: FacetBucketsRecord;
14
+ readonly lending: FacetBucketsRecord;
15
+ readonly mediatype: FacetBucketsRecord;
16
+ readonly subject: FacetBucketsRecord;
17
+ readonly year: FacetBucketsRecord;
18
+ constructor(initValues?: Partial<SelectedFacetsModel>);
19
+ /**
20
+ * Executes the given function on every facet bucket within the current SelectedFacets object.
21
+ * @param fn The function to execute for each facet bucket
22
+ */
23
+ forEach(fn: (bucket: FacetBucket, bucketKey: FacetValue, facetType: FacetOption) => unknown): void;
24
+ /**
25
+ * Executes the given function on every facet type within the current SelectedFacets object.
26
+ * Similar to `SelectedFacets.forEach`, but operating on the full set of buckets for each type
27
+ * (rather than individual buckets).
28
+ * @param fn The function to execute for each facet type
29
+ */
30
+ forEachFacetType(fn: (buckets: FacetBucketsRecord, facetType: FacetOption) => unknown): void;
31
+ /**
32
+ * Like `Array.some`, returns whether the given predicate function returns true for
33
+ * any of the facet buckets contained in this object.
34
+ * @param predicate Function returning a boolean for each bucket
35
+ * @returns Whether any of the facet buckets satisfy the predicate
36
+ */
37
+ some(predicate: (bucket: FacetBucket, bucketKey: FacetValue, facetType: FacetOption) => boolean): boolean;
38
+ /**
39
+ * Like `Array.every`, returns whether the given predicate function returns true for
40
+ * *all* of the facet buckets contained in this object.
41
+ * @param predicate Function returning a boolean for each bucket
42
+ * @returns Whether all of the facet buckets satisfy the predicate
43
+ */
44
+ every(predicate: (bucket: FacetBucket, bucketKey: FacetValue, facetType: FacetOption) => boolean): boolean;
45
+ /**
46
+ * Returns a new SelectedFacets object deeply cloned from this one (same contents).
47
+ */
48
+ clone(): SelectedFacets;
49
+ /**
50
+ * Returns a new SelectedFacets object cloned from this one with all of the given `otherFacets`
51
+ * applied overtop. Facets from this object will be overwritten by those in `otherFacets`
52
+ * that have the same facet type and bucket key.
53
+ *
54
+ * @param otherFacets The other SelectedFacets object to merge into this one.
55
+ */
56
+ merge(otherFacets?: SelectedFacets): SelectedFacets;
57
+ /**
58
+ * Returns a new SelectedFacets object with facet buckets normalized, such that any
59
+ * buckets with a state of 'none' are removed entirely.
60
+ */
61
+ normalize(): SelectedFacets;
62
+ /**
63
+ * Converts this SelectedFacets object into an array of equivalent FacetGroups.
64
+ */
65
+ toFacetGroups(): FacetGroup[];
66
+ }
67
+ export {};
@@ -0,0 +1,149 @@
1
+ import { facetTitles, lendingFacetDisplayNames, } from './models';
2
+ const VALID_FACET_OPTIONS = new Set([
3
+ 'collection',
4
+ 'creator',
5
+ 'language',
6
+ 'lending',
7
+ 'mediatype',
8
+ 'subject',
9
+ 'year',
10
+ ]);
11
+ /**
12
+ * A class to hold, query, and manipulate state about selected/hidden facets.
13
+ */
14
+ export class SelectedFacets {
15
+ constructor(initValues) {
16
+ this.collection = {};
17
+ this.creator = {};
18
+ this.language = {};
19
+ this.lending = {};
20
+ this.mediatype = {};
21
+ this.subject = {};
22
+ this.year = {};
23
+ if (initValues) {
24
+ for (const [facetType, buckets] of Object.entries(initValues)) {
25
+ if (VALID_FACET_OPTIONS.has(facetType)) {
26
+ for (const [bucketKey, bucket] of Object.entries(buckets)) {
27
+ this[facetType][bucketKey] = { ...bucket };
28
+ }
29
+ }
30
+ }
31
+ }
32
+ }
33
+ /**
34
+ * Executes the given function on every facet bucket within the current SelectedFacets object.
35
+ * @param fn The function to execute for each facet bucket
36
+ */
37
+ forEach(fn) {
38
+ for (const [facetType, buckets] of Object.entries(this)) {
39
+ for (const [bucketKey, bucket] of Object.entries(buckets)) {
40
+ fn(bucket, bucketKey, facetType);
41
+ }
42
+ }
43
+ }
44
+ /**
45
+ * Executes the given function on every facet type within the current SelectedFacets object.
46
+ * Similar to `SelectedFacets.forEach`, but operating on the full set of buckets for each type
47
+ * (rather than individual buckets).
48
+ * @param fn The function to execute for each facet type
49
+ */
50
+ forEachFacetType(fn) {
51
+ for (const [facetType, buckets] of Object.entries(this)) {
52
+ fn(buckets, facetType);
53
+ }
54
+ }
55
+ /**
56
+ * Like `Array.some`, returns whether the given predicate function returns true for
57
+ * any of the facet buckets contained in this object.
58
+ * @param predicate Function returning a boolean for each bucket
59
+ * @returns Whether any of the facet buckets satisfy the predicate
60
+ */
61
+ some(predicate) {
62
+ for (const [facetType, buckets] of Object.entries(this)) {
63
+ for (const [bucketKey, bucket] of Object.entries(buckets)) {
64
+ if (predicate(bucket, bucketKey, facetType))
65
+ return true;
66
+ }
67
+ }
68
+ return false;
69
+ }
70
+ /**
71
+ * Like `Array.every`, returns whether the given predicate function returns true for
72
+ * *all* of the facet buckets contained in this object.
73
+ * @param predicate Function returning a boolean for each bucket
74
+ * @returns Whether all of the facet buckets satisfy the predicate
75
+ */
76
+ every(predicate) {
77
+ for (const [facetType, buckets] of Object.entries(this)) {
78
+ for (const [bucketKey, bucket] of Object.entries(buckets)) {
79
+ if (!predicate(bucket, bucketKey, facetType))
80
+ return false;
81
+ }
82
+ }
83
+ return true;
84
+ }
85
+ /**
86
+ * Returns a new SelectedFacets object deeply cloned from this one (same contents).
87
+ */
88
+ clone() {
89
+ return new SelectedFacets(this);
90
+ }
91
+ /**
92
+ * Returns a new SelectedFacets object cloned from this one with all of the given `otherFacets`
93
+ * applied overtop. Facets from this object will be overwritten by those in `otherFacets`
94
+ * that have the same facet type and bucket key.
95
+ *
96
+ * @param otherFacets The other SelectedFacets object to merge into this one.
97
+ */
98
+ merge(otherFacets) {
99
+ const merged = this.clone();
100
+ otherFacets === null || otherFacets === void 0 ? void 0 : otherFacets.forEach((bucket, bucketKey, facetType) => {
101
+ merged[facetType][bucketKey] = { ...bucket };
102
+ });
103
+ return merged;
104
+ }
105
+ /**
106
+ * Returns a new SelectedFacets object with facet buckets normalized, such that any
107
+ * buckets with a state of 'none' are removed entirely.
108
+ */
109
+ normalize() {
110
+ const normalized = this.clone();
111
+ normalized.forEach((bucket, bucketKey, facetType) => {
112
+ if (bucket.state === 'none') {
113
+ delete normalized[facetType][bucketKey];
114
+ }
115
+ });
116
+ return normalized;
117
+ }
118
+ /**
119
+ * Converts this SelectedFacets object into an array of equivalent FacetGroups.
120
+ */
121
+ toFacetGroups() {
122
+ const facetGroups = {};
123
+ this.forEach((bucket, bucketKey, facetType) => {
124
+ var _a;
125
+ const title = facetTitles[facetType];
126
+ let displayText = bucketKey;
127
+ // For lending facets, convert the key to a more readable format
128
+ if (facetType === 'lending') {
129
+ displayText =
130
+ (_a = lendingFacetDisplayNames[bucketKey]) !== null && _a !== void 0 ? _a : bucketKey;
131
+ }
132
+ if (!facetGroups[facetType]) {
133
+ facetGroups[facetType] = {
134
+ title,
135
+ key: facetType,
136
+ buckets: [],
137
+ };
138
+ }
139
+ facetGroups[facetType].buckets.push({
140
+ displayText,
141
+ key: bucketKey,
142
+ count: bucket.count,
143
+ state: bucket.state,
144
+ });
145
+ });
146
+ return Object.values(facetGroups);
147
+ }
148
+ }
149
+ //# sourceMappingURL=selected-facets.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"selected-facets.js","sourceRoot":"","sources":["../../src/selected-facets.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n facetTitles,\n type FacetBucket,\n type FacetGroup,\n type FacetOption,\n type FacetValue,\n lendingFacetDisplayNames,\n LendingFacetKey,\n} from './models';\n\n/**\n * A record of all the facet buckets for a particular facet type, indexed by their bucket key\n */\nexport type FacetBucketsRecord = Record<FacetValue, FacetBucket>;\n\n// Implementing this model ensures that every facet type is accounted for\ntype SelectedFacetsModel = Record<FacetOption, FacetBucketsRecord>;\n\nconst VALID_FACET_OPTIONS: Set<FacetOption> = new Set([\n 'collection',\n 'creator',\n 'language',\n 'lending',\n 'mediatype',\n 'subject',\n 'year',\n]);\n\n/**\n * A class to hold, query, and manipulate state about selected/hidden facets.\n */\nexport class SelectedFacets implements SelectedFacetsModel {\n readonly collection: FacetBucketsRecord = {};\n\n readonly creator: FacetBucketsRecord = {};\n\n readonly language: FacetBucketsRecord = {};\n\n readonly lending: FacetBucketsRecord = {};\n\n readonly mediatype: FacetBucketsRecord = {};\n\n readonly subject: FacetBucketsRecord = {};\n\n readonly year: FacetBucketsRecord = {};\n\n constructor(initValues?: Partial<SelectedFacetsModel>) {\n if (initValues) {\n for (const [facetType, buckets] of Object.entries(initValues)) {\n if (VALID_FACET_OPTIONS.has(facetType as FacetOption)) {\n for (const [bucketKey, bucket] of Object.entries(buckets)) {\n this[facetType as FacetOption][bucketKey] = { ...bucket };\n }\n }\n }\n }\n }\n\n /**\n * Executes the given function on every facet bucket within the current SelectedFacets object.\n * @param fn The function to execute for each facet bucket\n */\n forEach(\n fn: (\n bucket: FacetBucket,\n bucketKey: FacetValue,\n facetType: FacetOption\n ) => unknown\n ): void {\n for (const [facetType, buckets] of Object.entries(\n this as SelectedFacetsModel\n )) {\n for (const [bucketKey, bucket] of Object.entries(buckets)) {\n fn(bucket, bucketKey, facetType as FacetOption);\n }\n }\n }\n\n /**\n * Executes the given function on every facet type within the current SelectedFacets object.\n * Similar to `SelectedFacets.forEach`, but operating on the full set of buckets for each type\n * (rather than individual buckets).\n * @param fn The function to execute for each facet type\n */\n forEachFacetType(\n fn: (buckets: FacetBucketsRecord, facetType: FacetOption) => unknown\n ): void {\n for (const [facetType, buckets] of Object.entries(\n this as SelectedFacetsModel\n )) {\n fn(buckets, facetType as FacetOption);\n }\n }\n\n /**\n * Like `Array.some`, returns whether the given predicate function returns true for\n * any of the facet buckets contained in this object.\n * @param predicate Function returning a boolean for each bucket\n * @returns Whether any of the facet buckets satisfy the predicate\n */\n some(\n predicate: (\n bucket: FacetBucket,\n bucketKey: FacetValue,\n facetType: FacetOption\n ) => boolean\n ): boolean {\n for (const [facetType, buckets] of Object.entries(\n this as SelectedFacetsModel\n )) {\n for (const [bucketKey, bucket] of Object.entries(buckets)) {\n if (predicate(bucket, bucketKey, facetType as FacetOption)) return true;\n }\n }\n\n return false;\n }\n\n /**\n * Like `Array.every`, returns whether the given predicate function returns true for\n * *all* of the facet buckets contained in this object.\n * @param predicate Function returning a boolean for each bucket\n * @returns Whether all of the facet buckets satisfy the predicate\n */\n every(\n predicate: (\n bucket: FacetBucket,\n bucketKey: FacetValue,\n facetType: FacetOption\n ) => boolean\n ): boolean {\n for (const [facetType, buckets] of Object.entries(\n this as SelectedFacetsModel\n )) {\n for (const [bucketKey, bucket] of Object.entries(buckets)) {\n if (!predicate(bucket, bucketKey, facetType as FacetOption))\n return false;\n }\n }\n\n return true;\n }\n\n /**\n * Returns a new SelectedFacets object deeply cloned from this one (same contents).\n */\n clone(): SelectedFacets {\n return new SelectedFacets(this);\n }\n\n /**\n * Returns a new SelectedFacets object cloned from this one with all of the given `otherFacets`\n * applied overtop. Facets from this object will be overwritten by those in `otherFacets`\n * that have the same facet type and bucket key.\n *\n * @param otherFacets The other SelectedFacets object to merge into this one.\n */\n merge(otherFacets?: SelectedFacets): SelectedFacets {\n const merged = this.clone();\n otherFacets?.forEach((bucket, bucketKey, facetType) => {\n merged[facetType][bucketKey] = { ...bucket };\n });\n\n return merged;\n }\n\n /**\n * Returns a new SelectedFacets object with facet buckets normalized, such that any\n * buckets with a state of 'none' are removed entirely.\n */\n normalize(): SelectedFacets {\n const normalized = this.clone();\n normalized.forEach((bucket, bucketKey, facetType) => {\n if (bucket.state === 'none') {\n delete normalized[facetType][bucketKey];\n }\n });\n\n return normalized;\n }\n\n /**\n * Converts this SelectedFacets object into an array of equivalent FacetGroups.\n */\n toFacetGroups(): FacetGroup[] {\n const facetGroups: Record<string, FacetGroup> = {};\n\n this.forEach((bucket, bucketKey, facetType) => {\n const title = facetTitles[facetType];\n let displayText = bucketKey;\n\n // For lending facets, convert the key to a more readable format\n if (facetType === 'lending') {\n displayText =\n lendingFacetDisplayNames[bucketKey as LendingFacetKey] ?? bucketKey;\n }\n\n if (!facetGroups[facetType]) {\n facetGroups[facetType] = {\n title,\n key: facetType,\n buckets: [],\n };\n }\n\n facetGroups[facetType].buckets.push({\n displayText,\n key: bucketKey,\n count: bucket.count,\n state: bucket.state,\n });\n });\n\n return Object.values(facetGroups);\n }\n}\n"]}
@@ -1,6 +1,6 @@
1
- import { LitElement, CSSResultGroup } from 'lit';
2
- export declare class AlphaBarTooltip extends LitElement {
3
- numResults: number;
4
- render(): import("lit-html").TemplateResult<1>;
5
- static get styles(): CSSResultGroup;
6
- }
1
+ import { LitElement, CSSResultGroup } from 'lit';
2
+ export declare class AlphaBarTooltip extends LitElement {
3
+ numResults: number;
4
+ render(): import("lit-html").TemplateResult<1>;
5
+ static get styles(): CSSResultGroup;
6
+ }
@@ -1,12 +1,12 @@
1
- import { __decorate } from "tslib";
2
- import { LitElement, html, css } from 'lit';
3
- import { customElement, property } from 'lit/decorators.js';
4
- let AlphaBarTooltip = class AlphaBarTooltip extends LitElement {
5
- constructor() {
6
- super(...arguments);
7
- this.numResults = 0;
8
- }
9
- render() {
1
+ import { __decorate } from "tslib";
2
+ import { LitElement, html, css } from 'lit';
3
+ import { customElement, property } from 'lit/decorators.js';
4
+ let AlphaBarTooltip = class AlphaBarTooltip extends LitElement {
5
+ constructor() {
6
+ super(...arguments);
7
+ this.numResults = 0;
8
+ }
9
+ render() {
10
10
  return html `
11
11
  <div id="tooltip-container" role="tooltip">
12
12
  <div id="arrow"></div>
@@ -14,11 +14,11 @@ let AlphaBarTooltip = class AlphaBarTooltip extends LitElement {
14
14
  ${this.numResults} ${this.numResults === 1 ? 'result' : 'results'}
15
15
  </div>
16
16
  </div>
17
- `;
18
- }
19
- static get styles() {
20
- const arrowSize = css `var(--tooltipArrowSize, 5px)`;
21
- const arrowOffset = css `var(--tooltipArrowOffset, 0px)`;
17
+ `;
18
+ }
19
+ static get styles() {
20
+ const arrowSize = css `var(--tooltipArrowSize, 5px)`;
21
+ const arrowOffset = css `var(--tooltipArrowOffset, 0px)`;
22
22
  return css `
23
23
  #tooltip-container {
24
24
  width: max-content;
@@ -47,14 +47,14 @@ let AlphaBarTooltip = class AlphaBarTooltip extends LitElement {
47
47
  text-align: center;
48
48
  text-decoration: none;
49
49
  }
50
- `;
51
- }
52
- };
53
- __decorate([
54
- property({ type: Number })
55
- ], AlphaBarTooltip.prototype, "numResults", void 0);
56
- AlphaBarTooltip = __decorate([
57
- customElement('alpha-bar-tooltip')
58
- ], AlphaBarTooltip);
59
- export { AlphaBarTooltip };
50
+ `;
51
+ }
52
+ };
53
+ __decorate([
54
+ property({ type: Number })
55
+ ], AlphaBarTooltip.prototype, "numResults", void 0);
56
+ AlphaBarTooltip = __decorate([
57
+ customElement('alpha-bar-tooltip')
58
+ ], AlphaBarTooltip);
59
+ export { AlphaBarTooltip };
60
60
  //# sourceMappingURL=alpha-bar-tooltip.js.map
@@ -1,21 +1,21 @@
1
- import { LitElement, TemplateResult } from 'lit';
2
- import type { PrefixFilterCounts } from '../models';
3
- import './alpha-bar-tooltip';
4
- export declare class AlphaBar extends LitElement {
5
- selectedLetter: string | null;
6
- letterCounts?: PrefixFilterCounts;
7
- ariaLandmarkLabel?: string;
8
- private tooltipShown;
9
- private hoveredLetter?;
10
- private tooltip?;
11
- private readonly alphabet;
12
- private get selectedUppercaseLetter();
13
- render(): TemplateResult<1>;
14
- private letterButtonTemplate;
15
- private tooltipTemplate;
16
- private letterClicked;
17
- private handleMouseMove;
18
- private handleMouseLeave;
19
- private positionTooltip;
20
- static styles: import("lit").CSSResult;
21
- }
1
+ import { LitElement, TemplateResult } from 'lit';
2
+ import type { PrefixFilterCounts } from '../models';
3
+ import './alpha-bar-tooltip';
4
+ export declare class AlphaBar extends LitElement {
5
+ selectedLetter: string | null;
6
+ letterCounts?: PrefixFilterCounts;
7
+ ariaLandmarkLabel?: string;
8
+ private tooltipShown;
9
+ private hoveredLetter?;
10
+ private tooltip?;
11
+ private readonly alphabet;
12
+ private get selectedUppercaseLetter();
13
+ render(): TemplateResult<1>;
14
+ private letterButtonTemplate;
15
+ private tooltipTemplate;
16
+ private letterClicked;
17
+ private handleMouseMove;
18
+ private handleMouseLeave;
19
+ private positionTooltip;
20
+ static styles: import("lit").CSSResult;
21
+ }
@@ -1,27 +1,27 @@
1
- import { __decorate } from "tslib";
2
- import { LitElement, html, css, nothing } from 'lit';
3
- import { customElement, property, state, query } from 'lit/decorators.js';
4
- import './alpha-bar-tooltip';
5
- let AlphaBar = class AlphaBar extends LitElement {
6
- constructor() {
7
- super(...arguments);
8
- this.selectedLetter = null;
9
- this.tooltipShown = false;
10
- this.alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
11
- }
12
- get selectedUppercaseLetter() {
13
- var _a;
14
- return (_a = this.selectedLetter) === null || _a === void 0 ? void 0 : _a.toUpperCase();
15
- }
16
- render() {
17
- var _a;
1
+ import { __decorate } from "tslib";
2
+ import { LitElement, html, css, nothing } from 'lit';
3
+ import { customElement, property, state, query } from 'lit/decorators.js';
4
+ import './alpha-bar-tooltip';
5
+ let AlphaBar = class AlphaBar extends LitElement {
6
+ constructor() {
7
+ super(...arguments);
8
+ this.selectedLetter = null;
9
+ this.tooltipShown = false;
10
+ this.alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
11
+ }
12
+ get selectedUppercaseLetter() {
13
+ var _a;
14
+ return (_a = this.selectedLetter) === null || _a === void 0 ? void 0 : _a.toUpperCase();
15
+ }
16
+ render() {
17
+ var _a;
18
18
  return html `
19
19
  <section id="container" aria-label=${(_a = this.ariaLandmarkLabel) !== null && _a !== void 0 ? _a : nothing}>
20
20
  <ul>
21
21
  ${this.alphabet.map(letter => html `
22
22
  <li
23
- class=${letter === this.selectedUppercaseLetter
24
- ? 'selected'
23
+ class=${letter === this.selectedUppercaseLetter
24
+ ? 'selected'
25
25
  : nothing}
26
26
  @mousemove=${this.handleMouseMove}
27
27
  @mouseleave=${this.handleMouseLeave}
@@ -32,103 +32,103 @@ let AlphaBar = class AlphaBar extends LitElement {
32
32
  `)}
33
33
  </ul>
34
34
  </section>
35
- `;
36
- }
37
- letterButtonTemplate(letter) {
38
- var _a, _b, _c;
39
- const ariaLabel = `${letter}: ${(_b = (_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[letter]) !== null && _b !== void 0 ? _b : 0} results`;
35
+ `;
36
+ }
37
+ letterButtonTemplate(letter) {
38
+ var _a, _b, _c;
39
+ const ariaLabel = `${letter}: ${(_b = (_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[letter]) !== null && _b !== void 0 ? _b : 0} results`;
40
40
  return html `
41
41
  <button
42
42
  aria-label=${ariaLabel}
43
43
  ?disabled=${!((_c = this.letterCounts) === null || _c === void 0 ? void 0 : _c[letter])}
44
- @click=${() => {
45
- this.letterClicked(letter);
44
+ @click=${() => {
45
+ this.letterClicked(letter);
46
46
  }}
47
47
  >
48
48
  ${letter}
49
49
  </button>
50
- `;
51
- }
52
- tooltipTemplate(letter) {
53
- var _a, _b;
54
- if (this.hoveredLetter !== letter)
55
- return nothing;
56
- return this.tooltipShown
50
+ `;
51
+ }
52
+ tooltipTemplate(letter) {
53
+ var _a, _b;
54
+ if (this.hoveredLetter !== letter)
55
+ return nothing;
56
+ return this.tooltipShown
57
57
  ? html `<alpha-bar-tooltip
58
58
  data-letter=${letter}
59
59
  .numResults=${(_b = (_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[this.hoveredLetter]) !== null && _b !== void 0 ? _b : 0}
60
- ></alpha-bar-tooltip>`
61
- : nothing;
62
- }
63
- letterClicked(letter) {
64
- if (letter === this.selectedUppercaseLetter) {
65
- this.selectedLetter = null;
66
- }
67
- else {
68
- this.selectedLetter = letter;
69
- }
70
- this.dispatchEvent(new CustomEvent('letterChanged', {
71
- detail: { selectedLetter: this.selectedUppercaseLetter },
72
- }));
73
- }
74
- async handleMouseMove(e) {
75
- var _a, _b;
76
- const target = e.target;
77
- if (target && !this.tooltipShown) {
78
- const targetLetter = (_b = (_a = target.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : undefined;
79
- this.tooltipShown = true;
80
- this.hoveredLetter = targetLetter;
81
- await this.updateComplete;
82
- await new Promise(resolve => {
83
- setTimeout(resolve, 0);
84
- });
85
- if (this.tooltip && this.tooltip.dataset.letter === targetLetter) {
86
- this.positionTooltip(target);
87
- }
88
- }
89
- }
90
- handleMouseLeave() {
91
- this.tooltipShown = false;
92
- this.hoveredLetter = undefined;
93
- }
94
- positionTooltip(targetElmt) {
95
- if (!this.tooltip)
96
- return;
97
- // Basic positioning is just to center the whole tooltip on the letter box.
98
- const tooltipWidth = this.tooltip.clientWidth;
99
- const letterWidth = targetElmt.clientWidth;
100
- let left = letterWidth / 2 - tooltipWidth / 2;
101
- // But we also need to ensure the tooltip doesn't flow outside the viewport.
102
- // First, calculate the full width of the document body, including margins
103
- // (but not including any scrollbar).
104
- const bodyStyle = getComputedStyle(document.body);
105
- const bodyMarginLeft = parseFloat(bodyStyle.getPropertyValue('margin-left'));
106
- const bodyMarginRight = parseFloat(bodyStyle.getPropertyValue('margin-right'));
107
- const bodyWidthWithMargin = document.body.clientWidth + bodyMarginLeft + bodyMarginRight;
108
- // Calculate the positions of the tooltip's left/right edges, and determine
109
- // how much they overflow the viewport by (if at all).
110
- const targetRect = targetElmt.getBoundingClientRect();
111
- const tooltipLeft = targetRect.left + left;
112
- const tooltipRight = tooltipLeft + tooltipWidth;
113
- const offset = 1; // How many pixels the tooltip must be offset from the left/right edges
114
- let overflowAmt;
115
- if (tooltipLeft < offset) {
116
- // Tooltip overflows left edge of viewport
117
- overflowAmt = tooltipLeft - offset;
118
- }
119
- else if (tooltipRight > bodyWidthWithMargin - offset) {
120
- // Tooltip overflows right edge of viewport
121
- overflowAmt = tooltipRight - bodyWidthWithMargin + offset;
122
- }
123
- // Apply any needed adjustment to the tooltip and its arrow to keep it in the viewport
124
- if (overflowAmt) {
125
- left -= overflowAmt;
126
- this.tooltip.style.setProperty('--tooltipArrowOffset', `${overflowAmt}px`);
127
- }
128
- this.tooltip.style.left = `${left}px`;
129
- this.tooltip.classList.add('fade-in');
130
- }
131
- };
60
+ ></alpha-bar-tooltip>`
61
+ : nothing;
62
+ }
63
+ letterClicked(letter) {
64
+ if (letter === this.selectedUppercaseLetter) {
65
+ this.selectedLetter = null;
66
+ }
67
+ else {
68
+ this.selectedLetter = letter;
69
+ }
70
+ this.dispatchEvent(new CustomEvent('letterChanged', {
71
+ detail: { selectedLetter: this.selectedUppercaseLetter },
72
+ }));
73
+ }
74
+ async handleMouseMove(e) {
75
+ var _a, _b;
76
+ const target = e.target;
77
+ if (target && !this.tooltipShown) {
78
+ const targetLetter = (_b = (_a = target.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : undefined;
79
+ this.tooltipShown = true;
80
+ this.hoveredLetter = targetLetter;
81
+ await this.updateComplete;
82
+ await new Promise(resolve => {
83
+ setTimeout(resolve, 0);
84
+ });
85
+ if (this.tooltip && this.tooltip.dataset.letter === targetLetter) {
86
+ this.positionTooltip(target);
87
+ }
88
+ }
89
+ }
90
+ handleMouseLeave() {
91
+ this.tooltipShown = false;
92
+ this.hoveredLetter = undefined;
93
+ }
94
+ positionTooltip(targetElmt) {
95
+ if (!this.tooltip)
96
+ return;
97
+ // Basic positioning is just to center the whole tooltip on the letter box.
98
+ const tooltipWidth = this.tooltip.clientWidth;
99
+ const letterWidth = targetElmt.clientWidth;
100
+ let left = letterWidth / 2 - tooltipWidth / 2;
101
+ // But we also need to ensure the tooltip doesn't flow outside the viewport.
102
+ // First, calculate the full width of the document body, including margins
103
+ // (but not including any scrollbar).
104
+ const bodyStyle = getComputedStyle(document.body);
105
+ const bodyMarginLeft = parseFloat(bodyStyle.getPropertyValue('margin-left'));
106
+ const bodyMarginRight = parseFloat(bodyStyle.getPropertyValue('margin-right'));
107
+ const bodyWidthWithMargin = document.body.clientWidth + bodyMarginLeft + bodyMarginRight;
108
+ // Calculate the positions of the tooltip's left/right edges, and determine
109
+ // how much they overflow the viewport by (if at all).
110
+ const targetRect = targetElmt.getBoundingClientRect();
111
+ const tooltipLeft = targetRect.left + left;
112
+ const tooltipRight = tooltipLeft + tooltipWidth;
113
+ const offset = 1; // How many pixels the tooltip must be offset from the left/right edges
114
+ let overflowAmt;
115
+ if (tooltipLeft < offset) {
116
+ // Tooltip overflows left edge of viewport
117
+ overflowAmt = tooltipLeft - offset;
118
+ }
119
+ else if (tooltipRight > bodyWidthWithMargin - offset) {
120
+ // Tooltip overflows right edge of viewport
121
+ overflowAmt = tooltipRight - bodyWidthWithMargin + offset;
122
+ }
123
+ // Apply any needed adjustment to the tooltip and its arrow to keep it in the viewport
124
+ if (overflowAmt) {
125
+ left -= overflowAmt;
126
+ this.tooltip.style.setProperty('--tooltipArrowOffset', `${overflowAmt}px`);
127
+ }
128
+ this.tooltip.style.left = `${left}px`;
129
+ this.tooltip.classList.add('fade-in');
130
+ }
131
+ };
132
132
  AlphaBar.styles = css `
133
133
  h1 {
134
134
  font-size: 1.2rem;
@@ -215,27 +215,27 @@ AlphaBar.styles = css `
215
215
  grid-template-columns: repeat(13, 1fr);
216
216
  }
217
217
  }
218
- `;
219
- __decorate([
220
- property({ type: String })
221
- ], AlphaBar.prototype, "selectedLetter", void 0);
222
- __decorate([
223
- property({ type: Object })
224
- ], AlphaBar.prototype, "letterCounts", void 0);
225
- __decorate([
226
- property({ type: String })
227
- ], AlphaBar.prototype, "ariaLandmarkLabel", void 0);
228
- __decorate([
229
- state()
230
- ], AlphaBar.prototype, "tooltipShown", void 0);
231
- __decorate([
232
- state()
233
- ], AlphaBar.prototype, "hoveredLetter", void 0);
234
- __decorate([
235
- query('alpha-bar-tooltip')
236
- ], AlphaBar.prototype, "tooltip", void 0);
237
- AlphaBar = __decorate([
238
- customElement('alpha-bar')
239
- ], AlphaBar);
240
- export { AlphaBar };
218
+ `;
219
+ __decorate([
220
+ property({ type: String })
221
+ ], AlphaBar.prototype, "selectedLetter", void 0);
222
+ __decorate([
223
+ property({ type: Object })
224
+ ], AlphaBar.prototype, "letterCounts", void 0);
225
+ __decorate([
226
+ property({ type: String })
227
+ ], AlphaBar.prototype, "ariaLandmarkLabel", void 0);
228
+ __decorate([
229
+ state()
230
+ ], AlphaBar.prototype, "tooltipShown", void 0);
231
+ __decorate([
232
+ state()
233
+ ], AlphaBar.prototype, "hoveredLetter", void 0);
234
+ __decorate([
235
+ query('alpha-bar-tooltip')
236
+ ], AlphaBar.prototype, "tooltip", void 0);
237
+ AlphaBar = __decorate([
238
+ customElement('alpha-bar')
239
+ ], AlphaBar);
240
+ export { AlphaBar };
241
241
  //# sourceMappingURL=alpha-bar.js.map
@@ -1 +1 @@
1
- export declare const compactIcon: import("lit-html").TemplateResult<2>;
1
+ export declare const compactIcon: import("lit-html").TemplateResult<2>;