You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@jspwiki.apache.org by br...@apache.org on 2018/06/17 20:31:30 UTC

[jspwiki] branch master updated: 2.10.5-git-04 Fine-tuning Haddock for mobile devices.

This is an automated email from the ASF dual-hosted git repository.

brushed pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/jspwiki.git


The following commit(s) were added to refs/heads/master by this push:
     new 82e6798  2.10.5-git-04  Fine-tuning Haddock for mobile devices.
     new b440a30  Merge branch 'master' of https://github.com/apache/jspwiki
82e6798 is described below

commit 82e6798635f8dfcb3a265325ecef66dcc8065a09
Author: brushed <di...@gmail.com>
AuthorDate: Sun Jun 17 22:28:20 2018 +0200

    2.10.5-git-04  Fine-tuning Haddock for mobile devices.
---
 ChangeLog                                          | 21 ++++++++
 .../src/main/java/org/apache/wiki/Release.java     |  2 +-
 jspwiki-war/src/main/scripts/behaviors/Magnify.js  |  6 ++-
 .../src/main/scripts/moo-extend/Element.Extend.js  | 49 +++++++++++++------
 .../src/main/scripts/moo-extend/Form.File.js       | 11 +++--
 jspwiki-war/src/main/scripts/moo-extend/Tips.js    | 57 ++++++++--------------
 .../src/main/scripts/wiki-edit/Wiki.Snips.js       | 11 +++--
 .../src/main/scripts/wiki/Wiki.Behaviors.js        |  2 -
 jspwiki-war/src/main/scripts/wiki/Wiki.js          | 25 +++++-----
 .../haddock/default/RecentChangesPlugin.less       |  4 --
 .../main/styles/haddock/default/Template.Nav.less  | 21 +++++---
 .../main/styles/haddock/default/Template.View.less | 22 +--------
 .../haddock/default/responsive-viewport.less       | 29 ++++++++++-
 .../src/main/styles/haddock/default/tables.less    | 22 ++++-----
 .../src/main/styles/haddock/default/type.less      | 36 ++++++++------
 .../src/main/styles/haddock/default/variables.less |  3 ++
 .../src/main/webapp/templates/haddock/GroupTab.jsp |  2 +-
 .../src/main/webapp/templates/haddock/Header.jsp   |  8 +--
 .../src/main/webapp/templates/haddock/Nav.jsp      | 27 +++++++++-
 .../main/webapp/templates/haddock/SearchBox.jsp    |  5 +-
 .../src/main/webapp/templates/haddock/UserBox.jsp  |  5 +-
 .../main/webapp/templates/haddock/commonheader.jsp |  3 +-
 .../webapp/templates/haddock/editors/plain.jsp     | 14 +++---
 23 files changed, 221 insertions(+), 164 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 858cae5..159b520 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,24 @@
