@internetarchive/collection-browser 0.1.6 → 0.1.7-alpha-1

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 (75) hide show
  1. package/dist/src/assets/img/icons/restricted.d.ts +1 -0
  2. package/dist/src/assets/img/icons/restricted.js +29 -0
  3. package/dist/src/assets/img/icons/restricted.js.map +1 -0
  4. package/dist/src/tiles/item-image.d.ts +9 -4
  5. package/dist/src/tiles/item-image.js +102 -27
  6. package/dist/src/tiles/item-image.js.map +1 -1
  7. package/dist/src/tiles/list/tile-list-compact.js +54 -59
  8. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  9. package/dist/src/tiles/list/tile-list.js +25 -22
  10. package/dist/src/tiles/list/tile-list.js.map +1 -1
  11. package/package.json +2 -2
  12. package/src/assets/img/icons/restricted.ts +29 -0
  13. package/src/tiles/item-image.ts +107 -29
  14. package/src/tiles/list/tile-list-compact.ts +45 -50
  15. package/src/tiles/list/tile-list.ts +22 -21
  16. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +0 -1
  17. package/dist/src/assets/img/icons/mediatype/livemusic.js +0 -7
  18. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +0 -1
  19. package/dist/src/assets/img/icons/mediatype/photos.d.ts +0 -1
  20. package/dist/src/assets/img/icons/mediatype/photos.js +0 -7
  21. package/dist/src/assets/img/icons/mediatype/photos.js.map +0 -1
  22. package/dist/src/helpers.d.ts +0 -1
  23. package/dist/src/helpers.js +0 -20
  24. package/dist/src/helpers.js.map +0 -1
  25. package/dist/src/mediatype/mediatype-color.d.ts +0 -3
  26. package/dist/src/mediatype/mediatype-color.js +0 -15
  27. package/dist/src/mediatype/mediatype-color.js.map +0 -1
  28. package/dist/src/mediatype/mediatype-display.d.ts +0 -3
  29. package/dist/src/mediatype/mediatype-display.js +0 -86
  30. package/dist/src/mediatype/mediatype-display.js.map +0 -1
  31. package/dist/src/mediatype/mediatype-icon.d.ts +0 -10
  32. package/dist/src/mediatype/mediatype-icon.js +0 -105
  33. package/dist/src/mediatype/mediatype-icon.js.map +0 -1
  34. package/dist/src/mediatype/mediatype-text.d.ts +0 -3
  35. package/dist/src/mediatype/mediatype-text.js +0 -17
  36. package/dist/src/mediatype/mediatype-text.js.map +0 -1
  37. package/dist/src/mediatype/mediatypeConfig.d.ts +0 -3
  38. package/dist/src/mediatype/mediatypeConfig.js +0 -86
  39. package/dist/src/mediatype/mediatypeConfig.js.map +0 -1
  40. package/dist/src/mediatype-icon.d.ts +0 -9
  41. package/dist/src/mediatype-icon.js +0 -78
  42. package/dist/src/mediatype-icon.js.map +0 -1
  43. package/dist/src/sort-filter-bar/img/grid.d.ts +0 -1
  44. package/dist/src/sort-filter-bar/img/grid.js +0 -5
  45. package/dist/src/sort-filter-bar/img/grid.js.map +0 -1
  46. package/dist/src/tiles/list/tile-list-detail.d.ts +0 -7
  47. package/dist/src/tiles/list/tile-list-detail.js +0 -28
  48. package/dist/src/tiles/list/tile-list-detail.js.map +0 -1
  49. package/dist/src/tiles/loading-tile.d.ts +0 -5
  50. package/dist/src/tiles/loading-tile.js +0 -32
  51. package/dist/src/tiles/loading-tile.js.map +0 -1
  52. package/dist/src/utils/format-string.d.ts +0 -2
  53. package/dist/src/utils/format-string.js +0 -7
  54. package/dist/src/utils/format-string.js.map +0 -1
  55. package/dist/src/waveform-thumbnail.d.ts +0 -7
  56. package/dist/src/waveform-thumbnail.js +0 -106
  57. package/dist/src/waveform-thumbnail.js.map +0 -1
  58. package/dist/src/waveform-view.d.ts +0 -0
  59. package/dist/src/waveform-view.js +0 -2
  60. package/dist/src/waveform-view.js.map +0 -1
  61. package/dist/src/your-webcomponent.d.ts +0 -8
  62. package/dist/src/your-webcomponent.js +0 -38
  63. package/dist/src/your-webcomponent.js.map +0 -1
  64. package/dist/test/mediatype-icon.test.d.ts +0 -0
  65. package/dist/test/mediatype-icon.test.js +0 -3
  66. package/dist/test/mediatype-icon.test.js.map +0 -1
  67. package/dist/test/mediatypeConfig.test.d.ts +0 -1
  68. package/dist/test/mediatypeConfig.test.js +0 -17
  69. package/dist/test/mediatypeConfig.test.js.map +0 -1
  70. package/dist/test/utils/format-string.test.d.ts +0 -1
  71. package/dist/test/utils/format-string.test.js +0 -17
  72. package/dist/test/utils/format-string.test.js.map +0 -1
  73. package/dist/test/your-webcomponent.test.d.ts +0 -1
  74. package/dist/test/your-webcomponent.test.js +0 -23
  75. package/dist/test/your-webcomponent.test.js.map +0 -1
