1
0
Fork 0
mirror of https://github.com/jellyfin/jellyfin-web synced 2025-03-30 19:56:21 +00:00

Merge pull request #1774 from MrTimscampi/another-es6

Migrate navdrawer and scroller to ES6
This commit is contained in:
dkanada 2020-08-07 14:15:45 +09:00 committed by GitHub
commit 016ac959ed
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 1162 additions and 1198 deletions

View file

@ -2,4 +2,3 @@ node_modules
dist dist
.idea .idea
.vscode .vscode
src/libraries

View file

@ -275,6 +275,8 @@
"src/elements/emby-tabs/emby-tabs.js", "src/elements/emby-tabs/emby-tabs.js",
"src/elements/emby-textarea/emby-textarea.js", "src/elements/emby-textarea/emby-textarea.js",
"src/elements/emby-toggle/emby-toggle.js", "src/elements/emby-toggle/emby-toggle.js",
"src/libraries/navdrawer/navdrawer.js",
"src/libraries/scroller.js",
"src/plugins/backdropScreensaver/plugin.js", "src/plugins/backdropScreensaver/plugin.js",
"src/plugins/bookPlayer/plugin.js", "src/plugins/bookPlayer/plugin.js",
"src/plugins/bookPlayer/tableOfContents.js", "src/plugins/bookPlayer/tableOfContents.js",

View file

