@internetarchive/collection-browser 4.2.1-alpha-webdev8165.0 → 4.3.1-alpha-webdev8165.0

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 (50) hide show
  1. package/dist/src/app-root.d.ts +3 -0
  2. package/dist/src/app-root.js +695 -614
  3. package/dist/src/app-root.js.map +1 -1
  4. package/dist/src/collection-browser.d.ts +0 -4
  5. package/dist/src/collection-browser.js +761 -779
  6. package/dist/src/collection-browser.js.map +1 -1
  7. package/dist/src/data-source/collection-browser-data-source.d.ts +7 -0
  8. package/dist/src/data-source/collection-browser-data-source.js +24 -8
  9. package/dist/src/data-source/collection-browser-data-source.js.map +1 -1
  10. package/dist/src/manage/manage-bar.d.ts +7 -2
  11. package/dist/src/manage/manage-bar.js +102 -80
  12. package/dist/src/manage/manage-bar.js.map +1 -1
  13. package/dist/src/models.js.map +1 -1
  14. package/dist/src/restoration-state-handler.js.map +1 -1
  15. package/dist/src/tiles/list/tile-list-compact-header.js +45 -45
  16. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -1
  17. package/dist/src/tiles/list/tile-list-compact.js +99 -99
  18. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  19. package/dist/src/tiles/list/tile-list.js +300 -299
  20. package/dist/src/tiles/list/tile-list.js.map +1 -1
  21. package/dist/src/tiles/tile-display-value-provider.d.ts +5 -0
  22. package/dist/src/tiles/tile-display-value-provider.js +9 -0
  23. package/dist/src/tiles/tile-display-value-provider.js.map +1 -1
  24. package/dist/test/data-source/collection-browser-data-source.test.js +54 -2
  25. package/dist/test/data-source/collection-browser-data-source.test.js.map +1 -1
  26. package/dist/test/manage/manage-bar.test.d.ts +1 -0
  27. package/dist/test/manage/manage-bar.test.js +129 -7
  28. package/dist/test/manage/manage-bar.test.js.map +1 -1
  29. package/dist/test/restoration-state-handler.test.js.map +1 -1
  30. package/dist/test/tiles/list/tile-list-compact-header.test.d.ts +1 -0
  31. package/dist/test/tiles/list/tile-list-compact-header.test.js +36 -0
  32. package/dist/test/tiles/list/tile-list-compact-header.test.js.map +1 -0
  33. package/dist/test/tiles/list/tile-list.test.js +147 -127
  34. package/dist/test/tiles/list/tile-list.test.js.map +1 -1
  35. package/package.json +1 -1
  36. package/src/app-root.ts +1251 -1166
  37. package/src/collection-browser.ts +3049 -3077
  38. package/src/data-source/collection-browser-data-source.ts +1465 -1445
  39. package/src/manage/manage-bar.ts +276 -247
  40. package/src/models.ts +879 -879
  41. package/src/restoration-state-handler.ts +546 -546
  42. package/src/tiles/list/tile-list-compact-header.ts +86 -86
  43. package/src/tiles/list/tile-list-compact.ts +239 -239
  44. package/src/tiles/list/tile-list.ts +700 -700
  45. package/src/tiles/tile-display-value-provider.ts +134 -124
  46. package/test/data-source/collection-browser-data-source.test.ts +193 -131
  47. package/test/manage/manage-bar.test.ts +347 -157
  48. package/test/restoration-state-handler.test.ts +569 -569
  49. package/test/tiles/list/tile-list-compact-header.test.ts +43 -0
  50. package/test/tiles/list/tile-list.test.ts +576 -552
@@ -406,32 +406,32 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
406
406
  }
407
407
  }
408
408
  render() {
409
- return html `
409
+ return html `
410
410
  ${this.showSmartFacetBar && this.placeholderType === null
411
- ? html `<smart-facet-bar
412
- .query=${this.baseQuery}
413
- .aggregations=${this.dataSource.aggregations}
414
- .selectedFacets=${this.selectedFacets}
415
- .collectionTitles=${this.dataSource.collectionTitles}
416
- .filterToggleShown=${!this.mobileView}
417
- .filterToggleActive=${this.facetPaneVisible}
418
- .label=${this.smartFacetBarLabel}
419
- @facetsChanged=${this.facetsChanged}
411
+ ? html `<smart-facet-bar
412
+ .query=${this.baseQuery}
413
+ .aggregations=${this.dataSource.aggregations}
414
+ .selectedFacets=${this.selectedFacets}
415
+ .collectionTitles=${this.dataSource.collectionTitles}
416
+ .filterToggleShown=${!this.mobileView}
417
+ .filterToggleActive=${this.facetPaneVisible}
418
+ .label=${this.smartFacetBarLabel}
419
+ @facetsChanged=${this.facetsChanged}
420
420
  @filtersToggled=${() => {
421
421
  this.facetPaneVisible = !this.facetPaneVisible;
422
422
  this.emitFacetPaneVisibilityChanged();
423
- }}
423
+ }}
424
424
  ></smart-facet-bar>`
425
- : nothing}
426
-
427
- <div
428
- id="content-container"
429
- class=${this.mobileView ? 'mobile' : 'desktop'}
430
- >
425
+ : nothing}
426
+
427
+ <div
428
+ id="content-container"
429
+ class=${this.mobileView ? 'mobile' : 'desktop'}
430
+ >
431
431
  ${this.placeholderType
432
432
  ? this.emptyPlaceholderTemplate
433
- : this.collectionBrowserTemplate}
434
- </div>
433
+ : this.collectionBrowserTemplate}
434
+ </div>
435
435
  `;
436
436
  }
437
437
  /**
@@ -475,23 +475,23 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
475
475
  * Template for the placeholder content to show when no results are available.
476
476
  */
477
477
  get emptyPlaceholderTemplate() {
478
- return html `
479
- <empty-placeholder
480
- .placeholderType=${this.placeholderType}
481
- ?isMobileView=${this.mobileView}
482
- ?isCollection=${!!this.withinCollection}
483
- .detailMessage=${this.dataSource.queryErrorMessage ?? ''}
484
- .baseNavigationUrl=${this.baseNavigationUrl}
485
- ></empty-placeholder>
478
+ return html `
479
+ <empty-placeholder
480
+ .placeholderType=${this.placeholderType}
481
+ ?isMobileView=${this.mobileView}
482
+ ?isCollection=${!!this.withinCollection}
483
+ .detailMessage=${this.dataSource.queryErrorMessage ?? ''}
484
+ .baseNavigationUrl=${this.baseNavigationUrl}
485
+ ></empty-placeholder>
486
486
  `;
487
487
  }
488
488
  /**
489
489
  * Top-level template for rendering the left (facets) and right (results) columns.
490
490
  */
491
491
  get collectionBrowserTemplate() {
492
- return html `
493
- <div id="left-column-scroll-sentinel"></div>
494
- ${this.leftColumnTemplate} ${this.rightColumnTemplate}
492
+ return html `
493
+ <div id="left-column-scroll-sentinel"></div>
494
+ ${this.leftColumnTemplate} ${this.rightColumnTemplate}
495
495
  `;
496
496
  }
497
497
  /**
@@ -510,33 +510,33 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
510
510
  * accordion-style facets.
511
511
  */
512
512
  get mobileLeftColumnTemplate() {
513
- return html `
514
- <div
515
- id="left-column"
516
- class="column${this.isResizeToMobile ? ' preload' : ''}"
517
- >
518
- ${this.facetTopViewSlot} ${this.resultsCountTemplate}
519
- <div id="facets-header-container">${this.mobileFacetsTemplate}</div>
520
- </div>
513
+ return html `
514
+ <div
515
+ id="left-column"
516
+ class="column${this.isResizeToMobile ? ' preload' : ''}"
517
+ >
518
+ ${this.facetTopViewSlot} ${this.resultsCountTemplate}
519
+ <div id="facets-header-container">${this.mobileFacetsTemplate}</div>
520
+ </div>
521
521
  `;
522
522
  }
523
523
  /**
524
524
  * Template for the desktop version of the left column, displaying the facets sidebar.
525
525
  */
526
526
  get desktopLeftColumnTemplate() {
527
- return html `
528
- <div id="left-column" class="column" ?hidden=${!this.facetPaneVisible}>
529
- ${this.facetTopViewSlot}
530
- <div id="facets-header-container">
531
- <h2 id="facets-header" class="sr-only">${msg('Filters')}</h2>
532
- ${this.resultsCountTemplate} ${this.clearFiltersBtnTemplate(false)}
533
- </div>
534
- <div id="facets-container" aria-labelledby="facets-header">
535
- ${this.facetsTemplate}
536
- <div id="facets-scroll-sentinel"></div>
537
- </div>
538
- <div id="facets-bottom-fade"></div>
539
- </div>
527
+ return html `
528
+ <div id="left-column" class="column" ?hidden=${!this.facetPaneVisible}>
529
+ ${this.facetTopViewSlot}
530
+ <div id="facets-header-container">
531
+ <h2 id="facets-header" class="sr-only">${msg('Filters')}</h2>
532
+ ${this.resultsCountTemplate} ${this.clearFiltersBtnTemplate(false)}
533
+ </div>
534
+ <div id="facets-container" aria-labelledby="facets-header">
535
+ ${this.facetsTemplate}
536
+ <div id="facets-scroll-sentinel"></div>
537
+ </div>
538
+ <div id="facets-bottom-fade"></div>
539
+ </div>
540
540
  `;
541
541
  }