@@ -0,0 +1 @@
1
+ export declare const restrictedIcon: import("lit-html").TemplateResult<2>;
@@ -0,0 +1,29 @@
1
+ import { svg } from 'lit';
2
+ export const restrictedIcon = svg `
3
+ <svg
4
+ viewBox="0 0 100 100"
5
+ xmlns="http://www.w3.org/2000/svg"
6
+ >
7
+ <g
8
+ fill="none"
9
+ fill-rule="evenodd"
10
+ >
11
+ <path
12
+ d="m56.4612493 8.80450354 41.8901185 75.94632926c1.7706782 2.8433173 2.1150372 5.2623412 1.0330766 7.2570716-1.0819604 1.9947304-3.26978 2.9920956-6.5634587 2.9920956h-85.69973905c-3.29367873 0-5.46954894-.9973652-6.52761065-2.9920956-1.0580617-1.9947304-.70175345-4.4137543 1.06892476-7.2570716l41.89011844-75.12308969c1.8184757-2.84331737 3.9693609-4.37738627 6.4526556-4.60220671s4.6341799 1.03483527 6.4526556 3.77896714z"
13
+ fill="#000"
14
+ fill-rule="nonzero"
15
+ />
16
+ <path
17
+ d="m94.0140845 90-44.5547054-79-44.4593791 79z"
18
+ fill="#f8e71c"
19
+ fill-rule="nonzero"
20
+ />
21
+ <path
22
+ d="m54 69v8h-8v-8zm0-30v10.2515641l-2.0923567 14.7484359h-3.8184713l-2.089172-14.7484359v-10.2515641z"
23
+ fill="#000"
24
+ />
25
+ </g>
26
+ <title>Content may be inappropriate</title>
27
+ </svg>
28
+ `;
29
+ //# sourceMappingURL=restricted.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"restricted.js","sourceRoot":"","sources":["../../../../../src/assets/img/icons/restricted.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAE1B,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;CA0BhC,CAAC","sourcesContent":["import { svg } from 'lit';\n\nexport const restrictedIcon = svg`\n <svg\n viewBox=\"0 0 100 100\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <g\n fill=\"none\"\n fill-rule=\"evenodd\"\n >\n <path\n d=\"m56.4612493 8.80450354 41.8901185 75.94632926c1.7706782 2.8433173 2.1150372 5.2623412 1.0330766 7.2570716-1.0819604 1.9947304-3.26978 2.9920956-6.5634587 2.9920956h-85.69973905c-3.29367873 0-5.46954894-.9973652-6.52761065-2.9920956-1.0580617-1.9947304-.70175345-4.4137543 1.06892476-7.2570716l41.89011844-75.12308969c1.8184757-2.84331737 3.9693609-4.37738627 6.4526556-4.60220671s4.6341799 1.03483527 6.4526556 3.77896714z\"\n fill=\"#000\"\n fill-rule=\"nonzero\"\n />\n <path\n d=\"m94.0140845 90-44.5547054-79-44.4593791 79z\"\n fill=\"#f8e71c\"\n fill-rule=\"nonzero\"\n />\n <path\n d=\"m54 69v8h-8v-8zm0-30v10.2515641l-2.0923567 14.7484359h-3.8184713l-2.089172-14.7484359v-10.2515641z\"\n fill=\"#000\"\n />\n </g>\n <title>Content may be inappropriate</title>\n </svg>\n`;\n"]}
@@ -4,22 +4,27 @@ export declare class ItemImage extends LitElement {
4
4
  model?: TileModel;
5
5
  baseImageUrl?: string;
6
6
  isListTile: boolean;
7
+ isCompactTile: boolean;
7
8
  private isDeemphasize;
8
9
  private isWaveform;
9
10
  private itemImageWaveform;
10
11
  protected updated(changed: PropertyValues): void;
11
- private setDeemphsize;
12
+ private setDeemphasize;
12
13
  render(): import("lit-html").TemplateResult<1>;
13
14
  private get imageSrc();
14
- private get backgroundImageTemplate();
15
+ private get itemImageTemplate();
16
+ private get tileImageTemplate();
17
+ private get listImageTemplate();
15
18
  private get waveformTemplate();
19
+ private get restrictedIconTemplate();
16
20
  private get tileActionTemplate();
17
21
  private onLoadItemImageCheck;
18
22
  private get imageClass();
23
+ private get listImageClass();
19
24
  private get imageBoxClass();
20
25
  private get boxWaveformClass();
21
26
  private get itemImageWaveformClass();
22
- private get randomGradient();
23
- private generateHashCode;
27
+ private get hashBasedGradient();
28
+ private hashStrToInt;
24
29
  static get styles(): CSSResultGroup;
25
30
  }
@@ -2,22 +2,26 @@ import { __decorate } from "tslib";
2
2
  import { css, html, nothing, LitElement, } from 'lit';
3
3
  import { customElement, property, query, state } from 'lit/decorators.js';
4
4
  import { ifDefined } from 'lit/directives/if-defined.js';
