@internetarchive/collection-browser 0.0.1-alpha.8 → 0.1.1

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 (261) hide show
  1. package/README.md +8 -11
  2. package/demo/app-root.ts +16 -92
  3. package/dist/demo/app-root.d.ts +3 -5
  4. package/dist/demo/app-root.js +13 -83
  5. package/dist/demo/app-root.js.map +1 -1
  6. package/dist/index.d.ts +6 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  10. package/dist/src/assets/img/icons/chevron.js +4 -0
  11. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  12. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  13. package/dist/src/assets/img/icons/mediatype/account.js +6 -4
  14. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  15. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  16. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  17. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  18. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  19. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  20. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  21. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  22. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  23. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  24. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  25. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  26. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  27. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  28. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  29. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  30. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  31. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  32. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  33. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  34. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  35. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  36. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  37. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  38. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  39. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  40. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  41. package/dist/src/collection-browser.d.ts +53 -31
  42. package/dist/src/collection-browser.js +504 -166
  43. package/dist/src/collection-browser.js.map +1 -1
  44. package/dist/src/collection-facets.d.ts +28 -13
  45. package/dist/src/collection-facets.js +276 -160
  46. package/dist/src/collection-facets.js.map +1 -1
  47. package/dist/src/helpers.d.ts +1 -0
  48. package/dist/src/helpers.js +20 -0
  49. package/dist/src/helpers.js.map +1 -0
  50. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  51. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  52. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  53. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  54. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  55. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  56. package/dist/src/mediatype/mediatype-color.d.ts +3 -0
  57. package/dist/src/mediatype/mediatype-color.js +15 -0
  58. package/dist/src/mediatype/mediatype-color.js.map +1 -0
  59. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  60. package/dist/src/mediatype/mediatype-config.js +86 -0
  61. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  62. package/dist/src/mediatype/mediatype-display.d.ts +3 -0
  63. package/dist/src/mediatype/mediatype-display.js +86 -0
  64. package/dist/src/mediatype/mediatype-display.js.map +1 -0
  65. package/dist/src/mediatype/mediatype-icon.d.ts +10 -0
  66. package/dist/src/mediatype/mediatype-icon.js +105 -0
  67. package/dist/src/mediatype/mediatype-icon.js.map +1 -0
  68. package/dist/src/mediatype/mediatype-text.d.ts +3 -0
  69. package/dist/src/mediatype/mediatype-text.js +17 -0
  70. package/dist/src/mediatype/mediatype-text.js.map +1 -0
  71. package/dist/src/mediatype/mediatypeConfig.d.ts +3 -0
  72. package/dist/src/mediatype/mediatypeConfig.js +86 -0
  73. package/dist/src/mediatype/mediatypeConfig.js.map +1 -0
  74. package/dist/src/mediatype-icon.d.ts +2 -2
  75. package/dist/src/mediatype-icon.js +35 -46
  76. package/dist/src/mediatype-icon.js.map +1 -1
  77. package/dist/src/models.d.ts +72 -13
  78. package/dist/src/models.js +57 -1
  79. package/dist/src/models.js.map +1 -1
  80. package/dist/src/restoration-state-handler.d.ts +38 -0
  81. package/dist/src/restoration-state-handler.js +204 -0
  82. package/dist/src/restoration-state-handler.js.map +1 -0
  83. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -1
  84. package/dist/src/sort-filter-bar/alpha-bar.js +9 -2
  85. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  86. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  87. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  88. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  89. package/dist/src/sort-filter-bar/img/list.js +1 -1
  90. package/dist/src/sort-filter-bar/img/list.js.map +1 -1
  91. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  92. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  93. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  94. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +71 -14
  95. package/dist/src/sort-filter-bar/sort-filter-bar.js +499 -216
  96. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  97. package/dist/src/tiles/collection-browser-loading-tile.d.ts +5 -0
  98. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  99. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  100. package/dist/src/tiles/grid/account-tile.d.ts +1 -1
  101. package/dist/src/tiles/grid/account-tile.js +5 -5
  102. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  103. package/dist/src/tiles/grid/collection-tile.js +1 -2
  104. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  105. package/dist/src/tiles/grid/icons/views.d.ts +1 -1
  106. package/dist/src/tiles/grid/icons/views.js +2 -2
  107. package/dist/src/tiles/grid/icons/views.js.map +1 -1
  108. package/dist/src/tiles/grid/item-tile.d.ts +2 -2
  109. package/dist/src/tiles/grid/item-tile.js +58 -150
  110. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  111. package/dist/src/tiles/item-image.d.ts +21 -0
  112. package/dist/src/tiles/item-image.js +215 -0
  113. package/dist/src/tiles/item-image.js.map +1 -0
  114. package/dist/src/tiles/list/account-label.d.ts +1 -0
  115. package/dist/src/tiles/list/account-label.js +7 -0
  116. package/dist/src/tiles/list/account-label.js.map +1 -0
  117. package/dist/src/tiles/list/date-label.d.ts +1 -0
  118. package/dist/src/tiles/list/date-label.js +13 -0
  119. package/dist/src/tiles/list/date-label.js.map +1 -0
  120. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  121. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  122. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  123. package/dist/src/tiles/list/tile-list-compact.d.ts +12 -0
  124. package/dist/src/tiles/list/tile-list-compact.js +203 -6
  125. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  126. package/dist/src/tiles/list/tile-list.d.ts +35 -10
  127. package/dist/src/tiles/list/tile-list.js +368 -104
  128. package/dist/src/tiles/list/tile-list.js.map +1 -1
  129. package/dist/src/tiles/loading-tile.js +1 -42
  130. package/dist/src/tiles/loading-tile.js.map +1 -1
  131. package/dist/src/tiles/mediatype-icon.d.ts +9 -0
  132. package/dist/src/tiles/mediatype-icon.js +78 -0
  133. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  134. package/dist/src/tiles/tile-dispatcher.d.ts +11 -4
  135. package/dist/src/tiles/tile-dispatcher.js +56 -19
  136. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  137. package/dist/src/utils/format-date.js +2 -2
  138. package/dist/src/utils/format-date.js.map +1 -1
  139. package/dist/src/waveform-thumbnail.d.ts +7 -0
  140. package/dist/src/waveform-thumbnail.js +106 -0
  141. package/dist/src/waveform-thumbnail.js.map +1 -0
  142. package/dist/{demo/icon-provider-icon.d.ts → src/waveform-view.d.ts} +0 -0
  143. package/dist/src/waveform-view.js +2 -0
  144. package/dist/src/waveform-view.js.map +1 -0
  145. package/dist/src/your-webcomponent.d.ts +8 -0
  146. package/dist/src/your-webcomponent.js +38 -0
  147. package/dist/src/your-webcomponent.js.map +1 -0
  148. package/dist/test/collection-browser.test.d.ts +1 -0
  149. package/dist/test/collection-browser.test.js +16 -2
  150. package/dist/test/collection-browser.test.js.map +1 -1
  151. package/dist/test/mediatype-config.test.d.ts +1 -0
  152. package/dist/test/mediatype-config.test.js +17 -0
  153. package/dist/test/mediatype-config.test.js.map +1 -0
  154. package/dist/{src/assets/img/icons/eye-hidden.d.ts → test/mediatype-icon.test.d.ts} +0 -0
  155. package/dist/test/mediatype-icon.test.js +3 -0
  156. package/dist/test/mediatype-icon.test.js.map +1 -0
  157. package/dist/test/mediatypeConfig.test.d.ts +1 -0
  158. package/dist/test/mediatypeConfig.test.js +17 -0
  159. package/dist/test/mediatypeConfig.test.js.map +1 -0
  160. package/dist/test/utils/format-date.test.js +1 -1
  161. package/dist/test/utils/format-date.test.js.map +1 -1
  162. package/dist/test/your-webcomponent.test.d.ts +1 -0
  163. package/dist/test/your-webcomponent.test.js +23 -0
  164. package/dist/test/your-webcomponent.test.js.map +1 -0
  165. package/index.ts +6 -0
  166. package/local.archive.org.cert +86 -0
  167. package/local.archive.org.key +27 -0
  168. package/package.json +9 -5
  169. package/src/assets/img/icons/chevron.ts +4 -0
  170. package/src/assets/img/icons/mediatype/account.ts +6 -4
  171. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  172. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  173. package/src/assets/img/icons/mediatype/data.ts +15 -0
  174. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  175. package/src/assets/img/icons/mediatype/film.ts +2 -1
  176. package/src/assets/img/icons/mediatype/images.ts +9 -6
  177. package/src/assets/img/icons/mediatype/radio.ts +15 -0
  178. package/src/assets/img/icons/mediatype/software.ts +9 -6
  179. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  180. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  181. package/src/assets/img/icons/mediatype/video.ts +10 -6
  182. package/src/assets/img/icons/mediatype/web.ts +9 -6
  183. package/src/collection-browser.ts +529 -163
  184. package/src/collection-facets.ts +307 -205
  185. package/src/language-code-handler/language-code-handler.ts +64 -0
  186. package/src/language-code-handler/language-code-mapping.ts +564 -0
  187. package/src/mediatype/mediatype-config.ts +86 -0
  188. package/src/models.ts +141 -13
  189. package/src/restoration-state-handler.ts +266 -0
  190. package/src/sort-filter-bar/alpha-bar.ts +9 -3
  191. package/src/sort-filter-bar/img/compact.ts +5 -0
  192. package/src/sort-filter-bar/img/list.ts +1 -1
  193. package/src/sort-filter-bar/img/tile.ts +5 -0
  194. package/src/sort-filter-bar/sort-filter-bar.ts +557 -225
  195. package/src/tiles/collection-browser-loading-tile.ts +29 -0
  196. package/src/tiles/grid/account-tile.ts +1 -1
  197. package/src/tiles/grid/collection-tile.ts +1 -2
  198. package/src/tiles/grid/icons/views.ts +2 -2
  199. package/src/tiles/grid/item-tile.ts +57 -162
  200. package/src/tiles/item-image.ts +218 -0
  201. package/src/tiles/list/account-label.ts +6 -0
  202. package/src/tiles/list/date-label.ts +12 -0
  203. package/src/tiles/list/tile-list-compact-header.ts +77 -0
  204. package/src/tiles/list/tile-list-compact.ts +218 -0
  205. package/src/tiles/list/tile-list.ts +412 -107
  206. package/src/tiles/mediatype-icon.ts +75 -0
  207. package/src/tiles/tile-dispatcher.ts +66 -18
  208. package/src/utils/format-date.ts +2 -2
  209. package/test/collection-browser.test.ts +20 -1
  210. package/test/mediatype-config.test.ts +18 -0
  211. package/test/utils/format-date.test.ts +1 -1
  212. package/web-dev-server.config.mjs +3 -1
  213. package/dist/demo/icon-provider/icon-provider-icon.d.ts +0 -10
  214. package/dist/demo/icon-provider/icon-provider-icon.js +0 -32
  215. package/dist/demo/icon-provider/icon-provider-icon.js.map +0 -1
  216. package/dist/demo/icon-provider/icon-provider.d.ts +0 -10
  217. package/dist/demo/icon-provider/icon-provider.js +0 -9
  218. package/dist/demo/icon-provider/icon-provider.js.map +0 -1
  219. package/dist/demo/icon-provider-icon.js +0 -2
  220. package/dist/demo/icon-provider-icon.js.map +0 -1
  221. package/dist/demo/icon-provider.d.ts +0 -10
  222. package/dist/demo/icon-provider.js +0 -12
  223. package/dist/demo/icon-provider.js.map +0 -1
  224. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  225. package/dist/src/assets/img/icons/audio.js +0 -9
  226. package/dist/src/assets/img/icons/audio.js.map +0 -1
  227. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  228. package/dist/src/assets/img/icons/collection.js +0 -9
  229. package/dist/src/assets/img/icons/collection.js.map +0 -1
  230. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  231. package/dist/src/assets/img/icons/etree.js +0 -9
  232. package/dist/src/assets/img/icons/etree.js.map +0 -1
  233. package/dist/src/assets/img/icons/eye-hidden.js +0 -2
  234. package/dist/src/assets/img/icons/eye-hidden.js.map +0 -1
  235. package/dist/src/assets/img/icons/images.d.ts +0 -1
  236. package/dist/src/assets/img/icons/images.js +0 -10
  237. package/dist/src/assets/img/icons/images.js.map +0 -1
  238. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  239. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  240. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  241. package/dist/src/assets/img/icons/software.d.ts +0 -1
  242. package/dist/src/assets/img/icons/software.js +0 -10
  243. package/dist/src/assets/img/icons/software.js.map +0 -1
  244. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  245. package/dist/src/assets/img/icons/texts.js +0 -10
  246. package/dist/src/assets/img/icons/texts.js.map +0 -1
  247. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  248. package/dist/src/assets/img/icons/tv.js +0 -9
  249. package/dist/src/assets/img/icons/tv.js.map +0 -1
  250. package/dist/src/assets/img/icons/video.d.ts +0 -1
  251. package/dist/src/assets/img/icons/video.js +0 -10
  252. package/dist/src/assets/img/icons/video.js.map +0 -1
  253. package/dist/src/assets/img/icons/web.d.ts +0 -1
  254. package/dist/src/assets/img/icons/web.js +0 -10
  255. package/dist/src/assets/img/icons/web.js.map +0 -1
  256. package/dist/src/search-handler.d.ts +0 -11
  257. package/dist/src/search-handler.js +0 -34
  258. package/dist/src/search-handler.js.map +0 -1
  259. package/src/mediatype-icon.ts +0 -83
  260. package/src/sort-filter-bar/img/grid.ts +0 -5
  261. package/src/tiles/loading-tile.ts +0 -70
