@internetarchive/collection-browser 0.2.11 → 0.2.12

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 (218) hide show
  1. package/package.json +2 -2
  2. package/renovate.json +6 -0
  3. package/src/assets/img/icons/login-required.ts +30 -0
  4. package/src/collection-browser.ts +15 -10
  5. package/src/styles/item-image-styles.ts +4 -3
  6. package/src/tiles/grid/item-tile.ts +22 -19
  7. package/src/tiles/image-block.ts +124 -0
  8. package/src/tiles/item-image.ts +3 -1
  9. package/src/tiles/list/tile-list-compact.ts +19 -56
  10. package/src/tiles/list/tile-list.ts +18 -54
  11. package/src/tiles/overlay/icon-overlay.ts +34 -0
  12. package/src/tiles/overlay/text-overlay.ts +48 -0
  13. package/src/tiles/tile-dispatcher.ts +13 -4
  14. package/test/icon-overlay.test.ts +41 -0
  15. package/test/item-image.test.ts +82 -0
  16. package/test/text-overlay.test.ts +57 -0
  17. package/test/tiles/grid/item-tile.test.ts +2 -2
  18. package/dist/index.d.ts +0 -9
  19. package/dist/index.js.map +0 -1
  20. package/dist/src/app-root.d.ts +0 -32
  21. package/dist/src/app-root.js +0 -285
  22. package/dist/src/app-root.js.map +0 -1
  23. package/dist/src/assets/img/icons/chevron.d.ts +0 -2
  24. package/dist/src/assets/img/icons/chevron.js +0 -4
  25. package/dist/src/assets/img/icons/chevron.js.map +0 -1
  26. package/dist/src/assets/img/icons/empty-query.d.ts +0 -2
  27. package/dist/src/assets/img/icons/empty-query.js +0 -5
  28. package/dist/src/assets/img/icons/empty-query.js.map +0 -1
  29. package/dist/src/assets/img/icons/eye-closed.d.ts +0 -2
  30. package/dist/src/assets/img/icons/eye-closed.js +0 -5
  31. package/dist/src/assets/img/icons/eye-closed.js.map +0 -1
  32. package/dist/src/assets/img/icons/eye.d.ts +0 -2
  33. package/dist/src/assets/img/icons/eye.js +0 -5
  34. package/dist/src/assets/img/icons/eye.js.map +0 -1
  35. package/dist/src/assets/img/icons/favorite-filled.d.ts +0 -1
  36. package/dist/src/assets/img/icons/favorite-filled.js +0 -11
  37. package/dist/src/assets/img/icons/favorite-filled.js.map +0 -1
  38. package/dist/src/assets/img/icons/mediatype/account.d.ts +0 -1
  39. package/dist/src/assets/img/icons/mediatype/account.js +0 -14
  40. package/dist/src/assets/img/icons/mediatype/account.js.map +0 -1
  41. package/dist/src/assets/img/icons/mediatype/audio.d.ts +0 -1
  42. package/dist/src/assets/img/icons/mediatype/audio.js +0 -14
  43. package/dist/src/assets/img/icons/mediatype/audio.js.map +0 -1
  44. package/dist/src/assets/img/icons/mediatype/collection.d.ts +0 -1
  45. package/dist/src/assets/img/icons/mediatype/collection.js +0 -12
  46. package/dist/src/assets/img/icons/mediatype/collection.js.map +0 -1
  47. package/dist/src/assets/img/icons/mediatype/data.d.ts +0 -1
  48. package/dist/src/assets/img/icons/mediatype/data.js +0 -15
  49. package/dist/src/assets/img/icons/mediatype/data.js.map +0 -1
  50. package/dist/src/assets/img/icons/mediatype/etree.d.ts +0 -1
  51. package/dist/src/assets/img/icons/mediatype/etree.js +0 -14
  52. package/dist/src/assets/img/icons/mediatype/etree.js.map +0 -1
  53. package/dist/src/assets/img/icons/mediatype/film.d.ts +0 -1
  54. package/dist/src/assets/img/icons/mediatype/film.js +0 -14
  55. package/dist/src/assets/img/icons/mediatype/film.js.map +0 -1
  56. package/dist/src/assets/img/icons/mediatype/images.d.ts +0 -1
  57. package/dist/src/assets/img/icons/mediatype/images.js +0 -13
  58. package/dist/src/assets/img/icons/mediatype/images.js.map +0 -1
  59. package/dist/src/assets/img/icons/mediatype/radio.d.ts +0 -1
  60. package/dist/src/assets/img/icons/mediatype/radio.js +0 -15
  61. package/dist/src/assets/img/icons/mediatype/radio.js.map +0 -1
  62. package/dist/src/assets/img/icons/mediatype/software.d.ts +0 -1
  63. package/dist/src/assets/img/icons/mediatype/software.js +0 -13
  64. package/dist/src/assets/img/icons/mediatype/software.js.map +0 -1
  65. package/dist/src/assets/img/icons/mediatype/texts.d.ts +0 -1
  66. package/dist/src/assets/img/icons/mediatype/texts.js +0 -13
  67. package/dist/src/assets/img/icons/mediatype/texts.js.map +0 -1
  68. package/dist/src/assets/img/icons/mediatype/tv.d.ts +0 -1
  69. package/dist/src/assets/img/icons/mediatype/tv.js +0 -14
  70. package/dist/src/assets/img/icons/mediatype/tv.js.map +0 -1
  71. package/dist/src/assets/img/icons/mediatype/video.d.ts +0 -1
  72. package/dist/src/assets/img/icons/mediatype/video.js +0 -14
  73. package/dist/src/assets/img/icons/mediatype/video.js.map +0 -1
  74. package/dist/src/assets/img/icons/mediatype/web.d.ts +0 -1
  75. package/dist/src/assets/img/icons/mediatype/web.js +0 -13
  76. package/dist/src/assets/img/icons/mediatype/web.js.map +0 -1
  77. package/dist/src/assets/img/icons/null-result.d.ts +0 -2
  78. package/dist/src/assets/img/icons/null-result.js +0 -5
  79. package/dist/src/assets/img/icons/null-result.js.map +0 -1
  80. package/dist/src/assets/img/icons/restricted.d.ts +0 -1
  81. package/dist/src/assets/img/icons/restricted.js +0 -29
  82. package/dist/src/assets/img/icons/restricted.js.map +0 -1
  83. package/dist/src/assets/img/icons/reviews.d.ts +0 -1
  84. package/dist/src/assets/img/icons/reviews.js +0 -11
  85. package/dist/src/assets/img/icons/reviews.js.map +0 -1
  86. package/dist/src/assets/img/icons/upload.d.ts +0 -1
  87. package/dist/src/assets/img/icons/upload.js +0 -12
  88. package/dist/src/assets/img/icons/upload.js.map +0 -1
  89. package/dist/src/assets/img/icons/views.d.ts +0 -1
  90. package/dist/src/assets/img/icons/views.js +0 -11
  91. package/dist/src/assets/img/icons/views.js.map +0 -1
  92. package/dist/src/circular-activity-indicator.d.ts +0 -5
  93. package/dist/src/circular-activity-indicator.js +0 -66
  94. package/dist/src/circular-activity-indicator.js.map +0 -1
  95. package/dist/src/collection-browser.d.ts +0 -214
  96. package/dist/src/collection-browser.js +0 -1236
  97. package/dist/src/collection-browser.js.map +0 -1
  98. package/dist/src/collection-facets.d.ts +0 -63
  99. package/dist/src/collection-facets.js +0 -560
  100. package/dist/src/collection-facets.js.map +0 -1
  101. package/dist/src/empty-placeholder.d.ts +0 -11
  102. package/dist/src/empty-placeholder.js +0 -83
  103. package/dist/src/empty-placeholder.js.map +0 -1
  104. package/dist/src/language-code-handler/language-code-handler.d.ts +0 -37
  105. package/dist/src/language-code-handler/language-code-handler.js +0 -27
  106. package/dist/src/language-code-handler/language-code-handler.js.map +0 -1
  107. package/dist/src/language-code-handler/language-code-mapping.d.ts +0 -1
  108. package/dist/src/language-code-handler/language-code-mapping.js +0 -563
  109. package/dist/src/language-code-handler/language-code-mapping.js.map +0 -1
  110. package/dist/src/mediatype/mediatype-config.d.ts +0 -3
  111. package/dist/src/mediatype/mediatype-config.js +0 -86
  112. package/dist/src/mediatype/mediatype-config.js.map +0 -1
  113. package/dist/src/models.d.ts +0 -84
  114. package/dist/src/models.js +0 -58
  115. package/dist/src/models.js.map +0 -1
  116. package/dist/src/restoration-state-handler.d.ts +0 -38
  117. package/dist/src/restoration-state-handler.js +0 -204
  118. package/dist/src/restoration-state-handler.js.map +0 -1
  119. package/dist/src/sort-filter-bar/alpha-bar.d.ts +0 -9
  120. package/dist/src/sort-filter-bar/alpha-bar.js +0 -98
  121. package/dist/src/sort-filter-bar/alpha-bar.js.map +0 -1
  122. package/dist/src/sort-filter-bar/img/compact.d.ts +0 -1
  123. package/dist/src/sort-filter-bar/img/compact.js +0 -5
  124. package/dist/src/sort-filter-bar/img/compact.js.map +0 -1
  125. package/dist/src/sort-filter-bar/img/list.d.ts +0 -1
  126. package/dist/src/sort-filter-bar/img/list.js +0 -5
  127. package/dist/src/sort-filter-bar/img/list.js.map +0 -1
  128. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +0 -1
  129. package/dist/src/sort-filter-bar/img/sort-triangle.js +0 -5
  130. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +0 -1
  131. package/dist/src/sort-filter-bar/img/tile.d.ts +0 -1
  132. package/dist/src/sort-filter-bar/img/tile.js +0 -5
  133. package/dist/src/sort-filter-bar/img/tile.js.map +0 -1
  134. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +0 -85
  135. package/dist/src/sort-filter-bar/sort-filter-bar.js +0 -698
  136. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +0 -1
  137. package/dist/src/styles/item-image-styles.d.ts +0 -8
  138. package/dist/src/styles/item-image-styles.js +0 -101
  139. package/dist/src/styles/item-image-styles.js.map +0 -1
  140. package/dist/src/tiles/collection-browser-loading-tile.d.ts +0 -5
  141. package/dist/src/tiles/collection-browser-loading-tile.js +0 -32
  142. package/dist/src/tiles/collection-browser-loading-tile.js.map +0 -1
  143. package/dist/src/tiles/grid/account-tile.d.ts +0 -8
  144. package/dist/src/tiles/grid/account-tile.js +0 -126
  145. package/dist/src/tiles/grid/account-tile.js.map +0 -1
  146. package/dist/src/tiles/grid/collection-tile.d.ts +0 -7
  147. package/dist/src/tiles/grid/collection-tile.js +0 -159
  148. package/dist/src/tiles/grid/collection-tile.js.map +0 -1
  149. package/dist/src/tiles/grid/item-tile.d.ts +0 -16
  150. package/dist/src/tiles/grid/item-tile.js +0 -174
  151. package/dist/src/tiles/grid/item-tile.js.map +0 -1
  152. package/dist/src/tiles/grid/tile-stats.d.ts +0 -10
  153. package/dist/src/tiles/grid/tile-stats.js +0 -134
  154. package/dist/src/tiles/grid/tile-stats.js.map +0 -1
  155. package/dist/src/tiles/item-image.d.ts +0 -31
  156. package/dist/src/tiles/item-image.js +0 -117
  157. package/dist/src/tiles/item-image.js.map +0 -1
  158. package/dist/src/tiles/item-tile-image.d.ts +0 -15
  159. package/dist/src/tiles/item-tile-image.js +0 -68
  160. package/dist/src/tiles/item-tile-image.js.map +0 -1
  161. package/dist/src/tiles/list/account-label.d.ts +0 -1
  162. package/dist/src/tiles/list/account-label.js +0 -7
  163. package/dist/src/tiles/list/account-label.js.map +0 -1
  164. package/dist/src/tiles/list/date-label.d.ts +0 -1
  165. package/dist/src/tiles/list/date-label.js +0 -13
  166. package/dist/src/tiles/list/date-label.js.map +0 -1
  167. package/dist/src/tiles/list/tile-list-compact-header.d.ts +0 -12
  168. package/dist/src/tiles/list/tile-list-compact-header.js +0 -84
  169. package/dist/src/tiles/list/tile-list-compact-header.js.map +0 -1
  170. package/dist/src/tiles/list/tile-list-compact.d.ts +0 -20
  171. package/dist/src/tiles/list/tile-list-compact.js +0 -215
  172. package/dist/src/tiles/list/tile-list-compact.js.map +0 -1
  173. package/dist/src/tiles/list/tile-list.d.ts +0 -47
  174. package/dist/src/tiles/list/tile-list.js +0 -492
  175. package/dist/src/tiles/list/tile-list.js.map +0 -1
  176. package/dist/src/tiles/mediatype-icon.d.ts +0 -9
  177. package/dist/src/tiles/mediatype-icon.js +0 -82
  178. package/dist/src/tiles/mediatype-icon.js.map +0 -1
  179. package/dist/src/tiles/tile-dispatcher.d.ts +0 -35
  180. package/dist/src/tiles/tile-dispatcher.js +0 -204
  181. package/dist/src/tiles/tile-dispatcher.js.map +0 -1
  182. package/dist/src/utils/format-count.d.ts +0 -7
  183. package/dist/src/utils/format-count.js +0 -76
  184. package/dist/src/utils/format-count.js.map +0 -1
  185. package/dist/src/utils/format-date.d.ts +0 -2
  186. package/dist/src/utils/format-date.js +0 -24
  187. package/dist/src/utils/format-date.js.map +0 -1
  188. package/dist/test/collection-browser.test.d.ts +0 -1
  189. package/dist/test/collection-browser.test.js +0 -47
  190. package/dist/test/collection-browser.test.js.map +0 -1
  191. package/dist/test/empty-placeholder.test.d.ts +0 -1
  192. package/dist/test/empty-placeholder.test.js +0 -34
  193. package/dist/test/empty-placeholder.test.js.map +0 -1
  194. package/dist/test/mediatype-config.test.d.ts +0 -1
  195. package/dist/test/mediatype-config.test.js +0 -17
  196. package/dist/test/mediatype-config.test.js.map +0 -1
  197. package/dist/test/mocks/mock-collection-name-cache.d.ts +0 -7
  198. package/dist/test/mocks/mock-collection-name-cache.js +0 -14
  199. package/dist/test/mocks/mock-collection-name-cache.js.map +0 -1
  200. package/dist/test/mocks/mock-search-responses.d.ts +0 -3
  201. package/dist/test/mocks/mock-search-responses.js +0 -32
  202. package/dist/test/mocks/mock-search-responses.js.map +0 -1
  203. package/dist/test/mocks/mock-search-service.d.ts +0 -8
  204. package/dist/test/mocks/mock-search-service.js +0 -16
  205. package/dist/test/mocks/mock-search-service.js.map +0 -1
  206. package/dist/test/tile-stats.test.d.ts +0 -1
  207. package/dist/test/tile-stats.test.js +0 -42
  208. package/dist/test/tile-stats.test.js.map +0 -1
  209. package/dist/test/tiles/grid/item-tile.test.d.ts +0 -1
  210. package/dist/test/tiles/grid/item-tile.test.js +0 -96
  211. package/dist/test/tiles/grid/item-tile.test.js.map +0 -1
  212. package/dist/test/utils/format-count.test.d.ts +0 -1
  213. package/dist/test/utils/format-count.test.js +0 -24
  214. package/dist/test/utils/format-count.test.js.map +0 -1
  215. package/dist/test/utils/format-date.test.d.ts +0 -1
  216. package/dist/test/utils/format-date.test.js +0 -18
  217. package/dist/test/utils/format-date.test.js.map +0 -1
  218. package/src/tiles/item-tile-image.ts +0 -61
