Share Gaia assets and adapters, keep private profiles and development documents local, and update both public READMEs.
106 lines
2.9 KiB
JavaScript
Executable file
106 lines
2.9 KiB
JavaScript
Executable file
/**
|
|
* PageTransitions provides transition functions used when navigating panels.
|
|
*
|
|
* @module PageTransitions
|
|
*/
|
|
define(function() {
|
|
'use strict';
|
|
|
|
var _sendPanelReady = function _send_panel_ready(oldPanelHash, newPanelHash) {
|
|
var detail = {
|
|
previous: oldPanelHash,
|
|
current: newPanelHash
|
|
};
|
|
var event = new CustomEvent('panelready', {detail: detail});
|
|
window.dispatchEvent(event);
|
|
};
|
|
|
|
return {
|
|
/**
|
|
* Typically used with phone size device layouts.
|
|
*
|
|
* @alias module:PageTransitions#oneColumn
|
|
* @param {String} oldPanel
|
|
* @param {String} newPanel
|
|
* @param {Function} callback
|
|
*/
|
|
oneColumn: function pt_one_column(oldPanel, newPanel, callback) {
|
|
if (oldPanel === newPanel) {
|
|
callback();
|
|
return;
|
|
}
|
|
|
|
// switch previous/current classes
|
|
if (oldPanel) {
|
|
oldPanel.className = newPanel.className ? '' : 'previous';
|
|
}
|
|
if (newPanel.className === 'current') {
|
|
_sendPanelReady(oldPanel && '#' + oldPanel.id, '#' + newPanel.id);
|
|
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
return;
|
|
}
|
|
|
|
newPanel.className = 'current';
|
|
|
|
/**
|
|
* Most browsers now scroll content into view taking CSS transforms into
|
|
* account. That's not what we want when moving between <section>s,
|
|
* because the being-moved-to section is offscreen when we navigate to its
|
|
* #hash. The transitions assume the viewport is always at document 0,0.
|
|
* So add a hack here to make that assumption true again.
|
|
* https://bugzilla.mozilla.org/show_bug.cgi?id=803170
|
|
*/
|
|
if ((window.scrollX !== 0) || (window.scrollY !== 0)) {
|
|
window.scrollTo(0, 0);
|
|
}
|
|
|
|
newPanel.addEventListener('transitionend', function paintWait() {
|
|
newPanel.removeEventListener('transitionend', paintWait);
|
|
if (oldPanel) {
|
|
_sendPanelReady('#' + oldPanel.id, '#' + newPanel.id);
|
|
|
|
if (oldPanel.className === 'current') {
|
|
return;
|
|
}
|
|
} else {
|
|
_sendPanelReady(null, '#' + newPanel.id);
|
|
}
|
|
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
});
|
|
},
|
|
|
|
/**
|
|
* Typically used with tablet size device layouts.
|
|
*
|
|
* @alias module:PageTransitions#twoColumn
|
|
* @param {String} oldPanel
|
|
* @param {String} newPanel
|
|
* @param {Function} callback
|
|
*/
|
|
twoColumn: function pt_two_column(oldPanel, newPanel, callback) {
|
|
if (oldPanel === newPanel) {
|
|
callback();
|
|
return;
|
|
}
|
|
|
|
if (oldPanel) {
|
|
oldPanel.className = newPanel.className ? '' : 'previous';
|
|
newPanel.className = 'current';
|
|
_sendPanelReady('#' + oldPanel.id, '#' + newPanel.id);
|
|
} else {
|
|
newPanel.className = 'current';
|
|
_sendPanelReady(null, '#' + newPanel.id);
|
|
}
|
|
|
|
if (callback) {
|
|
callback();
|
|
}
|
|
}
|
|
};
|
|
});
|