+2018-06-17  Dirk Frederickx (brushed AT apache DOT org)
+
+       * 2.10.5-git-04  Fine-tuning Haddock for mobile devices.
+
+       * Improve accessibility on hover-menu's for touch-devices. They'll open after
+         a touch-down event; and will close when touching any area outside the menu.
+
+       * Fixing access to the Find and User menu's for touch devices.
+
+       * Several small style improvements on the navigation bar for mobile devices
+         (hiding CARET to indicate hover-menu's, ...)
+
+       * Added touch-support for %%magnify style.
+
+       * Breadcrumbs are now moved to a proper drop-down menu (...) on the navigation bar
+         instead of the previously not-so-obvious 'mouse-over-zone' under the pagename.
+         This also makes breadcrumbs accessible to the tablet & phone users.
+
+       * Fixed a display error when uploading multiple attachements in one step.
+
+
 2018-06-05  Dirk Frederickx (brushed AT apache DOT org)
 
        * 2.10.5-git-03  JSPWIKI-1071 Ajax request header 'Connection' forbidden
diff --git a/jspwiki-war/src/main/java/org/apache/wiki/Release.java b/jspwiki-war/src/main/java/org/apache/wiki/Release.java
index 280a107..c250857 100644
--- a/jspwiki-war/src/main/java/org/apache/wiki/Release.java
+++ b/jspwiki-war/src/main/java/org/apache/wiki/Release.java
@@ -72,7 +72,7 @@ public final class Release {
      *  <p>
      *  If the build identifier is empty, it is not added.
      */
-    public static final String     BUILD         = "3";
+    public static final String     BUILD         = "4";
 
     /**
      *  This is the generic version string you should use when printing out the version.  It is of
diff --git a/jspwiki-war/src/main/scripts/behaviors/Magnify.js b/jspwiki-war/src/main/scripts/behaviors/Magnify.js
index 7323bc1..a28984a 100644
--- a/jspwiki-war/src/main/scripts/behaviors/Magnify.js
+++ b/jspwiki-war/src/main/scripts/behaviors/Magnify.js
@@ -34,7 +34,7 @@ function Magnify( images ){
     function move_maggy( event ){
 
         var img = event.target,
-            isVisible = ( event.type != "mouseleave" );
+            isVisible = /move/.test(event.type);
 
         if( isVisible ){
 
@@ -63,7 +63,9 @@ function Magnify( images ){
 
     $$( images ).addEvents({
         mousemove: move_maggy,
-        mouseleave: move_maggy
+        touchmove: move_maggy,
+        mouseleave: move_maggy,
+        touchend: move_maggy
     });
 
 }
diff --git a/jspwiki-war/src/main/scripts/moo-extend/Element.Extend.js b/jspwiki-war/src/main/scripts/moo-extend/Element.Extend.js
index e61d6d0..0fb1d68 100644
--- a/jspwiki-war/src/main/scripts/moo-extend/Element.Extend.js
+++ b/jspwiki-war/src/main/scripts/moo-extend/Element.Extend.js
@@ -121,36 +121,55 @@ Element.implement({
     /*
     Function: onHover
         Turns a DOM element into a hoverable menu.
+        Only one menu at a time can be visible.
 
     Arguments:
         toggle - (string,optional) A CSS selector to match the hoverable toggle element
-        onOpen - (function, optional) Function which is call when opening the menu
+        onOpen - (function, optional) Function which is to be called when opening the menu
 
     Example
     > $("li.dropdown-menu").onHover("ul");
     */
     onHover: function( toggle, onOpen ){
 
-        var element = this;
+        function toggleMenu( event ){
 
-        if( (toggle = element.getParent(toggle)) ){
+            if( /enter|focus/.test(event.type) ){
 
-             element.fade("hide");  //CHECKME : is this sill needed, menu should be hidden/visible depending on .open
+                //on touch devices, a starttouch also generates a mouseenter on :hover links
+                //however, there is no mouseleave when clicking outside the hover menu
+                //so temporary add a touchend handler on the document to help close the menu
+                document.addEvent("touchend", toggleMenu);
+                toggle.addClass("open");
+                if( onOpen ){ onOpen(); }
 
-             toggle.addEvents({
-                mouseenter: function(){
-                    element.fade(0.9);
-                    toggle.addClass("open");
-                    if(onOpen){ onOpen(); }
-                },
-                mouseleave: function(){
-                    element.fade(0);
-                    toggle.removeClass("open");
-                }
+            } else {
+
+                //close the menu if toggle receives the event or a (touchend-)event is received outside the menu
+                if( (event.target != toggle) && toggle.contains(event.target) ){ return; }
+
+                toggle.removeClass("open");
+                document.removeEvent("touchend", toggleMenu);
+
+            }
+
+            event.preventDefault;
+
+        };
+
+        toggle = this.getParent( toggle );
+
+        if( toggle ){
+
+            toggle.addEvents({
+                focus: toggleMenu,  //keyboard
+                blur: toggleMenu,
+                mouseenter: toggleMenu,
+                mouseleave: toggleMenu
             });
 
         }
-        return element;
+        return this;
     },
 
     /*
diff --git a/jspwiki-war/src/main/scripts/moo-extend/Form.File.js b/jspwiki-war/src/main/scripts/moo-extend/Form.File.js
index c40206b..4dc34e5 100755
--- a/jspwiki-war/src/main/scripts/moo-extend/Form.File.js
+++ b/jspwiki-war/src/main/scripts/moo-extend/Form.File.js
@@ -91,7 +91,7 @@ Form.File = new Class({
         var self = this,
             disabled = "disabled";
 
-        console.log("update ",self.nbr,step);
+        //console.log("update ",self.nbr,step);
 
         self.nbr += step;
         self.submit.set(disabled, self.nbr ? "":disabled );
@@ -144,7 +144,7 @@ Form.File = new Class({
 
         self.reset = function(){
 
-            console.log(" reset ");
+            //console.log(" reset ");
             var files = inputFiles.getFiles();
 
             while( files[0] ){ inputFiles.remove( files.shift() ); }
@@ -200,9 +200,10 @@ Form.File = new Class({
 
                 for( var i=0; i< input.files.length; i++){
                     var file = input.files[i];
-                    fileNames += file.name.replace(/.*[\\\/]/, "")
-                              + " <span class='badge'>" + readableFileSize( file.size )+ "</span><br />";
-                  }
+                    fileNames += (i > 0 ? "<br />" : "")
+                              +  file.name.replace(/.*[\\\/]/, "")
+                              + " <span class='badge'>" + readableFileSize( file.size )+ "</span>";
+                }
 
                 input.set("id",String.uniqueID());
                 input.set("name",String.uniqueID());
diff --git a/jspwiki-war/src/main/scripts/moo-extend/Tips.js b/jspwiki-war/src/main/scripts/moo-extend/Tips.js
index abedc8e..a2bf598 100644
--- a/jspwiki-war/src/main/scripts/moo-extend/Tips.js
+++ b/jspwiki-war/src/main/scripts/moo-extend/Tips.js
@@ -42,51 +42,36 @@ var Tips = function Tips(elements){
             TheTip = [tt,[tt+'-inner'/*,tt+'-arrow'*/]].slick().inject(document.body),
             inner = TheTip.getFirst();
 
-        $$(elements).addEvents({
-
-            mousemove: function(e){
-                TheTip.setStyles({ top:e.page.y +10, left:e.page.x + 10 });
-            },
-
-            mouseenter: function(){
-                inner.adopt( this.getFirst() ) ;
-                TheTip.addClass('in'); //.fade('in');
-            },
-
-            mouseleave: function(){
-                TheTip.removeClass('in'); //.fade('out');
-                this.adopt( inner.getFirst() );
-            }
-        });
-};
+        function tipEvent( e ){
 
+            if( /move/.test(event.type) ){
 
-/*TIP position logic
-    position: function(event){
+                if( !isVisible ){
 
-        var windowPadding={x:0, y:0};
+                    /*not yet visible:  copy content into the TIP */
+                    inner.adopt( this.firstChild );
+                    isVisible = true;
 
-        var size = window.getSize(),
-            scroll = window.getScroll(),
-            tip = {x: this.tip.offsetWidth, y: this.tip.offsetHeight},
-            props = {x: 'left', y: 'top'},
-            bounds = {y: false, x2: false, y2: false, x: false},
-            obj = {};
+                }
 
-        for (var z in props){
+                zTip.setStyles({ top:e.page.y +10, left:e.page.x + 10 });
 
-            obj[props[z]] = event.page[z] + this.options.offset[z];
+            } else {
 
-            if (obj[props[z]] < 0) bounds[z] = true;
+                /* xx-leave event:  move content back to the main body*/
+                this.adopt( inner.firstChild );
+                isVisible = false;
+            }
 
-            if ((obj[props[z]] + tip[z] - scroll[z]) > size[z] - windowPadding[z]){
+            zTip.ifClass( isVisible, "in" );
 
-                obj[props[z]] = event.page[z] - this.options.offset[z] - tip[z];
-                bounds[z+'2'] = true;
-            }
         }
 
-        this.tip.setStyles(obj);
-    },
+        $$(elements).addEvents({
+            touchmove: tipEvent,
+            mousemove: tipEvent,
+            touchend: tipEvent,
+            mouseleave: tipEvent
+        });
 
-*/
\ No newline at end of file
+};
diff --git a/jspwiki-war/src/main/scripts/wiki-edit/Wiki.Snips.js b/jspwiki-war/src/main/scripts/wiki-edit/Wiki.Snips.js
index 25a4f9a..bddec2d 100644
--- a/jspwiki-war/src/main/scripts/wiki-edit/Wiki.Snips.js
+++ b/jspwiki-war/src/main/scripts/wiki-edit/Wiki.Snips.js
@@ -36,6 +36,7 @@ Wiki.DirectSnips = {
         }
 };
 