package/package.json CHANGED
@@ -3,11 +3,11 @@
3
3
  "description": "The Internet Archive Collection Browser.",
4
4
  "license": "AGPL-3.0-only",
5
5
  "author": "Internet Archive",
6
- "version": "0.2.11",
6
+ "version": "0.2.12",
7
7
  "main": "dist/index.js",
8
8
  "module": "dist/index.js",
9
9
  "scripts": {
10
- "start": "yarn run prepare && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
10
+ "start": "yarn run prepare && tsc && concurrently -k -r \"tsc --watch --preserveWatchOutput\" \"wds\"",
11
11
  "prepare:ghpages": "rimraf ghpages && yarn run prepare && vite build",
12
12
  "prepare": "rimraf dist && tsc && husky install",
13
13
  "lint": "eslint --ext .ts,.html . --ignore-path .gitignore && prettier \"**/*.ts\" --check --ignore-path .gitignore",
package/renovate.json ADDED
@@ -0,0 +1,6 @@
1
+ {
2
+ "extends": [
3
+ "config:base",
4
+ ":preserveSemverRanges"
5
+ ]
6
+ }
@@ -0,0 +1,30 @@
1
+ import { svg } from 'lit';
2
+
3
+ export const loginRequiredIcon = svg`
4
+ <svg
5
+ viewBox="0 0 100 100"
6
+ xmlns="http://www.w3.org/2000/svg"
7
+ >
8
+ <g fill="none" fill-rule="nonzero">
9
+ <path
10
+ d="m11 48h11c-.0377367 5.0230706-.0377367 17.6897373 0 38h28v-38h12c-14.7643578-21.746483-22.9310245-33.4131497-24.5-35z"
11
+ fill="#fff"
12
+ transform="matrix(0 1 -1 0 86 13)"
13
+ />
14
+ <path
15
+ d="m17 44h9c-.0377367 5.0230706-.0377367 17.0230706 0 36h18v-36h10c-10.0976911-15.0798163-15.9310245-23.4131497-17.5-25z"
16
+ fill="#000"
17
+ transform="matrix(0 1 -1 0 85 14)"
18
+ />
19
+ <path
20
+ d="m84.3595506 0h-55.7191012c-8.6379817 0-15.6404494 6.39593215-15.6404494 14.2857143v15.7142857h20v-11h47v62l-47-1v-11h-20v16.7142857c0 7.8897822 7.0024677 14.2857143 15.6404494 14.2857143h55.7191012c8.6379817 0 15.6404494-6.3959321 15.6404494-14.2857143v-71.4285714c0-7.88978215-7.0024677-14.2857143-15.6404494-14.2857143z"
21
+ fill="#fff"
22
+ />
23
+ <path
24
+ d="m84.2597403 5c5.3793969 0 9.7402597 4.02943725 9.7402597 9v72c0 4.9705627-4.3608628 9-9.7402597 9h-55.5194806c-5.3793969 0-9.7402597-4.0294373-9.7402597-9v-12h8v7.5c0 2.4198792 1.8593897 4.3936363 4.4510815 4.4958424l48.9709964.0041576c2.6189169 0 4.4673094-2.6052767 4.5779221-5v-62c0-2.4852814-2.3103015-5-5-5h-48.3376623c-2.618917 0-4.551725 1.6052767-4.6623377 4v7h-8v-11c0-4.97056275 4.3608628-9 9.7402597-9z"
25
+ fill="#000"
26
+ />
27
+ </g>
28
+ <title>Log in to view this item</title>
29
+ </svg>
30
+ `;
@@ -456,6 +456,7 @@ export class CollectionBrowser
456
456
  .resizeObserver=${this.resizeObserver}
457
457
  .sortParam=${this.sortParam}
458
458
  .mobileBreakpoint=${this.mobileBreakpoint}
459
+ .loggedIn=${this.loggedIn}
459
460
  >
460
461
  </tile-dispatcher>
461
462
  </div>
@@ -1119,16 +1120,20 @@ export class CollectionBrowser
1119
1120
  const model = this.tileModelAtCellIndex(index);
1120
1121
  if (!model) return undefined;
1121
1122
 
1122
- return html` <tile-dispatcher
1123
- .baseNavigationUrl=${this.baseNavigationUrl}
1124
- .baseImageUrl=${this.baseImageUrl}
1125
- .model=${model}
1126
- .tileDisplayMode=${this.displayMode}
1127
- .resizeObserver=${this.resizeObserver}
1128
- .collectionNameCache=${this.collectionNameCache}
1129
- .sortParam=${this.sortParam}
1130
- .mobileBreakpoint=${this.mobileBreakpoint}
1131
- ></tile-dispatcher>`;
1123
+ return html`
1124
+ <tile-dispatcher
1125
+ .baseNavigationUrl=${this.baseNavigationUrl}
1126
+ .baseImageUrl=${this.baseImageUrl}
1127
+ .model=${model}
1128
+ .tileDisplayMode=${this.displayMode}
1129
+ .resizeObserver=${this.resizeObserver}
1130
+ .collectionNameCache=${this.collectionNameCache}
1131
+ .sortParam=${this.sortParam}
1132
+ .mobileBreakpoint=${this.mobileBreakpoint}
1133
+ .loggedIn=${this.loggedIn}
1134
+ >
1135
+ </tile-dispatcher>
1136
+ `;
1132
1137
  }
