button for expanding/collapsing top menu, fixes #8
- introduce `$top-menu-collapse` flag and `$top-menu-collapse-breakpoint` variable - add TopMenuCollapse.js script - new base64 encoded images: arrow-up and arrow-down (white colored)
This commit is contained in:
@@ -56,6 +56,10 @@ If you need to customize styles for [Redmine Backlogs][redmine_backlogs] remembe
|
|||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
|
Latest (master):
|
||||||
|
|
||||||
|
* Fixed #8: Setting `$top-menu-collapse` to `true` will enable script allowing to toggle if top menu should be collapsed (no wrapping) or expanded (wrapped, with auto height)
|
||||||
|
|
||||||
v1.5.0 (2015-04-15):
|
v1.5.0 (2015-04-15):
|
||||||
|
|
||||||
* Fixed #5: Added default style for colored issue links.
|
* Fixed #5: Added default style for colored issue links.
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
100
src/javascripts/modules/TopMenuCollapse.js
Normal file
100
src/javascripts/modules/TopMenuCollapse.js
Normal file
@@ -0,0 +1,100 @@
|
|||||||
|
var PurpleMine = PurpleMine || {};
|
||||||
|
|
||||||
|
PurpleMine.TopMenuCollapse = (function()
|
||||||
|
{
|
||||||
|
"use strict";
|
||||||
|
|
||||||
|
var self; // Make it work for browsers without Function.prototype.bind
|
||||||
|
var translations = {
|
||||||
|
en: {
|
||||||
|
toggler: "Expand/collapse top menu"
|
||||||
|
},
|
||||||
|
pl: {
|
||||||
|
toggler: "Zwiń/rozwiń górne menu"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function TopMenuCollapse()
|
||||||
|
{
|
||||||
|
self = this;
|
||||||
|
|
||||||
|
this.topMenuCollapsed = true;
|
||||||
|
this.$toggler = null;
|
||||||
|
this.$topMenu = $("#top-menu");
|
||||||
|
this.lang = document.documentElement.lang;
|
||||||
|
|
||||||
|
if (typeof translations[this.lang] === "undefined")
|
||||||
|
{
|
||||||
|
this.lang = "en";
|
||||||
|
}
|
||||||
|
|
||||||
|
this._ = translations[this.lang];
|
||||||
|
|
||||||
|
if ("none" !== this.$topMenu.css("maxHeight"))
|
||||||
|
{
|
||||||
|
if (window.localStorage)
|
||||||
|
{
|
||||||
|
this.topMenuCollapsed =
|
||||||
|
null === localStorage.getItem("PurpleMine:topMenuExpanded");
|
||||||
|
}
|
||||||
|
|
||||||
|
this.buildToggleButton();
|
||||||
|
|
||||||
|
if (false === this.topMenuCollapsed)
|
||||||
|
{
|
||||||
|
this.expandTopMenu(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
TopMenuCollapse.prototype.buildToggleButton = function()
|
||||||
|
{
|
||||||
|
var togglerClass = "top-menu-toggler",
|
||||||
|
togglerHtml;
|
||||||
|
|
||||||
|
togglerHtml = "<a href=\"javascript:;\" class=\"" + togglerClass +
|
||||||
|
"\" title=\"" + this._.toggler + "\"></a>";
|
||||||
|
this.$toggler = $(togglerHtml);
|
||||||
|
|
||||||
|
this.$topMenu.prepend(this.$toggler);
|
||||||
|
this.$toggler.on("click", this.toggleTopMenu);
|
||||||
|
};
|
||||||
|
|
||||||
|
TopMenuCollapse.prototype.toggleTopMenu = function()
|
||||||
|
{
|
||||||
|
if (self.topMenuCollapsed)
|
||||||
|
{
|
||||||
|
self.expandTopMenu();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
self.collapseTopMenu();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TopMenuCollapse.prototype.expandTopMenu = function()
|
||||||
|
{
|
||||||
|
this.$topMenu.addClass("expanded");
|
||||||
|
this.$toggler.addClass("expanded");
|
||||||
|
this.topMenuCollapsed = false;
|
||||||
|
|
||||||
|
if (window.localStorage)
|
||||||
|
{
|
||||||
|
localStorage.setItem("PurpleMine:topMenuExpanded", "x");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
TopMenuCollapse.prototype.collapseTopMenu = function()
|
||||||
|
{
|
||||||
|
this.$topMenu.removeClass("expanded");
|
||||||
|
this.$toggler.removeClass("expanded");
|
||||||
|
this.topMenuCollapsed = true;
|
||||||
|
|
||||||
|
if (window.localStorage)
|
||||||
|
{
|
||||||
|
localStorage.removeItem("PurpleMine:topMenuExpanded");
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return TopMenuCollapse;
|
||||||
|
}());
|
||||||
@@ -5,4 +5,5 @@ $(function()
|
|||||||
|
|
||||||
new PurpleMine.SidebarToggler();
|
new PurpleMine.SidebarToggler();
|
||||||
new PurpleMine.HistoryTabs();
|
new PurpleMine.HistoryTabs();
|
||||||
|
new PurpleMine.TopMenuCollapse();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ $use-font-awesome: true !default;
|
|||||||
$issue-subject-large: true !default;
|
$issue-subject-large: true !default;
|
||||||
$enable-sidebar-toggler: true !default;
|
$enable-sidebar-toggler: true !default;
|
||||||
$wiki-page-more-vertical-space: true !default;
|
$wiki-page-more-vertical-space: true !default;
|
||||||
|
$top-menu-collapse: false !default;
|
||||||
|
|
||||||
|
|
||||||
//== Colors
|
//== Colors
|
||||||
@@ -72,8 +73,9 @@ $font-family-base: $font-family-sans-serif !default;
|
|||||||
$font-size-base: 14px !default;
|
$font-size-base: 14px !default;
|
||||||
$font-size-large: 1.285em !default;
|
$font-size-large: 1.285em !default;
|
||||||
$font-size-large-px: 18px !default;
|
$font-size-large-px: 18px !default;
|
||||||
$font-size-small: .86em !default;
|
$font-size-small-unitless: .86 !default;
|
||||||
$font-size-small-px: 12px !default;
|
$font-size-small: $font-size-small-unitless * 1em !default;
|
||||||
|
$font-size-small-px: floor($font-size-small-unitless * $font-size-base) !default;
|
||||||
|
|
||||||
$font-size-h1: 2.25em !default;
|
$font-size-h1: 2.25em !default;
|
||||||
$font-size-h2: 1.75em !default;
|
$font-size-h2: 1.75em !default;
|
||||||
@@ -466,6 +468,8 @@ $screen-xs-max: ($screen-sm-min - 1) !default;
|
|||||||
$screen-sm-max: ($screen-md-min - 1) !default;
|
$screen-sm-max: ($screen-md-min - 1) !default;
|
||||||
$screen-md-max: ($screen-lg-min - 1) !default;
|
$screen-md-max: ($screen-lg-min - 1) !default;
|
||||||
|
|
||||||
|
$top-menu-collapse-breakpoint: $screen-lg-min !default;
|
||||||
|
|
||||||
|
|
||||||
//== Content widths
|
//== Content widths
|
||||||
//
|
//
|
||||||
|
|||||||
@@ -11,7 +11,6 @@
|
|||||||
@import "components/forms";
|
@import "components/forms";
|
||||||
@import "components/tabs";
|
@import "components/tabs";
|
||||||
@import "components/pagination";
|
@import "components/pagination";
|
||||||
@import "components/top";
|
|
||||||
@import "components/content";
|
@import "components/content";
|
||||||
@import "components/gravatar";
|
@import "components/gravatar";
|
||||||
@import "components/list";
|
@import "components/list";
|
||||||
@@ -27,6 +26,7 @@
|
|||||||
@import "components/elements";
|
@import "components/elements";
|
||||||
@import "components/jquery-ui";
|
@import "components/jquery-ui";
|
||||||
@import "components/icons";
|
@import "components/icons";
|
||||||
|
@import "components/top";
|
||||||
@import "components/jstoolbar";
|
@import "components/jstoolbar";
|
||||||
@import "components/flash";
|
@import "components/flash";
|
||||||
@import "components/image-base64";
|
@import "components/image-base64";
|
||||||
|
|||||||
@@ -7,14 +7,22 @@
|
|||||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAKBAMAAAAnY0GXAAAAD1BMVEUAAACzs7Ozs7Ozs7Ozs7NJvZFvAAAABHRSTlMA5kpJG2qUMwAAABtJREFUCNdjIBMYCkMRDIg4QhBuAUUhKCIPAAAlaQNk5qF21gAAAABJRU5ErkJggg==);
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAKBAMAAAAnY0GXAAAAD1BMVEUAAACzs7Ozs7Ozs7Ozs7NJvZFvAAAABHRSTlMA5kpJG2qUMwAAABtJREFUCNdjIBMYCkMRDIg4QhBuAUUhKCIPAAAlaQNk5qF21gAAAABJRU5ErkJggg==);
|
||||||
}
|
}
|
||||||
|
|
||||||
%image-arrow-left {
|
%image-arrow-up {
|
||||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAGFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWNxwqAAAACHRSTlMAgF1mUUUMBtml7EIAAAAjSURBVAjXYyAAWGEMRyhdJAih2QyhDCZBhAhcDVwXwhziAACuywJHmKAVPgAAAABJRU5ErkJggg==);
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAYUlEQVR4Xu2SMQqAMAxFVUxOID2FQ+9R3cRjesX4A5lCoaUFB2nhkeQPLxQyi8jU8xbwYwGBC1CrIIFda4sgKq6vFgS/1eZQI2BwZ/5NlnNJcIAtt8ny04ermx/l4zsYgheccgigTIfmMAAAAABJRU5ErkJggg==);
|
||||||
}
|
}
|
||||||
|
|
||||||
%image-arrow-right {
|
%image-arrow-right {
|
||||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUUeIgAAAACXRSTlMAgF1mUUUMBwa6cf6pAAAAIklEQVQI12PADwJgDBEYQ1ADxhBOgDIEFdBF1GG6EOYQCQC/wwKE7b2bNAAAAABJRU5ErkJggg==);
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACUUeIgAAAACXRSTlMAgF1mUUUMBwa6cf6pAAAAIklEQVQI12PADwJgDBEYQ1ADxhBOgDIEFdBF1GG6EOYQCQC/wwKE7b2bNAAAAABJRU5ErkJggg==);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
%image-arrow-down {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAG1BMVEUAAAD////////////////////////////////rTT7CAAAACXRSTlMAgFIFbBZWMTBl3YBFAAAALElEQVQI12MgDTAJCgoKgRjMjoKCzmChQEHBADCDQ1AcqkpRAcowM2AgEQAAvM4CiwrixCQAAAAASUVORK5CYII=);
|
||||||
|
}
|
||||||
|
|
||||||
|
%image-arrow-left {
|
||||||
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAGFBMVEUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWNxwqAAAACHRSTlMAgF1mUUUMBtml7EIAAAAjSURBVAjXYyAAWGEMRyhdJAih2QyhDCZBhAhcDVwXwhziAACuywJHmKAVPgAAAABJRU5ErkJggg==);
|
||||||
|
}
|
||||||
|
|
||||||
%image-calendar {
|
%image-calendar {
|
||||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUMftYpAAAACnRSTlMArIDn/dahwzIKIC4f+wAAADxJREFUCNdjYEhJACEGBk8HEGIQXrDYeMFiAYZVK1YB0QKGVSAApBcwMQgwMSDohaKChqKCxItXgc0pAADUBx5bh1ZBCgAAAABJRU5ErkJggg==);
|
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAOBAMAAADtZjDiAAAAIVBMVEUAAABVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUMftYpAAAACnRSTlMArIDn/dahwzIKIC4f+wAAADxJREFUCNdjYEhJACEGBk8HEGIQXrDYeMFiAYZVK1YB0QKGVSAApBcwMQgwMSDohaKChqKCxItXgc0pAADUBx5bh1ZBCgAAAABJRU5ErkJggg==);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,6 +9,85 @@
|
|||||||
font-size: $font-size-small;
|
font-size: $font-size-small;
|
||||||
@extend %clearfix;
|
@extend %clearfix;
|
||||||
|
|
||||||
|
@if $top-menu-collapse {
|
||||||
|
$toggler-position-v: $padding-small-vertical + 1px;
|
||||||
|
$toggler-position-h: $padding-small-vertical - 1px;
|
||||||
|
|
||||||
|
max-height: floor($font-size-base * $font-size-small-unitless * $line-height-base) + $padding-small-vertical;
|
||||||
|
padding-bottom: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
&.expanded {
|
||||||
|
max-height: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
display: inline-block;
|
||||||
|
margin-bottom: $padding-small-vertical;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.top-menu-toggler {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
top: $toggler-position-v;
|
||||||
|
left: $toggler-position-h;
|
||||||
|
@include user-select(none);
|
||||||
|
|
||||||
|
@if $use-font-awesome {
|
||||||
|
font-size: 14px;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: $fa-var-caret-square-o-down;
|
||||||
|
}
|
||||||
|
} @else {
|
||||||
|
@extend %image-arrow-down;
|
||||||
|
}
|
||||||
|
|
||||||
|
@if $use-font-awesome {
|
||||||
|
@extend %fa-icon;
|
||||||
|
color: mix($top-menu-link, $top-menu-bg, 33%);
|
||||||
|
line-height: 1;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:active {
|
||||||
|
color: mix($top-menu-link-hover, $top-menu-bg, 50%);
|
||||||
|
}
|
||||||
|
} @else {
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
border-radius: $border-radius-base;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center center;
|
||||||
|
|
||||||
|
&:hover,
|
||||||
|
&:focus,
|
||||||
|
&:active {
|
||||||
|
background-color: lighten($top-menu-bg, 15%);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
&.expanded {
|
||||||
|
@if $use-font-awesome {
|
||||||
|
&:before {
|
||||||
|
content: $fa-var-caret-square-o-up;
|
||||||
|
}
|
||||||
|
} @else {
|
||||||
|
@extend %image-arrow-up;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media screen and (min-width: $top-menu-collapse-breakpoint) {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ul {
|
ul {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -32,6 +111,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
#loggedas {
|
#loggedas {
|
||||||
|
margin-left: 1em;
|
||||||
float: right;
|
float: right;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user