+
 /*
 Function: snippets
 
@@ -423,8 +424,8 @@ Wiki.Snips = {
         //match [link],  do not match [{, [[
         //do not include the [ in the matched string
         suggest: {
-        lback: /\[([^\|\[{\]\n\r]*)$/,
-        match: /^([^\|\[{\]\n\r]*)(?:[\]\n\r])/
+        lback: /\[([^|[{\]\n\r]*)$/,
+        match: /^([^|[{\]\n\r]*)(?:[\]\n\r])/
         },
         linkDlg: Wiki.pageDialog("Wiki Link", "/search/suggestions")
 
@@ -435,8 +436,8 @@ Wiki.Snips = {
         //do not match [{, [[
         //do not include the [ in the matched string
         suggest: {
-        lback: /\[(?:[^\|\]]+\|)([^\|\[{\]\n\r]*)$/,
-        match: /^([^\|\[{\]\n\r]*)(?:[\]\|\n\r])/
+        lback: /\[(?:[^|\]]+\|)([^|[{\]\n\r]*)$/,
+        match: /^([^|[{\]\n\r]*)(?:[\]|\n\r])/
         },
         linkPart2: Wiki.pageDialog("Wiki Link", "/search/suggestions")
     },
@@ -599,7 +600,7 @@ Wiki.Snips = {
                 //"[description|{link}|options]": "<span class='icon-link'/>",
                 "[{Image src='{image.jpg}'}]": "<span class='icon-picture' title='Insert an image'/>",
                 "[{{plugin}}]": "<span class='icon-puzzle-piece' title='Insert a Plugin'></span>",
-                "%%style {body} /%":"<span style='font-family:monospace;' title='Add a Style'>%%</span>",
+                "%%style {body} /%":"<span style='font-family:monospace;letter-spacing:-.2em;' title='Add a Style'>%%</span>",
                 "divider2": "",
                 "%%(font-family:{font};) body /%":"<span title='Change the Font'><span style='font-family:serif;'>A</span><span style='font-family:sans-serif'>a</span></span>",
                 "&{entity};" : "<span style='font-family:cursive;' title='Insert a Special Character'>&amp;</span>",
diff --git a/jspwiki-war/src/main/scripts/wiki/Wiki.Behaviors.js b/jspwiki-war/src/main/scripts/wiki/Wiki.Behaviors.js
index c6b42ca..d48c3f4 100644
--- a/jspwiki-war/src/main/scripts/wiki/Wiki.Behaviors.js
+++ b/jspwiki-war/src/main/scripts/wiki/Wiki.Behaviors.js
@@ -484,7 +484,6 @@ Example:
         /*html5 expects  <pre><code>  */
         if( element.match("pre") ){
             element.innerHTML = "<code>" + element.innerHTML + "</code>";
-            element = element.getFirst();
         }
 
     })
@@ -494,7 +493,6 @@ Example:
         /*html5 expects  <pre><code>  */
         if( element.match("pre") ){
             element.innerHTML = "<code>" + element.innerHTML + "</code>";
-            element = element.getFirst();
         }
 
     })
diff --git a/jspwiki-war/src/main/scripts/wiki/Wiki.js b/jspwiki-war/src/main/scripts/wiki/Wiki.js
index 7a0edeb..291d068 100644
--- a/jspwiki-war/src/main/scripts/wiki/Wiki.js
+++ b/jspwiki-war/src/main/scripts/wiki/Wiki.js
@@ -21,7 +21,7 @@
 
 
 /*eslint-env browser*/