@@ -1,174 +1,85 @@
1
- import { LitElement, html, css, nothing, PropertyValues } from 'lit';
2
- import { customElement, property, state } from 'lit/decorators.js';
3
- import { CollectionDisplayMode } from '../models';
1
+ import {
2
+ LitElement,
3
+ html,
4
+ css,
5
+ nothing,
6
+ PropertyValues,
7
+ TemplateResult,
8
+ } from 'lit';
9
+ import { customElement, property, query, state } from 'lit/decorators.js';
10
+ import {
11
+ SharedResizeObserverInterface,
12
+ SharedResizeObserverResizeHandlerInterface,
13
+ } from '@internetarchive/shared-resize-observer';
14
+ import {
15
+ CollectionDisplayMode,
16
+ SortField,
17
+ SortFieldDisplayName,
18
+ } from '../models';
4
19
  import './alpha-bar';
5
20
 
6
21
  import { sortIcon } from './img/sort-triangle';
7
- import { gridIcon } from './img/grid';
22
+ import { tileIcon } from './img/tile';
8
23
  import { listIcon } from './img/list';
24
+ import { compactIcon } from './img/compact';
9
25
 
10
- enum SortFieldName {
11
- publicdate = 'Date Archived',
12
- date = 'Date Published',
13
- reviewdate = 'Date Reviewed',
14
- addeddate = 'Date Added',
15
- }
16
-
17
- type SortField = 'relevance' | 'views' | 'title' | 'date' | 'creator';
26
+ type AlphaSelector = 'creator' | 'title';
18
27
 
