@internetarchive/collection-browser 0.0.1-alpha.2 → 0.0.1-alpha.22

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 (183) hide show
  1. package/demo/app-root.ts +24 -158
  2. package/dist/demo/app-root.d.ts +2 -16
  3. package/dist/demo/app-root.js +23 -141
  4. package/dist/demo/app-root.js.map +1 -1
  5. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  6. package/dist/src/assets/img/icons/chevron.js +4 -0
  7. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  8. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  9. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  10. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  11. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  12. package/dist/src/assets/img/icons/eye.js +5 -0
  13. package/dist/src/assets/img/icons/eye.js.map +1 -0
  14. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  15. package/dist/src/assets/img/icons/mediatype/account.js +5 -4
  16. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  17. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  18. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  19. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  20. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  21. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  22. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  23. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  24. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  25. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  26. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  27. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  28. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  29. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  30. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  31. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  32. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  33. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  34. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  35. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  36. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  37. package/dist/src/async-collection-name.d.ts +11 -0
  38. package/dist/src/async-collection-name.js +38 -0
  39. package/dist/src/async-collection-name.js.map +1 -0
  40. package/dist/src/collection-browser.d.ts +55 -17
  41. package/dist/src/collection-browser.js +466 -106
  42. package/dist/src/collection-browser.js.map +1 -1
  43. package/dist/src/collection-facets.d.ts +24 -5
  44. package/dist/src/collection-facets.js +300 -78
  45. package/dist/src/collection-facets.js.map +1 -1
  46. package/dist/src/collection-name-cache.d.ts +18 -0
  47. package/dist/src/collection-name-cache.js +89 -0
  48. package/dist/src/collection-name-cache.js.map +1 -0
  49. package/dist/src/mediatype-icon.js +10 -3
  50. package/dist/src/mediatype-icon.js.map +1 -1
  51. package/dist/src/models.d.ts +72 -14
  52. package/dist/src/models.js +57 -1
  53. package/dist/src/models.js.map +1 -1
  54. package/dist/src/restoration-state-handler.d.ts +37 -0
  55. package/dist/src/restoration-state-handler.js +177 -0
  56. package/dist/src/restoration-state-handler.js.map +1 -0
  57. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -2
  58. package/dist/src/sort-filter-bar/alpha-bar.js +19 -9
  59. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  60. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  61. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  62. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  63. package/dist/src/sort-filter-bar/img/grid.d.ts +1 -0
  64. package/dist/src/sort-filter-bar/img/grid.js +5 -0
  65. package/dist/src/sort-filter-bar/img/grid.js.map +1 -0
  66. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  67. package/dist/src/sort-filter-bar/img/list.js +5 -0
  68. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  69. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  70. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  71. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  72. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  73. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  74. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  75. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +65 -11
  76. package/dist/src/sort-filter-bar/sort-filter-bar.js +453 -142
  77. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  78. package/dist/src/tiles/grid/collection-tile.js +1 -2
  79. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  80. package/dist/src/tiles/grid/item-tile.d.ts +4 -0
  81. package/dist/src/tiles/grid/item-tile.js +134 -45
  82. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  83. package/dist/src/tiles/list/tile-list-compact-header.d.ts +11 -0
  84. package/dist/src/tiles/list/tile-list-compact-header.js +79 -0
  85. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  86. package/dist/src/tiles/list/tile-list-compact.d.ts +1 -0
  87. package/dist/src/tiles/list/tile-list-compact.js +122 -31
  88. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  89. package/dist/src/tiles/list/tile-list-detail.d.ts +0 -10
  90. package/dist/src/tiles/list/tile-list-detail.js +6 -159
  91. package/dist/src/tiles/list/tile-list-detail.js.map +1 -1
  92. package/dist/src/tiles/list/tile-list.d.ts +19 -6
  93. package/dist/src/tiles/list/tile-list.js +240 -108
  94. package/dist/src/tiles/list/tile-list.js.map +1 -1
  95. package/dist/src/tiles/tile-dispatcher.d.ts +8 -1
  96. package/dist/src/tiles/tile-dispatcher.js +46 -11
  97. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  98. package/dist/src/utils/format-date.js +1 -2
  99. package/dist/src/utils/format-date.js.map +1 -1
  100. package/dist/test/{utils/format-string.test.d.ts → collection-name-cache.test.d.ts} +0 -0
  101. package/dist/test/collection-name-cache.test.js +158 -0
  102. package/dist/test/collection-name-cache.test.js.map +1 -0
  103. package/dist/test/mocks/mock-search-response.d.ts +5 -0
  104. package/dist/test/mocks/mock-search-response.js +62 -0
  105. package/dist/test/mocks/mock-search-response.js.map +1 -0
  106. package/dist/test/mocks/mock-search-service.d.ts +13 -0
  107. package/dist/test/mocks/mock-search-service.js +20 -0
  108. package/dist/test/mocks/mock-search-service.js.map +1 -0
  109. package/package.json +9 -4
  110. package/src/assets/img/icons/chevron.ts +4 -0
  111. package/src/assets/img/icons/eye-closed.ts +5 -0
  112. package/src/assets/img/icons/eye.ts +5 -0
  113. package/src/assets/img/icons/mediatype/account.ts +5 -4
  114. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  115. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  116. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  117. package/src/assets/img/icons/mediatype/film.ts +2 -1
  118. package/src/assets/img/icons/mediatype/images.ts +9 -6
  119. package/src/assets/img/icons/mediatype/software.ts +9 -6
  120. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  121. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  122. package/src/assets/img/icons/mediatype/video.ts +10 -6
  123. package/src/assets/img/icons/mediatype/web.ts +9 -6
  124. package/src/collection-browser.ts +490 -105
  125. package/src/collection-facets.ts +325 -109
  126. package/src/mediatype-icon.ts +10 -3
  127. package/src/models.ts +139 -14
  128. package/src/restoration-state-handler.ts +234 -0
  129. package/src/sort-filter-bar/alpha-bar.ts +19 -9
  130. package/src/sort-filter-bar/img/compact.ts +5 -0
  131. package/src/sort-filter-bar/img/list.ts +5 -0
  132. package/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  133. package/src/sort-filter-bar/img/tile.ts +5 -0
  134. package/src/sort-filter-bar/sort-filter-bar.ts +499 -149
  135. package/src/tiles/grid/collection-tile.ts +1 -2
  136. package/src/tiles/grid/item-tile.ts +138 -56
  137. package/src/tiles/list/tile-list-compact-header.ts +75 -0
  138. package/src/tiles/list/tile-list-compact.ts +209 -0
  139. package/src/tiles/list/tile-list.ts +261 -110
  140. package/src/tiles/tile-dispatcher.ts +51 -11
  141. package/src/utils/format-date.ts +1 -2
  142. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  143. package/dist/src/assets/img/icons/audio.js +0 -9
  144. package/dist/src/assets/img/icons/audio.js.map +0 -1
  145. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  146. package/dist/src/assets/img/icons/collection.js +0 -9
  147. package/dist/src/assets/img/icons/collection.js.map +0 -1
  148. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  149. package/dist/src/assets/img/icons/etree.js +0 -9
  150. package/dist/src/assets/img/icons/etree.js.map +0 -1
  151. package/dist/src/assets/img/icons/images.d.ts +0 -1
  152. package/dist/src/assets/img/icons/images.js +0 -10
  153. package/dist/src/assets/img/icons/images.js.map +0 -1
  154. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  155. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  156. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  157. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +0 -1
  158. package/dist/src/assets/img/icons/mediatype/livemusic.js +0 -7
  159. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +0 -1
  160. package/dist/src/assets/img/icons/mediatype/photos.d.ts +0 -1
  161. package/dist/src/assets/img/icons/mediatype/photos.js +0 -7
  162. package/dist/src/assets/img/icons/mediatype/photos.js.map +0 -1
  163. package/dist/src/assets/img/icons/software.d.ts +0 -1
  164. package/dist/src/assets/img/icons/software.js +0 -10
  165. package/dist/src/assets/img/icons/software.js.map +0 -1
  166. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  167. package/dist/src/assets/img/icons/texts.js +0 -10
  168. package/dist/src/assets/img/icons/texts.js.map +0 -1
  169. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  170. package/dist/src/assets/img/icons/tv.js +0 -9
  171. package/dist/src/assets/img/icons/tv.js.map +0 -1
  172. package/dist/src/assets/img/icons/video.d.ts +0 -1
  173. package/dist/src/assets/img/icons/video.js +0 -10
  174. package/dist/src/assets/img/icons/video.js.map +0 -1
  175. package/dist/src/assets/img/icons/web.d.ts +0 -1
  176. package/dist/src/assets/img/icons/web.js +0 -10
  177. package/dist/src/assets/img/icons/web.js.map +0 -1
  178. package/dist/src/utils/format-string.d.ts +0 -2
  179. package/dist/src/utils/format-string.js +0 -7
  180. package/dist/src/utils/format-string.js.map +0 -1
  181. package/dist/test/utils/format-string.test.js +0 -17
  182. package/dist/test/utils/format-string.test.js.map +0 -1
  183. package/src/assets/img/icons/mediatype/foo.svg +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"sort-filter-bar.js","sourceRoot":"","sources":["../../../src/sort-filter-bar/sort-filter-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import { SortParam } from '@internetarchive/search-service';\nimport { LitElement, html, css, nothing, PropertyValues } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { CollectionDisplayMode } from '../models';\nimport './alpha-bar';\n\n@customElement('sort-filter-bar')\nexport class SortFilterBar extends LitElement {\n @property({ type: String }) displayMode: CollectionDisplayMode = 'grid';\n\n @property({ type: String }) sortDirection: 'asc' | 'desc' = 'desc';\n\n @property({ type: String }) sortField = 'week';\n\n @state() titleSelectorVisible: boolean = false;\n\n @state() creatorSelectorVisible: boolean = false;\n\n @state() dateSortSelectorVisible = false;\n\n render() {\n return html`\n <div id=\"sort-bar\">\n <div id=\"sort-selector\">\n <ul>\n <li>\n <button\n @click=${() => {\n this.sortDirection = 'desc';\n }}\n >\n Desc\n </button>\n <button\n @click=${() => {\n this.sortDirection = 'asc';\n }}\n >\n Asc</button\n >Sort By\n </li>\n <li>\n <button\n @click=${() => {\n this.sortField = 'week';\n }}\n >\n Views\n </button>\n </li>\n <li>\n <button\n @click=${() => {\n this.titleSelectorVisible = !this.titleSelectorVisible;\n this.sortField = 'titleSorter';\n }}\n >\n Title\n </button>\n </li>\n <li>\n <button\n @click=${() => {\n this.dateSortSelectorVisible = !this.dateSortSelectorVisible;\n }}\n >\n Date Archived\n </button>\n </li>\n <li>\n <button\n @click=${() => {\n this.creatorSelectorVisible = !this.creatorSelectorVisible;\n this.sortField = 'creatorSorter';\n }}\n >\n Creator\n </button>\n </li>\n </ul>\n </div>\n\n <div id=\"display-style\">\n <ul>\n ${this.displayMode !== 'grid'\n ? html`<li>\n <input type=\"checkbox\" @click=${this.detailSelected} />\n Details\n </li>`\n : nothing}\n\n <li>\n <button id=\"grid-button\" @click=${this.gridSelected}>Grid</button>\n </li>\n <li>\n <button id=\"list-button\" @click=${this.listSelected}>List</button>\n </li>\n </ul>\n </div>\n </div>\n\n ${this.dateSortSelectorVisible ? this.dateSortSelector : nothing}\n ${this.titleSelectorVisible ? this.titleSelectorBar : nothing}\n ${this.creatorSelectorVisible ? this.creatorSelectorBar : nothing}\n `;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('displayMode')) {\n this.displayModeChanged();\n }\n\n if (changed.has('sortDirection') || changed.has('sortField')) {\n this.sortChanged();\n }\n }\n\n private get dateSortSelector() {\n return html`\n <div id=\"date-sort-selector\">\n <ul>\n <li>\n <button\n @click=${() => {\n this.sortField = 'publicdate';\n }}\n >\n Date Archived\n </button>\n </li>\n <li>\n <button\n @click=${() => {\n this.sortField = 'date';\n }}\n >\n Date Published\n </button>\n </li>\n <li>\n <button\n @click=${() => {\n this.sortField = 'reviewdate';\n }}\n >\n Date Reviewed\n </button>\n </li>\n <li>\n <button\n @click=${() => {\n this.sortField = 'addeddate';\n }}\n >\n Date Added\n </button>\n </li>\n </ul>\n </div>\n `;\n }\n\n private get titleSelectorBar() {\n return html` <alpha-bar\n headline=\"Title Starts With\"\n @letterChanged=${this.titleLetterChanged}\n ></alpha-bar>`;\n }\n\n private get creatorSelectorBar() {\n return html` <alpha-bar\n headline=\"Creator Starts With\"\n @letterChanged=${this.creatorLetterChanged}\n ></alpha-bar>`;\n }\n\n private titleLetterChanged(\n e: CustomEvent<{ selectedLetter: string | undefined }>\n ) {\n const event = new CustomEvent('titleLetterChanged', {\n detail: { selectedLetter: e.detail.selectedLetter },\n });\n this.dispatchEvent(event);\n }\n\n private creatorLetterChanged(\n e: CustomEvent<{ selectedLetter: string | undefined }>\n ) {\n const event = new CustomEvent('creatorLetterChanged', {\n detail: { selectedLetter: e.detail.selectedLetter },\n });\n this.dispatchEvent(event);\n }\n\n private gridSelected() {\n this.displayMode = 'grid';\n }\n\n private listSelected() {\n this.displayMode = 'list-compact';\n }\n\n private detailSelected(e: Event) {\n this.displayMode = (e.target as HTMLInputElement).checked\n ? 'list-detail'\n : 'list-compact';\n }\n\n private displayModeChanged() {\n const event = new CustomEvent('displayModeChanged', {\n detail: { displayMode: this.displayMode },\n });\n this.dispatchEvent(event);\n }\n\n private sortChanged() {\n const sort = new SortParam(this.sortField, this.sortDirection);\n const event = new CustomEvent('sortChanged', {\n detail: { sort },\n });\n this.dispatchEvent(event);\n }\n\n static styles = css`\n #sort-bar {\n display: flex;\n justify-content: space-between;\n }\n\n ul {\n list-style: none;\n display: flex;\n margin: 0;\n padding: 0;\n align-items: center;\n }\n\n li {\n padding: 0.5rem 0 0.5rem 0;\n }\n\n #sort-selector li::after {\n content: '•';\n padding-left: 1rem;\n padding-right: 1rem;\n }\n\n #sort-selector li:first-child::after {\n content: '';\n }\n\n #sort-selector li:last-child::after {\n content: '';\n }\n `;\n}\n"]}