-/*global $, $$, Form, Hash, Behavior, HighlightQuery, Accesskey */
+/*global $, $$, Form, Hash, Behavior, HighlightQuery, Accesskey, Dialog */
 /*exported  Wiki */
 
 /*
@@ -72,13 +72,13 @@ var Wiki = {
         wiki.update = behavior.update.bind(behavior);
 
 
-        // add core jspwiki behaviors; needed to support the default template jsp's
+
+        //jspwiki behaviors; needed to support the haddock template jsp's
         wiki.add( "body", wiki.caniuse )
 
             .add( "[accesskey]", Accesskey )
 
             //toggle effect:  toggle .active class on this element when clicking toggle element
-            //.add("[data-toggle]", "onToggle", {attr:"data-toggle"})
             .add( "[data-toggle]", function(element){
 
                 element.onToggle( element.get("data-toggle"), function(isActive){
@@ -96,8 +96,7 @@ var Wiki = {
                 element.onModal( element.get("data-modal") );
             })
 
-            //hover effects: show/hide this element when hovering over the parent element
-            //.add("[data-toggle]", "onHover", {attr:"data-hover-parent"})
+            //hover effects: show/hide an element when hovering over the data-hover-parent element
             .add( "[data-hover-parent]", function(element){
                 element.onHover( element.get("data-hover-parent") );
             })
@@ -239,7 +238,7 @@ var Wiki = {
         }
 
         //console.log( "section", document.referrer, document.referrer.match( /\&section=(\d+)$/ ) );
-        wiki.scrollTo( ( document.referrer.match( /\&section=(\d+)$/ ) || [,-1])[1] );
+        wiki.scrollTo( ( document.referrer.match( /&section=(\d+)$/ ) || [0,-1])[1] );
 
         // initialize all registered behaviors
         wiki.update();
@@ -530,7 +529,7 @@ var Wiki = {
     cleanPageName: function( pagename ){
 
         //\w is short for [A-Z_a-z0-9_]
-        return pagename.clean().replace(/[^\w\u00C0-\u1FFF\u2800-\uFFFD\(\)&\+,\-=\.\$ ]/g, "");
+        return pagename.clean().replace(/[^\w\u00C0-\u1FFF\u2800-\uFFFD()&+,\-=.$ ]/g, "");
 
     },
 
@@ -793,12 +792,12 @@ var Wiki = {
                 //urlEncoded: true, //content-type header = www-form-urlencoded + encoding
                 //encoding: "utf-8",
                 //encoding: "ISO-8859-1",
-        		headers: {
-		        	//'X-Requested-With': 'XMLHttpRequest',
-			        //'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
-        			'Accept': 'application/json',
-		        	'X-Request': 'JSON'
-		        },
+                headers: {
+                    //'X-Requested-With': 'XMLHttpRequest',
+                    //'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+                    'Accept': 'application/json',
+                    'X-Request': 'JSON'
+                },
                 onSuccess: function( responseText ){
 
                     //console.log(responseText, JSON.parse( responseText ), responseText.charCodeAt(8),responseText.codePointAt(8), (encodeURIComponent(responseText)), encodeURIComponent("ä"), encodeURIComponent("Ã")  );
diff --git a/jspwiki-war/src/main/styles/haddock/default/RecentChangesPlugin.less b/jspwiki-war/src/main/styles/haddock/default/RecentChangesPlugin.less
index f28d198..f1ade5b 100644
--- a/jspwiki-war/src/main/styles/haddock/default/RecentChangesPlugin.less
+++ b/jspwiki-war/src/main/styles/haddock/default/RecentChangesPlugin.less
@@ -48,14 +48,10 @@ DOM structure:
 			letter-spacing:1px;
 		}
 	}
-
-
     td {
         &:first-child {
             width:auto;
             padding-left:1em;
         }
-
     }
-
 }
diff --git a/jspwiki-war/src/main/styles/haddock/default/Template.Nav.less b/jspwiki-war/src/main/styles/haddock/default/Template.Nav.less
index d0bf0b2..bc793ed 100644
--- a/jspwiki-war/src/main/styles/haddock/default/Template.Nav.less
+++ b/jspwiki-war/src/main/styles/haddock/default/Template.Nav.less
@@ -26,12 +26,14 @@ DOM Structure:
 (start code)
 div.row
 	ul.nav.nav-pills.pull-left
-		li
-			a.logo
-
-	ul.nav.nav-pills.pull-right
 		li.menu
 			a Menu
+		li.trail
+			a ...
+				span.caret
+			ul.dropdown-menu.pull-right
+
+	ul.nav.nav-pills.pull-right
     	li
     		a Attach
     	li
@@ -39,8 +41,8 @@ div.row
     	li[.disabled]
     		a Edit
     	li
-    		More
-    		span.caret
+    		a More
+    			span.caret
     		ul.dropdown-menu.pull-right
     			...
 
@@ -57,9 +59,12 @@ div.row
     /* hover menu items with transparent effect  - undo some of the bootstrap color settings */
     .nav .open > a,
     .nav > li > a:hover,
-    .nav > li > a:focus {
+    .nav > li > a:hover:focus {
         background-color: rgba(255,255,255,.2);
     }
+    .nav > li > a:focus {
+    	background-color: transparent;
+    }
     .nav > li.disabled > a {
         color:@silver;
     }
@@ -82,4 +87,4 @@ div.row
 
     .nav > li > a.slimbox-link:after { color:white; font-size:70%; top:-.7em; }
 
-}
\ No newline at end of file
+}
diff --git a/jspwiki-war/src/main/styles/haddock/default/Template.View.less b/jspwiki-war/src/main/styles/haddock/default/Template.View.less
index db01faa..1f95d7e 100644
--- a/jspwiki-war/src/main/styles/haddock/default/Template.View.less
+++ b/jspwiki-war/src/main/styles/haddock/default/Template.View.less
@@ -85,9 +85,6 @@ DOM structure:
 		        li.recents ...
 		        li.recents.clear ...
 
