diff --git a/src/assets/css/librarybrowser.css b/src/assets/css/librarybrowser.css
index 88598fb94d..460585ae61 100644
--- a/src/assets/css/librarybrowser.css
+++ b/src/assets/css/librarybrowser.css
@@ -24,10 +24,6 @@
padding-top: 7em !important;
}
-.layout-mobile .libraryPage {
- padding-top: 4em !important;
-}
-
.itemDetailPage {
padding-top: 0 !important;
}
@@ -164,6 +160,7 @@
display: flex;
flex-direction: column;
contain: layout style paint;
+ transition: background ease-in-out 0.5s;
}
.hiddenViewMenuBar .skinHeader {
@@ -438,12 +435,14 @@
background-repeat: no-repeat;
background-position: center;
background-attachment: fixed;
- height: 50vh;
+ height: 40vh;
position: relative;
+ animation: backdrop-fadein 800ms ease-in normal both;
}
.layout-mobile .itemBackdrop {
background-attachment: scroll;
+ height: 26.5vh;
}
.layout-desktop .itemBackdrop::after,
@@ -463,10 +462,20 @@
.detailPageContent {
display: flex;
flex-direction: column;
- padding-left: 2%;
+ padding-left: 32.45vw;
padding-right: 2%;
}
+.layout-mobile .detailPageContent {
+ padding-left: 5%;
+ padding-right: 5%;
+}
+
+.layout-desktop .detailPageContent .emby-scroller,
+.layout-tv .detailPageContent .emby-scroller {
+ margin-left: 0;
+}
+
.layout-desktop .noBackdrop .detailPageContent,
.layout-tv .noBackdrop .detailPageContent {
margin-top: 2.5em;
@@ -477,6 +486,10 @@
margin-top: 0;
}
+.detailSectionContent a {
+ color: inherit;
+}
+
.personBackdrop {
background-size: contain;
}
@@ -495,7 +508,23 @@
.parentName {
display: block;
- margin-bottom: 0.5em;
+ margin: 0 0 0;
+}
+
+.layout-mobile .parentName {
+ margin: 0.6em 0 0;
+}
+
+.musicParentName {
+ margin: 0.15em 0 0.2em;
+}
+
+.layout-mobile .musicParentName {
+ margin: -0.25em 0 0.25em;
+}
+
+.layout-mobile .itemExternalLinks {
+ display: none;
}
.mainDetailButtons {
@@ -503,8 +532,6 @@
-webkit-box-align: center;
-webkit-align-items: center;
align-items: center;
- -webkit-flex-wrap: wrap;
- flex-wrap: wrap;
margin: 1em 0;
}
@@ -520,6 +547,35 @@
font-weight: 600;
}
+.itemName.originalTitle {
+ margin: 0.2em 0 0.2em;
+}
+
+.itemName.parentNameLast {
+ margin: 0 0 0;
+}
+
+.layout-mobile .itemName.parentNameLast {
+ margin: 0.4em 0 0.4em;
+}
+
+.layout-mobile h1.itemName,
+.layout-mobile h1.parentName {
+ font-size: 1.6em;
+}
+
+.itemName.parentNameLast.withOriginalTitle {
+ margin: 0 0 0;
+}
+
+.layout-mobile .itemName.parentNameLast.withOriginalTitle {
+ margin: 0.6em 0 0;
+}
+
+.layout-mobile .itemName.originalTitle {
+ margin: 0.5em 0 0.5em;
+}
+
.nameContainer {
display: flex;
flex-direction: column;
@@ -546,6 +602,19 @@
text-align: center;
}
+.layout-mobile .mainDetailButtons {
+ margin-top: 1em;
+ margin-bottom: 0.5em;
+}
+
+.subtitle {
+ margin: 0.15em 0 0.2em;
+}
+
+.layout-mobile .subtitle {
+ margin: 0.2em 0 0.2em;
+}
+
.detailPagePrimaryContainer {
display: flex;
align-items: center;
@@ -556,7 +625,7 @@
.layout-mobile .detailPagePrimaryContainer {
display: block;
position: relative;
- top: 0;
+ padding: 0.5em 3.3% 0.5em;
}
.layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer,
@@ -566,13 +635,14 @@
padding-left: 32.45vw;
}
-.layout-desktop .detailSticky,
-.layout-tv .detailSticky {
+.layout-desktop .detailRibbon,
+.layout-tv .detailRibbon {
margin-top: -7.2em;
+ height: 7.18em;
}
-.layout-desktop .noBackdrop .detailSticky,
-.layout-tv .noBackdrop .detailSticky {
+.layout-desktop .noBackdrop .detailRibbon,
+.layout-tv .noBackdrop .detailRibbon {
margin-top: 0;
}
@@ -584,6 +654,9 @@
white-space: nowrap;
text-overflow: ellipsis;
text-align: left;
+ min-width: 0;
+ max-width: 100%;
+ overflow: hidden;
}
.layout-mobile .infoText {
@@ -594,13 +667,29 @@
margin: 1.25em 0;
}
-.detailImageContainer {
- position: relative;
- margin-top: -25vh;
- margin-bottom: 10vh;
+.layout-mobile .detailPageSecondaryContainer {
+ margin: 1em 0;
+}
+
+.layout-mobile .detailImageContainer {
+ display: none;
+}
+
+.detailImageContainer .card {
+ position: absolute;
+ top: 50%;
float: left;
width: 25vw;
z-index: 3;
+ transform: translateY(-50%);
+}
+
+.detailImageContainer .card.backdropCard {
+ top: 35%;
+}
+
+.detailImageContainer .card.squareCard {
+ top: 40%;
}
.layout-desktop .noBackdrop .detailImageContainer,
@@ -613,11 +702,11 @@
}
.detailLogo {
- width: 30vw;
- height: 25vh;
+ width: 25vw;
+ height: 16vh;
position: absolute;
top: 10vh;
- right: 20vw;
+ right: 25vw;
background-size: contain;
}
@@ -657,14 +746,19 @@ div.itemDetailGalleryLink.defaultCardBackground {
position: relative;
}
- .layout-desktop .detailPageWrapperContainer,
- .layout-tv .detailPageWrapperContainer {
- margin-top: 7.2em;
+ .layout-desktop .itemBackdrop,
+ .layout-tv .itemBackdrop {
+ height: 40vh;
}
- .layout-tv #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer,
- .layout-desktop #itemDetailPage:not(.noBackdrop) .detailPagePrimaryContainer {
- padding-left: 3.3%;
+ .layout-desktop .detailPageWrapperContainer,
+ .layout-tv .detailPageWrapperContainer {
+ margin-top: 0.1em;
+ }
+
+ .layout-desktop .detailImageContainer .card,
+ .layout-tv .detailImageContainer .card {
+ top: 10%;
}
.btnPlaySimple {
@@ -680,12 +774,12 @@ div.itemDetailGalleryLink.defaultCardBackground {
.emby-button.detailFloatingButton {
position: absolute;
- background-color: rgba(0, 0, 0, 0.5) !important;
- z-index: 1;
- top: 50%;
- left: 50%;
+ background-color: rgba(0, 0, 0, 0.5);
+ z-index: 3;
+ top: 100%;
+ left: 90%;
margin: -2.2em 0 0 -2.2em;
- padding: 0.4em !important;
+ padding: 0.4em;
color: rgba(255, 255, 255, 0.76);
}
@@ -695,16 +789,12 @@ div.itemDetailGalleryLink.defaultCardBackground {
@media all and (max-width: 62.5em) {
.parentName {
- margin-bottom: 1em;
+ margin-bottom: 0;
}
.itemDetailPage {
padding-top: 0 !important;
}
-
- .detailimg-hidemobile {
- display: none;
- }
}
@media all and (min-width: 31.25em) {
@@ -868,6 +958,10 @@ div.itemDetailGalleryLink.defaultCardBackground {
}
}
+.detailVerticalSection .emby-scrollbuttons {
+ padding-top: 0.4em;
+}
+
.layout-tv .detailVerticalSection {
margin-bottom: 3.4em !important;
}
@@ -956,6 +1050,10 @@ div.itemDetailGalleryLink.defaultCardBackground {
margin-bottom: 2.7em;
}
+.layout-mobile .verticalSection-extrabottompadding {
+ margin-bottom: 1em;
+}
+
.sectionTitleButton,
.sectionTitleIconButton {
margin-right: 0 !important;
@@ -981,7 +1079,13 @@ div.itemDetailGalleryLink.defaultCardBackground {
div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
margin: 0;
- padding-top: 1.25em;
+ padding-top: 0.5em;
+ padding-bottom: 0.2em;
+}
+
+.layout-mobile :not(.sectionTitleContainer-cards) > .sectionTitle-cards {
+ margin: 0;
+ padding-top: 0.5em;
}
.sectionTitleButton {
@@ -1134,6 +1238,12 @@ div:not(.sectionTitleContainer-cards) > .sectionTitle-cards {
.trackSelections .selectContainer .selectLabel {
margin: 0 0.2em 0 0;
+ line-height: 1.75;
+}
+
+.layout-mobile .detailsGroupItem .label,
+.layout-mobile .trackSelections .selectContainer .selectLabel {
+ flex-basis: 4.5em;
}
.trackSelections .selectContainer .detailTrackSelect {
diff --git a/src/components/actionSheet/actionSheet.js b/src/components/actionSheet/actionSheet.js
index c56f42a9d9..2e22111945 100644
--- a/src/components/actionSheet/actionSheet.js
+++ b/src/components/actionSheet/actionSheet.js
@@ -16,7 +16,7 @@ function getOffsets(elems) {
return results;
}
- for (let elem of elems) {
+ for (const elem of elems) {
let box = elem.getBoundingClientRect();
results.push({
@@ -135,7 +135,7 @@ export function show(options) {
let renderIcon = false;
let icons = [];
let itemIcon;
- for (let item of options.items) {
+ for (const item of options.items) {
itemIcon = item.icon || (item.selected ? 'check' : null);
diff --git a/src/components/cardbuilder/cardBuilder.js b/src/components/cardbuilder/cardBuilder.js
index 52d5ed202a..6b37e023b9 100644
--- a/src/components/cardbuilder/cardBuilder.js
+++ b/src/components/cardbuilder/cardBuilder.js
@@ -1310,7 +1310,7 @@ import 'programStyles';
}
const mediaSourceCount = item.MediaSourceCount || 1;
- if (mediaSourceCount > 1) {
+ if (mediaSourceCount > 1 && options.disableIndicators !== true) {
innerCardFooter += '
' + mediaSourceCount + '
';
}
@@ -1391,34 +1391,36 @@ import 'programStyles';
cardBoxClose = '';
cardScalableClose = '';
- let indicatorsHtml = '';
+ if (options.disableIndicators !== true) {
+ let indicatorsHtml = '';
- if (options.missingIndicator !== false) {
- indicatorsHtml += indicators.getMissingIndicator(item);
- }
+ if (options.missingIndicator !== false) {
+ indicatorsHtml += indicators.getMissingIndicator(item);
+ }
- indicatorsHtml += indicators.getSyncIndicator(item);
- indicatorsHtml += indicators.getTimerIndicator(item);
+ indicatorsHtml += indicators.getSyncIndicator(item);
+ indicatorsHtml += indicators.getTimerIndicator(item);
- indicatorsHtml += indicators.getTypeIndicator(item);
+ indicatorsHtml += indicators.getTypeIndicator(item);
- if (options.showGroupCount) {
+ if (options.showGroupCount) {
- indicatorsHtml += indicators.getChildCountIndicatorHtml(item, {
- minCount: 1
- });
- } else {
- indicatorsHtml += indicators.getPlayedIndicatorHtml(item);
- }
+ indicatorsHtml += indicators.getChildCountIndicatorHtml(item, {
+ minCount: 1
+ });
+ } else {
+ indicatorsHtml += indicators.getPlayedIndicatorHtml(item);
+ }
- if (item.Type === 'CollectionFolder' || item.CollectionType) {
- const refreshClass = item.RefreshProgress ? '' : ' class="hide"';
- indicatorsHtml += '';
- requireRefreshIndicator();
- }
+ if (item.Type === 'CollectionFolder' || item.CollectionType) {
+ const refreshClass = item.RefreshProgress ? '' : ' class="hide"';
+ indicatorsHtml += '';
+ requireRefreshIndicator();
+ }
- if (indicatorsHtml) {
- cardImageContainerOpen += '' + indicatorsHtml + '
';
+ if (indicatorsHtml) {
+ cardImageContainerOpen += '' + indicatorsHtml + '
';
+ }
}
if (!imgUrl) {
@@ -1467,7 +1469,7 @@ import 'programStyles';
let additionalCardContent = '';
if (layoutManager.desktop) {
- additionalCardContent += getHoverMenuHtml(item, action);
+ additionalCardContent += getHoverMenuHtml(item, action, options);
}
return '<' + tagName + ' data-index="' + index + '"' + timerAttributes + actionAttribute + ' data-isfolder="' + (item.IsFolder || false) + '" data-serverid="' + (item.ServerId || options.serverId) + '" data-id="' + (item.Id || item.ItemId) + '" data-type="' + item.Type + '"' + mediaTypeData + collectionTypeData + channelIdData + positionTicksData + collectionIdData + playlistIdData + contextData + parentIdData + ' data-prefix="' + prefix + '" class="' + className + '">' + cardImageContainerOpen + innerCardFooter + cardImageContainerClose + overlayButtons + additionalCardContent + cardScalableClose + outerCardFooter + cardBoxClose + '' + tagName + '>';
@@ -1477,9 +1479,10 @@ import 'programStyles';
* Generates HTML markup for the card overlay.
* @param {object} item - Item used to generate the card overlay.
* @param {string} action - Action assigned to the overlay.
+ * @param {Array} options - Card builder options.
* @returns {string} HTML markup of the card overlay.
*/
- function getHoverMenuHtml(item, action) {
+ function getHoverMenuHtml(item, action, options) {
let html = '';
html += '';
@@ -1494,12 +1497,12 @@ import 'programStyles';
const userData = item.UserData || {};
- if (itemHelper.canMarkPlayed(item)) {
+ if (itemHelper.canMarkPlayed(item) && !options.disableHoverMenu) {
require(['emby-playstatebutton']);
html += '';
}
- if (itemHelper.canRate(item)) {
+ if (itemHelper.canRate(item) && !options.disableHoverMenu) {
const likes = userData.Likes == null ? '' : userData.Likes;
@@ -1507,7 +1510,9 @@ import 'programStyles';
html += '';
}
- html += '';
+ if (!options.disableHoverMenu) {
+ html += '';
+ }
html += '
';
html += '';
diff --git a/src/components/groupedcards.js b/src/components/groupedcards.js
index 602c4310f4..5f23d8bb18 100644
--- a/src/components/groupedcards.js
+++ b/src/components/groupedcards.js
@@ -22,7 +22,7 @@ define(['dom', 'appRouter', 'connectionManager'], function (dom, appRouter, conn
return void appRouter.showItem(items[0]);
}
- var url = 'itemdetails.html?id=' + itemId + '&serverId=' + serverId;
+ var url = 'details?id=' + itemId + '&serverId=' + serverId;
Dashboard.navigate(url);
});
e.stopPropagation();
diff --git a/src/components/images/imageLoader.js b/src/components/images/imageLoader.js
index f7183515c5..ddf1183797 100644
--- a/src/components/images/imageLoader.js
+++ b/src/components/images/imageLoader.js
@@ -212,8 +212,15 @@ import 'css!./style';
}
}
+ export function setLazyImage(element, url) {
+ element.classList.add('lazy');
+ element.setAttribute('data-src', url);
+ lazyImage(element);
+ }
+
/* eslint-enable indent */
export default {
+ serLazyImage: setLazyImage,
fillImages: fillImages,
fillImage: fillImage,
lazyImage: lazyImage,
diff --git a/src/components/itemHelper.js b/src/components/itemHelper.js
index b18f37110c..3508866bdb 100644
--- a/src/components/itemHelper.js
+++ b/src/components/itemHelper.js
@@ -1,14 +1,12 @@
define(['apphost', 'globalize'], function (appHost, globalize) {
'use strict';
- function getDisplayName(item, options) {
+ function getDisplayName(item, options = {}) {
if (!item) {
throw new Error('null item passed into getDisplayName');
}
- options = options || {};
-
if (item.Type === 'Timer') {
item = item.ProgramInfo || item;
}
diff --git a/src/components/listview/listview.js b/src/components/listview/listview.js
index 42f32ba794..b2fa2d6971 100644
--- a/src/components/listview/listview.js
+++ b/src/components/listview/listview.js
@@ -125,10 +125,7 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
var largeTitleTagName = layoutManager.tv ? 'h2' : 'div';
- for (var i = 0, length = textlines.length; i < length; i++) {
-
- var text = textlines[i];
-
+ for (const [i, text] of textlines.entries()) {
if (!text) {
continue;
}
@@ -434,8 +431,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
html += '';
- const moreIcon = 'more_vert';
-
html += getTextLinesHtml(textlines, isLargeStyle);
if (options.mediaInfo !== false) {
@@ -486,10 +481,6 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
html += '';
}
- if (options.moreButton !== false) {
- html += '';
- }
-
if (options.infoButton) {
html += '';
}
@@ -503,14 +494,18 @@ define(['itemHelper', 'mediaInfo', 'indicators', 'connectionManager', 'layoutMan
var userData = item.UserData || {};
var likes = userData.Likes == null ? '' : userData.Likes;
- if (itemHelper.canMarkPlayed(item)) {
+ if (itemHelper.canMarkPlayed(item) && options.enablePlayedButton !== false) {
html += '';
}
- if (itemHelper.canRate(item)) {
+ if (itemHelper.canRate(item) && options.enableRatingButton !== false) {
html += '';
}
}
+
+ if (options.moreButton !== false) {
+ html += '';
+ }
}
html += '
';
diff --git a/src/components/mediainfo/mediainfo.css b/src/components/mediainfo/mediainfo.css
index 1883b78726..508c9d96ad 100644
--- a/src/components/mediainfo/mediainfo.css
+++ b/src/components/mediainfo/mediainfo.css
@@ -41,6 +41,8 @@
width: auto !important;
height: auto !important;
font-size: 1.4em;
+ margin-right: 0.125em;
+ color: #f2b01e;
}
.mediaInfoCriticRating {
diff --git a/src/components/remotecontrol/remotecontrol.js b/src/components/remotecontrol/remotecontrol.js
index b1d7471331..d620ea5d1e 100644
--- a/src/components/remotecontrol/remotecontrol.js
+++ b/src/components/remotecontrol/remotecontrol.js
@@ -122,10 +122,10 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
var artistName;
if (item.ArtistItems != null) {
artistName = item.ArtistItems[0].Name;
- context.querySelector('.nowPlayingAlbum').innerHTML = '${albumName}`;
- context.querySelector('.nowPlayingArtist').innerHTML = '${artistName}`;
- context.querySelector('.contextMenuAlbum').innerHTML = ' ` + globalize.translate('ViewAlbum') + '';
- context.querySelector('.contextMenuArtist').innerHTML = ' ` + globalize.translate('ViewArtist') + '';
+ context.querySelector('.nowPlayingAlbum').innerHTML = '${albumName}`;
+ context.querySelector('.nowPlayingArtist').innerHTML = '${artistName}`;
+ context.querySelector('.contextMenuAlbum').innerHTML = ' ` + globalize.translate('ViewAlbum') + '';
+ context.querySelector('.contextMenuArtist').innerHTML = ' ` + globalize.translate('ViewArtist') + '';
} else {
artistName = item.Artists;
context.querySelector('.nowPlayingAlbum').innerHTML = albumName;
@@ -136,12 +136,12 @@ define(['browser', 'datetime', 'backdrop', 'libraryBrowser', 'listView', 'imageL
} else if (item.Type == 'Episode') {
if (item.SeasonName != null) {
var seasonName = item.SeasonName;
- context.querySelector('.nowPlayingSeason').innerHTML = '${seasonName}`;
+ context.querySelector('.nowPlayingSeason').innerHTML = '${seasonName}`;
}
if (item.SeriesName != null) {
var seriesName = item.SeriesName;
if (item.SeriesId != null) {
- context.querySelector('.nowPlayingSerie').innerHTML = '${seriesName}`;
+ context.querySelector('.nowPlayingSerie').innerHTML = '${seriesName}`;
} else {
context.querySelector('.nowPlayingSerie').innerHTML = seriesName;
}
diff --git a/src/itemdetails.html b/src/controllers/itemDetails/index.html
similarity index 73%
rename from src/itemdetails.html
rename to src/controllers/itemDetails/index.html
index 44ca561d40..ddb7be3aec 100644
--- a/src/itemdetails.html
+++ b/src/controllers/itemDetails/index.html
@@ -1,8 +1,5 @@
-
+
-
@@ -15,94 +12,75 @@
-
@@ -110,7 +88,7 @@
-
-
${HeaderSchedule}
-
+
${HeaderSchedule}
+
-
+
-
${HeaderNextUp}
-
+
${HeaderNextUp}
+
@@ -180,64 +163,64 @@
-
-
${HeaderAdditionalParts}
-
+
${HeaderAdditionalParts}
+
-
-
+
-
-
+
-
${HeaderUpcomingOnTV}
-
+
${HeaderUpcomingOnTV}
+
-
${HeaderSpecialFeatures}
-
+
${HeaderSpecialFeatures}
+
-
${HeaderMusicVideos}
-
+
${HeaderMusicVideos}
+
-