5
+ import { restrictedIcon } from '../assets/img/icons/restricted';
5
6
  let ItemImage = class ItemImage extends LitElement {
6
7
  constructor() {
7
8
  super(...arguments);
8
9
  this.isListTile = false;
10
+ this.isCompactTile = false;
9
11
  this.isDeemphasize = false;
10
12
  this.isWaveform = false;
11
13
  }
12
14
  updated(changed) {
13
15
  if (changed.has('model')) {
14
- this.setDeemphsize();
16
+ this.setDeemphasize();
15
17
  }
16
18
  }
17
- setDeemphsize() {
18
- var _a, _b;
19
+ // Don't deemphasize if item is a collection
20
+ setDeemphasize() {
21
+ var _a, _b, _c;
19
22
  this.isDeemphasize =
20
- (_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.collections.includes('deemphasize')) !== null && _b !== void 0 ? _b : false;
23
+ (_c = (((_a = this.model) === null || _a === void 0 ? void 0 : _a.mediatype) !== 'collection' &&
24
+ ((_b = this.model) === null || _b === void 0 ? void 0 : _b.collections.includes('deemphasize')))) !== null && _c !== void 0 ? _c : false;
21
25
  }
22
26
  render() {
23
27
  var _a;
@@ -25,8 +29,7 @@ let ItemImage = class ItemImage extends LitElement {
25
29
  <div class=${ifDefined(this.imageBoxClass)}>
26
30
  ${((_a = this.model) === null || _a === void 0 ? void 0 : _a.mediatype) === 'audio'
27
31
  ? this.waveformTemplate
28
- : this.backgroundImageTemplate}
29
- ${this.tileActionTemplate}
32
+ : this.itemImageTemplate}
30
33
  </div>
31
34
  `;
32
35
  }
@@ -35,12 +38,27 @@ let ItemImage = class ItemImage extends LitElement {
35
38
  return `${this.baseImageUrl}/services/img/${(_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier}`;
36
39
  }
37
40
  // Templates
38
- get backgroundImageTemplate() {
41
+ get itemImageTemplate() {
42
+ return html `
43
+ ${this.isListTile ? this.listImageTemplate : this.tileImageTemplate}
44
+ `;
45
+ }
46
+ get tileImageTemplate() {
39
47
  return html `
40
48
  <div
41
49
  class=${this.imageClass}
42
50
  style="background-image:url(${this.imageSrc})"
43
51
  ></div>
52
+ ${this.tileActionTemplate}
53
+ `;
54
+ }
55
+ get listImageTemplate() {
56
+ if (!this.model) {
57
+ return nothing;
58
+ }
59
+ return html `
60
+ <img src="${this.imageSrc}" alt="" class="${this.listImageClass}" />
61
+ ${this.restrictedIconTemplate}
44
62
  `;
45
63
  }
46
64
  get waveformTemplate() {
@@ -50,12 +68,18 @@ let ItemImage = class ItemImage extends LitElement {
50
68
  <img
51
69
  class=${this.itemImageWaveformClass}
52
70
  src="${this.imageSrc}"
53
- alt="${ifDefined((_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier)}"
71
+ alt="${ifDefined((_a = this.model) === null || _a === void 0 ? void 0 : _a.title)}"
54
72
  @load=${this.onLoadItemImageCheck}
55
73
  />
56
74
  </div>
57
75
  `;
58
76
  }
77
+ get restrictedIconTemplate() {
78
+ if (!this.isDeemphasize) {
79
+ return nothing;
80
+ }
81
+ return html ` ${restrictedIcon} `;
82
+ }
59
83
  get tileActionTemplate() {
60
84
  if (!this.isDeemphasize) {
61
85
  return nothing;
@@ -75,24 +99,34 @@ let ItemImage = class ItemImage extends LitElement {
75
99
  get imageClass() {
76
100
  return `item-image ${this.isDeemphasize ? 'deemphasize' : 'default'}`;
77
101
  }
102
+ get listImageClass() {
103
+ var _a;
104
+ return `list-image ${(_a = this.model) === null || _a === void 0 ? void 0 : _a.mediatype}${this.isCompactTile ? ' compact' : ''}`;
105
+ }
78
106
  get imageBoxClass() {
79
- return this.isDeemphasize ? 'item-image-box' : undefined;
107
+ if (this.isListTile) {
108
+ return `list-image-box${this.isDeemphasize ? ' deemphasize' : ''}`;
109
+ }
110
+ if (this.isDeemphasize) {
111
+ return 'item-image-box';
112
+ }
113
+ return undefined;
80
114
  }
81
115
  get boxWaveformClass() {
82
- return `item-audio${this.isWaveform ? ` ${this.randomGradient}` : ''}`;
116
+ return `item-audio${this.isWaveform ? ` ${this.hashBasedGradient}` : ''}`;
83
117
  }
84
118
  get itemImageWaveformClass() {
85
119
  return `item-image${this.isWaveform ? ' waveform' : ''}`;
86
120
  }
87
- get randomGradient() {
121
+ get hashBasedGradient() {
88
122
  var _a;
89
- let gradientInt = 1;
90
- if ((_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier) {
91
- gradientInt = this.generateHashCode(this.model.identifier) % 6;
123
+ if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier)) {
124
+ return 'grad1';
92
125
  }
93
- return `grad${gradientInt}`;
126
+ const gradient = this.hashStrToInt(this.model.identifier) % 6; // returns 0-5
127
+ return `grad${gradient}`;
94
128
  }
95
- generateHashCode(str) {
129
+ hashStrToInt(str) {
96
130
  return str
97
131
  .split('')
98
132
  .reduce((acc, char) => acc + char.charCodeAt(0), 0);
@@ -119,6 +153,37 @@ let ItemImage = class ItemImage extends LitElement {
119
153
  overflow: visible;
120
154
  }
121
155
 
156
+ .list-image-box.deemphasize {
157
+ border: 1px solid #767676;
158
+ }
159
+
160
+ .list-image-box {
161
+ width: 100%;
162
+ height: 100%;
163
+ overflow: hidden;
164
+ box-sizing: border-box;
165
+ display: flex;
166
+ position: relative;
167
+ }
168
+
169
+ .list-image {
170
+ width: 100%;
171
+ height: 100%;
172
+ overflow: hidden;
173
+ }
174
+
175
+ img.list-image {
176
+ overflow: hidden;
177
+ object-fit: contain;
178
+ border-radius: var(--border-radius, 0);
179
+ -webkit-border-radius: var(--border-radius, 0);
180
+ -moz-border-radius: var(--border-radius, 0);
181
+ }
182
+
183
+ img.list-image.compact {
184
+ object-fit: cover;
185
+ }
186
+
122
187
  .waveform {
123
188
  mix-blend-mode: screen;
124
189
  }
@@ -128,12 +193,19 @@ let ItemImage = class ItemImage extends LitElement {
128
193
  filter: drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.8));
129
194
  }
130
195
 
131
- .deemphasize {
132
- background-size: cover;
196
+ .deemphasize .list-image,
197
+ .deemphasize.item-image {
198
+ background-size: contain;
133
199
  filter: blur(15px);
134
200
  z-index: 1;
135
201
  }
136
202
 
203
+ .deemphasize svg {
204
+ padding: 25%;
205
+ z-index: 2;
206
+ position: absolute;
207
+ }
208
+
137
209
  .tile-action {
138
210
  border: 1px solid currentColor;
139
211
  border-radius: 1px;
@@ -154,6 +226,15 @@ let ItemImage = class ItemImage extends LitElement {
154
226
  text-align: center;
155
227
  }
156
228
 
229
+ .grad0 {
230
+ background: linear-gradient(
231
+ hsl(340, 80%, 55%),
232
+ hsl(0, 80%, 33%) 35%,
233
+ hsl(0, 80%, 22%) 70%,
234
+ hsl(0, 0%, 0%)
235
+ );
236
+ }
237
+
157
238
  .grad1 {
158
239
  background: linear-gradient(
159
240
  hsl(300, 80%, 55%),
@@ -198,15 +279,6 @@ let ItemImage = class ItemImage extends LitElement {
198
279
  hsl(0, 0%, 0%)
199
280
  );
200
281
  }
201
-
202
- .grad6 {
203
- background: linear-gradient(
204
- hsl(340, 80%, 55%),
205
- hsl(0, 80%, 33%) 35%,
206
- hsl(0, 80%, 22%) 70%,
207
- hsl(0, 0%, 0%)
208
- );
209
- }
210
282
  `;
211
283
  }
212
284
  };
@@ -219,6 +291,9 @@ __decorate([
219
291
  __decorate([
220
292
  property({ type: Boolean })
221
293
  ], ItemImage.prototype, "isListTile", void 0);
294
+ __decorate([
295
+ property({ type: Boolean })
296
+ ], ItemImage.prototype, "isCompactTile", void 0);
222
297
  __decorate([
223
298
  state()
224
299
  ], ItemImage.prototype, "isDeemphasize", void 0);
@@ -1 +1 @@
1
- {"version":3,"file":"item-image.js","sourceRoot":"","sources":["../../../src/tiles/item-image.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n nothing,\n PropertyValues,\n LitElement,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\n\nimport { TileModel } from '../models';\n\n@customElement('item-image')\nexport class ItemImage extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseImageUrl?: string;\n\n @property({ type: Boolean }) isListTile = false;\n\n @state() private isDeemphasize: boolean = false;\n\n @state() private isWaveform: boolean = false;\n\n @query('.item-image') private itemImageWaveform!: HTMLImageElement;\n\n protected updated(changed: PropertyValues): void {\n if (changed.has('model')) {\n this.setDeemphsize();\n }\n }\n\n private setDeemphsize() {\n this.isDeemphasize =\n this.model?.collections.includes('deemphasize') ?? false;\n }\n\n render() {\n return html`\n <div class=${ifDefined(this.imageBoxClass)}>\n ${this.model?.mediatype === 'audio'\n ? this.waveformTemplate\n : this.backgroundImageTemplate}\n ${this.tileActionTemplate}\n </div>\n `;\n }\n\n private get imageSrc() {\n return `${this.baseImageUrl}/services/img/${this.model?.identifier}`;\n }\n\n // Templates\n private get backgroundImageTemplate() {\n return html`\n <div\n class=${this.imageClass}\n style=\"background-image:url(${this.imageSrc})\"\n ></div>\n `;\n }\n\n private get waveformTemplate() {\n return html`\n <div class=${this.boxWaveformClass}>\n <img\n class=${this.itemImageWaveformClass}\n src=\"${this.imageSrc}\"\n alt=\"${ifDefined(this.model?.identifier)}\"\n @load=${this.onLoadItemImageCheck}\n />\n </div>\n `;\n }\n\n private get tileActionTemplate() {\n if (!this.isDeemphasize) {\n return nothing;\n }\n return html`\n <div class=\"tile-action no-preview\">Content may be inappropriate</div>\n `;\n }\n\n private onLoadItemImageCheck() {\n const aspectRatio =\n this.itemImageWaveform.naturalWidth /\n this.itemImageWaveform.naturalHeight;\n if (aspectRatio === 4) {\n this.isWaveform = true;\n }\n }\n\n // Classes\n private get imageClass() {\n return `item-image ${this.isDeemphasize ? 'deemphasize' : 'default'}`;\n }\n\n private get imageBoxClass() {\n return this.isDeemphasize ? 'item-image-box' : undefined;\n }\n\n private get boxWaveformClass() {\n return `item-audio${this.isWaveform ? ` ${this.randomGradient}` : ''}`;\n }\n\n private get itemImageWaveformClass() {\n return `item-image${this.isWaveform ? ' waveform' : ''}`;\n }\n\n private get randomGradient() {\n let gradientInt = 1;\n if (this.model?.identifier) {\n gradientInt = this.generateHashCode(this.model.identifier) % 6;\n }\n return `grad${gradientInt}`;\n }\n\n private generateHashCode(str: string): number {\n return str\n .split('')\n .reduce((acc: number, char: string) => acc + char.charCodeAt(0), 0);\n }\n\n static get styles(): CSSResultGroup {\n return css`\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: contain;\n background-repeat: no-repeat;\n background-position: center center;\n position: relative;\n -webkit-appearance: none;\n overflow: visible;\n }\n\n .waveform {\n mix-blend-mode: screen;\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: #2c2c2c;\n font-size: 1.4rem;\n line-height: 2rem;\n text-align: center;\n }\n\n .grad1 {\n background: linear-gradient(\n hsl(300, 80%, 55%),\n hsl(330, 80%, 33%) 35%,\n hsl(330, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad2 {\n background: linear-gradient(\n hsl(200, 80%, 55%),\n hsl(230, 80%, 33%) 35%,\n hsl(230, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad3 {\n background: linear-gradient(\n hsl(160, 80%, 55%),\n hsl(190, 80%, 33%) 35%,\n hsl(190, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad4 {\n background: linear-gradient(\n hsl(250, 80%, 55%),\n hsl(280, 80%, 33%) 35%,\n hsl(280, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad5 {\n background: linear-gradient(\n hsl(280, 80%, 55%),\n hsl(310, 80%, 33%) 35%,\n hsl(310, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad6 {\n background: linear-gradient(\n hsl(340, 80%, 55%),\n hsl(0, 80%, 33%) 35%,\n hsl(0, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"item-image.js","sourceRoot":"","sources":["../../../src/tiles/item-image.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n css,\n CSSResultGroup,\n html,\n nothing,\n PropertyValues,\n LitElement,\n} from 'lit';\nimport { customElement, property, query, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { restrictedIcon } from '../assets/img/icons/restricted';\nimport { TileModel } from '../models';\n\n@customElement('item-image')\nexport class ItemImage extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseImageUrl?: string;\n\n @property({ type: Boolean }) isListTile = false;\n\n @property({ type: Boolean }) isCompactTile = false;\n\n @state() private isDeemphasize = false;\n\n @state() private isWaveform = false;\n\n @query('.item-image') private itemImageWaveform!: HTMLImageElement;\n\n protected updated(changed: PropertyValues): void {\n if (changed.has('model')) {\n this.setDeemphasize();\n }\n }\n\n // Don't deemphasize if item is a collection\n private setDeemphasize() {\n this.isDeemphasize =\n (this.model?.mediatype !== 'collection' &&\n this.model?.collections.includes('deemphasize')) ??\n false;\n }\n\n render() {\n return html`\n <div class=${ifDefined(this.imageBoxClass)}>\n ${this.model?.mediatype === 'audio'\n ? this.waveformTemplate\n : this.itemImageTemplate}\n </div>\n `;\n }\n\n private get imageSrc() {\n return `${this.baseImageUrl}/services/img/${this.model?.identifier}`;\n }\n\n // Templates\n private get itemImageTemplate() {\n return html`\n ${this.isListTile ? this.listImageTemplate : this.tileImageTemplate}\n `;\n }\n\n private get tileImageTemplate() {\n return html`\n <div\n class=${this.imageClass}\n style=\"background-image:url(${this.imageSrc})\"\n ></div>\n ${this.tileActionTemplate}\n `;\n }\n\n private get listImageTemplate() {\n if (!this.model) {\n return nothing;\n }\n return html`\n <img src=\"${this.imageSrc}\" alt=\"\" class=\"${this.listImageClass}\" />\n ${this.restrictedIconTemplate}\n `;\n }\n\n private get waveformTemplate() {\n return html`\n <div class=${this.boxWaveformClass}>\n <img\n class=${this.itemImageWaveformClass}\n src=\"${this.imageSrc}\"\n alt=\"${ifDefined(this.model?.title)}\"\n @load=${this.onLoadItemImageCheck}\n />\n </div>\n `;\n }\n\n private get restrictedIconTemplate() {\n if (!this.isDeemphasize) {\n return nothing;\n }\n return html` ${restrictedIcon} `;\n }\n\n private get tileActionTemplate() {\n if (!this.isDeemphasize) {\n return nothing;\n }\n return html`\n <div class=\"tile-action no-preview\">Content may be inappropriate</div>\n `;\n }\n\n private onLoadItemImageCheck() {\n const aspectRatio =\n this.itemImageWaveform.naturalWidth /\n this.itemImageWaveform.naturalHeight;\n if (aspectRatio === 4) {\n this.isWaveform = true;\n }\n }\n\n // Classes\n private get imageClass() {\n return `item-image ${this.isDeemphasize ? 'deemphasize' : 'default'}`;\n }\n\n private get listImageClass() {\n return `list-image ${this.model?.mediatype}${\n this.isCompactTile ? ' compact' : ''\n }`;\n }\n\n private get imageBoxClass() {\n if (this.isListTile) {\n return `list-image-box${this.isDeemphasize ? ' deemphasize' : ''}`;\n }\n if (this.isDeemphasize) {\n return 'item-image-box';\n }\n return undefined;\n }\n\n private get boxWaveformClass() {\n return `item-audio${this.isWaveform ? ` ${this.hashBasedGradient}` : ''}`;\n }\n\n private get itemImageWaveformClass() {\n return `item-image${this.isWaveform ? ' waveform' : ''}`;\n }\n\n private get hashBasedGradient() {\n if (!this.model?.identifier) {\n return 'grad1';\n }\n const gradient = this.hashStrToInt(this.model.identifier) % 6; // returns 0-5\n return `grad${gradient}`;\n }\n\n private hashStrToInt(str: string): number {\n return str\n .split('')\n .reduce((acc: number, char: string) => acc + char.charCodeAt(0), 0);\n }\n\n static get styles(): CSSResultGroup {\n return css`\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: contain;\n background-repeat: no-repeat;\n background-position: center center;\n position: relative;\n -webkit-appearance: none;\n overflow: visible;\n }\n\n .list-image-box.deemphasize {\n border: 1px solid #767676;\n }\n\n .list-image-box {\n width: 100%;\n height: 100%;\n overflow: hidden;\n box-sizing: border-box;\n display: flex;\n position: relative;\n }\n\n .list-image {\n width: 100%;\n height: 100%;\n overflow: hidden;\n }\n\n img.list-image {\n overflow: hidden;\n object-fit: contain;\n border-radius: var(--border-radius, 0);\n -webkit-border-radius: var(--border-radius, 0);\n -moz-border-radius: var(--border-radius, 0);\n }\n\n img.list-image.compact {\n object-fit: cover;\n }\n\n .waveform {\n mix-blend-mode: screen;\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 .list-image,\n .deemphasize.item-image {\n background-size: contain;\n filter: blur(15px);\n z-index: 1;\n }\n\n .deemphasize svg {\n padding: 25%;\n z-index: 2;\n position: absolute;\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: #2c2c2c;\n font-size: 1.4rem;\n line-height: 2rem;\n text-align: center;\n }\n\n .grad0 {\n background: linear-gradient(\n hsl(340, 80%, 55%),\n hsl(0, 80%, 33%) 35%,\n hsl(0, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad1 {\n background: linear-gradient(\n hsl(300, 80%, 55%),\n hsl(330, 80%, 33%) 35%,\n hsl(330, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad2 {\n background: linear-gradient(\n hsl(200, 80%, 55%),\n hsl(230, 80%, 33%) 35%,\n hsl(230, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad3 {\n background: linear-gradient(\n hsl(160, 80%, 55%),\n hsl(190, 80%, 33%) 35%,\n hsl(190, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad4 {\n background: linear-gradient(\n hsl(250, 80%, 55%),\n hsl(280, 80%, 33%) 35%,\n hsl(280, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n\n .grad5 {\n background: linear-gradient(\n hsl(280, 80%, 55%),\n hsl(310, 80%, 33%) 35%,\n hsl(310, 80%, 22%) 70%,\n hsl(0, 0%, 0%)\n );\n }\n `;\n }\n}\n"]}
@@ -13,27 +13,29 @@ let TileListCompact = class TileListCompact extends LitElement {
13
13
  this.sortParam = null;
14
14
  }
15
15
  render() {
16
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k;
16
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
17
17
  return html `
18
18
  <div id="list-line" class="${this.classSize}">
19
- <div id="thumb">${this.imageTemplate}</div>
20
- <div id="title">${DOMPurify.sanitize((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.title) !== null && _b !== void 0 ? _b : '')}</div>
19
+ <div id="thumb" class="${ifDefined((_a = this.model) === null || _a === void 0 ? void 0 : _a.mediatype)}">
20
+ ${this.imageTemplate}
21
+ </div>
22
+ <div id="title">${DOMPurify.sanitize((_c = (_b = this.model) === null || _b === void 0 ? void 0 : _b.title) !== null && _c !== void 0 ? _c : '')}</div>
21
23
  <div id="creator">
22
- ${((_c = this.model) === null || _c === void 0 ? void 0 : _c.mediatype) === 'account'
23
- ? accountLabel((_d = this.model) === null || _d === void 0 ? void 0 : _d.dateAdded)
24
- : DOMPurify.sanitize((_f = (_e = this.model) === null || _e === void 0 ? void 0 : _e.creator) !== null && _f !== void 0 ? _f : '')}
24
+ ${((_d = this.model) === null || _d === void 0 ? void 0 : _d.mediatype) === 'account'
25
+ ? accountLabel((_e = this.model) === null || _e === void 0 ? void 0 : _e.dateAdded)
26
+ : DOMPurify.sanitize((_g = (_f = this.model) === null || _f === void 0 ? void 0 : _f.creator) !== null && _g !== void 0 ? _g : '')}
25
27
  </div>
26
28
  <div id="date">${formatDate(this.date, this.formatSize)}</div>
27
29
  <div id="icon">
28
30
  <mediatype-icon
29
- .mediatype=${(_g = this.model) === null || _g === void 0 ? void 0 : _g.mediatype}
30
- .collections=${(_h = this.model) === null || _h === void 0 ? void 0 : _h.collections}
31
+ .mediatype=${(_h = this.model) === null || _h === void 0 ? void 0 : _h.mediatype}
32
+ .collections=${(_j = this.model) === null || _j === void 0 ? void 0 : _j.collections}
31
33
  style="--iconCustomFillColor: ${ifDefined(this.collectionColor)}"
32
34
  >
33
35
  </mediatype-icon>
34
36
  </div>
35
37
  <div id="views">
36
- ${formatCount((_k = (_j = this.model) === null || _j === void 0 ? void 0 : _j.viewCount) !== null && _k !== void 0 ? _k : 0, this.formatSize)}
38
+ ${formatCount((_l = (_k = this.model) === null || _k === void 0 ? void 0 : _k.viewCount) !== null && _l !== void 0 ? _l : 0, this.formatSize)}
37
39
  </div>
38
40
  </div>
39
41
  `;
@@ -47,15 +49,19 @@ let TileListCompact = class TileListCompact extends LitElement {
47
49
  return '#4666FF';
48
50
  }
49
51
  get imageTemplate() {
50
- var _a, _b;
52
+ var _a;
51
53
  if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier)) {
52
54
  return nothing;
53
55
  }
54
- return html ` <img
55
- src="${this.baseImageUrl}/services/img/${this.model.identifier}"
56
- alt="${this.model.identifier}"
57
- class="${(_b = this.model) === null || _b === void 0 ? void 0 : _b.mediatype}"
58
- />`;
56
+ return html `
57
+ <item-image
58
+ .model=${this.model}
59
+ .baseImageUrl=${this.baseImageUrl}
60
+ .isListTile=${true}
61
+ .isCompactTile=${true}
62
+ >
63
+ </item-image>
64
+ `;
59
65
  }
60
66
  /*
61
67
  * TODO: fix field names to match model in src/collection-browser.ts
@@ -101,43 +107,58 @@ let TileListCompact = class TileListCompact extends LitElement {
101
107
  font-size: 14px;
102
108
  }
103
109
 
104
- /* fields */
110
+ #list-line {
111
+ display: grid;
112
+ column-gap: 10px;
113
+ border-top: 1px solid #ddd;
114
+ align-items: center;
115
+ line-height: 20px;
116
+ }
105
117
 
106
- #thumb {
107
- padding-left: 6px;
118
+ #list-line.mobile {
119
+ grid-template-columns: 36px 3fr 2fr 62px 19px;
120
+ }
121
+
122
+ #list-line.desktop {
123
+ grid-template-columns: 51px 3fr 2fr 100px 20px 60px;
124
+ }
125
+
126
+ #list-line:hover #title {
127
+ text-decoration: underline;
108
128
  }
109
129
 
110
- #thumb img {
130
+ /* fields */
131
+ #thumb {
111
132
  object-fit: cover;
112
133
  display: block;
113
134
  }
114
135
 
115
- .mobile #thumb img {
136
+ .mobile #thumb {
116
137
  width: 30px;
117
138
  height: 30px;
139
+ padding-top: 2px;
140
+ padding-bottom: 2px;
141
+ padding-left: 4px;
118
142
  }
119
143
 
120
- .desktop #thumb img {
144
+ .desktop #thumb {
121
145
  width: 45px;
122
146
  height: 45px;
147
+ padding-top: 5px;
148
+ padding-bottom: 5px;
149
+ padding-left: 6px;
123
150
  }
124
151
 
125
- #thumb img.collection {
126
- border-radius: 8px;
127
- -webkit-border-radius: 8px;
128
- -moz-border-radius: 8px;
152
+ #thumb.collection {
153
+ --border-radius: 8px;
129
154
  }
130
155
 
131
- .mobile #thumb img.account {
132
- border-radius: 15px;
133
- -webkit-border-radius: 15px;
134
- -moz-border-radius: 15px;
156
+ .mobile #thumb.account {
157
+ --border-radius: 15px;
135
158
  }