-
-      div.breadcrumbs
-
     ...
 
     div.footer
@@ -179,8 +176,7 @@ Fixed .header with hide (on scrolldown)  and show (on scrollup) effects.
 }
 
 
-.header .pagename,
-.header .breadcrumb {
+.header .pagename {
     .text-overflow();
 }
 
@@ -197,22 +193,6 @@ Fixed .header with hide (on scrolldown)  and show (on scrollup) effects.
     font-size: 6em;
 }
 
-/*
-JSPWiki-s breadcrumb - do not inherit bootstraps breadcrumbs
-Only show breadcrumb on mouse hover
-*/
-.breadcrumb {
-    .small;
-    .transition(all .5s ease);
-    color:transparent;
-    &:hover { color:inherit; }
-
-    .divider:before {
-        content:"\2022";   //&bull;
-        padding:0 .25em;
-    }
-}
-
 
 .footer {
     //background: @wiki-footer-bg; //reuse header background
diff --git a/jspwiki-war/src/main/styles/haddock/default/responsive-viewport.less b/jspwiki-war/src/main/styles/haddock/default/responsive-viewport.less
index 059244c..c3ff99b 100644
--- a/jspwiki-war/src/main/styles/haddock/default/responsive-viewport.less
+++ b/jspwiki-war/src/main/styles/haddock/default/responsive-viewport.less
@@ -139,6 +139,8 @@ Medium size screens,  tablets,  phones in landscape mode
 
 	.header > *:not(.titlebox), .footer > *:not(.titlebox) { padding:0;  }
 
+	.header .caret { display: none; }
+
 	.reader .pagename { font-size:1.5em; line-height:1.5;}
 	.pagename {
 		font-size: 1.5em;
@@ -154,17 +156,22 @@ Medium size screens,  tablets,  phones in landscape mode
 		b:before {content:""};
 	}
 
-	.breadcrumb { display:none; }
-
 	// Template.UserBox.less
 
 	.userbox ul.dropdown-menu {
 			max-width:@wiki-small-viewport-dialog-width;
 			li:first-child a { white-space:normal; }
 	}
+	.userbox > .btn { padding: 6px  5px 6px 10px;}
 
 	// Template.SearchBox.less
 	.searchbox ul.dropdown-menu { max-width: @wiki-small-viewport-dialog-width; }
+	//.searchbox .btn .icon-search { padding: 5px 10px; }
+
+	.searchbox > .btn { padding: 6px 10px 6px 10px;}  //keep original top/bottom padding 6px
+	.searchbox > .btn > .icon-search { padding: 0;}
+
+
 
 	// Template.Nav.less
 	// Only show the menu icons
@@ -173,6 +180,24 @@ Medium size screens,  tablets,  phones in landscape mode
 		> *:first-child { display:initial; }
 		> *:nth-child(even) { display:none; }
 	}
+	#attach .badge {
+		background:transparent;
+		color:white;
+		padding:3px 0;
+		min-width:auto;
+	}
+
+	.header > .navigation .nav > li > a {
+
+		& > *:first-child { display:inline-block; }
+		&:hover > *:first-child { animation: wiggle 1s ease-in-out infinite; }
+
+	}
+	@keyframes wiggle {
+    	0% { transform:rotate(10deg); }
+	    50% { transform:rotate(-10deg); }
+    	100% { transform:rotate(10deg); }
+	}
 
 	// Template.Content.less
 	/* hide sidebar on extra small devices, and give it a fixed width
diff --git a/jspwiki-war/src/main/styles/haddock/default/tables.less b/jspwiki-war/src/main/styles/haddock/default/tables.less
index b44f1a0..2ac0d1c 100644
--- a/jspwiki-war/src/main/styles/haddock/default/tables.less
+++ b/jspwiki-war/src/main/styles/haddock/default/tables.less
@@ -48,15 +48,13 @@ table[border="1"] td { border:0; }
 
     &.table-fit { width:auto; }
 
-}
-
-.wikitable.table-condensed  {
-
-    th, td { padding: @table-condensed-cell-padding; }
+	&.table-condensed {
+		th, td { padding: @table-condensed-cell-padding; }
+	}
 
 }
 
-.wikitable.table-bordered {
+.table-bordered {
         border: 1px solid @table-border-color;
 
         tr:first-child {
@@ -64,16 +62,16 @@ table[border="1"] td { border:0; }
         }
 }
 
-.wikitable.table-noborder td,
-.wikitable.table-borderless td,
-.wikitable.table-noborder tr:first-child th,
-.wikitable.table-borderless tr:first-child th {
-    border: 0;
+.table-noborder,
+.table-borderless {
+	td, tr:first-child th {
+	    border: 0;
+	}
 }
 
 .table-fit .wikitable {  width:auto; }
 
-.table-striped.wikitable {
+.table-striped {
   > tbody > tr:nth-child(odd) {
     > td,
     > th {
diff --git a/jspwiki-war/src/main/styles/haddock/default/type.less b/jspwiki-war/src/main/styles/haddock/default/type.less
index 40e88e5..f644935 100644
--- a/jspwiki-war/src/main/styles/haddock/default/type.less
+++ b/jspwiki-war/src/main/styles/haddock/default/type.less
@@ -69,8 +69,11 @@ h2,h3,h4 {
 
 }
 
-.sidebar .hashlink, .sidebar .editsection, .panel-title .hashlink { .hidden; }
-
+.sidebar .hashlink,
+.sidebar .editsection,
+.panel-title .hashlink {
+	.hidden;
+}
 
 .lead {
     font-family:@wiki-logo-font-family;
@@ -227,10 +230,10 @@ span.text-white, div.text-white, .bg.dark + .bg-overlay { color:@white; }
 span.text-black, div.text-black, .bg.light + .bg-overlay { color:@black; }
 
 .text-white.shadow {
-  text-shadow: 1px 1px 0 rgba(0,0,0,.25), 0 0 1em @white;
+    text-shadow: 1px 1px 0 rgba(0,0,0,.25), 0 0 1em @white;
 }
 .text-black.shadow {
-  text-shadow: 1px 1px 0 rgba(255,255,255,.25), 0 0 1em @white;
+    text-shadow: 1px 1px 0 rgba(255,255,255,.25), 0 0 1em @white;
 }
 
 //checkme - should be defined in bootstrap
@@ -262,13 +265,15 @@ span.text-black, div.text-black, .bg.light + .bg-overlay { color:@black; }
 .bg-gray, .bg-grey  { background-color: @gray; color:@white; }
 .bg-black   { background-color: @black; color:@white; }
 
-/* Background images in jspwiki
-markup
-    %%bg [some image link] /%
+/*
+Background images in jspwiki
+
+Markup
+>    %%bg [some image link] /%
 becomes
-    span.background(.fixed|.cover|.contain)(.top|.bottom|.left|.right)
-    div.background-overlay
-        <wrapping all siblings>
+>    span.background(.fixed|.cover|.contain)(.top|.bottom|.left|.right)
+>    div.background-overlay
+>        <wrapping all siblings>
 */
 .bg > img, .bg > img.inline, .bg > .imageplugin img { display:none; }
 