1
+ {"version":3,"file":"sort-filter-bar.js","sourceRoot":"","sources":["../../../src/sort-filter-bar/sort-filter-bar.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n LitElement,\n html,\n css,\n nothing,\n PropertyValues,\n TemplateResult,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport {\n CollectionDisplayMode,\n SortField,\n SortFieldDisplayName,\n} from '../models';\nimport './alpha-bar';\n\nimport { sortIcon } from './img/sort-triangle';\nimport { tileIcon } from './img/tile';\nimport { listIcon } from './img/list';\nimport { compactIcon } from './img/compact';\n\n@customElement('sort-filter-bar')\nexport class SortFilterBar\n extends LitElement\n implements SharedResizeObserverResizeHandlerInterface\n{\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: String }) sortDirection: 'asc' | 'desc' | null = null;\n\n @property({ type: String }) selectedSort: SortField = SortField.relevance;\n\n @property({ type: String }) selectedTitleFilter: string | null = null;\n\n @property({ type: String }) selectedCreatorFilter: string | null = null;\n\n @property({ type: Boolean }) showRelevance: boolean = true;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @state() titleSelectorVisible: boolean = false;\n\n @state() creatorSelectorVisible: boolean = false;\n\n @state() dateSortSelectorVisible = false;\n\n @state() desktopSelectorBarWidth = 0;\n\n @state() selectorBarContainerWidth = 0;\n\n @query('#desktop-sort-selector')\n private desktopSortSelector!: HTMLUListElement;\n\n @query('#sort-selector-container')\n private sortSelectorContainer!: HTMLDivElement;\n\n render() {\n return html`\n <div id=\"container\">\n ${this.titleSelectorVisible || this.selectedSort === 'title'\n ? this.titleSelectorBar\n : nothing}\n ${this.creatorSelectorVisible || this.selectedSort === 'creator'\n ? this.creatorSelectorBar\n : nothing}\n\n <div id=\"sort-bar\">\n <div id=\"sort-direction-container\">\n ${this.sortDirectionSelectorTemplate}\n </div>\n\n <div id=\"sort-selector-container\">\n ${this.mobileSortSelectorTemplate}\n ${this.desktopSortSelectorTemplate}\n </div>\n\n <div id=\"display-style-selector\">${this.displayOptionTemplate}</div>\n </div>\n\n ${this.dateSortSelectorVisible ? this.dateSortSelector : nothing}\n\n <div id=\"bottom-shadow\"></div>\n </div>\n `;\n }\n\n updated(changed: PropertyValues) {\n if (changed.has('displayMode')) {\n this.displayModeChanged();\n }\n\n if (changed.has('selectedSort') && this.sortDirection === null) {\n this.sortDirection = 'desc';\n }\n\n if (changed.has('selectedTitleFilter') && this.selectedTitleFilter) {\n this.titleSelectorVisible = true;\n }\n\n if (changed.has('selectedCreatorFilter') && this.selectedCreatorFilter) {\n this.creatorSelectorVisible = true;\n }\n\n if (changed.has('resizeObserver')) {\n const oldObserver = changed.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n if (oldObserver) this.disconnectResizeObserver(oldObserver);\n this.setupResizeObserver();\n }\n }\n\n disconnectedCallback(): void {\n if (this.resizeObserver) {\n this.disconnectResizeObserver(this.resizeObserver);\n }\n }\n\n private disconnectResizeObserver(\n resizeObserver: SharedResizeObserverInterface\n ) {\n resizeObserver.removeObserver({\n target: this.sortSelectorContainer,\n handler: this,\n });\n\n resizeObserver.removeObserver({\n target: this.desktopSortSelector,\n handler: this,\n });\n }\n\n private setupResizeObserver() {\n if (!this.resizeObserver) return;\n this.resizeObserver.addObserver({\n target: this.sortSelectorContainer,\n handler: this,\n });\n\n this.resizeObserver.addObserver({\n target: this.desktopSortSelector,\n handler: this,\n });\n }\n\n private get mobileSelectorVisible() {\n return this.selectorBarContainerWidth - 10 < this.desktopSelectorBarWidth;\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n if (entry.target === this.desktopSortSelector)\n this.desktopSelectorBarWidth = entry.contentRect.width;\n else if (entry.target === this.sortSelectorContainer)\n this.selectorBarContainerWidth = entry.contentRect.width;\n }\n\n private get sortDirectionSelectorTemplate() {\n return html`\n <div id=\"sort-direction-selector\">\n <button\n id=\"sort-ascending-btn\"\n class=\"sort-button ${this.sortDirection === 'asc' ? 'selected' : ''}\"\n ?disabled=${this.selectedSort === 'relevance'}\n @click=${() => {\n this.setSortDirections('asc');\n }}\n >\n ${sortIcon}\n </button>\n <button\n id=\"sort-descending-btn\"\n class=\"sort-button ${this.sortDirection === 'desc' ? 'selected' : ''}\"\n ?disabled=${this.selectedSort === 'relevance'}\n @click=${() => {\n this.setSortDirections('desc');\n }}\n >\n ${sortIcon}\n </button>\n </div>\n `;\n }\n\n private get desktopSortSelectorTemplate() {\n return html`\n <ul\n id=\"desktop-sort-selector\"\n class=${this.mobileSelectorVisible ? 'hidden' : 'visible'}\n >\n <li id=\"sort-by-text\">Sort By</li>\n <li>\n ${this.showRelevance\n ? this.getSortDisplayOption(SortField.relevance)\n : nothing}\n </li>\n <li>${this.getSortDisplayOption(SortField.views)}</li>\n <li>${this.getSortDisplayOption(SortField.title)}</li>\n <li>\n ${this.getSortDisplayOption(SortField.datearchived, {\n additionalClickEvent: () => {\n this.dateSortSelectorVisible = !this.dateSortSelectorVisible;\n },\n displayName: html`${this.dateSortField}`,\n isSelected: () => this.dateOptionSelected,\n })}\n </li>\n <li>\n ${this.getSortDisplayOption(SortField.creator, {\n additionalClickEvent: () => {\n this.creatorSelectorVisible = !this.creatorSelectorVisible;\n },\n })}\n </li>\n </ul>\n `;\n }\n\n /**\n * This generates each of the sort option links.\n *\n * It manages the display value and the selected state of the option.\n *\n * @param sortField\n * @param options {\n * additionalClickEvent?: () => void; If this is provided, it will also be called when the option is clicked.\n * displayName?: TemplateResult; The name to display for the option. Defaults to the sortField display name.\n * isSelected?: () => boolean; A function that returns true if the option is selected. Defaults to the selectedSort === sortField.\n * }\n * @returns\n */\n private getSortDisplayOption(\n sortField: SortField,\n options?: {\n additionalClickEvent?: (e: Event) => void;\n isSelected?: () => boolean;\n displayName?: TemplateResult;\n }\n ): TemplateResult {\n const isSelected =\n options?.isSelected ?? (() => this.selectedSort === sortField);\n const displayName = options?.displayName ?? SortFieldDisplayName[sortField];\n return html`\n <a\n href=\"#\"\n @click=${(e: Event) => {\n e.preventDefault();\n this.setSelectedSort(sortField);\n options?.additionalClickEvent?.(e);\n }}\n class=${isSelected() ? 'selected' : ''}\n >\n ${displayName}\n </a>\n `;\n }\n\n private get mobileSortSelectorTemplate() {\n return html`\n <select\n id=\"mobile-sort-selector\"\n @change=${this.mobileSortChanged}\n class=${this.mobileSelectorVisible ? 'visible' : 'hidden'}\n >\n ${Object.keys(SortField).map(\n field => html`\n <option value=\"${field}\" ?selected=${this.selectedSort === field}>\n ${SortFieldDisplayName[field as SortField]}\n </option>\n `\n )}\n </select>\n `;\n }\n\n private mobileSortChanged(e: Event) {\n const target = e.target as HTMLSelectElement;\n this.setSelectedSort(target.value as SortField);\n }\n\n private get displayOptionTemplate() {\n return html`\n <ul>\n <li>\n <button\n id=\"grid-button\"\n @click=${() => {\n this.displayMode = 'grid';\n }}\n class=${this.displayMode === 'grid' ? 'active' : ''}\n >\n ${tileIcon}\n </button>\n </li>\n <li>\n <button\n id=\"grid-button\"\n @click=${() => {\n this.displayMode = 'list-detail';\n }}\n class=${this.displayMode === 'list-detail' ? 'active' : ''}\n >\n ${listIcon}\n </button>\n </li>\n <li>\n <button\n id=\"list-button\"\n @click=${() => {\n this.displayMode = 'list-compact';\n }}\n class=${this.displayMode === 'list-compact' ? 'active' : ''}\n >\n ${compactIcon}\n </button>\n </li>\n </ul>\n `;\n }\n\n private get dateSortSelector() {\n return html`\n <div id=\"date-sort-selector\">\n <ul>\n <li>${this.getDateSortButton(SortField.datearchived)}</li>\n <li>${this.getDateSortButton(SortField.datepublished)}</li>\n <li>${this.getDateSortButton(SortField.datereviewed)}</li>\n <li>${this.getDateSortButton(SortField.dateadded)}</li>\n </ul>\n </div>\n `;\n }\n\n private getDateSortButton(sortField: SortField) {\n return html`\n <button\n @click=${() => {\n this.selectDateSort(sortField);\n }}\n >\n ${SortFieldDisplayName[sortField]}\n </button>\n `;\n }\n\n private selectDateSort(sortField: SortField) {\n this.dateSortSelectorVisible = false;\n this.setSelectedSort(sortField);\n }\n\n private setSortDirections(sortDirection: 'asc' | 'desc') {\n this.sortDirection = sortDirection;\n this.emitSortChangedEvent();\n }\n\n private setSelectedSort(sort: SortField) {\n this.selectedSort = sort;\n this.emitSortChangedEvent();\n }\n\n /**\n * There are four date sort options.\n *\n * This checks to see if the current sort is one of them.\n *\n * @readonly\n * @private\n * @type {boolean}\n * @memberof SortFilterBar\n */\n private get dateOptionSelected(): boolean {\n return [\n 'datearchived',\n 'datepublished',\n 'datereviewed',\n 'dateadded',\n ].includes(this.selectedSort);\n }\n\n /**\n * The display name of the current date field\n *\n * @readonly\n * @private\n * @type {string}\n * @memberof SortFilterBar\n */\n private get dateSortField(): string {\n const defaultSort = SortFieldDisplayName[SortField.datearchived];\n return this.dateOptionSelected\n ? SortFieldDisplayName[this.selectedSort] ?? defaultSort\n : defaultSort;\n }\n\n private get titleSelectorBar() {\n return html` <alpha-bar\n .selectedLetter=${this.selectedTitleFilter}\n @letterChanged=${this.titleLetterChanged}\n ></alpha-bar>`;\n }\n\n private get creatorSelectorBar() {\n return html` <alpha-bar\n .selectedLetter=${this.selectedCreatorFilter}\n @letterChanged=${this.creatorLetterChanged}\n ></alpha-bar>`;\n }\n\n private titleLetterChanged(\n e: CustomEvent<{ selectedLetter: string | undefined }>\n ) {\n const event = new CustomEvent('titleLetterChanged', {\n detail: { selectedLetter: e.detail.selectedLetter },\n });\n this.dispatchEvent(event);\n }\n\n private creatorLetterChanged(\n e: CustomEvent<{ selectedLetter: string | undefined }>\n ) {\n const event = new CustomEvent('creatorLetterChanged', {\n detail: { selectedLetter: e.detail.selectedLetter },\n });\n this.dispatchEvent(event);\n }\n\n private displayModeChanged() {\n const event = new CustomEvent('displayModeChanged', {\n detail: { displayMode: this.displayMode },\n });\n this.dispatchEvent(event);\n }\n\n private emitSortChangedEvent() {\n const event = new CustomEvent<{\n selectedSort: SortField;\n sortDirection: 'asc' | 'desc' | null;\n }>('sortChanged', {\n detail: {\n selectedSort: this.selectedSort,\n sortDirection: this.sortDirection,\n },\n });\n this.dispatchEvent(event);\n }\n\n static styles = css`\n #sort-bar {\n display: flex;\n justify-content: space-between;\n border: 1px solid rgb(232, 232, 232);\n align-items: center;\n padding: 0.5rem 1.5rem;\n }\n\n #sort-direction-container {\n flex: 0;\n }\n\n #sort-by-text {\n text-transform: uppercase;\n }\n\n #bottom-shadow {\n height: 1px;\n width: 100%;\n box-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);\n background-color: #bbb;\n }\n\n ul {\n list-style: none;\n display: flex;\n margin: 0;\n padding: 0;\n align-items: center;\n }\n\n li {\n padding: 0;\n }\n\n .sort-button {\n background: none;\n color: inherit;\n border: none;\n padding: 0;\n cursor: pointer;\n outline: inherit;\n width: 12px;\n height: 12px;\n opacity: 0.5;\n }\n\n .sort-button.selected {\n opacity: 1;\n }\n\n .sort-button:disabled {\n opacity: 0.25;\n cursor: default;\n }\n\n #show-details {\n text-transform: uppercase;\n cursor: pointer;\n display: flex;\n }\n\n #show-details input {\n margin-right: 0.5rem;\n flex: 0 0 12px;\n }\n\n #sort-descending-btn {\n transform: rotate(180deg);\n }\n\n #sort-direction-selector {\n display: flex;\n flex-direction: column;\n gap: 3px;\n margin-right: 1rem;\n }\n\n #sort-selector-container {\n flex: 1;\n }\n\n /*\n we move the desktop sort selector offscreen instead of display: none\n because we need to observe the width of it vs its container to determine\n if it's wide enough to display the desktop version and if you displY: none,\n the width becomes 0\n */\n #desktop-sort-selector.hidden {\n position: absolute;\n top: -9999px;\n left: -9999px;\n }\n\n #mobile-sort-selector.hidden {\n display: none;\n }\n\n #desktop-sort-selector {\n display: inline-flex;\n }\n\n #desktop-sort-selector li {\n display: flex;\n align-items: center;\n }\n\n #desktop-sort-selector li a {\n text-decoration: none;\n text-transform: uppercase;\n font-size: 1.4rem;\n color: #333;\n }\n\n #desktop-sort-selector li a.selected {\n font-weight: bold;\n }\n\n #desktop-sort-selector li::after {\n content: '•';\n padding-left: 1rem;\n padding-right: 1rem;\n }\n\n #desktop-sort-selector li:first-child::after {\n content: '';\n }\n\n #desktop-sort-selector li:last-child::after {\n content: '';\n }\n\n #display-style-selector {\n flex: 0;\n }\n\n #display-style-selector button {\n background: none;\n color: inherit;\n border: none;\n appearance: none;\n cursor: pointer;\n -webkit-appearance: none;\n opacity: 0.5;\n }\n\n #display-style-selector button.active {\n opacity: 1;\n }\n\n #display-style-selector button svg {\n width: 24px;\n height: 24px;\n }\n `;\n}\n"]}
@@ -1,5 +1,5 @@
1
1
  import { __decorate } from "tslib";