542
542
  /**
@@ -544,8 +544,8 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
544
544
  * - mainly used to render userlists
545
545
  */
546
546
  get facetTopViewSlot() {
547
- return html `<div id="facet-top-view">
548
- <slot name="facet-top-slot"></slot>
547
+ return html `<div id="facet-top-view">
548
+ <slot name="facet-top-slot"></slot>
549
549
  </div>`;
550
550
  }
551
551
  /**
@@ -560,15 +560,15 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
560
560
  const resultsCount = this.totalResults?.toLocaleString();
561
561
  const resultsLabel = this.totalResults === 1 ? 'Result' : 'Results';
562
562
  // Added data-testid for Playwright testing
563
- return html `
564
- <div id="results-total" class=${classes} data-testid="results-total">
565
- <span id="big-results-count">
566
- ${shouldShowSearching ? html `Searching&hellip;` : resultsCount}
567
- </span>
568
- <span id="big-results-label">
569
- ${shouldShowSearching ? nothing : resultsLabel}
570
- </span>
571
- </div>
563
+ return html `
564
+ <div id="results-total" class=${classes} data-testid="results-total">
565
+ <span id="big-results-count">
566
+ ${shouldShowSearching ? html `Searching&hellip;` : resultsCount}
567
+ </span>
568
+ <span id="big-results-label">
569
+ ${shouldShowSearching ? nothing : resultsLabel}
570
+ </span>
571
+ </div>
572
572
  `;
573
573
  }
574
574
  /**
@@ -581,45 +581,45 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
581
581
  'full-width': !this.facetPaneVisible,
582
582
  'smart-results-spacing': !!this.showSmartResults,
583
583
  });
584
- return html `
585
- <div id="right-column" class=${rightColumnClasses}>
584
+ return html `
585
+ <div id="right-column" class=${rightColumnClasses}>
586
586
  ${this.showSmartResults
587
587
  ? html `<slot name="smart-results"></slot>`
588
- : nothing}
589
- <section id="results">
590
- <h2 class="results-section-heading">
591
- <slot name="results-heading"></slot>
592
- </h2>
593
- <div id="cb-top-view">
594
- <slot name="cb-top-slot"></slot>
595
- </div>
588
+ : nothing}
589
+ <section id="results">
590
+ <h2 class="results-section-heading">
591
+ <slot name="results-heading"></slot>
592
+ </h2>
593
+ <div id="cb-top-view">
594
+ <slot name="cb-top-slot"></slot>
595
+ </div>
596
596
  ${this.isManageView
597
597
  ? this.manageBarTemplate
598
- : this.sortFilterBarTemplate}
599
- <slot name="cb-results"></slot>
598
+ : this.sortFilterBarTemplate}
599
+ <slot name="cb-results"></slot>
600
600
  ${this.displayMode === `list-compact` && this.totalResults
601
601
  ? this.listHeaderTemplate
602
- : nothing}
603
- ${this.suppressResultTiles ? nothing : this.infiniteScrollerTemplate}
604
- </section>
605
- </div>
602
+ : nothing}
603
+ ${this.suppressResultTiles ? nothing : this.infiniteScrollerTemplate}
604
+ </section>
605
+ </div>
606
606
  `;
607
607
  }
608
608
  /**
609
609
  * Template for the infinite scroller widget that contains the result tiles.
610
610
  */
611
611
  get infiniteScrollerTemplate() {
612
- return html `<infinite-scroller
613
- class=${this.infiniteScrollerClasses}
614
- itemCount=${this.placeholderType ? 0 : nothing}
615
- ariaLandmarkLabel="Search results"
616
- .cellProvider=${this}
617
- .placeholderCellTemplate=${this.placeholderCellTemplate}
618
- @scrollThresholdReached=${this.scrollThresholdReached}
619
- @visibleCellsChanged=${this.visibleCellsChanged}
612
+ return html `<infinite-scroller
613
+ class=${this.infiniteScrollerClasses}
614
+ itemCount=${this.placeholderType ? 0 : nothing}
615
+ ariaLandmarkLabel="Search results"
616
+ .cellProvider=${this}
617
+ .placeholderCellTemplate=${this.placeholderCellTemplate}
618
+ @scrollThresholdReached=${this.scrollThresholdReached}
619
+ @visibleCellsChanged=${this.visibleCellsChanged}
620
620
  >${this.displayMode === 'grid'
621
621
  ? html `<slot name="result-last-tile" slot="result-last-tile"></slot>`
622
- : nothing}
622
+ : nothing}
623
623
  </infinite-scroller>`;
624
624
  }
625
625
  /**
@@ -653,29 +653,29 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
653
653
  }
654
654
  // We only show relevance sort if a search query is currently defined
655
655
  sortFieldAvailability.relevance = this.isRelevanceSortAvailable;
656
- return html `
657
- <sort-filter-bar
658
- .defaultSortField=${this.defaultSortField}
659
- .defaultSortDirection=${this.defaultSortDirection}
660
- .selectedSort=${this.selectedSort}
661
- .sortDirection=${this.sortDirection}
662
- .sortFieldAvailability=${sortFieldAvailability}
663
- .displayMode=${this.displayMode}
664
- .selectedTitleFilter=${this.selectedTitleFilter}
665
- .selectedCreatorFilter=${this.selectedCreatorFilter}
666
- .prefixFilterCountMap=${this.dataSource.prefixFilterCountMap}
667
- .enableSortOptionsSlot=${this.enableSortOptionsSlot}
668
- .suppressDisplayModes=${this.suppressDisplayModes}
669
- @sortChanged=${this.userChangedSort}
670
- @displayModeChanged=${this.displayModeChanged}
671
- @titleLetterChanged=${this.titleLetterSelected}
672
- @creatorLetterChanged=${this.creatorLetterSelected}
673
- >
674
- ${this.tileBlurCheckboxTemplate}
675
- <slot name="sort-options-left" slot="sort-options-left"></slot>
676
- <slot name="sort-options" slot="sort-options"></slot>
677
- <slot name="sort-options-right" slot="sort-options-right"></slot>
678
- </sort-filter-bar>
656
+ return html `
657
+ <sort-filter-bar
658
+ .defaultSortField=${this.defaultSortField}
659
+ .defaultSortDirection=${this.defaultSortDirection}
660
+ .selectedSort=${this.selectedSort}
661
+ .sortDirection=${this.sortDirection}
662
+ .sortFieldAvailability=${sortFieldAvailability}
663
+ .displayMode=${this.displayMode}
664
+ .selectedTitleFilter=${this.selectedTitleFilter}
665
+ .selectedCreatorFilter=${this.selectedCreatorFilter}
666
+ .prefixFilterCountMap=${this.dataSource.prefixFilterCountMap}
667
+ .enableSortOptionsSlot=${this.enableSortOptionsSlot}
668
+ .suppressDisplayModes=${this.suppressDisplayModes}
669
+ @sortChanged=${this.userChangedSort}
670
+ @displayModeChanged=${this.displayModeChanged}
671
+ @titleLetterChanged=${this.titleLetterSelected}
672
+ @creatorLetterChanged=${this.creatorLetterSelected}
673
+ >
674
+ ${this.tileBlurCheckboxTemplate}
675
+ <slot name="sort-options-left" slot="sort-options-left"></slot>
676
+ <slot name="sort-options" slot="sort-options"></slot>
677
+ <slot name="sort-options-right" slot="sort-options-right"></slot>
678
+ </sort-filter-bar>
679
679
  `;
680
680
  }