@@ -330,10 +335,10 @@ pre {
   //better is to set top & bottom margins, in case the previous dom elements is a text node
   //  margin: (@line-height-computed / 2) 0;
 
-  //overwrite bootstratp defaults: use alpha/transparency to also support dark backgrounds.
+  //overwrite bootstrap defaults: use alpha/transparency to also support dark backgrounds.
   //color: @pre-color;
-  background-color: fadeout(@pre-bg,50%);
-  border: 1px solid fadeout(@pre-border-color,50%);
+  background-color: @wiki-pre-bg;
+  border: 1px solid @wiki-pre-border-color;
 
 }
 .small pre {
@@ -351,7 +356,6 @@ tt {
 }
 
 //list-unstyled : bootstrap
-//list-hover
 .list-hover {
     li:hover {
         background-color:@dropdown-link-hover-bg;
@@ -359,7 +363,6 @@ tt {
     }
 }
 .list-nostyle { list-style: none; }
-
 .list-group.raised li { border:none; }
 
 
@@ -670,7 +673,8 @@ span.success, span.information, span.info,  span.warning, span.error, span.dange
 }
 
 .default {
-    .alert-variant(@btn-default-bg; @btn-default-border; @btn-default-color);
+    .alert-variant(@wiki-pre-bg; @wiki-pre-border-color; @btn-default-color);
+
 }
 .success            { .alert-success; }
 .info, .information { .alert-info; }
diff --git a/jspwiki-war/src/main/styles/haddock/default/variables.less b/jspwiki-war/src/main/styles/haddock/default/variables.less
index 1c4772e..14f4783 100644
--- a/jspwiki-war/src/main/styles/haddock/default/variables.less
+++ b/jspwiki-war/src/main/styles/haddock/default/variables.less
@@ -67,6 +67,8 @@ images/feather-small.png   wxh  162x286
 //softer gray-tones
 @pre-bg:                      #f7f7f9; //#f2f2f2;
 @pre-border-color:            #e1e1e8; //#e5e5e5;
+@wiki-pre-bg:                 fadeout(@pre-bg,50%);
+@wiki-pre-border-color:       fadeout(@pre-border-color,50%);
 @panel-default-border:        @pre-border-color;
 @panel-default-heading-bg:    @pre-bg;
 
@@ -75,6 +77,7 @@ images/feather-small.png   wxh  162x286
 // JPSWiki variables
 // Main color scheme
 @wiki-header-bg:    rgba(74,137,220,0.9); //@brand-primary;
+//@wiki-header-bg: -webkit-linear-gradient(108deg,rgba(112,208,238,0.8), rgba(74,137,220,0.9)/*rgba(42,132,210,0.8)*/ 90%);
 
 @wiki-header-color: @white;
 @wiki-page-bg:      @white;
diff --git a/jspwiki-war/src/main/webapp/templates/haddock/GroupTab.jsp b/jspwiki-war/src/main/webapp/templates/haddock/GroupTab.jsp
index b7cc04c..8c39a57 100644
--- a/jspwiki-war/src/main/webapp/templates/haddock/GroupTab.jsp
+++ b/jspwiki-war/src/main/webapp/templates/haddock/GroupTab.jsp
@@ -164,7 +164,7 @@
 
       <c:if test='<%= authMgr.checkPermission( c.getWikiSession(), new GroupPermission( name, "delete" ) ) %>'>
       <%-- <wiki:Permission permission="deleteGroup"> --%>
-        <button class="btn btn-xs btn-danger" onclick="document.deleteGroupForm.group.value ='${group.name}';document.deleteGroupForm.ok.click();">
+        <button class="btn btn-xs btn-danger" type="button" onclick="document.deleteGroupForm.group.value ='${group.name}';document.deleteGroupForm.ok.click();">
           <fmt:message key="actions.deletegroup"/>
         </button>
       <%--</wiki:Permission>--%>
diff --git a/jspwiki-war/src/main/webapp/templates/haddock/Header.jsp b/jspwiki-war/src/main/webapp/templates/haddock/Header.jsp
index db4bc57..ed80787 100644
--- a/jspwiki-war/src/main/webapp/templates/haddock/Header.jsp
+++ b/jspwiki-war/src/main/webapp/templates/haddock/Header.jsp
@@ -33,7 +33,7 @@
 
   <div class="topline">
 
-    <div class="cage pull-left">
+    <div class="cage pull-left" tabindex="0">
 
     <a class="logo pull-left"
         href="<wiki:Link page='${frontpage}' format='url' />"
@@ -60,16 +60,12 @@
           <c:when test="${not empty fn:substringBefore(param.page,'_comments_')}">
             <wiki:Link>${fn:replace(fn:replace(param.page,'_comments_',' ['),'_','#')}]</wiki:Link>
           </c:when>
