mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
First separation commit.
Added LICENSE, README.md, CONTRIBUTORS.md
This commit is contained in:
parent
09513af31b
commit
4678528d00
657 changed files with 422 additions and 0 deletions
144
src/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.css
vendored
Normal file
144
src/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.css
vendored
Normal file
|
@ -0,0 +1,144 @@
|
|||
.mainAnimatedPage {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
contain: layout style size
|
||||
}
|
||||
|
||||
@-webkit-keyframes view-fadeout {
|
||||
from {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 0
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes view-fadeout {
|
||||
from {
|
||||
opacity: 1
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 0
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes view-fadein {
|
||||
from {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes view-fadein {
|
||||
from {
|
||||
opacity: 0
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes view-slideleft {
|
||||
from {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes view-slideleft {
|
||||
from {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes view-slideleft-r {
|
||||
from {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes view-slideleft-r {
|
||||
from {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes view-slideright {
|
||||
from {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes view-slideright {
|
||||
from {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0)
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
}
|
||||
|
||||
@-webkit-keyframes view-slideright-r {
|
||||
from {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0)
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes view-slideright-r {
|
||||
from {
|
||||
-webkit-transform: none;
|
||||
transform: none
|
||||
}
|
||||
|
||||
to {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0)
|
||||
}
|
||||
}
|
148
src/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js
vendored
Normal file
148
src/bower_components/emby-webcomponents/viewmanager/viewcontainer-lite.js
vendored
Normal file
|
@ -0,0 +1,148 @@
|
|||
define(["browser", "dom", "layoutManager", "css!./viewcontainer-lite"], function(browser, dom, layoutManager) {
|
||||
"use strict";
|
||||
|
||||
function enableAnimation() {
|
||||
return !browser.tv && browser.supportsCssAnimation()
|
||||
}
|
||||
|
||||
function findLastView(parent, className) {
|
||||
for (var nodes = parent.childNodes, i = nodes.length - 1; i >= 0; i--) {
|
||||
var node = nodes[i],
|
||||
classList = node.classList;
|
||||
if (classList && classList.contains(className)) return node
|
||||
}
|
||||
}
|
||||
|
||||
function findViewBefore(elem, className) {
|
||||
for (var node = elem.previousSibling; node;) {
|
||||
var classList = node.classList;
|
||||
if (classList && classList.contains(className)) return node;
|
||||
node = node.previousSibling
|
||||
}
|
||||
}
|
||||
|
||||
function loadView(options) {
|
||||
if (!options.cancel) {
|
||||
cancelActiveAnimations();
|
||||
var selected = selectedPageIndex,
|
||||
previousAnimatable = -1 === selected ? null : allPages[selected],
|
||||
pageIndex = selected + 1;
|
||||
pageIndex >= pageContainerCount && (pageIndex = 0);
|
||||
var viewHtml = options.view,
|
||||
properties = [];
|
||||
options.fullscreen && properties.push("fullscreen");
|
||||
var view, currentPage = allPages[pageIndex];
|
||||
return currentPage ? (triggerDestroy(currentPage), currentPage.insertAdjacentHTML("beforebegin", viewHtml), view = findViewBefore(currentPage, "view"), mainAnimatedPages.removeChild(currentPage)) : (mainAnimatedPages.insertAdjacentHTML("beforeend", viewHtml), view = findLastView(mainAnimatedPages, "view")), view.classList.add("mainAnimatedPage"), properties.length && view.setAttribute("data-properties", properties.join(",")), options.type && view.setAttribute("data-type", options.type), allPages[pageIndex] = view, onBeforeChange && onBeforeChange(view, !1, options), beforeAnimate(allPages, pageIndex, selected), animate(view, previousAnimatable, options.transition, options.isBack).then(function() {
|
||||
return selectedPageIndex = pageIndex, currentUrls[pageIndex] = options.url, !options.cancel && previousAnimatable && afterAnimate(allPages, pageIndex), view
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function beforeAnimate(allPages, newPageIndex, oldPageIndex) {
|
||||
for (var i = 0, length = allPages.length; i < length; i++) newPageIndex === i || oldPageIndex === i || allPages[i].classList.add("hide")
|
||||
}
|
||||
|
||||
function afterAnimate(allPages, newPageIndex) {
|
||||
for (var i = 0, length = allPages.length; i < length; i++) newPageIndex === i || allPages[i].classList.add("hide")
|
||||
}
|
||||
|
||||
function animate(newAnimatedPage, oldAnimatedPage, transition, isBack) {
|
||||
if (enableAnimation() && oldAnimatedPage) {
|
||||
if ("slide" === transition) return slide(newAnimatedPage, oldAnimatedPage, transition, isBack);
|
||||
if ("fade" === transition) return fade(newAnimatedPage, oldAnimatedPage, transition, isBack);
|
||||
clearAnimation(newAnimatedPage), oldAnimatedPage && clearAnimation(oldAnimatedPage)
|
||||
}
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
function clearAnimation(elem) {
|
||||
setAnimation(elem, "none")
|
||||
}
|
||||
|
||||
function slide(newAnimatedPage, oldAnimatedPage, transition, isBack) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var duration = layoutManager.tv ? 450 : 160,
|
||||
animations = [];
|
||||
oldAnimatedPage && (isBack ? setAnimation(oldAnimatedPage, "view-slideright-r " + duration + "ms ease-out normal both") : setAnimation(oldAnimatedPage, "view-slideleft-r " + duration + "ms ease-out normal both"), animations.push(oldAnimatedPage)), isBack ? setAnimation(newAnimatedPage, "view-slideright " + duration + "ms ease-out normal both") : setAnimation(newAnimatedPage, "view-slideleft " + duration + "ms ease-out normal both"), animations.push(newAnimatedPage), currentAnimations = animations;
|
||||
var onAnimationComplete = function() {
|
||||
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: !0
|
||||
}), resolve()
|
||||
};
|
||||
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: !0
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function fade(newAnimatedPage, oldAnimatedPage, transition, isBack) {
|
||||
return new Promise(function(resolve, reject) {
|
||||
var duration = layoutManager.tv ? 450 : 270,
|
||||
animations = [];
|
||||
newAnimatedPage.style.opacity = 0, setAnimation(newAnimatedPage, "view-fadein " + duration + "ms ease-in normal both"), animations.push(newAnimatedPage), oldAnimatedPage && (setAnimation(oldAnimatedPage, "view-fadeout " + duration + "ms ease-out normal both"), animations.push(oldAnimatedPage)), currentAnimations = animations;
|
||||
var onAnimationComplete = function() {
|
||||
dom.removeEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: !0
|
||||
}), resolve()
|
||||
};
|
||||
dom.addEventListener(newAnimatedPage, dom.whichAnimationEvent(), onAnimationComplete, {
|
||||
once: !0
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
function setAnimation(elem, value) {
|
||||
requestAnimationFrame(function() {
|
||||
elem.style.animation = value
|
||||
})
|
||||
}
|
||||
|
||||
function cancelActiveAnimations() {
|
||||
for (var animations = currentAnimations, i = 0, length = animations.length; i < length; i++) animations[i].style.animation = "none"
|
||||
}
|
||||
|
||||
function setOnBeforeChange(fn) {
|
||||
onBeforeChange = fn
|
||||
}
|
||||
|
||||
function tryRestoreView(options) {
|
||||
var url = options.url,
|
||||
index = currentUrls.indexOf(url);
|
||||
if (-1 !== index) {
|
||||
var animatable = allPages[index],
|
||||
view = animatable;
|
||||
if (view) {
|
||||
if (options.cancel) return;
|
||||
cancelActiveAnimations();
|
||||
var selected = selectedPageIndex,
|
||||
previousAnimatable = -1 === selected ? null : allPages[selected];
|
||||
return onBeforeChange && onBeforeChange(view, !0, options), beforeAnimate(allPages, index, selected), animatable.classList.remove("hide"), animate(animatable, previousAnimatable, options.transition, options.isBack).then(function() {
|
||||
return selectedPageIndex = index, !options.cancel && previousAnimatable && afterAnimate(allPages, index), view
|
||||
})
|
||||
}
|
||||
}
|
||||
return Promise.reject()
|
||||
}
|
||||
|
||||
function triggerDestroy(view) {
|
||||
view.dispatchEvent(new CustomEvent("viewdestroy", {
|
||||
cancelable: !1
|
||||
}))
|
||||
}
|
||||
|
||||
function reset() {
|
||||
allPages = [], currentUrls = [], mainAnimatedPages.innerHTML = "", selectedPageIndex = -1
|
||||
}
|
||||
var onBeforeChange, mainAnimatedPages = document.querySelector(".mainAnimatedPages"),
|
||||
allPages = [],
|
||||
currentUrls = [],
|
||||
pageContainerCount = 3,
|
||||
selectedPageIndex = -1,
|
||||
currentAnimations = [];
|
||||
return {
|
||||
loadView: loadView,
|
||||
tryRestoreView: tryRestoreView,
|
||||
reset: reset,
|
||||
setOnBeforeChange: setOnBeforeChange
|
||||
}
|
||||
});
|
82
src/bower_components/emby-webcomponents/viewmanager/viewmanager.js
vendored
Normal file
82
src/bower_components/emby-webcomponents/viewmanager/viewmanager.js
vendored
Normal file
|
@ -0,0 +1,82 @@
|
|||
define(["viewcontainer", "focusManager", "queryString", "layoutManager"], function(viewcontainer, focusManager, queryString, layoutManager) {
|
||||
"use strict";
|
||||
|
||||
function onViewChange(view, options, isRestore) {
|
||||
var lastView = currentView;
|
||||
lastView && dispatchViewEvent(lastView, null, "viewhide"), currentView = view;
|
||||
var eventDetail = getViewEventDetail(view, options, isRestore);
|
||||
isRestore ? layoutManager.mobile || (view.activeElement && document.body.contains(view.activeElement) && focusManager.isCurrentlyFocusable(view.activeElement) ? focusManager.focus(view.activeElement) : focusManager.autoFocus(view)) : !1 !== options.autoFocus && focusManager.autoFocus(view), view.dispatchEvent(new CustomEvent("viewshow", eventDetail)), dispatchPageEvents && view.dispatchEvent(new CustomEvent("pageshow", eventDetail))
|
||||
}
|
||||
|
||||
function getProperties(view) {
|
||||
var props = view.getAttribute("data-properties");
|
||||
return props ? props.split(",") : []
|
||||
}
|
||||
|
||||
function dispatchViewEvent(view, eventInfo, eventName, isCancellable) {
|
||||
eventInfo || (eventInfo = {
|
||||
detail: {
|
||||
type: view.getAttribute("data-type"),
|
||||
properties: getProperties(view)
|
||||
},
|
||||
bubbles: !0,
|
||||
cancelable: isCancellable
|
||||
}), eventInfo.cancelable = isCancellable || !1;
|
||||
var eventResult = view.dispatchEvent(new CustomEvent(eventName, eventInfo));
|
||||
return dispatchPageEvents && (eventInfo.cancelable = !1, view.dispatchEvent(new CustomEvent(eventName.replace("view", "page"), eventInfo))), eventResult
|
||||
}
|
||||
|
||||
function getViewEventDetail(view, options, isRestore) {
|
||||
var url = options.url,
|
||||
index = url.indexOf("?"),
|
||||
params = -1 === index ? {} : queryString.parse(url.substring(index + 1));
|
||||
return {
|
||||
detail: {
|
||||
type: view.getAttribute("data-type"),
|
||||
properties: getProperties(view),
|
||||
params: params,
|
||||
isRestored: isRestore,
|
||||
state: options.state,
|
||||
options: options.options || {}
|
||||
},
|
||||
bubbles: !0,
|
||||
cancelable: !1
|
||||
}
|
||||
}
|
||||
|
||||
function resetCachedViews() {
|
||||
viewcontainer.reset()
|
||||
}
|
||||
|
||||
function ViewManager() {}
|
||||
var currentView, dispatchPageEvents;
|
||||
return viewcontainer.setOnBeforeChange(function(newView, isRestored, options) {
|
||||
var lastView = currentView;
|
||||
if (lastView) {
|
||||
dispatchViewEvent(lastView, null, "viewbeforehide", !0)
|
||||
}
|
||||
var eventDetail = getViewEventDetail(newView, options, isRestored);
|
||||
if (!newView.initComplete) {
|
||||
if (newView.initComplete = !0, options.controllerFactory) {
|
||||
new options.controllerFactory(newView, eventDetail.detail.params)
|
||||
}
|
||||
options.controllerFactory && !dispatchPageEvents || dispatchViewEvent(newView, eventDetail, "viewinit")
|
||||
}
|
||||
dispatchViewEvent(newView, eventDetail, "viewbeforeshow")
|
||||
}), document.addEventListener("skinunload", resetCachedViews), ViewManager.prototype.loadView = function(options) {
|
||||
var lastView = currentView;
|
||||
lastView && (lastView.activeElement = document.activeElement), options.cancel || viewcontainer.loadView(options).then(function(view) {
|
||||
onViewChange(view, options)
|
||||
})
|
||||
}, ViewManager.prototype.tryRestoreView = function(options, onViewChanging) {
|
||||
return options.cancel ? Promise.reject({
|
||||
cancelled: !0
|
||||
}) : (currentView && (currentView.activeElement = document.activeElement), viewcontainer.tryRestoreView(options).then(function(view) {
|
||||
onViewChanging(), onViewChange(view, options, !0)
|
||||
}))
|
||||
}, ViewManager.prototype.currentView = function() {
|
||||
return currentView
|
||||
}, ViewManager.prototype.dispatchPageEvents = function(value) {
|
||||
dispatchPageEvents = value
|
||||
}, new ViewManager
|
||||
});
|
Loading…
Add table
Add a link
Reference in a new issue