@internetarchive/collection-browser 0.4.9-alpha.1 → 0.4.9

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 (263) hide show
  1. package/.editorconfig +29 -29
  2. package/.github/workflows/ci.yml +26 -26
  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/LICENSE +661 -661
  8. package/README.md +83 -83
  9. package/dist/index.d.ts +9 -9
  10. package/dist/index.js +9 -9
  11. package/dist/src/app-root.d.ts +50 -50
  12. package/dist/src/app-root.js +278 -278
  13. package/dist/src/assets/img/icons/arrow-left.d.ts +2 -2
  14. package/dist/src/assets/img/icons/arrow-left.js +2 -2
  15. package/dist/src/assets/img/icons/arrow-right.d.ts +2 -2
  16. package/dist/src/assets/img/icons/arrow-right.js +2 -2
  17. package/dist/src/assets/img/icons/chevron.d.ts +2 -2
  18. package/dist/src/assets/img/icons/chevron.js +2 -2
  19. package/dist/src/assets/img/icons/empty-query.d.ts +2 -2
  20. package/dist/src/assets/img/icons/empty-query.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/software.d.ts +1 -1
  46. package/dist/src/assets/img/icons/mediatype/software.js +2 -2
  47. package/dist/src/assets/img/icons/mediatype/texts.d.ts +1 -1
  48. package/dist/src/assets/img/icons/mediatype/texts.js +2 -2
  49. package/dist/src/assets/img/icons/mediatype/tv.d.ts +1 -1
  50. package/dist/src/assets/img/icons/mediatype/tv.js +2 -2
  51. package/dist/src/assets/img/icons/mediatype/video.d.ts +1 -1
  52. package/dist/src/assets/img/icons/mediatype/video.js +2 -2
  53. package/dist/src/assets/img/icons/mediatype/web.d.ts +1 -1
  54. package/dist/src/assets/img/icons/mediatype/web.js +2 -2
  55. package/dist/src/assets/img/icons/null-result.d.ts +2 -2
  56. package/dist/src/assets/img/icons/null-result.js +2 -2
  57. package/dist/src/assets/img/icons/restricted.d.ts +1 -1
  58. package/dist/src/assets/img/icons/restricted.js +2 -2
  59. package/dist/src/assets/img/icons/reviews.d.ts +1 -1
  60. package/dist/src/assets/img/icons/reviews.js +2 -2
  61. package/dist/src/assets/img/icons/upload.d.ts +1 -1
  62. package/dist/src/assets/img/icons/upload.js +2 -2
  63. package/dist/src/assets/img/icons/views.d.ts +1 -1
  64. package/dist/src/assets/img/icons/views.js +2 -2
  65. package/dist/src/circular-activity-indicator.d.ts +5 -5
  66. package/dist/src/circular-activity-indicator.js +17 -17
  67. package/dist/src/collection-browser.d.ts +281 -281
  68. package/dist/src/collection-browser.js +1204 -1200
  69. package/dist/src/collection-browser.js.map +1 -1
  70. package/dist/src/collection-facets/facet-tombstone-row.d.ts +5 -5
  71. package/dist/src/collection-facets/facet-tombstone-row.js +15 -15
  72. package/dist/src/collection-facets/facets-template.d.ts +16 -16
  73. package/dist/src/collection-facets/facets-template.js +125 -125
  74. package/dist/src/collection-facets/more-facets-content.d.ts +77 -77
  75. package/dist/src/collection-facets/more-facets-content.js +357 -357
  76. package/dist/src/collection-facets/more-facets-pagination.d.ts +36 -36
  77. package/dist/src/collection-facets/more-facets-pagination.js +192 -192
  78. package/dist/src/collection-facets.d.ts +83 -83
  79. package/dist/src/collection-facets.js +392 -392
  80. package/dist/src/collection-facets.js.map +1 -1
  81. package/dist/src/empty-placeholder.d.ts +11 -11
  82. package/dist/src/empty-placeholder.js +42 -42
  83. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -37
  84. package/dist/src/language-code-handler/language-code-handler.js +26 -26
  85. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -1
  86. package/dist/src/language-code-handler/language-code-mapping.js +562 -562
  87. package/dist/src/mediatype/mediatype-config.d.ts +3 -3
  88. package/dist/src/mediatype/mediatype-config.js +85 -85
  89. package/dist/src/models.d.ts +115 -114
  90. package/dist/src/models.js +125 -125
  91. package/dist/src/models.js.map +1 -1
  92. package/dist/src/restoration-state-handler.d.ts +45 -45
  93. package/dist/src/restoration-state-handler.js +230 -230
  94. package/dist/src/sort-filter-bar/alpha-bar-tooltip.d.ts +6 -0
  95. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js +61 -0
  96. package/dist/src/sort-filter-bar/alpha-bar-tooltip.js.map +1 -0
  97. package/dist/src/sort-filter-bar/alpha-bar.d.ts +20 -12
  98. package/dist/src/sort-filter-bar/alpha-bar.js +166 -58
  99. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  100. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -1
  101. package/dist/src/sort-filter-bar/img/compact.js +2 -2
  102. package/dist/src/sort-filter-bar/img/list.d.ts +1 -1
  103. package/dist/src/sort-filter-bar/img/list.js +2 -2
  104. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -1
  105. package/dist/src/sort-filter-bar/img/sort-triangle.js +2 -2
  106. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -1
  107. package/dist/src/sort-filter-bar/img/tile.js +2 -2
  108. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +108 -108
  109. package/dist/src/sort-filter-bar/sort-filter-bar.js +438 -438
  110. package/dist/src/styles/item-image-styles.d.ts +8 -8
  111. package/dist/src/styles/item-image-styles.js +9 -9
  112. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -5
  113. package/dist/src/tiles/collection-browser-loading-tile.js +15 -15
  114. package/dist/src/tiles/grid/account-tile.d.ts +20 -17
  115. package/dist/src/tiles/grid/account-tile.js +68 -46
  116. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  117. package/dist/src/tiles/grid/collection-tile.d.ts +17 -14
  118. package/dist/src/tiles/grid/collection-tile.js +75 -53
  119. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  120. package/dist/src/tiles/grid/item-tile.d.ts +32 -29
  121. package/dist/src/tiles/grid/item-tile.js +126 -108
  122. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  123. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.d.ts +1 -1
  124. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js +44 -8
  125. package/dist/src/tiles/grid/styles/tile-grid-shared-styles.js.map +1 -1
  126. package/dist/src/tiles/grid/tile-stats.d.ts +10 -10
  127. package/dist/src/tiles/grid/tile-stats.js +40 -40
  128. package/dist/src/tiles/hover/hover-pane-controller.d.ts +219 -197
  129. package/dist/src/tiles/hover/hover-pane-controller.js +352 -331
  130. package/dist/src/tiles/hover/hover-pane-controller.js.map +1 -1
  131. package/dist/src/tiles/hover/tile-hover-pane.d.ts +15 -15
  132. package/dist/src/tiles/hover/tile-hover-pane.js +38 -38
  133. package/dist/src/tiles/image-block.d.ts +17 -17
  134. package/dist/src/tiles/image-block.js +72 -72
  135. package/dist/src/tiles/item-image.d.ts +35 -35
  136. package/dist/src/tiles/item-image.js +117 -117
  137. package/dist/src/tiles/list/account-label.d.ts +1 -1
  138. package/dist/src/tiles/list/account-label.js +6 -6
  139. package/dist/src/tiles/list/date-label.d.ts +1 -1
  140. package/dist/src/tiles/list/date-label.js +12 -12
  141. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -12
  142. package/dist/src/tiles/list/tile-list-compact-header.js +41 -41
  143. package/dist/src/tiles/list/tile-list-compact.d.ts +21 -21
  144. package/dist/src/tiles/list/tile-list-compact.js +99 -99
  145. package/dist/src/tiles/list/tile-list.d.ts +55 -55
  146. package/dist/src/tiles/list/tile-list.js +303 -297
  147. package/dist/src/tiles/list/tile-list.js.map +1 -1
  148. package/dist/src/tiles/mediatype-icon.d.ts +9 -9
  149. package/dist/src/tiles/mediatype-icon.js +47 -47
  150. package/dist/src/tiles/overlay/icon-overlay.d.ts +10 -10
  151. package/dist/src/tiles/overlay/icon-overlay.js +40 -40
  152. package/dist/src/tiles/overlay/icon-text-overlay.d.ts +9 -9
  153. package/dist/src/tiles/overlay/icon-text-overlay.js +38 -38
  154. package/dist/src/tiles/overlay/text-overlay.d.ts +10 -10
  155. package/dist/src/tiles/overlay/text-overlay.js +42 -42
  156. package/dist/src/tiles/text-snippet-block.d.ts +27 -27
  157. package/dist/src/tiles/text-snippet-block.js +73 -73
  158. package/dist/src/tiles/tile-dispatcher.d.ts +58 -55
  159. package/dist/src/tiles/tile-dispatcher.js +203 -179
  160. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  161. package/dist/src/utils/analytics-events.d.ts +22 -22
  162. package/dist/src/utils/analytics-events.js +24 -24
  163. package/dist/src/utils/format-count.d.ts +7 -7
  164. package/dist/src/utils/format-count.js +76 -76
  165. package/dist/src/utils/format-date.d.ts +2 -2
  166. package/dist/src/utils/format-date.js +23 -23
  167. package/dist/src/utils/format-unit-size.d.ts +2 -2
  168. package/dist/src/utils/format-unit-size.js +33 -33
  169. package/dist/test/collection-browser.test.d.ts +1 -1
  170. package/dist/test/collection-browser.test.js +584 -584
  171. package/dist/test/collection-facets/facets-template.test.d.ts +1 -1
  172. package/dist/test/collection-facets/facets-template.test.js +62 -62
  173. package/dist/test/collection-facets/more-facets-content.test.d.ts +1 -1
  174. package/dist/test/collection-facets/more-facets-content.test.js +114 -114
  175. package/dist/test/collection-facets/more-facets-pagination.test.d.ts +1 -1
  176. package/dist/test/collection-facets/more-facets-pagination.test.js +117 -117
  177. package/dist/test/collection-facets.test.d.ts +2 -2
  178. package/dist/test/collection-facets.test.js +508 -508
  179. package/dist/test/empty-placeholder.test.d.ts +1 -1
  180. package/dist/test/empty-placeholder.test.js +33 -33
  181. package/dist/test/icon-overlay.test.d.ts +1 -1
  182. package/dist/test/icon-overlay.test.js +24 -24
  183. package/dist/test/image-block.test.d.ts +1 -1
  184. package/dist/test/image-block.test.js +48 -48
  185. package/dist/test/item-image.test.d.ts +1 -1
  186. package/dist/test/item-image.test.js +84 -84
  187. package/dist/test/mediatype-config.test.d.ts +1 -1
  188. package/dist/test/mediatype-config.test.js +16 -16
  189. package/dist/test/mocks/mock-analytics-handler.d.ts +10 -10
  190. package/dist/test/mocks/mock-analytics-handler.js +15 -15
  191. package/dist/test/mocks/mock-collection-name-cache.d.ts +7 -7
  192. package/dist/test/mocks/mock-collection-name-cache.js +13 -13
  193. package/dist/test/mocks/mock-search-responses.d.ts +12 -12
  194. package/dist/test/mocks/mock-search-responses.js +341 -341
  195. package/dist/test/mocks/mock-search-service.d.ts +13 -13
  196. package/dist/test/mocks/mock-search-service.js +40 -40
  197. package/dist/test/restoration-state-handler.test.d.ts +1 -1
  198. package/dist/test/restoration-state-handler.test.js +125 -125
  199. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.d.ts +1 -0
  200. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js +13 -0
  201. package/dist/test/sort-filter-bar/alpha-bar-tooltip.test.js.map +1 -0
  202. package/dist/test/sort-filter-bar/alpha-bar.test.d.ts +1 -1
  203. package/dist/test/sort-filter-bar/alpha-bar.test.js +73 -43
  204. package/dist/test/sort-filter-bar/alpha-bar.test.js.map +1 -1
  205. package/dist/test/sort-filter-bar/sort-filter-bar.test.d.ts +1 -1
  206. package/dist/test/sort-filter-bar/sort-filter-bar.test.js +197 -197
  207. package/dist/test/text-overlay.test.d.ts +1 -1
  208. package/dist/test/text-overlay.test.js +48 -48
  209. package/dist/test/text-snippet-block.test.d.ts +1 -1
  210. package/dist/test/text-snippet-block.test.js +57 -57
  211. package/dist/test/tile-stats.test.d.ts +1 -1
  212. package/dist/test/tile-stats.test.js +33 -33
  213. package/dist/test/tiles/grid/account-tile.test.d.ts +1 -1
  214. package/dist/test/tiles/grid/account-tile.test.js +81 -60
  215. package/dist/test/tiles/grid/account-tile.test.js.map +1 -1
  216. package/dist/test/tiles/grid/collection-tile.test.d.ts +1 -1
  217. package/dist/test/tiles/grid/collection-tile.test.js +81 -57
  218. package/dist/test/tiles/grid/collection-tile.test.js.map +1 -1
  219. package/dist/test/tiles/grid/item-tile.test.d.ts +1 -1
  220. package/dist/test/tiles/grid/item-tile.test.js +163 -142
  221. package/dist/test/tiles/grid/item-tile.test.js.map +1 -1
  222. package/dist/test/tiles/hover/hover-pane-controller.test.d.ts +1 -1
  223. package/dist/test/tiles/hover/hover-pane-controller.test.js +257 -257
  224. package/dist/test/tiles/hover/tile-hover-pane.test.d.ts +1 -1
  225. package/dist/test/tiles/hover/tile-hover-pane.test.js +13 -13
  226. package/dist/test/tiles/list/tile-list-compact.test.d.ts +1 -1
  227. package/dist/test/tiles/list/tile-list-compact.test.js +92 -92
  228. package/dist/test/tiles/list/tile-list.test.d.ts +1 -1
  229. package/dist/test/tiles/list/tile-list.test.js +163 -163
  230. package/dist/test/tiles/tile-dispatcher.test.d.ts +1 -0
  231. package/dist/test/tiles/tile-dispatcher.test.js +101 -0
  232. package/dist/test/tiles/tile-dispatcher.test.js.map +1 -0
  233. package/dist/test/utils/format-count.test.d.ts +1 -1
  234. package/dist/test/utils/format-count.test.js +23 -23
  235. package/dist/test/utils/format-date.test.d.ts +1 -1
  236. package/dist/test/utils/format-date.test.js +17 -17
  237. package/dist/test/utils/format-unit-size.test.d.ts +1 -1
  238. package/dist/test/utils/format-unit-size.test.js +17 -17
  239. package/local.archive.org.cert +86 -86
  240. package/local.archive.org.key +27 -27
  241. package/package.json +1 -1
  242. package/renovate.json +6 -6
  243. package/src/collection-browser.ts +4 -0
  244. package/src/collection-facets.ts +3 -5
  245. package/src/models.ts +1 -0
  246. package/src/sort-filter-bar/alpha-bar-tooltip.ts +54 -0
  247. package/src/sort-filter-bar/alpha-bar.ts +133 -9
  248. package/src/tiles/grid/account-tile.ts +23 -1
  249. package/src/tiles/grid/collection-tile.ts +31 -2
  250. package/src/tiles/grid/item-tile.ts +22 -2
  251. package/src/tiles/grid/styles/tile-grid-shared-styles.ts +37 -1
  252. package/src/tiles/hover/hover-pane-controller.ts +38 -1
  253. package/src/tiles/list/tile-list.ts +8 -1
  254. package/src/tiles/tile-dispatcher.ts +29 -2
  255. package/test/sort-filter-bar/alpha-bar-tooltip.test.ts +17 -0
  256. package/test/sort-filter-bar/alpha-bar.test.ts +46 -1
  257. package/test/tiles/grid/account-tile.test.ts +27 -0
  258. package/test/tiles/grid/collection-tile.test.ts +30 -0
  259. package/test/tiles/grid/item-tile.test.ts +27 -0
  260. package/test/tiles/tile-dispatcher.test.ts +122 -0
  261. package/tsconfig.json +21 -21
  262. package/web-dev-server.config.mjs +30 -30
  263. package/web-test-runner.config.mjs +41 -41