136
159
 
137
- .desktop #thumb img.account {
138
- border-radius: 22.5px;
139
- -webkit-border-radius: 22.5px;
140
- -moz-border-radius: 22.5px;
160
+ .desktop #thumb.account {
161
+ --border-radius: 22.5px;
141
162
  }
142
163
 
143
164
  #title {
@@ -170,32 +191,6 @@ let TileListCompact = class TileListCompact extends LitElement {
170
191
  --iconHeight: 20px;
171
192
  --iconWidth: 20px;
172
193
  }
173
-
174
- /* list-line */
175
-
176
- #list-line {
177
- display: grid;
178
- column-gap: 10px;
179
- border-top: 1px solid #ddd;
180
- align-items: center;
181
- line-height: 20px;
182
- }
183
-
184
- #list-line.mobile {
185
- grid-template-columns: 36px 3fr 2fr 62px 19px;
186
- padding-top: 2px;
187
- padding-bottom: 2px;
188
- }
189
-
190
- #list-line.desktop {
191
- grid-template-columns: 51px 3fr 2fr 100px 20px 60px;
192
- padding-top: 5px;
193
- padding-bottom: 5px;
194
- }
195
-
196
- #list-line:hover #title {
197
- text-decoration: underline;
198
- }
199
194
  `;
200
195
  }
201
196
  };
@@ -1 +1 @@
1
- {"version":3,"file":"tile-list-compact.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list-compact.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SortParam } from '@internetarchive/search-service';\nimport DOMPurify from 'dompurify';\nimport { TileModel } from '../../models';\nimport { formatCount, NumberFormat } from '../../utils/format-count';\nimport { formatDate, DateFormat } from '../../utils/format-date';\nimport { accountLabel } from './account-label';\nimport '../mediatype-icon';\n\n@customElement('tile-list-compact')\nexport class TileListCompact extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) sortParam: SortParam | null = null;\n\n @property({ type: Number }) mobileBreakpoint?: number;\n\n @property({ type: String }) baseImageUrl?: string;\n\n render() {\n return html`\n <div id=\"list-line\" class=\"${this.classSize}\">\n <div id=\"thumb\">${this.imageTemplate}</div>\n <div id=\"title\">${DOMPurify.sanitize(this.model?.title ?? '')}</div>\n <div id=\"creator\">\n ${this.model?.mediatype === 'account'\n ? accountLabel(this.model?.dateAdded)\n : DOMPurify.sanitize(this.model?.creator ?? '')}\n </div>\n <div id=\"date\">${formatDate(this.date, this.formatSize)}</div>\n <div id=\"icon\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n .collections=${this.model?.collections}\n style=\"--iconCustomFillColor: ${ifDefined(this.collectionColor)}\"\n >\n </mediatype-icon>\n </div>\n <div id=\"views\">\n ${formatCount(this.model?.viewCount ?? 0, this.formatSize)}\n </div>\n </div>\n `;\n }\n\n // Only in list, not tile\n private get collectionColor() {\n if (this.model?.mediatype !== 'collection') {\n return undefined;\n }\n return '#4666FF';\n }\n\n private get imageTemplate() {\n if (!this.model?.identifier) {\n return nothing;\n }\n return html` <img\n src=\"${this.baseImageUrl}/services/img/${this.model.identifier}\"\n alt=\"${this.model.identifier}\"\n class=\"${this.model?.mediatype}\"\n />`;\n }\n\n /*\n * TODO: fix field names to match model in src/collection-browser.ts\n * private get dateSortSelector()\n * @see src/models.ts\n */\n private get date(): Date | undefined {\n switch (this.sortParam?.field) {\n case 'date':\n return this.model?.datePublished;\n case 'reviewdate':\n return this.model?.dateReviewed;\n case 'addeddate':\n return this.model?.dateAdded;\n default:\n return this.model?.dateArchived; // publicdate\n }\n }\n\n private get classSize(): string {\n if (\n this.mobileBreakpoint &&\n this.currentWidth &&\n this.currentWidth < this.mobileBreakpoint\n ) {\n return 'mobile';\n }\n return 'desktop';\n }\n\n private get formatSize(): DateFormat | NumberFormat {\n if (\n this.mobileBreakpoint &&\n this.currentWidth &&\n this.currentWidth < this.mobileBreakpoint\n ) {\n return 'short';\n }\n return 'long';\n }\n\n static get styles() {\n return css`\n html {\n font-size: unset;\n }\n\n div {\n font-size: 14px;\n }\n\n /* fields */\n\n #thumb {\n padding-left: 6px;\n }\n\n #thumb img {\n object-fit: cover;\n display: block;\n }\n\n .mobile #thumb img {\n width: 30px;\n height: 30px;\n }\n\n .desktop #thumb img {\n width: 45px;\n height: 45px;\n }\n\n #thumb img.collection {\n border-radius: 8px;\n -webkit-border-radius: 8px;\n -moz-border-radius: 8px;\n }\n\n .mobile #thumb img.account {\n border-radius: 15px;\n -webkit-border-radius: 15px;\n -moz-border-radius: 15px;\n }\n\n .desktop #thumb img.account {\n border-radius: 22.5px;\n -webkit-border-radius: 22.5px;\n -moz-border-radius: 22.5px;\n }\n\n #title {\n color: #4b64ff;\n text-decoration: none;\n }\n\n #title,\n #creator {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n #views {\n text-align: right;\n padding-right: 8px;\n }\n\n .mobile #views {\n display: none;\n }\n\n .mobile mediatype-icon {\n --iconHeight: 14px;\n --iconWidth: 14px;\n }\n\n .desktop #icon {\n --iconHeight: 20px;\n --iconWidth: 20px;\n }\n\n /* list-line */\n\n #list-line {\n display: grid;\n column-gap: 10px;\n border-top: 1px solid #ddd;\n align-items: center;\n line-height: 20px;\n }\n\n #list-line.mobile {\n grid-template-columns: 36px 3fr 2fr 62px 19px;\n padding-top: 2px;\n padding-bottom: 2px;\n }\n\n #list-line.desktop {\n grid-template-columns: 51px 3fr 2fr 100px 20px 60px;\n padding-top: 5px;\n padding-bottom: 5px;\n }\n\n #list-line:hover #title {\n text-decoration: underline;\n }\n `;\n }\n}\n"]}
1
+ {"version":3,"file":"tile-list-compact.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list-compact.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { customElement, property } from 'lit/decorators.js';\nimport { SortParam } from '@internetarchive/search-service';\nimport DOMPurify from 'dompurify';\nimport { TileModel } from '../../models';\nimport { formatCount, NumberFormat } from '../../utils/format-count';\nimport { formatDate, DateFormat } from '../../utils/format-date';\nimport { accountLabel } from './account-label';\nimport '../mediatype-icon';\n\n@customElement('tile-list-compact')\nexport class TileListCompact extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) sortParam: SortParam | null = null;\n\n @property({ type: Number }) mobileBreakpoint?: number;\n\n @property({ type: String }) baseImageUrl?: string;\n\n render() {\n return html`\n <div id=\"list-line\" class=\"${this.classSize}\">\n <div id=\"thumb\" class=\"${ifDefined(this.model?.mediatype)}\">\n ${this.imageTemplate}\n </div>\n <div id=\"title\">${DOMPurify.sanitize(this.model?.title ?? '')}</div>\n <div id=\"creator\">\n ${this.model?.mediatype === 'account'\n ? accountLabel(this.model?.dateAdded)\n : DOMPurify.sanitize(this.model?.creator ?? '')}\n </div>\n <div id=\"date\">${formatDate(this.date, this.formatSize)}</div>\n <div id=\"icon\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n .collections=${this.model?.collections}\n style=\"--iconCustomFillColor: ${ifDefined(this.collectionColor)}\"\n >\n </mediatype-icon>\n </div>\n <div id=\"views\">\n ${formatCount(this.model?.viewCount ?? 0, this.formatSize)}\n </div>\n </div>\n `;\n }\n\n // Only in list, not tile\n private get collectionColor() {\n if (this.model?.mediatype !== 'collection') {\n return undefined;\n }\n return '#4666FF';\n }\n\n private get imageTemplate() {\n if (!this.model?.identifier) {\n return nothing;\n }\n return html`\n <item-image\n .model=${this.model}\n .baseImageUrl=${this.baseImageUrl}\n .isListTile=${true}\n .isCompactTile=${true}\n >\n </item-image>\n `;\n }\n\n /*\n * TODO: fix field names to match model in src/collection-browser.ts\n * private get dateSortSelector()\n * @see src/models.ts\n */\n private get date(): Date | undefined {\n switch (this.sortParam?.field) {\n case 'date':\n return this.model?.datePublished;\n case 'reviewdate':\n return this.model?.dateReviewed;\n case 'addeddate':\n return this.model?.dateAdded;\n default:\n return this.model?.dateArchived; // publicdate\n }\n }\n\n private get classSize(): string {\n if (\n this.mobileBreakpoint &&\n this.currentWidth &&\n this.currentWidth < this.mobileBreakpoint\n ) {\n return 'mobile';\n }\n return 'desktop';\n }\n\n private get formatSize(): DateFormat | NumberFormat {\n if (\n this.mobileBreakpoint &&\n this.currentWidth &&\n this.currentWidth < this.mobileBreakpoint\n ) {\n return 'short';\n }\n return 'long';\n }\n\n static get styles() {\n return css`\n html {\n font-size: unset;\n }\n\n div {\n font-size: 14px;\n }\n\n #list-line {\n display: grid;\n column-gap: 10px;\n border-top: 1px solid #ddd;\n align-items: center;\n line-height: 20px;\n }\n\n #list-line.mobile {\n grid-template-columns: 36px 3fr 2fr 62px 19px;\n }\n\n #list-line.desktop {\n grid-template-columns: 51px 3fr 2fr 100px 20px 60px;\n }\n\n #list-line:hover #title {\n text-decoration: underline;\n }\n\n /* fields */\n #thumb {\n object-fit: cover;\n display: block;\n }\n\n .mobile #thumb {\n width: 30px;\n height: 30px;\n padding-top: 2px;\n padding-bottom: 2px;\n padding-left: 4px;\n }\n\n .desktop #thumb {\n width: 45px;\n height: 45px;\n padding-top: 5px;\n padding-bottom: 5px;\n padding-left: 6px;\n }\n\n #thumb.collection {\n --border-radius: 8px;\n }\n\n .mobile #thumb.account {\n --border-radius: 15px;\n }\n\n .desktop #thumb.account {\n --border-radius: 22.5px;\n }\n\n #title {\n color: #4b64ff;\n text-decoration: none;\n }\n\n #title,\n #creator {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n\n #views {\n text-align: right;\n padding-right: 8px;\n }\n\n .mobile #views {\n display: none;\n }\n\n .mobile mediatype-icon {\n --iconHeight: 14px;\n --iconWidth: 14px;\n }\n\n .desktop #icon {\n --iconHeight: 20px;\n --iconWidth: 20px;\n }\n `;\n }\n}\n"]}