1133
1138
 
1134
1139
  /**
@@ -17,10 +17,13 @@ export const baseItemImageStyles = css`
17
17
  box-sizing: border-box;
18
18
  display: flex;
19
19
  position: relative;
20
+ max-width: 100px;
20
21
  }
21
22
 
22
23
  .contain {
23
24
  object-fit: contain;
25
+ height: 100%;
26
+ width: 100%;
24
27
  }
25
28
 
26
29
  .cover {
@@ -28,9 +31,7 @@ export const baseItemImageStyles = css`
28
31
  }
29
32
 
30
33
  .blur {
31
- filter: blur(15px);
32
- width: 100%;
33
- transform: scale(1.1);
34
+ filter: blur(5px);
34
35
  }
35
36
  `;
36
37
 
@@ -7,35 +7,42 @@ import { SortParam } from '@internetarchive/search-service';
7
7
  import { formatDate } from '../../utils/format-date';
8
8
  import { TileModel } from '../../models';
9
9
 
10
- import '../mediatype-icon';
10
+ import '../image-block';
11
11
  import '../item-image';
12
+ import '../mediatype-icon';
12
13
  import './tile-stats';
13
14
 
14
15
  @customElement('item-tile')
15
16
  export class ItemTile extends LitElement {
16
- @property({ type: Object }) model?: TileModel;
17
-
18
17
  @property({ type: String }) baseImageUrl?: string;
19
18
 
19
+ @property({ type: Boolean }) loggedIn = false;
20
+
21
+ @property({ type: Object }) model?: TileModel;
22
+
20
23
  @property({ type: Object }) sortParam?: SortParam;
21
24
 
22
25
  render() {
23
26
  const itemTitle = this.model?.title;
27
+
24
28
  return html`
25
29
  <div class="container">
26
30
  <div class="item-info">
27
31
  <div id="title">
28
- <h1 class="truncated" title=${ifDefined(
29
- itemTitle
30
- )}>${itemTitle}</h1>
32
+ <h1 class="truncated" title=${ifDefined(itemTitle)}>
33
+ ${itemTitle}
34
+ </h1>
31
35
  </div>
32
36
 
33
- <div id="image">
34
- <item-image
35
- .model=${this.model}
36
- .baseImageUrl=${this.baseImageUrl}>
37
- </item-image>
38
- </div>
37
+ <image-block
38
+ .model=${this.model}
39
+ .baseImageUrl=${this.baseImageUrl}
40
+ .loggedIn=${this.loggedIn}
41
+ .isCompactTile=${false}
42
+ .isListTile=${false}
43
+ .viewSize=${'grid'}>
44
+ </image-block>
45
+
39
46
  ${
40
47
  this.doesSortedByDate
41
48
  ? this.sortedDateInfoTemplate
@@ -54,6 +61,9 @@ export class ItemTile extends LitElement {
54
61
  `;
55
62
  }
56
63
 
64
+ /**
65
+ * Templates
66
+ */
57
67
  private get doesSortedByDate() {
58
68
  return ['date', 'reviewdate', 'addeddate', 'publicdate'].includes(
59
69
  this.sortParam?.field as string
@@ -119,13 +129,6 @@ export class ItemTile extends LitElement {
119
129
  flex-shrink: 0;
120
130
  }
121
131
 
122
- #image {
123
- display: flex;
124
- justify-content: center;
125
- flex: 1;
126
- height: 16rem;
127
- }
128
-
129
132
  .hidden {
130
133
  display: none;
131
134
  }
@@ -0,0 +1,124 @@
1
+ import { css, CSSResultGroup, html, LitElement, nothing } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { ClassInfo, classMap } from 'lit/directives/class-map.js';
4
+
5
+ import { TileModel } from '../models';
6
+
7
+ import './overlay/icon-overlay';
8
+ import './overlay/text-overlay';
9
+
10
+ @customElement('image-block')
11
+ export class ImageBlock extends LitElement {
12
+ @property({ type: String }) baseImageUrl?: string;
13
+
14
+ @property({ type: Boolean }) isCompactTile = false;
15
+
16
+ @property({ type: Boolean }) isListTile = false;
17
+
18
+ @property({ type: Boolean }) loggedIn = false;
19
+
20
+ @property({ type: Object }) model?: TileModel;
21
+
22
+ @property({ type: String }) viewSize: string = 'desktop';
23
+
24
+ render() {
25
+ if (!this.model?.identifier) {
26
+ return nothing;
27
+ }
28
+ return html`
29
+ <div class=${classMap(this.baseClass)}>
30
+ <item-image
31
+ .model=${this.model}
32
+ .baseImageUrl=${this.baseImageUrl}
33
+ .isListTile=${this.isListTile}
34
+ .isCompactTile=${this.isCompactTile}
35
+ .loggedIn=${this.loggedIn}
36
+ style="--imgHeight: 100%; --imgWidth: 100%"
37
+ >
38
+ </item-image>
39
+ ${this.textOverlayTemplate} ${this.iconOverlayTemplate}
40
+ </div>
41
+ `;
42
+ }
43
+
44
+ private get baseClass(): ClassInfo {
45
+ return {
46
+ list: this.isListTile && !this.isCompactTile,
47
+ 'list-compact': this.isListTile && this.isCompactTile,
48
+ [this.viewSize]: true,
49
+ };
50
+ }
51
+
52
+ private get iconOverlayTemplate() {
53
+ if (!this.isListTile) return nothing;
54
+
55
+ if (!this.model?.loginRequired && !this.model?.contentWarning) {
56
+ return nothing;
57
+ }
58
+ return html`
59
+ <icon-overlay
60
+ .loggedIn=${this.loggedIn}
61
+ .loginRequired=${this.model?.loginRequired}
62
+ >
63
+ </icon-overlay>
64
+ `;
65
+ }
66
+
67
+ private get textOverlayTemplate() {
68
+ if (this.isListTile) {
69
+ return nothing;
70
+ }
71
+
72
+ if (!this.model?.loginRequired && !this.model?.contentWarning) {
73
+ return nothing;
74
+ }
75
+ return html`
76
+ <text-overlay
77
+ .loggedIn=${this.loggedIn}
78
+ .loginRequired=${this.model?.loginRequired}
79
+ >
80
+ </text-overlay>
81
+ `;
82
+ }
83
+
84
+ static get styles(): CSSResultGroup {
85
+ return css`
86
+ div {
87
+ display: flex;
88
+ justify-content: center;
89
+ position: relative;
90
+ }
91
+
92
+ .grid {
93
+ height: 16rem;
94
+ flex: 1;
95
+ }
96
+
97
+ /** tile-list view */
98
+ .list.desktop {
99
+ width: 100px;
100
+ height: 100px;
101
+ }
102
+
103
+ .list.mobile {
104
+ width: 90px;
105
+ height: 90px;
106
+ }
107
+
108
+ /** tile-list-compact view */
109
+ .list-compact {
110
+ display: block;
111
+ }
112
+
113
+ .list-compact.desktop {
114
+ width: 45px;
115
+ height: 45px;
116
+ }
117
+
118
+ .list-compact.mobile {
119
+ width: 30px;
120
+ height: 30px;
121
+ }
122
+ `;
123
+ }
124
+ }
@@ -71,10 +71,12 @@ export class ItemImage extends LitElement {
71
71
  }
72
72
 
73
73
  private get itemImageClass(): ClassInfo {
74
+ const toBlur = this.model?.contentWarning || this.model?.loginRequired;
75
+
74
76
  return {
75
77
  contain: !this.isCompactTile && !this.isWaveform,
76
78
  cover: this.isCompactTile,
77
- blur: this.model?.contentWarning || false,
79
+ blur: toBlur || false,
78
80
  waveform: this.isWaveform,
79
81
  };
80
82
  }
@@ -1,5 +1,4 @@
1
- import { css, html, LitElement, nothing } from 'lit';
2
- import { ifDefined } from 'lit/directives/if-defined.js';
1
+ import { css, html, LitElement } from 'lit';
3
2
  import { customElement, property } from 'lit/decorators.js';
4
3
  import { SortParam } from '@internetarchive/search-service';
5
4
  import DOMPurify from 'dompurify';
@@ -9,7 +8,7 @@ import { formatCount, NumberFormat } from '../../utils/format-count';
9
8
  import { formatDate, DateFormat } from '../../utils/format-date';
10
9
  import { accountLabel } from './account-label';
11
10
 
12
- import '../item-image';
11
+ import '../image-block';
13
12
  import '../mediatype-icon';
14
13
 
15
14
  @customElement('tile-list-compact')
@@ -28,12 +27,19 @@ export class TileListCompact extends LitElement {
28
27
 
29
28
  @property({ type: String }) baseImageUrl?: string;
30
29
 
30
+ @property({ type: Boolean }) loggedIn = false;
31
+
31
32
  render() {
32
33
  return html`
33
34
  <div id="list-line" class="${this.classSize}">
34
- <div id="thumb" class="${ifDefined(this.model?.mediatype)}">
35
- ${this.imageTemplate}
36
- </div>
35
+ <image-block
36
+ .model=${this.model}
37
+ .baseImageUrl=${this.baseImageUrl}
38
+ .isCompactTile=${true}
39
+ .isListTile=${true}
40
+ .viewSize=${this.classSize}
41
+ >
42
+ </image-block>
37
43
  <div id="title">${DOMPurify.sanitize(this.model?.title ?? '')}</div>
38
44
  <div id="creator">
39
45
  ${this.model?.mediatype === 'account'
@@ -55,22 +61,6 @@ export class TileListCompact extends LitElement {
55
61
  `;
56
62
  }
57
63
 
58
- private get imageTemplate() {
59
- if (!this.model?.identifier) {
60
- return nothing;
61
- }
62
- return html`
63
- <item-image
64
- .model=${this.model}
65
- .baseImageUrl=${this.baseImageUrl}
66
- .isListTile=${true}
67
- .isCompactTile=${true}
68
- style="--imgHeight: 100%; --imgWidth: 100%"
69
- >
70
- </item-image>
71
- `;
72
- }
73
-
74
64
  /*
75
65
  * TODO: fix field names to match model in src/collection-browser.ts
76
66
  * private get dateSortSelector()
@@ -127,6 +117,8 @@ export class TileListCompact extends LitElement {
127
117
  border-top: 1px solid #ddd;
128
118
  align-items: center;
129
119
  line-height: 20px;
120
+ padding-top: 5px;
121
+ padding-bottom: 5px;
130
122
  }
131
123
 
132
124
  #list-line.mobile {
@@ -141,40 +133,6 @@ export class TileListCompact extends LitElement {
141
133
  text-decoration: underline;
142
134
  }
143
135
 
144
- /* fields */
145
- #thumb {
146
- object-fit: cover;
147
- display: block;
148
- }
149
-
150
- .mobile #thumb {
151
- width: 30px;
152
- height: 30px;
153
- padding-top: 2px;
154
- padding-bottom: 2px;
155
- padding-left: 4px;
156
- }
157
-
158
- .desktop #thumb {
159
- width: 45px;
160
- height: 45px;
161
- padding-top: 5px;
162
- padding-bottom: 5px;
163
- padding-left: 6px;
164
- }
165
-
166
- #thumb.collection {
167
- --border-radius: 8px;
168
- }
169
-
170
- .mobile #thumb.account {
171
- --border-radius: 15px;
172
- }
173
-
174
- .desktop #thumb.account {
175
- --border-radius: 22.5px;
176
- }
177
-
178
136
  #title {