@@ -0,0 +1,61 @@
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
+ return html `
11
+ <div id="tooltip-container" role="tooltip">
12
+ <div id="arrow"></div>
13
+ <div id="tooltip-text">
14
+ ${this.numResults} ${this.numResults === 1 ? 'result' : 'results'}
15
+ </div>
16
+ </div>
17
+ `;
18
+ }
19
+ static get styles() {
20
+ const arrowSize = css `var(--tooltipArrowSize, 5px)`;
21
+ const arrowOffset = css `var(--tooltipArrowOffset, 0px)`;
22
+ return css `
23
+ #tooltip-container {
24
+ width: max-content;
25
+ max-width: 200px;
26
+ padding-top: ${arrowSize};
27
+ pointer-events: none;
28
+ }
29
+
30
+ #arrow {
31
+ position: absolute;
32
+ left: calc(50% + ${arrowOffset});
33
+ top: 0;
34
+ width: 0;
35
+ height: 0;
36
+ margin-top: calc(-1 * ${arrowSize});
37
+ margin-left: calc(-1 * ${arrowSize});
38
+ border: ${arrowSize} solid transparent;
39
+ border-bottom-color: black;
40
+ }
41
+
42
+ #tooltip-text {
43
+ padding: 3px 8px;
44
+ border-radius: 4px;
45
+ background-color: #000;
46
+ color: white;
47
+ font-size: 1.2rem;
48
+ text-align: center;
49
+ text-decoration: none;
50
+ }
51
+ `;
52
+ }
53
+ };
54
+ __decorate([
55
+ property({ type: Number })
56
+ ], AlphaBarTooltip.prototype, "numResults", void 0);
57
+ AlphaBarTooltip = __decorate([
58
+ customElement('alpha-bar-tooltip')
59
+ ], AlphaBarTooltip);
60
+ export { AlphaBarTooltip };
61
+ //# sourceMappingURL=alpha-bar-tooltip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"alpha-bar-tooltip.js","sourceRoot":"","sources":["../../../src/sort-filter-bar/alpha-bar-tooltip.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAkB,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAG5D,IAAa,eAAe,GAA5B,MAAa,eAAgB,SAAQ,UAAU;IAA/C;;QAC8B,eAAU,GAAW,CAAC,CAAC;IAgDrD,CAAC;IA9CC,MAAM;QACJ,OAAO,IAAI,CAAA;;;;YAIH,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS;;;KAGtE,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,MAAM,SAAS,GAAG,GAAG,CAAA,8BAA8B,CAAC;QACpD,MAAM,WAAW,GAAG,GAAG,CAAA,gCAAgC,CAAC;QAExD,OAAO,GAAG,CAAA;;;;uBAIS,SAAS;;;;;;2BAML,WAAW;;;;gCAIN,SAAS;iCACR,SAAS;kBACxB,SAAS;;;;;;;;;;;;;KAatB,CAAC;IACJ,CAAC;CACF,CAAA;AAhD6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;mDAAwB;AADxC,eAAe;IAD3B,aAAa,CAAC,mBAAmB,CAAC;GACtB,eAAe,CAiD3B;SAjDY,eAAe","sourcesContent":["import { LitElement, html, css, CSSResultGroup } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\n\n@customElement('alpha-bar-tooltip')\nexport class AlphaBarTooltip extends LitElement {\n @property({ type: Number }) numResults: number = 0;\n\n render() {\n return html`\n <div id=\"tooltip-container\" role=\"tooltip\">\n <div id=\"arrow\"></div>\n <div id=\"tooltip-text\">\n ${this.numResults} ${this.numResults === 1 ? 'result' : 'results'}\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const arrowSize = css`var(--tooltipArrowSize, 5px)`;\n const arrowOffset = css`var(--tooltipArrowOffset, 0px)`;\n\n return css`\n #tooltip-container {\n width: max-content;\n max-width: 200px;\n padding-top: ${arrowSize};\n pointer-events: none;\n }\n\n #arrow {\n position: absolute;\n left: calc(50% + ${arrowOffset});\n top: 0;\n width: 0;\n height: 0;\n margin-top: calc(-1 * ${arrowSize});\n margin-left: calc(-1 * ${arrowSize});\n border: ${arrowSize} solid transparent;\n border-bottom-color: black;\n }\n\n #tooltip-text {\n padding: 3px 8px;\n border-radius: 4px;\n background-color: #000;\n color: white;\n font-size: 1.2rem;\n text-align: center;\n text-decoration: none;\n }\n `;\n }\n}\n"]}
@@ -1,12 +1,20 @@
1
- import { LitElement } from 'lit';
2
- import type { PrefixFilterCounts } from '../models';
3
- export declare class AlphaBar extends LitElement {
4
- selectedLetter: string | null;
5
- letterCounts?: PrefixFilterCounts;
6
- private get selectedUppercaseLetter();
7
- render(): import("lit-html").TemplateResult<1>;
8
- private letterLinkTemplate;
9
- private letterClicked;
10
- private readonly alphabet;
11
- static styles: import("lit").CSSResult;
12
- }
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
+ private tooltipShown;
8
+ private hoveredLetter?;
9
+ private tooltip?;
10
+ private readonly alphabet;
11
+ private get selectedUppercaseLetter();
12
+ render(): TemplateResult<1>;
13
+ private letterLinkTemplate;
14
+ private tooltipTemplate;
15
+ private letterClicked;
16
+ private handleMouseMove;
17
+ private handleMouseLeave;
18
+ private positionTooltip;
19
+ static styles: import("lit").CSSResult;
20
+ }
@@ -1,63 +1,136 @@
1
- import { __decorate } from "tslib";
2
- import { LitElement, html, css } from 'lit';
3
- import { customElement, property } from 'lit/decorators.js';
4
- let AlphaBar = class AlphaBar extends LitElement {
5
- constructor() {
6
- super(...arguments);
7
- this.selectedLetter = null;
8
- this.alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');
9
- }
10
- get selectedUppercaseLetter() {
11
- var _a;
12
- return (_a = this.selectedLetter) === null || _a === void 0 ? void 0 : _a.toUpperCase();
13
- }
14
- render() {
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() {
15
17
  return html `
16
18
  <div id="container">
17
19
  <ul>
18
- ${this.alphabet.map(letter => {
19
- var _a;
20
+ ${this.alphabet.map(letter => {
21
+ var _a;
20
22
  return html `
21
23
  <li
22
- class=${letter === this.selectedUppercaseLetter
23
- ? 'selected'
24
- : ''}
24
+ class=${letter === this.selectedUppercaseLetter
25
+ ? 'selected'
26
+ : nothing}
27
+ @mousemove=${this.handleMouseMove}
28
+ @mouseleave=${this.handleMouseLeave}
25
29
  >
26
- ${((_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[letter])
27
- ? this.letterLinkTemplate(letter)
30
+ ${((_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[letter])
31
+ ? this.letterLinkTemplate(letter)
28
32
  : html `<span>${letter}</span>`}
33
+ ${this.tooltipTemplate(letter)}
29
34
  </li>
30
- `;
35
+ `;
31
36
  })}
32
37
  </ul>
33
38
  </div>
34
- `;
35
- }
36
- letterLinkTemplate(letter) {
39
+ `;
40
+ }
41
+ letterLinkTemplate(letter) {
37
42
  return html `
38
43
  <a
39
44
  href="#"
40
- @click=${(e) => {
41
- e.preventDefault();
42
- this.letterClicked(letter);
45
+ @click=${(e) => {
46
+ e.preventDefault();
47
+ this.letterClicked(letter);
43
48
  }}
44
49
  >
45
50
  ${letter}
46
51
  </a>
47
- `;
48
- }
49
- letterClicked(letter) {
50
- if (letter === this.selectedUppercaseLetter) {
51
- this.selectedLetter = null;
52
- }
53
- else {
54
- this.selectedLetter = letter;
55
- }
56
- this.dispatchEvent(new CustomEvent('letterChanged', {
57
- detail: { selectedLetter: this.selectedUppercaseLetter },
58
- }));
59
- }
60
- };
52
+ `;
53
+ }
54
+ tooltipTemplate(letter) {
55
+ var _a, _b;
56
+ if (this.hoveredLetter !== letter)
57
+ return nothing;
58
+ return this.tooltipShown
59
+ ? html `<alpha-bar-tooltip
60
+ data-letter=${letter}
61
+ .numResults=${(_b = (_a = this.letterCounts) === null || _a === void 0 ? void 0 : _a[this.hoveredLetter]) !== null && _b !== void 0 ? _b : 0}
62
+ ></alpha-bar-tooltip>`
63
+ : nothing;
64
+ }
65
+ letterClicked(letter) {
66
+ if (letter === this.selectedUppercaseLetter) {
67
+ this.selectedLetter = null;
68
+ }
69
+ else {
70
+ this.selectedLetter = letter;
71
+ }
72
+ this.dispatchEvent(new CustomEvent('letterChanged', {
73
+ detail: { selectedLetter: this.selectedUppercaseLetter },
74
+ }));
75
+ }
76
+ async handleMouseMove(e) {
77
+ var _a, _b;
78
+ const target = e.target;
79
+ if (target && !this.tooltipShown) {
80
+ const targetLetter = (_b = (_a = target.textContent) === null || _a === void 0 ? void 0 : _a.trim()) !== null && _b !== void 0 ? _b : undefined;
81
+ this.tooltipShown = true;
82
+ this.hoveredLetter = targetLetter;
83
+ await this.updateComplete;
84
+ await new Promise(resolve => {
85
+ setTimeout(resolve, 0);
86
+ });
87
+ if (this.tooltip && this.tooltip.dataset.letter === targetLetter) {
88
+ this.positionTooltip(target);
89
+ }
90
+ }
91
+ }
92
+ handleMouseLeave() {
93
+ this.tooltipShown = false;
94
+ this.hoveredLetter = undefined;
95
+ }
96
+ positionTooltip(targetElmt) {
97
+ if (!this.tooltip)
98
+ return;
99
+ // Basic positioning is just to center the whole tooltip on the letter box.
100
+ const tooltipWidth = this.tooltip.clientWidth;
101
+ const letterWidth = targetElmt.clientWidth;
102
+ let left = letterWidth / 2 - tooltipWidth / 2;
103
+ // But we also need to ensure the tooltip doesn't flow outside the viewport.
104
+ // First, calculate the full width of the document body, including margins
105
+ // (but not including any scrollbar).
106
+ const bodyStyle = getComputedStyle(document.body);
107
+ const bodyMarginLeft = parseFloat(bodyStyle.getPropertyValue('margin-left'));
108
+ const bodyMarginRight = parseFloat(bodyStyle.getPropertyValue('margin-right'));
109
+ const bodyWidthWithMargin = document.body.clientWidth + bodyMarginLeft + bodyMarginRight;
110
+ // Calculate the positions of the tooltip's left/right edges, and determine
111
+ // how much they overflow the viewport by (if at all).
112
+ const targetRect = targetElmt.getBoundingClientRect();
113
+ const tooltipLeft = targetRect.left + left;
114
+ const tooltipRight = tooltipLeft + tooltipWidth;
115
+ const offset = 1; // How many pixels the tooltip must be offset from the left/right edges
116
+ let overflowAmt;
117
+ if (tooltipLeft < offset) {
118
+ // Tooltip overflows left edge of viewport
119
+ overflowAmt = tooltipLeft - offset;
120
+ }
121
+ else if (tooltipRight > bodyWidthWithMargin - offset) {
122
+ // Tooltip overflows right edge of viewport
123
+ overflowAmt = tooltipRight - bodyWidthWithMargin + offset;
124
+ }
125
+ // Apply any needed adjustment to the tooltip and its arrow to keep it in the viewport
126
+ if (overflowAmt) {
127
+ left -= overflowAmt;
128
+ this.tooltip.style.setProperty('--tooltipArrowOffset', `${overflowAmt}px`);
129
+ }
130
+ this.tooltip.style.left = `${left}px`;
131
+ this.tooltip.classList.add('fade-in');
132
+ }
133
+ };
61
134
  AlphaBar.styles = css `
62
135
  h1 {
63
136
  font-size: 1.2rem;
@@ -78,40 +151,75 @@ AlphaBar.styles = css `
78
151
  }
79
152
 
80
153
  ul li {
154
+ position: relative;
81
155
  flex: 1;
82
156
  text-align: center;
83
157
  max-width: 2.5rem;
158
+ border-radius: 4px;
159
+ }
160
+
161
+ li:hover:not(.selected) a {
162
+ background-color: #c0c0c0;
163
+ }
164
+
165
+ a,
166
+ span {
167
+ display: flex;
168
+ justify-content: center;
169
+ align-items: center;
170
+ aspect-ratio: 1 / 1;
84
171
  }
85
172
 
86
173
  a {
87
174
  color: #333;
88
175
  text-decoration: none;
89
- padding: 0.5rem 0;
90
- display: block;
176
+ border-radius: 4px;
91
177
  }
92
178
 
93
179
  span {
94
180
  color: #aaa;
95
- padding: 0.5rem 0;
96
- display: block;
181
+ cursor: default;
97
182
  }
98
183
 
99
184
  .selected {
100
- background-color: darkgray;
185
+ background-color: #2c2c2c;
101
186
  }
102
187
 
103
188
  .selected a {
104
189
  color: white;
105
190
  }
106
- `;
107
- __decorate([
108
- property({ type: String })
109
- ], AlphaBar.prototype, "selectedLetter", void 0);
110
- __decorate([
111
- property({ type: Object })
112
- ], AlphaBar.prototype, "letterCounts", void 0);
113
- AlphaBar = __decorate([
114
- customElement('alpha-bar')
115
- ], AlphaBar);
116
- export { AlphaBar };
191
+
192
+ alpha-bar-tooltip {
193
+ position: absolute;
194
+ top: 100%;
195
+ left: -9999px;
196
+ margin-top: 3px;
197
+
198
+ opacity: 0;
199
+ transition: opacity 0.2s ease;
200
+ }
201
+
202
+ alpha-bar-tooltip.fade-in {
203
+ opacity: 1;
204
+ }
205
+ `;
206
+ __decorate([
207
+ property({ type: String })
208
+ ], AlphaBar.prototype, "selectedLetter", void 0);
209
+ __decorate([
210
+ property({ type: Object })
211
+ ], AlphaBar.prototype, "letterCounts", void 0);
212
+ __decorate([
213
+ state()
214
+ ], AlphaBar.prototype, "tooltipShown", void 0);
215
+ __decorate([
216
+ state()
217
+ ], AlphaBar.prototype, "hoveredLetter", void 0);
218
+ __decorate([
219
+ query('alpha-bar-tooltip')
220
+ ], AlphaBar.prototype, "tooltip", void 0);
221
+ AlphaBar = __decorate([
222
+ customElement('alpha-bar')
223
+ ], AlphaBar);
224
+ export { AlphaBar };
117
225
  //# sourceMappingURL=alpha-bar.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"alpha-bar.js","sourceRoot":"","sources":["../../../src/sort-filter-bar/alpha-bar.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI5D,IAAa,QAAQ,GAArB,MAAa,QAAS,SAAQ,UAAU;IAAxC;;QAC8B,mBAAc,GAAkB,IAAI,CAAC;QA0DhD,aAAQ,GAAG,4BAA4B,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IAgDrE,CAAC;IAtGC,IAAY,uBAAuB;;QACjC,OAAO,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAA;;;YAGH,IAAI,CAAC,QAAQ,CAAC,GAAG,CACjB,MAAM,CAAC,EAAE;;YACP,OAAA,IAAI,CAAA;;0BAEQ,MAAM,KAAK,IAAI,CAAC,uBAAuB;gBAC7C,CAAC,CAAC,UAAU;gBACZ,CAAC,CAAC,EAAE;;oBAEJ,CAAA,MAAA,IAAI,CAAC,YAAY,0CAAG,MAAM,CAAC;gBAC3B,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;gBACjC,CAAC,CAAC,IAAI,CAAA,SAAS,MAAM,SAAS;;eAEnC,CAAA;SAAA,CACJ;;;KAGN,CAAC;IACJ,CAAC;IAEO,kBAAkB,CAAC,MAAc;QACvC,OAAO,IAAI,CAAA;;;iBAGE,CAAC,CAAQ,EAAE,EAAE;YACpB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC7B,CAAC;;UAEC,MAAM;;KAEX,CAAC;IACJ,CAAC;IAEO,aAAa,CAAC,MAAc;QAClC,IAAI,MAAM,KAAK,IAAI,CAAC,uBAAuB,EAAE;YAC3C,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;SAC5B;aAAM;YACL,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC;SAC9B;QACD,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,eAAe,EAAE;YAC/B,MAAM,EAAE,EAAE,cAAc,EAAE,IAAI,CAAC,uBAAuB,EAAE;SACzD,CAAC,CACH,CAAC;IACJ,CAAC;CAkDF,CAAA;AA9CQ,eAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6ClB,CAAC;AAzG0B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAsC;AAErC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAmC;AAHnD,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CA2GpB;SA3GY,QAAQ","sourcesContent":["import { LitElement, html, css } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport type { PrefixFilterCounts } from '../models';\n\n@customElement('alpha-bar')\nexport class AlphaBar extends LitElement {\n @property({ type: String }) selectedLetter: string | null = null;\n\n @property({ type: Object }) letterCounts?: PrefixFilterCounts;\n\n private get selectedUppercaseLetter(): string | undefined {\n return this.selectedLetter?.toUpperCase();\n }\n\n render() {\n return html`\n <div id=\"container\">\n <ul>\n ${this.alphabet.map(\n letter =>\n html`\n <li\n class=${letter === this.selectedUppercaseLetter\n ? 'selected'\n : ''}\n >\n ${this.letterCounts?.[letter]\n ? this.letterLinkTemplate(letter)\n : html`<span>${letter}</span>`}\n </li>\n `\n )}\n </ul>\n </div>\n `;\n }\n\n private letterLinkTemplate(letter: string) {\n return html`\n <a\n href=\"#\"\n @click=${(e: Event) => {\n e.preventDefault();\n this.letterClicked(letter);\n }}\n >\n ${letter}\n </a>\n `;\n }\n\n private letterClicked(letter: string) {\n if (letter === this.selectedUppercaseLetter) {\n this.selectedLetter = null;\n } else {\n this.selectedLetter = letter;\n }\n this.dispatchEvent(\n new CustomEvent('letterChanged', {\n detail: { selectedLetter: this.selectedUppercaseLetter },\n })\n );\n }\n\n private readonly alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\n\n static styles = css`\n h1 {\n font-size: 1.2rem;\n }\n\n #container {\n background-color: #ddd;\n color: #333;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);\n }\n\n ul {\n list-style: none;\n display: flex;\n margin: 0;\n padding: 0.5rem 1rem;\n justify-content: space-between;\n }\n\n ul li {\n flex: 1;\n text-align: center;\n max-width: 2.5rem;\n }\n\n a {\n color: #333;\n text-decoration: none;\n padding: 0.5rem 0;\n display: block;\n }\n\n span {\n color: #aaa;\n padding: 0.5rem 0;\n display: block;\n }\n\n .selected {\n background-color: darkgray;\n }\n\n .selected a {\n color: white;\n }\n `;\n}\n"]}