681
681
  /**
@@ -686,66 +686,48 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
686
686
  // Only show the checkbox for @archive.org users
687
687
  if (!this.dataSource.sessionContext?.is_archive_user)
688
688
  return nothing;
689
- return html `
690
- <label
691
- id="tile-blur-label"
692
- for="tile-blur-check"
693
- slot="sort-options-right"
694
- >
695
- ${msg('Blurring')}
696
- <input
697
- id="tile-blur-check"
698
- type="checkbox"
699
- ?checked=${!this.shouldSuppressTileBlurring}
700
- @change=${this.tileBlurCheckboxChanged}
701
- />
702
- </label>
689
+ return html `
690
+ <label
691
+ id="tile-blur-label"
692
+ for="tile-blur-check"
693
+ slot="sort-options-right"
694
+ >
695
+ ${msg('Blurring')}
696
+ <input
697
+ id="tile-blur-check"
698
+ type="checkbox"
699
+ ?checked=${!this.shouldSuppressTileBlurring}
700
+ @change=${this.tileBlurCheckboxChanged}
701
+ />
702
+ </label>
703
703
  `;
704
704
  }
705
- /**
706
- * Message to show in the manage view modal, depending on context.
707
- */
708
- get manageViewModalMsg() {
709
- const pluralize = this.dataSource.checkedTileModels.length > 1;
710
- switch (this.profileElement) {
711
- case 'uploads':
712
- return pluralize
713
- ? msg('Note: It may take a few minutes for these items to stop appearing in your uploads list.')
714
- : msg('Note: It may take a few minutes for this item to stop appearing in your uploads list.');
715
- case 'web_archives':
716
- return pluralize
717
- ? msg('Note: It may take a few minutes for these items to stop appearing in your web archives list.')
718
- : msg('Note: It may take a few minutes for this item to stop appearing in your web archives list.');
719
- default:
720
- return '';
721
- }
722
- }
723
705
  /**
724
706
  * Template for the manage bar UI that appears atop the search results when we are
725
707
  * showing the management view. This generally replaces the sort bar when present.
726
708
  */
727
709
  get manageBarTemplate() {
728
- return html `
729
- <manage-bar
730
- .label=${this.manageViewLabel}
731
- .modalManager=${this.modalManager}
732
- .selectedItems=${this.dataSource.checkedTileModels}
733
- .manageViewModalMsg=${this.manageViewModalMsg}
734
- showSelectAll
735
- showUnselectAll
736
- ?showItemManageButton=${this.pageContext === 'search'}
737
- ?removeAllowed=${this.dataSource.checkedTileModels.length !== 0}
738
- @removeItems=${this.handleRemoveItems}
739
- @manageItems=${this.handleManageItems}
740
- @selectAll=${() => this.dataSource.checkAllTiles()}
741
- @unselectAll=${() => this.dataSource.uncheckAllTiles()}
710
+ return html `
711
+ <manage-bar
712
+ .label=${this.manageViewLabel}
713
+ .modalManager=${this.modalManager}
714
+ .selectedItems=${this.dataSource.checkedTileModels}
715
+ .profileElement=${this.profileElement}
716
+ showSelectAll
717
+ showUnselectAll
718
+ ?showItemManageButton=${this.pageContext === 'search'}
719
+ ?removeAllowed=${this.dataSource.checkedTileModels.length !== 0}
720
+ @removeItems=${this.handleRemoveItems}
721
+ @manageItems=${this.handleManageItems}
722
+ @selectAll=${() => this.dataSource.checkAllTiles()}
723
+ @unselectAll=${() => this.dataSource.uncheckAllTiles()}
742
724
  @cancel=${() => {
743
725
  this.isManageView = false;
744
726
  this.dataSource.uncheckAllTiles();
745
727
  if (this.searchResultsLoading)
746
728
  this.dataSource.resetPages();
747
- }}
748
- ></manage-bar>
729
+ }}
730
+ ></manage-bar>
749
731
  `;
750
732
  }
751
733
  /**
@@ -980,15 +962,15 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
980
962
  label: target.open ? 'open' : 'closed',
981
963
  });
982
964
  };
983
- return html `
984
- <details id="mobile-filter-collapse" @toggle=${toggleFacetsVisible}>
985
- <summary>
986
- <span class="collapser-icon">${chevronIcon}</span>
987
- <h2>${msg('Filters')}</h2>
988
- ${this.clearFiltersBtnTemplate(true)}
989
- </summary>
990
- ${this.facetsTemplate}
991
- </details>
965
+ return html `
966
+ <details id="mobile-filter-collapse" @toggle=${toggleFacetsVisible}>
967
+ <summary>
968
+ <span class="collapser-icon">${chevronIcon}</span>
969
+ <h2>${msg('Filters')}</h2>
970
+ ${this.clearFiltersBtnTemplate(true)}
971
+ </summary>
972
+ ${this.facetsTemplate}
973
+ </details>
992
974
  `;
993
975
  }