19
28
  @customElement('sort-filter-bar')
20
- export class SortFilterBar extends LitElement {
21
- @property({ type: String }) displayMode: CollectionDisplayMode = 'grid';
29
+ export class SortFilterBar
30
+ extends LitElement
31
+ implements SharedResizeObserverResizeHandlerInterface
32
+ {
33
+ @property({ type: String }) displayMode?: CollectionDisplayMode;
34
+
35
+ @property({ type: String }) sortDirection: 'asc' | 'desc' | null = null;
22
36
 
23
- @property({ type: String }) sortDirection: 'asc' | 'desc' = 'asc';
37
+ @property({ type: String }) selectedSort: SortField = SortField.relevance;
24
38
 
25
- @property({ type: String }) sortField: string | null = null;
39
+ @property({ type: String }) selectedTitleFilter: string | null = null;
26
40
 
27
- @property({ type: String }) selectedSort: SortField = 'relevance';
41
+ @property({ type: String }) selectedCreatorFilter: string | null = null;
28
42
 
29
- @state() titleSelectorVisible: boolean = false;
43
+ @property({ type: Boolean }) showRelevance: boolean = true;
30
44
 
31
- @state() creatorSelectorVisible: boolean = false;
45
+ @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;
46
+
47
+ @state() alphaSelectorVisible: AlphaSelector | null = null;
32
48
 
33
49
  @state() dateSortSelectorVisible = false;
34
50
 
51
+ @state() desktopSelectorBarWidth = 0;
52
+
53
+ @state() selectorBarContainerWidth = 0;
54
+
55
+ @state() hoveringOverDateSortOptions = false;
56
+
57
+ @query('#desktop-sort-selector')
58
+ private desktopSortSelector!: HTMLUListElement;
59
+
60
+ @query('#sort-selector-container')
61
+ private sortSelectorContainer!: HTMLDivElement;
62
+
35
63
  render() {
36
64
  return html`
37
65
  <div id="container">
38
- ${this.titleSelectorVisible ? this.titleSelectorBar : nothing}
39
- ${this.creatorSelectorVisible ? this.creatorSelectorBar : nothing}
40
-
41
66
  <div id="sort-bar">
42
- <div id="sort-selector">
43
- <ul>
44
- <li>
45
- <div id="sort-direction-container">
46
- <button
47
- id="sort-ascending-btn"
48
- class="sort-button"
49
- @click=${() => {
50
- this.sortDirection = 'asc';
51
- }}
52
- >
53
- ${sortIcon}
54
- </button>
55
- <button
56
- id="sort-descending-btn"
57
- class="sort-button"
58
- @click=${() => {
59
- this.sortDirection = 'desc';
60
- }}
61
- >
62
- ${sortIcon}
63
- </button>
64
- </div>
65
- </li>
66
- <li id="sort-by-text">Sort By</li>
67
- <li>
68
- <a
69
- href="#"
70
- @click=${(e: Event) => {
71
- e.preventDefault();
72
- this.sortField = null;
73
- this.selectedSort = 'relevance';
74
- }}
75
- class=${this.selectedSort === 'relevance' ? 'selected' : ''}
76
- >
77
- Relevance
78
- </a>
79
- </li>
80
- <li>
81
- <a
82
- href="#"
83
- @click=${(e: Event) => {
84
- e.preventDefault();
85
- this.sortField = 'week';
86
- this.selectedSort = 'views';
87
- }}
88
- class=${this.selectedSort === 'views' ? 'selected' : ''}
89
- >
90
- Views
91
- </a>
92
- </li>
93
- <li>
94
- <a
95
- href="#"
96
- @click=${(e: Event) => {
97
- e.preventDefault();
98
- this.titleSelectorVisible = !this.titleSelectorVisible;
99
- this.sortField = 'titleSorter';
100
- this.selectedSort = 'title';
101
- }}
102
- class=${this.selectedSort === 'title' ? 'selected' : ''}
103
- >
104
- Title
105
- </a>
106
- </li>
107
- <li>
108
- <a
109
- href="#"
110
- @click=${(e: Event) => {
111
- e.preventDefault();
112
- this.dateSortSelectorVisible =
113
- !this.dateSortSelectorVisible;
114
- this.selectedSort = 'date';
115
- }}
116
- class=${this.selectedSort === 'date' ? 'selected' : ''}
117
- >
118
- ${this.dateSortField}
119
- </a>
120
- </li>
121
- <li>
122
- <a
123
- href="#"
124
- @click=${(e: Event) => {
125
- e.preventDefault();
126
- this.creatorSelectorVisible = !this.creatorSelectorVisible;
127
- this.sortField = 'creatorSorter';
128
- this.selectedSort = 'creator';
129
- }}
130
- class=${this.selectedSort === 'creator' ? 'selected' : ''}
131
- >
132
- Creator
133
- </a>
134
- </li>
135
- </ul>
67
+ <div id="sort-direction-container">
68
+ ${this.sortDirectionSelectorTemplate}
136
69
  </div>
137
70
 
138
- <div id="display-style">
139
- <ul>
140
- ${this.displayMode !== 'grid'
141
- ? html`<li>
142
- <label id="show-details">
143
- <input type="checkbox" @click=${this.detailSelected} />
144
- Show Details
145
- </label>
146
- </li>`
147
- : nothing}
148
-
149
- <li>
150
- <button
151
- id="grid-button"
152
- @click=${this.gridSelected}
153
- class=${this.displayMode === 'grid' ? 'active' : ''}
154
- >
155
- ${gridIcon}
156
- </button>
157
- </li>
158
- <li>
159
- <button
160
- id="list-button"
161
- @click=${this.listSelected}
162
- class=${this.displayMode !== 'grid' ? 'active' : ''}
163
- >
164
- ${listIcon}
165
- </button>
166
- </li>
167
- </ul>
71
+ <div id="sort-selector-container">
72
+ ${this.mobileSortSelectorTemplate}
73
+ ${this.desktopSortSelectorTemplate}
168
74
  </div>
75
+
76
+ <div id="display-style-selector">${this.displayOptionTemplate}</div>
169
77
  </div>
170
78
 
171
- ${this.dateSortSelectorVisible ? this.dateSortSelector : nothing}
79
+ ${this.dateSortSelectorVisible && !this.mobileSelectorVisible
80
+ ? this.dateSortSelector
81
+ : nothing}
82
+ ${this.alphaBarTemplate}
172
83
 
173
84
  <div id="bottom-shadow"></div>
174
85
  </div>
@@ -180,75 +91,400 @@ export class SortFilterBar extends LitElement {
180
91
  this.displayModeChanged();
181
92
  }
182
93
 
183
- if (changed.has('sortDirection') || changed.has('sortField')) {
184
- this.sortChanged();
94
+ if (changed.has('selectedSort') && this.sortDirection === null) {
95
+ this.sortDirection = 'desc';
96
+ }
97
+
98
+ if (changed.has('selectedTitleFilter') && this.selectedTitleFilter) {
99
+ this.alphaSelectorVisible = 'title';
100
+ }
101
+
102
+ if (changed.has('selectedCreatorFilter') && this.selectedCreatorFilter) {
103
+ this.alphaSelectorVisible = 'creator';
104
+ }
105
+
106
+ if (changed.has('dateSortSelectorVisible')) {
107
+ this.setupEscapeListeners();
185
108
  }
109
+
110
+ if (changed.has('resizeObserver')) {
111
+ const oldObserver = changed.get(
112
+ 'resizeObserver'
113
+ ) as SharedResizeObserverInterface;
114
+ if (oldObserver) this.disconnectResizeObserver(oldObserver);
115
+ this.setupResizeObserver();
116
+ }
117
+ }
118
+
119
+ private setupEscapeListeners() {
120
+ if (this.dateSortSelectorVisible) {
121
+ document.addEventListener(
122
+ 'keydown',
123
+ this.boundDateSelectorEscapeListener
124
+ );
125
+ } else {
126
+ document.removeEventListener(
127
+ 'keydown',
128
+ this.boundDateSelectorEscapeListener
129
+ );
130
+ }
131
+ }
132
+
133
+ private boundDateSelectorEscapeListener = (e: KeyboardEvent) => {
134
+ if (e.key === 'Escape') {
135
+ this.dateSortSelectorVisible = false;
136
+ }
137
+ };
138
+
139
+ disconnectedCallback(): void {
140
+ if (this.resizeObserver) {
141
+ this.disconnectResizeObserver(this.resizeObserver);
142
+ }
143
+ }
144
+
145
+ private disconnectResizeObserver(
146
+ resizeObserver: SharedResizeObserverInterface
147
+ ) {
148
+ resizeObserver.removeObserver({
149
+ target: this.sortSelectorContainer,
150
+ handler: this,
151
+ });
152
+
153
+ resizeObserver.removeObserver({
154
+ target: this.desktopSortSelector,
155
+ handler: this,
156
+ });
157
+ }
158
+
159
+ private setupResizeObserver() {
160
+ if (!this.resizeObserver) return;
161
+ this.resizeObserver.addObserver({
162
+ target: this.sortSelectorContainer,
163
+ handler: this,
164
+ });
165
+
166
+ this.resizeObserver.addObserver({
167
+ target: this.desktopSortSelector,
168
+ handler: this,
169
+ });
170
+ }
171
+
172
+ private get mobileSelectorVisible() {
173
+ return this.selectorBarContainerWidth - 10 < this.desktopSelectorBarWidth;
174
+ }
175
+
176
+ private get alphaBarTemplate(): TemplateResult | typeof nothing {
177
+ if (!['title', 'creator'].includes(this.selectedSort)) return nothing;
178
+
179
+ if (this.alphaSelectorVisible === null) {
180
+ if (this.selectedSort === 'creator') return this.creatorSelectorBar;
181
+ if (this.selectedSort === 'title') return this.titleSelectorBar;
182
+ } else {
183
+ return this.alphaSelectorVisible === 'creator'
184
+ ? this.creatorSelectorBar
185
+ : this.titleSelectorBar;
186
+ }
187
+
188
+ return nothing;
189
+ }
190
+
191
+ handleResize(entry: ResizeObserverEntry): void {
192
+ if (entry.target === this.desktopSortSelector) {
193
+ this.desktopSelectorBarWidth = entry.contentRect.width;
194
+ } else if (entry.target === this.sortSelectorContainer) {
195
+ this.selectorBarContainerWidth = entry.contentRect.width;
196
+ }
197
+ }
198
+
199
+ private get sortDirectionSelectorTemplate() {
200
+ return html`
201
+ <div id="sort-direction-selector">
202
+ <button
203
+ id="sort-ascending-btn"
204
+ class="sort-button ${this.sortDirection === 'asc' ? 'selected' : ''}"
205
+ ?disabled=${this.selectedSort === 'relevance'}
206
+ @click=${() => {
207
+ this.setSortDirections('asc');
208
+ }}
209
+ >
210
+ ${sortIcon}
211
+ </button>
212
+ <button
213
+ id="sort-descending-btn"
214
+ class="sort-button ${this.sortDirection === 'desc' ? 'selected' : ''}"
215
+ ?disabled=${this.selectedSort === 'relevance'}
216
+ @click=${() => {
217
+ this.setSortDirections('desc');
218
+ }}
219
+ >
220
+ ${sortIcon}
221
+ </button>
222
+ </div>
223
+ `;
224
+ }
225
+
226
+ private get desktopSortSelectorTemplate() {
227
+ return html`
228
+ <ul
229
+ id="desktop-sort-selector"
230
+ class=${this.mobileSelectorVisible ? 'hidden' : 'visible'}
231
+ >
232
+ <li id="sort-by-text">Sort By</li>
233
+ <li>
234
+ ${this.showRelevance
235
+ ? this.getSortDisplayOption(SortField.relevance)
236
+ : nothing}
237
+ </li>
238
+ <li>${this.getSortDisplayOption(SortField.views)}</li>
239
+ <li>
240
+ ${this.getSortDisplayOption(SortField.title, {
241
+ clickEvent: () => {
242
+ this.alphaSelectorVisible = 'title';
243
+ this.selectedCreatorFilter = null;
244
+ this.dateSortSelectorVisible = false;
245
+ this.setSelectedSort(SortField.title);
246
+ this.emitCreatorLetterChangedEvent();
247
+ },
248
+ })}
249
+ </li>
250
+ <li>
251
+ ${this.getSortDisplayOption(SortField.date, {
252
+ clickEvent: () => {
253
+ if (!this.dateOptionSelected)
254
+ this.setSelectedSort(SortField.date);
255
+ this.dateSortSelectorVisible = !this.dateSortSelectorVisible;
256
+ this.alphaSelectorVisible = null;
257
+ this.selectedTitleFilter = null;
258
+ this.selectedCreatorFilter = null;
259
+ this.emitTitleLetterChangedEvent();
260
+ this.emitCreatorLetterChangedEvent();
261
+ },
262
+ displayName: html`${this.dateSortField}`,
263
+ isSelected: () => this.dateOptionSelected,
264
+ })}
265
+ </li>
266
+ <li>
267
+ ${this.getSortDisplayOption(SortField.creator, {
268
+ clickEvent: () => {
269
+ this.alphaSelectorVisible = 'creator';
270
+ this.selectedTitleFilter = null;
271
+ this.dateSortSelectorVisible = false;
272
+ this.setSelectedSort(SortField.creator);
273
+ this.emitTitleLetterChangedEvent();
274
+ },
275
+ })}
276
+ </li>
277
+ </ul>
278
+ `;
279
+ }
280
+
281
+ /**
282
+ * This generates each of the sort option links.
283
+ *
284
+ * It manages the display value and the selected state of the option.
285
+ *
286
+ * @param sortField
287
+ * @param options {
288
+ * additionalClickEvent?: () => void; If this is provided, it will also be called when the option is clicked.
289
+ * displayName?: TemplateResult; The name to display for the option. Defaults to the sortField display name.
290
+ * isSelected?: () => boolean; A function that returns true if the option is selected. Defaults to the selectedSort === sortField.
291
+ * }
292
+ * @returns
293
+ */
294
+ private getSortDisplayOption(
295
+ sortField: SortField,
296
+ options?: {
297
+ clickEvent?: (e: Event) => void;
298
+ isSelected?: () => boolean;
299
+ displayName?: TemplateResult;
300
+ }
301
+ ): TemplateResult {
302
+ const isSelected =
303
+ options?.isSelected ?? (() => this.selectedSort === sortField);
304
+ const displayName = options?.displayName ?? SortFieldDisplayName[sortField];
305
+ return html`
306
+ <a
307
+ href="#"
308
+ @click=${(e: Event) => {
309
+ e.preventDefault();
310
+ if (options?.clickEvent) {
311
+ options.clickEvent(e);
312
+ } else {
313
+ this.alphaSelectorVisible = null;
314
+ this.dateSortSelectorVisible = false;
315
+ this.selectedTitleFilter = null;
316
+ this.selectedCreatorFilter = null;
317
+ this.setSelectedSort(sortField);
318
+ this.emitTitleLetterChangedEvent();
319
+ this.emitCreatorLetterChangedEvent();
320
+ }
321
+ }}
322
+ class=${isSelected() ? 'selected' : ''}
323
+ >
324
+ ${displayName}
325
+ </a>
326
+ `;
327
+ }
328
+
329
+ private get mobileSortSelectorTemplate() {
330
+ return html`
331
+ <select
332
+ id="mobile-sort-selector"
333
+ @change=${this.mobileSortChanged}
334
+ class=${this.mobileSelectorVisible ? 'visible' : 'hidden'}
335
+ >
336
+ ${Object.keys(SortField).map(
337
+ field => html`
338
+ <option value="${field}" ?selected=${this.selectedSort === field}>
339
+ ${SortFieldDisplayName[field as SortField]}
340
+ </option>
341
+ `
342
+ )}
343
+ </select>
344
+ `;
345
+ }
346
+
347
+ private mobileSortChanged(e: Event) {
348
+ const target = e.target as HTMLSelectElement;
349
+ this.setSelectedSort(target.value as SortField);
350
+ }
351
+
352
+ private get displayOptionTemplate() {
353
+ return html`
354
+ <ul>
355
+ <li>
356
+ <button
357
+ id="grid-button"
358
+ @click=${() => {
359
+ this.displayMode = 'grid';
360
+ }}
361
+ class=${this.displayMode === 'grid' ? 'active' : ''}
362
+ >
363
+ ${tileIcon}
364
+ </button>
365
+ </li>
366
+ <li>
367
+ <button
368
+ id="grid-button"
369
+ @click=${() => {
370
+ this.displayMode = 'list-detail';
371
+ }}
372
+ class=${this.displayMode === 'list-detail' ? 'active' : ''}
373
+ >
374
+ ${listIcon}
375
+ </button>
376
+ </li>
377
+ <li>
378
+ <button
379
+ id="list-button"
380
+ @click=${() => {
381
+ this.displayMode = 'list-compact';
382
+ }}
383
+ class=${this.displayMode === 'list-compact' ? 'active' : ''}
384
+ >
385
+ ${compactIcon}
386
+ </button>
387
+ </li>
388
+ </ul>
389
+ `;
186
390
  }
187
391
 
188
392
  private get dateSortSelector() {
189
393
  return html`
394
+ <div
395
+ id="date-sort-selector-backdrop"
396
+ @keyup=${() => {
397
+ this.dateSortSelectorVisible = false;
398
+ }}
399
+ @click=${() => {
400
+ this.dateSortSelectorVisible = false;
401
+ }}
402
+ ></div>
190
403
  <div id="date-sort-selector">
191
404
  <ul>
192
- <li>
193
- <button
194
- @click=${() => {
195
- this.sortField = 'publicdate';
196
- this.dateSortSelectorVisible = false;
197
- }}
198
- >
199
- Date Archived
200
- </button>
201
- </li>
202
- <li>
203
- <button
204
- @click=${() => {
205
- this.sortField = 'date';
206
- this.dateSortSelectorVisible = false;
207
- }}
208
- >
209
- Date Published
210
- </button>
211
- </li>
212
- <li>
213
- <button
214
- @click=${() => {
215
- this.sortField = 'reviewdate';
216
- this.dateSortSelectorVisible = false;
217
- }}
218
- >
219
- Date Reviewed
220
- </button>
221
- </li>
222
- <li>
223
- <button
224
- @click=${() => {
225
- this.sortField = 'addeddate';
226
- this.dateSortSelectorVisible = false;
227
- }}
228
- >
229
- Date Added
230
- </button>
231
- </li>
405
+ <li>${this.getDateSortButton(SortField.datearchived)}</li>
406
+ <li>${this.getDateSortButton(SortField.date)}</li>
407
+ <li>${this.getDateSortButton(SortField.datereviewed)}</li>
408
+ <li>${this.getDateSortButton(SortField.dateadded)}</li>
232
409
  </ul>
233
410
  </div>
234
411
  `;
235
412
  }
236
413
 
414
+ private getDateSortButton(sortField: SortField) {
415
+ return html`
416
+ <button
417
+ @click=${() => {
418
+ this.selectDateSort(sortField);
419
+ }}
420
+ class=${this.selectedSort === sortField ? 'selected' : ''}
421
+ >
422
+ ${SortFieldDisplayName[sortField]}
423
+ </button>
424
+ `;
425
+ }
426
+
427
+ private selectDateSort(sortField: SortField) {
428
+ this.dateSortSelectorVisible = false;
429
+ this.setSelectedSort(sortField);
430
+ }
431
+
432
+ private setSortDirections(sortDirection: 'asc' | 'desc') {
433
+ this.sortDirection = sortDirection;
434
+ this.emitSortChangedEvent();
435
+ }
436
+
437
+ private setSelectedSort(sort: SortField) {
438
+ this.selectedSort = sort;
439
+ this.emitSortChangedEvent();
440
+ }
441
+
442
+ /**
443
+ * There are four date sort options.
444
+ *
445
+ * This checks to see if the current sort is one of them.
446
+ *
447
+ * @readonly
448
+ * @private
449
+ * @type {boolean}
450
+ * @memberof SortFilterBar
451
+ */
452
+ private get dateOptionSelected(): boolean {
453
+ const dateSortFields: SortField[] = [
454
+ SortField.datearchived,
455
+ SortField.date,
456
+ SortField.datereviewed,
457
+ SortField.dateadded,
458
+ ];
459
+ return dateSortFields.includes(this.selectedSort);
460
+ }
461
+
462
+ /**
463
+ * The display name of the current date field
464
+ *
465
+ * @readonly
466
+ * @private
467
+ * @type {string}
468
+ * @memberof SortFilterBar
469
+ */
237
470
  private get dateSortField(): string {
238
- return (
239
- SortFieldName[this.sortField as keyof typeof SortFieldName] ??
240
- 'Date Archived'
241
- );
471
+ const defaultSort = SortFieldDisplayName[SortField.date];
472
+ const name = this.dateOptionSelected
473
+ ? SortFieldDisplayName[this.selectedSort] ?? defaultSort
474
+ : defaultSort;
475
+ return name;
242
476
  }
243
477
 
244
478
  private get titleSelectorBar() {
245
479
  return html` <alpha-bar
480
+ .selectedLetter=${this.selectedTitleFilter}
246
481
  @letterChanged=${this.titleLetterChanged}
247
482
  ></alpha-bar>`;
248
483
  }
249
484
 
250
485
  private get creatorSelectorBar() {
251
486
  return html` <alpha-bar
487
+ .selectedLetter=${this.selectedCreatorFilter}
252
488
  @letterChanged=${this.creatorLetterChanged}
253
489
  ></alpha-bar>`;
254
490
  }
@@ -256,33 +492,35 @@ export class SortFilterBar extends LitElement {
256
492
  private titleLetterChanged(
257
493
  e: CustomEvent<{ selectedLetter: string | undefined }>
258
494
  ) {
259
- const event = new CustomEvent('titleLetterChanged', {
260
- detail: { selectedLetter: e.detail.selectedLetter },
261
- });
262
- this.dispatchEvent(event);
495
+ this.selectedTitleFilter = e.detail.selectedLetter ?? null;
496
+ this.emitTitleLetterChangedEvent();
263
497
  }
264
498
 
265
499
  private creatorLetterChanged(
266
500
  e: CustomEvent<{ selectedLetter: string | undefined }>
267
501
  ) {
268
- const event = new CustomEvent('creatorLetterChanged', {
269
- detail: { selectedLetter: e.detail.selectedLetter },
270
- });
271
- this.dispatchEvent(event);
502
+ this.selectedCreatorFilter = e.detail.selectedLetter ?? null;
503
+ this.emitCreatorLetterChangedEvent();
272
504
  }
273
505
 
274
- private gridSelected() {
275
- this.displayMode = 'grid';
276
- }
277
-
278
- private listSelected() {
279
- this.displayMode = 'list-compact';
506
+ private emitTitleLetterChangedEvent() {
507
+ const event = new CustomEvent<{ selectedLetter: string | null }>(
508
+ 'titleLetterChanged',
509
+ {
510
+ detail: { selectedLetter: this.selectedTitleFilter },
511
+ }
512
+ );
513
+ this.dispatchEvent(event);
280
514
  }
281
515
 
282
- private detailSelected(e: Event) {
283
- this.displayMode = (e.target as HTMLInputElement).checked
284
- ? 'list-detail'
285
- : 'list-compact';
516
+ private emitCreatorLetterChangedEvent() {
517
+ const event = new CustomEvent<{ selectedLetter: string | null }>(
518
+ 'creatorLetterChanged',
519
+ {
520
+ detail: { selectedLetter: this.selectedCreatorFilter },
521
+ }
522
+ );
523
+ this.dispatchEvent(event);
286
524
  }
287
525
 
288
526
  private displayModeChanged() {
@@ -292,10 +530,13 @@ export class SortFilterBar extends LitElement {
292
530
  this.dispatchEvent(event);
293
531
  }
294
532
 
295
- private sortChanged() {
296
- const event = new CustomEvent('sortChanged', {
533
+ private emitSortChangedEvent() {
534
+ const event = new CustomEvent<{
535
+ selectedSort: SortField;
536
+ sortDirection: 'asc' | 'desc' | null;
537
+ }>('sortChanged', {
297
538
  detail: {
298
- sortField: this.sortField,
539
+ selectedSort: this.selectedSort,
299
540
  sortDirection: this.sortDirection,
300
541
  },
301
542
  });
@@ -304,7 +545,7 @@ export class SortFilterBar extends LitElement {
304
545
 
305
546
  static styles = css`
306
547
  #container {
307
- margin: 0 1rem 2.5rem 1rem;
548
+ position: relative;
308
549
  }
309
550
 
310
551
  #sort-bar {
@@ -315,6 +556,10 @@ export class SortFilterBar extends LitElement {
315
556
  padding: 0.5rem 1.5rem;
316
557
  }
317
558
 
559
+ #sort-direction-container {
560
+ flex: 0;
561
+ }
562
+
318
563
  #sort-by-text {
319
564
  text-transform: uppercase;
320
565
  }