1
+ {"version":3,"file":"alpha-bar.js","sourceRoot":"","sources":["../../../src/sort-filter-bar/alpha-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import { LitElement, html, css, nothing, TemplateResult } from 'lit';\nimport { customElement, property, state, query } from 'lit/decorators.js';\nimport type { PrefixFilterCounts } from '../models';\n\nimport './alpha-bar-tooltip';\nimport type { AlphaBarTooltip } from './alpha-bar-tooltip';\n\n@customElement('alpha-bar')\nexport class AlphaBar extends LitElement {\n @property({ type: String }) selectedLetter: string | null = null;\n\n @property({ type: Object }) letterCounts?: PrefixFilterCounts;\n\n @state()\n private tooltipShown: boolean = false;\n\n @state()\n private hoveredLetter?: string;\n\n @query('alpha-bar-tooltip')\n private tooltip?: AlphaBarTooltip;\n\n private readonly alphabet = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'.split('');\n\n private get selectedUppercaseLetter(): string | undefined {\n return this.selectedLetter?.toUpperCase();\n }\n\n render() {\n return html`\n <div id=\"container\">\n <ul>\n ${this.alphabet.map(\n letter =>\n html`\n <li\n class=${letter === this.selectedUppercaseLetter\n ? 'selected'\n : nothing}\n @mousemove=${this.handleMouseMove}\n @mouseleave=${this.handleMouseLeave}\n >\n ${this.letterCounts?.[letter]\n ? this.letterLinkTemplate(letter)\n : html`<span>${letter}</span>`}\n ${this.tooltipTemplate(letter)}\n </li>\n `\n )}\n </ul>\n </div>\n `;\n }\n\n private letterLinkTemplate(letter: string) {\n return html`\n <a\n href=\"#\"\n @click=${(e: Event) => {\n e.preventDefault();\n this.letterClicked(letter);\n }}\n >\n ${letter}\n </a>\n `;\n }\n\n private tooltipTemplate(letter: string): TemplateResult | typeof nothing {\n if (this.hoveredLetter !== letter) return nothing;\n\n return this.tooltipShown\n ? html`<alpha-bar-tooltip\n data-letter=${letter}\n .numResults=${this.letterCounts?.[this.hoveredLetter] ?? 0}\n ></alpha-bar-tooltip>`\n : nothing;\n }\n\n private letterClicked(letter: string) {\n if (letter === this.selectedUppercaseLetter) {\n this.selectedLetter = null;\n } else {\n this.selectedLetter = letter;\n }\n this.dispatchEvent(\n new CustomEvent('letterChanged', {\n detail: { selectedLetter: this.selectedUppercaseLetter },\n })\n );\n }\n\n private async handleMouseMove(e: MouseEvent) {\n const target = e.target as HTMLLIElement;\n if (target && !this.tooltipShown) {\n const targetLetter = target.textContent?.trim() ?? undefined;\n this.tooltipShown = true;\n this.hoveredLetter = targetLetter;\n\n await this.updateComplete;\n await new Promise(resolve => {\n setTimeout(resolve, 0);\n });\n\n if (this.tooltip && this.tooltip.dataset.letter === targetLetter) {\n this.positionTooltip(target);\n }\n }\n }\n\n private handleMouseLeave() {\n this.tooltipShown = false;\n this.hoveredLetter = undefined;\n }\n\n private positionTooltip(targetElmt: HTMLElement) {\n if (!this.tooltip) return;\n\n // Basic positioning is just to center the whole tooltip on the letter box.\n const tooltipWidth = this.tooltip.clientWidth;\n const letterWidth = targetElmt.clientWidth;\n let left = letterWidth / 2 - tooltipWidth / 2;\n\n // But we also need to ensure the tooltip doesn't flow outside the viewport.\n // First, calculate the full width of the document body, including margins\n // (but not including any scrollbar).\n const bodyStyle = getComputedStyle(document.body);\n const bodyMarginLeft = parseFloat(\n bodyStyle.getPropertyValue('margin-left')\n );\n const bodyMarginRight = parseFloat(\n bodyStyle.getPropertyValue('margin-right')\n );\n const bodyWidthWithMargin =\n document.body.clientWidth + bodyMarginLeft + bodyMarginRight;\n\n // Calculate the positions of the tooltip's left/right edges, and determine\n // how much they overflow the viewport by (if at all).\n const targetRect = targetElmt.getBoundingClientRect();\n const tooltipLeft = targetRect.left + left;\n const tooltipRight = tooltipLeft + tooltipWidth;\n const offset = 1; // How many pixels the tooltip must be offset from the left/right edges\n let overflowAmt;\n if (tooltipLeft < offset) {\n // Tooltip overflows left edge of viewport\n overflowAmt = tooltipLeft - offset;\n } else if (tooltipRight > bodyWidthWithMargin - offset) {\n // Tooltip overflows right edge of viewport\n overflowAmt = tooltipRight - bodyWidthWithMargin + offset;\n }\n\n // Apply any needed adjustment to the tooltip and its arrow to keep it in the viewport\n if (overflowAmt) {\n left -= overflowAmt;\n this.tooltip.style.setProperty(\n '--tooltipArrowOffset',\n `${overflowAmt}px`\n );\n }\n\n this.tooltip.style.left = `${left}px`;\n this.tooltip.classList.add('fade-in');\n }\n\n static styles = css`\n h1 {\n font-size: 1.2rem;\n }\n\n #container {\n background-color: #ddd;\n color: #333;\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.5);\n }\n\n ul {\n list-style: none;\n display: flex;\n margin: 0;\n padding: 0.5rem 1rem;\n justify-content: space-between;\n }\n\n ul li {\n position: relative;\n flex: 1;\n text-align: center;\n max-width: 2.5rem;\n border-radius: 4px;\n }\n\n li:hover:not(.selected) a {\n background-color: #c0c0c0;\n }\n\n a,\n span {\n display: flex;\n justify-content: center;\n align-items: center;\n aspect-ratio: 1 / 1;\n }\n\n a {\n color: #333;\n text-decoration: none;\n border-radius: 4px;\n }\n\n span {\n color: #aaa;\n cursor: default;\n }\n\n .selected {\n background-color: #2c2c2c;\n }\n\n .selected a {\n color: white;\n }\n\n alpha-bar-tooltip {\n position: absolute;\n top: 100%;\n left: -9999px;\n margin-top: 3px;\n\n opacity: 0;\n transition: opacity 0.2s ease;\n }\n\n alpha-bar-tooltip.fade-in {\n opacity: 1;\n }\n `;\n}\n"]}
@@ -1 +1 @@
1
- export declare const compactIcon: import("lit-html").TemplateResult<2>;
1
+ export declare const compactIcon: import("lit-html").TemplateResult<2>;
@@ -1,5 +1,5 @@
1
- import { svg } from 'lit';
1
+ import { svg } from 'lit';
2
2
  export const compactIcon = svg `
3
3
  <svg viewBox="0 0 100 100" xmlns = "http://www.w3.org/2000/svg" > <path d="m96.9964435 6h-93.90621462c-.91561615 0-1.65899868-.29021372-2.23014758-.87064117-.57114891-.58042745-.85783455-1.3048369-.86005692-2.17322835 0-.81214848.28668564-1.50731158.86005692-2.08548931.57337127-.57817773 1.3167538-.86839145 2.23014758-.87064117h93.90621462c.800053 0 1.5012105.29021372 2.1034726.87064117.602262.58042745.9022819 1.27559055.9000718 2.08548931 0 .86839145-.3000321 1.5928009-.9000718 2.17322835-.6000398.58042745-1.3011973.87064117-2.1034726.87064117zm-93.90621462 9.6666667h93.90621462c.800053 0 1.5012105.2861891 2.1034726.8585673.602262.5723782.9022819 1.2579009.9000718 2.0565682 0 .8563487-.3000321 1.5851326-.9000718 2.1863516-.6000398.6012189-1.3011973.9007192-2.1034726.8985129h-93.90621462c-.91561615 0-1.65899868-.2995125-2.23014758-.8985129-.57114891-.5990005-.85783455-1.3277843-.86005692-2.1863516 0-.8008858.28668564-1.4864086.86005692-2.0565682.57337127-.5701597 1.3167538-.8563488 2.23014758-.8585673zm0 15.6700431h93.90621462c.800053 0 1.5012105.303883 2.1034726.9116489.602262.6077659.9022819 1.2886888.9000718 2.0427687-.0022346.7540799-.3022545 1.4496342-.9000718 2.0866629-.5978174.6370287-1.2989749.955543-2.1034726.955543h-93.90621462c-.85783454 0-1.58788286-.3038829-2.19014494-.9116488s-.90228193-1.3179516-.90007182-2.1305571c.00223463-.8126055.30225448-1.5081599.90007182-2.0866629.59781734-.5785031 1.32786566-.8688802 2.19014494-.8711312zm0 15.6632902h93.90621462c.800053 0 1.5012105.2861892 2.1034726.8585675.602262.5723783.9022819 1.2290603.9000718 1.9700462 0 .7986674-.3144775 1.5274514-.943408 2.186352-.6289306.6589006-1.3156427.9872417-2.0601364.9850343h-93.90621462c-.85783454 0-1.58788286-.3139318-2.19014494-.9417731-.60226208-.6278414-.90228193-1.3699365-.90007182-2.2262854 0-.7986674.2866979-1.4697699.86006918-2.0133074.57337127-.5435376 1.3167538-.8153063 2.23014758-.8153063zm0 15.6666667h93.90621462c.800053 0 1.5012105.3038947 2.1034726.9116593.602262.6077647.9022819 1.3472117.9000718 2.218341 0 .7540783-.3000321 1.4203685-.9000718 1.9988703-.6000398.5785019-1.3011973.8688784-2.1034726.8711294h-93.90621462c-.91561615 0-1.65899868-.2757451-2.23014758-.8272352-.57114891-.5514902-.85783455-1.2324117-.86005692-2.0427645 0-.8688784.28668564-1.6083253.86005692-2.218341.57337127-.6100156 1.3167538-.9138979 2.23014758-.9116593zm0 15.6666666h93.90621462c.800053 0 1.5012105.3038948 2.1034726.9116594.602262.6077646.9022819 1.3472116.9000718 2.2183409 0 .7540784-.3000321 1.4203685-.9000718 1.9988704-.6000398.5785019-1.3011973.8688784-2.1034726.8711293h-93.90621462c-.91561615 0-1.65899868-.275745-2.23014758-.8272352-.57114891-.5514901-.85783455-1.2324116-.86005692-2.0427645 0-.8688783.28668564-1.6083253.86005692-2.2183409.57337127-.6100156 1.3167538-.9138979 2.23014758-.9116594zm0 15.6666667h93.90621462c.800053 0 1.5012105.3038947 2.1034726.9116594.602262.6077646.9022819 1.3472116.9000718 2.2183409 0 .7540784-.3000321 1.4203685-.9000718 1.9988704-.6000398.5785019-1.3011973.8688783-2.1034726.8711293h-93.90621462c-.91561615 0-1.65899868-.2757451-2.23014758-.8272352-.57114891-.5514901-.85783455-1.2324116-.86005692-2.0427645 0-.8688783.28668564-1.6083253.86005692-2.2183409.57337127-.6100156 1.3167538-.913898 2.23014758-.9116594z" /> </svg>
4
- `;
4
+ `;
5
5
  //# sourceMappingURL=compact.js.map
@@ -1 +1 @@
1
- export declare const listIcon: import("lit-html").TemplateResult<2>;
1
+ export declare const listIcon: import("lit-html").TemplateResult<2>;
@@ -1,5 +1,5 @@
1
- import { svg } from 'lit';
1
+ import { svg } from 'lit';
2
2
  export const listIcon = svg `
