@internetarchive/collection-browser 0.0.1-alpha.21 → 0.0.1-alpha.24
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.
- package/demo/app-root.ts +10 -0
- package/dist/demo/app-root.d.ts +2 -0
- package/dist/demo/app-root.js +8 -0
- package/dist/demo/app-root.js.map +1 -1
- package/dist/src/async-collection-name.d.ts +11 -0
- package/dist/src/async-collection-name.js +38 -0
- package/dist/src/async-collection-name.js.map +1 -0
- package/dist/src/collection-browser.d.ts +4 -2
- package/dist/src/collection-browser.js +36 -13
- package/dist/src/collection-browser.js.map +1 -1
- package/dist/src/collection-facets.d.ts +3 -0
- package/dist/src/collection-facets.js +18 -1
- package/dist/src/collection-facets.js.map +1 -1
- package/dist/src/collection-name-cache.d.ts +18 -0
- package/dist/src/collection-name-cache.js +89 -0
- package/dist/src/collection-name-cache.js.map +1 -0
- package/dist/src/models.d.ts +3 -0
- package/dist/src/models.js.map +1 -1
- package/dist/src/tiles/grid/item-tile.d.ts +3 -0
- package/dist/src/tiles/grid/item-tile.js +13 -3
- package/dist/src/tiles/grid/item-tile.js.map +1 -1
- package/dist/src/tiles/list/tile-list.d.ts +5 -0
- package/dist/src/tiles/list/tile-list.js +73 -70
- package/dist/src/tiles/list/tile-list.js.map +1 -1
- package/dist/src/tiles/tile-dispatcher.d.ts +3 -0
- package/dist/src/tiles/tile-dispatcher.js +10 -1
- package/dist/src/tiles/tile-dispatcher.js.map +1 -1
- package/dist/test/collection-name-cache.test.d.ts +1 -0
- package/dist/test/collection-name-cache.test.js +158 -0
- package/dist/test/collection-name-cache.test.js.map +1 -0
- package/dist/test/mocks/mock-search-response.d.ts +5 -0
- package/dist/test/mocks/mock-search-response.js +62 -0
- package/dist/test/mocks/mock-search-response.js.map +1 -0
- package/dist/test/mocks/mock-search-service.d.ts +13 -0
- package/dist/test/mocks/mock-search-service.js +20 -0
- package/dist/test/mocks/mock-search-service.js.map +1 -0
- package/package.json +4 -1
- package/src/collection-browser.ts +32 -3
- package/src/collection-facets.ts +21 -1
- package/src/models.ts +3 -0
- package/src/tiles/grid/item-tile.ts +14 -3
- package/src/tiles/list/tile-list.ts +84 -66
- package/src/tiles/tile-dispatcher.ts +11 -0
- package/dist/src/assets/img/icons/arrow-right.d.ts +0 -2
- package/dist/src/assets/img/icons/arrow-right.js +0 -4
- package/dist/src/assets/img/icons/arrow-right.js.map +0 -1
- package/dist/src/data-manager.d.ts +0 -68
- package/dist/src/data-manager.js +0 -266
- package/dist/src/data-manager.js.map +0 -1
- package/dist/src/url-manager.d.ts +0 -0
- package/dist/src/url-manager.js +0 -2
- package/dist/src/url-manager.js.map +0 -1
- package/dist/src/your-webcomponent.d.ts +0 -8
- package/dist/src/your-webcomponent.js +0 -38
- package/dist/src/your-webcomponent.js.map +0 -1
- package/dist/test/your-webcomponent.test.d.ts +0 -1
- package/dist/test/your-webcomponent.test.js +0 -23
- package/dist/test/your-webcomponent.test.js.map +0 -1
package/dist/src/models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"models.js","sourceRoot":"","sources":["../../src/models.ts"],"names":[],"mappings":"AAwCA;;GAEG;AACH,MAAM,CAAN,IAAY,SASX;AATD,WAAY,SAAS;IACnB,oCAAyB,CAAA;IACzB,4BAAiB,CAAA;IACjB,4BAAiB,CAAA;IACjB,0CAA+B,CAAA;IAC/B,4CAAiC,CAAA;IACjC,0CAA+B,CAAA;IAC/B,oCAAyB,CAAA;IACzB,gCAAqB,CAAA;AACvB,CAAC,EATW,SAAS,KAAT,SAAS,QASpB;AAcD,MAAM,CAAC,MAAM,oBAAoB,GAE7B;IACF,SAAS,EAAE,WAAW;IACtB,KAAK,EAAE,OAAO;IACd,KAAK,EAAE,OAAO;IACd,YAAY,EAAE,eAAe;IAC7B,aAAa,EAAE,gBAAgB;IAC/B,YAAY,EAAE,eAAe;IAC7B,SAAS,EAAE,YAAY;IACvB,OAAO,EAAE,SAAS;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAEjC;IACF,SAAS,EAAE,IAAI;IACf,KAAK,EAAE,MAAM;IACb,KAAK,EAAE,aAAa;IACpB,YAAY,EAAE,MAAM;IACpB,aAAa,EAAE,YAAY;IAC3B,YAAY,EAAE,YAAY;IAC1B,SAAS,EAAE,WAAW;IACtB,OAAO,EAAE,eAAe;CACzB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAEjC;IACF,WAAW,EAAE,SAAS,CAAC,KAAK;IAC5B,IAAI,EAAE,SAAS,CAAC,YAAY;IAC5B,UAAU,EAAE,SAAS,CAAC,aAAa;IACnC,UAAU,EAAE,SAAS,CAAC,YAAY;IAClC,SAAS,EAAE,SAAS,CAAC,SAAS;IAC9B,aAAa,EAAE,SAAS,CAAC,OAAO;IAChC,IAAI,EAAE,SAAS,CAAC,KAAK;CACtB,CAAC;AAkCF,MAAM,CAAC,MAAM,qBAAqB,GAAmB;IACnD,OAAO,EAAE,EAAE;IACX,SAAS,EAAE,EAAE;IACb,QAAQ,EAAE,EAAE;IACZ,OAAO,EAAE,EAAE;IACX,UAAU,EAAE,EAAE;IACd,IAAI,EAAE,EAAE;CACT,CAAC","sourcesContent":["import type { MediaType } from '@internetarchive/field-parsers';\n\nexport interface TileModel {\n averageRating?: number;\n collectionIdentifier?: string;\n collectionName?: string;\n collections: string[];\n commentCount: number;\n creator?: string;\n creators: string[];\n dateAdded?: Date; // Date added to public search (software-defined) [from: addeddate]\n dateArchived?: Date; // Date archived (software-defined) item created on archive.org [from: publicdate]\n datePublished?: Date; // Date work published in the world (user-defined) [from: date]\n dateReviewed?: Date; // Date reviewed (user-created) most recent review [from: reviewdate]\n description?: string;\n favCount: number;\n identifier: string;\n issue?: string;\n itemCount: number;\n mediatype: MediaType;\n source?: string;\n subjects: string[];\n title: string;\n viewCount: number;\n volume?: string;\n}\n\nexport type CollectionDisplayMode =\n | 'grid'\n | 'list-compact'\n | 'list-detail'\n | 'list-header';\n\n/**\n * This is mainly used to set the cookies for the collection display mode.\n *\n * It allows the user to set different modes for different contexts (collection page, search page, etc).\n */\nexport type CollectionBrowserContext = 'collection' | 'search';\n\n/**\n * The sort fields shown in the sort filter bar\n */\nexport enum SortField {\n 'relevance' = 'relevance',\n 'views' = 'views',\n 'title' = 'title',\n 'datearchived' = 'datearchived',\n 'datepublished' = 'datepublished',\n 'datereviewed' = 'datereviewed',\n 'dateadded' = 'dateadded',\n 'creator' = 'creator',\n}\n\n/**\n * The metadata fields we sort by that map to the SortFields above\n */\nexport type MetadataSortField =\n | 'week'\n | 'titleSorter'\n | 'date'\n | 'creatorSorter'\n | 'publicdate'\n | 'reviewdate'\n | 'addeddate';\n\nexport const SortFieldDisplayName: {\n [key in SortField]: string;\n} = {\n relevance: 'Relevance',\n views: 'Views',\n title: 'Title',\n datearchived: 'Date Archived',\n datepublished: 'Date Published',\n datereviewed: 'Date Reviewed',\n dateadded: 'Date Added',\n creator: 'Creator',\n};\n\n/**\n * Maps the SortField above to the corresponding Metadata field in the API.\n */\nexport const SortFieldToMetadataField: {\n [key in SortField]: MetadataSortField | null;\n} = {\n relevance: null,\n views: 'week',\n title: 'titleSorter',\n datearchived: 'date',\n datepublished: 'publicdate',\n datereviewed: 'reviewdate',\n dateadded: 'addeddate',\n creator: 'creatorSorter',\n};\n\n/**\n * Maps the Metadata field to the corresponding SortField field in the API.\n */\nexport const MetadataFieldToSortField: {\n [key in MetadataSortField]: SortField;\n} = {\n titleSorter: SortField.title,\n date: SortField.datearchived,\n publicdate: SortField.datepublished,\n reviewdate: SortField.datereviewed,\n addeddate: SortField.dateadded,\n creatorSorter: SortField.creator,\n week: SortField.views,\n};\n\nexport type FacetOption =\n | 'subject'\n | 'mediatype'\n | 'language'\n | 'creator'\n | 'collection'\n | 'year';\n\nexport type SelectedFacetState = 'selected' | 'hidden';\n\nexport type FacetState = SelectedFacetState | 'none';\nexport interface FacetBucket {\n // for some facets, we augment the key with a display value\n displayText?: string;\n key: string;\n count: number;\n state: FacetState;\n}\n\nexport interface FacetGroup {\n title: string;\n key: FacetOption;\n buckets: FacetBucket[];\n}\n\nexport type FacetValue = string;\n\nexport type SelectedFacets = Record<\n FacetOption,\n Record<FacetValue, SelectedFacetState>\n>;\n\nexport const defaultSelectedFacets: SelectedFacets = {\n subject: {},\n mediatype: {},\n language: {},\n creator: {},\n collection: {},\n year: {},\n};\n"]}
|
|
@@ -1,9 +1,12 @@
|
|
|
1
1
|
import { CSSResultGroup, LitElement } from 'lit';
|
|
2
|
+
import '@internetarchive/collection-name-cache';
|
|
3
|
+
import { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
|
|
2
4
|
import { TileModel } from '../../models';
|
|
3
5
|
import '../../mediatype-icon';
|
|
4
6
|
export declare class ItemTile extends LitElement {
|
|
5
7
|
model?: TileModel;
|
|
6
8
|
baseNavigationUrl?: string;
|
|
9
|
+
collectionNameCache?: CollectionNameCacheInterface;
|
|
7
10
|
get renderItemImageView(): import("lit-html").TemplateResult<1>;
|
|
8
11
|
render(): import("lit-html").TemplateResult<1>;
|
|
9
12
|
static get styles(): CSSResultGroup;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
+
/* eslint-disable import/no-duplicates */
|
|
2
3
|
import { css, html, LitElement } from 'lit';
|
|
3
4
|
import { customElement, property } from 'lit/decorators.js';
|
|
5
|
+
import '@internetarchive/collection-name-cache';
|
|
4
6
|
import { formatCount } from '../../utils/format-count';
|
|
5
7
|
import '../../mediatype-icon';
|
|
6
8
|
import { favoriteFilledIcon } from './icons/favorite-filled';
|
|
@@ -26,8 +28,8 @@ let ItemTile = class ItemTile extends LitElement {
|
|
|
26
28
|
}
|
|
27
29
|
render() {
|
|
28
30
|
var _a, _b, _c, _d, _e, _f, _g, _h, _j;
|
|
29
|
-
const
|
|
30
|
-
const collectionUrl = `${this.baseNavigationUrl}/details/${
|
|
31
|
+
const collectionIdentifier = (_a = this.model) === null || _a === void 0 ? void 0 : _a.collections[0];
|
|
32
|
+
const collectionUrl = `${this.baseNavigationUrl}/details/${collectionIdentifier}`;
|
|
31
33
|
const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${(_b = this.model) === null || _b === void 0 ? void 0 : _b.collections[0]}`;
|
|
32
34
|
const itemTitle = ((_c = this.model) === null || _c === void 0 ? void 0 : _c.title) || '';
|
|
33
35
|
const itemCreator = ((_d = this.model) === null || _d === void 0 ? void 0 : _d.creator) || '-';
|
|
@@ -39,7 +41,12 @@ let ItemTile = class ItemTile extends LitElement {
|
|
|
39
41
|
id="collection-thumbnail"
|
|
40
42
|
style="background-image:url(${imgSrcUrl})"
|
|
41
43
|
></div>
|
|
42
|
-
<div id="collection-title-text"
|
|
44
|
+
<div id="collection-title-text">
|
|
45
|
+
<async-collection-name
|
|
46
|
+
.collectionNameCache=${this.collectionNameCache}
|
|
47
|
+
.identifier=${collectionIdentifier}
|
|
48
|
+
></async-collection-name>
|
|
49
|
+
</div>
|
|
43
50
|
</div>
|
|
44
51
|
</a>
|
|
45
52
|
<div id="title-image-container">
|
|
@@ -312,6 +319,9 @@ __decorate([
|
|
|
312
319
|
__decorate([
|
|
313
320
|
property({ type: String })
|
|
314
321
|
], ItemTile.prototype, "baseNavigationUrl", void 0);
|
|
322
|
+
__decorate([
|
|
323
|
+
property({ type: Object })
|
|
324
|
+
], ItemTile.prototype, "collectionNameCache", void 0);
|
|
315
325
|
ItemTile = __decorate([
|
|
316
326
|
customElement('item-tile')
|
|
317
327
|
], ItemTile);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { TileModel } from '../../models';\nimport { formatCount } from '../../utils/format-count';\n\nimport '../../mediatype-icon';\n\nimport { favoriteFilledIcon } from './icons/favorite-filled';\nimport { reviewsIcon } from './icons/reviews';\nimport viewsIcon from './icons/views';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n get renderItemImageView() {\n const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.identifier}`;\n\n const containsDeemphasize = this.model?.collections.includes('deemphasize');\n const itemImageBoxClass = containsDeemphasize ? 'item-image-box' : '';\n const itemImageClass = `item-image ${\n !containsDeemphasize ? 'default' : 'deemphasize'\n }`;\n const tileActionClass = `tile-action no-preview${\n !containsDeemphasize ? ' hidden' : ''\n }`;\n\n return html`\n <div class=${itemImageBoxClass}>\n <div\n class=${itemImageClass}\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>\n <div class=${tileActionClass}>Content may be inappropriate</div>\n </div>\n `;\n }\n\n render() {\n const collectionName = this.model?.collections[0];\n const collectionUrl = `${this.baseNavigationUrl}/details/${collectionName}`;\n\n const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.collections[0]}`;\n const itemTitle = this.model?.title || '';\n const itemCreator = this.model?.creator || '-';\n\n return html`\n <div id=\"container\">\n <a href=${collectionUrl}>\n <div id=\"stealth-popup\">\n <div\n id=\"collection-thumbnail\"\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>\n <div id=\"collection-title-text\">${collectionName}</div>\n </div>\n </a>\n <div id=\"title-image-container\">\n <h1 id=\"item-title\" title=${itemTitle}>${this.model?.title}</h1>\n <div id=\"item-image-container\">${this.renderItemImageView}</div>\n <div class=\"item-creator\">\n <span id=\"text-by\">By:</span>\n <span>${itemCreator}</span>\n </div>\n </div>\n <div id=\"item-stats-container\">\n <div id=\"stats-holder\">\n <div class=\"col\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n ?showText=${true}\n >\n </mediatype-icon>\n </div>\n <div class=\"col\">\n ${viewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.viewCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${favoriteFilledIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.itemCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${reviewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.favCount, 'short', 'short')}\n </p>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;\n\n return css`\n #container {\n background-color: #ffffff;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n }\n\n mediatype-icon {\n --iconHeight: 10px;\n }\n\n #title-image-container {\n display: flex;\n flex: 1;\n flex-direction: column;\n padding: 0.5rem;\n }\n\n #item-title {\n font-weight: bold;\n color: #000000;\n font-size: 1.6rem;\n text-align: center;\n margin-top: 0rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 2rem;\n height: 4rem;\n }\n\n #item-image-container {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n\n .item-image-box {\n width: 16rem;\n height: 16rem;\n overflow: hidden;\n position: relative;\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n }\n\n .item-image {\n width: 16rem;\n height: 16rem;\n object-fit: cover;\n background-repeat: no-repeat;\n background-position: center center;\n position: relative;\n -webkit-appearance: none;\n overflow: visible;\n }\n\n .default {\n background-size: contain;\n filter: drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.8));\n }\n\n .deemphasize {\n background-size: cover;\n filter: blur(15px);\n z-index: 1;\n }\n\n .tile-action {\n border: 1px solid currentColor;\n border-radius: 1px;\n padding: 5px;\n font-weight: 500;\n width: auto;\n position: absolute;\n z-index: 2;\n display: flex;\n top: 5.5rem;\n }\n\n .no-preview {\n background-color: #fffecb;\n color: #000000;\n font-size: 1.4rem;\n line-height: 2rem;\n text-align: center;\n }\n\n .hidden {\n display: none;\n }\n\n #container:hover > #title-image-container > .item-title {\n text-decoration: underline;\n }\n\n /** this is a workaround for Safari 15 where the hover effects are not working */\n #title-image-container:hover > #item-title {\n text-decoration: underline;\n }\n\n #container:hover > #item-title {\n background-color: #fcfcfc;\n }\n\n .item-creator {\n color: #000000;\n display: -webkit-box;\n font-size: 1.4rem;\n height: 3rem;\n margin: 0px;\n overflow: hidden;\n padding: 0.5rem;\n text-align: center;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n #text-by {\n font-weight: bold;\n }\n\n #item-stats-container {\n align-items: center;\n display: flex;\n height: 5.5rem;\n padding-left: 1rem;\n padding-right: 0.5rem;\n }\n\n #stats-holder {\n align-items: center;\n display: flex;\n flex: 1;\n justify-content: space-evenly;\n text-align: center;\n width: 100%;\n }\n\n svg {\n height: 10px;\n width: 10px;\n }\n\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: center;\n }\n\n .col {\n width: 25%;\n }\n\n #container:hover #stealth-popup {\n margin-top: -25px;\n visibility: visible;\n opacity: 1;\n }\n\n #stealth-popup {\n transition: margin-top 0.3s ease, opacity 0.3s ease;\n position: absolute;\n visibility: hidden;\n margin-left: -10px;\n text-align: left;\n display: flex;\n padding: 5px;\n width: 96%;\n background: #f5f5f7 100%;\n border: 1px #2c2c2c;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n }\n\n #collection-thumbnail {\n display: flex;\n transition: opacity 0.3s ease;\n width: 3rem;\n height: 3rem;\n flex: 0 0 3rem;\n border-radius: 8px;\n border: 1px solid #ddd;\n overflow: hidden;\n background-size: cover;\n background-repeat: no-repeat;\n background-position: center center;\n }\n\n #collection-title-text {\n line-height: 1;\n font-size: 16px;\n font-weight: bold;\n text-align: left;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n height: 3.5rem;\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n a {\n color: #333;\n text-decoration: none;\n display: block;\n }\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"item-tile.js","sourceRoot":"","sources":["../../../../src/tiles/grid/item-tile.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable import/no-duplicates */\nimport { css, CSSResultGroup, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport '@internetarchive/collection-name-cache';\nimport { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport { TileModel } from '../../models';\nimport { formatCount } from '../../utils/format-count';\n\nimport '../../mediatype-icon';\n\nimport { favoriteFilledIcon } from './icons/favorite-filled';\nimport { reviewsIcon } from './icons/reviews';\nimport viewsIcon from './icons/views';\n\n@customElement('item-tile')\nexport class ItemTile extends LitElement {\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n get renderItemImageView() {\n const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.identifier}`;\n\n const containsDeemphasize = this.model?.collections.includes('deemphasize');\n const itemImageBoxClass = containsDeemphasize ? 'item-image-box' : '';\n const itemImageClass = `item-image ${\n !containsDeemphasize ? 'default' : 'deemphasize'\n }`;\n const tileActionClass = `tile-action no-preview${\n !containsDeemphasize ? ' hidden' : ''\n }`;\n\n return html`\n <div class=${itemImageBoxClass}>\n <div\n class=${itemImageClass}\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>\n <div class=${tileActionClass}>Content may be inappropriate</div>\n </div>\n `;\n }\n\n render() {\n const collectionIdentifier = this.model?.collections[0];\n const collectionUrl = `${this.baseNavigationUrl}/details/${collectionIdentifier}`;\n\n const imgSrcUrl = `${this.baseNavigationUrl}/services/img/${this.model?.collections[0]}`;\n const itemTitle = this.model?.title || '';\n const itemCreator = this.model?.creator || '-';\n\n return html`\n <div id=\"container\">\n <a href=${collectionUrl}>\n <div id=\"stealth-popup\">\n <div\n id=\"collection-thumbnail\"\n style=\"background-image:url(${imgSrcUrl})\"\n ></div>\n <div id=\"collection-title-text\">\n <async-collection-name\n .collectionNameCache=${this.collectionNameCache}\n .identifier=${collectionIdentifier}\n ></async-collection-name>\n </div>\n </div>\n </a>\n <div id=\"title-image-container\">\n <h1 id=\"item-title\" title=${itemTitle}>${this.model?.title}</h1>\n <div id=\"item-image-container\">${this.renderItemImageView}</div>\n <div class=\"item-creator\">\n <span id=\"text-by\">By:</span>\n <span>${itemCreator}</span>\n </div>\n </div>\n <div id=\"item-stats-container\">\n <div id=\"stats-holder\">\n <div class=\"col\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n ?showText=${true}\n >\n </mediatype-icon>\n </div>\n <div class=\"col\">\n ${viewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.viewCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${favoriteFilledIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.itemCount, 'short', 'short')}\n </p>\n </div>\n <div class=\"col\">\n ${reviewsIcon}\n <p class=\"status-text\">\n ${formatCount(this.model?.favCount, 'short', 'short')}\n </p>\n </div>\n </div>\n </div>\n </div>\n `;\n }\n\n static get styles(): CSSResultGroup {\n const cornerRadiusCss = css`var(--collectionTileCornerRadius, 4px)`;\n\n return css`\n #container {\n background-color: #ffffff;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n flex-direction: column;\n height: 100%;\n position: relative;\n }\n\n mediatype-icon {\n --iconHeight: 10px;\n }\n\n #title-image-container {\n display: flex;\n flex: 1;\n flex-direction: column;\n padding: 0.5rem;\n }\n\n #item-title {\n font-weight: bold;\n color: #000000;\n font-size: 1.6rem;\n text-align: center;\n margin-top: 0rem;\n margin-bottom: 0.5rem;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n line-height: 2rem;\n height: 4rem;\n }\n\n #item-image-container {\n display: flex;\n justify-content: center;\n flex: 1;\n }\n\n .item-image-box {\n width: 16rem;\n height: 16rem;\n overflow: hidden;\n position: relative;\n box-shadow: 1px 1px 2px 0px;\n display: flex;\n }\n\n .item-image {\n width: 16rem;\n height: 16rem;\n object-fit: cover;\n background-repeat: no-repeat;\n background-position: center center;\n position: relative;\n -webkit-appearance: none;\n overflow: visible;\n }\n\n .default {\n background-size: contain;\n filter: drop-shadow(1px 1px 2px rgba(0, 0, 0, 0.8));\n }\n\n .deemphasize {\n background-size: cover;\n filter: blur(15px);\n z-index: 1;\n }\n\n .tile-action {\n border: 1px solid currentColor;\n border-radius: 1px;\n padding: 5px;\n font-weight: 500;\n width: auto;\n position: absolute;\n z-index: 2;\n display: flex;\n top: 5.5rem;\n }\n\n .no-preview {\n background-color: #fffecb;\n color: #000000;\n font-size: 1.4rem;\n line-height: 2rem;\n text-align: center;\n }\n\n .hidden {\n display: none;\n }\n\n #container:hover > #title-image-container > .item-title {\n text-decoration: underline;\n }\n\n /** this is a workaround for Safari 15 where the hover effects are not working */\n #title-image-container:hover > #item-title {\n text-decoration: underline;\n }\n\n #container:hover > #item-title {\n background-color: #fcfcfc;\n }\n\n .item-creator {\n color: #000000;\n display: -webkit-box;\n font-size: 1.4rem;\n height: 3rem;\n margin: 0px;\n overflow: hidden;\n padding: 0.5rem;\n text-align: center;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n #text-by {\n font-weight: bold;\n }\n\n #item-stats-container {\n align-items: center;\n display: flex;\n height: 5.5rem;\n padding-left: 1rem;\n padding-right: 0.5rem;\n }\n\n #stats-holder {\n align-items: center;\n display: flex;\n flex: 1;\n justify-content: space-evenly;\n text-align: center;\n width: 100%;\n }\n\n svg {\n height: 10px;\n width: 10px;\n }\n\n .status-text {\n font-size: 14px;\n color: #2c2c2c;\n margin: auto;\n display: block;\n text-align: center;\n }\n\n .col {\n width: 25%;\n }\n\n #container:hover #stealth-popup {\n margin-top: -25px;\n visibility: visible;\n opacity: 1;\n }\n\n #stealth-popup {\n transition: margin-top 0.3s ease, opacity 0.3s ease;\n position: absolute;\n visibility: hidden;\n margin-left: -10px;\n text-align: left;\n display: flex;\n padding: 5px;\n width: 96%;\n background: #f5f5f7 100%;\n border: 1px #2c2c2c;\n border-radius: ${cornerRadiusCss};\n box-shadow: 1px 1px 2px 0px;\n }\n\n #collection-thumbnail {\n display: flex;\n transition: opacity 0.3s ease;\n width: 3rem;\n height: 3rem;\n flex: 0 0 3rem;\n border-radius: 8px;\n border: 1px solid #ddd;\n overflow: hidden;\n background-size: cover;\n background-repeat: no-repeat;\n background-position: center center;\n }\n\n #collection-title-text {\n line-height: 1;\n font-size: 16px;\n font-weight: bold;\n text-align: left;\n padding-left: 0.5rem;\n padding-right: 0.5rem;\n height: 3.5rem;\n display: -webkit-box;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n }\n\n a {\n color: #333;\n text-decoration: none;\n display: block;\n }\n `;\n }\n}\n"]}
|
|
@@ -11,7 +11,10 @@ export declare class TileList extends LitElement {
|
|
|
11
11
|
render(): import("lit-html").TemplateResult<1>;
|
|
12
12
|
private get imgTemplate();
|
|
13
13
|
private get iconLeftTemplate();
|
|
14
|
+
private get titleTemplate();
|
|
14
15
|
private get itemLineTemplate();
|
|
16
|
+
private get volumeTemplate();
|
|
17
|
+
private get issueTemplate();
|
|
15
18
|
private get sourceTemplate();
|
|
16
19
|
private get creatorTemplate();
|
|
17
20
|
private get viewsTemplate();
|
|
@@ -20,6 +23,8 @@ export declare class TileList extends LitElement {
|
|
|
20
23
|
private get topicsTemplate();
|
|
21
24
|
private get collectionsTemplate();
|
|
22
25
|
private get descriptionTemplate();
|
|
26
|
+
private metadataTemplate;
|
|
27
|
+
private labelTemplate;
|
|
23
28
|
private searchLink;
|
|
24
29
|
private detailsLink;
|
|
25
30
|
private get date();
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
2
|
/* eslint-disable lit/no-invalid-html */
|
|
3
3
|
import { css, html, LitElement, nothing } from 'lit';
|
|
4
|
+
import { ifDefined } from 'lit/directives/if-defined.js';
|
|
4
5
|
import { join } from 'lit/directives/join.js';
|
|
5
6
|
import { map } from 'lit/directives/map.js';
|
|
6
7
|
import { customElement, property } from 'lit/decorators.js';
|
|
@@ -10,7 +11,6 @@ import { formatDate } from '../../utils/format-date';
|
|
|
10
11
|
import '../../mediatype-icon';
|
|
11
12
|
let TileList = class TileList extends LitElement {
|
|
12
13
|
render() {
|
|
13
|
-
var _a, _b;
|
|
14
14
|
return html `
|
|
15
15
|
<div id="list-line" class="${this.classSize}">
|
|
16
16
|
<div id="list-line-left">
|
|
@@ -18,9 +18,9 @@ let TileList = class TileList extends LitElement {
|
|
|
18
18
|
${this.iconLeftTemplate}
|
|
19
19
|
</div>
|
|
20
20
|
<div id="list-line-right">
|
|
21
|
-
<div id="title">${
|
|
21
|
+
<div id="title">${this.titleTemplate}</div>
|
|
22
22
|
${this.itemLineTemplate} ${this.creatorTemplate}
|
|
23
|
-
<div id="date">
|
|
23
|
+
<div id="date" class="metadata">
|
|
24
24
|
<span class="label">Published:</span> ${formatDate(this.date, this.formatSize)}
|
|
25
25
|
</div>
|
|
26
26
|
<div id="views-line">
|
|
@@ -32,6 +32,7 @@ let TileList = class TileList extends LitElement {
|
|
|
32
32
|
</div>
|
|
33
33
|
`;
|
|
34
34
|
}
|
|
35
|
+
// Display templates
|
|
35
36
|
get imgTemplate() {
|
|
36
37
|
var _a, _b;
|
|
37
38
|
if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier)) {
|
|
@@ -59,12 +60,29 @@ let TileList = class TileList extends LitElement {
|
|
|
59
60
|
</div>
|
|
60
61
|
`;
|
|
61
62
|
}
|
|
63
|
+
get titleTemplate() {
|
|
64
|
+
var _a;
|
|
65
|
+
if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.title)) {
|
|
66
|
+
return nothing;
|
|
67
|
+
}
|
|
68
|
+
return html ` ${this.detailsLink(this.model.identifier, this.model.title)} `;
|
|
69
|
+
}
|
|
62
70
|
get itemLineTemplate() {
|
|
63
71
|
const source = this.sourceTemplate;
|
|
64
|
-
|
|
72
|
+
const volume = this.volumeTemplate;
|
|
73
|
+
const issue = this.issueTemplate;
|
|
74
|
+
if (!source && !volume && !issue) {
|
|
65
75
|
return nothing;
|
|
66
76
|
}
|
|
67
|
-
return html ` <div id="item-line">${source}</div> `;
|
|
77
|
+
return html ` <div id="item-line">${source} ${volume} ${issue}</div> `;
|
|
78
|
+
}
|
|
79
|
+
get volumeTemplate() {
|
|
80
|
+
var _a;
|
|
81
|
+
return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.volume, 'Volume');
|
|
82
|
+
}
|
|
83
|
+
get issueTemplate() {
|
|
84
|
+
var _a;
|
|
85
|
+
return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.issue, 'Issue');
|
|
68
86
|
}
|
|
69
87
|
get sourceTemplate() {
|
|
70
88
|
var _a;
|
|
@@ -73,65 +91,44 @@ let TileList = class TileList extends LitElement {
|
|
|
73
91
|
}
|
|
74
92
|
return html `
|
|
75
93
|
<div id="source">
|
|
76
|
-
|
|
94
|
+
${this.labelTemplate('Source')}
|
|
77
95
|
${this.searchLink('source', this.model.source)}
|
|
78
96
|
</div>
|
|
79
97
|
`;
|
|
80
98
|
}
|
|
81
99
|
get creatorTemplate() {
|
|
82
|
-
var _a
|
|
83
|
-
if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.
|
|
100
|
+
var _a;
|
|
101
|
+
if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.creators) || this.model.creators.length === 0) {
|
|
84
102
|
return nothing;
|
|
85
103
|
}
|
|
86
104
|
return html `
|
|
87
|
-
<div id="creator">
|
|
88
|
-
|
|
89
|
-
${
|
|
105
|
+
<div id="creator" class="metadata">
|
|
106
|
+
${this.labelTemplate('By')}
|
|
107
|
+
${join(map(this.model.creators, id => this.searchLink('creator', id)), html `, `)}
|
|
90
108
|
</div>
|
|
91
109
|
`;
|
|
92
110
|
}
|
|
93
111
|
get viewsTemplate() {
|
|
94
112
|
var _a, _b;
|
|
95
|
-
return
|
|
96
|
-
<div id="views">
|
|
97
|
-
<span class="label">Views: </span>
|
|
98
|
-
${formatCount((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.viewCount) !== null && _b !== void 0 ? _b : 0, this.formatSize)}
|
|
99
|
-
</div>
|
|
100
|
-
`;
|
|
113
|
+
return this.metadataTemplate(`${formatCount((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.viewCount) !== null && _b !== void 0 ? _b : 0, this.formatSize)}`, 'Views');
|
|
101
114
|
}
|
|
102
115
|
get ratingTemplate() {
|
|
103
|
-
var _a
|
|
104
|
-
|
|
105
|
-
return nothing;
|
|
106
|
-
}
|
|
107
|
-
return html `
|
|
108
|
-
<div id="reviews">
|
|
109
|
-
<span class="label">Avg Rating: </span>
|
|
110
|
-
${(_b = this.model) === null || _b === void 0 ? void 0 : _b.averageRating}
|
|
111
|
-
</div>
|
|
112
|
-
`;
|
|
116
|
+
var _a;
|
|
117
|
+
return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.averageRating, 'Avg Rating');
|
|
113
118
|
}
|
|
114
119
|
get reviewsTemplate() {
|
|
115
|
-
var _a
|
|
116
|
-
|
|
117
|
-
return nothing;
|
|
118
|
-
}
|
|
119
|
-
return html `
|
|
120
|
-
<div id="reviews">
|
|
121
|
-
<span class="label">Reviews: </span>
|
|
122
|
-
${(_b = this.model) === null || _b === void 0 ? void 0 : _b.commentCount}
|
|
123
|
-
</div>
|
|
124
|
-
`;
|
|
120
|
+
var _a;
|
|
121
|
+
return this.metadataTemplate((_a = this.model) === null || _a === void 0 ? void 0 : _a.commentCount, 'Reviews');
|
|
125
122
|
}
|
|
126
123
|
get topicsTemplate() {
|
|
127
|
-
var _a
|
|
128
|
-
if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.subjects
|
|
124
|
+
var _a;
|
|
125
|
+
if (!((_a = this.model) === null || _a === void 0 ? void 0 : _a.subjects) || this.model.subjects.length === 0) {
|
|
129
126
|
return nothing;
|
|
130
127
|
}
|
|
131
128
|
return html `
|
|
132
|
-
<div id="topics">
|
|
133
|
-
|
|
134
|
-
${
|
|
129
|
+
<div id="topics" class="metadata">
|
|
130
|
+
${this.labelTemplate('Topics')}
|
|
131
|
+
${join(map(this.model.subjects, id => this.searchLink('subject', id)), html `, `)}
|
|
135
132
|
</div>
|
|
136
133
|
`;
|
|
137
134
|
}
|
|
@@ -141,39 +138,49 @@ let TileList = class TileList extends LitElement {
|
|
|
141
138
|
return nothing;
|
|
142
139
|
}
|
|
143
140
|
return html `
|
|
144
|
-
<div id="collections">
|
|
145
|
-
|
|
141
|
+
<div id="collections" class="metadata">
|
|
142
|
+
${this.labelTemplate('Collections')}
|
|
146
143
|
${join(map(this.model.collections, id => this.detailsLink(id)), html `, `)}
|
|
147
144
|
</div>
|
|
148
145
|
`;
|
|
149
146
|
}
|
|
150
147
|
get descriptionTemplate() {
|
|
151
148
|
var _a, _b;
|
|
152
|
-
|
|
149
|
+
return this.metadataTemplate(DOMPurify.sanitize((_b = (_a = this.model) === null || _a === void 0 ? void 0 : _a.description) !== null && _b !== void 0 ? _b : ''), '', 'description');
|
|
150
|
+
}
|
|
151
|
+
// Utility functions
|
|
152
|
+
metadataTemplate(text, label = '', id) {
|
|
153
|
+
if (!text)
|
|
153
154
|
return nothing;
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
155
|
+
return html `
|
|
156
|
+
<div id=${ifDefined(id)} class="metadata">
|
|
157
|
+
${this.labelTemplate(label)} ${text}
|
|
158
|
+
</div>
|
|
159
|
+
`;
|
|
160
|
+
}
|
|
161
|
+
labelTemplate(label) {
|
|
162
|
+
return html `${label
|
|
163
|
+
? html `<span class="label">${label}: </span>`
|
|
164
|
+
: nothing}`;
|
|
157
165
|
}
|
|
158
166
|
searchLink(field, searchTerm) {
|
|
159
167
|
if (!field || !searchTerm) {
|
|
160
168
|
return nothing;
|
|
161
169
|
}
|
|
162
170
|
const query = encodeURIComponent(`${field}:"${searchTerm}"`);
|
|
163
|
-
//
|
|
164
|
-
return html `
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
</a>
|
|
168
|
-
`;
|
|
171
|
+
// No whitespace after closing tag
|
|
172
|
+
return html ` <a href="${this.baseNavigationUrl}/search.php?query=${query}">
|
|
173
|
+
${DOMPurify.sanitize(searchTerm)}</a
|
|
174
|
+
>`;
|
|
169
175
|
}
|
|
170
|
-
detailsLink(identifier) {
|
|
176
|
+
detailsLink(identifier, text) {
|
|
171
177
|
if (!identifier) {
|
|
172
178
|
return nothing;
|
|
173
179
|
}
|
|
180
|
+
const linkText = text !== null && text !== void 0 ? text : identifier;
|
|
174
181
|
// No whitespace after closing tag
|
|
175
182
|
return html ` <a href="${this.baseNavigationUrl}/details/${identifier}"
|
|
176
|
-
>${DOMPurify.sanitize(
|
|
183
|
+
>${DOMPurify.sanitize(linkText)}</a
|
|
177
184
|
>`;
|
|
178
185
|
}
|
|
179
186
|
/*
|
|
@@ -212,6 +219,10 @@ let TileList = class TileList extends LitElement {
|
|
|
212
219
|
font-size: 14px;
|
|
213
220
|
}
|
|
214
221
|
|
|
222
|
+
div a {
|
|
223
|
+
text-decoration: none;
|
|
224
|
+
}
|
|
225
|
+
|
|
215
226
|
.label {
|
|
216
227
|
font-weight: bold;
|
|
217
228
|
}
|
|
@@ -269,18 +280,16 @@ let TileList = class TileList extends LitElement {
|
|
|
269
280
|
text-decoration: none;
|
|
270
281
|
font-size: 22px;
|
|
271
282
|
font-weight: bold;
|
|
272
|
-
|
|
283
|
+
/* align top of text with image */
|
|
284
|
+
line-height: 25px;
|
|
285
|
+
margin-top: -4px;
|
|
286
|
+
padding-bottom: 2px;
|
|
273
287
|
}
|
|
274
288
|
|
|
275
|
-
|
|
276
|
-
#date,
|
|
277
|
-
#collections,
|
|
278
|
-
#topics,
|
|
279
|
-
#item-line {
|
|
289
|
+
.metadata {
|
|
280
290
|
line-height: 20px;
|
|
281
291
|
}
|
|
282
292
|
|
|
283
|
-
#title,
|
|
284
293
|
#creator,
|
|
285
294
|
#topic,
|
|
286
295
|
#source {
|
|
@@ -288,11 +297,6 @@ let TileList = class TileList extends LitElement {
|
|
|
288
297
|
overflow: hidden;
|
|
289
298
|
}
|
|
290
299
|
|
|
291
|
-
#title,
|
|
292
|
-
#creator {
|
|
293
|
-
white-space: nowrap;
|
|
294
|
-
}
|
|
295
|
-
|
|
296
300
|
#icon {
|
|
297
301
|
padding-top: 5px;
|
|
298
302
|
}
|
|
@@ -322,7 +326,7 @@ let TileList = class TileList extends LitElement {
|
|
|
322
326
|
column-gap: 5px;
|
|
323
327
|
}
|
|
324
328
|
|
|
325
|
-
|
|
329
|
+
div a:hover {
|
|
326
330
|
text-decoration: underline;
|
|
327
331
|
}
|
|
328
332
|
|
|
@@ -331,7 +335,6 @@ let TileList = class TileList extends LitElement {
|
|
|
331
335
|
display: flex;
|
|
332
336
|
flex-direction: row;
|
|
333
337
|
gap: 10px;
|
|
334
|
-
line-height: 20px;
|
|
335
338
|
}
|
|
336
339
|
`;
|
|
337
340
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-list.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable lit/no-invalid-html */\nimport { css, html, LitElement, nothing } from 'lit';\nimport { join } from 'lit/directives/join.js';\nimport { map } from 'lit/directives/map.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 '../../mediatype-icon';\n\n@customElement('tile-list')\nexport class TileList 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;\n\n render() {\n return html`\n <div id=\"list-line\" class=\"${this.classSize}\">\n <div id=\"list-line-left\">\n <div id=\"thumb\">${this.imgTemplate}</div>\n ${this.iconLeftTemplate}\n </div>\n <div id=\"list-line-right\">\n <div id=\"title\">${DOMPurify.sanitize(this.model?.title ?? '')}</div>\n ${this.itemLineTemplate} ${this.creatorTemplate}\n <div id=\"date\">\n <span class=\"label\">Published:</span> ${formatDate(\n this.date,\n this.formatSize\n )}\n </div>\n <div id=\"views-line\">\n ${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}\n </div>\n ${this.topicsTemplate} ${this.collectionsTemplate}\n ${this.descriptionTemplate}\n </div>\n </div>\n `;\n }\n\n private get imgTemplate() {\n if (!this.model?.identifier) {\n return nothing;\n }\n return html` <img\n src=\"${this.baseNavigationUrl}/services/img/${this.model.identifier}\"\n alt=\"${this.model.identifier}\"\n class=${this.model?.mediatype}\n />`;\n }\n\n private get iconLeftTemplate() {\n if (this.classSize !== 'desktop') {\n return nothing;\n }\n return html`\n <div id=\"icon-left\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n .showText=${true}\n style=\"--iconHeight: 20px; --iconWidth: 20px;text-align: center;\"\n >\n </mediatype-icon>\n </div>\n `;\n }\n\n private get itemLineTemplate() {\n const source = this.sourceTemplate;\n if (!source) {\n return nothing;\n }\n return html` <div id=\"item-line\">${source}</div> `;\n }\n\n private get sourceTemplate() {\n if (!this.model?.source) {\n return nothing;\n }\n return html`\n <div id=\"source\">\n <span class=\"label\">Source: </span>\n ${this.searchLink('source', this.model.source)}\n </div>\n `;\n }\n\n private get creatorTemplate() {\n if (!this.model?.creator) {\n return nothing;\n }\n return html`\n <div id=\"creator\">\n <span class=\"label\">By: </span>\n ${DOMPurify.sanitize(this.model?.creator ?? '')}\n </div>\n `;\n }\n\n private get viewsTemplate() {\n return html`\n <div id=\"views\">\n <span class=\"label\">Views: </span>\n ${formatCount(this.model?.viewCount ?? 0, this.formatSize)}\n </div>\n `;\n }\n\n private get ratingTemplate() {\n if (!this.model?.averageRating) {\n return nothing;\n }\n return html`\n <div id=\"reviews\">\n <span class=\"label\">Avg Rating: </span>\n ${this.model?.averageRating}\n </div>\n `;\n }\n\n private get reviewsTemplate() {\n if (!this.model?.commentCount) {\n return nothing;\n }\n return html`\n <div id=\"reviews\">\n <span class=\"label\">Reviews: </span>\n ${this.model?.commentCount}\n </div>\n `;\n }\n\n private get topicsTemplate() {\n if (!this.model?.subjects[0]) {\n return nothing;\n }\n return html`\n <div id=\"topics\">\n <span class=\"label\">Topics: </span>\n ${DOMPurify.sanitize(this.model?.subjects[0])}\n </div>\n `;\n }\n\n private get collectionsTemplate() {\n if (!this.model?.collections) {\n return nothing;\n }\n return html`\n <div id=\"collections\">\n <span class=\"label\">Collections: </span>\n ${join(\n map(this.model.collections, id => this.detailsLink(id)),\n html`, `\n )}\n </div>\n `;\n }\n\n private get descriptionTemplate() {\n if (!this.model?.description) {\n return nothing;\n }\n const description = DOMPurify.sanitize(`${this.model?.description}`);\n return html` <div id=\"description\">${description}</div> `;\n }\n\n private searchLink(field: string, searchTerm: string) {\n if (!field || !searchTerm) {\n return nothing;\n }\n const query = encodeURIComponent(`${field}:\"${searchTerm}\"`);\n // eslint-disable-next-line lit/no-invalid-html\n return html`\n <a href=\"${this.baseNavigationUrl}/search.php?query=${query}\">\n ${DOMPurify.sanitize(searchTerm)}\n </a>\n `;\n }\n\n private detailsLink(identifier: string) {\n if (!identifier) {\n return nothing;\n }\n // No whitespace after closing tag\n return html` <a href=\"${this.baseNavigationUrl}/details/${identifier}\"\n >${DOMPurify.sanitize(identifier)}</a\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 return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';\n }\n\n private get formatSize(): DateFormat | NumberFormat {\n return (this.currentWidth ?? 531) < 530 ? 'short' : '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 .label {\n font-weight: bold;\n }\n\n .mobile {\n --infiniteScrollerRowGap: 20px;\n --infiniteScrollerRowHeight: auto;\n }\n\n .desktop {\n --infiniteScrollerRowGap: 30px;\n --infiniteScrollerRowHeight: auto;\n }\n /* fields */\n\n #thumb img {\n object-fit: cover;\n display: block;\n }\n\n .mobile #thumb img {\n width: 90px;\n height: 90px;\n }\n\n .desktop #thumb img {\n width: 100px;\n height: 100px;\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: 45px;\n -webkit-border-radius: 45px;\n -moz-border-radius: 45px;\n }\n\n .desktop #thumb img.account {\n border-radius: 50px;\n -webkit-border-radius: 50px;\n -moz-border-radius: 50px;\n }\n\n #icon-left {\n padding-top: 5px;\n }\n\n #title {\n color: #4b64ff;\n text-decoration: none;\n font-size: 22px;\n font-weight: bold;\n line-height: 30px;\n }\n\n #creator,\n #date,\n #collections,\n #topics,\n #item-line {\n line-height: 20px;\n }\n\n #title,\n #creator,\n #topic,\n #source {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n #title,\n #creator {\n white-space: nowrap;\n }\n\n #icon {\n padding-top: 5px;\n }\n\n mediatype-icon {\n --iconHeight: 20px;\n }\n\n #description {\n padding-top: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n word-break: break-word;\n -webkit-line-clamp: 3; /* number of lines to show */\n line-clamp: 3;\n -webkit-box-orient: vertical;\n text-align: left;\n }\n\n /* list-line */\n\n #list-line {\n display: flex;\n column-gap: 5px;\n }\n\n #list-line:hover #title {\n text-decoration: underline;\n }\n\n #item-line,\n #views-line {\n display: flex;\n flex-direction: row;\n gap: 10px;\n line-height: 20px;\n }\n `;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tile-list.js","sourceRoot":"","sources":["../../../../src/tiles/list/tile-list.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable lit/no-invalid-html */\nimport { css, html, LitElement, nothing } from 'lit';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { join } from 'lit/directives/join.js';\nimport { map } from 'lit/directives/map.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 '../../mediatype-icon';\n\n@customElement('tile-list')\nexport class TileList 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;\n\n render() {\n return html`\n <div id=\"list-line\" class=\"${this.classSize}\">\n <div id=\"list-line-left\">\n <div id=\"thumb\">${this.imgTemplate}</div>\n ${this.iconLeftTemplate}\n </div>\n <div id=\"list-line-right\">\n <div id=\"title\">${this.titleTemplate}</div>\n ${this.itemLineTemplate} ${this.creatorTemplate}\n <div id=\"date\" class=\"metadata\">\n <span class=\"label\">Published:</span> ${formatDate(\n this.date,\n this.formatSize\n )}\n </div>\n <div id=\"views-line\">\n ${this.viewsTemplate} ${this.ratingTemplate} ${this.reviewsTemplate}\n </div>\n ${this.topicsTemplate} ${this.collectionsTemplate}\n ${this.descriptionTemplate}\n </div>\n </div>\n `;\n }\n\n // Display templates\n private get imgTemplate() {\n if (!this.model?.identifier) {\n return nothing;\n }\n return html` <img\n src=\"${this.baseNavigationUrl}/services/img/${this.model.identifier}\"\n alt=\"${this.model.identifier}\"\n class=${this.model?.mediatype}\n />`;\n }\n\n private get iconLeftTemplate() {\n if (this.classSize !== 'desktop') {\n return nothing;\n }\n return html`\n <div id=\"icon-left\">\n <mediatype-icon\n .mediatype=${this.model?.mediatype}\n .showText=${true}\n style=\"--iconHeight: 20px; --iconWidth: 20px;text-align: center;\"\n >\n </mediatype-icon>\n </div>\n `;\n }\n\n private get titleTemplate() {\n if (!this.model?.title) {\n return nothing;\n }\n return html` ${this.detailsLink(this.model.identifier, this.model.title)} `;\n }\n\n private get itemLineTemplate() {\n const source = this.sourceTemplate;\n const volume = this.volumeTemplate;\n const issue = this.issueTemplate;\n if (!source && !volume && !issue) {\n return nothing;\n }\n return html` <div id=\"item-line\">${source} ${volume} ${issue}</div> `;\n }\n\n private get volumeTemplate() {\n return this.metadataTemplate(this.model?.volume, 'Volume');\n }\n\n private get issueTemplate() {\n return this.metadataTemplate(this.model?.issue, 'Issue');\n }\n\n private get sourceTemplate() {\n if (!this.model?.source) {\n return nothing;\n }\n return html`\n <div id=\"source\">\n ${this.labelTemplate('Source')}\n ${this.searchLink('source', this.model.source)}\n </div>\n `;\n }\n\n private get creatorTemplate() {\n if (!this.model?.creators || this.model.creators.length === 0) {\n return nothing;\n }\n return html`\n <div id=\"creator\" class=\"metadata\">\n ${this.labelTemplate('By')}\n ${join(\n map(this.model.creators, id => this.searchLink('creator', id)),\n html`, `\n )}\n </div>\n `;\n }\n\n private get viewsTemplate() {\n return this.metadataTemplate(\n `${formatCount(this.model?.viewCount ?? 0, this.formatSize)}`,\n 'Views'\n );\n }\n\n private get ratingTemplate() {\n return this.metadataTemplate(this.model?.averageRating, 'Avg Rating');\n }\n\n private get reviewsTemplate() {\n return this.metadataTemplate(this.model?.commentCount, 'Reviews');\n }\n\n private get topicsTemplate() {\n if (!this.model?.subjects || this.model.subjects.length === 0) {\n return nothing;\n }\n return html`\n <div id=\"topics\" class=\"metadata\">\n ${this.labelTemplate('Topics')}\n ${join(\n map(this.model.subjects, id => this.searchLink('subject', id)),\n html`, `\n )}\n </div>\n `;\n }\n\n private get collectionsTemplate() {\n if (!this.model?.collections) {\n return nothing;\n }\n return html`\n <div id=\"collections\" class=\"metadata\">\n ${this.labelTemplate('Collections')}\n ${join(\n map(this.model.collections, id => this.detailsLink(id)),\n html`, `\n )}\n </div>\n `;\n }\n\n private get descriptionTemplate() {\n return this.metadataTemplate(\n DOMPurify.sanitize(this.model?.description ?? ''),\n '',\n 'description'\n );\n }\n\n // Utility functions\n private metadataTemplate(text: any, label = '', id?: string) {\n if (!text) return nothing;\n return html`\n <div id=${ifDefined(id)} class=\"metadata\">\n ${this.labelTemplate(label)} ${text}\n </div>\n `;\n }\n\n private labelTemplate(label: string) {\n return html`${label\n ? html`<span class=\"label\">${label}: </span>`\n : nothing}`;\n }\n\n private searchLink(field: string, searchTerm: string) {\n if (!field || !searchTerm) {\n return nothing;\n }\n const query = encodeURIComponent(`${field}:\"${searchTerm}\"`);\n // No whitespace after closing tag\n return html` <a href=\"${this.baseNavigationUrl}/search.php?query=${query}\">\n ${DOMPurify.sanitize(searchTerm)}</a\n >`;\n }\n\n private detailsLink(identifier: string, text?: string) {\n if (!identifier) {\n return nothing;\n }\n const linkText = text ?? identifier;\n // No whitespace after closing tag\n return html` <a href=\"${this.baseNavigationUrl}/details/${identifier}\"\n >${DOMPurify.sanitize(linkText)}</a\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 return (this.currentWidth ?? 531) < 530 ? 'mobile' : 'desktop';\n }\n\n private get formatSize(): DateFormat | NumberFormat {\n return (this.currentWidth ?? 531) < 530 ? 'short' : '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 div a {\n text-decoration: none;\n }\n\n .label {\n font-weight: bold;\n }\n\n .mobile {\n --infiniteScrollerRowGap: 20px;\n --infiniteScrollerRowHeight: auto;\n }\n\n .desktop {\n --infiniteScrollerRowGap: 30px;\n --infiniteScrollerRowHeight: auto;\n }\n /* fields */\n\n #thumb img {\n object-fit: cover;\n display: block;\n }\n\n .mobile #thumb img {\n width: 90px;\n height: 90px;\n }\n\n .desktop #thumb img {\n width: 100px;\n height: 100px;\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: 45px;\n -webkit-border-radius: 45px;\n -moz-border-radius: 45px;\n }\n\n .desktop #thumb img.account {\n border-radius: 50px;\n -webkit-border-radius: 50px;\n -moz-border-radius: 50px;\n }\n\n #icon-left {\n padding-top: 5px;\n }\n\n #title {\n color: #4b64ff;\n text-decoration: none;\n font-size: 22px;\n font-weight: bold;\n /* align top of text with image */\n line-height: 25px;\n margin-top: -4px;\n padding-bottom: 2px;\n }\n\n .metadata {\n line-height: 20px;\n }\n\n #creator,\n #topic,\n #source {\n text-overflow: ellipsis;\n overflow: hidden;\n }\n\n #icon {\n padding-top: 5px;\n }\n\n mediatype-icon {\n --iconHeight: 20px;\n }\n\n #description {\n padding-top: 10px;\n overflow: hidden;\n text-overflow: ellipsis;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n display: -webkit-box;\n word-break: break-word;\n -webkit-line-clamp: 3; /* number of lines to show */\n line-clamp: 3;\n -webkit-box-orient: vertical;\n text-align: left;\n }\n\n /* list-line */\n\n #list-line {\n display: flex;\n column-gap: 5px;\n }\n\n div a:hover {\n text-decoration: underline;\n }\n\n #item-line,\n #views-line {\n display: flex;\n flex-direction: row;\n gap: 10px;\n }\n `;\n }\n}\n"]}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { LitElement, PropertyValues } from 'lit';
|
|
2
2
|
import { SharedResizeObserverInterface, SharedResizeObserverResizeHandlerInterface } from '@internetarchive/shared-resize-observer';
|
|
3
3
|
import { SortParam } from '@internetarchive/search-service';
|
|
4
|
+
import type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';
|
|
4
5
|
import type { CollectionDisplayMode, TileModel } from '../models';
|
|
5
6
|
import './grid/collection-tile';
|
|
6
7
|
import './grid/item-tile';
|
|
@@ -17,10 +18,12 @@ export declare class TileDispatcher extends LitElement implements SharedResizeOb
|
|
|
17
18
|
currentHeight?: number;
|
|
18
19
|
resizeObserver?: SharedResizeObserverInterface;
|
|
19
20
|
sortParam?: SortParam;
|
|
21
|
+
collectionNameCache?: CollectionNameCacheInterface;
|
|
20
22
|
private container;
|
|
21
23
|
render(): import("lit-html").TemplateResult<1>;
|
|
22
24
|
private get headerTemplate();
|
|
23
25
|
private get tileTemplate();
|
|
26
|
+
private get linkTileTemplate();
|
|
24
27
|
handleResize(entry: ResizeObserverEntry): void;
|
|
25
28
|
disconnectedCallback(): void;
|
|
26
29
|
private stopResizeObservation;
|
|
@@ -34,11 +34,16 @@ let TileDispatcher = class TileDispatcher extends LitElement {
|
|
|
34
34
|
`;
|
|
35
35
|
}
|
|
36
36
|
get tileTemplate() {
|
|
37
|
-
var _a, _b;
|
|
38
37
|
return html `
|
|
39
38
|
${this.showDeleteButton
|
|
40
39
|
? html `<button id="delete-button">X</button>`
|
|
41
40
|
: nothing}
|
|
41
|
+
${this.displayMode === 'list-detail' ? this.tile : this.linkTileTemplate}
|
|
42
|
+
`;
|
|
43
|
+
}
|
|
44
|
+
get linkTileTemplate() {
|
|
45
|
+
var _a, _b;
|
|
46
|
+
return html `
|
|
42
47
|
<a
|
|
43
48
|
href="${this.baseNavigationUrl}/details/${(_a = this.model) === null || _a === void 0 ? void 0 : _a.identifier}"
|
|
44
49
|
title=${ifDefined((_b = this.model) === null || _b === void 0 ? void 0 : _b.title)}
|
|
@@ -101,6 +106,7 @@ let TileDispatcher = class TileDispatcher extends LitElement {
|
|
|
101
106
|
.baseNavigationUrl=${baseNavigationUrl}
|
|
102
107
|
.currentWidth=${currentWidth}
|
|
103
108
|
.currentHeight=${currentHeight}
|
|
109
|
+
.collectionNameCache=${this.collectionNameCache}
|
|
104
110
|
></item-tile>`;
|
|
105
111
|
}
|
|
106
112
|
case 'list-compact':
|
|
@@ -176,6 +182,9 @@ __decorate([
|
|
|
176
182
|
__decorate([
|
|
177
183
|
property({ type: Object })
|
|
178
184
|
], TileDispatcher.prototype, "sortParam", void 0);
|
|
185
|
+
__decorate([
|
|
186
|
+
property({ type: Object })
|
|
187
|
+
], TileDispatcher.prototype, "collectionNameCache", void 0);
|
|
179
188
|
__decorate([
|
|
180
189
|
query('#container')
|
|
181
190
|
], TileDispatcher.prototype, "container", void 0);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tile-dispatcher.js","sourceRoot":"","sources":["../../../src/tiles/tile-dispatcher.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAkB,MAAM,KAAK,CAAC;AACrE,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"tile-dispatcher.js","sourceRoot":"","sources":["../../../src/tiles/tile-dispatcher.ts"],"names":[],"mappings":"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","sourcesContent":["import { css, html, LitElement, nothing, PropertyValues } from 'lit';\nimport { customElement, property, query } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport {\n SharedResizeObserverInterface,\n SharedResizeObserverResizeHandlerInterface,\n} from '@internetarchive/shared-resize-observer';\nimport { SortParam } from '@internetarchive/search-service';\nimport type { CollectionNameCacheInterface } from '@internetarchive/collection-name-cache';\nimport type { CollectionDisplayMode, TileModel } from '../models';\nimport './grid/collection-tile';\nimport './grid/item-tile';\nimport './grid/account-tile';\nimport './list/tile-list';\nimport './list/tile-list-compact';\nimport './list/tile-list-compact-header';\n\n@customElement('tile-dispatcher')\nexport class TileDispatcher\n extends LitElement\n implements SharedResizeObserverResizeHandlerInterface\n{\n @property({ type: String }) displayMode?: CollectionDisplayMode;\n\n @property({ type: Object }) model?: TileModel;\n\n @property({ type: String }) baseNavigationUrl?: string;\n\n @property({ type: Boolean }) showDeleteButton = false;\n\n @property({ type: Number }) currentWidth?: number;\n\n @property({ type: Number }) currentHeight?: number;\n\n @property({ type: Object }) resizeObserver?: SharedResizeObserverInterface;\n\n @property({ type: Object }) sortParam?: SortParam;\n\n @property({ type: Object })\n collectionNameCache?: CollectionNameCacheInterface;\n\n @query('#container') private container!: HTMLDivElement;\n\n render() {\n return html`\n <div id=\"container\">\n ${this.displayMode === 'list-header'\n ? this.headerTemplate\n : this.tileTemplate}\n </div>\n `;\n }\n\n private get headerTemplate() {\n const { currentWidth, sortParam } = this;\n return html`\n <tile-list-compact-header\n class=\"header\"\n .currentWidth=${currentWidth}\n .sortParam=${sortParam}\n >\n </tile-list-compact-header>\n `;\n }\n\n private get tileTemplate() {\n return html`\n ${this.showDeleteButton\n ? html`<button id=\"delete-button\">X</button>`\n : nothing}\n ${this.displayMode === 'list-detail' ? this.tile : this.linkTileTemplate}\n `;\n }\n\n private get linkTileTemplate() {\n return html`\n <a\n href=\"${this.baseNavigationUrl}/details/${this.model?.identifier}\"\n title=${ifDefined(this.model?.title)}\n >\n ${this.tile}\n </a>\n `;\n }\n\n handleResize(entry: ResizeObserverEntry): void {\n this.currentWidth = entry.contentRect.width;\n this.currentHeight = entry.contentRect.height;\n }\n\n disconnectedCallback(): void {\n this.stopResizeObservation(this.resizeObserver);\n }\n\n private stopResizeObservation(observer?: SharedResizeObserverInterface) {\n observer?.removeObserver({\n handler: this,\n target: this.container,\n });\n }\n\n private startResizeObservation() {\n this.stopResizeObservation(this.resizeObserver);\n this.resizeObserver?.addObserver({\n handler: this,\n target: this.container,\n });\n }\n\n updated(props: PropertyValues) {\n if (props.has('resizeObserver')) {\n const previousObserver = props.get(\n 'resizeObserver'\n ) as SharedResizeObserverInterface;\n this.stopResizeObservation(previousObserver);\n this.startResizeObservation();\n }\n }\n\n private get tile() {\n const { model, baseNavigationUrl, currentWidth, currentHeight, sortParam } =\n this;\n\n if (!model) return nothing;\n\n switch (this.displayMode) {\n case 'grid':\n switch (model.mediatype) {\n case 'collection':\n return html`<collection-tile\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n >\n </collection-tile>`;\n case 'account':\n return html`<account-tile\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n ></account-tile>`;\n default:\n return html`<item-tile\n .model=${model}\n .baseNavigationUrl=${baseNavigationUrl}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .collectionNameCache=${this.collectionNameCache}\n ></item-tile>`;\n }\n case 'list-compact':\n return html`<tile-list-compact\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n ></tile-list-compact>`;\n case 'list-detail':\n return html`<tile-list\n .model=${model}\n .currentWidth=${currentWidth}\n .currentHeight=${currentHeight}\n .baseNavigationUrl=${baseNavigationUrl}\n .sortParam=${sortParam}\n ></tile-list>`;\n default:\n return nothing;\n }\n }\n\n static get styles() {\n return css`\n :host {\n display: block;\n height: 100%;\n }\n\n #container {\n height: 100%;\n }\n\n #delete-button {\n float: right;\n }\n\n a {\n display: block;\n height: 100%;\n color: unset;\n text-decoration: none;\n }\n\n a :first-child {\n display: block;\n height: 100%;\n }\n `;\n }\n}\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|