@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,10 +1,9 @@
1
- import { localized, msg } from '@lit/localize';
1
+ import { msg } from '@lit/localize';
2
2
  import { css, CSSResultGroup, html, LitElement } from 'lit';
3
3
  import { customElement, property } from 'lit/decorators.js';
4
4
  import { collectionIcon } from '../../assets/img/icons/mediatype/collection';
5
5
  import { TileModel } from '../../models';
6
6
 
7
- @localized()
8
7
  @customElement('collection-tile')
9
8
  export class CollectionTile extends LitElement {
10
9
  @property({ type: Object }) model?: TileModel;
@@ -1,5 +1,8 @@
1
+ /* eslint-disable import/no-duplicates */
1
2
  import { css, CSSResultGroup, html, LitElement } from 'lit';
2
3
  import { customElement, property } from 'lit/decorators.js';
4
+ import '@internetarchive/collection-name-cache';
5
+ import { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
3
6
  import { TileModel } from '../../models';
4
7
  import { formatCount } from '../../utils/format-count';
5
8
 
@@ -13,36 +16,61 @@ import viewsIcon from './icons/views';
13
16
  export class ItemTile extends LitElement {
14
17
  @property({ type: Object }) model?: TileModel;
15
18
 
19
+ @property({ type: String }) baseNavigationUrl?: string;
20
+
21
+ @property({ type: Object })
22
+ collectionNameCache?: CollectionNameCacheInterface;
23
+
16
24
  get renderItemImageView() {
17
- const imgSrcUrl = `https://archive.org/services/img/${this.model?.identifier}`;
18
- const containsDeemphasize = this.model?.collection.includes('deemphasize');
19
- return !containsDeemphasize
20
- ? html`<div
21
- id="item-image"
25
+ const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.identifier}`;
26
+
27
+ const containsDeemphasize = this.model?.collections.includes('deemphasize');
28
+ const itemImageBoxClass = containsDeemphasize ? 'item-image-box' : '';
29
+ const itemImageClass = `item-image ${
30
+ !containsDeemphasize ? 'default' : 'deemphasize'
31
+ }`;
32
+ const tileActionClass = `tile-action no-preview${
33
+ !containsDeemphasize ? ' hidden' : ''
34
+ }`;
35
+
36
+ return html`
37
+ <div class=${itemImageBoxClass}>
38
+ <div
39
+ class=${itemImageClass}
22
40
  style="background-image:url(${imgSrcUrl})"
23
- ></div>`
24
- : html`<div id="item-image-box">
25
- <div
26
- id="item-image-deemphasize"
27
- style="background-image:url(${imgSrcUrl})"
28
- ></div>
29
- <div class="tile-action no-preview">Content may be inappropriate</div>
30
- </div>`;
41
+ ></div>
42
+ <div class=${tileActionClass}>Content may be inappropriate</div>
43
+ </div>
44
+ `;
31
45
  }
32
46
 
33
47
  render() {
48
+ const collectionIdentifier = this.model?.collections[0];
49
+ const collectionUrl = `${this.baseNavigationUrl}/details/${collectionIdentifier}`;
50
+
51
+ const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.collections[0]}`;
34
52
  const itemTitle = this.model?.title || '';
35
53
  const itemCreator = this.model?.creator || '-';
36
54
 
37
55
  return html`
38
56
  <div id="container">
39
- <div id="title-image-container">
40
- <p id="item-title" title=${itemTitle}>
41
- ${this.model?.title}
42
- </p>
43
- <div id="item-image-container">
44
- ${this.renderItemImageView}
57
+ <a href=${collectionUrl}>
58
+ <div id="stealth-popup">
59
+ <div
60
+ id="collection-thumbnail"
61
+ style="background-image:url(${imgSrcUrl})"
62
+ ></div>
63
+ <div id="collection-title-text">
64
+ <async-collection-name
65
+ .collectionNameCache=${this.collectionNameCache}
66
+ .identifier=${collectionIdentifier}
67
+ ></async-collection-name>
68
+ </div>
45
69
  </div>
70
+ </a>
71
+ <div id="title-image-container">
72
+ <h1 id="item-title" title=${itemTitle}>${this.model?.title}</h1>
73
+ <div id="item-image-container">${this.renderItemImageView}</div>
46
74
  <div class="item-creator">
47
75
  <span id="text-by">By:</span>
48
76
  <span>${itemCreator}</span>
@@ -51,33 +79,29 @@ export class ItemTile extends LitElement {
51
79
  <div id="item-stats-container">
52
80
  <div id="stats-holder">
53
81
  <div class="col">
54
- <mediatype-icon mediatype="${
55
- this.model?.mediatype
56
- }" showText="true">
82
+ <mediatype-icon
83
+ .mediatype=${this.model?.mediatype}
84
+ ?showText=${true}
85
+ >
86
+ </mediatype-icon>
57
87
  </div>
58
88
  <div class="col">
59
89
  ${viewsIcon}
60
- <p class="status-text">${formatCount(
61
- this.model?.viewCount,
62
- 'short',
63
- 'short'
64
- )}</p>
90
+ <p class="status-text">
91
+ ${formatCount(this.model?.viewCount, 'short', 'short')}
92
+ </p>
65
93
  </div>
66
94
  <div class="col">
67
95
  ${favoriteFilledIcon}
68
- <p class="status-text">${formatCount(
69
- this.model?.itemCount,
70
- 'short',
71
- 'short'
72
- )}</p>
96
+ <p class="status-text">
97
+ ${formatCount(this.model?.itemCount, 'short', 'short')}
98
+ </p>
73
99
  </div>
74
100
  <div class="col">
75
101
  ${reviewsIcon}
76
- <p class="status-text">${formatCount(
77
- this.model?.favCount,
78
- 'short',
79
- 'short'
80
- )}</p>
102
+ <p class="status-text">
103
+ ${formatCount(this.model?.favCount, 'short', 'short')}
104
+ </p>
81
105
  </div>
82
106
  </div>
83
107
  </div>
@@ -96,6 +120,11 @@ export class ItemTile extends LitElement {
96
120
  display: flex;
97
121
  flex-direction: column;
98
122
  height: 100%;
123
+ position: relative;
124
+ }
125
+
126
+ mediatype-icon {
127
+ --iconHeight: 10px;
99
128
  }
100
129
 
101
130
  #title-image-container {
@@ -127,41 +156,39 @@ export class ItemTile extends LitElement {
127
156
  flex: 1;
128
157
  }
129
158
 
130
- #item-image {
159
+ .item-image-box {
131
160
  width: 16rem;
132
161
  height: 16rem;
133
- border-radius: 0.8rem;
134
162
  overflow: hidden;
163
+ position: relative;
135
164
  box-shadow: 1px 1px 2px 0px;
136
- object-fit: cover;
137
- background-position: center;
138
- background-size: cover;
165
+ display: flex;
139
166
  }
140
167
 
141
- #item-image-box {
168
+ .item-image {
142
169
  width: 16rem;
143
170
  height: 16rem;
144
- border-radius: 0.8rem;
145
- overflow: hidden;
146
- box-shadow: 1px 1px 2px 0px;
147
- border: 5px solid #0000000;
171
+ object-fit: cover;
172
+ background-repeat: no-repeat;
173
+ background-position: center center;
148
174
  position: relative;
149
- display: flex;
175
+ -webkit-appearance: none;
176
+ overflow: visible;
150
177
  }
151
178
 
152
- #item-image-deemphasize {
153
- width: 16rem;
154
- height: 16rem;
155
- object-fit: cover;
156
- background-position: center;
179
+ .default {
180
+ background-size: contain;
181
+ filter: drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.8));
182
+ }
183
+
184
+ .deemphasize {
157
185
  background-size: cover;
158
186
  filter: blur(15px);
159
- position: absolute;
160
187
  z-index: 1;
161
188
  }
162
189
 
163
190
  .tile-action {
164
- border: 2px solid currentColor;
191
+ border: 1px solid currentColor;
165
192
  border-radius: 1px;
166
193
  padding: 5px;
167
194
  font-weight: 500;
@@ -197,7 +224,6 @@ export class ItemTile extends LitElement {
197
224
  background-color: #fcfcfc;
198
225
  }
199
226
 
200
- /** creator **/
201
227
  .item-creator {
202
228
  color: #000000;
203
229
  display: -webkit-box;
@@ -249,6 +275,62 @@ export class ItemTile extends LitElement {
249
275
  .col {
250
276
  width: 25%;
251
277
  }
278
+
279
+ #container:hover #stealth-popup {
280
+ margin-top: -25px;
281
+ visibility: visible;
282
+ opacity: 1;
283
+ }
284
+
285
+ #stealth-popup {
286
+ transition: margin-top 0.3s ease, opacity 0.3s ease;
287
+ position: absolute;
288
+ visibility: hidden;
289
+ margin-left: -10px;
290
+ text-align: left;
291
+ display: flex;
292
+ padding: 5px;
293
+ width: 96%;
294
+ background: #f5f5f7 100%;
295
+ border: 1px #2c2c2c;
296
+ border-radius: ${cornerRadiusCss};
297
+ box-shadow: 1px 1px 2px 0px;
298
+ }
299
+
300
+ #collection-thumbnail {
301
+ display: flex;
302
+ transition: opacity 0.3s ease;
303
+ width: 3rem;
304
+ height: 3rem;
305
+ flex: 0 0 3rem;
306
+ border-radius: 8px;
307
+ border: 1px solid #ddd;
308
+ overflow: hidden;
309
+ background-size: cover;
310
+ background-repeat: no-repeat;
311
+ background-position: center center;
312
+ }
313
+
314
+ #collection-title-text {
315
+ line-height: 1;
316
+ font-size: 16px;
317
+ font-weight: bold;
318
+ text-align: left;
319
+ padding-left: 0.5rem;
320
+ padding-right: 0.5rem;
321
+ height: 3.5rem;
322
+ display: -webkit-box;
323
+ overflow: hidden;
324
+ text-overflow: ellipsis;
325
+ -webkit-line-clamp: 2;
326
+ -webkit-box-orient: vertical;
327
+ }
328
+
329
+ a {
330
+ color: #333;
331
+ text-decoration: none;
332
+ display: block;
333
+ }
252
334
  `;
253
335
  }
254
336
  }
@@ -0,0 +1,75 @@
1
+ import { css, html, LitElement } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { SortParam } from '@internetarchive/search-service';
4
+ import eyeIcon from '../../assets/img/icons/eye';
5
+ import { TileModel } from '../../models';
6
+
7
+ @customElement('tile-list-compact-header')
8
+ export class TileListCompactHeader extends LitElement {
9
+ @property({ type: Object }) model?: TileModel;
10
+
11
+ @property({ type: Number }) currentWidth?: number;
12
+
13
+ @property({ type: Object }) sortParam?: SortParam;
14
+
15
+ render() {
16
+ return html`
17
+ <div id="list-line-header" class="${this.classSize}">
18
+ <div id="thumb"></div>
19
+ <div id="title">Title</div>
20
+ <div id="date">Date Archived</div>
21
+ <div id="creator">Creator</div>
22
+ <div id="views">${eyeIcon}</div>
23
+ <div id="icon"></div>
24
+ </div>
25
+ `;
26
+ }
27
+
28
+ private get classSize(): string {
29
+ return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';
30
+ }
31
+
32
+ static get styles() {
33
+ return css`
34
+ html {
35
+ font-size: unset;
36
+ }
37
+
38
+ div {
39
+ font-size: 14px;
40
+ font-weight: bold;
41
+ line-height: 20px;
42
+ }
43
+
44
+ .mobile #views {
45
+ display: none;
46
+ }
47
+
48
+ #views {
49
+ text-align: right;
50
+ /* Lower icon to align with text baseline */
51
+ line-height: 14px;
52
+ }
53
+ #views svg {
54
+ height: 18px;
55
+ }
56
+
57
+ #list-line-header {
58
+ display: grid;
59
+ column-gap: 10px;
60
+ align-items: center;
61
+ padding-left: 1rem;
62
+ padding-right: 1rem;
63
+ padding-bottom: 2px;
64
+ }
65
+
66
+ #list-line-header.mobile {
67
+ grid-template-columns: 30px 3fr 29px 2fr 19px;
68
+ }
69
+
70
+ #list-line-header.desktop {
71
+ grid-template-columns: 51px 3fr 100px 2fr 60px 26px;
72
+ }
73
+ `;
74
+ }
75
+ }
@@ -0,0 +1,209 @@
1
+ import { css, html, LitElement, nothing } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { SortParam } from '@internetarchive/search-service';
4
+ import DOMPurify from 'dompurify';
5
+ import { TileModel } from '../../models';
6
+ import { formatCount, NumberFormat } from '../../utils/format-count';
7
+ import { formatDate, DateFormat } from '../../utils/format-date';
8
+ import '../../mediatype-icon';
9
+
10
+ @customElement('tile-list-compact')
11
+ export class TileListCompact extends LitElement {
12
+ @property({ type: Object }) model?: TileModel;
13
+
14
+ @property({ type: String }) baseNavigationUrl?: string;
15
+
16
+ @property({ type: Number }) currentWidth?: number;
17
+
18
+ @property({ type: Number }) currentHeight?: number;
19
+
20
+ @property({ type: Object }) sortParam?: SortParam;
21
+
22
+ render() {
23
+ return html`
24
+ <div id="list-line" class="${this.classSize}">
25
+ <div id="thumb">${this.imageTemplate}</div>
26
+ <div id="title">${DOMPurify.sanitize(this.model?.title ?? '')}</div>
27
+ <div id="date">${formatDate(this.date, this.formatSize)}</div>
28
+ <div id="creator">${DOMPurify.sanitize(this.model?.creator ?? '')}</div>
29
+ <div id="views">
30
+ ${formatCount(this.model?.viewCount ?? 0, this.formatSize)}
31
+ </div>
32
+ <div id="icon">
33
+ <mediatype-icon
34
+ .mediatype=${this.model?.mediatype}
35
+ style="--iconHeight: 20px; --iconWidth: 20px;"
36
+ >
37
+ </mediatype-icon>
38
+ </div>
39
+ </div>
40
+ `;
41
+ }
42
+
43
+ private get imageTemplate() {
44
+ if (!this.model?.identifier) {
45
+ return nothing;
46
+ }
47
+ return html` <img
48
+ src="${this.baseNavigationUrl}/services/img/${this.model.identifier}"
49
+ alt="${this.model.identifier}"
50
+ class="${this.model?.mediatype}"
51
+ />`;
52
+ }
53
+
54
+ /*
55
+ * TODO: fix field names to match model in src/collection-browser.ts
56
+ * private get dateSortSelector()
57
+ * @see src/models.ts
58
+ */
59
+ private get date(): Date | undefined {
60
+ switch (this.sortParam?.field) {
61
+ case 'date':
62
+ return this.model?.datePublished;
63
+ case 'reviewdate':
64
+ return this.model?.dateReviewed;
65
+ case 'addeddate':
66
+ return this.model?.dateAdded;
67
+ default:
68
+ return this.model?.dateArchived; // publicdate
69
+ }
70
+ }
71
+
72
+ private get classSize(): string {
73
+ return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';
74
+ }
75
+
76
+ private get formatSize(): DateFormat | NumberFormat {
77
+ return (this.currentWidth ?? 531) < 530 ? 'short' : 'long';
78
+ }
79
+
80
+ static get styles() {
81
+ return css`
82
+ html {
83
+ font-size: unset;
84
+ }
85
+
86
+ div {
87
+ font-size: 14px;
88
+ }
89
+
90
+ /* fields */
91
+
92
+ #thumb {
93
+ padding-left: 6px;
94
+ }
95
+
96
+ #thumb img {
97
+ object-fit: cover;
98
+ display: block;
99
+ }
100
+
101
+ .mobile #thumb img {
102
+ width: 30px;
103
+ height: 30px;
104
+ }
105
+
106
+ .desktop #thumb img {
107
+ width: 45px;
108
+ height: 45px;
109
+ }
110
+
111
+ #thumb img.collection {
112
+ border-radius: 8px;
113
+ -webkit-border-radius: 8px;
114
+ -moz-border-radius: 8px;
115
+ }
116
+
117
+ .mobile #thumb img.account {
118
+ border-radius: 15px;
119
+ -webkit-border-radius: 15px;
120
+ -moz-border-radius: 15px;
121
+ }
122
+
123
+ .desktop #thumb img.account {
124
+ border-radius: 22.5px;
125
+ -webkit-border-radius: 22.5px;
126
+ -moz-border-radius: 22.5px;
127
+ }
128
+
129
+ #title {
130
+ color: #4b64ff;
131
+ text-decoration: none;
132
+ }
133
+
134
+ #title,
135
+ #creator {
136
+ text-overflow: ellipsis;
137
+ overflow: hidden;
138
+ white-space: nowrap;
139
+ }
140
+
141
+ #views {
142
+ text-align: right;
143
+ }
144
+
145
+ .mobile #views {
146
+ display: none;
147
+ }
148
+
149
+ #icon {
150
+ height: 20px;
151
+ padding-right: 6px;
152
+ }
153
+
154
+ .mobile #icon {
155
+ height: 14px;
156
+ }
157
+
158
+ .desktop #icon {
159
+ height: 20px;
160
+ }
161
+
162
+ /* list-line */
163
+
164
+ #list-line {
165
+ display: grid;
166
+ column-gap: 10px;
167
+ border-top: 1px solid #ddd;
168
+ align-items: center;
169
+ line-height: 20px;
170
+ }
171
+
172
+ #list-line.mobile {
173
+ grid-template-columns: 30px 3fr 29px 2fr 19px;
174
+ padding-top: 2px;
175
+ padding-bottom: 2px;
176
+ }
177
+
178
+ #list-line.desktop {
179
+ grid-template-columns: 51px 3fr 100px 2fr 60px 26px;
180
+ padding-top: 5px;
181
+ padding-bottom: 5px;
182
+ }
183
+
184
+ /*
185
+ #title {
186
+ flex-grow: 3;
187
+ flex-shrink: 3;
188
+ flex-basis: 0;
189
+ }
190
+
191
+ #creator {
192
+ flex-grow: 2;
193
+ flex-shrink: 2;
194
+ flex-basis: 0;
195
+ }
196
+
197
+ #date {
198
+ flex-grow: 1;
199
+ flex-shrink: 1;
200
+ flex-basis: 0;
201
+ }
202
+ */
203
+
204
+ #list-line:hover #title {
205
+ text-decoration: underline;
206
+ }
207
+ `;
208
+ }
209
+ }