3
3
  <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="nonzero"><path d="m97.8975061 6h-65.7343743c-.6409315 0-1.1612995-.29021372-1.5611039-.87064117-.3998043-.58042745-.6004844-1.3048369-.60204-2.17322835 0-.81214848.20068-1.50731158.60204-2.08548931.4013601-.57817773.921728-.86839145 1.5611039-.87064117h65.7343743c.5600372 0 1.0508477.29021372 1.4724313.87064117s.6315976 1.27559055.6300505 2.08548931c0 .86839145-.2100226 1.5928009-.6300505 2.17322835-.420028.58042745-.9108384.87064117-1.4724313.87064117z"/><path d="m97.8975061 61h-65.7343743c-.6409315 0-1.1612995-.2902137-1.5611039-.8706412-.3998043-.5804274-.6004844-1.3048369-.60204-2.1732283 0-.8121485.20068-1.5073116.60204-2.0854893.4013601-.5781778.921728-.8683915 1.5611039-.8706412h65.7343743c.5600372 0 1.0508477.2902137 1.4724313.8706412.4215836.5804274.6315976 1.2755905.6300505 2.0854893 0 .8683914-.2100226 1.5928009-.6300505 2.1732283-.420028.5804275-.9108384.8706412-1.4724313.8706412z"/><path d="m97.8975061 19h-65.7343743c-.6409315 0-1.1612995-.2902137-1.5611039-.8706412-.3998043-.5804274-.6004844-1.3048369-.60204-2.1732283 0-.8121485.20068-1.5073116.60204-2.0854893.4013601-.5781778.921728-.8683915 1.5611039-.8706412h65.7343743c.5600372 0 1.0508477.2902137 1.4724313.8706412.4215836.5804274.6315976 1.2755905.6300505 2.0854893 0 .8683914-.2100226 1.5928009-.6300505 2.1732283-.420028.5804275-.9108384.8706412-1.4724313.8706412z"/><path d="m97.8975061 74h-65.7343743c-.6409315 0-1.1612995-.2902137-1.5611039-.8706412-.3998043-.5804274-.6004844-1.3048369-.60204-2.1732283 0-.8121485.20068-1.5073116.60204-2.0854893.4013601-.5781778.921728-.8683915 1.5611039-.8706412h65.7343743c.5600372 0 1.0508477.2902137 1.4724313.8706412.4215836.5804274.6315976 1.2755905.6300505 2.0854893 0 .8683914-.2100226 1.5928009-.6300505 2.1732283-.420028.5804275-.9108384.8706412-1.4724313.8706412z"/><path d="m97.8975061 32h-65.7343743c-.6409315 0-1.1612995-.2902137-1.5611039-.8706412-.3998043-.5804274-.6004844-1.3048369-.60204-2.1732283 0-.8121485.20068-1.5073116.60204-2.0854893.4013601-.5781778.921728-.8683915 1.5611039-.8706412h65.7343743c.5600372 0 1.0508477.2902137 1.4724313.8706412.4215836.5804274.6315976 1.2755905.6300505 2.0854893 0 .8683914-.2100226 1.5928009-.6300505 2.1732283-.420028.5804275-.9108384.8706412-1.4724313.8706412z"/><path d="m97.8975061 87h-65.7343743c-.6409315 0-1.1612995-.2902137-1.5611039-.8706412-.3998043-.5804274-.6004844-1.3048369-.60204-2.1732283 0-.8121485.20068-1.5073116.60204-2.0854893.4013601-.5781778.921728-.8683915 1.5611039-.8706412h65.7343743c.5600372 0 1.0508477.2902137 1.4724313.8706412.4215836.5804274.6315976 1.2755905.6300505 2.0854893 0 .8683914-.2100226 1.5928009-.6300505 2.1732283-.420028.5804275-.9108384.8706412-1.4724313.8706412z"/><path d="m97.8975061 45h-65.7343743c-.6409315 0-1.1612995-.2902137-1.5611039-.8706412-.3998043-.5804274-.6004844-1.3048369-.60204-2.1732283 0-.8121485.20068-1.5073116.60204-2.0854893.4013601-.5781778.921728-.8683915 1.5611039-.8706412h65.7343743c.5600372 0 1.0508477.2902137 1.4724313.8706412.4215836.5804274.6315976 1.2755905.6300505 2.0854893 0 .8683914-.2100226 1.5928009-.6300505 2.1732283-.420028.5804275-.9108384.8706412-1.4724313.8706412z"/><path d="m97.8975061 100h-65.7343743c-.6409315 0-1.1612995-.2902137-1.5611039-.8706412-.3998043-.5804274-.6004844-1.3048369-.60204-2.1732283 0-.8121485.20068-1.5073116.60204-2.0854893.4013601-.5781778.921728-.8683915 1.5611039-.8706412h65.7343743c.5600372 0 1.0508477.2902137 1.4724313.8706412.4215836.5804274.6315976 1.2755905.6300505 2.0854893 0 .8683914-.2100226 1.5928009-.6300505 2.1732283-.420028.5804275-.9108384.8706412-1.4724313.8706412z"/><path d="m0 0h25v25h-25z"/><path d="m0 55h25v25h-25z"/></g></svg>