994
976
  /**
@@ -1072,50 +1054,50 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1072
1054
  const filterByNetworkLabel = msg('Filter by Network');
1073
1055
  const filterByShowLabel = msg('Filter by Show');
1074
1056
  const shows = showEntries.map(([show]) => show);
1075
- const loadingIndicator = html `
1076
- <span slot="empty-options">
1077
- <img src="https://archive.org/images/loading.gif" />
1078
- </span>
1057
+ const loadingIndicator = html `
1058
+ <span slot="empty-options">
1059
+ <img src="https://archive.org/images/loading.gif" />
1060
+ </span>
1079
1061
  `;
1080
- const errorMessage = html `
1081
- <span slot="empty-options">
1082
- ${msg('Unable to fetch options, try again later')}
1083
- </span>
1062
+ const errorMessage = html `
1063
+ <span slot="empty-options">
1064
+ ${msg('Unable to fetch options, try again later')}
1065
+ </span>
1084
1066
  `;
1085
- return html `
1086
- <div id="tv-filters" slot="facets-top">
1087
- <ia-combo-box
1088
- id="tv-networks"
1089
- class="tv-filter-dropdown"
1090
- placeholder=${filterByNetworkLabel}
1091
- clearable
1092
- wrap-arrow-keys
1093
- sort
1094
- .options=${networks.map((n, i) => ({ id: `network-${i}`, text: n }))}
1095
- @toggle=${this.tvDropdownToggled}
1096
- @change=${this.networksDropdownChanged}
1097
- >
1098
- <span slot="label" class="sr-only">${filterByNetworkLabel}</span>
1099
- ${this.tvMapsLoading ? loadingIndicator : nothing}
1100
- ${this.tvMapsErrored ? errorMessage : nothing}
1101
- </ia-combo-box>
1102
- <ia-combo-box
1103
- id="tv-shows"
1104
- class="tv-filter-dropdown"
1105
- placeholder=${filterByShowLabel}
1106
- max-autocomplete-entries="500"
1107
- clearable
1108
- wrap-arrow-keys
1109
- sort
1110
- .options=${shows.map((s, i) => ({ id: `show-${i}`, text: s }))}
1111
- @toggle=${this.tvDropdownToggled}
1112
- @change=${this.showsDropdownChanged}
1113
- >
1114
- <span slot="label" class="sr-only">${filterByShowLabel}</span>
1115
- ${this.tvMapsLoading ? loadingIndicator : nothing}
1116
- ${this.tvMapsErrored ? errorMessage : nothing}
1117
- </ia-combo-box>
1118
- </div>
1067
+ return html `
1068
+ <div id="tv-filters" slot="facets-top">
1069
+ <ia-combo-box
1070
+ id="tv-networks"
1071
+ class="tv-filter-dropdown"
1072
+ placeholder=${filterByNetworkLabel}
1073
+ clearable
1074
+ wrap-arrow-keys
1075
+ sort
1076
+ .options=${networks.map((n, i) => ({ id: `network-${i}`, text: n }))}
1077
+ @toggle=${this.tvDropdownToggled}
1078
+ @change=${this.networksDropdownChanged}
1079
+ >
1080
+ <span slot="label" class="sr-only">${filterByNetworkLabel}</span>
1081
+ ${this.tvMapsLoading ? loadingIndicator : nothing}
1082
+ ${this.tvMapsErrored ? errorMessage : nothing}
1083
+ </ia-combo-box>
1084
+ <ia-combo-box
1085
+ id="tv-shows"
1086
+ class="tv-filter-dropdown"
1087
+ placeholder=${filterByShowLabel}
1088
+ max-autocomplete-entries="500"
1089
+ clearable
1090
+ wrap-arrow-keys
1091
+ sort
1092
+ .options=${shows.map((s, i) => ({ id: `show-${i}`, text: s }))}
1093
+ @toggle=${this.tvDropdownToggled}
1094
+ @change=${this.showsDropdownChanged}
1095
+ >
1096
+ <span slot="label" class="sr-only">${filterByShowLabel}</span>
1097
+ ${this.tvMapsLoading ? loadingIndicator : nothing}
1098
+ ${this.tvMapsErrored ? errorMessage : nothing}
1099
+ </ia-combo-box>
1100
+ </div>
1119
1101
  `;
1120
1102
  }
1121
1103
  /**
@@ -1125,10 +1107,10 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1125
1107
  if (FACETLESS_PAGE_ELEMENTS.includes(this.profileElement))
1126
1108
  return nothing;
1127
1109
  if (this.facetLoadStrategy === 'off') {
1128
- return html `
1129
- <p class="facets-message">
1130
- ${msg('Facets are temporarily unavailable.')}
1131
- </p>
1110
+ return html `
1111
+ <p class="facets-message">
1112
+ ${msg('Facets are temporarily unavailable.')}
1113
+ </p>
1132
1114
  `;
1133
1115
  }
1134
1116
  // We switch to TV facet ordering & date picker if we are in a TV collection or showing TV search results
@@ -1137,46 +1119,46 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1137
1119
  const facetDisplayOrder = shouldUseTvInterface
1138
1120
  ? tvFacetDisplayOrder
1139
1121
  : defaultFacetDisplayOrder;
1140
- const facets = html `
1141
- <collection-facets
1142
- .collectionPagePath=${this.collectionPagePath}
1143
- .parentCollections=${this.dataSource.parentCollections}
1144
- .pageSpecifierParams=${this.dataSource.pageSpecifierParams}
1145
- .searchService=${this.searchService}
1146
- .featureFeedbackService=${this.featureFeedbackService}
1147
- .recaptchaManager=${this.recaptchaManager}
1148
- .resizeObserver=${this.resizeObserver}
1149
- .searchType=${this.searchType}
1150
- .aggregations=${this.dataSource.aggregations}
1151
- .histogramAggregation=${this.dataSource.histogramAggregation}
1152
- .minSelectedDate=${this.minSelectedDate}
1153
- .maxSelectedDate=${this.maxSelectedDate}
1154
- .selectedFacets=${this.selectedFacets}
1155
- .baseNavigationUrl=${this.baseNavigationUrl}
1156
- .collectionTitles=${this.dataSource.collectionTitles}
1157
- .tvChannelAliases=${this.dataSource.tvChannelAliases}
1158
- .showHistogramDatePicker=${this.showHistogramDatePicker}
1159
- .allowExpandingDatePicker=${!this.mobileView}
1160
- .allowDatePickerMonths=${shouldUseTvInterface}
1161
- .contentWidth=${this.contentWidth}
1162
- .query=${this.baseQuery}
1163
- .identifiers=${this.identifiers}
1164
- .filterMap=${this.dataSource.filterMap}
1165
- .isManageView=${this.isManageView}
1166
- .modalManager=${this.modalManager}
1167
- .analyticsHandler=${this.analyticsHandler}
1168
- .facetDisplayOrder=${facetDisplayOrder}
1169
- .isTvSearch=${shouldUseTvInterface}
1170
- ?collapsableFacets=${this.mobileView}
1171
- ?facetsLoading=${this.facetsLoading}
1172
- ?histogramAggregationLoading=${this.facetsLoading}
1173
- ?suppressMediatypeFacets=${this.suppressMediatypeFacets}
1174
- @facetClick=${this.facetClickHandler}
1175
- @facetsChanged=${this.facetsChanged}
1176
- @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
1177
- >
1178
- ${this.tvDropdownFiltersTemplate}
1179
- </collection-facets>
1122
+ const facets = html `
1123
+ <collection-facets
1124
+ .collectionPagePath=${this.collectionPagePath}
1125
+ .parentCollections=${this.dataSource.parentCollections}
1126
+ .pageSpecifierParams=${this.dataSource.pageSpecifierParams}
1127
+ .searchService=${this.searchService}
1128
+ .featureFeedbackService=${this.featureFeedbackService}
1129
+ .recaptchaManager=${this.recaptchaManager}
1130
+ .resizeObserver=${this.resizeObserver}
1131
+ .searchType=${this.searchType}
1132
+ .aggregations=${this.dataSource.aggregations}
1133
+ .histogramAggregation=${this.dataSource.histogramAggregation}
1134
+ .minSelectedDate=${this.minSelectedDate}
1135
+ .maxSelectedDate=${this.maxSelectedDate}
1136
+ .selectedFacets=${this.selectedFacets}
1137
+ .baseNavigationUrl=${this.baseNavigationUrl}
1138
+ .collectionTitles=${this.dataSource.collectionTitles}
1139
+ .tvChannelAliases=${this.dataSource.tvChannelAliases}
1140
+ .showHistogramDatePicker=${this.showHistogramDatePicker}
1141
+ .allowExpandingDatePicker=${!this.mobileView}
1142
+ .allowDatePickerMonths=${shouldUseTvInterface}
1143
+ .contentWidth=${this.contentWidth}
1144
+ .query=${this.baseQuery}
1145
+ .identifiers=${this.identifiers}
1146
+ .filterMap=${this.dataSource.filterMap}
1147
+ .isManageView=${this.isManageView}
1148
+ .modalManager=${this.modalManager}
1149
+ .analyticsHandler=${this.analyticsHandler}
1150
+ .facetDisplayOrder=${facetDisplayOrder}
1151
+ .isTvSearch=${shouldUseTvInterface}
1152
+ ?collapsableFacets=${this.mobileView}
1153
+ ?facetsLoading=${this.facetsLoading}
1154
+ ?histogramAggregationLoading=${this.facetsLoading}
1155
+ ?suppressMediatypeFacets=${this.suppressMediatypeFacets}
1156
+ @facetClick=${this.facetClickHandler}
1157
+ @facetsChanged=${this.facetsChanged}
1158
+ @histogramDateRangeUpdated=${this.histogramDateRangeUpdated}
1159
+ >
1160
+ ${this.tvDropdownFiltersTemplate}
1161
+ </collection-facets>
1180
1162
  `;
1181
1163
  // If we are using one of the opt-in facet load strategies, we may need to wrap the
1182
1164
  // desktop view facets in a <details> widget so that patrons can opt into loading them.
@@ -1184,20 +1166,20 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1184
1166
  const showDesktopOptInWidget = this.facetLoadStrategy === 'opt-in' ||
1185
1167
  (this.facetLoadStrategy === 'opt-in-or-login' && !this.loggedIn);
1186
1168
  if (showDesktopOptInWidget && !this.mobileView) {
1187
- return html `
1188
- <details
1189
- class="desktop-facets-dropdown"
1169
+ return html `
1170
+ <details
1171
+ class="desktop-facets-dropdown"
1190
1172
  @toggle=${(e) => {
1191
1173
  const target = e.target;
1192
1174
  this.collapsibleFacetsVisible = target.open;
1193
- }}
1194
- >
1195
- <summary>
1196
- <span class="collapser-icon">${chevronIcon}</span>
1197
- <h2>${msg('Filters')}</h2>
1198
- </summary>
1199
- ${facets}
1200
- </details>
1175
+ }}
1176
+ >
1177
+ <summary>
1178
+ <span class="collapser-icon">${chevronIcon}</span>
1179
+ <h2>${msg('Filters')}</h2>
1180
+ </summary>
1181
+ ${facets}
1182
+ </details>
1201
1183
  `;
1202
1184
  }
1203
1185
  // Otherwise, just render the facets component bare
@@ -1217,34 +1199,34 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1217
1199
  mobile,
1218
1200
  });
1219
1201
  const buttonText = mobile ? 'Clear all' : 'Clear all filters';
1220
- return html `
1221
- <div class="clear-filters-btn-row">
1202
+ return html `
1203
+ <div class="clear-filters-btn-row">
1222
1204
  ${mobile
1223
1205
  ? html `<span class="clear-filters-btn-separator">&nbsp;</span>`
1224
- : nothing}
1225
- <button class=${buttonClasses} @click=${this.clearFilters}>
1226
- ${buttonText}
1227
- </button>
1228
- </div>
1206
+ : nothing}
1207
+ <button class=${buttonClasses} @click=${this.clearFilters}>
1208
+ ${buttonText}
1209
+ </button>
1210
+ </div>
1229
1211
  `;
1230
1212
  }
1231
1213
  /**
1232
1214
  * Template for the table header content that appears atop the compact list view.
1233
1215
  */