@@ -347,53 +592,140 @@ export class SortFilterBar extends LitElement {
347
592
  outline: inherit;
348
593
  width: 12px;
349
594
  height: 12px;
595
+ opacity: 0.5;
596
+ }
597
+
598
+ .sort-button.selected {
599
+ opacity: 1;
600
+ }
601
+
602
+ .sort-button:disabled {
603
+ opacity: 0.25;
604
+ cursor: default;
605
+ }
606
+
607
+ #date-sort-selector {
608
+ position: absolute;
609
+ left: 150px;
610
+ top: 45px;
611
+
612
+ z-index: 1;
613
+ padding: 1rem;
614
+ background-color: white;
615
+ border-radius: 2.5rem;
616
+ border: 1px solid #404142;
617
+ }
618
+
619
+ #date-sort-selector button {
620
+ background: none;
621
+ border-radius: 15px;
622
+ color: #404142;
623
+ border: none;
624
+ appearance: none;
625
+ cursor: pointer;
626
+ -webkit-appearance: none;
627
+ font-size: 1.4rem;
628
+ font-weight: 400;
629
+ padding: 0.5rem 1.2rem;
630
+ }
631
+
632
+ #date-sort-selector button.selected {
633
+ background-color: #404142;
634
+ color: white;
350
635
  }