-          <c:otherwise><a href="#top"><wiki:PageName /></a></c:otherwise>
+          <c:otherwise><a href="#top" tabindex="-1"><wiki:PageName /></a></c:otherwise>
         </c:choose>
 
     </div>
 
   </div>
-  <div class="breadcrumb">
-    <fmt:message key="header.yourtrail"/><wiki:Breadcrumbs separator="<span class='divider'></span>" />
-  </div>
-
   <wiki:Include page="Nav.jsp" />
 
 </div>
\ No newline at end of file
diff --git a/jspwiki-war/src/main/webapp/templates/haddock/Nav.jsp b/jspwiki-war/src/main/webapp/templates/haddock/Nav.jsp
index 2e8a428..2d44757 100644
--- a/jspwiki-war/src/main/webapp/templates/haddock/Nav.jsp
+++ b/jspwiki-war/src/main/webapp/templates/haddock/Nav.jsp
@@ -37,6 +37,29 @@
 <ul class="nav nav-pills pull-left">
   <%-- toggle sidebar --%>
   <li id="menu"><a href="#"><!--&#x2261;-->&#9776;</a></li>
+
+  <li id="trail" tabindex="0">
+    <a href="#">
+        <span>&hellip;</span>
+        <span>&hellip;</span>
+        <span class="caret"></span>
+    </a>
+    <ul class="dropdown-menu" data-hover-parent="li">
+      <li class="dropdown-header"><fmt:message key="header.yourtrail"/></li>
+      <li class="divider"></li>
+
+      <%--  FIXME: breadcrumbs tag returns items in wrong order: 1st item is at back of the list !!
+      <li><wiki:Breadcrumbs separator="</li><li>" /></li>
+      --%>
+      <c:set var="refresh_breadCrumbTrail_attr"><wiki:Breadcrumbs /></c:set>
+      <c:forEach items="${breadCrumbTrail}" varStatus="status" begin="2">
+          <c:set var="crumb" value="${breadCrumbTrail[fn:length(breadCrumbTrail) - status.index]}" />
+          <li><wiki:Link page="${crumb}" >${crumb}</wiki:Link></li>
+      </c:forEach>
+
+    </ul>
+  </li>
+
 </ul>
 
 <ul class="nav nav-pills pull-right">
@@ -87,7 +110,7 @@
   <%-- info --%>
   <wiki:CheckRequestContext context='view|info|upload|rename|edit|comment|conflict'>
   <wiki:PageExists>
-  <li id="info">
+  <li id="info" tabindex="0">
     <wiki:Link context="info" accessKey="i">
       <span class="icon-info-menu"></span>
       <span><fmt:message key='info.tab'/></span>
@@ -188,7 +211,7 @@
 
 
   <%-- more menu --%>
-  <li id="more">
+  <li id="more" tabindex="0">
     <a href="#">
         <span class="icon-ellipsis-v"></span>
         <span><fmt:message key="actions.more"/></span>
diff --git a/jspwiki-war/src/main/webapp/templates/haddock/SearchBox.jsp b/jspwiki-war/src/main/webapp/templates/haddock/SearchBox.jsp
index 630381c..bc032af 100644
--- a/jspwiki-war/src/main/webapp/templates/haddock/SearchBox.jsp
+++ b/jspwiki-war/src/main/webapp/templates/haddock/SearchBox.jsp
@@ -25,10 +25,11 @@
 <%-- Powered by wiki/Findpages.js and wiki/Recents.js  --%>
 <form action="<wiki:Link jsp='Search.jsp' format='url'/>"
   class="form-inline searchbox pull-right"
-  id="searchForm"
+  id="searchForm" tabindex="0"
   accept-charset="<wiki:ContentEncoding />">
 
-  <div class="btn"><span class="icon-search"></span><span class="caret"></span></div>
+  <%-- the onclick="" is needed for hover effect on ipad https://www.codehaven.co.uk/fix-css-hover-on-iphone-ipad/ --%>
+  <div onclick="" class="btn"><span class="icon-search"></span><span class="caret"></span></div>
 
   <ul class="dropdown-menu" data-hover-parent=".searchbox">
     <li class="dropdown-header">