1234
1216
  get listHeaderTemplate() {
1235
- return html `
1236
- <div id="list-header">
1237
- <tile-dispatcher
1238
- .tileDisplayMode=${'list-header'}
1239
- .resizeObserver=${this.resizeObserver}
1240
- .sortParam=${this.sortParam}
1241
- .defaultSortParam=${this.defaultSortParam}
1242
- .mobileBreakpoint=${this.mobileBreakpoint}
1243
- .loggedIn=${this.loggedIn}
1244
- .suppressBlurring=${this.shouldSuppressTileBlurring}
1245
- >
1246
- </tile-dispatcher>
1247
- </div>
1217
+ return html `
1218
+ <div id="list-header">
1219
+ <tile-dispatcher
1220
+ .tileDisplayMode=${'list-header'}
1221
+ .resizeObserver=${this.resizeObserver}
1222
+ .sortParam=${this.sortParam}
1223
+ .defaultSortParam=${this.defaultSortParam}
1224
+ .mobileBreakpoint=${this.mobileBreakpoint}
1225
+ .loggedIn=${this.loggedIn}
1226
+ .suppressBlurring=${this.shouldSuppressTileBlurring}
1227
+ >
1228
+ </tile-dispatcher>
1229
+ </div>
1248
1230
  `;
1249
1231
  }
1250
1232
  /**
@@ -1974,28 +1956,28 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
1974
1956
  const isRadioSearch = this.searchType === SearchType.RADIO;
1975
1957
  const { isTVCollection, isRadioCollection } = this;
1976
1958
  const shouldUseLocalTime = isTVSearch || isRadioSearch || isTVCollection || isRadioCollection;
1977
- return html `
1978
- <tile-dispatcher
1979
- .collectionPagePath=${this.collectionPagePath}
1980
- .baseNavigationUrl=${this.baseNavigationUrl}
1981
- .baseImageUrl=${this.baseImageUrl}
1982
- .model=${model}
1983
- .tileDisplayMode=${this.displayMode}
1984
- .resizeObserver=${this.resizeObserver}
1985
- .collectionTitles=${this.dataSource.collectionTitles}
1986
- .sortParam=${this.sortParam}
1987
- .defaultSortParam=${this.defaultSortParam}
1988
- .creatorFilter=${this.selectedCreatorFilter}
1989
- .mobileBreakpoint=${this.mobileBreakpoint}
1990
- .loggedIn=${this.loggedIn}
1991
- .suppressBlurring=${this.shouldSuppressTileBlurring}
1992
- .isManageView=${this.isManageView}
1993
- ?showTvClips=${isTVSearch || isTVCollection}
1994
- ?enableHoverPane=${true}
1995
- ?useLocalTime=${shouldUseLocalTime}
1996
- @resultSelected=${(e) => this.resultSelected(e)}
1997
- >
1998
- </tile-dispatcher>
1959
+ return html `
1960
+ <tile-dispatcher
1961
+ .collectionPagePath=${this.collectionPagePath}
1962
+ .baseNavigationUrl=${this.baseNavigationUrl}
1963
+ .baseImageUrl=${this.baseImageUrl}
1964
+ .model=${model}
1965
+ .tileDisplayMode=${this.displayMode}
1966
+ .resizeObserver=${this.resizeObserver}
1967
+ .collectionTitles=${this.dataSource.collectionTitles}
1968
+ .sortParam=${this.sortParam}
1969
+ .defaultSortParam=${this.defaultSortParam}
1970
+ .creatorFilter=${this.selectedCreatorFilter}
1971
+ .mobileBreakpoint=${this.mobileBreakpoint}
1972
+ .loggedIn=${this.loggedIn}
1973
+ .suppressBlurring=${this.shouldSuppressTileBlurring}
1974
+ .isManageView=${this.isManageView}
1975
+ ?showTvClips=${isTVSearch || isTVCollection}
1976
+ ?enableHoverPane=${true}
1977
+ ?useLocalTime=${shouldUseLocalTime}
1978
+ @resultSelected=${(e) => this.resultSelected(e)}
1979
+ >
1980
+ </tile-dispatcher>
1999
1981
  `;
2000
1982
  }