351
636
 
352
637
  #show-details {
353
638
  text-transform: uppercase;
354
639
  cursor: pointer;
640
+ display: flex;
641
+ }
642
+
643
+ #show-details input {
644
+ margin-right: 0.5rem;
645
+ flex: 0 0 12px;
355
646
  }
356
647
 
357
648
  #sort-descending-btn {
358
649
  transform: rotate(180deg);
359
650
  }
360
651
 
361
- #sort-direction-container {
652
+ #sort-direction-selector {
362
653
  display: flex;
363
654
  flex-direction: column;
655
+ gap: 3px;
656
+ margin-right: 1rem;
657
+ }
658
+
659
+ #sort-selector-container {
660
+ flex: 1;
661
+ }
662
+
663
+ /*
664
+ we move the desktop sort selector offscreen instead of display: none
665
+ because we need to observe the width of it vs its container to determine
666
+ if it's wide enough to display the desktop version and if you displY: none,
667
+ the width becomes 0
668
+ */
669
+ #desktop-sort-selector.hidden {
670
+ position: absolute;
671
+ top: -9999px;
672
+ left: -9999px;
673
+ }
674
+
675
+ #mobile-sort-selector.hidden {
676
+ display: none;
677
+ }
678
+
679
+ #date-sort-selector-backdrop {
680
+ position: fixed;
681
+ top: 0;
682
+ left: 0;
683
+ width: 100%;
684
+ height: 100%;
685
+ z-index: 1;
686
+ background-color: rgba(255, 255, 255, 0.5);
364
687
  }