4
- `;
4
+ `;
5
5
  //# sourceMappingURL=list.js.map
@@ -1 +1 @@
1
- export declare const sortIcon: import("lit-html").TemplateResult<2>;
1
+ export declare const sortIcon: import("lit-html").TemplateResult<2>;
@@ -1,5 +1,5 @@
1
- import { svg } from 'lit';
1
+ import { svg } from 'lit';
2
2
  export const sortIcon = svg `
3
3
  <svg viewBox="0 0 100 55" xmlns="http://www.w3.org/2000/svg"><path d="m50 0 50 55h-100z"/></svg>
4
- `;
4
+ `;
5
5
  //# sourceMappingURL=sort-triangle.js.map
@@ -1 +1 @@
1
- export declare const tileIcon: import("lit-html").TemplateResult<2>;
1
+ export declare const tileIcon: import("lit-html").TemplateResult<2>;
@@ -1,5 +1,5 @@
1
- import { svg } from 'lit';
1
+ import { svg } from 'lit';
2
2
  export const tileIcon = svg `
3
3
  <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg"><path d="m64 54v46h-28v-46zm36 0v46h-28v-46zm-72 0v46h-28v-46zm36-54v46h-28v-46zm36 0v46h-28v-46zm-72 0v46h-28v-46z"/></svg>
4
- `;
4
+ `;
5
5
  //# sourceMappingURL=tile.js.map