# HG changeset patch # User Ludovic Chabant # Date 1541132723 25200 # Node ID 1ec071454790f2f7e10758a7f168da0e9c7f00ba # Parent bba13de7a7d16a96d20ff1bc1a88e18067ce23e4 web: UX improvements for the sidebar menu. - Open/close the menu on click instead of mouse hover, so it's more friendly to mobile/touch devices. - Rework how the menu lock works. diff -r bba13de7a7d1 -r 1ec071454790 wikked/assets/css/wikked/nav.less --- a/wikked/assets/css/wikked/nav.less Tue Oct 16 22:08:51 2018 -0700 +++ b/wikked/assets/css/wikked/nav.less Thu Nov 01 21:25:23 2018 -0700 @@ -7,14 +7,9 @@ .wrapper { transition: padding 200ms ease-in-out 0s; + padding-top: 3.6em; padding-left: 0; } -.wrapper.wiki-menu-active { - padding-left: @wiki-menu-width !important; -} -.wrapper.wiki-menu-inactive { - padding-left: 0 !important; -} .wiki-menu-a { color: @color-gray-light; @@ -35,24 +30,21 @@ } } -#wiki-menu-pin { +#wiki-menu-header { height: @wiki-shortcut-height; padding: 0 1.5em 0 @wiki-shortcut-width; text-align: right; color: @color-gray-medium; cursor: pointer; - &:hover { + i { + line-height: @wiki-shortcut-height; + display: none; + } + i:hover { color: @color-gray-light; text-shadow: #EEE 0 0 1em; } - - span, i { - line-height: @wiki-shortcut-height; - } -} -#wiki-menu-pin.wiki-menu-pin-active { - color: @color-gray-light; } #wiki-menu { @@ -90,17 +82,6 @@ } } -#wiki-menu.wiki-menu-active { - left: 0 !important; -} -#wiki-menu.wiki-menu-inactive { - left: -@wiki-menu-width !important; -} -#wiki-menu.wiki-menu-ext { - width: @wiki-menu-width-ext !important; - box-shadow: 4px 0px 10px rgba(0, 0, 0, 0.3); -} - #wiki-menu-shortcut { position: fixed !important; top: 0; @@ -115,15 +96,42 @@ cursor: pointer; } -@media (min-width: 48em) { - // Hide the shortcut and move the horizontal menu down. +#app.wiki-menu-active { #wiki-menu { - //left: 0; + left: 0 !important; } - .wrapper { - //padding-left: @wiki-menu-width; +} +#app.wiki-menu-inactive { + #wiki-menu { + left: -@wiki-menu-width !important; } } +#app.wiki-menu-locked.wiki-menu-active .wrapper { + padding-left: @wiki-menu-width !important; +} +#app.wiki-menu-locked.wiki-menu-inactive .wrapper { + padding-left: 0 !important; +} + +#wiki-menu.wiki-menu-ext { + width: @wiki-menu-width-ext !important; + box-shadow: 4px 0px 10px rgba(0, 0, 0, 0.3); +} + +@media screen and (min-width: 48em) { + // Menu can be locked only on big enough screens. + #wiki-menu-header i { + display: block; + } +} +// If somehow we end up with a small screen where the lock icon is hidden, +// but we still have the menu locked, then show the lock icon anyway. +@media screen and (max-width: 48em) { + #app.wiki-menu-locked #wiki-menu-header i { + display: block; + } +} + // Search .search-result-hover { diff -r bba13de7a7d1 -r 1ec071454790 wikked/assets/js/wikked/app.js --- a/wikked/assets/js/wikked/app.js Tue Oct 16 22:08:51 2018 -0700 +++ b/wikked/assets/js/wikked/app.js Thu Nov 01 21:25:23 2018 -0700 @@ -15,18 +15,19 @@ // Cache some stuff for handling the menu. this.wikiBody = $('body'); + this.wikiApp = $('#app'); this.wikiMenu = $('#wiki-menu'); - this.wikiMenuAndWrapper = $.merge(this.wikiMenu, $('#app .wrapper')); + this.wikiMenuLock = $('#wiki-menu-lock'); this.isMenuActive = (this.wikiMenu.css('left') == '0px'); - this.isMenuActiveLocked = false; + this.isMenuLocked = (this.wikiApp.hasClass('wiki-menu-locked')); // Hookup events. this.listen("#wiki-menu-shortcut", 'click', '_onMenuShortcutClick'); - this.listen("#wiki-menu-pin", 'click', '_onMenuShortcutClick'); - this.listen("#wiki-menu-shortcut", 'mouseenter', '_onMenuShortcutHover'); - this.listen("#wiki-menu-shortcut", 'mouseleave', '_onMenuShortcutLeave'); - this.listen("#wiki-menu", 'mouseenter', '_onMenuHover'); - this.listen("#wiki-menu", 'mouseleave', '_onMenuLeave'); + this.listen("#wiki-menu-lock", 'click', '_onMenuLockClick'); + this.listen("#wiki-menu-lock", 'mouseenter', '_onMenuLockHoverLeave'); + this.listen("#wiki-menu-lock", 'mouseleave', '_onMenuLockHoverLeave'); + this.listen("#app .wrapper", 'click', '_onBackgroundClick'); + this.listen("#search-query", 'focus', '_searchQueryFocused'); this.listen("#search-query", 'input', '_previewSearch'); this.listen("#search-query", 'keyup', '_searchQueryChanged'); @@ -39,65 +40,50 @@ _t[callback](e); }); }, - _setNavHiddenCookie: function(val) { - document.cookie = ( - "wiki-hide-nav=" + val + "; " + - "path=/; expires=31 Dec 2100 UTC"); + + _toggleWikiMenu: function() { + this.isMenuActive = !this.isMenuActive; + if (this.isMenuActive) { + this.wikiApp.toggleClass('wiki-menu-inactive', false); + this.wikiApp.toggleClass('wiki-menu-active', true); + } else { + this.wikiApp.toggleClass('wiki-menu-active', false); + this.wikiApp.toggleClass('wiki-menu-inactive', true); + } }, _onMenuShortcutClick: function(e) { - this.isMenuActive = !this.isMenuActive; - var val = this.isMenuActive ? "0" : "1"; - this._setNavHiddenCookie(val); - this._toggleWikiMenuPin(this.isMenuActive); - }, - _onMenuShortcutHover: function(e) { - if (!this.isMenuActive && !this.isMenuActiveLocked) - this._toggleWikiMenu(true); + this._toggleWikiMenu(); }, - _onMenuShortcutLeave: function(e) { - if (!this.isMenuActive && !this.isMenuActiveLocked) - this._toggleWikiMenu(false); - }, - _onMenuHover: function(e) { - if (!this.isMenuActive && !this.isMenuActiveLocked) - this._toggleWikiMenu(true); - }, - _onMenuLeave: function(e) { - if (!this.isMenuActive && !this.isMenuActiveLocked) - this._toggleWikiMenu(false); + + _lockUnlockWikiMenu: function() { + var val = this.isMenuLocked ? "0" : "1"; + document.cookie = ( + "wiki-nav-locked=" + val + "; " + + "path=/; expires=31 Dec 2100 UTC"); + this.wikiApp.toggleClass('wiki-menu-locked'); + this.isMenuLocked = !this.isMenuLocked; }, - _toggleWikiMenu: function(onOff) { - if (onOff) { - this.wikiMenuAndWrapper.toggleClass('wiki-menu-inactive', false); - this.wikiMenuAndWrapper.toggleClass('wiki-menu-active', true); - } else { - this.wikiMenuAndWrapper.toggleClass('wiki-menu-active', false); - this.wikiMenuAndWrapper.toggleClass('wiki-menu-inactive', true); - } + _onMenuLockClick: function(e) { + this._lockUnlockWikiMenu(); + }, + + _onMenuLockHoverLeave: function(e) { + this.wikiMenuLock.toggleClass('fa-lock'); + this.wikiMenuLock.toggleClass('fa-unlock'); }, - _toggleWikiMenuPin: function(onOff) { - $('#wiki-menu-pin').toggleClass('wiki-menu-pin-active', onOff); - var lockIcon = $('#wiki-menu-pin>i'); - if (onOff) - { - lockIcon.addClass('fa-lock'); - lockIcon.removeClass('fa-unlock'); - } - else - { - lockIcon.addClass('fa-unlock'); - lockIcon.removeClass('fa-lock'); - } + + _onBackgroundClick: function(e) { + if (!this.isMenuLocked && this.isMenuActive) + this._toggleWikiMenu(); }, + _searchQueryFocused: function(e) { - this.isMenuActiveLocked = true; this.wikiMenu.toggleClass('wiki-menu-ext', true); this.wikiBody.toggleClass('wiki-search-underlayer', true); }, _searchQueryBlurred: function(e) { this.wikiBody.toggleClass('wiki-search-underlayer', false); this.wikiMenu.toggleClass('wiki-menu-ext', false); - this.isMenuActiveLocked = false; if (this.searchPreviewList.is(':visible')) this.searchPreviewList.slideUp(200); if ($(document.activeElement).parents('#wiki-menu').length === 0) diff -r bba13de7a7d1 -r 1ec071454790 wikked/templates/index.html --- a/wikked/templates/index.html Tue Oct 16 22:08:51 2018 -0700 +++ b/wikked/templates/index.html Thu Nov 01 21:25:23 2018 -0700 @@ -9,11 +9,11 @@ {% block head %}{% endblock %} -
+