179
137
  color: #4b64ff;
180
138
  text-decoration: none;
@@ -205,6 +163,11 @@ export class TileListCompact extends LitElement {
205
163
  --iconHeight: 20px;
206
164
  --iconWidth: 20px;
207
165
  }
166
+
167
+ item-image {
168
+ --imgHeight: 100%;
169
+ --imgWidth: 100%;
170
+ }
208
171
  `;
209
172
  }
210
173
  }
@@ -21,7 +21,7 @@ import { TileModel } from '../../models';
21
21
  import { formatCount, NumberFormat } from '../../utils/format-count';
22
22
  import { formatDate, DateFormat } from '../../utils/format-date';
23
23
 
24
- import '../item-image';
24
+ import '../image-block';
25
25
  import '../mediatype-icon';
26
26
 
27
27
  @customElement('tile-list')
@@ -45,6 +45,8 @@ export class TileList extends LitElement {
45
45
 
46
46
  @property({ type: String }) baseImageUrl?: string;
47
47
 
48
+ @property({ type: Boolean }) loggedIn = false;
49
+
48
50
  protected updated(changed: PropertyValues): void {
49
51
  if (changed.has('model')) {
50
52
  this.fetchCollectionNames();
@@ -90,11 +92,7 @@ export class TileList extends LitElement {
90
92
  private get mobileTemplate() {
91
93
  return html`
