@internetarchive/collection-browser 1.14.9-alpha1 → 1.14.9-alpha10

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