365
688
 
366
- #sort-selector li {
689
+ #desktop-sort-selector {
690
+ display: inline-flex;
691
+ }
692
+
693
+ #desktop-sort-selector li {
367
694
  display: flex;
368
695
  align-items: center;
369
696
  }
370
697
 
371
- #sort-selector li a {
698
+ #desktop-sort-selector li a {
372
699
  text-decoration: none;
373
700
  text-transform: uppercase;
374
701
  font-size: 1.4rem;
375
702
  color: #333;
703
+ line-height: 2.5;
376
704
  }
377
705
 
378
- #sort-selector li a.selected {
706
+ #desktop-sort-selector li a.selected {
379
707
  font-weight: bold;
380
708
  }
381
709
 
382
- #sort-selector li::after {
710
+ #desktop-sort-selector li::after {
383
711
  content: '•';
384
712
  padding-left: 1rem;
385
713
  padding-right: 1rem;
386
714
  }
387
715
 
388
- #sort-selector li:first-child::after {
716
+ #desktop-sort-selector li:first-child::after {
389
717
  content: '';
390
718
  }
391
719
 
392
- #sort-selector li:last-child::after {
720
+ #desktop-sort-selector li:last-child::after {
393
721
  content: '';
394
722
  }
395
723
 
396
- #display-style button {
724
+ #display-style-selector {
725
+ flex: 0;
726
+ }
727
+
728
+ #display-style-selector button {
397
729
  background: none;
398
730
  color: inherit;
399
731
  border: none;
@@ -403,11 +735,11 @@ export class SortFilterBar extends LitElement {
403
735
  opacity: 0.5;
404
736
  }
405
737
 
406
- #display-style button.active {
738
+ #display-style-selector button.active {
407
739
  opacity: 1;
408
740
  }
409
741
 
410
- #display-style button svg {
742
+ #display-style-selector button svg {
411
743
  width: 24px;
412
744
  height: 24px;
413
745
  }