@internetarchive/collection-browser 0.0.1-alpha.7 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (238) hide show
  1. package/README.md +8 -11
  2. package/demo/app-root.ts +30 -96
  3. package/dist/demo/app-root.d.ts +3 -5
  4. package/dist/demo/app-root.js +28 -87
  5. package/dist/demo/app-root.js.map +1 -1
  6. package/dist/index.d.ts +6 -0
  7. package/dist/index.js +6 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/src/assets/img/icons/chevron.d.ts +2 -0
  10. package/dist/src/assets/img/icons/chevron.js +4 -0
  11. package/dist/src/assets/img/icons/chevron.js.map +1 -0
  12. package/dist/src/assets/img/icons/eye-closed.d.ts +2 -0
  13. package/dist/src/assets/img/icons/eye-closed.js +5 -0
  14. package/dist/src/assets/img/icons/eye-closed.js.map +1 -0
  15. package/dist/src/assets/img/icons/eye.d.ts +2 -0
  16. package/dist/src/assets/img/icons/eye.js +5 -0
  17. package/dist/src/assets/img/icons/eye.js.map +1 -0
  18. package/dist/src/assets/img/icons/mediatype/account.d.ts +1 -2
  19. package/dist/src/assets/img/icons/mediatype/account.js +6 -4
  20. package/dist/src/assets/img/icons/mediatype/account.js.map +1 -1
  21. package/dist/src/assets/img/icons/mediatype/audio.js +7 -4
  22. package/dist/src/assets/img/icons/mediatype/audio.js.map +1 -1
  23. package/dist/src/assets/img/icons/mediatype/collection.js +7 -4
  24. package/dist/src/assets/img/icons/mediatype/collection.js.map +1 -1
  25. package/dist/src/assets/img/icons/mediatype/data.d.ts +1 -0
  26. package/dist/src/assets/img/icons/mediatype/data.js +15 -0
  27. package/dist/src/assets/img/icons/mediatype/data.js.map +1 -0
  28. package/dist/src/assets/img/icons/mediatype/etree.js +10 -5
  29. package/dist/src/assets/img/icons/mediatype/etree.js.map +1 -1
  30. package/dist/src/assets/img/icons/mediatype/film.js +2 -1
  31. package/dist/src/assets/img/icons/mediatype/film.js.map +1 -1
  32. package/dist/src/assets/img/icons/mediatype/images.js +9 -6
  33. package/dist/src/assets/img/icons/mediatype/images.js.map +1 -1
  34. package/dist/src/assets/img/icons/mediatype/radio.d.ts +1 -0
  35. package/dist/src/assets/img/icons/mediatype/radio.js +15 -0
  36. package/dist/src/assets/img/icons/mediatype/radio.js.map +1 -0
  37. package/dist/src/assets/img/icons/mediatype/software.js +9 -6
  38. package/dist/src/assets/img/icons/mediatype/software.js.map +1 -1
  39. package/dist/src/assets/img/icons/mediatype/texts.js +9 -6
  40. package/dist/src/assets/img/icons/mediatype/texts.js.map +1 -1
  41. package/dist/src/assets/img/icons/mediatype/tv.js +10 -5
  42. package/dist/src/assets/img/icons/mediatype/tv.js.map +1 -1
  43. package/dist/src/assets/img/icons/mediatype/video.js +10 -6
  44. package/dist/src/assets/img/icons/mediatype/video.js.map +1 -1
  45. package/dist/src/assets/img/icons/mediatype/web.js +9 -6
  46. package/dist/src/assets/img/icons/mediatype/web.js.map +1 -1
  47. package/dist/src/collection-browser.d.ts +57 -20
  48. package/dist/src/collection-browser.js +511 -128
  49. package/dist/src/collection-browser.js.map +1 -1
  50. package/dist/src/collection-facets.d.ts +27 -6
  51. package/dist/src/collection-facets.js +316 -100
  52. package/dist/src/collection-facets.js.map +1 -1
  53. package/dist/src/language-code-handler/language-code-handler.d.ts +37 -0
  54. package/dist/src/language-code-handler/language-code-handler.js +27 -0
  55. package/dist/src/language-code-handler/language-code-handler.js.map +1 -0
  56. package/dist/src/language-code-handler/language-code-mapping.d.ts +1 -0
  57. package/dist/src/language-code-handler/language-code-mapping.js +563 -0
  58. package/dist/src/language-code-handler/language-code-mapping.js.map +1 -0
  59. package/dist/src/mediatype/mediatype-config.d.ts +3 -0
  60. package/dist/src/mediatype/mediatype-config.js +86 -0
  61. package/dist/src/mediatype/mediatype-config.js.map +1 -0
  62. package/dist/src/models.d.ts +72 -13
  63. package/dist/src/models.js +57 -1
  64. package/dist/src/models.js.map +1 -1
  65. package/dist/src/restoration-state-handler.d.ts +38 -0
  66. package/dist/src/restoration-state-handler.js +204 -0
  67. package/dist/src/restoration-state-handler.js.map +1 -0
  68. package/dist/src/sort-filter-bar/alpha-bar.d.ts +1 -2
  69. package/dist/src/sort-filter-bar/alpha-bar.js +12 -8
  70. package/dist/src/sort-filter-bar/alpha-bar.js.map +1 -1
  71. package/dist/src/sort-filter-bar/img/compact.d.ts +1 -0
  72. package/dist/src/sort-filter-bar/img/compact.js +5 -0
  73. package/dist/src/sort-filter-bar/img/compact.js.map +1 -0
  74. package/dist/src/sort-filter-bar/img/list.d.ts +1 -0
  75. package/dist/src/sort-filter-bar/img/list.js +5 -0
  76. package/dist/src/sort-filter-bar/img/list.js.map +1 -0
  77. package/dist/src/sort-filter-bar/img/sort-triangle.d.ts +1 -0
  78. package/dist/src/sort-filter-bar/img/sort-triangle.js +5 -0
  79. package/dist/src/sort-filter-bar/img/sort-triangle.js.map +1 -0
  80. package/dist/src/sort-filter-bar/img/tile.d.ts +1 -0
  81. package/dist/src/sort-filter-bar/img/tile.js +5 -0
  82. package/dist/src/sort-filter-bar/img/tile.js.map +1 -0
  83. package/dist/src/sort-filter-bar/sort-filter-bar.d.ts +74 -13
  84. package/dist/src/sort-filter-bar/sort-filter-bar.js +547 -172
  85. package/dist/src/sort-filter-bar/sort-filter-bar.js.map +1 -1
  86. package/dist/src/tiles/{loading-tile.d.ts → collection-browser-loading-tile.d.ts} +1 -1
  87. package/dist/src/tiles/collection-browser-loading-tile.js +32 -0
  88. package/dist/src/tiles/collection-browser-loading-tile.js.map +1 -0
  89. package/dist/src/tiles/grid/account-tile.d.ts +1 -1
  90. package/dist/src/tiles/grid/account-tile.js +5 -5
  91. package/dist/src/tiles/grid/account-tile.js.map +1 -1
  92. package/dist/src/tiles/grid/collection-tile.js +1 -2
  93. package/dist/src/tiles/grid/collection-tile.js.map +1 -1
  94. package/dist/src/tiles/grid/icons/views.d.ts +1 -1
  95. package/dist/src/tiles/grid/icons/views.js +2 -2
  96. package/dist/src/tiles/grid/icons/views.js.map +1 -1
  97. package/dist/src/tiles/grid/item-tile.d.ts +2 -2
  98. package/dist/src/tiles/grid/item-tile.js +58 -150
  99. package/dist/src/tiles/grid/item-tile.js.map +1 -1
  100. package/dist/src/tiles/item-image.d.ts +19 -0
  101. package/dist/src/tiles/item-image.js +204 -0
  102. package/dist/src/tiles/item-image.js.map +1 -0
  103. package/dist/src/tiles/list/account-label.d.ts +1 -0
  104. package/dist/src/tiles/list/account-label.js +7 -0
  105. package/dist/src/tiles/list/account-label.js.map +1 -0
  106. package/dist/src/tiles/list/date-label.d.ts +1 -0
  107. package/dist/src/tiles/list/date-label.js +13 -0
  108. package/dist/src/tiles/list/date-label.js.map +1 -0
  109. package/dist/src/tiles/list/tile-list-compact-header.d.ts +12 -0
  110. package/dist/src/tiles/list/tile-list-compact-header.js +84 -0
  111. package/dist/src/tiles/list/tile-list-compact-header.js.map +1 -0
  112. package/dist/src/tiles/list/tile-list-compact.d.ts +12 -0
  113. package/dist/src/tiles/list/tile-list-compact.js +203 -6
  114. package/dist/src/tiles/list/tile-list-compact.js.map +1 -1
  115. package/dist/src/tiles/list/tile-list.d.ts +35 -10
  116. package/dist/src/tiles/list/tile-list.js +368 -104
  117. package/dist/src/tiles/list/tile-list.js.map +1 -1
  118. package/dist/src/{mediatype-icon.d.ts → tiles/mediatype-icon.d.ts} +2 -2
  119. package/dist/src/tiles/mediatype-icon.js +78 -0
  120. package/dist/src/tiles/mediatype-icon.js.map +1 -0
  121. package/dist/src/tiles/tile-dispatcher.d.ts +11 -4
  122. package/dist/src/tiles/tile-dispatcher.js +56 -19
  123. package/dist/src/tiles/tile-dispatcher.js.map +1 -1
  124. package/dist/src/utils/format-date.js +2 -2
  125. package/dist/src/utils/format-date.js.map +1 -1
  126. package/dist/test/collection-browser.test.d.ts +1 -0
  127. package/dist/test/collection-browser.test.js +16 -2
  128. package/dist/test/collection-browser.test.js.map +1 -1
  129. package/dist/test/{utils/format-string.test.d.ts → mediatype-config.test.d.ts} +0 -0
  130. package/dist/test/mediatype-config.test.js +17 -0
  131. package/dist/test/mediatype-config.test.js.map +1 -0
  132. package/dist/test/utils/format-date.test.js +1 -1
  133. package/dist/test/utils/format-date.test.js.map +1 -1
  134. package/index.ts +6 -0
  135. package/local.archive.org.cert +86 -0
  136. package/local.archive.org.key +27 -0
  137. package/package.json +9 -5
  138. package/src/assets/img/icons/chevron.ts +4 -0
  139. package/src/assets/img/icons/eye-closed.ts +5 -0
  140. package/src/assets/img/icons/eye.ts +5 -0
  141. package/src/assets/img/icons/mediatype/account.ts +6 -4
  142. package/src/assets/img/icons/mediatype/audio.ts +7 -4
  143. package/src/assets/img/icons/mediatype/collection.ts +7 -4
  144. package/src/assets/img/icons/mediatype/data.ts +15 -0
  145. package/src/assets/img/icons/mediatype/etree.ts +10 -5
  146. package/src/assets/img/icons/mediatype/film.ts +2 -1
  147. package/src/assets/img/icons/mediatype/images.ts +9 -6
  148. package/src/assets/img/icons/mediatype/radio.ts +15 -0
  149. package/src/assets/img/icons/mediatype/software.ts +9 -6
  150. package/src/assets/img/icons/mediatype/texts.ts +9 -6
  151. package/src/assets/img/icons/mediatype/tv.ts +10 -5
  152. package/src/assets/img/icons/mediatype/video.ts +10 -6
  153. package/src/assets/img/icons/mediatype/web.ts +9 -6
  154. package/src/collection-browser.ts +537 -123
  155. package/src/collection-facets.ts +352 -132
  156. package/src/language-code-handler/language-code-handler.ts +64 -0
  157. package/src/language-code-handler/language-code-mapping.ts +564 -0
  158. package/src/mediatype/mediatype-config.ts +86 -0
  159. package/src/models.ts +141 -13
  160. package/src/restoration-state-handler.ts +266 -0
  161. package/src/sort-filter-bar/alpha-bar.ts +12 -8
  162. package/src/sort-filter-bar/img/compact.ts +5 -0
  163. package/src/sort-filter-bar/img/list.ts +5 -0
  164. package/src/sort-filter-bar/img/sort-triangle.ts +5 -0
  165. package/src/sort-filter-bar/img/tile.ts +5 -0
  166. package/src/sort-filter-bar/sort-filter-bar.ts +604 -176
  167. package/src/tiles/collection-browser-loading-tile.ts +29 -0
  168. package/src/tiles/grid/account-tile.ts +1 -1
  169. package/src/tiles/grid/collection-tile.ts +1 -2
  170. package/src/tiles/grid/icons/views.ts +2 -2
  171. package/src/tiles/grid/item-tile.ts +57 -162
  172. package/src/tiles/item-image.ts +206 -0
  173. package/src/tiles/list/account-label.ts +6 -0
  174. package/src/tiles/list/date-label.ts +12 -0
  175. package/src/tiles/list/tile-list-compact-header.ts +77 -0
  176. package/src/tiles/list/tile-list-compact.ts +218 -0
  177. package/src/tiles/list/tile-list.ts +412 -107
  178. package/src/tiles/mediatype-icon.ts +75 -0
  179. package/src/tiles/tile-dispatcher.ts +66 -18
  180. package/src/utils/format-date.ts +2 -2
  181. package/test/collection-browser.test.ts +20 -1
  182. package/test/mediatype-config.test.ts +18 -0
  183. package/test/utils/format-date.test.ts +1 -1
  184. package/web-dev-server.config.mjs +3 -1
  185. package/dist/src/assets/img/icons/audio.d.ts +0 -1
  186. package/dist/src/assets/img/icons/audio.js +0 -9
  187. package/dist/src/assets/img/icons/audio.js.map +0 -1
  188. package/dist/src/assets/img/icons/collection.d.ts +0 -1
  189. package/dist/src/assets/img/icons/collection.js +0 -9
  190. package/dist/src/assets/img/icons/collection.js.map +0 -1
  191. package/dist/src/assets/img/icons/etree.d.ts +0 -1
  192. package/dist/src/assets/img/icons/etree.js +0 -9
  193. package/dist/src/assets/img/icons/etree.js.map +0 -1
  194. package/dist/src/assets/img/icons/images.d.ts +0 -1
  195. package/dist/src/assets/img/icons/images.js +0 -10
  196. package/dist/src/assets/img/icons/images.js.map +0 -1
  197. package/dist/src/assets/img/icons/mediatype/etree copy.d.ts +0 -1
  198. package/dist/src/assets/img/icons/mediatype/etree copy.js +0 -9
  199. package/dist/src/assets/img/icons/mediatype/etree copy.js.map +0 -1
  200. package/dist/src/assets/img/icons/mediatype/livemusic.d.ts +0 -1
  201. package/dist/src/assets/img/icons/mediatype/livemusic.js +0 -7
  202. package/dist/src/assets/img/icons/mediatype/livemusic.js.map +0 -1
  203. package/dist/src/assets/img/icons/mediatype/photos.d.ts +0 -1
  204. package/dist/src/assets/img/icons/mediatype/photos.js +0 -7
  205. package/dist/src/assets/img/icons/mediatype/photos.js.map +0 -1
  206. package/dist/src/assets/img/icons/software.d.ts +0 -1
  207. package/dist/src/assets/img/icons/software.js +0 -10
  208. package/dist/src/assets/img/icons/software.js.map +0 -1
  209. package/dist/src/assets/img/icons/texts.d.ts +0 -1
  210. package/dist/src/assets/img/icons/texts.js +0 -10
  211. package/dist/src/assets/img/icons/texts.js.map +0 -1
  212. package/dist/src/assets/img/icons/tv.d.ts +0 -1
  213. package/dist/src/assets/img/icons/tv.js +0 -9
  214. package/dist/src/assets/img/icons/tv.js.map +0 -1
  215. package/dist/src/assets/img/icons/video.d.ts +0 -1
  216. package/dist/src/assets/img/icons/video.js +0 -10
  217. package/dist/src/assets/img/icons/video.js.map +0 -1
  218. package/dist/src/assets/img/icons/web.d.ts +0 -1
  219. package/dist/src/assets/img/icons/web.js +0 -10
  220. package/dist/src/assets/img/icons/web.js.map +0 -1
  221. package/dist/src/mediatype-icon.js +0 -89
  222. package/dist/src/mediatype-icon.js.map +0 -1
  223. package/dist/src/search-handler.d.ts +0 -11
  224. package/dist/src/search-handler.js +0 -34
  225. package/dist/src/search-handler.js.map +0 -1
  226. package/dist/src/tiles/list/tile-list-detail.d.ts +0 -7
  227. package/dist/src/tiles/list/tile-list-detail.js +0 -28
  228. package/dist/src/tiles/list/tile-list-detail.js.map +0 -1
  229. package/dist/src/tiles/loading-tile.js +0 -73
  230. package/dist/src/tiles/loading-tile.js.map +0 -1
  231. package/dist/src/utils/format-string.d.ts +0 -2
  232. package/dist/src/utils/format-string.js +0 -7
  233. package/dist/src/utils/format-string.js.map +0 -1
  234. package/dist/test/utils/format-string.test.js +0 -17
  235. package/dist/test/utils/format-string.test.js.map +0 -1
  236. package/src/assets/img/icons/mediatype/foo.svg +0 -5
  237. package/src/mediatype-icon.ts +0 -83
  238. package/src/tiles/loading-tile.ts +0 -70
