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