92
94
  <div id="list-line-top">
93
- <div id="list-line-left">
94
- <div id="thumb" class="${ifDefined(this.model?.mediatype)}">
95
- ${this.imgTemplate}
96
- </div>
97
- </div>
95
+ <div id="list-line-left">${this.imageBlockTemplate}</div>
98
96
  <div id="list-line-right">
99
97
  <div id="title-line">
100
98
  <div id="title">${this.titleTemplate}</div>
@@ -108,11 +106,7 @@ export class TileList extends LitElement {
108
106
 
109
107
  private get desktopTemplate() {
110
108
  return html`
111
- <div id="list-line-left">
112
- <div id="thumb" class="${ifDefined(this.model?.mediatype)}">
113
- ${this.imgTemplate}
114
- </div>
115
- </div>
109
+ <div id="list-line-left">${this.imageBlockTemplate}</div>
116
110
  <div id="list-line-right">
117
111
  <div id="title-line">
118
112
  <div id="title">${this.titleTemplate}</div>
@@ -123,6 +117,19 @@ export class TileList extends LitElement {
123
117
  `;
124
118
  }
125
119
 
120
+ private get imageBlockTemplate() {
121
+ return html`
122
+ <image-block
123
+ .model=${this.model}
124
+ .baseImageUrl=${this.baseImageUrl}
125
+ .isCompactTile=${false}
126
+ .isListTile=${true}
127
+ .viewSize=${this.classSize}
128
+ >
129
+ </image-block>
130
+ `;
131
+ }
132
+
126
133
  private get detailsTemplate() {
127
134
  return html`
128
135
  ${this.itemLineTemplate} ${this.creatorTemplate}
@@ -138,21 +145,6 @@ export class TileList extends LitElement {
138
145
  }
139
146
 
140
147
  // Data templates
141
- private get imgTemplate() {
142
- if (!this.model?.identifier) {
143
- return nothing;
144
- }
145
- return html`
146
- <item-image
147
- .model=${this.model}
148
- .baseImageUrl=${this.baseImageUrl}
149
- .isListTile=${true}
150
- style="--imgHeight: 100%; --imgWidth: 100%"
151
- >
152
- </item-image>
153
- `;
154
- }
155
-
156
148
  private get iconRightTemplate() {
157
149
  return html`
158
150
  <div id="icon-right">
@@ -409,34 +401,6 @@ export class TileList extends LitElement {
409
401
  }
410
402
 
411
403
  /* fields */
412
-
413
- #thumb img {
414
- object-fit: cover;
415
- display: block;
416
- }
417
-
418
- .mobile #thumb {
419
- width: 90px;
420
- height: 90px;
421
- }
422
-
423
- .desktop #thumb {
424
- width: 100px;
425
- height: 100px;
426
- }
427
-
428
- #thumb.collection {
429
- --border-radius: 8px;
430
- }
431
-
432
- .mobile #thumb.account {
433
- --border-radius: 45px;
434
- }
435
-
436
- .desktop #thumb.account {
437
- --border-radius: 50px;
438
- }
439
-
440
404
  #icon-right {
