diff --git a/dashboard-ui/bower_components/emby-webcomponents/.bower.json b/dashboard-ui/bower_components/emby-webcomponents/.bower.json index 308a67d6da..9f04b5111b 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/.bower.json +++ b/dashboard-ui/bower_components/emby-webcomponents/.bower.json @@ -16,12 +16,12 @@ }, "devDependencies": {}, "ignore": [], - "version": "1.1.37", - "_release": "1.1.37", + "version": "1.1.42", + "_release": "1.1.42", "_resolution": { "type": "version", - "tag": "1.1.37", - "commit": "7235838b8cff53a9bb2aea7d6c6418160728cd3a" + "tag": "1.1.42", + "commit": "324128b974bbf7d7e011a2add0beae2c0611f9aa" }, "_source": "git://github.com/MediaBrowser/emby-webcomponents.git", "_target": "~1.1.5", diff --git a/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js b/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js new file mode 100644 index 0000000000..76e79a888f --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/backdrop/backdrop.js @@ -0,0 +1,236 @@ +define(['browser', 'css!./style'], function (browser) { + + function enableAnimation() { + + if (browser.mobile) { + return false; + } + + return true; + } + + function backdrop() { + + var self = this; + var isDestroyed; + + self.load = function (url, parent, existingBackdropImage) { + + var img = new Image(); + img.onload = function () { + + if (isDestroyed) { + return; + } + + var backdropImage = document.createElement('div'); + backdropImage.classList.add('backdropImage'); + backdropImage.classList.add('displayingBackdropImage'); + backdropImage.style.backgroundImage = "url('" + url + "')"; + backdropImage.setAttribute('data-url', url); + + parent.appendChild(backdropImage); + + if (!enableAnimation()) { + if (existingBackdropImage && existingBackdropImage.parentNode) { + existingBackdropImage.parentNode.removeChild(existingBackdropImage); + } + internalBackdrop(true); + return; + } + + var animation = fadeIn(backdropImage, 1); + currentAnimation = animation; + animation.onfinish = function () { + + if (animation == currentAnimation) { + currentAnimation = null; + } + if (existingBackdropImage && existingBackdropImage.parentNode) { + existingBackdropImage.parentNode.removeChild(existingBackdropImage); + } + }; + + internalBackdrop(true); + }; + img.src = url; + }; + + var currentAnimation; + function fadeIn(elem, iterations) { + var keyframes = [ + { opacity: '0', offset: 0 }, + { opacity: '1', offset: 1 }]; + var timing = { duration: 800, iterations: iterations, easing: 'ease-in' }; + return elem.animate(keyframes, timing); + } + + function cancelAnimation() { + var animation = currentAnimation; + if (animation) { + console.log('Cancelling backdrop animation'); + animation.cancel(); + currentAnimation = null; + } + } + + self.destroy = function () { + + isDestroyed = true; + cancelAnimation(); + }; + } + + var backdropContainer; + function getBackdropContainer() { + + if (!backdropContainer) { + backdropContainer = document.querySelector('.backdropContainer'); + } + + if (!backdropContainer) { + backdropContainer = document.createElement('div'); + backdropContainer.classList.add('backdropContainer'); + document.body.insertBefore(backdropContainer, document.body.firstChild); + } + + return backdropContainer; + } + + function clearBackdrop(clearAll) { + + if (currentLoadingBackdrop) { + currentLoadingBackdrop.destroy(); + currentLoadingBackdrop = null; + } + + var elem = getBackdropContainer(); + elem.innerHTML = ''; + + if (clearAll) { + hasExternalBackdrop = false; + } + internalBackdrop(false); + } + + var skinContainer; + function setSkinContainerBackgroundEnabled() { + + if (!skinContainer) { + skinContainer = document.querySelector('.skinContainer'); + } + + if (hasInternalBackdrop || hasExternalBackdrop) { + skinContainer.classList.add('withBackdrop'); + } else { + skinContainer.classList.remove('withBackdrop'); + } + } + + var hasInternalBackdrop; + function internalBackdrop(enabled) { + hasInternalBackdrop = enabled; + setSkinContainerBackgroundEnabled(); + } + + var hasExternalBackdrop; + function externalBackdrop(enabled) { + hasExternalBackdrop = enabled; + setSkinContainerBackgroundEnabled(); + } + + function getRandom(min, max) { + return Math.floor(Math.random() * (max - min) + min); + } + + var currentLoadingBackdrop; + function setBackdropImage(url) { + + if (currentLoadingBackdrop) { + currentLoadingBackdrop.destroy(); + currentLoadingBackdrop = null; + } + + var elem = getBackdropContainer(); + var existingBackdropImage = elem.querySelector('.displayingBackdropImage'); + + if (existingBackdropImage && existingBackdropImage.getAttribute('data-url') == url) { + if (existingBackdropImage.getAttribute('data-url') == url) { + return; + } + existingBackdropImage.classList.remove('displayingBackdropImage'); + } + + var instance = new backdrop(); + instance.load(url, elem, existingBackdropImage); + currentLoadingBackdrop = instance; + } + + function setBackdrops(items) { + + var images = items.map(function (i) { + + if (i.BackdropImageTags && i.BackdropImageTags.length > 0) { + return { + id: i.Id, + tag: i.BackdropImageTags[0], + serverId: i.ServerId + }; + } + + if (i.ParentBackdropItemId && i.ParentBackdropImageTags && i.ParentBackdropImageTags.length) { + + return { + id: i.ParentBackdropItemId, + tag: i.ParentBackdropImageTags[0], + serverId: i.ServerId + }; + } + return null; + + }).filter(function (i) { + return i != null; + }); + + if (images.length) { + + var index = getRandom(0, images.length - 1); + var item = images[index]; + + require(['connectionManager'], function (connectionManager) { + + var apiClient = connectionManager.getApiClient(item.serverId); + var imgUrl = apiClient.getScaledImageUrl(item.id, { + type: "Backdrop", + tag: item.tag, + //maxWidth: window.innerWidth, + quality: 100 + }); + + setBackdrop(imgUrl); + }); + + } else { + clearBackdrop(); + } + } + + function setBackdrop(url) { + + if (url) { + setBackdropImage(url); + + } else { + clearBackdrop(); + } + } + + return { + + setBackdrops: setBackdrops, + setBackdrop: setBackdrop, + clear: clearBackdrop, + externalBackdrop: externalBackdrop + }; + +}); \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/backdrop/style.css b/dashboard-ui/bower_components/emby-webcomponents/backdrop/style.css new file mode 100644 index 0000000000..d60beb08e8 --- /dev/null +++ b/dashboard-ui/bower_components/emby-webcomponents/backdrop/style.css @@ -0,0 +1,11 @@ +.backdropImage { + background-repeat: no-repeat; + background-position: center center; + background-size: cover; + background-attachment: fixed; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} \ No newline at end of file diff --git a/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js b/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js index 75cc58cfea..0d39eb7102 100644 --- a/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js +++ b/dashboard-ui/bower_components/emby-webcomponents/focusmanager.js @@ -120,36 +120,37 @@ define([], function () { return elem; } - function getOffset(elem, doc) { + function getWindowData(win, documentElement) { + + return { + pageYOffset: win.pageYOffset, + pageXOffset: win.pageXOffset, + clientTop: documentElement.clientTop, + clientLeft: documentElement.clientLeft + }; + } + + function getOffset(elem, windowData) { var box = { top: 0, left: 0 }; - if (!doc) { - return box; - } - - var docElem = doc.documentElement; - // Support: BlackBerry 5, iOS 3 (original iPhone) // If we don't have gBCR, just use 0,0 rather than error if (elem.getBoundingClientRect) { box = elem.getBoundingClientRect(); } - var win = doc.defaultView; return { - top: box.top + win.pageYOffset - docElem.clientTop, - left: box.left + win.pageXOffset - docElem.clientLeft + top: box.top + windowData.pageYOffset - windowData.clientTop, + left: box.left + windowData.pageXOffset - windowData.clientLeft }; } - function getViewportBoundingClientRect(elem) { + function getViewportBoundingClientRect(elem, windowData) { - var doc = elem.ownerDocument; - var offset = getOffset(elem, doc); - var win = doc.defaultView; + var offset = getOffset(elem, windowData); - var posY = offset.top - win.pageXOffset; - var posX = offset.left - win.pageYOffset; + var posY = offset.top - windowData.pageXOffset; + var posX = offset.left - windowData.pageYOffset; var width = elem.offsetWidth; var height = elem.offsetHeight; @@ -162,11 +163,6 @@ define([], function () { right: posX + width, bottom: posY + height }; - var scrollLeft = (((t = document.documentElement) || (t = document.body.parentNode)) - && typeof t.scrollLeft == 'number' ? t : document.body).scrollLeft; - - var scrollTop = (((t = document.documentElement) || (t = document.body.parentNode)) - && typeof t.scrollTop == 'number' ? t : document.body).scrollTop; } function nav(activeElement, direction) { @@ -186,7 +182,9 @@ define([], function () { var focusableContainer = parentWithClass(activeElement, 'focusable'); - var rect = getViewportBoundingClientRect(activeElement); + var doc = activeElement.ownerDocument; + var windowData = getWindowData(doc.defaultView, doc.documentElement); + var rect = getViewportBoundingClientRect(activeElement, windowData); var focusableElements = []; var focusable = container.querySelectorAll(focusableQuery); @@ -205,7 +203,7 @@ define([], function () { continue; } - var elementRect = getViewportBoundingClientRect(curr); + var elementRect = getViewportBoundingClientRect(curr, windowData); switch (direction) { diff --git a/dashboard-ui/bower_components/paper-behaviors/.bower.json b/dashboard-ui/bower_components/paper-behaviors/.bower.json index 2b04bf9f8a..a6b333d335 100644 --- a/dashboard-ui/bower_components/paper-behaviors/.bower.json +++ b/dashboard-ui/bower_components/paper-behaviors/.bower.json @@ -45,7 +45,7 @@ "tag": "v1.0.11", "commit": "e3c1ab0c72905b58fb4d9adc2921ea73b5c085a5" }, - "_source": "git://github.com/PolymerElements/paper-behaviors.git", + "_source": "git://github.com/polymerelements/paper-behaviors.git", "_target": "^1.0.0", - "_originalSource": "PolymerElements/paper-behaviors" + "_originalSource": "polymerelements/paper-behaviors" } \ No newline at end of file diff --git a/dashboard-ui/bower_components/paper-ripple/.bower.json b/dashboard-ui/bower_components/paper-ripple/.bower.json index 157225ee71..2f654d71c6 100644 --- a/dashboard-ui/bower_components/paper-ripple/.bower.json +++ b/dashboard-ui/bower_components/paper-ripple/.bower.json @@ -32,14 +32,14 @@ "iron-test-helpers": "PolymerElements/iron-test-helpers#^1.0.0" }, "ignore": [], - "homepage": "https://github.com/PolymerElements/paper-ripple", + "homepage": "https://github.com/polymerelements/paper-ripple", "_release": "1.0.5", "_resolution": { "type": "version", "tag": "v1.0.5", "commit": "d72e7a9a8ab518b901ed18dde492df3b87a93be5" }, - "_source": "git://github.com/PolymerElements/paper-ripple.git", + "_source": "git://github.com/polymerelements/paper-ripple.git", "_target": "^1.0.0", - "_originalSource": "PolymerElements/paper-ripple" + "_originalSource": "polymerelements/paper-ripple" } \ No newline at end of file diff --git a/dashboard-ui/components/remotecontrol.js b/dashboard-ui/components/remotecontrol.js index d3f16fe159..7fbabd33dd 100644 --- a/dashboard-ui/components/remotecontrol.js +++ b/dashboard-ui/components/remotecontrol.js @@ -196,7 +196,9 @@ // But for now, if you change songs but keep the same artist, the backdrop will flicker because in-between songs it clears out the image if (!browser.mobile) { // Exclude from mobile because it just doesn't perform well - Backdrops.setBackdropUrl(context, backdropUrl); + require(['backdrop'], function (backdrop) { + backdrop.setBackdrop(backdropUrl); + }); } ApiClient.getItem(Dashboard.getCurrentUserId(), item.Id).then(function (fullItem) { diff --git a/dashboard-ui/css/librarybrowser.css b/dashboard-ui/css/librarybrowser.css index f1264ad723..93d318aea0 100644 --- a/dashboard-ui/css/librarybrowser.css +++ b/dashboard-ui/css/librarybrowser.css @@ -30,8 +30,7 @@ background-color: transparent !important; } -.backdropContainer .pageBackground { - background-color: rgba(20, 20,20, .92); +.backdropContainer { position: fixed; top: 0; left: 0; @@ -40,15 +39,23 @@ z-index: -1; } -.pageWithAbsoluteTabs neon-animatable { - z-index: 2; +.pageBackground { + display: none; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: -1; } -.backdropContainer { - background-repeat: no-repeat; - background-position: center center; - background-size: cover; - background-attachment: fixed; +.withBackdrop .pageBackground { + background-color: rgba(20, 20,20, .92); + display: block; +} + +.pageWithAbsoluteTabs neon-animatable { + z-index: 2; } .libraryPage .header { @@ -389,7 +396,7 @@ span.itemCommunityRating:not(:empty) + .userDataIcons { margin-top: 0 !important; } -.backdropPage .noBackdrop { +.withBackdrop .noBackdrop { background-color: transparent; } diff --git a/dashboard-ui/itemdetails.html b/dashboard-ui/itemdetails.html index 9146e24485..3b98f4b0d5 100644 --- a/dashboard-ui/itemdetails.html +++ b/dashboard-ui/itemdetails.html @@ -4,7 +4,7 @@ -
+