diff --git a/jspwiki-war/src/main/webapp/templates/haddock/UserBox.jsp b/jspwiki-war/src/main/webapp/templates/haddock/UserBox.jsp
index 62686bf..62c253d 100644
--- a/jspwiki-war/src/main/webapp/templates/haddock/UserBox.jsp
+++ b/jspwiki-war/src/main/webapp/templates/haddock/UserBox.jsp
@@ -31,9 +31,10 @@
 <c:set var="username"><wiki:UserName /></c:set>
 <c:set var="loginstatus"><wiki:Variable var='loginstatus'/></c:set>
 
-<div class="cage pull-right userbox user-${loginstatus}">
+<div class="cage pull-right userbox user-${loginstatus}" tabindex="0">
 
-  <div class="btn"><span class="icon-user"></span><span class="caret"></span></div>
+  <%-- the onclick="" is needed for hover effect on ipad https://www.codehaven.co.uk/fix-css-hover-on-iphone-ipad/ --%>
+  <div onclick="" class="btn"><span class="icon-user"></span><span class="caret"></span></div>
 
   <ul class="dropdown-menu pull-right" data-hover-parent=".userbox">
 
diff --git a/jspwiki-war/src/main/webapp/templates/haddock/commonheader.jsp b/jspwiki-war/src/main/webapp/templates/haddock/commonheader.jsp
index 7fc9668..d0bc153 100644
--- a/jspwiki-war/src/main/webapp/templates/haddock/commonheader.jsp
+++ b/jspwiki-war/src/main/webapp/templates/haddock/commonheader.jsp
@@ -78,8 +78,7 @@ String.I18N.PREFIX = "javascript.";
 <meta name="wikiPageUrl" content='<wiki:Link format="url"  page="#$%"/>' />
 <meta name="wikiEditUrl" content='<wiki:EditLink format="url" page="#$%"/>' />
 <meta name="wikiCloneUrl" content='<wiki:EditLink format="url" page="#$%"/>&clone=<wiki:Variable var="pagename" />' />
-<meta name="wikiAttachmentUrl" content='<wiki:Link format="url" page="#$%/#$%.#$%"/>' />
-<meta name="wikiJsonUrl" content='<%=  WikiContext.findContext(pageContext).getURL( WikiContext.NONE, "ajax" ) %>' /><%--unusual pagename--%>
+<meta name="wikiJsonUrl" content='<%= WikiContext.findContext(pageContext).getURL( WikiContext.NONE, "ajax" ) %>' /><%--unusual pagename--%>
 <meta name="wikiPageName" content='<wiki:Variable var="pagename" />' /><%--pagename without blanks--%>
 <meta name="wikiUserName" content='<wiki:UserName />' />
 <meta name="wikiTemplateUrl" content='<wiki:Link format="url" templatefile="" />' />
diff --git a/jspwiki-war/src/main/webapp/templates/haddock/editors/plain.jsp b/jspwiki-war/src/main/webapp/templates/haddock/editors/plain.jsp
index 7601e06..fd9cce4 100644
--- a/jspwiki-war/src/main/webapp/templates/haddock/editors/plain.jsp
+++ b/jspwiki-war/src/main/webapp/templates/haddock/editors/plain.jsp
@@ -134,7 +134,7 @@
 
     <wiki:CheckRequestContext context="edit">
     <div class="btn-group sections">
-      <button class="btn btn-default"><span class="icon-bookmark"></span><span class="caret"></span></button>
+      <button class="btn btn-default" type="button"><span class="icon-bookmark"></span><span class="caret"></span></button>
       <ul class="dropdown-menu" data-hover-parent="div">
             <li><a>first</a></li>
             <li><a>..</a></li>
@@ -144,18 +144,18 @@
     </div>
     </wiki:CheckRequestContext>
 
-    <button class="btn btn-default" data-cmd="lipstick"><span class="icon-tint" /></button>
-    <button class="btn btn-default" data-cmd="find"><span class="icon-search" /></button>
+    <button class="btn btn-default" type="button" data-cmd="lipstick"><span class="icon-tint" /></button>
+    <button class="btn btn-default" type="button" data-cmd="find"><span class="icon-search" /></button>
 
 
     <fmt:message key='editor.plain.undo.title' var='msg'/>
-    <button class="btn btn-default" data-cmd="undo" title="${msg}"><span class="icon-undo"></span></button>
+    <button class="btn btn-default" type="button" data-cmd="undo" title="${msg}"><span class="icon-undo"></span></button>
     <fmt:message key='editor.plain.redo.title' var='msg'/>
-    <button class="btn btn-default" data-cmd="redo" title="${msg}"><span class="icon-repeat"></span></button>
+    <button class="btn btn-default" type="button" data-cmd="redo" title="${msg}"><span class="icon-repeat"></span></button>
 
     <div class="btn-group config">
       <%-- note: 'dropdown-toggle' is only here to style the last button properly! --%>
-      <button class="btn btn-default"><span class="icon-wrench"></span><span class="caret"></span></button>
+      <button class="btn btn-default" type="button"><span class="icon-wrench"></span><span class="caret"></span></button>
       <ul class="dropdown-menu" data-hover-parent="div">
 
             <li>
@@ -223,7 +223,7 @@
     <c:if test='${fn:length(editors) > 1}'>
     <div class="btn-group config">
       <%-- note: 'dropdown-toggle' is only here to style the last button properly! --%>
-      <button class="btn btn-default"><span class="icon-pencil"></span><span class="caret"></span></button>
+      <button class="btn btn-default" type="button"><span class="icon-pencil"></span><span class="caret"></span></button>
       <ul class="dropdown-menu" data-hover-parent="div">
         <c:forEach items="${editors}" var="edt">
           <c:choose>

-- 
To stop receiving notification emails like this one, please contact
brushed@apache.org.