441
405
  width: 20px;
442
406
  padding-top: 5px;
@@ -0,0 +1,34 @@
1
+ import { css, CSSResultGroup, html, LitElement } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+
4
+ import { restrictedIcon } from '../../assets/img/icons/restricted';
5
+ import { loginRequiredIcon } from '../../assets/img/icons/login-required';
6
+
7
+ @customElement('icon-overlay')
8
+ export class IconOverlay extends LitElement {
9
+ @property({ type: Boolean }) loggedIn = false;
10
+
11
+ @property({ type: Boolean }) loginRequired = false;
12
+
13
+ render() {
14
+ if (this.loginRequired && !this.loggedIn) {
15
+ return html`${loginRequiredIcon} `;
16
+ }
17
+ return html`${restrictedIcon}`;
18
+ }
19
+
20
+ static get styles(): CSSResultGroup {
21
+ return css`
22
+ :host {
23
+ position: absolute;
24
+ top: 50%;
25
+ left: 50%;
26
+ transform: translate(-50%, -50%);
27
+ -ms-transform: translate(-50%, -50%);
28
+ width: 50%;
29
+ height: 50%;
30
+ z-index: 2;
31
+ }
32
+ `;
33
+ }
34
+ }
@@ -0,0 +1,48 @@
1
+ import { css, CSSResultGroup, html, LitElement } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+
4
+ @customElement('text-overlay')
5
+ export class TextOverlay extends LitElement {
6
+ @property({ type: Boolean }) loggedIn = false;
7
+
8
+ @property({ type: Boolean }) loginRequired = false;
9
+
10
+ render() {
11
+ return html` <div class="overlay no-preview">${this.textDisplay}</div> `;
12
+ }
13
+
14
+ private get textDisplay() {
15
+ return this.loginRequired && !this.loggedIn
16
+ ? 'Log in\nto view this item'
17
+ : 'Content may be inappropriate';
18
+ }
19
+
20
+ static get styles(): CSSResultGroup {
21
+ return css`
22
+ :host {
23
+ align-items: center;
24
+ display: flex;
25
+ }
26
+
27
+ .overlay {
28
+ border: 1px solid #2c2c2c;
29
+ border-radius: 1px;
30
+ position: absolute;
31
+ right: 0;
32
+ left: 0;
33
+ width: auto;
34
+ height: auto;
35
+ padding: 5px;
36
+ }
37
+
38
+ .no-preview {
39
+ background-color: #fffecb;
40
+ color: #2c2c2c;
41
+ font-size: 1.4rem;
42
+ line-height: 2rem;
43
+ text-align: center;
44
+ white-space: pre-wrap; // for the newline character
45
+ }
46
+ `;
47
+ }
48
+ }