6c53b601f8
If the page was long enough to have a vertical scrollbar, the check for `$( window ).width()` would be incorrect because of the width of the scrollbar itself. The correct value is `$( window ).outerWidth()`. But rather than deal with that, we can instead use the API specifically for matching media queries [1], then copy-paste the media query from CSS and not have to think about it at all! [1] https://developer.mozilla.org/en-US/docs/Web/API/Window/matchMedia Bug: T227916 Change-Id: I79478040620391f5391b10aee52134fde0b88adf
90 lines
2.8 KiB
JavaScript
90 lines
2.8 KiB
JavaScript
/* eslint-disable no-jquery/no-global-selector */
|
|
$( function () {
|
|
var mobileMediaQuery = window.matchMedia( 'screen and (max-width: 550px)' ),
|
|
// Track if DOM has been set up for mobile fanciness yet
|
|
monobookMobileElements = false,
|
|
// Toggles and targets for popouts
|
|
toggles = {
|
|
'#sidebar-toggle': '#sidebar-mobilejs',
|
|
'#p-personal-toggle': '#p-personal',
|
|
'#ca-more a': '#p-cactions',
|
|
'#ca-languages a': '#p-lang',
|
|
'#ca-tools a': '#p-tb'
|
|
};
|
|
|
|
// Close menus
|
|
function closeMenus() {
|
|
$( '.mobile-menu-active' ).removeClass( 'mobile-menu-active' );
|
|
$( '.menus-cover' ).removeClass( 'visible' );
|
|
}
|
|
|
|
// Set up DOM for mobile fanciness
|
|
// We don't automatically do this because MonoBook; most users will be on desktop
|
|
function setupMonoBookMobile() {
|
|
if ( !monobookMobileElements && mobileMediaQuery.matches ) {
|
|
// Duplicate nav
|
|
$( '#column-one' ).append(
|
|
$( '#sidebar' ).clone().find( '*' ).addBack().each( function () {
|
|
if ( this.id ) {
|
|
this.id = this.id + '-mobilejs';
|
|
}
|
|
} ).end().end()
|
|
);
|
|
// Thing to fade out the content while menus are active
|
|
$( '#column-one' ).append( $( '<div>' ).attr( 'id', 'menus-cover-background' ).addClass( 'menus-cover' ) );
|
|
$( '#column-one' ).append( $( '<div>' ).attr( 'id', 'menus-cover' ).addClass( 'menus-cover' ) );
|
|
|
|
// Add extra cactions tabs - edit, editsource, contributions
|
|
// Wrap in function to keep jenkins from whining
|
|
$( function () {
|
|
var newTabs = [
|
|
'ca-edit',
|
|
// 'ca-ve-edit', // TODO when VE is more usable to begin with here
|
|
// 'ca-watch', 'ca-unwatch', // Maybe?
|
|
't-contributions'
|
|
];
|
|
newTabs.forEach( function ( item ) {
|
|
var a = $( '#' + item + ' a' );
|
|
// TODO check if we're on the page and add class=selected
|
|
|
|
if ( a.length ) {
|
|
mw.util.addPortletLink(
|
|
'p-cactions-mobile',
|
|
a.attr( 'href' ),
|
|
a.text(),
|
|
a.parent().attr( 'id' ) + '-mobile',
|
|
a.attr( 'tooltip' ),
|
|
a.attr( 'accesskey' ),
|
|
'#ca-more'
|
|
);
|
|
}
|
|
} );
|
|
} );
|
|
|
|
// eslint-disable-next-line no-jquery/no-each-util
|
|
$.each( toggles, function ( toggle, target ) {
|
|
// Add close buttons
|
|
$( target ).append( $( '<div>' ).addClass( 'mobile-close-button' ) );
|
|
|
|
// Open menus
|
|
$( toggle ).on( 'click', function () {
|
|
if ( mobileMediaQuery.matches ) {
|
|
$( target ).addClass( 'mobile-menu-active' );
|
|
$( '.menus-cover' ).addClass( 'visible' );
|
|
}
|
|
// Don't still link to # targets
|
|
return false;
|
|
} );
|
|
} );
|
|
|
|
$( '.mobile-close-button, .menus-cover' ).on( 'click', closeMenus );
|
|
// TODO: tap events on same (if not already included in 'click') - also close
|
|
// TODO: appropriate swipe event(s) - also close
|
|
|
|
monobookMobileElements = true;
|
|
}
|
|
}
|
|
|
|
$( window ).on( 'resize', setupMonoBookMobile );
|
|
setupMonoBookMobile();
|
|
} );
|