2
- import { localized, msg } from '@lit/localize';
2
+ import { msg } from '@lit/localize';
3
3
  import { css, html, LitElement } from 'lit';
4
4
  import { customElement, property } from 'lit/decorators.js';
5
5
  import { collectionIcon } from '../../assets/img/icons/mediatype/collection';
@@ -153,7 +153,6 @@ __decorate([
153
153
  property({ type: Object })
154
154
  ], CollectionTile.prototype, "model", void 0);
155
155
  CollectionTile = __decorate([
156
- localized(),
157
156
  customElement('collection-tile')
158
157
  ], CollectionTile);
159
158
  export { CollectionTile };
@@ -1 +1 @@
1
- {"version":3,"file":"collection-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/collection-tile.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAK7E,IAAa,cAAc,GAA3B,MAAa,cAAe,SAAQ,UAAU;IAG5C,MAAM;;QACJ,OAAO,IAAI,CAAA;;;uCAGwB,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK;;;;8EAIsB,MAAA,IAAI;aACjE,KAAK,0CAAE,UAAU;;;;;iDAKe,cAAc;;mCAE5B,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,CAAC,cAAc,EAAE;mCACtC,GAAG,CAAC,OAAO,CAAC;;;;KAI1C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,MAAM,eAAe,GAAG,GAAG,CAAA,wCAAwC,CAAC;QAEpE,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;kCA0BoB,eAAe;mCACd,eAAe;;;;;;;;;;;;;;;;;;;;;;;yBAuBzB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;qCAwBH,eAAe;sCACd,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyChD,CAAC;IACJ,CAAC;CACF,CAAA;AAnJ6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAmB;AADnC,cAAc;IAF1B,SAAS,EAAE;IACX,aAAa,CAAC,iBAAiB,CAAC;GACpB,cAAc,CAoJ1B;SApJY,cAAc","sourcesContent":["import { localized, msg } from '@lit/localize';\nimport { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { collectionIcon } from '../../assets/img/icons/mediatype/collection';\nimport { TileModel } from '../../models';\n\n@localized()\n@customElement('collection-tile')\nexport class CollectionTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n render() {\n return html`\n <div id=\"container\">\n <div id=\"collection-image-title\">\n <div id=\"collection-title\">${this.model?.title}</div>\n <div id=\"collection-image-container\">\n <div\n id=\"collection-image\"\n style=\"background-image:url('https://archive.org/services/img/${this\n .model?.identifier}')\"\n ></div>\n </div>\n </div>\n <div id=\"item-count-container\">\n <div id=\"item-count-image-container\">${collectionIcon}</div>\n <div id=\"item-count-stacked-text\">\n <div id=\"item-count\">${this.model?.itemCount.toLocaleString()}</div>\n <div id=\"items-text\">${msg('items')}</div>\n </div>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;\n\n return css`\n #collection-image-container {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n\n #collection-image {\n width: 16rem;\n height: 16rem;\n border-radius: 0.8rem;\n overflow: hidden;\n box-shadow: 1px 1px 2px 0px;\n object-fit: cover;\n background-position: center;\n background-size: cover;\n }\n\n #item-count-image-container svg {\n filter: invert(100%);\n }\n\n #collection-image-title {\n background-color: #666;\n border: 1px solid #2c2c2c;\n padding: 0.5rem;\n border-top-left-radius: ${cornerRadiusCss};\n border-top-right-radius: ${cornerRadiusCss};\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n #collection-title {\n font-weight: bold;\n color: #fff;\n font-size: 1.6rem;\n text-align: center;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 2rem;\n height: 4rem;\n }\n\n #container {\n box-shadow: 1px 1px 2px 0px;\n border-radius: ${cornerRadiusCss};\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n #container:hover > #collection-image-title > #collection-title {\n text-decoration: underline;\n }\n\n /* this is a workaround for Safari 15 where the hover effects are not working */\n #collection-image-title:hover > #collection-title {\n text-decoration: underline;\n }\n\n #container:hover > #collection-image-title {\n background-color: #757575;\n }\n\n #item-count-container {\n background-color: #444;\n border-bottom: 1px solid #2c2c2c;\n border-left: 1px solid #2c2c2c;\n border-right: 1px solid #2c2c2c;\n border-bottom-left-radius: ${cornerRadiusCss};\n border-bottom-right-radius: ${cornerRadiusCss};\n display: flex;\n padding: 0rem 0.5rem;\n height: 5.5rem;\n align-items: center;\n }\n\n #item-count-image-container {\n margin-right: 0.5rem;\n }\n\n #item-count-stacked-text {\n display: flex;\n align-items: baseline;\n color: #fff;\n }\n #item-count-image-container svg {\n height: 2.5rem;\n align-items: baseline;\n }\n\n #container:hover > #item-count-container {\n background-color: #575757;\n }\n\n #item-count {\n font-size: 1.4rem;\n font-weight: bold;\n }\n\n #item-count-image {\n width: 3rem;\n height: 3rem;\n margin-right: 1rem;\n }\n\n #items-text {\n font-size: 1.4rem;\n font-weight: bold;\n margin-left: 0.5rem;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"collection-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/collection-tile.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,eAAe,CAAC;AACpC,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,MAAM,6CAA6C,CAAC;AAI7E,IAAa,cAAc,GAA3B,MAAa,cAAe,SAAQ,UAAU;IAG5C,MAAM;;QACJ,OAAO,IAAI,CAAA;;;uCAGwB,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK;;;;8EAIsB,MAAA,IAAI;aACjE,KAAK,0CAAE,UAAU;;;;;iDAKe,cAAc;;mCAE5B,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,CAAC,cAAc,EAAE;mCACtC,GAAG,CAAC,OAAO,CAAC;;;;KAI1C,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,MAAM,eAAe,GAAG,GAAG,CAAA,wCAAwC,CAAC;QAEpE,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;kCA0BoB,eAAe;mCACd,eAAe;;;;;;;;;;;;;;;;;;;;;;;yBAuBzB,eAAe;;;;;;;;;;;;;;;;;;;;;;;;qCAwBH,eAAe;sCACd,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAyChD,CAAC;IACJ,CAAC;CACF,CAAA;AAnJ6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAmB;AADnC,cAAc;IAD1B,aAAa,CAAC,iBAAiB,CAAC;GACpB,cAAc,CAoJ1B;SApJY,cAAc","sourcesContent":["import { msg } from '@lit/localize';\nimport { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { collectionIcon } from '../../assets/img/icons/mediatype/collection';\nimport { TileModel } from '../../models';\n\n@customElement('collection-tile')\nexport class CollectionTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n render() {\n return html`\n <div id=\"container\">\n <div id=\"collection-image-title\">\n <div id=\"collection-title\">${this.model?.title}</div>\n <div id=\"collection-image-container\">\n <div\n id=\"collection-image\"\n style=\"background-image:url('https://archive.org/services/img/${this\n .model?.identifier}')\"\n ></div>\n </div>\n </div>\n <div id=\"item-count-container\">\n <div id=\"item-count-image-container\">${collectionIcon}</div>\n <div id=\"item-count-stacked-text\">\n <div id=\"item-count\">${this.model?.itemCount.toLocaleString()}</div>\n <div id=\"items-text\">${msg('items')}</div>\n </div>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;\n\n return css`\n #collection-image-container {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n\n #collection-image {\n width: 16rem;\n height: 16rem;\n border-radius: 0.8rem;\n overflow: hidden;\n box-shadow: 1px 1px 2px 0px;\n object-fit: cover;\n background-position: center;\n background-size: cover;\n }\n\n #item-count-image-container svg {\n filter: invert(100%);\n }\n\n #collection-image-title {\n background-color: #666;\n border: 1px solid #2c2c2c;\n padding: 0.5rem;\n border-top-left-radius: ${cornerRadiusCss};\n border-top-right-radius: ${cornerRadiusCss};\n display: flex;\n flex-direction: column;\n flex: 1;\n }\n\n #collection-title {\n font-weight: bold;\n color: #fff;\n font-size: 1.6rem;\n text-align: center;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 2rem;\n height: 4rem;\n }\n\n #container {\n box-shadow: 1px 1px 2px 0px;\n border-radius: ${cornerRadiusCss};\n height: 100%;\n display: flex;\n flex-direction: column;\n }\n\n #container:hover > #collection-image-title > #collection-title {\n text-decoration: underline;\n }\n\n /* this is a workaround for Safari 15 where the hover effects are not working */\n #collection-image-title:hover > #collection-title {\n text-decoration: underline;\n }\n\n #container:hover > #collection-image-title {\n background-color: #757575;\n }\n\n #item-count-container {\n background-color: #444;\n border-bottom: 1px solid #2c2c2c;\n border-left: 1px solid #2c2c2c;\n border-right: 1px solid #2c2c2c;\n border-bottom-left-radius: ${cornerRadiusCss};\n border-bottom-right-radius: ${cornerRadiusCss};\n display: flex;\n padding: 0rem 0.5rem;\n height: 5.5rem;\n align-items: center;\n }\n\n #item-count-image-container {\n margin-right: 0.5rem;\n }\n\n #item-count-stacked-text {\n display: flex;\n align-items: baseline;\n color: #fff;\n }\n #item-count-image-container svg {\n height: 2.5rem;\n align-items: baseline;\n }\n\n #container:hover > #item-count-container {\n background-color: #575757;\n }\n\n #item-count {\n font-size: 1.4rem;\n font-weight: bold;\n }\n\n #item-count-image {\n width: 3rem;\n height: 3rem;\n margin-right: 1rem;\n }\n\n #items-text {\n font-size: 1.4rem;\n font-weight: bold;\n margin-left: 0.5rem;\n }\n `;\n }\n}\n"]}
@@ -1,8 +1,12 @@
1
1
  import { CSSResultGroup, LitElement } from 'lit';
2
+ import '@internetarchive/collection-name-cache';
3
+ import { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
2
4
  import { TileModel } from '../../models';
3
5
  import '../../mediatype-icon';
4
6
  export declare class ItemTile extends LitElement {
5
7
  model?: TileModel;
8
+ baseNavigationUrl?: string;
9
+ collectionNameCache?: CollectionNameCacheInterface;
6
10
  get renderItemImageView(): import("lit-html").TemplateResult<1>;
7
11
  render(): import("lit-html").TemplateResult<1>;
8
12
  static get styles(): CSSResultGroup;
@@ -1,6 +1,8 @@
1
1
  import { __decorate } from "tslib";
2
+ /* eslint-disable import/no-duplicates */
2
3
  import { css, html, LitElement } from 'lit';
3
4
  import { customElement, property } from 'lit/decorators.js';
5
+ import '@internetarchive/collection-name-cache';
4
6
  import { formatCount } from '../../utils/format-count';
5
7
  import '../../mediatype-icon';
6
8
  import { favoriteFilledIcon } from './icons/favorite-filled';
@@ -9,34 +11,47 @@ import viewsIcon from './icons/views';
9
11
  let ItemTile = class ItemTile extends LitElement {
10
12
  get renderItemImageView() {
11
13
  var _a, _b;
12
- const imgSrcUrl = `https://archive.org/services/img/${(_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier}`;
13
- const containsDeemphasize = (_b = this.model) === null || _b === void 0 ? void 0 : _b.collection.includes('deemphasize');
14
- return !containsDeemphasize
15
- ? html `<div
16
- id="item-image"
14
+ const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${(_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier}`;
15
+ const containsDeemphasize = (_b = this.model) === null || _b === void 0 ? void 0 : _b.collections.includes('deemphasize');
16
+ const itemImageBoxClass = containsDeemphasize ? 'item-image-box' : '';
17
+ const itemImageClass = `item-image ${!containsDeemphasize ? 'default' : 'deemphasize'}`;
18
+ const tileActionClass = `tile-action no-preview${!containsDeemphasize ? ' hidden' : ''}`;
19
+ return html `
20
+ <div class=${itemImageBoxClass}>
21
+ <div
22
+ class=${itemImageClass}
17
23
  style="background-image:url(${imgSrcUrl})"
18
- ></div>`
19
- : html `<div id="item-image-box">
20
- <div
21
- id="item-image-deemphasize"
22
- style="background-image:url(${imgSrcUrl})"
23
- ></div>
24
- <div class="tile-action no-preview">Content may be inappropriate</div>
25
- </div>`;
24
+ ></div>
25
+ <div class=${tileActionClass}>Content may be inappropriate</div>
26
+ </div>
27
+ `;
26
28
  }
27
29
  render() {
28
- var _a, _b, _c, _d, _e, _f, _g;
29
- const itemTitle = ((_a = this.model) === null || _a === void 0 ? void 0 : _a.title) || '';
30
- const itemCreator = ((_b = this.model) === null || _b === void 0 ? void 0 : _b.creator) || '-';
30
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j;
31
+ const collectionIdentifier = (_a = this.model) === null || _a === void 0 ? void 0 : _a.collections[0];
32
+ const collectionUrl = `${this.baseNavigationUrl}/details/${collectionIdentifier}`;
33
+ const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${(_b = this.model) === null || _b === void 0 ? void 0 : _b.collections[0]}`;
34
+ const itemTitle = ((_c = this.model) === null || _c === void 0 ? void 0 : _c.title) || '';
35
+ const itemCreator = ((_d = this.model) === null || _d === void 0 ? void 0 : _d.creator) || '-';
31
36
  return html `
32
37
  <div id="container">
33
- <div id="title-image-container">
34
- <p id="item-title" title=${itemTitle}>
35
- ${(_c = this.model) === null || _c === void 0 ? void 0 : _c.title}
36
- </p>
37
- <div id="item-image-container">
38
- ${this.renderItemImageView}
38
+ <a href=${collectionUrl}>
39
+ <div id="stealth-popup">
40
+ <div
41
+ id="collection-thumbnail"
42
+ style="background-image:url(${imgSrcUrl})"
43
+ ></div>
44
+ <div id="collection-title-text">
45
+ <async-collection-name
46
+ .collectionNameCache=${this.collectionNameCache}
47
+ .identifier=${collectionIdentifier}
48
+ ></async-collection-name>
49
+ </div>
39
50
  </div>
51
+ </a>
52
+ <div id="title-image-container">
53
+ <h1 id="item-title" title=${itemTitle}>${(_e = this.model) === null || _e === void 0 ? void 0 : _e.title}</h1>
54
+ <div id="item-image-container">${this.renderItemImageView}</div>
40
55
  <div class="item-creator">
41
56
  <span id="text-by">By:</span>
42
57
  <span>${itemCreator}</span>
@@ -45,19 +60,29 @@ let ItemTile = class ItemTile extends LitElement {
45
60
  <div id="item-stats-container">
46
61
  <div id="stats-holder">
47
62
  <div class="col">
48
- <mediatype-icon mediatype="${(_d = this.model) === null || _d === void 0 ? void 0 : _d.mediatype}" showText="true">
63
+ <mediatype-icon
64
+ .mediatype=${(_f = this.model) === null || _f === void 0 ? void 0 : _f.mediatype}
65
+ ?showText=${true}
66
+ >
67
+ </mediatype-icon>
49
68
  </div>
50
69
  <div class="col">
51
70
  ${viewsIcon}
52
- <p class="status-text">${formatCount((_e = this.model) === null || _e === void 0 ? void 0 : _e.viewCount, 'short', 'short')}</p>
71
+ <p class="status-text">
72
+ ${formatCount((_g = this.model) === null || _g === void 0 ? void 0 : _g.viewCount, 'short', 'short')}
73
+ </p>
53
74
  </div>
54
75
  <div class="col">
55
76
  ${favoriteFilledIcon}
56
- <p class="status-text">${formatCount((_f = this.model) === null || _f === void 0 ? void 0 : _f.itemCount, 'short', 'short')}</p>
77
+ <p class="status-text">
78
+ ${formatCount((_h = this.model) === null || _h === void 0 ? void 0 : _h.itemCount, 'short', 'short')}
79
+ </p>
57
80
  </div>
58
81
  <div class="col">
59
82
  ${reviewsIcon}
60
- <p class="status-text">${formatCount((_g = this.model) === null || _g === void 0 ? void 0 : _g.favCount, 'short', 'short')}</p>
83
+ <p class="status-text">
84
+ ${formatCount((_j = this.model) === null || _j === void 0 ? void 0 : _j.favCount, 'short', 'short')}
85
+ </p>
61
86
  </div>
62
87
  </div>
63
88
  </div>
@@ -74,6 +99,11 @@ let ItemTile = class ItemTile extends LitElement {
74
99
  display: flex;
75
100
  flex-direction: column;
76
101
  height: 100%;
102
+ position: relative;
103
+ }
104
+
105
+ mediatype-icon {
106
+ --iconHeight: 10px;
77
107
  }
78
108
 
79
109
  #title-image-container {
@@ -105,41 +135,39 @@ let ItemTile = class ItemTile extends LitElement {
105
135
  flex: 1;
106
136
  }
107
137
 
108
- #item-image {
138
+ .item-image-box {
109
139
  width: 16rem;
110
140
  height: 16rem;
111
- border-radius: 0.8rem;
112
141
  overflow: hidden;
142
+ position: relative;
113
143
  box-shadow: 1px 1px 2px 0px;
114
- object-fit: cover;
115
- background-position: center;
116
- background-size: cover;
144
+ display: flex;
117
145
  }
118
146
 
119
- #item-image-box {
147
+ .item-image {
120
148
  width: 16rem;
121
149
  height: 16rem;
122
- border-radius: 0.8rem;
123
- overflow: hidden;
124
- box-shadow: 1px 1px 2px 0px;
125
- border: 5px solid #0000000;
150
+ object-fit: cover;
151
+ background-repeat: no-repeat;
152
+ background-position: center center;
126
153
  position: relative;
127
- display: flex;
154
+ -webkit-appearance: none;
155
+ overflow: visible;
128
156
  }
129
157
 
130
- #item-image-deemphasize {
131
- width: 16rem;
132
- height: 16rem;
133
- object-fit: cover;
134
- background-position: center;
158
+ .default {
159
+ background-size: contain;
160
+ filter: drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.8));
161
+ }
162
+
163
+ .deemphasize {
135
164
  background-size: cover;
136
165
  filter: blur(15px);
137
- position: absolute;
138
166
  z-index: 1;
139
167
  }
140
168
 
141
169
  .tile-action {
142
- border: 2px solid currentColor;
170
+ border: 1px solid currentColor;
143
171
  border-radius: 1px;
144
172
  padding: 5px;
145
173
  font-weight: 500;
@@ -175,7 +203,6 @@ let ItemTile = class ItemTile extends LitElement {
175
203
  background-color: #fcfcfc;
176
204
  }
177
205
 
178
- /** creator **/
179
206
  .item-creator {
180
207
  color: #000000;
181
208
  display: -webkit-box;
@@ -227,12 +254,74 @@ let ItemTile = class ItemTile extends LitElement {
227
254
  .col {
228
255
  width: 25%;
229
256
  }
257
+
258
+ #container:hover #stealth-popup {
259
+ margin-top: -25px;
260
+ visibility: visible;
261
+ opacity: 1;
262
+ }
263
+
264
+ #stealth-popup {
265
+ transition: margin-top 0.3s ease, opacity 0.3s ease;
266
+ position: absolute;
267
+ visibility: hidden;
268
+ margin-left: -10px;
269
+ text-align: left;
270
+ display: flex;
271
+ padding: 5px;
272
+ width: 96%;
273
+ background: #f5f5f7 100%;
274
+ border: 1px #2c2c2c;
275
+ border-radius: ${cornerRadiusCss};
276
+ box-shadow: 1px 1px 2px 0px;
277
+ }
278
+
279
+ #collection-thumbnail {
280
+ display: flex;
281
+ transition: opacity 0.3s ease;
282
+ width: 3rem;
283
+ height: 3rem;
284
+ flex: 0 0 3rem;
285
+ border-radius: 8px;
286
+ border: 1px solid #ddd;
287
+ overflow: hidden;
288
+ background-size: cover;
289
+ background-repeat: no-repeat;
290
+ background-position: center center;
291
+ }
292
+
293
+ #collection-title-text {
294
+ line-height: 1;
295
+ font-size: 16px;
296
+ font-weight: bold;
297
+ text-align: left;
298
+ padding-left: 0.5rem;
299
+ padding-right: 0.5rem;
300
+ height: 3.5rem;
301
+ display: -webkit-box;
302
+ overflow: hidden;
303
+ text-overflow: ellipsis;
304
+ -webkit-line-clamp: 2;
305
+ -webkit-box-orient: vertical;
306
+ }
307
+
308
+ a {
309
+ color: #333;
310
+ text-decoration: none;
311
+ display: block;
312
+ }
230
313
  `;
231
314
  }
232
315
  };
233
316
  __decorate([
234
317
  property({ type: Object })
235
318
  ], ItemTile.prototype, "model", void 0);
319
+ __decorate([
320
+ property({ type: String })
321
+ ], ItemTile.prototype, "baseNavigationUrl", void 0);
322
+ __decorate([
323
+ property({ type: Object })
324
+ ], ItemTile.prototype, "collectionNameCache", void 0);
236
325
  ItemTile = __decorate([
237
326
  customElement('item-tile')
238
327
  ], ItemTile);
@@ -1 +1 @@
1
- {"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAkB,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD,OAAO,sBAAsB,CAAC;AAE9B,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,SAAS,MAAM,eAAe,CAAC;AAGtC,IAAa,QAAQ,GAArB,MAAa,QAAS,SAAQ,UAAU;IAGtC,IAAI,mBAAmB;;QACrB,MAAM,SAAS,GAAG,oCAAoC,MAAA,IAAI,CAAC,KAAK,0CAAE,UAAU,EAAE,CAAC;QAC/E,MAAM,mBAAmB,GAAG,MAAA,IAAI,CAAC,KAAK,0CAAE,UAAU,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;QAC3E,OAAO,CAAC,mBAAmB;YACzB,CAAC,CAAC,IAAI,CAAA;;wCAE4B,SAAS;gBACjC;YACV,CAAC,CAAC,IAAI,CAAA;;;0CAG8B,SAAS;;;eAGpC,CAAC;IACd,CAAC;IAED,MAAM;;QACJ,MAAM,SAAS,GAAG,CAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK,KAAI,EAAE,CAAC;QAC1C,MAAM,WAAW,GAAG,CAAA,MAAA,IAAI,CAAC,KAAK,0CAAE,OAAO,KAAI,GAAG,CAAC;QAE/C,OAAO,IAAI,CAAA;;;qCAGsB,SAAS;cAChC,MAAA,IAAI,CAAC,KAAK,0CAAE,KAAK;;;cAGjB,IAAI,CAAC,mBAAmB;;;;oBAIlB,WAAW;;;;;;2CAOf,MAAA,IAAI,CAAC,KAAK,0CAAE,SACd;;;gBAGE,SAAS;uCACc,WAAW,CAClC,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,EACrB,OAAO,EACP,OAAO,CACR;;;gBAGC,kBAAkB;uCACK,WAAW,CAClC,MAAA,IAAI,CAAC,KAAK,0CAAE,SAAS,EACrB,OAAO,EACP,OAAO,CACR;;;gBAGC,WAAW;uCACY,WAAW,CAClC,MAAA,IAAI,CAAC,KAAK,0CAAE,QAAQ,EACpB,OAAO,EACP,OAAO,CACR;;;;;KAKV,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,MAAM;QACf,MAAM,eAAe,GAAG,GAAG,CAAA,wCAAwC,CAAC;QAEpE,OAAO,GAAG,CAAA;;;yBAGW,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA8JnC,CAAC;IACJ,CAAC;CACF,CAAA;AAhP6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;uCAAmB;AADnC,QAAQ;IADpB,aAAa,CAAC,WAAW,CAAC;GACd,QAAQ,CAiPpB;SAjPY,QAAQ","sourcesContent":["import { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { TileModel } from '../../models';\nimport { formatCount } from '../../utils/format-count';\n\nimport '../../mediatype-icon';\n\nimport { favoriteFilledIcon } from './icons/favorite-filled';\nimport { reviewsIcon } from './icons/reviews';\nimport viewsIcon from './icons/views';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n get renderItemImageView() {\n const imgSrcUrl = `https://archive.org/services/img/${this.model?.identifier}`;\n const containsDeemphasize = this.model?.collection.includes('deemphasize');\n return !containsDeemphasize\n ? html`<div\n id=\"item-image\"\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>`\n : html`<div id=\"item-image-box\">\n <div\n id=\"item-image-deemphasize\"\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>\n <div class=\"tile-action no-preview\">Content may be inappropriate</div>\n </div>`;\n }\n\n render() {\n const itemTitle = this.model?.title || '';\n const itemCreator = this.model?.creator || '-';\n\n return html`\n <div id=\"container\">\n <div id=\"title-image-container\">\n <p id=\"item-title\" title=${itemTitle}>\n ${this.model?.title}\n </p>\n <div id=\"item-image-container\">\n ${this.renderItemImageView}\n </div>\n <div class=\"item-creator\">\n <span id=\"text-by\">By:</span>\n <span>${itemCreator}</span>\n </div>\n </div>\n <div id=\"item-stats-container\">\n <div id=\"stats-holder\">\n <div class=\"col\">\n <mediatype-icon mediatype=\"${\n this.model?.mediatype\n }\" showText=\"true\">\n </div>\n <div class=\"col\">\n ${viewsIcon}\n <p class=\"status-text\">${formatCount(\n this.model?.viewCount,\n 'short',\n 'short'\n )}</p>\n </div>\n <div class=\"col\">\n ${favoriteFilledIcon}\n <p class=\"status-text\">${formatCount(\n this.model?.itemCount,\n 'short',\n 'short'\n )}</p>\n </div>\n <div class=\"col\">\n ${reviewsIcon}\n <p class=\"status-text\">${formatCount(\n this.model?.favCount,\n 'short',\n 'short'\n )}</p>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;\n\n return css`\n #container {\n background-color: #ffffff;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n flex-direction: column;\n height: 100%;\n }\n\n #title-image-container {\n display: flex;\n flex: 1;\n flex-direction: column;\n padding: 0.5rem;\n }\n\n #item-title {\n font-weight: bold;\n color: #000000;\n font-size: 1.6rem;\n text-align: center;\n margin-top: 0rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 2rem;\n height: 4rem;\n }\n\n #item-image-container {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n\n #item-image {\n width: 16rem;\n height: 16rem;\n border-radius: 0.8rem;\n overflow: hidden;\n box-shadow: 1px 1px 2px 0px;\n object-fit: cover;\n background-position: center;\n background-size: cover;\n }\n\n #item-image-box {\n width: 16rem;\n height: 16rem;\n border-radius: 0.8rem;\n overflow: hidden;\n box-shadow: 1px 1px 2px 0px;\n border: 5px solid #0000000;\n position: relative;\n display: flex;\n }\n\n #item-image-deemphasize {\n width: 16rem;\n height: 16rem;\n object-fit: cover;\n background-position: center;\n background-size: cover;\n filter: blur(15px);\n position: absolute;\n z-index: 1;\n }\n\n .tile-action {\n border: 2px solid currentColor;\n border-radius: 1px;\n padding: 5px;\n font-weight: 500;\n width: auto;\n position: absolute;\n z-index: 2;\n display: flex;\n top: 5.5rem;\n }\n\n .no-preview {\n background-color: #fffecb;\n color: #000000;\n font-size: 1.4rem;\n line-height: 2rem;\n text-align: center;\n }\n\n .hidden {\n display: none;\n }\n\n #container:hover > #title-image-container > .item-title {\n text-decoration: underline;\n }\n\n /** this is a workaround for Safari 15 where the hover effects are not working */\n #title-image-container:hover > #item-title {\n text-decoration: underline;\n }\n\n #container:hover > #item-title {\n background-color: #fcfcfc;\n }\n\n /** creator **/\n .item-creator {\n color: #000000;\n display: -webkit-box;\n font-size: 1.4rem;\n height: 3rem;\n margin: 0px;\n overflow: hidden;\n padding: 0.5rem;\n text-align: center;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n #text-by {\n font-weight: bold;\n }\n\n #item-stats-container {\n align-items: center;\n display: flex;\n height: 5.5rem;\n padding-left: 1rem;\n padding-right: 0.5rem;\n }\n\n #stats-holder {\n align-items: center;\n display: flex;\n flex: 1;\n justify-content: space-evenly;\n text-align: center;\n width: 100%;\n }\n\n svg {\n height: 10px;\n width: 10px;\n }\n\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: center;\n }\n\n .col {\n width: 25%;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport '@internetarchive/collection-name-cache';\nimport { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport { TileModel } from '../../models';\nimport { formatCount } from '../../utils/format-count';\n\nimport '../../mediatype-icon';\n\nimport { favoriteFilledIcon } from './icons/favorite-filled';\nimport { reviewsIcon } from './icons/reviews';\nimport viewsIcon from './icons/views';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n get renderItemImageView() {\n const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.identifier}`;\n\n const containsDeemphasize = this.model?.collections.includes('deemphasize');\n const itemImageBoxClass = containsDeemphasize ? 'item-image-box' : '';\n const itemImageClass = `item-image ${\n !containsDeemphasize ? 'default' : 'deemphasize'\n }`;\n const tileActionClass = `tile-action no-preview${\n !containsDeemphasize ? ' hidden' : ''\n }`;\n\n return html`\n <div class=${itemImageBoxClass}>\n <div\n class=${itemImageClass}\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>\n <div class=${tileActionClass}>Content may be inappropriate</div>\n </div>\n `;\n }\n\n render() {\n const collectionIdentifier = this.model?.collections[0];\n const collectionUrl = `${this.baseNavigationUrl}/details/${collectionIdentifier}`;\n\n const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.collections[0]}`;\n const itemTitle = this.model?.title || '';\n const itemCreator = this.model?.creator || '-';\n\n return html`\n <div id=\"container\">\n <a href=${collectionUrl}>\n <div id=\"stealth-popup\">\n <div\n id=\"collection-thumbnail\"\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>\n <div id=\"collection-title-text\">\n <async-collection-name\n .collectionNameCache=${this.collectionNameCache}\n .identifier=${collectionIdentifier}\n ></async-collection-name>\n </div>\n </div>\n </a>\n <div id=\"title-image-container\">\n <h1 id=\"item-title\" title=${itemTitle}>${this.model?.title}</h1>\n <div id=\"item-image-container\">${this.renderItemImageView}</div>\n <div class=\"item-creator\">\n <span id=\"text-by\">By:</span>\n <span>${itemCreator}</span>\n </div>\n </div>\n <div id=\"item-stats-container\">\n <div id=\"stats-holder\">\n <div class=\"col\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n ?showText=${true}\n >\n </mediatype-icon>\n </div>\n <div class=\"col\">\n ${viewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.viewCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${favoriteFilledIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.itemCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${reviewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.favCount, 'short', 'short')}\n </p>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;\n\n return css`\n #container {\n background-color: #ffffff;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n }\n\n mediatype-icon {\n --iconHeight: 10px;\n }\n\n #title-image-container {\n display: flex;\n flex: 1;\n flex-direction: column;\n padding: 0.5rem;\n }\n\n #item-title {\n font-weight: bold;\n color: #000000;\n font-size: 1.6rem;\n text-align: center;\n margin-top: 0rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 2rem;\n height: 4rem;\n }\n\n #item-image-container {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n\n .item-image-box {\n width: 16rem;\n height: 16rem;\n overflow: hidden;\n position: relative;\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n }\n\n .item-image {\n width: 16rem;\n height: 16rem;\n object-fit: cover;\n background-repeat: no-repeat;\n background-position: center center;\n position: relative;\n -webkit-appearance: none;\n overflow: visible;\n }\n\n .default {\n background-size: contain;\n filter: drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.8));\n }\n\n .deemphasize {\n background-size: cover;\n filter: blur(15px);\n z-index: 1;\n }\n\n .tile-action {\n border: 1px solid currentColor;\n border-radius: 1px;\n padding: 5px;\n font-weight: 500;\n width: auto;\n position: absolute;\n z-index: 2;\n display: flex;\n top: 5.5rem;\n }\n\n .no-preview {\n background-color: #fffecb;\n color: #000000;\n font-size: 1.4rem;\n line-height: 2rem;\n text-align: center;\n }\n\n .hidden {\n display: none;\n }\n\n #container:hover > #title-image-container > .item-title {\n text-decoration: underline;\n }\n\n /** this is a workaround for Safari 15 where the hover effects are not working */\n #title-image-container:hover > #item-title {\n text-decoration: underline;\n }\n\n #container:hover > #item-title {\n background-color: #fcfcfc;\n }\n\n .item-creator {\n color: #000000;\n display: -webkit-box;\n font-size: 1.4rem;\n height: 3rem;\n margin: 0px;\n overflow: hidden;\n padding: 0.5rem;\n text-align: center;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n #text-by {\n font-weight: bold;\n }\n\n #item-stats-container {\n align-items: center;\n display: flex;\n height: 5.5rem;\n padding-left: 1rem;\n padding-right: 0.5rem;\n }\n\n #stats-holder {\n align-items: center;\n display: flex;\n flex: 1;\n justify-content: space-evenly;\n text-align: center;\n width: 100%;\n }\n\n svg {\n height: 10px;\n width: 10px;\n }\n\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: center;\n }\n\n .col {\n width: 25%;\n }\n\n #container:hover #stealth-popup {\n margin-top: -25px;\n visibility: visible;\n opacity: 1;\n }\n\n #stealth-popup {\n transition: margin-top 0.3s ease, opacity 0.3s ease;\n position: absolute;\n visibility: hidden;\n margin-left: -10px;\n text-align: left;\n display: flex;\n padding: 5px;\n width: 96%;\n background: #f5f5f7 100%;\n border: 1px #2c2c2c;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n }\n\n #collection-thumbnail {\n display: flex;\n transition: opacity 0.3s ease;\n width: 3rem;\n height: 3rem;\n flex: 0 0 3rem;\n border-radius: 8px;\n border: 1px solid #ddd;\n overflow: hidden;\n background-size: cover;\n background-repeat: no-repeat;\n background-position: center center;\n }\n\n #collection-title-text {\n line-height: 1;\n font-size: 16px;\n font-weight: bold;\n text-align: left;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n height: 3.5rem;\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n a {\n color: #333;\n text-decoration: none;\n display: block;\n }\n `;\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { LitElement } from 'lit';
2
+ import { SortParam } from '@internetarchive/search-service';
3
+ import { TileModel } from '../../models';
4
+ export declare class TileListCompactHeader extends LitElement {
5
+ model?: TileModel;
6
+ currentWidth?: number;
7
+ sortParam?: SortParam;
8
+ render(): import("lit-html").TemplateResult<1>;
9
+ private get classSize();
10
+ static get styles(): import("lit").CSSResult;
11
+ }
@@ -0,0 +1,79 @@
1
+ import { __decorate } from "tslib";
2
+ import { css, html, LitElement } from 'lit';
3
+ import { customElement, property } from 'lit/decorators.js';
4
+ import eyeIcon from '../../assets/img/icons/eye';
5
+ let TileListCompactHeader = class TileListCompactHeader extends LitElement {
6
+ render() {
7
+ return html `
8
+ <div id="list-line-header" class="${this.classSize}">
9
+ <div id="thumb"></div>
10
+ <div id="title">Title</div>
11
+ <div id="date">Date Archived</div>
12
+ <div id="creator">Creator</div>
13
+ <div id="views">${eyeIcon}</div>
14
+ <div id="icon"></div>
15
+ </div>
16
+ `;
17
+ }
18
+ get classSize() {
19
+ var _a;
20
+ return ((_a = this.currentWidth) !== null && _a !== void 0 ? _a : 531) < 530 ? 'mobile' : 'desktop';
21
+ }
22
+ static get styles() {
23
+ return css `
24
+ html {
25
+ font-size: unset;
26
+ }
27
+
28
+ div {
29
+ font-size: 14px;
30
+ font-weight: bold;
31
+ line-height: 20px;
32
+ }
33
+
34
+ .mobile #views {
35
+ display: none;
36
+ }
37
+
38
+ #views {
39
+ text-align: right;
40
+ /* Lower icon to align with text baseline */
41
+ line-height: 14px;
42
+ }
43
+ #views svg {
44
+ height: 18px;
45
+ }
46
+
47
+ #list-line-header {
48
+ display: grid;
49
+ column-gap: 10px;
50
+ align-items: center;
51
+ padding-left: 1rem;
52
+ padding-right: 1rem;
53
+ padding-bottom: 2px;
54
+ }
55
+
56
+ #list-line-header.mobile {
57
+ grid-template-columns: 30px 3fr 29px 2fr 19px;
58
+ }
59
+
60
+ #list-line-header.desktop {
61
+ grid-template-columns: 51px 3fr 100px 2fr 60px 26px;
62
+ }
63
+ `;
64
+ }
65
+ };
66
+ __decorate([
67
+ property({ type: Object })
68
+ ], TileListCompactHeader.prototype, "model", void 0);
69
+ __decorate([
70
+ property({ type: Number })
71
+ ], TileListCompactHeader.prototype, "currentWidth", void 0);
72
+ __decorate([
73
+ property({ type: Object })
74
+ ], TileListCompactHeader.prototype, "sortParam", void 0);
75
+ TileListCompactHeader = __decorate([
76
+ customElement('tile-list-compact-header')
77
+ ], TileListCompactHeader);
78
+ export { TileListCompactHeader };
79
+ //# sourceMappingURL=tile-list-compact-header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tile-list-compact-header.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list-compact-header.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE5D,OAAO,OAAO,MAAM,4BAA4B,CAAC;AAIjD,IAAa,qBAAqB,GAAlC,MAAa,qBAAsB,SAAQ,UAAU;IAOnD,MAAM;QACJ,OAAO,IAAI,CAAA;0CAC2B,IAAI,CAAC,SAAS;;;;;0BAK9B,OAAO;;;KAG5B,CAAC;IACJ,CAAC;IAED,IAAY,SAAS;;QACnB,OAAO,CAAC,MAAA,IAAI,CAAC,YAAY,mCAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;IACjE,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAwCT,CAAC;IACJ,CAAC;CACF,CAAA;AAlE6B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAAmB;AAElB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;2DAAuB;AAEtB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;wDAAuB;AALvC,qBAAqB;IADjC,aAAa,CAAC,0BAA0B,CAAC;GAC7B,qBAAqB,CAmEjC;SAnEY,qBAAqB","sourcesContent":["import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SortParam } from '@internetarchive/search-service';\nimport eyeIcon from '../../assets/img/icons/eye';\nimport { TileModel } from '../../models';\n\n@customElement('tile-list-compact-header')\nexport class TileListCompactHeader extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n render() {\n return html`\n <div id=\"list-line-header\" class=\"${this.classSize}\">\n <div id=\"thumb\"></div>\n <div id=\"title\">Title</div>\n <div id=\"date\">Date Archived</div>\n <div id=\"creator\">Creator</div>\n <div id=\"views\">${eyeIcon}</div>\n <div id=\"icon\"></div>\n </div>\n `;\n }\n\n private get classSize(): string {\n return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';\n }\n\n static get styles() {\n return css`\n html {\n font-size: unset;\n }\n\n div {\n font-size: 14px;\n font-weight: bold;\n line-height: 20px;\n }\n\n .mobile #views {\n display: none;\n }\n\n #views {\n text-align: right;\n /* Lower icon to align with text baseline */\n line-height: 14px;\n }\n #views svg {\n height: 18px;\n }\n\n #list-line-header {\n display: grid;\n column-gap: 10px;\n align-items: center;\n padding-left: 1rem;\n padding-right: 1rem;\n padding-bottom: 2px;\n }\n\n #list-line-header.mobile {\n grid-template-columns: 30px 3fr 29px 2fr 19px;\n }\n\n #list-line-header.desktop {\n grid-template-columns: 51px 3fr 100px 2fr 60px 26px;\n }\n `;\n }\n}\n"]}
@@ -9,6 +9,7 @@ export declare class TileListCompact extends LitElement {
9
9
  currentHeight?: number;
10
10
  sortParam?: SortParam;
11
11
  render(): import("lit-html").TemplateResult<1>;
12
+ private get imageTemplate();
12
13
  private get date();
13
14
  private get classSize();
14
15
  private get formatSize();