2001
1983
  /**
@@ -2030,479 +2012,479 @@ let CollectionBrowser = class CollectionBrowser extends LitElement {
2030
2012
  static get styles() {
2031
2013
  return [
2032
2014
  srOnlyStyle,
2033
- css `
2034
- :host {
2035
- display: block;
2036
- --leftColumnWidth: 18rem;
2037
- --leftColumnPaddingTop: 2rem;
2038
- --leftColumnPaddingRight: 2.5rem;
2039
- }
2040
-
2041
- #facet-top-view {
2042
- display: flex;
2043
- }
2044
-
2045
- /**
2046
- * When page width resizes from desktop to mobile, use this class to
2047
- * disable expand/collapse transition when loading.
2048
- */
2049
- .preload * {
2050
- transition: none !important;
2051
- -webkit-transition: none !important;
2052
- -moz-transition: none !important;
2053
- -ms-transition: none !important;
2054
- -o-transition: none !important;
2055
- }
2056
-
2057
- #content-container {
2058
- display: flex;
2059
- }
2060
-
2061
- empty-placeholder {
2062
- margin-top: var(--placeholderMarginTop, 0);
2063
- }
2064
-
2065
- .collapser-icon {
2066
- display: inline-block;
2067
- }
2068
-
2069
- .collapser-icon svg {
2070
- display: inline-block;
2071
- width: 12px;
2072
- height: 12px;
2073
- transition: transform 0.2s ease-out;
2074
- }
2075
-
2076
- #mobile-filter-collapse {
2077
- width: 100%;
2078
- }
2079
-
2080
- #mobile-filter-collapse > summary {
2081
- cursor: pointer;
2082
- list-style: none;
2083
- }
2084
-
2085
- #mobile-filter-collapse[open] > summary {
2086
- margin-bottom: 10px;
2087
- }
2088
-
2089
- #mobile-filter-collapse h2 {
2090
- display: inline-block;
2091
- margin: 0;
2092
- font-size: 2rem;
2093
- }
2094
-
2095
- #mobile-filter-collapse[open] svg {
2096
- transform: rotate(90deg);
2097
- }
2098
-
2099
- #content-container.mobile {
2100
- display: block;
2101
- }
2102
-
2103
- #right-column {
2104
- flex: 1;
2105
- position: relative;
2106
- min-height: 90vh;
2107
- border-right: 1px solid rgb(232, 232, 232);
2108
- margin-top: var(--rightColumnMarginTop, 0);
2109
- padding-top: var(--rightColumnPaddingTop, 2rem);
2110
- background: #fff;
2111
- }
2112
-
2113
- #left-column:not([hidden]) + #right-column {
2114
- border-left: 1px solid rgb(232, 232, 232);
2115
- }
2116
-
2117
- #right-column.smart-results-spacing {
2118
- padding-top: 0.5rem;
2119
- border-right: none;
2120
- background: transparent;
2121
- min-width: 0;
2122
- }
2123
-
2124
- #results {
2125
- background: #fff;
2126
- padding-left: 1rem;
2127
- padding-right: 1rem;
2128
- }
2129
-
2130
- #right-column.smart-results-spacing #results {
2131
- border-radius: 10px 10px 0px 0px;
2132
- padding-top: 0.5rem;
2133
- margin-top: 1rem;
2134
- }
2135
-
2136
- .mobile #right-column {
2137
- border-left: none;
2138
- }
2139
-
2140
- .mobile #results {
2141
- padding: 5px 5px 0;
2142
- }
2143
-
2144
- #left-column {
2145
- width: var(--leftColumnWidth, 18rem);
2146
- /* Prevents Safari from shrinking col at first draw */
2147
- min-width: var(--leftColumnWidth, 18rem);
2148
- padding-top: var(--leftColumnPaddingTop, 2rem);
2149
- /* Reduced padding by 0.2rem to add the invisible border in the rule below */
2150
- padding-right: calc(var(--leftColumnPaddingRight, 2.5rem) - 0.2rem);
2151
- border-right: 0.2rem solid transparent; /* Pads to the right of the scrollbar a bit */
2152
- z-index: 1;
2153
- }
2154
-
2155
- .desktop #left-column {
2156
- top: 0;
2157
- position: sticky;
2158
- height: calc(100vh - 2rem);
2159
- max-height: calc(100vh - 2rem);
2160
- overflow-x: hidden;
2161
- overflow-y: scroll;
2162
-
2163
- /*
2164
- * Firefox doesn't support any of the -webkit-scrollbar stuff below, but
2165
- * does at least give us a tiny bit of control over width & color.
2166
- */
2167
- scrollbar-width: thin;
2168
- scrollbar-color: transparent transparent;
2169
- }
2170
- .desktop #left-column:hover {
2171
- scrollbar-color: auto;
2172
- }
2173
- .desktop #left-column::-webkit-scrollbar {
2174
- appearance: none;
2175
- width: 6px;
2176
- }
2177
- .desktop #left-column::-webkit-scrollbar-button {
2178
- height: 3px;
2179
- background: transparent;
2180
- }
2181
- .desktop #left-column::-webkit-scrollbar-corner {
2182
- background: transparent;
2183
- }
2184
- .desktop #left-column::-webkit-scrollbar-thumb {
2185
- border-radius: 4px;
2186
- }
2187
- .desktop #left-column:hover::-webkit-scrollbar-thumb {
2188
- background: rgba(0, 0, 0, 0.15);
2189
- }
2190
- .desktop #left-column:hover::-webkit-scrollbar-thumb:hover {
2191
- background: rgba(0, 0, 0, 0.2);
2192
- }
2193
- .desktop #left-column:hover::-webkit-scrollbar-thumb:active {
2194
- background: rgba(0, 0, 0, 0.3);
2195
- }
2196
-
2197
- #facets-bottom-fade {
2198
- background: linear-gradient(
2199
- to bottom,
2200
- #fbfbfd00 0%,
2201
- #fbfbfdc0 50%,
2202
- #fbfbfd 80%,
2203
- #fbfbfd 100%
2204
- );
2205
- position: fixed;
2206
- bottom: 0;
2207
- height: 50px;
2208
- /* Wide enough to cover the content, but leave the scrollbar uncovered */
2209
- width: calc(
2210
- var(--leftColumnWidth) + var(--leftColumnPaddingRight) - 10px
2211
- );
2212
- z-index: 2;
2213
- pointer-events: none;
2214
- transition: height 0.1s ease;
2215
- }
2216
- #facets-bottom-fade.hidden {
2217
- height: 0;
2218
- }
2219
-
2220
- .facets-message {
2221
- font-size: 1.4rem;
2222
- }
2223
-
2224
- .desktop-facets-dropdown > summary {
2225
- cursor: pointer;
2226
- list-style: none;
2227
- }
2228
-
2229
- .desktop-facets-dropdown h2 {
2230
- display: inline-block;
2231
- margin: 0;
2232
- font-size: 1.6rem;
2233
- }
2234
-
2235
- .desktop-facets-dropdown[open] > summary {
2236
- margin-bottom: 10px;
2237
- }
2238
-
2239
- .desktop-facets-dropdown[open] svg {
2240
- transform: rotate(90deg);
2241
- }
2242
-
2243
- .desktop #left-column-scroll-sentinel {
2244
- width: 1px;
2245
- height: 100vh;
2246
- background: transparent;
2247
- }
2248
-
2249
- .desktop #facets-scroll-sentinel {
2250
- width: 1px;
2251
- height: 1px;
2252
- background: transparent;
2253
- }
2254
-
2255
- #facets-header-container {
2256
- display: flex;
2257
- justify-content: space-between;
2258
- align-items: flex-start;
2259
- clear: both;
2260
- }
2261
-
2262
- .desktop #facets-header-container {
2263
- flex-wrap: wrap;
2264
- }
2265
-
2266
- .mobile #left-column {
2267
- width: 100%;
2268
- min-width: 0;
2269
- padding: 5px 0;
2270
- border: 0;
2271
- }
2272
-
2273
- .clear-filters-btn-row {
2274
- display: inline-block;
2275
- }
2276
-
2277
- .desktop .clear-filters-btn-row {
2278
- width: 100%;
2279
- }
2280
-
2281
- .clear-filters-btn {
2282
- display: inline-block;
2283
- appearance: none;
2284
- margin: 0;
2285
- padding: 0;
2286
- border: 0;
2287
- background: none;
2288
- color: var(--ia-theme-link-color);
2289
- font-size: 1.4rem;
2290
- font-family: inherit;
2291
- cursor: pointer;
2292
- }
2293
-
2294
- .clear-filters-btn:hover {
2295
- text-decoration: underline;
2296
- }
2297
-
2298
- .clear-filters-btn-separator {
2299
- display: inline-block;
2300
- margin-left: 5px;
2301
- border-left: 1px solid #2c2c2c;
2302
- font-size: 1.4rem;
2303
- line-height: 1.3rem;
2304
- }
2305
-
2306
- #tv-filters {
2307
- margin-bottom: 15px;
2308
- }
2309
-
2310
- #tv-shows {
2311
- --comboBoxListWidth: 300px;
2312
- }
2313
-
2314
- .tv-filter-dropdown {
2315
- display: block;
2316
- font-size: 14px;
2317
- margin-left: 1px;
2318
- margin-bottom: 5px;
2319
- }
2320
-
2321
- .tv-filter-dropdown::part(combo-box) {
2322
- outline-offset: 1px;
2323
- }
2324
-
2325
- .tv-filter-dropdown::part(option) {
2326
- line-height: 1.1;
2327
- padding: 7px;
2328
- }
2329
-
2330
- .tv-filter-dropdown::part(clear-button) {
2331
- flex: 0 0 26px;
2332
- --combo-box-clear-icon-size: 14px;
2333
- }
2334
-
2335
- .tv-filter-dropdown::part(icon) {
2336
- width: 1.4rem;
2337
- height: 1.4rem;
2338
- }
2339
-
2340
- #facets-container {
2341
- position: relative;
2342
- max-height: 0;
2343
- transition: max-height 0.2s ease-in-out;
2344
- z-index: 1;
2345
- margin-top: var(--facetsContainerMarginTop, 3rem);
2346
- padding-bottom: 2rem;
2347
- }
2348
-
2349
- .desktop #facets-container {
2350
- width: 18rem;
2351
- }
2352
-
2353
- .mobile #facets-container {
2354
- overflow: hidden;
2355
- padding-bottom: 0;
2356
- padding-left: 10px;
2357
- padding-right: 10px;
2358
- }
2359
-
2360
- #facets-container.expanded {
2361
- max-height: 2000px;
2362
- }
2363
-
2364
- .results-section-heading {
2365
- margin: 0.5rem 0.3rem;
2366
- font-size: 2rem;
2367
- line-height: 25px;
2368
- }
2369
-
2370
- #results-total {
2371
- display: flex;
2372
- align-items: baseline;
2373
- }
2374
-
2375
- #results-total:not(.filtered) {
2376
- padding-bottom: 2rem;
2377
- }
2378
-
2379
- .mobile #results-total {
2380
- position: absolute;
2381
- right: 10px;
2382
- }
2383
-
2384
- #big-results-count {
2385
- font-size: 2.4rem;
2386
- font-weight: 500;
2387
- margin-right: 5px;
2388
- }
2389
-
2390
- .mobile #big-results-count {
2391
- font-size: 2rem;
2392
- }
2393
-
2394
- #big-results-label {
2395
- font-size: 1.4rem;
2396
- font-weight: 200;
2397
- }
2398
-
2399
- #list-header {
2400
- max-height: 4.2rem;
2401
- }
2402
-
2403
- .loading-cover {
2404
- position: absolute;
2405
- top: 0;
2406
- left: 0;
2407
- width: 100%;
2408
- height: 100%;
2409
- display: flex;
2410
- justify-content: center;
2411
- z-index: 1;
2412
- padding-top: 50px;
2413
- }
2414
-
2415
- #tile-blur-label {
2416
- display: flex;
2417
- align-items: center;
2418
- column-gap: 5px;
2419
- }
2420
-
2421
- #tile-blur-check {
2422
- margin: 0 5px 0 0;
2423
- width: 15px;
2424
- }
2425
-
2426
- circular-activity-indicator {
2427
- width: 30px;
2428
- height: 30px;
2429
- }
2430
-
2431
- sort-filter-bar {
2432
- display: block;
2433
- margin-bottom: 4rem;
2434
- }
2435
-
2436
- infinite-scroller {
2437
- display: block;
2438
- --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);
2439
- --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);
2440
- }
2441
-
2442
- infinite-scroller.list-compact {
2443
- --infiniteScrollerCellMinWidth: var(
2444
- --collectionBrowserCellMinWidth,
2445
- 100%
2446
- );
2447
- --infiniteScrollerCellMinHeight: 45px; /* override infinite scroller component */
2448
- --infiniteScrollerCellMaxHeight: 56px;
2449
- --infiniteScrollerRowGap: 10px;
2450
- }
2451
-
2452
- infinite-scroller.list-detail {
2453
- --infiniteScrollerCellMinWidth: var(
2454
- --collectionBrowserCellMinWidth,
2455
- 100%
2456
- );
2457
- --infiniteScrollerCellMinHeight: var(
2458
- --collectionBrowserCellMinHeight,
2459
- 5rem
2460
- );
2461
- /*
2462
- 30px in spec, compensating for a -4px margin
2463
- to align title with top of item image
2464
- src/tiles/list/tile-list.ts
2465
- */
2466
- --infiniteScrollerRowGap: 34px;
2467
- }
2468
-
2469
- .mobile infinite-scroller.list-detail {
2470
- --infiniteScrollerRowGap: 24px;
2471
- }
2472
-
2473
- infinite-scroller.grid {
2474
- --infiniteScrollerCellMinWidth: var(
2475
- --collectionBrowserCellMinWidth,
2476
- 17rem
2477
- );
2478
- --infiniteScrollerCellMaxWidth: var(
2479
- --collectionBrowserCellMaxWidth,
2480
- 1fr
2481
- );
2482
- }
2483
-
2484
- /* Allow tiles to shrink a bit further at smaller viewport widths */
2485
- @media screen and (max-width: 880px) {
2486
- infinite-scroller.grid {
2487
- --infiniteScrollerCellMinWidth: var(
2488
- --collectionBrowserCellMinWidth,
2489
- 15rem
2490
- );
2491
- }
2492
- }
2493
- /* At very small widths, maintain a 2-tile layout as far as it can reasonably go */
2494
- @media screen and (max-width: 360px) {
2495
- infinite-scroller.grid {
2496
- --infiniteScrollerCellMinWidth: var(
2497
- --collectionBrowserCellMinWidth,
2498
- 12rem
2499
- );
2500
- }
2501
- }
2502
-
2503
- infinite-scroller.hidden {
2504
- display: none;
2505
- }
2015
+ css `
2016
+ :host {
2017
+ display: block;
2018
+ --leftColumnWidth: 18rem;
2019
+ --leftColumnPaddingTop: 2rem;
2020
+ --leftColumnPaddingRight: 2.5rem;
2021
+ }
2022
+
2023
+ #facet-top-view {
2024
+ display: flex;
2025
+ }
2026
+
2027
+ /**
2028
+ * When page width resizes from desktop to mobile, use this class to
2029
+ * disable expand/collapse transition when loading.
2030
+ */
2031
+ .preload * {
2032
+ transition: none !important;
2033
+ -webkit-transition: none !important;
2034
+ -moz-transition: none !important;
2035
+ -ms-transition: none !important;
2036
+ -o-transition: none !important;
2037
+ }
2038
+
2039
+ #content-container {
2040
+ display: flex;
2041
+ }
2042
+
2043
+ empty-placeholder {
2044
+ margin-top: var(--placeholderMarginTop, 0);
2045
+ }
2046
+
2047
+ .collapser-icon {
2048
+ display: inline-block;
2049
+ }
2050
+
2051
+ .collapser-icon svg {
2052
+ display: inline-block;
2053
+ width: 12px;
2054
+ height: 12px;
2055
+ transition: transform 0.2s ease-out;
2056
+ }
2057
+
2058
+ #mobile-filter-collapse {
2059
+ width: 100%;
2060
+ }
2061
+
2062
+ #mobile-filter-collapse > summary {
2063
+ cursor: pointer;
2064
+ list-style: none;
2065
+ }
2066
+
2067
+ #mobile-filter-collapse[open] > summary {
2068
+ margin-bottom: 10px;
2069
+ }
2070
+
2071
+ #mobile-filter-collapse h2 {
2072
+ display: inline-block;
2073
+ margin: 0;
2074
+ font-size: 2rem;
2075
+ }
2076
+
2077
+ #mobile-filter-collapse[open] svg {
2078
+ transform: rotate(90deg);
2079
+ }
2080
+
2081
+ #content-container.mobile {
2082
+ display: block;
2083
+ }
2084
+
2085
+ #right-column {
2086
+ flex: 1;
2087
+ position: relative;
2088
+ min-height: 90vh;
2089
+ border-right: 1px solid rgb(232, 232, 232);
2090
+ margin-top: var(--rightColumnMarginTop, 0);
2091
+ padding-top: var(--rightColumnPaddingTop, 2rem);
2092
+ background: #fff;
2093
+ }
2094
+
2095
+ #left-column:not([hidden]) + #right-column {
2096
+ border-left: 1px solid rgb(232, 232, 232);
2097
+ }
2098
+
2099
+ #right-column.smart-results-spacing {
2100
+ padding-top: 0.5rem;
2101
+ border-right: none;
2102
+ background: transparent;
2103
+ min-width: 0;
2104
+ }
2105
+
2106
+ #results {
2107
+ background: #fff;
2108
+ padding-left: 1rem;
2109
+ padding-right: 1rem;
2110
+ }
2111
+
2112
+ #right-column.smart-results-spacing #results {
2113
+ border-radius: 10px 10px 0px 0px;
2114
+ padding-top: 0.5rem;
2115
+ margin-top: 1rem;
2116
+ }
2117
+
2118
+ .mobile #right-column {
2119
+ border-left: none;
2120
+ }
2121
+
2122
+ .mobile #results {
2123
+ padding: 5px 5px 0;
2124
+ }
2125
+
2126
+ #left-column {
2127
+ width: var(--leftColumnWidth, 18rem);
2128
+ /* Prevents Safari from shrinking col at first draw */
2129
+ min-width: var(--leftColumnWidth, 18rem);
2130
+ padding-top: var(--leftColumnPaddingTop, 2rem);
2131
+ /* Reduced padding by 0.2rem to add the invisible border in the rule below */
2132
+ padding-right: calc(var(--leftColumnPaddingRight, 2.5rem) - 0.2rem);
2133
+ border-right: 0.2rem solid transparent; /* Pads to the right of the scrollbar a bit */
2134
+ z-index: 1;
2135
+ }
2136
+
2137
+ .desktop #left-column {
2138
+ top: 0;
2139
+ position: sticky;
2140
+ height: calc(100vh - 2rem);
2141
+ max-height: calc(100vh - 2rem);
2142
+ overflow-x: hidden;
2143
+ overflow-y: scroll;
2144
+
2145
+ /*
2146
+ * Firefox doesn't support any of the -webkit-scrollbar stuff below, but
2147
+ * does at least give us a tiny bit of control over width & color.
2148
+ */
2149
+ scrollbar-width: thin;
2150
+ scrollbar-color: transparent transparent;
2151
+ }
2152
+ .desktop #left-column:hover {
2153
+ scrollbar-color: auto;
2154
+ }
2155
+ .desktop #left-column::-webkit-scrollbar {
2156
+ appearance: none;
2157
+ width: 6px;
2158
+ }
2159
+ .desktop #left-column::-webkit-scrollbar-button {
2160
+ height: 3px;
2161
+ background: transparent;
2162
+ }
2163
+ .desktop #left-column::-webkit-scrollbar-corner {
2164
+ background: transparent;
2165
+ }
2166
+ .desktop #left-column::-webkit-scrollbar-thumb {
2167
+ border-radius: 4px;
2168
+ }
2169
+ .desktop #left-column:hover::-webkit-scrollbar-thumb {
2170
+ background: rgba(0, 0, 0, 0.15);
2171
+ }
2172
+ .desktop #left-column:hover::-webkit-scrollbar-thumb:hover {
2173
+ background: rgba(0, 0, 0, 0.2);
2174
+ }
2175
+ .desktop #left-column:hover::-webkit-scrollbar-thumb:active {
2176
+ background: rgba(0, 0, 0, 0.3);
2177
+ }
2178
+
2179
+ #facets-bottom-fade {
2180
+ background: linear-gradient(
2181
+ to bottom,
2182
+ #fbfbfd00 0%,
2183
+ #fbfbfdc0 50%,
2184
+ #fbfbfd 80%,
2185
+ #fbfbfd 100%
2186
+ );
2187
+ position: fixed;
2188
+ bottom: 0;
2189
+ height: 50px;
2190
+ /* Wide enough to cover the content, but leave the scrollbar uncovered */
2191
+ width: calc(
2192
+ var(--leftColumnWidth) + var(--leftColumnPaddingRight) - 10px
2193
+ );
2194
+ z-index: 2;
2195
+ pointer-events: none;
2196
+ transition: height 0.1s ease;
2197
+ }
2198
+ #facets-bottom-fade.hidden {
2199
+ height: 0;
2200
+ }
2201
+
2202
+ .facets-message {
2203
+ font-size: 1.4rem;
2204
+ }
2205
+
2206
+ .desktop-facets-dropdown > summary {
2207
+ cursor: pointer;
2208
+ list-style: none;
2209
+ }
2210
+
2211
+ .desktop-facets-dropdown h2 {
2212
+ display: inline-block;
2213
+ margin: 0;
2214
+ font-size: 1.6rem;
2215
+ }
2216
+
2217
+ .desktop-facets-dropdown[open] > summary {
2218
+ margin-bottom: 10px;
2219
+ }
2220
+
2221
+ .desktop-facets-dropdown[open] svg {
2222
+ transform: rotate(90deg);
2223
+ }
2224
+
2225
+ .desktop #left-column-scroll-sentinel {
2226
+ width: 1px;
2227
+ height: 100vh;
2228
+ background: transparent;
2229
+ }
2230
+
2231
+ .desktop #facets-scroll-sentinel {
2232
+ width: 1px;
2233
+ height: 1px;
2234
+ background: transparent;
2235
+ }
2236
+
2237
+ #facets-header-container {
2238
+ display: flex;
2239
+ justify-content: space-between;
2240
+ align-items: flex-start;
2241
+ clear: both;
2242
+ }
2243
+
2244
+ .desktop #facets-header-container {
2245
+ flex-wrap: wrap;
2246
+ }
2247
+
2248
+ .mobile #left-column {
2249
+ width: 100%;
2250
+ min-width: 0;
2251
+ padding: 5px 0;
2252
+ border: 0;
2253
+ }
2254
+
2255
+ .clear-filters-btn-row {
2256
+ display: inline-block;
2257
+ }
2258
+
2259
+ .desktop .clear-filters-btn-row {
2260
+ width: 100%;
2261
+ }
2262
+
2263
+ .clear-filters-btn {
2264
+ display: inline-block;
2265
+ appearance: none;
2266
+ margin: 0;
2267
+ padding: 0;
2268
+ border: 0;
2269
+ background: none;
2270
+ color: var(--ia-theme-link-color);
2271
+ font-size: 1.4rem;
2272
+ font-family: inherit;
2273
+ cursor: pointer;
2274
+ }
2275
+
2276
+ .clear-filters-btn:hover {
2277
+ text-decoration: underline;
2278
+ }
2279
+
2280
+ .clear-filters-btn-separator {
2281
+ display: inline-block;
2282
+ margin-left: 5px;
2283
+ border-left: 1px solid #2c2c2c;
2284
+ font-size: 1.4rem;
2285
+ line-height: 1.3rem;
2286
+ }
2287
+
2288
+ #tv-filters {
2289
+ margin-bottom: 15px;
2290
+ }
2291
+
2292
+ #tv-shows {
2293
+ --comboBoxListWidth: 300px;
2294
+ }
2295
+
2296
+ .tv-filter-dropdown {
2297
+ display: block;
2298
+ font-size: 14px;
2299
+ margin-left: 1px;
2300
+ margin-bottom: 5px;
2301
+ }
2302
+
2303
+ .tv-filter-dropdown::part(combo-box) {
2304
+ outline-offset: 1px;
2305
+ }
2306
+
2307
+ .tv-filter-dropdown::part(option) {
2308
+ line-height: 1.1;
2309
+ padding: 7px;
2310
+ }
2311
+
2312
+ .tv-filter-dropdown::part(clear-button) {
2313
+ flex: 0 0 26px;
2314
+ --combo-box-clear-icon-size: 14px;
2315
+ }
2316
+
2317
+ .tv-filter-dropdown::part(icon) {
2318
+ width: 1.4rem;
2319
+ height: 1.4rem;
2320
+ }
2321
+
2322
+ #facets-container {
2323
+ position: relative;
2324
+ max-height: 0;
2325
+ transition: max-height 0.2s ease-in-out;
2326
+ z-index: 1;
2327
+ margin-top: var(--facetsContainerMarginTop, 3rem);
2328
+ padding-bottom: 2rem;
2329
+ }
2330
+
2331
+ .desktop #facets-container {
2332
+ width: 18rem;
2333
+ }
2334
+
2335
+ .mobile #facets-container {
2336
+ overflow: hidden;
2337
+ padding-bottom: 0;
2338
+ padding-left: 10px;
2339
+ padding-right: 10px;
2340
+ }
2341
+
2342
+ #facets-container.expanded {
2343
+ max-height: 2000px;
2344
+ }
2345
+
2346
+ .results-section-heading {
2347
+ margin: 0.5rem 0.3rem;
2348
+ font-size: 2rem;
2349
+ line-height: 25px;
2350
+ }
2351
+
2352
+ #results-total {
2353
+ display: flex;
2354
+ align-items: baseline;
2355
+ }
2356
+
2357
+ #results-total:not(.filtered) {
2358
+ padding-bottom: 2rem;
2359
+ }
2360
+
2361
+ .mobile #results-total {
2362
+ position: absolute;
2363
+ right: 10px;
2364
+ }
2365
+
2366
+ #big-results-count {
2367
+ font-size: 2.4rem;
2368
+ font-weight: 500;
2369
+ margin-right: 5px;
2370
+ }
2371
+
2372
+ .mobile #big-results-count {
2373
+ font-size: 2rem;
2374
+ }
2375
+
2376
+ #big-results-label {
2377
+ font-size: 1.4rem;
2378
+ font-weight: 200;
2379
+ }
2380
+
2381
+ #list-header {
2382
+ max-height: 4.2rem;
2383
+ }
2384
+
2385
+ .loading-cover {
2386
+ position: absolute;
2387
+ top: 0;
2388
+ left: 0;
2389
+ width: 100%;
2390
+ height: 100%;
2391
+ display: flex;
2392
+ justify-content: center;
2393
+ z-index: 1;
2394
+ padding-top: 50px;
2395
+ }
2396
+
2397
+ #tile-blur-label {
2398
+ display: flex;
2399
+ align-items: center;
2400
+ column-gap: 5px;
2401
+ }
2402
+
2403
+ #tile-blur-check {
2404
+ margin: 0 5px 0 0;
2405
+ width: 15px;
2406
+ }
2407
+
2408
+ circular-activity-indicator {
2409
+ width: 30px;
2410
+ height: 30px;
2411
+ }
2412
+
2413
+ sort-filter-bar {
2414
+ display: block;
2415
+ margin-bottom: 4rem;
2416
+ }
2417
+
2418
+ infinite-scroller {
2419
+ display: block;
2420
+ --infiniteScrollerRowGap: var(--collectionBrowserRowGap, 1.7rem);
2421
+ --infiniteScrollerColGap: var(--collectionBrowserColGap, 1.7rem);
2422
+ }
2423
+
2424
+ infinite-scroller.list-compact {
2425
+ --infiniteScrollerCellMinWidth: var(
2426
+ --collectionBrowserCellMinWidth,
2427
+ 100%
2428
+ );
2429
+ --infiniteScrollerCellMinHeight: 45px; /* override infinite scroller component */
2430
+ --infiniteScrollerCellMaxHeight: 56px;
2431
+ --infiniteScrollerRowGap: 10px;
2432
+ }
2433
+
2434
+ infinite-scroller.list-detail {
2435
+ --infiniteScrollerCellMinWidth: var(
2436
+ --collectionBrowserCellMinWidth,
2437
+ 100%
2438
+ );
2439
+ --infiniteScrollerCellMinHeight: var(
2440
+ --collectionBrowserCellMinHeight,
2441
+ 5rem
2442
+ );
2443
+ /*
2444
+ 30px in spec, compensating for a -4px margin
2445
+ to align title with top of item image
2446
+ src/tiles/list/tile-list.ts
2447
+ */
2448
+ --infiniteScrollerRowGap: 34px;
2449
+ }
2450
+
2451
+ .mobile infinite-scroller.list-detail {
2452
+ --infiniteScrollerRowGap: 24px;
2453
+ }
2454
+
2455
+ infinite-scroller.grid {
2456
+ --infiniteScrollerCellMinWidth: var(
2457
+ --collectionBrowserCellMinWidth,
2458
+ 17rem
2459
+ );
2460
+ --infiniteScrollerCellMaxWidth: var(
2461
+ --collectionBrowserCellMaxWidth,
2462
+ 1fr
2463
+ );
2464
+ }
2465
+
2466
+ /* Allow tiles to shrink a bit further at smaller viewport widths */
2467
+ @media screen and (max-width: 880px) {
2468
+ infinite-scroller.grid {
2469
+ --infiniteScrollerCellMinWidth: var(
2470
+ --collectionBrowserCellMinWidth,
2471
+ 15rem
2472
+ );
2473
+ }
2474
+ }
2475
+ /* At very small widths, maintain a 2-tile layout as far as it can reasonably go */
2476
+ @media screen and (max-width: 360px) {
2477
+ infinite-scroller.grid {
2478
+ --infiniteScrollerCellMinWidth: var(
2479
+ --collectionBrowserCellMinWidth,
2480
+ 12rem
2481
+ );
2482
+ }
2483
+ }
2484
+
2485
+ infinite-scroller.hidden {
2486
+ display: none;
2487
+ }
2506
2488
  `,
2507
2489
  ];
2508
2490
  }