@@ -0,0 +1,29 @@
1
+ import { css, html, LitElement } from 'lit';
2
+ import { customElement } from 'lit/decorators.js';
3
+
4
+ @customElement('collection-browser-loading-tile')
5
+ export class CollectionBrowserLoadingTile extends LitElement {
6
+ render() {
7
+ return html` <div id="container"></div> `;
8
+ }
9
+
10
+ static get styles() {
11
+ return css`
12
+ :host {
13
+ display: block;
14
+ height: 100%;
15
+ }
16
+
17
+ #container {
18
+ background: linear-gradient(
19
+ to right,
20
+ rgba(25, 69, 154, 0.1),
21
+ rgb(105, 161, 234, 0.2)
22
+ );
23
+ background-size: 100% 100%;
24
+ display: block;
25
+ height: 100%;
26
+ }
27
+ `;
28
+ }
29
+ }
@@ -8,7 +8,7 @@ import { reviewsIcon } from './icons/reviews';
8
8
  import { uploadIcon } from './icons/upload';
9
9
 
10
10
  @customElement('account-tile')
11
- export class UserTile extends LitElement {
11
+ export class AccountTile extends LitElement {
12
12
  @property({ type: Object }) model?: TileModel;
13
13
 
14
14
  render() {
@@ -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,6 +1,6 @@
1
- import { html } from 'lit';
1
+ import { svg } from 'lit';
2
2
 
3
- export default html`
3
+ export default svg`
4
4
  <svg viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg">
5
5
  <path
6
6
  d="m98 50.5704143c-.2830293-.471515-.671154-1.1088947-1.1643742-1.9121392s-1.6003642-2.3617474-3.3214321-4.6755089c-1.7210678-2.3137614-3.522258-4.5325939-5.4035703-6.6564975-1.8813124-2.1239037-4.2828993-4.473133-7.2047606-7.0476881-2.9218612-2.5745551-5.8895067-4.7933876-8.9029363-6.6564976-3.0134295-1.86311-6.4628491-3.4330878-10.3482587-4.7099336-3.8854095-1.2768458-7.7822651-1.9142256-11.6905667-1.9121443-3.9083017.0020914-7.8051573.6154781-11.6905668 1.8401652-3.8854096 1.2246871-7.3702078 2.8301329-10.4543947 4.8163375-3.0841869 1.9862045-6.0278997 4.1695691-8.8311384 6.5500937s-5.2048256 4.7652219-7.2047605 7.1540919c-1.99993501 2.38887-3.75430043 4.5722346-5.26309632 6.5500938s-2.63883199 3.583305-3.39010829 4.8163374l-1.13003609 1.8401602c.2830293.4715149.67115403 1.1088946 1.16437421 1.9121391.49322017.8032445 1.5878776 2.3617475 3.28397229 4.6755089s3.47439274 4.521119 5.3348942 6.6220728c1.8605014 2.1009538 4.2506422 4.4387083 7.1704224 7.0132633 2.9197801 2.5745551 5.8874256 4.7819127 8.9029363 6.6220729 3.0155106 1.8401601 6.4774168 3.398663 10.3857184 4.6755088 3.9083017 1.2768458 7.8176438 1.9142256 11.7280266 1.9121443 3.9103827-.0020914 7.7957922-.6154781 11.6562286-1.8401652s7.3337886-2.818658 10.4200566-4.7819127 6.0299808-4.1351444 8.8311384-6.515669 5.2152311-4.7652219 7.2422203-7.1540919 3.8052873-4.5607597 5.3348942-6.515669c1.5296068-1.9549093 2.6721295-3.5488802 3.427568-4.7819127zm-24.5142913 0c0 6.467683-2.3079374 12.0152859-6.9238123 16.6428087s-10.1495139 6.9412843-16.600917 6.9412843c-6.4992683 0-12.0453939-2.3137615-16.6383767-6.9412843s-6.8894742-10.1751257-6.8894742-16.6428087 2.2964914-12.003811 6.8894742-16.608384 10.1391084-6.9068595 16.6383767-6.9068595c6.4534842 0 11.9871232 2.3022865 16.600917 6.9068595s6.9217312 10.140701 6.9238123 16.608384zm-23.5247293-10.552755c2.8261308 0 5.2870289 1.0619518 7.3826944 3.1858555 2.0956655 2.1239036 3.1434982 4.5795368 3.1434982 7.3668995 0 2.8332624-1.0478327 5.2888956-3.1434982 7.3668995-2.0956655 2.078004-4.5565636 3.1170059-7.3826944 3.1170059-2.873996 0-5.3348941-1.0264838-7.3826944-3.0794516-2.0478002-2.0529677-3.0717003-4.5200758-3.0717003-7.4013243 0-2.8332624 1.0239001-5.3003705 3.0717003-7.4013243 2.0478003-2.1009538 4.5086984-3.1514307 7.3826944-3.1514307z"
@@ -1,90 +1,74 @@
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
+
3
5
  import { TileModel } from '../../models';
4
6
  import { formatCount } from '../../utils/format-count';
5
7
 
6
- import '../../mediatype-icon';
7
-
8
8
  import { favoriteFilledIcon } from './icons/favorite-filled';
9
9
  import { reviewsIcon } from './icons/reviews';
10
10
  import viewsIcon from './icons/views';
11
11
 
12
+ import '../mediatype-icon';
13
+ import '../item-image';
14
+
12
15
  @customElement('item-tile')
13
16
  export class ItemTile extends LitElement {
14
17
  @property({ type: Object }) model?: TileModel;
15
18
 
16
19
  @property({ type: String }) baseNavigationUrl?: string;
17
20
 
18
- get renderItemImageView() {
19
- const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.identifier}`;
20
- const containsDeemphasize = this.model?.collections.includes('deemphasize');
21
- return !containsDeemphasize
22
- ? html`<div
23
- id="item-image"
24
- style="background-image:url(${imgSrcUrl})"
25
- ></div>`
26
- : html`<div id="item-image-box">
27
- <div
28
- id="item-image-deemphasize"
29
- style="background-image:url(${imgSrcUrl})"
30
- ></div>
31
- <div class="tile-action no-preview">Content may be inappropriate</div>
32
- </div>`;
33
- }
34
-
35
21
  render() {
36
- const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.collections[0]}`;
37
22
  const itemTitle = this.model?.title || '';
38
23
  const itemCreator = this.model?.creator || '-';
39
24
 
40
25
  return html`
41
26
  <div id="container">
42
- <div id="stealth-popup">
43
- <div id="collection-image" style="background-image:url(${imgSrcUrl})"></div>
44
- <p id="collection-name">${this.model?.collections[0]}</p>
45
- </div>
46
27
  <div id="title-image-container">
47
- <p id="item-title" title=${itemTitle}>
48
- ${this.model?.title}
49
- </p>
28
+ <h1 id="item-title" title=${itemTitle}>${this.model?.title}</h1>
50
29
  <div id="item-image-container">
51
- ${this.renderItemImageView}
30
+ <item-image
31
+ .model=${this.model}
32
+ .baseNavigationUrl=${this.baseNavigationUrl}
33
+ >
34
+ </item-image>
52
35
  </div>
53
36
  <div class="item-creator">
54
- <span id="text-by">By:</span>
55
- <span>${itemCreator}</span>
37
+ <div class="truncated">
38
+ <span><strong>By:&nbsp;</strong>${itemCreator}</span>
39
+ </div>
56
40
  </div>
57
41
  </div>
42
+
43
+ <div class="hr"></div>
44
+
58
45
  <div id="item-stats-container">
59
46
  <div id="stats-holder">
60
47
  <div class="col">
61
- <mediatype-icon mediatype="${
62
- this.model?.mediatype
63
- }" showText="true">
48
+ <mediatype-icon
49
+ .mediatype=${this.model?.mediatype}
50
+ .collection=${this.model?.collections}
51
+ ?showText=${true}
52
+ >
53
+ </mediatype-icon>
64
54
  </div>
65
55
  <div class="col">
66
56
  ${viewsIcon}
67
- <p class="status-text">${formatCount(
68
- this.model?.viewCount,
69
- 'short',
70
- 'short'
71
- )}</p>
57
+ <p class="status-text">
58
+ ${formatCount(this.model?.viewCount, 'short', 'short')}
59
+ </p>
72
60
  </div>
73
61
  <div class="col">
74
62
  ${favoriteFilledIcon}
75
- <p class="status-text">${formatCount(
76
- this.model?.itemCount,
77
- 'short',
78
- 'short'
79
- )}</p>
63
+ <p class="status-text">
64
+ ${formatCount(this.model?.itemCount, 'short', 'short')}
65
+ </p>
80
66
  </div>
81
67
  <div class="col">
82
68
  ${reviewsIcon}
83
- <p class="status-text">${formatCount(
84
- this.model?.favCount,
85
- 'short',
86
- 'short'
87
- )}</p>
69
+ <p class="status-text">
70
+ ${formatCount(this.model?.favCount, 'short', 'short')}
71
+ </p>
88
72
  </div>
89
73
  </div>
90
74
  </div>
@@ -103,18 +87,18 @@ export class ItemTile extends LitElement {
103
87
  display: flex;
104
88
  flex-direction: column;
105
89
  height: 100%;
90
+ position: relative;
106
91
  }
107
92
 
108
93
  #title-image-container {
109
94
  display: flex;
110
95
  flex: 1;
111
96
  flex-direction: column;
112
- padding: 0.5rem;
97
+ padding: 0.5rem 0.5rem 0 0.5rem;
113
98
  }
114
99
 
115
100
  #item-title {
116
- font-weight: bold;
117
- color: #000000;
101
+ color: #2c2c2c;
118
102
  font-size: 1.6rem;
119
103
  text-align: center;
120
104
  margin-top: 0rem;
@@ -134,59 +118,6 @@ export class ItemTile extends LitElement {
134
118
  flex: 1;
135
119
  }
136
120
 
137
- #item-image {
138
- width: 16rem;
139
- height: 16rem;
140
- border-radius: 0.8rem;
141
- overflow: hidden;
142
- box-shadow: 1px 1px 2px 0px;
143
- object-fit: cover;
144
- background-position: center;
145
- background-size: cover;
146
- }
147
-
148
- #item-image-box {
149
- width: 16rem;
150
- height: 16rem;
151
- border-radius: 0.8rem;
152
- overflow: hidden;
153
- box-shadow: 1px 1px 2px 0px;
154
- border: 5px solid #0000000;
155
- position: relative;
156
- display: flex;
157
- }
158
-
159
- #item-image-deemphasize {
160
- width: 16rem;
161
- height: 16rem;
162
- object-fit: cover;
163
- background-position: center;
164
- background-size: cover;
165
- filter: blur(15px);
166
- position: absolute;
167
- z-index: 1;
168
- }
169
-
170
- .tile-action {
171
- border: 2px solid currentColor;
172
- border-radius: 1px;
173
- padding: 5px;
174
- font-weight: 500;
175
- width: auto;
176
- position: absolute;
177
- z-index: 2;
178
- display: flex;
179
- top: 5.5rem;
180
- }
181
-
182
- .no-preview {
183
- background-color: #fffecb;
184
- color: #000000;
185
- font-size: 1.4rem;
186
- line-height: 2rem;
187
- text-align: center;
188
- }
189
-
190
121
  .hidden {
191
122
  display: none;
192
123
  }
@@ -205,21 +136,33 @@ export class ItemTile extends LitElement {
205
136
  }
206
137
 
207
138
  .item-creator {
208
- color: #000000;
209
- display: -webkit-box;
210
- font-size: 1.4rem;
139
+ display: flex;
140
+ justify-content: center;
141
+ align-items: flex-end; /* Important to start text from bottom */
211
142
  height: 3rem;
212
- margin: 0px;
213
- overflow: hidden;
214
- padding: 0.5rem;
215
- text-align: center;
216
- text-overflow: ellipsis;
143
+ padding-top: 1rem;
144
+ }
145
+
146
+ .truncated {
147
+ flex: 1;
148
+ min-width: 0; /* Important for long words! */
149
+ }
150
+
151
+ .truncated span {
152
+ font-size: 1.4rem;
153
+ color: #2c2c2c;
217
154
  -webkit-line-clamp: 2;
155
+ text-overflow: ellipsis;
156
+ overflow: hidden;
157
+ display: -webkit-box;
218
158
  -webkit-box-orient: vertical;
159
+ word-wrap: break-word;
160
+ line-height: 2rem;
161
+ text-align: center;
219
162
  }
220
163
 
221
- #text-by {
222
- font-weight: bold;
164
+ .hr {
165
+ border: 0.5px solid #ccc;
223
166
  }
224
167
 
225
168
  #item-stats-container {
@@ -255,54 +198,6 @@ export class ItemTile extends LitElement {
255
198
  .col {
256
199
  width: 25%;
257
200
  }
258
-
259
- #container:hover #stealth-popup {
260
- margin-top: -30px;
261
- visiblity: visible;
262
- opacity: 1;
263
- }
264
-
265
- #stealth-popup {
266
- transition: margin-top 0.3s ease, opacity 0.3s ease;
267
- position: absolute;
268
- visiblity: hidden;
269
- z-index: 1;
270
- opacity: 0;
271
- color: black;
272
- margin-top: -15px;
273
- margin-left: -15px;
274
- text-align: left;
275
- display: flex;
276
- align-items: center;
277
- }
278
-
279
- #collection-image {
280
- transition: opacity 0.3s ease;
281
- width: 4.5rem;
282
- height: 4.5rem;
283
- border-radius: 22px;
284
- box-shadow: 0px 0px 10px #ccc;
285
- background-color: white;
286
- border: 2px solid #ddd;
287
- overflow: hidden;
288
- background-size: cover;
289
- background-repeat: no-repeat;
290
- background-position: center center;
291
- }
292
-
293
- #collection-name {
294
- width: 160px;
295
- line-height: 1;
296
- max-height: 25px;
297
- font-size: 12px;
298
- font-weight: bold;
299
- display: -webkit-box;
300
- -webkit-box-orient: vertical;
301
- -webkit-line-clamp: 2;
302
- overflow: hidden;
303
- bottom: 20px;
304
- padding: 1rem;
305
- }
306
201
  `;
307
202
  }
308
203
  }
@@ -0,0 +1,206 @@
1
+ import {
2
+ css,
3
+ CSSResultGroup,
4
+ html,
5
+ nothing,
6
+ PropertyValues,
7
+ LitElement,
8
+ } from 'lit';
9
+ import { customElement, property, state } from 'lit/decorators.js';
10
+ import { ifDefined } from 'lit/directives/if-defined.js';
11
+
12
+ import { TileModel } from '../models';
13
+
14
+ @customElement('item-image')
15
+ export class ItemImage extends LitElement {
16
+ @property({ type: Object }) model?: TileModel;
17
+
18
+ @property({ type: String }) baseNavigationUrl?: string;
19
+
20
+ @property({ type: Boolean }) isListTile = false;
21
+
22
+ @state() private isDeemphasize = false;
23
+
24
+ protected updated(changed: PropertyValues): void {
25
+ if (changed.has('model')) {
26
+ this.setDeemphsize();
27
+ }
28
+ }
29
+
30
+ private setDeemphsize() {
31
+ this.isDeemphasize =
32
+ this.model?.collections.includes('deemphasize') ?? false;
33
+ }
34
+
35
+ render() {
36
+ return html`
37
+ <div class=${ifDefined(this.imageBoxClass)}>
38
+ ${this.model?.mediatype === 'audio'
39
+ ? this.waveformTemplate
40
+ : this.backgroundImageTemplate}
41
+ ${this.tileActionTemplate}
42
+ </div>
43
+ `;
44
+ }
45
+
46
+ private get imageSrc() {
47
+ return `${this.baseNavigationUrl}/services/img/${this.model?.identifier}`;
48
+ }
49
+
50
+ // Templates
51
+ private get backgroundImageTemplate() {
52
+ return html`
53
+ <div
54
+ class=${this.imageClass}
55
+ style="background-image:url(${this.imageSrc})"
56
+ ></div>
57
+ `;
58
+ }
59
+
60
+ private get waveformTemplate() {
61
+ return html`
62
+ <div class="box" id=${this.randomGradient}>
63
+ <img
64
+ class="item-image waveform"
65
+ src="${this.imageSrc}"
66
+ alt="${ifDefined(this.model?.identifier)}"
67
+ />
68
+ </div>
69
+ `;
70
+ }
71
+
72
+ private get tileActionTemplate() {
73
+ if (!this.isDeemphasize) {
74
+ return nothing;
75
+ }
76
+ return html`
77
+ <div class="tile-action no-preview">Content may be inappropriate</div>
78
+ `;
79
+ }
80
+
81
+ // Classes
82
+ private get imageClass() {
83
+ return `item-image ${this.isDeemphasize ? 'deemphasize' : 'default'}`;
84
+ }
85
+
86
+ private get imageBoxClass() {
87
+ return this.isDeemphasize ? 'item-image-box' : undefined;
88
+ }
89
+
90
+ private get randomGradient() {
91
+ return `grad${Math.floor(Math.random() * (6 - 1) + 1)}`;
92
+ }
93
+
94
+ static get styles(): CSSResultGroup {
95
+ return css`
96
+ .item-image-box {
97
+ width: 16rem;
98
+ height: 16rem;
99
+ overflow: hidden;
100
+ position: relative;
101
+ box-shadow: 1px 1px 2px 0px;
102
+ display: flex;
103
+ }
104
+
105
+ .item-image {
106
+ width: 16rem;
107
+ height: 16rem;
108
+ object-fit: cover;
109
+ background-repeat: no-repeat;
110
+ background-position: center center;
111
+ position: relative;
112
+ -webkit-appearance: none;
113
+ overflow: visible;
114
+ }
115
+
116
+ .waveform {
117
+ mix-blend-mode: screen;
118
+ }
119
+
120
+ .default {
121
+ background-size: contain;
122
+ filter: drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.8));
123
+ }
124
+
125
+ .deemphasize {
126
+ background-size: cover;
127
+ filter: blur(15px);
128
+ z-index: 1;
129
+ }
130
+
131
+ .tile-action {
132
+ border: 1px solid currentColor;
133
+ border-radius: 1px;
134
+ padding: 5px;
135
+ font-weight: 500;
136
+ width: auto;
137
+ position: absolute;
138
+ z-index: 2;
139
+ display: flex;
140
+ top: 5.5rem;
141
+ }
142
+
143
+ .no-preview {
144
+ background-color: #fffecb;
145
+ color: #2c2c2c;
146
+ font-size: 1.4rem;
147
+ line-height: 2rem;
148
+ text-align: center;
149
+ }
150
+
151
+ #grad1 {
152
+ background: linear-gradient(
153
+ hsl(300, 80%, 55%),
154
+ hsl(330, 80%, 33%) 35%,
155
+ hsl(330, 80%, 22%) 70%,
156
+ hsl(0, 0%, 0%)
157
+ );
158
+ }
159
+
160
+ #grad2 {
161
+ background: linear-gradient(
162
+ hsl(200, 80%, 55%),
163
+ hsl(230, 80%, 33%) 35%,
164
+ hsl(230, 80%, 22%) 70%,
165
+ hsl(0, 0%, 0%)
166
+ );
167
+ }
168
+
169
+ #grad3 {
170
+ background: linear-gradient(
171
+ hsl(160, 80%, 55%),
172
+ hsl(190, 80%, 33%) 35%,
173
+ hsl(190, 80%, 22%) 70%,
174
+ hsl(0, 0%, 0%)
175
+ );
176
+ }
177
+
178
+ #grad4 {
179
+ background: linear-gradient(
180
+ hsl(250, 80%, 55%),
181
+ hsl(280, 80%, 33%) 35%,
182
+ hsl(280, 80%, 22%) 70%,
183
+ hsl(0, 0%, 0%)
184
+ );
185
+ }
186
+
187
+ #grad5 {
188
+ background: linear-gradient(
189
+ hsl(280, 80%, 55%),
190
+ hsl(310, 80%, 33%) 35%,
191
+ hsl(310, 80%, 22%) 70%,
192
+ hsl(0, 0%, 0%)
193
+ );
194
+ }
195
+
196
+ #grad6 {
197
+ background: linear-gradient(
198
+ hsl(340, 80%, 55%),
199
+ hsl(0, 80%, 33%) 35%,
200
+ hsl(0, 80%, 22%) 70%,
201
+ hsl(0, 0%, 0%)
202
+ );
203
+ }
204
+ `;
205
+ }
206
+ }
@@ -0,0 +1,6 @@
1
+ export function accountLabel(date: Date | undefined): string {
2
+ if (!date) {
3
+ return '';
4
+ }
5
+ return `Archivist since ${date.getFullYear()}`;
6
+ }
@@ -0,0 +1,12 @@
1
+ export function dateLabel(sortField: string | undefined): string {
2
+ switch (sortField) {
3
+ case 'date':
4
+ return 'Published';
5
+ case 'reviewdate':
6
+ return 'Reviewed';
7
+ case 'addeddate':
8
+ return 'Added';
9
+ default:
10
+ return 'Archived';
11
+ }
12
+ }
@@ -0,0 +1,77 @@
1
+ import { css, html, LitElement } from 'lit';
2
+ import { customElement, property } from 'lit/decorators.js';
3
+ import { SortParam } from '@internetarchive/search-service';
4
+ import { dateLabel } from './date-label';
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 | null = null;
14
+
15
+ @property({ type: Number }) mobileBreakpoint?: number;
16
+
17
+ render() {
18
+ return html`
19
+ <div id="list-line-header" class="${this.classSize}">
20
+ <div id="thumb"></div>
21
+ <div id="title">Title</div>
22
+ <div id="creator">Creator</div>
23
+ <div id="date">${dateLabel(this.sortParam?.field)}</div>
24
+ <div id="icon"></div>
25
+ <div id="views">Views</div>
26
+ </div>
27
+ `;
28
+ }
29
+
30
+ private get classSize(): string {
31
+ if (
32
+ this.mobileBreakpoint &&
33
+ this.currentWidth &&
34
+ this.currentWidth < this.mobileBreakpoint
35
+ ) {
36
+ return 'mobile';
37
+ }
38
+ return 'desktop';
39
+ }
40
+
41
+ static get styles() {
42
+ return css`
43
+ html {
44
+ font-size: unset;
45
+ }
46
+
47
+ div {
48
+ font-size: 14px;
49
+ font-weight: bold;
50
+ line-height: 20px;
51
+ }
52
+
53
+ .mobile #views {
54
+ display: none;
55
+ }
56
+
57
+ #views {
58
+ text-align: right;
59
+ }
60
+
61
+ #list-line-header {
62
+ display: grid;
63
+ column-gap: 10px;
64
+ align-items: flex-end;
65
+ padding-bottom: 2px;
66
+ }
67
+
68
+ #list-line-header.mobile {
69
+ grid-template-columns: 36px 3fr 2fr 91px;
70
+ }
71
+
72
+ #list-line-header.desktop {
73
+ grid-template-columns: 51px 3fr 2fr 100px 20px 60px;
74
+ }
75
+ `;
76
+ }
77
+ }