@ -1,4 +1,4 @@
define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'scroller', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, scroller, playbackManager, AlphaPicker) { define(['globalize', 'listView', 'layoutManager', 'userSettings', 'focusManager', 'cardBuilder', 'loading', 'connectionManager', 'alphaNumericShortcuts', 'playbackManager', 'alphaPicker', 'emby-itemscontainer', 'emby-scroller'], function (globalize, listView, layoutManager, userSettings, focusManager, cardBuilder, loading, connectionManager, AlphaNumericShortcuts, playbackManager, AlphaPicker) {
'use strict'; 'use strict';
playbackManager = playbackManager.default || playbackManager; playbackManager = playbackManager.default || playbackManager;

View file

@ -1,15 +1,19 @@
define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser, dom) { /* Cleaning this file properly is not neecessary, since it's an outdated library
"use strict"; * and will be replaced soon by a Vue component.
*/
browser = browser.default || browser; import browser from 'browser';
import dom from 'dom';
import 'css!./navdrawer';
import 'scrollStyles';
return function (options) { export default function (options) {
function getTouches(e) { function getTouches(e) {
return e.changedTouches || e.targetTouches || e.touches; return e.changedTouches || e.targetTouches || e.touches;
} }
function onMenuTouchStart(e) { function onMenuTouchStart(e) {
options.target.classList.remove("transition"); options.target.classList.remove('transition');
var touches = getTouches(e); var touches = getTouches(e);
var touch = touches[0] || {}; var touch = touches[0] || {};
menuTouchStartX = touch.clientX; menuTouchStartX = touch.clientX;
@ -32,27 +36,27 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var deltaY = endY - (menuTouchStartY || 0); var deltaY = endY - (menuTouchStartY || 0);
setVelocity(deltaX); setVelocity(deltaX);
if (isOpen && 1 !== dragMode && deltaX > 0) { if (isOpen && dragMode !== 1 && deltaX > 0) {
dragMode = 2; dragMode = 2;
} }
if (0 === dragMode && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5) { if (dragMode === 0 && (!isOpen || Math.abs(deltaX) >= 10) && Math.abs(deltaY) < 5) {
dragMode = 1; dragMode = 1;
scrollContainer.addEventListener("scroll", disableEvent); scrollContainer.addEventListener('scroll', disableEvent);
self.showMask(); self.showMask();
} else if (0 === dragMode && Math.abs(deltaY) >= 5) { } else if (dragMode === 0 && Math.abs(deltaY) >= 5) {
dragMode = 2; dragMode = 2;
} }
if (1 === dragMode) { if (dragMode === 1) {
newPos = currentPos + deltaX; newPos = currentPos + deltaX;
self.changeMenuPos(); self.changeMenuPos();
} }
} }
function onMenuTouchEnd(e) { function onMenuTouchEnd(e) {
options.target.classList.add("transition"); options.target.classList.add('transition');
scrollContainer.removeEventListener("scroll", disableEvent); scrollContainer.removeEventListener('scroll', disableEvent);
dragMode = 0; dragMode = 0;
var touches = getTouches(e); var touches = getTouches(e);
var touch = touches[0] || {}; var touch = touches[0] || {};
@ -71,9 +75,9 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) { if (((getTouches(e)[0] || {}).clientX || 0) <= options.handleSize) {
isPeeking = true; isPeeking = true;
if (e.type === "touchstart") { if (e.type === 'touchstart') {
dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); dom.removeEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {});
dom.addEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); dom.addEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {});
} }
onMenuTouchStart(e); onMenuTouchStart(e);
@ -90,7 +94,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
function onEdgeTouchEnd(e) { function onEdgeTouchEnd(e) {
if (isPeeking) { if (isPeeking) {
isPeeking = false; isPeeking = false;
dom.removeEventListener(edgeContainer, "touchmove", onEdgeTouchMove, {}); dom.removeEventListener(edgeContainer, 'touchmove', onEdgeTouchMove, {});
onMenuTouchEnd(e); onMenuTouchEnd(e);
} }
} }
@ -144,8 +148,8 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
function onMaskTransitionEnd() { function onMaskTransitionEnd() {
var classList = mask.classList; var classList = mask.classList;
if (!classList.contains("backdrop")) { if (!classList.contains('backdrop')) {
classList.add("hide"); classList.add('hide');
} }
} }
@ -157,10 +161,10 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var startPoint = 0; var startPoint = 0;
var countStart = 0; var countStart = 0;
var velocity = 0; var velocity = 0;
options.target.classList.add("transition"); options.target.classList.add('transition');
var dragMode = 0; var dragMode = 0;
var scrollContainer = options.target.querySelector(".mainDrawer-scrollContainer"); var scrollContainer = options.target.querySelector('.mainDrawer-scrollContainer');
scrollContainer.classList.add("scrollY"); scrollContainer.classList.add('scrollY');
var TouchMenuLA = function () { var TouchMenuLA = function () {
self = this; self = this;
@ -175,13 +179,13 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
}; };
TouchMenuLA.prototype.initElements = function () { TouchMenuLA.prototype.initElements = function () {
options.target.classList.add("touch-menu-la"); options.target.classList.add('touch-menu-la');
options.target.style.width = options.width + "px"; options.target.style.width = options.width + 'px';
options.target.style.left = -options.width + "px"; options.target.style.left = -options.width + 'px';
if (!options.disableMask) { if (!options.disableMask) {
mask = document.createElement("div"); mask = document.createElement('div');
mask.className = "tmla-mask hide"; mask.className = 'tmla-mask hide';
document.body.appendChild(mask); document.body.appendChild(mask);
dom.addEventListener(mask, dom.whichTransitionEvent(), onMaskTransitionEnd, { dom.addEventListener(mask, dom.whichTransitionEvent(), onMaskTransitionEnd, {
passive: true passive: true
@ -192,12 +196,12 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var menuTouchStartX; var menuTouchStartX;
var menuTouchStartY; var menuTouchStartY;
var menuTouchStartTime; var menuTouchStartTime;
var edgeContainer = document.querySelector(".mainDrawerHandle"); var edgeContainer = document.querySelector('.mainDrawerHandle');
var isPeeking = false; var isPeeking = false;
TouchMenuLA.prototype.animateToPosition = function (pos) { TouchMenuLA.prototype.animateToPosition = function (pos) {
requestAnimationFrame(function () { requestAnimationFrame(function () {
options.target.style.transform = pos ? "translateX(" + pos + "px)" : "none"; options.target.style.transform = pos ? 'translateX(' + pos + 'px)' : 'none';
}); });
}; };
@ -208,7 +212,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
}; };
TouchMenuLA.prototype.clickMaskClose = function () { TouchMenuLA.prototype.clickMaskClose = function () {
mask.addEventListener("click", function () { mask.addEventListener('click', function () {
self.close(); self.close();
}); });
}; };
@ -235,7 +239,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
this.animateToPosition(options.width); this.animateToPosition(options.width);
currentPos = options.width; currentPos = options.width;
this.isVisible = true; this.isVisible = true;
options.target.classList.add("drawer-open"); options.target.classList.add('drawer-open');
self.showMask(); self.showMask();
self.invoke(options.onChange); self.invoke(options.onChange);
}; };
@ -244,7 +248,7 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
this.animateToPosition(0); this.animateToPosition(0);
currentPos = 0; currentPos = 0;
self.isVisible = false; self.isVisible = false;
options.target.classList.remove("drawer-open"); options.target.classList.remove('drawer-open');
self.hideMask(); self.hideMask();
self.invoke(options.onChange); self.invoke(options.onChange);
}; };
@ -261,13 +265,13 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
var backgroundTouchStartTime; var backgroundTouchStartTime;
TouchMenuLA.prototype.showMask = function () { TouchMenuLA.prototype.showMask = function () {
mask.classList.remove("hide"); mask.classList.remove('hide');
mask.classList.add("backdrop"); mask.classList.add('backdrop');
}; };
TouchMenuLA.prototype.hideMask = function () { TouchMenuLA.prototype.hideMask = function () {
mask.classList.add("hide"); mask.classList.add('hide');
mask.classList.remove("backdrop"); mask.classList.remove('backdrop');
}; };
TouchMenuLA.prototype.invoke = function (fn) { TouchMenuLA.prototype.invoke = function (fn) {
@ -284,26 +288,26 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
if (enabled) { if (enabled) {
if (!_edgeSwipeEnabled) { if (!_edgeSwipeEnabled) {
_edgeSwipeEnabled = true; _edgeSwipeEnabled = true;
dom.addEventListener(edgeContainer, "touchstart", onEdgeTouchStart, { dom.addEventListener(edgeContainer, 'touchstart', onEdgeTouchStart, {
passive: true passive: true
}); });
dom.addEventListener(edgeContainer, "touchend", onEdgeTouchEnd, { dom.addEventListener(edgeContainer, 'touchend', onEdgeTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(edgeContainer, "touchcancel", onEdgeTouchEnd, { dom.addEventListener(edgeContainer, 'touchcancel', onEdgeTouchEnd, {
passive: true passive: true
}); });
} }
} else { } else {
if (_edgeSwipeEnabled) { if (_edgeSwipeEnabled) {
_edgeSwipeEnabled = false; _edgeSwipeEnabled = false;
dom.removeEventListener(edgeContainer, "touchstart", onEdgeTouchStart, { dom.removeEventListener(edgeContainer, 'touchstart', onEdgeTouchStart, {
passive: true passive: true
}); });
dom.removeEventListener(edgeContainer, "touchend", onEdgeTouchEnd, { dom.removeEventListener(edgeContainer, 'touchend', onEdgeTouchEnd, {
passive: true passive: true
}); });
dom.removeEventListener(edgeContainer, "touchcancel", onEdgeTouchEnd, { dom.removeEventListener(edgeContainer, 'touchcancel', onEdgeTouchEnd, {
passive: true passive: true
}); });
} }
@ -322,26 +326,26 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
self.initElements(); self.initElements();
if (browser.touch) { if (browser.touch) {
dom.addEventListener(options.target, "touchstart", onMenuTouchStart, { dom.addEventListener(options.target, 'touchstart', onMenuTouchStart, {
passive: true passive: true
}); });
dom.addEventListener(options.target, "touchmove", onMenuTouchMove, { dom.addEventListener(options.target, 'touchmove', onMenuTouchMove, {
passive: true passive: true
}); });
dom.addEventListener(options.target, "touchend", onMenuTouchEnd, { dom.addEventListener(options.target, 'touchend', onMenuTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(options.target, "touchcancel", onMenuTouchEnd, { dom.addEventListener(options.target, 'touchcancel', onMenuTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(mask, "touchstart", onBackgroundTouchStart, { dom.addEventListener(mask, 'touchstart', onBackgroundTouchStart, {
passive: true passive: true
}); });
dom.addEventListener(mask, "touchmove", onBackgroundTouchMove, {}); dom.addEventListener(mask, 'touchmove', onBackgroundTouchMove, {});
dom.addEventListener(mask, "touchend", onBackgroundTouchEnd, { dom.addEventListener(mask, 'touchend', onBackgroundTouchEnd, {
passive: true passive: true
}); });
dom.addEventListener(mask, "touchcancel", onBackgroundTouchEnd, { dom.addEventListener(mask, 'touchcancel', onBackgroundTouchEnd, {
passive: true passive: true
}); });
} }
@ -350,5 +354,4 @@ define(["browser", "dom", "css!./navdrawer", "scrollStyles"], function (browser,
}; };
return new TouchMenuLA(); return new TouchMenuLA();
}; }
});

View file

@ -1,17 +1,22 @@
define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'scrollStyles'], function (browser, layoutManager, dom, focusManager, ResizeObserver) { /* Cleaning this file properly is not neecessary, since it's an outdated library
'use strict'; * and will be replaced soon by a Vue component.
*/
browser = browser.default || browser; import browser from 'browser';
focusManager = focusManager.default || focusManager; import layoutManager from 'layoutManager';
import dom from 'dom';
import focusManager from 'focusManager';
import ResizeObserver from 'ResizeObserver';
import 'scrollStyles';
/** /**
* Return type of the value. * Return type of the value.
* *
* @param {Mixed} value * @param {Mixed} value
* *
* @return {String} * @return {String}
*/ */
function type(value) { function type(value) {
if (value == null) { if (value == null) {
return String(value); return String(value);
} }
@ -21,23 +26,23 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
return typeof value; return typeof value;
} }
/** /**
* Disables an event it was triggered on and unbinds itself. * Disables an event it was triggered on and unbinds itself.
* *
* @param {Event} event * @param {Event} event
* *
* @return {Void} * @return {Void}
*/ */
function disableOneEvent(event) { function disableOneEvent(event) {
/*jshint validthis:true */ /*jshint validthis:true */
event.preventDefault(); event.preventDefault();
event.stopPropagation(); event.stopPropagation();
this.removeEventListener(event.type, disableOneEvent); this.removeEventListener(event.type, disableOneEvent);
} }
/** /**
* Make sure that number is within the limits. * Make sure that number is within the limits.
* *
* @param {Number} number * @param {Number} number
@ -46,28 +51,17 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Number} * @return {Number}
*/ */
function within(number, min, max) { function within(number, min, max) {
return number < min ? min : number > max ? max : number; return number < min ? min : number > max ? max : number;
} }
// Other global values // Other global values
var dragMouseEvents = ['mousemove', 'mouseup']; var dragMouseEvents = ['mousemove', 'mouseup'];
var dragTouchEvents = ['touchmove', 'touchend']; var dragTouchEvents = ['touchmove', 'touchend'];
var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel'); var wheelEvent = (document.implementation.hasFeature('Event.wheel', '3.0') ? 'wheel' : 'mousewheel');
var interactiveElements = ['INPUT', 'SELECT', 'TEXTAREA']; var interactiveElements = ['INPUT', 'SELECT', 'TEXTAREA'];
var tmpArray = [];
var time;
// Math shorthands
var abs = Math.abs;
var sqrt = Math.sqrt;
var pow = Math.pow;
var round = Math.round;
var max = Math.max;
var min = Math.min;
var scrollerFactory = function (frame, options) {
var scrollerFactory = function (frame, options) {
// Extend options // Extend options
var o = Object.assign({}, { var o = Object.assign({}, {
slidee: null, // Selector, DOM element, or jQuery object with DOM element representing SLIDEE. slidee: null, // Selector, DOM element, or jQuery object with DOM element representing SLIDEE.
@ -100,11 +94,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
// native smooth scroll // native smooth scroll
options.enableNativeScroll = true; options.enableNativeScroll = true;
} else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) { } else if (options.requireAnimation && (browser.animate || browser.supportsCssAnimation())) {
// transform is the only way to guarantee animation // transform is the only way to guarantee animation
options.enableNativeScroll = false; options.enableNativeScroll = false;
} else if (!layoutManager.tv || !browser.animate) { } else if (!layoutManager.tv || !browser.animate) {
options.enableNativeScroll = true; options.enableNativeScroll = true;
} }
@ -165,9 +157,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
var frameSize = 0; var frameSize = 0;
var slideeSize = 0; var slideeSize = 0;
function ensureSizeInfo() { function ensureSizeInfo() {
if (requiresReflow) { if (requiresReflow) {
requiresReflow = false; requiresReflow = false;
// Reset global variables // Reset global variables
@ -176,7 +166,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
slideeSize = o.scrollWidth || Math.max(slideeElement[o.horizontal ? 'offsetWidth' : 'offsetHeight'], slideeElement[o.horizontal ? 'scrollWidth' : 'scrollHeight']); slideeSize = o.scrollWidth || Math.max(slideeElement[o.horizontal ? 'offsetWidth' : 'offsetHeight'], slideeElement[o.horizontal ? 'scrollWidth' : 'scrollHeight']);
// Set position limits & relativess // Set position limits & relativess
self._pos.end = max(slideeSize - frameSize, 0); self._pos.end = Math.max(slideeSize - frameSize, 0);
} }
} }
@ -189,11 +179,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
function load(isInit) { function load(isInit) {
requiresReflow = true; requiresReflow = true;
if (!isInit) { if (!isInit) {
ensureSizeInfo(); ensureSizeInfo();
// Fix possible overflowing // Fix possible overflowing
@ -203,7 +191,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
function initFrameResizeObserver() { function initFrameResizeObserver() {
var observerOptions = {}; var observerOptions = {};
self.frameResizeObserver = new ResizeObserver(onResize, observerOptions); self.frameResizeObserver = new ResizeObserver(onResize, observerOptions);
@ -228,16 +215,13 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
function nativeScrollTo(container, pos, immediate) { function nativeScrollTo(container, pos, immediate) {
if (container.scroll) { if (container.scroll) {
if (o.horizontal) { if (o.horizontal) {
container.scroll({ container.scroll({
left: pos, left: pos,
behavior: immediate ? 'instant' : 'smooth' behavior: immediate ? 'instant' : 'smooth'
}); });
} else { } else {
container.scroll({ container.scroll({
top: pos, top: pos,
behavior: immediate ? 'instant' : 'smooth' behavior: immediate ? 'instant' : 'smooth'
@ -269,14 +253,12 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
self.slideTo = function (newPos, immediate, fullItemPos) { self.slideTo = function (newPos, immediate, fullItemPos) {
ensureSizeInfo(); ensureSizeInfo();
var pos = self._pos; var pos = self._pos;
newPos = within(newPos, pos.start, pos.end); newPos = within(newPos, pos.start, pos.end);
if (!transform) { if (!transform) {
nativeScrollTo(nativeScrollElement, newPos, immediate); nativeScrollTo(nativeScrollElement, newPos, immediate);
return; return;
} }
@ -294,7 +276,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
if (!immediate && o.skipSlideToWhenVisible && fullItemPos && fullItemPos.isVisible) { if (!immediate && o.skipSlideToWhenVisible && fullItemPos && fullItemPos.isVisible) {
return; return;
} }
@ -306,7 +287,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
function setStyleProperty(elem, name, value, speed, resetTransition) { function setStyleProperty(elem, name, value, speed, resetTransition) {
var style = elem.style; var style = elem.style;
if (resetTransition || browser.edge) { if (resetTransition || browser.edge) {
@ -328,7 +308,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
function renderAnimateWithTransform(fromPosition, toPosition, immediate) { function renderAnimateWithTransform(fromPosition, toPosition, immediate) {
var speed = o.speed; var speed = o.speed;
if (immediate) { if (immediate) {
@ -336,9 +315,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
if (o.horizontal) { if (o.horizontal) {
setStyleProperty(slideeElement, 'transform', 'translateX(' + (-round(toPosition)) + 'px)', speed); setStyleProperty(slideeElement, 'transform', 'translateX(' + (-Math.round(toPosition)) + 'px)', speed);
} else { } else {
setStyleProperty(slideeElement, 'transform', 'translateY(' + (-round(toPosition)) + 'px)', speed); setStyleProperty(slideeElement, 'transform', 'translateY(' + (-Math.round(toPosition)) + 'px)', speed);
} }
self._pos.cur = toPosition; self._pos.cur = toPosition;
@ -346,7 +325,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
function getBoundingClientRect(elem) { function getBoundingClientRect(elem) {
// Support: BlackBerry 5, iOS 3 (original iPhone) // Support: BlackBerry 5, iOS 3 (original iPhone)
// If we don't have gBCR, just use 0,0 rather than error // If we don't have gBCR, just use 0,0 rather than error
if (elem.getBoundingClientRect) { if (elem.getBoundingClientRect) {
@ -364,14 +342,10 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Object} * @return {Object}
*/ */
self.getPos = function (item) { self.getPos = function (item) {
var scrollElement = transform ? slideeElement : nativeScrollElement; var scrollElement = transform ? slideeElement : nativeScrollElement;
var slideeOffset = getBoundingClientRect(scrollElement); var slideeOffset = getBoundingClientRect(scrollElement);
var itemOffset = getBoundingClientRect(item); var itemOffset = getBoundingClientRect(item);
var slideeStartPos = o.horizontal ? slideeOffset.left : slideeOffset.top;
var slideeEndPos = o.horizontal ? slideeOffset.right : slideeOffset.bottom;
var offset = o.horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top; var offset = o.horizontal ? itemOffset.left - slideeOffset.left : itemOffset.top - slideeOffset.top;
var size = o.horizontal ? itemOffset.width : itemOffset.height; var size = o.horizontal ? itemOffset.width : itemOffset.height;
@ -408,7 +382,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
self.getCenterPosition = function (item) { self.getCenterPosition = function (item) {
ensureSizeInfo(); ensureSizeInfo();
var pos = self.getPos(item); var pos = self.getPos(item);
@ -453,7 +426,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
// Bind dragging events // Bind dragging events
if (transform) { if (transform) {
if (isTouch) { if (isTouch) {
dragTouchEvents.forEach(function (eventName) { dragTouchEvents.forEach(function (eventName) {
dom.addEventListener(document, eventName, dragHandler, { dom.addEventListener(document, eventName, dragHandler, {
@ -482,7 +454,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
var pointer = dragging.touch ? event[dragging.released ? 'changedTouches' : 'touches'][0] : event; var pointer = dragging.touch ? event[dragging.released ? 'changedTouches' : 'touches'][0] : event;
dragging.pathX = pointer.pageX - dragging.initX; dragging.pathX = pointer.pageX - dragging.initX;
dragging.pathY = pointer.pageY - dragging.initY; dragging.pathY = pointer.pageY - dragging.initY;
dragging.path = sqrt(pow(dragging.pathX, 2) + pow(dragging.pathY, 2)); dragging.path = Math.sqrt(Math.pow(dragging.pathX, 2) + Math.pow(dragging.pathY, 2));
dragging.delta = o.horizontal ? dragging.pathX : dragging.pathY; dragging.delta = o.horizontal ? dragging.pathX : dragging.pathY;
if (!dragging.released && dragging.path < 1) { if (!dragging.released && dragging.path < 1) {
@ -499,7 +471,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} else { } else {
// If dragging path is sufficiently long we can confidently start a drag // If dragging path is sufficiently long we can confidently start a drag
// if drag is in different direction than scroll, ignore it // if drag is in different direction than scroll, ignore it
if (o.horizontal ? abs(dragging.pathX) > abs(dragging.pathY) : abs(dragging.pathX) < abs(dragging.pathY)) { if (o.horizontal ? Math.abs(dragging.pathX) > Math.abs(dragging.pathY) : Math.abs(dragging.pathX) < Math.abs(dragging.pathY)) {
dragging.init = 1; dragging.init = 1;
} else { } else {
return dragEnd(); return dragEnd();
@ -520,7 +492,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
dragEnd(); dragEnd();
} }
self.slideTo(round(dragging.initPos - dragging.delta)); self.slideTo(Math.round(dragging.initPos - dragging.delta));
} }
/** /**
@ -557,9 +529,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Boolean} * @return {Boolean}
*/ */
function isInteractive(element) { function isInteractive(element) {
while (element) { while (element) {
if (interactiveElements.indexOf(element.tagName) !== -1) { if (interactiveElements.indexOf(element.tagName) !== -1) {
return true; return true;
} }
@ -595,7 +565,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
function scrollHandler(event) { function scrollHandler(event) {
ensureSizeInfo(); ensureSizeInfo();
var pos = self._pos; var pos = self._pos;
// Ignore if there is no scrolling to be done // Ignore if there is no scrolling to be done
@ -612,7 +581,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
self.slideBy(o.scrollBy * delta); self.slideBy(o.scrollBy * delta);
} else { } else {
if (isSmoothScrollSupported) { if (isSmoothScrollSupported) {
delta *= 12; delta *= 12;
} }
@ -631,7 +599,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* @return {Void} * @return {Void}
*/ */
self.destroy = function () { self.destroy = function () {
if (self.frameResizeObserver) { if (self.frameResizeObserver) {
self.frameResizeObserver.disconnect(); self.frameResizeObserver.disconnect();
self.frameResizeObserver = null; self.frameResizeObserver = null;
@ -667,11 +634,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
var contentRect = {}; var contentRect = {};
function onResize(entries) { function onResize(entries) {
var entry = entries[0]; var entry = entries[0];
if (entry) { if (entry) {
var newRect = entry.contentRect; var newRect = entry.contentRect;
// handle element being hidden // handle element being hidden
@ -680,7 +645,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
if (newRect.width !== contentRect.width || newRect.height !== contentRect.height) { if (newRect.width !== contentRect.width || newRect.height !== contentRect.height) {
contentRect = newRect; contentRect = newRect;
load(false); load(false);
@ -706,7 +670,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
} }
self.getScrollPosition = function () { self.getScrollPosition = function () {
if (transform) { if (transform) {
return self._pos.cur; return self._pos.cur;
} }
@ -719,7 +682,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
}; };
self.getScrollSize = function () { self.getScrollSize = function () {
if (transform) { if (transform) {
return slideeSize; return slideeSize;
} }
@ -795,7 +757,6 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
initFrameResizeObserver(); initFrameResizeObserver();
if (transform) { if (transform) {
dom.addEventListener(dragSourceElement, 'touchstart', dragInitSlidee, { dom.addEventListener(dragSourceElement, 'touchstart', dragInitSlidee, {
passive: true passive: true
}); });
@ -812,9 +773,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
passive: true passive: true
}); });
} }
} else if (o.horizontal) { } else if (o.horizontal) {
// Don't bind to mouse events with vertical scroll since the mouse wheel can handle this natively // Don't bind to mouse events with vertical scroll since the mouse wheel can handle this natively
if (o.mouseWheel) { if (o.mouseWheel) {
@ -839,9 +798,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
// Return instance // Return instance
return self; return self;
}; };
}; };
/** /**
* Slide SLIDEE by amount of pixels. * Slide SLIDEE by amount of pixels.
* *
* @param {Int} delta Pixels/Items. Positive means forward, negative means backward. * @param {Int} delta Pixels/Items. Positive means forward, negative means backward.
@ -849,14 +808,14 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.slideBy = function (delta, immediate) { scrollerFactory.prototype.slideBy = function (delta, immediate) {
if (!delta) { if (!delta) {
return; return;
} }
this.slideTo(this._pos.dest + delta, immediate); this.slideTo(this._pos.dest + delta, immediate);
}; };
/** /**
* Core method for handling `toLocation` methods. * Core method for handling `toLocation` methods.
* *
* @param {String} location * @param {String} location
@ -865,7 +824,7 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.to = function (location, item, immediate) { scrollerFactory.prototype.to = function (location, item, immediate) {
// Optional arguments logic // Optional arguments logic
if (type(item) === 'boolean') { if (type(item) === 'boolean') {
immediate = item; immediate = item;
@ -881,9 +840,9 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
this.slideTo(itemPos[location], immediate, itemPos); this.slideTo(itemPos[location], immediate, itemPos);
} }
} }
}; };
/** /**
* Animate element or the whole SLIDEE to the start of the frame. * Animate element or the whole SLIDEE to the start of the frame.
* *
* @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE.
@ -891,11 +850,11 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.toStart = function (item, immediate) { scrollerFactory.prototype.toStart = function (item, immediate) {
this.to('start', item, immediate); this.to('start', item, immediate);
}; };
/** /**
* Animate element or the whole SLIDEE to the end of the frame. * Animate element or the whole SLIDEE to the end of the frame.
* *
* @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE.
@ -903,11 +862,11 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.toEnd = function (item, immediate) { scrollerFactory.prototype.toEnd = function (item, immediate) {
this.to('end', item, immediate); this.to('end', item, immediate);
}; };
/** /**
* Animate element or the whole SLIDEE to the center of the frame. * Animate element or the whole SLIDEE to the center of the frame.
* *
* @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE. * @param {Mixed} item Item DOM element, or index starting at 0. Omitting will animate SLIDEE.
@ -915,14 +874,13 @@ define(['browser', 'layoutManager', 'dom', 'focusManager', 'ResizeObserver', 'sc
* *
* @return {Void} * @return {Void}
*/ */
scrollerFactory.prototype.toCenter = function (item, immediate) { scrollerFactory.prototype.toCenter = function (item, immediate) {
this.to('center', item, immediate); this.to('center', item, immediate);
}; };
scrollerFactory.create = function (frame, options) { scrollerFactory.create = function (frame, options) {
var instance = new scrollerFactory(frame, options); var instance = new scrollerFactory(frame, options);
return Promise.resolve(instance); return Promise.resolve(instance);
}; };
return scrollerFactory; export default scrollerFactory;
});

View file

@ -806,6 +806,8 @@ define(['dom', 'layoutManager', 'inputManager', 'connectionManager', 'events', '
navDrawerScrollContainer.addEventListener('click', onMainDrawerClick); navDrawerScrollContainer.addEventListener('click', onMainDrawerClick);
return new Promise(function (resolve, reject) { return new Promise(function (resolve, reject) {
require(['navdrawer'], function (navdrawer) { require(['navdrawer'], function (navdrawer) {
navdrawer = navdrawer.default || navdrawer;
navDrawerInstance = new navdrawer(getNavDrawerOptions()); navDrawerInstance = new navdrawer(getNavDrawerOptions());
if (!layoutManager.tv) { if (!layoutManager.tv) {