summaryrefslogtreecommitdiff
path: root/skins
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2014-06-05 09:18:07 +0200
committerThomas Bruederli <thomas@roundcube.net>2014-06-05 09:18:07 +0200
commit99cdca46b7bcc46fe6affd9e9f9f60a546b2e5b8 (patch)
treee3d0bec8e981825e98681fb4d5ec1ec73ee65c40 /skins
parent17a76c3fd7665e92d2160f2178e31b3821a98e1e (diff)
parent3412e50b54e3daac8745234e21ab6e72be0ed165 (diff)
Merge branch 'dev-accessibility'
Conflicts: program/include/rcmail_output_html.php program/js/app.js program/js/treelist.js program/lib/Roundcube/html.php skins/larry/styles.css skins/larry/templates/compose.html
Diffstat (limited to 'skins')
-rw-r--r--skins/classic/addressbook.css5
-rw-r--r--skins/classic/common.css5
-rw-r--r--skins/classic/mail.css169
-rw-r--r--skins/larry/addressbook.css51
-rw-r--r--skins/larry/includes/footer.html1
-rw-r--r--skins/larry/includes/header.html18
-rw-r--r--skins/larry/includes/mailtoolbar.html58
-rw-r--r--skins/larry/includes/settingstabs.html8
-rw-r--r--skins/larry/mail.css208
-rw-r--r--skins/larry/settings.css101
-rw-r--r--skins/larry/styles.css206
-rw-r--r--skins/larry/templates/addressbook.html118
-rw-r--r--skins/larry/templates/compose.html126
-rw-r--r--skins/larry/templates/contactedit.html5
-rw-r--r--skins/larry/templates/folders.html25
-rw-r--r--skins/larry/templates/identities.html12
-rw-r--r--skins/larry/templates/importcontacts.html2
-rw-r--r--skins/larry/templates/login.html10
-rw-r--r--skins/larry/templates/mail.html148
-rw-r--r--skins/larry/templates/message.html46
-rw-r--r--skins/larry/templates/messageerror.html14
-rw-r--r--skins/larry/templates/messagepart.html14
-rw-r--r--skins/larry/templates/messagepreview.html68
-rw-r--r--skins/larry/templates/responses.html12
-rw-r--r--skins/larry/templates/settings.html11
-rw-r--r--skins/larry/ui.js334
26 files changed, 990 insertions, 785 deletions
diff --git a/skins/classic/addressbook.css b/skins/classic/addressbook.css
index ebf9ab9d9..30052585a 100644
--- a/skins/classic/addressbook.css
+++ b/skins/classic/addressbook.css
@@ -279,6 +279,11 @@ body.iframe,
padding: 0;
}
+#contacthead > legend
+{
+ display: none;
+}
+
#contacthead .names span.namefield,
#contacthead .names input
{
diff --git a/skins/classic/common.css b/skins/classic/common.css
index 813df9ed3..cc1f3e60a 100644
--- a/skins/classic/common.css
+++ b/skins/classic/common.css
@@ -609,6 +609,7 @@ img.uploading
/***** common table settings ******/
+table.records-table thead tr th,
table.records-table thead tr td
{
height: 20px;
@@ -619,6 +620,7 @@ table.records-table thead tr td
background: url(images/listheader.gif) top left repeat-x #CCC;
font-size: 11px;
font-weight: bold;
+ text-align: left;
}
table.records-table tbody tr td
@@ -629,7 +631,8 @@ table.records-table tbody tr td
white-space: nowrap;
border-bottom: 1px solid #EBEBEB;
overflow: hidden;
- text-align: left;
+ text-align: left;
+ outline: none;
}
table.records-table tr
diff --git a/skins/classic/mail.css b/skins/classic/mail.css
index a0d1f17cd..4c4e5d968 100644
--- a/skins/classic/mail.css
+++ b/skins/classic/mail.css
@@ -719,6 +719,7 @@ table.messagelist.fixedcopy
z-index: 2;
}
+.messagelist thead tr th,
.messagelist thead tr td
{
height: 20px;
@@ -729,25 +730,26 @@ table.messagelist.fixedcopy
background: url(images/listheader.gif) top left repeat-x #CCC;
font-size: 11px;
font-weight: bold;
+ text-align: left;
}
-.messagelist thead tr td.sortedASC,
-.messagelist thead tr td.sortedDESC
+.messagelist thead tr > .sortedASC,
+.messagelist thead tr > .sortedDESC
{
background-position: 0 -26px;
}
-.messagelist thead tr td.sortedASC a
+.messagelist thead tr > .sortedASC a
{
background: url(images/icons/sort.gif) right 0 no-repeat;
}
-.messagelist thead tr td.sortedDESC a
+.messagelist thead tr > .sortedDESC a
{
background: url(images/icons/sort.gif) right -14px no-repeat;
}
-.messagelist thead tr td a
+.messagelist thead tr a
{
display: block;
width: auto !important;
@@ -756,18 +758,19 @@ table.messagelist.fixedcopy
text-decoration: none;
}
-.messagelist thead tr td.size.sortedASC a,
-.messagelist thead tr td.size.sortedDESC a
+.messagelist thead tr > .size.sortedASC a,
+.messagelist thead tr > .size.sortedDESC a
{
padding-right: 18px;
}
-.messagelist thead tr td.subject
+.messagelist thead tr > .subject
{
padding-left: 18px;
width: 99%;
}
+.messagelist tbody tr th,
.messagelist tbody tr td
{
height: 20px;
@@ -780,6 +783,7 @@ table.messagelist.fixedcopy
-o-text-overflow: ellipsis;
border-bottom: 1px solid #EBEBEB;
cursor: default;
+ outline: none;
}
.messagelist tbody tr td a
@@ -803,40 +807,42 @@ table.messagelist.fixedcopy
cursor: pointer;
}
-.messagelist tr td.flag span,
-.messagelist tr td.status span,
-.messagelist tr td.attachment span,
-.messagelist tr td.priority span
+.messagelist tr > .flag span,
+.messagelist tr > .status span,
+.messagelist tr > .attachment span,
+.messagelist tr > .priority span
{
display: block;
width: 15px;
+ text-indent: -5000px;
+ overflow: hidden;
}
.messagelist tr td div.collapsed,
.messagelist tr td div.expanded,
-.messagelist tr td.threads div.listmenu,
-.messagelist tr td.attachment span.attachment,
-.messagelist tr td.attachment span.report,
-.messagelist tr td.priority span.priority,
-.messagelist tr td.priority span.prio1,
-.messagelist tr td.priority span.prio2,
-.messagelist tr td.priority span.prio3,
-.messagelist tr td.priority span.prio4,
-.messagelist tr td.priority span.prio5,
-.messagelist tr td.flag span.flagged,
-.messagelist tr td.flag span.unflagged,
-.messagelist tr td.flag span.unflagged:hover,
-.messagelist tr td.status span.status,
-.messagelist tr td.status span.msgicon,
-.messagelist tr td.status span.deleted,
-.messagelist tr td.status span.unread,
-.messagelist tr td.status span.unreadchildren,
-.messagelist tr td.subject span.msgicon,
-.messagelist tr td.subject span.deleted,
-.messagelist tr td.subject span.unread,
-.messagelist tr td.subject span.replied,
-.messagelist tr td.subject span.forwarded,
-.messagelist tr td.subject span.unreadchildren
+.messagelist tr > .threads .listmenu,
+.messagelist tr > .attachment span.attachment,
+.messagelist tr > .attachment span.report,
+.messagelist tr > .priority span.priority,
+.messagelist tr > .priority span.prio1,
+.messagelist tr > .priority span.prio2,
+.messagelist tr > .priority span.prio3,
+.messagelist tr > .priority span.prio4,
+.messagelist tr > .priority span.prio5,
+.messagelist tr > .flag span.flagged,
+.messagelist tr > .flag span.unflagged,
+.messagelist tr > .flag span.unflagged:hover,
+.messagelist tr > .status span.status,
+.messagelist tr > .status span.msgicon,
+.messagelist tr > .status span.deleted,
+.messagelist tr > .status span.unread,
+.messagelist tr > .status span.unreadchildren,
+.messagelist tr > .subject span.msgicon,
+.messagelist tr > .subject span.deleted,
+.messagelist tr > .subject span.unread,
+.messagelist tr > .subject span.replied,
+.messagelist tr > .subject span.forwarded,
+.messagelist tr > .subject span.unreadchildren
{
display: inline-block;
vertical-align: middle;
@@ -845,99 +851,99 @@ table.messagelist.fixedcopy
background: url(images/messageicons.png) center no-repeat;
}
-.messagelist tr td.attachment span.attachment
+.messagelist tr > .attachment span.attachment
{
background-position: 0 -170px;
}
-.messagelist tr td.attachment span.report
+.messagelist tr > .attachment span.report
{
background-position: 0 -255px;
}
-.messagelist tr td.priority span.priority
+.messagelist tr > .priority span.priority
{
background-position: 0 -309px;
}
-.messagelist tr td.priority span.prio5
+.messagelist tr > .priority span.prio5
{
background-position: 0 -358px;
}
-.messagelist tr td.priority span.prio4
+.messagelist tr > .priority span.prio4
{
background-position: 0 -340px;
}
-.messagelist tr td.priority span.prio3
+.messagelist tr > .priority span.prio3
{
background-position: 0 -324px;
}
-.messagelist tr td.priority span.prio2
+.messagelist tr > .priority span.prio2
{
background-position: 0 -309px;
}
-.messagelist tr td.priority span.prio1
+.messagelist tr > .priority span.prio1
{
background-position: 0 -290px;
}
-.messagelist tr td.flag span.flagged
+.messagelist tr > .flag span.flagged
{
background-position: 0 -153px;
}
-.messagelist tr td.flag span.unflagged:hover
+.messagelist tr > .flag span.unflagged:hover
{
background-position: 0 -136px;
}
-.messagelist tr td.subject span.msgicon,
-.messagelist tr td.subject span.unreadchildren
+.messagelist tr > .subject span.msgicon,
+.messagelist tr > .subject span.unreadchildren
{
background-position: 0 -51px;
margin: 0 2px;
}
-.messagelist tr td.subject span.replied
+.messagelist tr > .subject span.replied
{
background-position: 0 -85px;
}
-.messagelist tr td.subject span.forwarded
+.messagelist tr > .subject span.forwarded
{
background-position: 0 -68px;
}
-.messagelist tr td.subject span.replied.forwarded
+.messagelist tr > .subject span.replied.forwarded
{
background-position: 0 -102px;
}
-.messagelist tr td.status span.msgicon,
-.messagelist tr td.flag span.unflagged,
-.messagelist tr td.status span.unreadchildren
+.messagelist tr > .status span.msgicon,
+.messagelist tr > .flag span.unflagged,
+.messagelist tr > .status span.unreadchildren
{
background-position: 0 17px; /* no icon */
}
-.messagelist tr td.status span.msgicon:hover
+.messagelist tr > .status span.msgicon:hover
{
background-position: 0 -272px;
}
-.messagelist tr td.status span.deleted,
-.messagelist tr td.subject span.deleted
+.messagelist tr > .status span.deleted,
+.messagelist tr > .subject span.deleted
{
background-position: 0 -187px;
}
-.messagelist tr td.status span.status,
-.messagelist tr td.status span.unread,
-.messagelist tr td.subject span.unread
+.messagelist tr > .status span.status,
+.messagelist tr > .status span.unread,
+.messagelist tr > .subject span.unread
{
background-position: 0 -119px;
}
@@ -954,10 +960,12 @@ table.messagelist.fixedcopy
cursor: pointer;
}
-.messagelist tr td.threads div.listmenu
+.messagelist tr > .threads .listmenu
{
background-position: 0 -238px;
cursor: pointer;
+ overflow: hidden;
+ text-indent: -5000px;
}
.messagelist tbody tr td.subject
@@ -977,45 +985,45 @@ table.messagelist.fixedcopy
text-decoration: underline;
}
-.messagelist tr td.attachment,
-.messagelist tr td.threads,
-.messagelist tr td.status,
-.messagelist tr td.flag,
-.messagelist tr td.priority
+.messagelist tr > .attachment,
+.messagelist tr > .threads,
+.messagelist tr > .status,
+.messagelist tr > .flag,
+.messagelist tr > .priority
{
width: 17px;
padding: 0 0 0 2px;
}
-.messagelist tr td.size
+.messagelist tr > .size
{
width: 60px;
text-align: right;
padding: 0 2px;
}
-.messagelist tr td.fromto,
-.messagelist tr td.from,
-.messagelist tr td.to,
-.messagelist tr td.cc,
-.messagelist tr td.replyto
+.messagelist tr > .fromto,
+.messagelist tr > .from,
+.messagelist tr > .to,
+.messagelist tr > .cc,
+.messagelist tr > .replyto
{
width: 180px;
padding: 0 2px;
}
-.messagelist tr td.date
+.messagelist tr > .date
{
width: 135px;
padding: 0 2px;
}
-.messagelist tr td.folder
+.messagelist tr > .folder
{
width: 135px;
}
-.messagelist tr td.hidden
+.messagelist tr > .hidden
{
display: none;
}
@@ -1038,6 +1046,7 @@ table.messagelist.fixedcopy
}
/* This padding-left minus the focused padding left should be half of the focused border-left */
+.messagelist thead tr th:first-child,
.messagelist thead tr td:first-child,
.messagelist tbody tr td:first-child {
border-left: 0;
@@ -1058,21 +1067,15 @@ table.messagelist.fixedcopy
.messagelist tr.selected td
{
color: #FFFFFF;
- background-color: #CC3333;
-}
-
-.messagelist tr.unfocused td
-{
- color: #FFFFFF;
background-color: #929292;
}
-.messagelist tr.selected td a
+.messagelist.focus tr.selected td
{
- color: #FFFFFF;
+ background-color: #CC3333;
}
-.messagelist tr.unfocused td a
+.messagelist tr.selected td a
{
color: #FFFFFF;
}
diff --git a/skins/larry/addressbook.css b/skins/larry/addressbook.css
index bfdd68127..0583ce06e 100644
--- a/skins/larry/addressbook.css
+++ b/skins/larry/addressbook.css
@@ -138,56 +138,25 @@
background: url(images/listicons.png) -2px -1180px no-repeat;
}
-/* This padding-left should be equal to the focused border-left + the focused padding-left */
-#contacts-table thead tr td:first-child,
-#contacts-table tbody tr td:first-child {
- border-left: 0;
- padding-left: 36px;
-}
-
-/* because of border-collapse, we make the left border twice what we want it to be - half will be hidden to the left */
-#contacts-table tbody tr.focused > td:first-child {
- border-left: 2px solid #b0ccd7;
- padding-left: 34px;
-}
-
-#contacts-table tbody tr.selected.focused > td:first-child {
- border-left-color: #9ec2d0;
-}
-
#contacts-table .contact td.name {
- background-position: 6px -1603px;
-}
-
-#contacts-table .contact.focused td.name {
background-position: 4px -1603px;
}
-#contacts-table .contact.selected td.name,
-#contacts-table .contact.unfocused td.name {
- background-position: 6px -1627px;
- font-weight: bold;
-}
-
-#contacts-table .contact.selected.focused td.name {
+#contacts-table .contact.selected td.name {
background-position: 4px -1627px;
+ font-weight: bold;
}
#contacts-table .group td.name {
- background-position: 6px -1555px;
-}
-
-#contacts-table .group.focused td.name {
background-position: 4px -1555px;
}
-#contacts-table .group.selected td.name,
-#contacts-table .group.unfocused td.name {
- background-position: 6px -1579px;
+#contacts-table .group.selected td.name {
+ background-position: 4px -1579px;
font-weight: bold;
}
-#contacts-table .group.selected.focused td.name {
+#contacts-table.focus .group.selected.focused td.name {
background-position: 4px -1579px;
}
@@ -232,6 +201,8 @@
float: left;
margin: 0 18px 20px 0;
width: 112px;
+ border: 0;
+ padding: 0;
}
#contactpic {
@@ -267,6 +238,10 @@
opacity: 0.05;
}
+#contactphoto .formlinks a[aria-disabled='true'] {
+ visibility: hidden;
+}
+
#contacthead {
border: 0;
margin: 0 16em 1em 0;
@@ -275,6 +250,10 @@
font-size: 12px;
}
+#contacthead > legend {
+ display: none;
+}
+
form #contacthead {
margin-right: 0;
}
diff --git a/skins/larry/includes/footer.html b/skins/larry/includes/footer.html
index f421ec5b0..6cd3e62d1 100644
--- a/skins/larry/includes/footer.html
+++ b/skins/larry/includes/footer.html
@@ -6,6 +6,7 @@
var UI = new rcube_mail_ui();
$(document).ready(function(){
UI.set('errortitle', '<roundcube:label name="errortitle" quoting="javascript" />');
+ UI.set('toggleoptions', '<roundcube:label name="toggleadvancedoptions" quoting="javascript" />');
UI.init();
});
diff --git a/skins/larry/includes/header.html b/skins/larry/includes/header.html
index 69e8b8aa6..179b86002 100644
--- a/skins/larry/includes/header.html
+++ b/skins/larry/includes/header.html
@@ -1,5 +1,6 @@
<div id="header">
-<div id="topline">
+<div id="topline" role="banner" aria-labelledby="aria-label-topnav">
+ <h2 id="aria-label-topnav" class="voice"><roundcube:label name="arialabeltopnav" /></h2>
<div class="topleft">
<roundcube:container name="topline-left" id="topline-left" />
<roundcube:button name="about" type="link" label="about" class="about-link" onclick="UI.show_about(this);return false" condition="!env:extwin" />
@@ -21,13 +22,14 @@
<roundcube:if condition="!env:extwin &amp;&amp; !env:framed" />
<div id="topnav">
- <div id="taskbar" class="topright">
- <roundcube:button command="mail" label="mail" class="button-mail" classSel="button-mail button-selected" innerClass="button-inner" />
- <roundcube:button command="addressbook" label="addressbook" class="button-addressbook" classSel="button-addressbook button-selected" innerClass="button-inner" />
- <roundcube:container name="taskbar" id="taskbar" />
- <roundcube:button command="settings" label="settings" class="button-settings" classSel="button-settings button-selected" innerClass="button-inner" />
- <roundcube:button command="logout" label="logout" class="button-logout" classSel="button-logout" innerClass="button-inner" />
- <span class="minmodetoggle"></span>
+ <h2 id="aria-label-tasknav" class="voice"><roundcube:label name="arialabeltasknav" /></h2>
+ <div id="taskbar" class="topright" role="navigation" aria-labelledby="aria-label-tasknav">
+ <roundcube:button command="mail" label="mail" class="button-mail" classSel="button-mail button-selected" innerClass="button-inner" />
+ <roundcube:button command="addressbook" label="addressbook" class="button-addressbook" classSel="button-addressbook button-selected" innerClass="button-inner" />
+ <roundcube:container name="taskbar" id="taskbar" />
+ <roundcube:button command="settings" label="settings" class="button-settings" classSel="button-settings button-selected" innerClass="button-inner" />
+ <roundcube:button command="logout" label="logout" class="button-logout" classSel="button-logout" innerClass="button-inner" />
+ <span class="minmodetoggle" role="presentation"></span>
</div>
<roundcube:object name="logo" src="/images/roundcube_logo.png" id="toplogo" alt="Logo" onclick="if(window.rcmail)rcmail.command('switch-task','mail')" />
</div>
diff --git a/skins/larry/includes/mailtoolbar.html b/skins/larry/includes/mailtoolbar.html
index ac08a3200..691345bb4 100644
--- a/skins/larry/includes/mailtoolbar.html
+++ b/skins/larry/includes/mailtoolbar.html
@@ -3,11 +3,11 @@
<roundcube:button command="reply" type="link" class="button reply disabled" classAct="button reply" classSel="button reply pressed" label="reply" title="replytomessage" />
<span class="dropbutton">
<roundcube:button command="reply-all" type="link" class="button reply-all disabled" classAct="button reply-all" classSel="button reply-all pressed" label="replyall" title="replytoallmessage" />
- <span class="dropbuttontip" id="replyallmenulink" onclick="UI.show_popup('replyallmenu');return false"></span>
+ <a href="#reply-all" class="dropbuttontip" id="replyallmenulink" onclick="UI.toggle_popup('replyallmenu',event);return false" aria-haspopup="true" aria-expanded="false" aria-owns="replyallmenu-menu" tabindex="0">Reply-all options</a>
</span>
<span class="dropbutton">
<roundcube:button command="forward" type="link" class="button forward disabled" classAct="button forward" classSel="button forward pressed" label="forward" title="forwardmessage" />
- <span class="dropbuttontip" id="forwardmenulink" onclick="UI.show_popup('forwardmenu');return false"></span>
+ <a href="#forward" class="dropbuttontip" id="forwardmenulink" onclick="UI.toggle_popup('forwardmenu',event);return false" aria-haspopup="true" aria-expanded="false" aria-owns="forwardmenu-menu" tabindex="0">Forwarding options</a>
</span>
<roundcube:button command="delete" type="link" class="button delete disabled" classAct="button delete" classSel="button delete pressed" label="delete" title="deletemessage" />
<roundcube:if condition="template:name == 'message'" />
@@ -15,44 +15,48 @@
<roundcube:button command="print" type="link" class="button print disabled" classAct="button print" classSel="button print pressed" label="print" title="printmessage" />
<roundcube:endif />
<roundcube:container name="toolbar" id="mailtoolbar" />
-<roundcube:button name="markmenulink" id="markmessagemenulink" type="link" class="button markmessage" label="mark" title="markmessages" onclick="UI.show_popup('markmessagemenu');return false" />
-<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button more" label="more" title="moreactions" onclick="UI.show_popup('messagemenu');return false" />
+<roundcube:button name="markmenulink" id="markmessagemenulink" type="link" class="button markmessage" label="mark" title="markmessages" onclick="UI.toggle_popup('markmessagemenu',event);return false" aria-haspopup="true" aria-expanded="false" aria-owns="markmessagemenu-menu" />
+<roundcube:button name="messagemenulink" id="messagemenulink" type="link" class="button more" label="more" title="moreactions" onclick="UI.toggle_popup('messagemenu',event);return false" aria-haspopup="true" aria-expanded="false" aria-owns="messagemenu-menu" />
-<div id="forwardmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><roundcube:button command="forward-inline" label="forwardinline" prop="sub" classAct="forwardlink active" class="forwardlink" /></li>
- <li><roundcube:button command="forward-attachment" label="forwardattachment" prop="sub" classAct="forwardattachmentlink active" class="forwardattachmentlink" /></li>
+<div id="forwardmenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-forwardmenu" class="voice">Forwarding options</h3>
+ <ul id="forwardmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-forwardmenu">
+ <li role="menuitem"><roundcube:button command="forward-inline" label="forwardinline" prop="sub" classAct="forwardlink active" class="forwardlink" /></li>
+ <li role="menuitem"><roundcube:button command="forward-attachment" label="forwardattachment" prop="sub" classAct="forwardattachmentlink active" class="forwardattachmentlink" /></li>
<roundcube:container name="forwardmenu" id="forwardmenu" />
</ul>
</div>
-<div id="replyallmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><roundcube:button command="reply-all" label="replyall" prop="sub" class="replyalllink" classAct="replyalllink active" /></li>
- <li><roundcube:button command="reply-list" label="replylist" prop="sub" class="replylistlink" classAct="replylistlink active" /></li>
+<div id="replyallmenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-replyallmenu" class="voice">Reply-all options</h3>
+ <ul id="replyallmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-replyallmenu">
+ <li role="menuitem"><roundcube:button command="reply-all" label="replyall" prop="sub" class="replyalllink" classAct="replyalllink active" /></li>
+ <li role="menuitem"><roundcube:button command="reply-list" label="replylist" prop="sub" class="replylistlink" classAct="replylistlink active" /></li>
<roundcube:container name="replyallmenu" id="replyallmenu" />
</ul>
</div>
-<div id="messagemenu" class="popupmenu">
- <ul class="toolbarmenu iconized">
- <li><roundcube:button command="print" label="printmessage" class="icon" classAct="icon active" innerclass="icon print" /></li>
- <li><roundcube:button command="download" label="emlsave" class="icon" classAct="icon active" innerclass="icon download" /></li>
- <li><roundcube:button command="edit" prop="new" label="editasnew" class="icon" classAct="icon active" innerclass="icon edit" /></li>
- <li><roundcube:button command="viewsource" label="viewsource" class="icon" classAct="icon active" innerclass="icon viewsource" /></li>
- <li><roundcube:button command="move" label="moveto" class="icon" classAct="icon active" innerclass="icon move folder-selector-link" /></li>
- <li><roundcube:button command="copy" label="copyto" class="icon" classAct="icon active" innerclass="icon copy folder-selector-link" /></li>
- <li><roundcube:button command="open" label="openinextwin" target="_blank" class="icon" classAct="icon active" innerclass="icon extwin" /></li>
+<div id="messagemenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-messagemenu" class="voice">More message toolbar actions</h3>
+ <ul id="messagemenu-menu" class="toolbarmenu iconized" role="menu" aria-labelledby="aria-label-messagemenu">
+ <li role="menuitem"><roundcube:button command="print" label="printmessage" class="icon" classAct="icon active" innerclass="icon print" /></li>
+ <li role="menuitem"><roundcube:button command="download" label="emlsave" class="icon" classAct="icon active" innerclass="icon download" /></li>
+ <li role="menuitem"><roundcube:button command="edit" prop="new" label="editasnew" class="icon" classAct="icon active" innerclass="icon edit" /></li>
+ <li role="menuitem"><roundcube:button command="viewsource" label="viewsource" class="icon" classAct="icon active" innerclass="icon viewsource" /></li>
+ <li role="menuitem"><roundcube:button command="move" label="moveto" class="icon" classAct="icon active" innerclass="icon move folder-selector-link" /></li>
+ <li role="menuitem"><roundcube:button command="copy" label="copyto" class="icon" classAct="icon active" innerclass="icon copy folder-selector-link" /></li>
+ <li role="menuitem"><roundcube:button command="open" label="openinextwin" target="_blank" class="icon" classAct="icon active" innerclass="icon extwin" /></li>
<roundcube:container name="messagemenu" id="messagemenu" />
</ul>
</div>
-<div id="markmessagemenu" class="popupmenu">
- <ul class="toolbarmenu iconized">
- <li><roundcube:button command="mark" prop="read" label="markread" classAct="icon active" class="icon" innerclass="icon read" /></li>
- <li><roundcube:button command="mark" prop="unread" label="markunread" classAct="icon active" class="icon" innerclass="icon unread" /></li>
- <li><roundcube:button command="mark" prop="flagged" label="markflagged" classAct="icon active" class="icon" innerclass="icon flagged" /></li>
- <li><roundcube:button command="mark" prop="unflagged" label="markunflagged" classAct="icon active" class="icon" innerclass="icon unflagged" /></li>
+<div id="markmessagemenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-markmessagemenu" class="voice">Mark selected messages as...</h3>
+ <ul id="markmessagemenu-menu" class="toolbarmenu iconized" role="menu" aria-labelledby="aria-label-markmessagemenu">
+ <li role="menuitem"><roundcube:button command="mark" prop="read" label="markread" classAct="icon active" class="icon" innerclass="icon read" /></li>
+ <li role="menuitem"><roundcube:button command="mark" prop="unread" label="markunread" classAct="icon active" class="icon" innerclass="icon unread" /></li>
+ <li role="menuitem"><roundcube:button command="mark" prop="flagged" label="markflagged" classAct="icon active" class="icon" innerclass="icon flagged" /></li>
+ <li role="menuitem"><roundcube:button command="mark" prop="unflagged" label="markunflagged" classAct="icon active" class="icon" innerclass="icon unflagged" /></li>
<roundcube:container name="markmenu" id="markmessagemenu" />
</ul>
</div>
diff --git a/skins/larry/includes/settingstabs.html b/skins/larry/includes/settingstabs.html
index e62695848..d43e8f075 100644
--- a/skins/larry/includes/settingstabs.html
+++ b/skins/larry/includes/settingstabs.html
@@ -1,7 +1,9 @@
-<div id="settings-sections" class="uibox listbox">
-<h2 class="boxtitle"><roundcube:label name="settings" /></h2>
+<div id="settings-sections" class="uibox listbox" role="navigation" aria-labelledby="aria-label-settingstabs">
+<h2 class="boxtitle" id="aria-label-settingstabs"><roundcube:label name="settings" /></h2>
<div id="settings-tabs" class="scroller">
- <roundcube:object name="settingstabs" class="listitem" />
+ <ul class="listing iconized">
+ <roundcube:object name="settingstabs" class="listitem" tagname="li" />
+ </ul>
<roundcube:container name="tabs" id="settings-tabs" />
</div>
</div>
diff --git a/skins/larry/mail.css b/skins/larry/mail.css
index e258cad88..b82fb790e 100644
--- a/skins/larry/mail.css
+++ b/skins/larry/mail.css
@@ -162,6 +162,7 @@ a.iconbutton.threadmode.selected {
padding-right: 36px;
}
+#mailboxlist li.mailbox > a:focus,
#mailboxlist li.mailbox.selected > a {
background-position: 6px -21px;
}
@@ -170,6 +171,7 @@ a.iconbutton.threadmode.selected {
background-position: 6px -189px;
}
+#mailboxlist li.mailbox.inbox > a:focus,
#mailboxlist li.mailbox.inbox.selected > a {
background-position: 6px -213px;
}
@@ -178,6 +180,7 @@ a.iconbutton.threadmode.selected {
background-position: 6px -238px;
}
+#mailboxlist li.mailbox.drafts > a:focus,
#mailboxlist li.mailbox.drafts.selected > a {
background-position: 6px -262px;
}
@@ -186,6 +189,7 @@ a.iconbutton.threadmode.selected {
background-position: 6px -286px;
}
+#mailboxlist li.mailbox.sent > a:focus,
#mailboxlist li.mailbox.sent.selected > a {
background-position: 6px -310px;
}
@@ -194,6 +198,7 @@ a.iconbutton.threadmode.selected {
background-position: 6px -334px;
}
+#mailboxlist li.mailbox.junk > a:focus,
#mailboxlist li.mailbox.junk.selected > a {
background-position: 6px -358px;
}
@@ -202,6 +207,7 @@ a.iconbutton.threadmode.selected {
background-position: 6px -382px;
}
+#mailboxlist li.mailbox.trash > a:focus,
#mailboxlist li.mailbox.trash.selected > a {
background-position: 6px -406px;
}
@@ -210,6 +216,7 @@ a.iconbutton.threadmode.selected {
background-position: 6px -1924px;
}
+#mailboxlist li.mailbox.trash.empty > a:focus,
#mailboxlist li.mailbox.trash.empty.selected > a {
background-position: 6px -1948px;
}
@@ -218,6 +225,7 @@ a.iconbutton.threadmode.selected {
background-position: 6px -1699px;
}
+#mailboxlist li.mailbox.archive > a:focus,
#mailboxlist li.mailbox.archive.selected > a {
background-position: 6px -1723px;
}
@@ -226,6 +234,7 @@ a.iconbutton.threadmode.selected {
background-position: 23px -238px;
}
+#mailboxlist li.mailbox ul li.drafts > a:focus,
#mailboxlist li.mailbox ul li.drafts.selected > a {
background-position: 23px -262px;
}
@@ -234,6 +243,7 @@ a.iconbutton.threadmode.selected {
background-position: 23px -286px;
}
+#mailboxlist li.mailbox ul li.sent > a:focus,
#mailboxlist li.mailbox ul li.sent.selected > a {
background-position: 23px -310px;
}
@@ -242,6 +252,7 @@ a.iconbutton.threadmode.selected {
background-position: 23px -334px;
}
+#mailboxlist li.mailbox ul li.junk > a:focus,
#mailboxlist li.mailbox ul li.junk.selected > a {
background-position: 23px -358px;
}
@@ -250,6 +261,7 @@ a.iconbutton.threadmode.selected {
background-position: 23px -382px;
}
+#mailboxlist li.mailbox ul li.trash > a:focus,
#mailboxlist li.mailbox ul li.trash.selected > a {
background-position: 23px -406px;
}
@@ -258,6 +270,7 @@ a.iconbutton.threadmode.selected {
background-position: 23px -1924px;
}
+#mailboxlist li.mailbox ul li.trash.empty > a:focus,
#mailboxlist li.mailbox ul li.trash.empty.selected > a {
background-position: 23px -1948px;
}
@@ -266,6 +279,7 @@ a.iconbutton.threadmode.selected {
background-position: 23px -1699px;
}
+#mailboxlist li.mailbox ul li.archive > a:focus,
#mailboxlist li.mailbox ul li.archive.selected > a {
background-position: 23px -1723px;
}
@@ -304,6 +318,7 @@ a.iconbutton.threadmode.selected {
padding-left: 52px; /* 36 + 1 x 16 */
background-position: 22px -95px; /* 6 + 1 x 16 */
}
+#mailboxlist li.mailbox ul li > a:focus,
#mailboxlist li.mailbox ul li.selected > a {
background-position: 22px -119px;
}
@@ -316,6 +331,7 @@ a.iconbutton.threadmode.selected {
padding-left: 68px; /* 2x */
background-position: 38px -95px;
}
+#mailboxlist li.mailbox ul ul li > a:focus,
#mailboxlist li.mailbox ul ul li.selected > a {
background-position: 38px -119px;
}
@@ -327,6 +343,7 @@ a.iconbutton.threadmode.selected {
padding-left: 84px; /* 3x */
background-position: 54px -95px;
}
+#mailboxlist li.mailbox ul ul ul li > a:focus,
#mailboxlist li.mailbox ul ul ul li.selected > a {
background-position: 54px -119px;
}
@@ -338,6 +355,7 @@ a.iconbutton.threadmode.selected {
padding-left: 100px; /* 4x */
background-position: 70px -95px;
}
+#mailboxlist li.mailbox ul ul ul ul li > a:focus,
#mailboxlist li.mailbox ul ul ul ul li.selected > a {
background-position: 70px -119px;
}
@@ -464,66 +482,66 @@ table.messagelist.fixedcopy {
z-index: 2;
}
-.messagelist thead td:first-child {
+.messagelist thead th:first-child {
border-radius: 4px 0 0 0; /* for Chrome */
}
-.messagelist tr td.attachment,
-.messagelist tr td.threads,
-.messagelist tr td.status,
-.messagelist tr td.flag,
-.messagelist tr td.priority {
+.messagelist tr > .attachment,
+.messagelist tr > .threads,
+.messagelist tr > .status,
+.messagelist tr > .flag,
+.messagelist tr > .priority {
width: 20px;
padding: 2px 3px;
}
-.webkit .messagelist tr td.attachment,
-.webkit .messagelist tr td.threads,
-.webkit .messagelist tr td.status,
-.webkit .messagelist tr td.flag,
-.webkit .messagelist tr td.priority {
+.webkit .messagelist tr > .attachment,
+.webkit .messagelist tr > .threads,
+.webkit .messagelist tr > .status,
+.webkit .messagelist tr > .flag,
+.webkit .messagelist tr > .priority {
width: 26px;
}
-.messagelist tr td.threads {
+.messagelist tr > .threads {
width: 26px;
}
-.webkit .messagelist tr td.threads {
+.webkit .messagelist tr > .threads {
width: 30px;
}
-.messagelist tr td.threads,
-.messagelist tr td.threads + td {
+.messagelist tr > .threads,
+.messagelist tr > .threads + td {
border-left: 0;
}
-.messagelist tr td.size {
+.messagelist tr > .size {
width: 60px;
text-align: right;
}
-.messagelist thead tr td.size {
+.messagelist thead tr th.size {
text-align: left;
}
-.messagelist tr td.fromto,
-.messagelist tr td.from,
-.messagelist tr td.to,
-.messagelist tr td.cc,
-.messagelist tr td.replyto {
+.messagelist tr > .fromto,
+.messagelist tr > .from,
+.messagelist tr > .to,
+.messagelist tr > .cc,
+.messagelist tr > .replyto {
width: 200px;
}
-.messagelist tr td.date {
+.messagelist tr > .date {
width: 155px;
}
-.messagelist tr td.folder {
+.messagelist tr > .folder {
width: 135px;
}
-.messagelist tr td.hidden {
+.messagelist tr > .hidden {
display: none;
}
@@ -540,19 +558,22 @@ table.messagelist.fixedcopy {
/* background-color: #fff; */
}
+.messagelist tr.flagged th,
.messagelist tr.flagged td,
.messagelist tr.flagged td a {
color: #f30;
}
-.messagelist thead tr td.sortedASC a,
-.messagelist thead tr td.sortedDESC a {
+.messagelist thead tr th.sortedASC a,
+.messagelist thead tr th.sortedDESC a {
color: #004458;
text-decoration: underline;
- background: url(images/listicons.png) right -912px no-repeat;
+ background-image: url(images/listicons.png);
+ background-repeat: no-repeat;
+ background-position: right -912px;
}
-.messagelist thead tr td.sortedASC a {
+.messagelist thead tr th.sortedASC a {
background-position: right -944px;
}
@@ -574,39 +595,41 @@ table.messagelist.fixedcopy {
cursor: pointer;
}
-.messagelist tr td.flag span,
-.messagelist tr td.status span,
-.messagelist tr td.attachment span,
-.messagelist tr td.priority span {
+.messagelist tr > .flag span,
+.messagelist tr > .status span,
+.messagelist tr > .attachment span,
+.messagelist tr > .priority span {
display: block;
width: 20px;
+ text-indent: -5000px;
+ overflow: hidden;
}
.messagelist tr td div.collapsed,
.messagelist tr td div.expanded,
-.messagelist tr td.threads div.listmenu,
-.messagelist tr td.attachment span.attachment,
-.messagelist tr td.attachment span.report,
-.messagelist tr td.priority span.priority,
-.messagelist tr td.priority span.prio1,
-.messagelist tr td.priority span.prio2,
-.messagelist tr td.priority span.prio3,
-.messagelist tr td.priority span.prio4,
-.messagelist tr td.priority span.prio5,
-.messagelist tr td.flag span.flagged,
-.messagelist tr td.flag span.unflagged,
-.messagelist tr td.flag span.unflagged:hover,
-.messagelist tr td.status span.status,
-.messagelist tr td.status span.msgicon,
-.messagelist tr td.status span.deleted,
-.messagelist tr td.status span.unread,
-.messagelist tr td.status span.unreadchildren,
-.messagelist tr td.subject span.msgicon,
-.messagelist tr td.subject span.deleted,
-.messagelist tr td.subject span.unread,
-.messagelist tr td.subject span.replied,
-.messagelist tr td.subject span.forwarded,
-.messagelist tr td.subject span.unreadchildren {
+.messagelist tr > .threads .listmenu,
+.messagelist tr > .attachment span.attachment,
+.messagelist tr > .attachment span.report,
+.messagelist tr > .priority span.priority,
+.messagelist tr > .priority span.prio1,
+.messagelist tr > .priority span.prio2,
+.messagelist tr > .priority span.prio3,
+.messagelist tr > .priority span.prio4,
+.messagelist tr > .priority span.prio5,
+.messagelist tr > .flag span.flagged,
+.messagelist tr > .flag span.unflagged,
+.messagelist tr > .flag span.unflagged:hover,
+.messagelist tr > .status span.status,
+.messagelist tr > .status span.msgicon,
+.messagelist tr > .status span.deleted,
+.messagelist tr > .status span.unread,
+.messagelist tr > .status span.unreadchildren,
+.messagelist tr > .subject span.msgicon,
+.messagelist tr > .subject span.deleted,
+.messagelist tr > .subject span.unread,
+.messagelist tr > .subject span.replied,
+.messagelist tr > .subject span.forwarded,
+.messagelist tr > .subject span.unreadchildren {
display: inline-block;
vertical-align: middle;
height: 18px;
@@ -619,7 +642,7 @@ table.messagelist.fixedcopy {
background-position: 0 -996px;
}
-.messagelist thead tr td.attachment span.attachment {
+.messagelist thead tr th.attachment span.attachment {
background-position: -24px -997px;
}
@@ -627,7 +650,7 @@ table.messagelist.fixedcopy {
background-position: -24px -1116px;
}
-.messagelist thead tr td.priority span.priority {
+.messagelist thead tr th.priority span.priority {
background-position: -24px -1845px;
}
@@ -651,15 +674,15 @@ table.messagelist.fixedcopy {
background-position: 0 -1036px;
}
-.messagelist thead tr td.flag span.flagged {
+.messagelist thead tr th.flag span.flagged {
background-position: -22px -1036px;
}
-.messagelist tr td.status span.msgicon:hover {
- background-position: -23px -1056px;
+.messagelist tr:hover td.status span.msgicon {
+ background-position: -23px -1057px;
}
-.messagelist tr td.flag span.unflagged:hover {
+.messagelist tr:hover td.flag span.unflagged {
background-position: -23px -1076px;
}
@@ -702,10 +725,10 @@ table.messagelist.fixedcopy {
.messagelist tr td.status span.unread,
.messagelist tr td.subject span.unread,
.messagelist tr td.status span.unread:hover {
- background-position: 0 -1016px;
+ background-position: 0 -1017px;
}
-.messagelist thead tr td.status span.status {
+.messagelist thead tr th.status span.status {
background-position: -23px -1017px;
}
@@ -719,13 +742,23 @@ table.messagelist.fixedcopy {
cursor: pointer;
}
-.messagelist tr td.threads div.listmenu {
- background-position: 0 -976px;
+.messagelist tr th.threads .listmenu {
+ background-position: 4px -972px;
cursor: pointer;
- width: 26px;
+ width: 24px;
+ height: 21px;
+ overflow: hidden;
+ text-indent: -5000px;
+ margin: -3px -5px -2px -6px;
+ padding: 3px 5px 2px 6px;
+}
+
+.messagelist tr th.threads .listmenu:focus {
+ background-color: rgba(73,180,210,0.7);
+ outline: none;
}
-.messagelist thead tr td.subject,
+.messagelist thead tr th.subject,
.messagelist tbody tr td.subject {
width: 99%;
white-space: nowrap;
@@ -909,6 +942,16 @@ h3.subject {
border-radius: 3px 0 0 0; /* for Opera */
}
+.moreheaderstoggle:focus {
+ background: #f2f2f2;
+ background: -moz-linear-gradient(left, #66bcd9 0, #49b3d2 100%);
+ background: -webkit-gradient(linear, left top, right top, color-stop(0,#66bcd9), color-stop(100%,#49b3d2));
+ background: -o-linear-gradient(left, #66bcd9 0, #49b3d2 100%);
+ background: -ms-linear-gradient(left, #66bcd9 0, #49b3d2 100%);
+ background: linear-gradient(left, #66bcd9 0, #49b3d2 100%);
+ border-right-color: #149cc5;
+}
+
.moreheaderstoggle .iconlink {
display: inline-block;
position: absolute;
@@ -1303,13 +1346,19 @@ div.message-partheaders .headers-table td.header {
margin-left: 0.5em;
}
-#compose-contacts li a, #contacts-table td {
- background: url(images/listicons.png) -100px 0 no-repeat;
+#compose-contacts li a,
+#contacts-table td {
+ background-image: url(images/listicons.png);
+ background-position: -100px 0;
+ background-repeat: no-repeat;
overflow: hidden;
- padding-left: 36px;
text-overflow: ellipsis;
}
+#compose-contacts li a {
+ padding-left: 36px;
+}
+
#contacts-table td.contactgroup a {
color: #376572;
text-decoration: none;
@@ -1331,6 +1380,7 @@ div.message-partheaders .headers-table td.header {
background-position: 6px -766px;
}
+#compose-contacts li.addressbook a:focus,
#compose-contacts li.addressbook.selected a {
background-position: 6px -791px;
}
@@ -1339,20 +1389,36 @@ div.message-partheaders .headers-table td.header {
background-position: 6px -1555px;
}
+#contacts-table.focus tr.focused td.contactgroup {
+ background-position: 4px -1555px;
+}
+
#contacts-table tr.unfocused td.contactgroup,
#contacts-table tr.selected td.contactgroup {
background-position: 6px -1579px;
}
+#contacts-table.focus tr.selected.focused td.contactgroup {
+ background-position: 4px -1579px;
+}
+
#contacts-table td.contact {
background-position: 6px -1603px;
}
+#contacts-table.focus tr.focused td.contact {
+ background-position: 4px -1603px;
+}
+
#contacts-table tr.unfocused td.contact,
#contacts-table tr.selected td.contact {
background-position: 6px -1627px;
}
+#contacts-table.focus tr.selected.focused td.contact {
+ background-position: 4px -1627px;
+}
+
#compose-content {
position: absolute;
top: 0;
diff --git a/skins/larry/settings.css b/skins/larry/settings.css
index 6d4d13ca4..1ac62cd31 100644
--- a/skins/larry/settings.css
+++ b/skins/larry/settings.css
@@ -70,7 +70,7 @@
width: 20px;
height: 18px;
background: url('images/listicons.png') 0 -1157px no-repeat;
- text-indent: 1000px;
+ text-indent: -5000px;
overflow: hidden;
}
@@ -78,9 +78,10 @@
background-position: -24px -1137px;
}
-#sections-table tbody td.section,
-#settings-sections span.listitem a,
-#settings-sections span.tablink a {
+#sections-table tbody td,
+#sections-table .listitem span,
+#settings-sections .listitem a,
+#settings-sections .tablink a {
padding-left: 36px;
background-image: url(images/listicons.png);
background-position: -100px 0;
@@ -88,120 +89,120 @@
}
/* note: support span.tablink because this is used by plugins */
-#settings-sections span.listitem a,
-#settings-sections span.tablink a {
+#settings-sections .listitem a,
+#settings-sections .tablink a {
background-position: 6px -862px;
}
-#settings-sections span.selected a,
-#settings-sections span.tablink.selected a {
+#settings-sections .selected a,
+#settings-sections .tablink.selected a {
background-position: 6px -887px;
}
-#settings-sections span.preferences a {
+#settings-sections .preferences a {
background-position: 6px -431px;
}
-#settings-sections span.preferences.selected a {
+#settings-sections .preferences.selected a {
background-position: 6px -455px;
}
-#settings-sections span.folders a,
-#sections-table #rcmrowfolders td.section {
+#settings-sections .folders a,
+#sections-table #rcmrowfolders .section {
background-position: 6px 2px;
}
-#settings-sections span.folders.selected a,
-#sections-table #rcmrowfolders.selected td.section {
+#settings-sections .folders.selected a,
+#sections-table #rcmrowfolders.selected .section {
background-position: 6px -22px;
}
-#settings-sections span.identities a {
+#settings-sections .identities a {
background-position: 6px -478px;
}
-#settings-sections span.identities.selected a {
+#settings-sections .identities.selected a {
background-position: 6px -502px;
}
-#settings-sections span.filter a {
+#settings-sections .filter a {
background-position: 6px -1746px;
}
-#settings-sections span.filter.selected a {
+#settings-sections .filter.selected a {
background-position: 6px -1770px;
}
-#settings-sections span.password a {
+#settings-sections .password a {
background-position: 6px -1795px;
}
-#settings-sections span.password.selected a {
+#settings-sections .password.selected a {
background-position: 6px -1819px;
}
-#settings-sections span.responses a {
+#settings-sections .responses a {
background-position: 6px -1972px;
}
-#settings-sections span.responses.selected a {
+#settings-sections .responses.selected a {
background-position: 6px -1996px;
}
-#sections-table #rcmrowgeneral td.section {
- background-position: 6px -573px;
+#sections-table #rcmrowgeneral .section {
+ background-position: 4px -573px;
}
-#sections-table #rcmrowgeneral.selected td.section {
- background-position: 6px -598px;
+#sections-table #rcmrowgeneral.selected .section {
+ background-position: 4px -598px;
}
-#sections-table #rcmrowmailbox td.section {
- background-position: 6px -621px;
+#sections-table #rcmrowmailbox .section {
+ background-position: 4px -621px;
}
-#sections-table #rcmrowmailbox.selected td.section {
- background-position: 6px -646px;
+#sections-table #rcmrowmailbox.selected .section {
+ background-position: 4px -646px;
}
-#sections-table #rcmrowcompose td.section {
- background-position: 6px -670px;
+#sections-table #rcmrowcompose .section {
+ background-position: 4px -670px;
}
-#sections-table #rcmrowcompose.selected td.section {
- background-position: 6px -695px;
+#sections-table #rcmrowcompose.selected .section {
+ background-position: 4px -695px;
}
-#sections-table #rcmrowmailview td.section {
- background-position: 6px -718px;
+#sections-table #rcmrowmailview .section {
+ background-position: 4px -718px;
}
-#sections-table #rcmrowmailview.selected td.section {
- background-position: 6px -742px;
+#sections-table #rcmrowmailview.selected .section {
+ background-position: 4px -742px;
}
-#sections-table #rcmrowaddressbook td.section {
- background-position: 6px -766px;
+#sections-table #rcmrowaddressbook .section {
+ background-position: 4px -766px;
}
-#sections-table #rcmrowaddressbook.selected td.section {
- background-position: 6px -791px;
+#sections-table #rcmrowaddressbook.selected .section {
+ background-position: 4px -791px;
}
-#sections-table #rcmrowserver td.section {
- background-position: 6px -814px;
+#sections-table #rcmrowserver .section {
+ background-position: 4px -814px;
}
-#sections-table #rcmrowserver.selected td.section {
- background-position: 6px -838px;
+#sections-table #rcmrowserver.selected .section {
+ background-position: 4px -838px;
}
-#sections-table #rcmrowcalendar td.section {
- background-position: 6px -526px;
+#sections-table #rcmrowcalendar .section {
+ background-position: 4px -526px;
}
-#sections-table #rcmrowcalendar.selected td.section {
- background-position: 6px -550px;
+#sections-table #rcmrowcalendar.selected .section {
+ background-position: 4px -550px;
}
#folderslist,
diff --git a/skins/larry/styles.css b/skins/larry/styles.css
index d1e45012b..17543c875 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -35,6 +35,10 @@ img {
border: 0;
}
+.voice {
+ display: none;
+}
+
input[type="text"],
input[type="password"],
textarea {
@@ -312,6 +316,16 @@ input.button:active {
border-left-color: #555;
}
+.buttongroup a.button:focus,
+.buttongroup a.button.selected:focus {
+ background: #f2f2f2;
+ background: -moz-linear-gradient(top, #49b3d2 0, #66bcd9 100%);
+ background: -webkit-gradient(linear, left top, left bottom, color-stop(0,#49b3d2), color-stop(100%,#66bcd9));
+ background: -o-linear-gradient(top, #49b3d2 0, #66bcd9 100%);
+ background: -ms-linear-gradient(top, #49b3d2 0, #66bcd9 100%);
+ background: linear-gradient(top, #49b3d2 0, #66bcd9 100%);
+}
+
.pagenav a.button {
padding: 1px 3px;
height: 16px;
@@ -950,6 +964,13 @@ a.iconlink.upload {
background: url(images/buttons.png) -1000px 0 no-repeat;
}
+#taskbar a:focus {
+ color: #fff;
+ text-shadow: 0px 1px 1px #666;
+ background-color: rgba(73,180,210,0.7);
+ outline: none;
+}
+
#taskbar a.button-selected {
color: #3cf;
background-color: #2c2c2c;
@@ -1115,6 +1136,7 @@ a.iconlink.upload {
}
.boxtitle,
+.uibox .listing thead th,
.uibox .listing thead td {
font-size: 12px;
font-weight: bold;
@@ -1126,7 +1148,14 @@ a.iconlink.upload {
white-space: nowrap;
}
+.uibox .listing thead th,
+.uibox .listing thead td {
+ padding-bottom: 8px;
+ height: auto;
+}
+
.uibox .boxtitle,
+.uibox .listing thead th,
.uibox .listing thead td {
background: #b0ccd7;
color: #004458;
@@ -1145,6 +1174,7 @@ a.iconlink.upload {
}
.listbox .listitem a,
+.listbox .listitem span,
.listbox .tablink a,
.listing tbody td,
.listing li a {
@@ -1162,17 +1192,40 @@ a.iconlink.upload {
display: table-cell;
height: auto;
min-height: 14px;
+ outline: none;
+}
+
+.listing tbody td a {
+ color: #376572;
+ text-shadow: 0px 1px 1px #fff;
+ text-decoration: none;
}
.webkit .listing tbody td {
height: 14px;
}
+/* This padding-left minus the focused padding left should be half of the focused border-left */
+.listing thead tr td:first-child,
+.listing tbody tr td:first-child {
+ border-left: 2px solid transparent;
+ padding-left: 6px;
+}
+
+.listing.iconized thead tr td:first-child,
+.listing.iconized tbody tr td:first-child {
+ padding-left: 34px;
+}
+
+/* because of border-collapse, we make the left border twice what we want it to be - half will be hidden to the left */
+.listing.focus tbody tr.focused > td:first-child {
+ border-left: 2px solid #739da8;
+}
+
.listbox .listitem.selected,
.listbox .tablink.selected,
.listbox .listitem.selected > a,
.listbox .tablink.selected > a,
-.listing tbody tr.unfocused td,
.listing tbody tr.selected td,
.listing li.selected,
.listing li.selected > a {
@@ -1239,6 +1292,16 @@ ul.treelist li a {
text-overflow: ellipsis;
}
+ul.treelist li a:focus,
+ul.listing .listitem a:focus,
+ul.listing .listitem span:focus,
+ul.listing.focus .listitem.focused span {
+ color: #fff !important;
+ background-color: rgba(73,180,210,0.6);
+ text-shadow: 0px 1px 1px #666;
+ outline: none;
+}
+
ul.treelist ul li a {
padding-left: 38px;
}
@@ -1319,6 +1382,13 @@ ul.treelist li.selected > div.expanded {
margin-top: 1px;
}
+.boxfooter a.listbutton:focus {
+ color: #fff;
+ background-color: rgba(73,180,210,0.6);
+ text-shadow: 0px 1px 1px #666;
+ outline: none;
+}
+
.uibox .boxfooter .listbutton:first-child {
border-radius: 0 0 0 4px;
}
@@ -1328,7 +1398,9 @@ ul.treelist li.selected > div.expanded {
width: 48px;
height: 35px;
text-indent: -5000px;
- background: url(images/buttons.png) -1000px 0 no-repeat;
+ background-image: url(images/buttons.png);
+ background-position: -1000px 0;
+ background-repeat: no-repeat;
}
.boxfooter .listbutton.add .inner {
@@ -1442,6 +1514,7 @@ table.records-table {
border: 0;
}
+.records-table thead th,
.records-table thead td {
color: #69939e;
font-size: 11px;
@@ -1456,13 +1529,17 @@ table.records-table {
padding: 8px 7px;
overflow: hidden;
text-overflow: ellipsis;
+ text-align: left;
}
+.records-table.sortheader thead th,
.records-table.sortheader thead td {
padding: 0;
}
+.records-table thead th a,
.records-table thead td a,
+.records-table thead th span,
.records-table thead td span {
display: block;
padding: 7px 7px;
@@ -1472,6 +1549,14 @@ table.records-table {
text-overflow: ellipsis;
}
+.records-table thead th a:focus,
+.records-table thead td a:focus {
+ color: #fff;
+ background-color: rgba(73,180,210,0.7);
+ text-shadow: 0px 1px 1px #666;
+ outline: none;
+}
+
.records-table tbody td {
padding: 2px 7px;
border-bottom: 1px solid #ddd;
@@ -1481,27 +1566,28 @@ table.records-table {
overflow: hidden;
text-overflow: ellipsis;
background-color: #fff;
+ outline: none;
}
/* This padding-left minus the focused padding left should be half of the focused border-left */
+.records-table thead tr th:first-child,
.records-table thead tr td:first-child,
.records-table tbody tr td:first-child {
- border-left: 0;
- padding-left: 6px;
-}
-
-/* because of border-collapse, we make the left border twice what we want it to be - half will be hidden to the left */
-.records-table tbody tr.focused > td:first-child {
- border-left: 2px solid #b0ccd7;
+ border-left: 2px solid transparent;
padding-left: 4px;
}
-.records-table tbody tr.selected.focused > td:first-child {
- border-left-color: #49b3d2;
+/* because of border-collapse, we make the left border twice what we want it to be - half will be hidden to the left */
+.records-table.focus tbody tr.focused > td:first-child {
+ border-left: 2px solid #49b3d2;
}
.records-table tr.selected td {
color: #fff !important;
+ background-color: #4db0d2 !important;
+}
+
+.records-table.focus tr.selected td {
background: #019bc6;
background: -moz-linear-gradient(top, #019bc6 0%, #017cb4 100%);
background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#019bc6), color-stop(100%,#017cb4));
@@ -1515,16 +1601,6 @@ table.records-table {
color: #fff !important;
}
-.records-table tr.unfocused td {
- color: #fff !important;
- background-color: #4db0d2 !important;
-}
-
-.records-table tr.unfocused td a,
-.records-table tr.unfocused td span {
- color: #fff !important;
-}
-
.records-table tr.deleted td,
.records-table tr.deleted td a {
color: #ccc !important;
@@ -1921,6 +1997,14 @@ ul.proplist li {
border-radius: 0;
}
+.dropbutton .dropbuttontip:focus,
+.toolbar a.button:focus {
+ color: #fff;
+ text-shadow: 0px 1px 1px #666;
+ background-color: rgba(30,150,192, 0.5);
+ border-radius: 3px;
+}
+
.toolbar a.button.disabled {
opacity: 0.4;
filter: alpha(opacity=40);
@@ -1936,12 +2020,16 @@ ul.proplist li {
position: absolute;
right: 0;
top: 0;
- height: 42px;
+ height: 41px;
width: 18px;
+ overflow: hidden;
+ text-indent: -5000px;
background: url(images/buttons.png) 0 -1255px no-repeat;
cursor: pointer;
+ outline: none;
}
+.dropbutton .dropbuttontip:focus,
.dropbutton .dropbuttontip:hover {
background-position: -26px -1255px;
}
@@ -2132,6 +2220,19 @@ select.decorated option {
}
+a.menuselector:focus,
+a.menuselector.focus,
+a.iconbutton:focus,
+.pagenav a.button:focus {
+ border-color: #4fadd5;
+ -webkit-box-shadow: 0 0 4px 2px rgba(71,135,177, 0.8);
+ -moz-box-shadow: 0 0 4px 2px rgba(71,135,177, 0.8);
+ -o-box-shadow: 0 0 4px 2px rgba(71,135,177, 0.8);
+ box-shadow: 0 0 4px 2px rgba(71,135,177, 0.8);
+ outline: none;
+}
+
+
/*** quota indicator ***/
#quotadisplay {
@@ -2224,6 +2325,7 @@ ul.toolbarmenu li a.active {
.googie_list td.googie_list_onhover,
ul.toolbarmenu li a.active:hover,
+ul.toolbarmenu li a.active:focus,
#rcmKSearchpane ul li.selected,
select.decorated option:hover,
select.decorated option[selected='selected'] {
@@ -2233,6 +2335,7 @@ select.decorated option[selected='selected'] {
background: -o-linear-gradient(top, #00aad6 0%, #008fc9 100%);
background: -ms-linear-gradient(top, #00aad6 0%, #008fc9 100%);
background: linear-gradient(top, #00aad6 0%, #008fc9 100%);
+ outline: none;
}
ul.toolbarmenu.iconized li a,
@@ -2620,6 +2723,7 @@ ul.toolbarmenu li span.copy {
overflow: hidden;
text-overflow: ellipsis;
line-height: 20px;
+ outline: none;
}
.attachmentslist li a.drop {
@@ -2631,6 +2735,15 @@ ul.toolbarmenu li span.copy {
right: 0;
top: 0;
padding: 0;
+ overflow: hidden;
+ text-indent: -5000px;
+ outline: none;
+}
+
+.attachmentslist li a:focus,
+.attachmentslist li a.drop:focus {
+ background-color: rgba(30,150,192, 0.5);
+ border-radius: 2px;
}
#compose-attachments ul li {
@@ -2665,26 +2778,22 @@ ul.toolbarmenu li span.copy {
/*** fieldset tabs ***/
-.tabsbar {
- margin-bottom: 12px;
- padding-top: 15px;
- height: 27px;
- white-space: nowrap;
+.tabbed.ui-tabs {
+ padding: 0;
+ border: 0 !important;
+ background: none;
}
-.ui-dialog-content .tabsbar {
- margin-bottom: 0;
+.boxcontent.tabbed.ui-tabs {
+ padding: 10px;
}
-.tabsbar .tablink {
- padding: 15px 1px 15px 0;
- background: #f8f8f8;
- background: -moz-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%);
- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f8f8f8), color-stop(50%,#d3d3d3), color-stop(100%,#f8f8f8));
- background: -webkit-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%);
- background: -o-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%);
- background: -ms-linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%);
- background: linear-gradient(top, #f8f8f8 0%, #d3d3d3 50%, #f8f8f8 100%);
+.ui-tabs .tabsbar.ui-tabs-nav {
+ margin-bottom: 10px;
+}
+
+.ui-dialog-content .tabsbar {
+ margin-bottom: 0;
}
.tabsbar .tablink:last-child {
@@ -2695,30 +2804,15 @@ ul.toolbarmenu li span.copy {
border-right: 0;
}
-.tabsbar .tablink a {
- padding: 15px;
- color: #999;
- font-size: 12px;
- font-weight: bold;
- text-decoration: none;
+.ui-tabs .ui-tabs-nav li.tablink a {
background: #fff;
- border-right: 1px solid #fafafa;
-}
-
-.tabsbar .tablink.selected a {
- color: #004458;
- background: #f6f6f6;
- background: -moz-linear-gradient(top, #fff 40%, #efefef 100%);
- background: -webkit-gradient(linear, left top, left bottom, color-stop(40%,#fff), color-stop(100%,#efefef));
- background: -o-linear-gradient(top, #fff 40%, #efefef 100%);
- background: -ms-linear-gradient(top, #fff 40%, #efefef 100%);
- background: linear-gradient(top, #fff 40%, #efefef 100%);
}
-fieldset.tab {
+.ui-tabs fieldset.ui-tabs-panel {
border: 0;
padding: 0;
margin-left: 0;
+ background: none;
}
#image-selector-form.droptarget {
diff --git a/skins/larry/templates/addressbook.html b/skins/larry/templates/addressbook.html
index 97efdc6f3..e1101e648 100644
--- a/skins/larry/templates/addressbook.html
+++ b/skins/larry/templates/addressbook.html
@@ -10,25 +10,50 @@
<div id="mainscreen">
+<h1 class="voice"><roundcube:label name="addressbook" /></h1>
+
<!-- toolbar -->
-<div id="addressbooktoolbar" class="toolbar">
+<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
+<div id="addressbooktoolbar" class="toolbar" role="toolbar" aria-labelledby="aria-label-toolbar">
<roundcube:button command="import" type="link" class="button import disabled" classAct="button import" classSel="button import pressed" label="import" title="importcontacts" />
<span class="dropbutton">
<roundcube:button command="export" type="link" class="button export disabled" classAct="button export" classSel="button export pressed" label="export" title="exportvcards" />
- <span class="dropbuttontip" id="exportmenulink" onclick="UI.show_popup('exportmenu');return false"></span>
+ <a href="#export" class="dropbuttontip" id="exportmenulink" onclick="return UI.toggle_popup('exportmenu',event)" aria-haspopup="true" aria-expanded="false" aria-owns="exportmenu-menu" tabindex="0"><roundcube:label name="arialabelcontactexportoptions" /></a>
</span>
<span class="spacer"></span>
<roundcube:button command="compose" type="link" class="button compose disabled" classAct="button compose" classSel="button compose pressed" label="compose" title="writenewmessage" />
<roundcube:button command="advanced-search" type="link" class="button search disabled" classAct="button search" classSel="button search pressed" label="advanced" title="advsearch" />
<roundcube:container name="toolbar" id="addressbooktoolbar" />
+
+ <div id="exportmenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-exportmenu" class="voice"><roundcube:label name="arialabelcontactexportoptions" /></h3>
+ <ul id="exportmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-exportmenu">
+ <li role="menuitem"><roundcube:button command="export" label="exportall" prop="sub" class="exportalllink" classAct="exportalllink active" /></li>
+ <li role="menuitem"><roundcube:button command="export-selected" label="exportsel" prop="sub" class="exportsellink" classAct="exportsellink active" /></li>
+ </ul>
+ </div>
+
</div>
<!-- search box -->
-<div id="quicksearchbar" class="searchbox">
+<div id="quicksearchbar" class="searchbox" role="search" aria-labelledby="aria-label-searchform">
+<h2 id="aria-label-searchform" class="voice"><roundcube:label name="arialabelcontactsearchform" /></h2>
+<label for="quicksearchbox" class="voice"><roundcube:label name="arialabelquicksearchbox" /></label>
<roundcube:object name="searchform" id="quicksearchbox" />
-<roundcube:button name="searchmenulink" id="searchmenulink" class="iconbutton searchoptions" onclick="UI.show_popup('searchmenu');return false" title="searchmod" content=" " />
-<roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " />
+<roundcube:button command="menu-open" prop="searchmenu" id="searchmenulink" class="iconbutton searchoptions" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="searchmenu-menu" />
+<roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" />
+
+<div id="searchmenu" class="popupmenu" data-editable="true">
+ <h3 id="aria-label-searchmenu" class="voice"><roundcube:label name="searchmod" /></h3>
+ <ul class="toolbarmenu" id="searchmenu-menu" role="menu" aria-labelledby="aria-label-searchmenu">
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="name" id="s_mod_name" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="name" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="firstname" id="s_mod_firstname" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="firstname" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="surname" id="s_mod_surname" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="surname" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="email" id="s_mod_email" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="email" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="*" id="s_mod_all" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="allfields" /></span></label></li>
+ </ul>
+</div>
</div>
<div id="mainscreencontent">
@@ -36,42 +61,64 @@
<div id="addressview-left">
<!-- sources/groups list -->
-<div id="directorylistbox" class="uibox listbox">
+<div id="directorylistbox" class="uibox listbox" role="navigation" aria-labelledby="directorylist-header">
<h2 id="directorylist-header" class="boxtitle"><roundcube:label name="groups" /></h2>
<div id="directorylist-content" class="scroller withfooter">
<roundcube:object name="directorylist" id="directorylist" class="treelist listing iconized" />
</div>
<div id="directorylist-footer" class="boxfooter">
- <roundcube:button command="group-create" type="link" title="newcontactgroup" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="groupoptions" id="groupoptionslink" type="link" title="moreactions" class="listbutton groupactions" onclick="UI.show_popup('groupoptions');return false" innerClass="inner" content="&#9881;" />
+ <roundcube:button command="group-create" type="link" title="newcontactgroup" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="newcontactgroup" /><roundcube:button name="groupoptions" id="groupoptionslink" type="link" title="moreactions" class="listbutton groupactions" onclick="return UI.toggle_popup('groupoptions',event)" innerClass="inner" label="arialabelabookgroupoptions" aria-haspopup="true" aria-expanded="false" aria-owns="groupoptionsmenu" />
</div>
</div>
+<div id="groupoptions" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-groupoptions" class="voice"><roundcube:label name="arialabelabookgroupoptions" /></h3>
+ <ul id="groupoptionsmenu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-groupoptions">
+ <li role="menuitem"><roundcube:button command="group-rename" label="grouprename" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="group-delete" label="groupdelete" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="search-create" label="searchsave" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="search-delete" label="searchdelete" classAct="active" /></li>
+ <roundcube:container name="groupoptions" id="groupoptionsmenu" />
+ </ul>
+</div>
+
</div><!-- end addressview-left -->
-<div id="addressview-right">
+<div id="addressview-right" role="main" aria-labelledby="aria-label-contactslist">
<!-- contacts list -->
<div id="addresslist" class="uibox listbox">
-<roundcube:object name="addresslisttitle" label="contacts" tag="h2" class="boxtitle" />
+<roundcube:object name="addresslisttitle" label="contacts" tag="h2" class="boxtitle" id="aria-label-contactslist" />
<div class="scroller withfooter">
-<roundcube:object name="addresslist" id="contacts-table" class="listing" noheader="true" />
+<roundcube:object name="addresslist" id="contacts-table" class="listing iconized" noheader="true" role="listbox" />
+</div>
+<div class="boxpagenav">
+ <roundcube:button command="firstpage" type="link" class="icon firstpage disabled" classAct="icon firstpage" title="firstpage" label="first" />
+ <roundcube:button command="previouspage" type="link" class="icon prevpage disabled" classAct="icon prevpage" title="previouspage" label="previous" />
+ <roundcube:button command="nextpage" type="link" class="icon nextpage disabled" classAct="icon nextpage" title="nextpage" label="next" />
+ <roundcube:button command="lastpage" type="link" class="icon lastpage disabled" classAct="icon lastpage" title="lastpage" label="last" />
</div>
<div class="boxfooter">
- <roundcube:button command="add" type="link" title="newcontact" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button command="delete" type="link" title="deletecontact" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" content="x" /><roundcube:button command="group-remove-selected" type="link" title="groupremoveselected" class="listbutton removegroup disabled" classAct="listbutton removegroup" innerClass="inner" content="-" />
- <roundcube:object name="recordsCountDisplay" class="countdisplay" label="fromtoshort" />
+ <roundcube:button command="add" type="link" title="newcontact" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="newcontact" /><roundcube:button command="delete" type="link" title="deletecontact" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" label="deletecontact" /><roundcube:button command="group-remove-selected" type="link" title="groupremoveselected" class="listbutton removegroup disabled" classAct="listbutton removegroup" innerClass="inner" label="groupremoveselected" />
+ <span class="countdisplay" aria-live="polite" aria-relevant="text">
+ <span class="voice"><roundcube:label name="contacts" /></span>
+ <roundcube:object name="recordsCountDisplay" label="fromtoshort" />
+ </span>
</div>
-<div class="boxpagenav">
- <roundcube:button command="firstpage" type="link" class="icon firstpage disabled" classAct="icon firstpage" title="firstpage" content="|&amp;lt;" />
- <roundcube:button command="previouspage" type="link" class="icon prevpage disabled" classAct="icon prevpage" title="previouspage" content="&amp;lt;" />
- <roundcube:button command="nextpage" type="link" class="icon nextpage disabled" classAct="icon nextpage" title="nextpage" content="&amp;gt;" />
- <roundcube:button command="lastpage" type="link" class="icon lastpage disabled" classAct="icon lastpage" title="lastpage" content="&amp;gt;|" />
</div>
+
+<div class="voice" role="note">
+<h3><roundcube:label name="helplistnavigation" /></h3>
+<pre>
+<roundcube:label name="helplistkeyboardnavigation" />
+<roundcube:label name="helplistkeyboardnavcontacts" />
+</pre>
</div>
<div id="contacts-box" class="uibox">
<div class="iframebox">
- <roundcube:object name="addressframe" id="contact-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
+ <roundcube:object name="addressframe" id="contact-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" title="contactproperties" />
</div>
</div>
@@ -81,37 +128,10 @@
</div><!-- end mainscreen -->
-<div id="exportmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><roundcube:button command="export" label="exportall" prop="sub" class="exportalllink" classAct="exportalllink active" /></li>
- <li><roundcube:button command="export-selected" label="exportsel" prop="sub" class="exportsellink" classAct="exportsellink active" /></li>
- </ul>
-</div>
-
-<div id="searchmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><label><input type="checkbox" name="s_mods[]" value="name" id="s_mod_name" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="name" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="firstname" id="s_mod_firstname" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="firstname" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="surname" id="s_mod_surname" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="surname" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="email" id="s_mod_email" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="email" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="*" id="s_mod_all" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="allfields" /></span></label></li>
- </ul>
-</div>
-
-<div id="groupoptions" class="popupmenu">
- <ul id="groupoptionsmenu" class="toolbarmenu">
- <li><roundcube:button command="group-rename" label="grouprename" classAct="active" /></li>
- <li><roundcube:button command="group-delete" label="groupdelete" classAct="active" /></li>
- <li><roundcube:button command="search-create" label="searchsave" classAct="active" /></li>
- <li><roundcube:button command="search-delete" label="searchdelete" classAct="active" /></li>
- <roundcube:container name="groupoptions" id="groupoptionsmenu" />
- </ul>
-</div>
-
-<div id="dragcontactmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><roundcube:button command="move" onclick="return rcmail.drag_menu_action('move')" label="move" classAct="active" /></li>
- <li><roundcube:button command="copy" onclick="return rcmail.drag_menu_action('copy')" label="copy" classAct="active" /></li>
+<div id="dragcontactmenu" class="popupmenu" aria-hidden="true">
+ <ul class="toolbarmenu" role="menu">
+ <li role="menuitem"><roundcube:button command="move" onclick="return rcmail.drag_menu_action('move')" label="move" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="copy" onclick="return rcmail.drag_menu_action('copy')" label="copy" classAct="active" /></li>
</ul>
</div>
diff --git a/skins/larry/templates/compose.html b/skins/larry/templates/compose.html
index 90df4f3a8..2812d3706 100644
--- a/skins/larry/templates/compose.html
+++ b/skins/larry/templates/compose.html
@@ -13,66 +13,71 @@
<div id="mainscreen">
+<h1 class="voice"><roundcube:object name="pagetitle" /></h1>
+
<!-- toolbar -->
-<div id="messagetoolbar" class="fullwidth">
-<div id="mailtoolbar" class="toolbar">
- <roundcube:button command="list" type="link" class="button back disabled" classAct="button back" classSel="button back pressed" label="cancel" condition="!env:extwin" />
- <roundcube:button command="close" type="link" class="button close disabled" classAct="button close" classSel="button close pressed" label="cancel" condition="env:extwin" />
+<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
+<div id="messagetoolbar" class="toolbar fullwidth" role="toolbar" aria-labelledby="aria-label-toolbar">
+ <roundcube:button command="list" type="link" class="button back disabled" classAct="button back" label="cancel" condition="!env:extwin" tabindex="2" />
+ <roundcube:button command="close" type="link" class="button close disabled" classAct="button close" label="cancel" condition="env:extwin" tabindex="2" />
<span class="spacer"></span>
- <roundcube:button command="send" type="link" class="button send" classAct="button send" classSel="button send pressed" label="send" title="sendmessage" />
- <roundcube:button command="savedraft" type="link" class="button savedraft" classAct="button savedraft" classSel="button savedraft pressed" label="save" title="savemessage" />
+ <roundcube:button command="send" type="link" class="button send disabled" classAct="button send" label="send" title="sendmessage" tabindex="2" />
+ <roundcube:button command="savedraft" type="link" class="button savedraft disabled" classAct="button savedraft" label="save" title="savemessage" tabindex="2" />
<span class="spacer"></span>
<roundcube:if condition="config:enable_spellcheck" />
<span class="dropbutton">
- <roundcube:button command="spellcheck" type="link" class="button spellcheck disabled" classAct="button spellcheck" classSel="button spellcheck pressed" label="spellcheck" title="checkspelling" />
- <span class="dropbuttontip" id="spellmenulink" onclick="UI.show_popup('spellmenu');return false"></span>
+ <roundcube:button command="spellcheck" type="link" class="button spellcheck disabled" classAct="button spellcheck" classSel="button spellcheck pressed" label="spellcheck" title="checkspelling" tabindex="2" />
+ <a href="#languages" class="dropbuttontip" id="spellmenulink" onclick="UI.toggle_popup('spellmenu',event);return false" aria-haspopup="true" aria-expanded="false"tabindex="2">Select Spell Language</a>
</span>
<roundcube:endif />
- <roundcube:button name="addattachment" type="link" class="button attach" classAct="button attach" classSel="button attach pressed" label="attach" title="addattachment" onclick="UI.show_uploadform();return false" />
- <roundcube:button command="insert-sig" type="link" class="button insertsig disabled" classAct="button insertsig" classSel="button insertsig pressed" label="signature" title="insertsignature" />
- <a href="#responses" class="button responses" label="responses" title="<roundcube:label name='insertresponse' />" id="responsesmenulink" unselectable="on" onmousedown="return false" onclick="UI.show_popup('responsesmenu');return false"><roundcube:label name="responses" /></a>
+ <roundcube:button name="addattachment" type="link" class="button attach" label="attach" title="addattachment" onclick="UI.show_uploadform(event);return false" aria-haspopup="true" aria-expanded="false"tabindex="2" />
+ <roundcube:button command="insert-sig" type="link" class="button insertsig disabled" classAct="button insertsig" label="signature" title="insertsignature" tabindex="2" />
+ <a href="#responses" class="button responses" label="responses" title="<roundcube:label name='insertresponse' />" id="responsesmenulink" unselectable="on" onmousedown="return false" onclick="UI.toggle_popup('responsesmenu',event);return false" tabindex="2" aria-haspopup="true" aria-expanded="false" aria-owns="textresponsesmenu"><roundcube:label name="responses" /></a>
<roundcube:container name="toolbar" id="compose-toolbar" />
</div>
-</div>
<div id="mainscreencontent">
<div id="composeview-left">
<!-- inline address book -->
-<div id="compose-contacts" class="uibox listbox">
-<h2 class="boxtitle"><roundcube:label name="contacts" /></h2>
- <div class="listsearchbox">
+<div id="compose-contacts" class="uibox listbox" role="region" aria-labelledby="aria-label-composecontacts">
+<h2 id="aria-label-composecontacts" class="boxtitle"><roundcube:label name="contacts" /></h2>
+ <div class="listsearchbox" role="search" aria-labelledby="aria-label-composequicksearch">
+ <h3 id="aria-label-composequicksearch" class="voice"><roundcube:label name="arialabelcontactquicksearch" /></h3>
<div class="searchbox">
+ <label for="contactsearchbox" class="voice"><roundcube:label name="arialabelcontactsearchbox" /></label>
<roundcube:object name="searchform" id="contactsearchbox" />
<a id="searchmenulink" class="iconbutton searchicon"> </a>
<roundcube:button command="reset-search" class="iconbutton reset" title="resetsearch" content=" " />
</div>
</div>
- <roundcube:object name="addressbooks" id="directorylist" class="listing" />
- <div class="scroller withfooter">
- <roundcube:object name="addresslist" id="contacts-table" class="listing" noheader="true" />
+ <roundcube:object name="addressbooks" id="directorylist" class="treelist listing" summary="ariasummarycomposecontacts" />
+ <div class="scroller withfooter" tabindex="-1">
+ <roundcube:object name="addresslist" id="contacts-table" class="listing iconized" noheader="true" role="listbox" />
</div>
<div class="boxfooter">
<roundcube:button command="add-recipient" prop="to" type="link" title="to" class="listbutton addto disabled" classAct="listbutton addto" innerClass="inner" content="To+" /><roundcube:button command="add-recipient" prop="cc" type="link" title="cc" class="listbutton addcc disabled" classAct="listbutton addcc" innerClass="inner" content="Cc+" /><roundcube:button command="add-recipient" prop="bcc" type="link" title="bcc" class="listbutton addbcc disabled" classAct="listbutton addbcc" innerClass="inner" content="Bcc+" />
</div>
<div class="boxpagenav">
- <roundcube:button command="firstpage" type="link" class="icon firstpage disabled" classAct="icon firstpage" title="firstpage" content="|&amp;lt;" />
- <roundcube:button command="previouspage" type="link" class="icon prevpage disabled" classAct="icon prevpage" title="previouspage" content="&amp;lt;" />
- <roundcube:button command="nextpage" type="link" class="icon nextpage disabled" classAct="icon nextpage" title="nextpage" content="&amp;gt;" />
- <roundcube:button command="lastpage" type="link" class="icon lastpage disabled" classAct="icon lastpage" title="lastpage" content="&amp;gt;|" />
+ <roundcube:button command="firstpage" type="link" class="icon firstpage disabled" classAct="icon firstpage" title="firstpage" label="first" />
+ <roundcube:button command="previouspage" type="link" class="icon prevpage disabled" classAct="icon prevpage" title="previouspage" label="previous" />
+ <roundcube:button command="nextpage" type="link" class="icon nextpage disabled" classAct="icon nextpage" title="nextpage" label="next" />
+ <roundcube:button command="lastpage" type="link" class="icon lastpage disabled" classAct="icon lastpage" title="lastpage" label="last" />
</div>
</div>
</div>
-<div id="composeview-right">
+<div id="composeview-right" role="main">
<roundcube:form name="form" method="post" id="compose-content" class="uibox">
<!-- message headers -->
-<div id="composeheaders">
-<a href="#options" id="composeoptionstoggle" class="moreheaderstoggle"><span class="iconlink" title="<roundcube:label name='options' />"></span></a>
+<div id="composeheaders" role="region" aria-labelledby="aria-label-composeheaders">
+<h2 id="aria-label-composeheaders" class="voice"><roundcube:label name="arialabelmessageheaders" /></h2>
+
+<a href="#options" id="composeoptionstoggle" class="moreheaderstoggle" title="<roundcube:label name='togglecomposeoptions' />" aria-exapnded="false"><span class="iconlink"></span></a>
<table class="headers-table compose-headers">
<tbody>
@@ -80,77 +85,78 @@
<td class="title"><label for="_from"><roundcube:label name="from" /></label></td>
<td class="editfield">
<roundcube:object name="composeHeaders" part="from" form="form" id="_from" tabindex="1" />
- <a href="#identities" onclick="return rcmail.command('identities')" class="iconlink edit"><roundcube:label name="editidents" /></a>
+ <a href="#identities" onclick="return rcmail.command('identities')" class="iconlink edit" tabindex="0"><roundcube:label name="editidents" /></a>
</td>
</tr><tr>
<td class="title top"><label for="_to"><roundcube:label name="to" /></label></td>
- <td class="editfield"><roundcube:object name="composeHeaders" part="to" form="form" id="_to" cols="70" rows="1" tabindex="2" /></td>
+ <td class="editfield"><roundcube:object name="composeHeaders" part="to" form="form" id="_to" cols="70" rows="1" tabindex="1" aria-required="true" /></td>
</tr><tr id="compose-cc">
<td class="title top">
<label for="_cc"><roundcube:label name="cc" /></label>
- <a href="#cc" onclick="return UI.hide_header_row('cc');" class="iconbutton cancel" title="<roundcube:label name='delete' />">x</a>
+ <a href="#cc" onclick="return UI.hide_header_row('cc');" class="iconbutton cancel" title="<roundcube:label name='delete' />" tabindex="3"><roundcube:label name="delete" /> <roundcube:label name="cc" /></a>
</td>
- <td class="editfield"><roundcube:object name="composeHeaders" part="cc" form="form" id="_cc" cols="70" rows="1" tabindex="3" /></td>
+ <td class="editfield"><roundcube:object name="composeHeaders" part="cc" form="form" id="_cc" cols="70" rows="1" tabindex="1" /></td>
</tr><tr id="compose-bcc">
<td class="title top">
<label for="_bcc"><roundcube:label name="bcc" /></label>
- <a href="#bcc" onclick="return UI.hide_header_row('bcc');" class="iconbutton cancel" title="<roundcube:label name='delete' />">x</a>
+ <a href="#bcc" onclick="return UI.hide_header_row('bcc');" class="iconbutton cancel" title="<roundcube:label name='delete' />" tabindex="3"><roundcube:label name="delete" /> <roundcube:label name="bcc" /></a>
</td>
- <td class="editfield"><roundcube:object name="composeHeaders" part="bcc" form="form" id="_bcc" cols="70" rows="1" tabindex="4" /></td>
+ <td class="editfield"><roundcube:object name="composeHeaders" part="bcc" form="form" id="_bcc" cols="70" rows="1" tabindex="1" /></td>
</tr><tr id="compose-replyto">
<td class="title top">
<label for="_replyto"><roundcube:label name="replyto" /></label>
- <a href="#replyto" onclick="return UI.hide_header_row('replyto');" class="iconbutton cancel" title="<roundcube:label name='delete' />">x</a>
+ <a href="#replyto" onclick="return UI.hide_header_row('replyto');" class="iconbutton cancel" title="<roundcube:label name='delete' />" tabindex="3"><roundcube:label name="delete" /> <roundcube:label name="replyto" /></a>
</td>
- <td class="editfield"><roundcube:object name="composeHeaders" part="replyto" form="form" id="_replyto" size="70" tabindex="5" /></td>
+ <td class="editfield"><roundcube:object name="composeHeaders" part="replyto" form="form" id="_replyto" size="70" tabindex="1" /></td>
</tr><tr id="compose-followupto">
<td class="title top">
<label for="_followupto"><roundcube:label name="followupto" /></label>
- <a href="#followupto" onclick="return UI.hide_header_row('followupto');" class="iconbutton cancel" title="<roundcube:label name='delete' />">x</a>
+ <a href="#followupto" onclick="return UI.hide_header_row('followupto');" class="iconbutton cancel" title="<roundcube:label name='delete' />" tabindex="3"><roundcube:label name="delete" /> <roundcube:label name="followupto" /></a>
</td>
- <td class="editfield"><roundcube:object name="composeHeaders" part="followupto" form="form" id="_followupto" size="70" tabindex="7" /></td>
+ <td class="editfield"><roundcube:object name="composeHeaders" part="followupto" form="form" id="_followupto" size="70" tabindex="1" /></td>
</tr><tr>
<td></td>
<td class="formlinks">
- <a href="#cc" onclick="return UI.show_header_row('cc')" id="cc-link" class="iconlink add"><roundcube:label name="addcc" /></a>
- <a href="#bcc" onclick="return UI.show_header_row('bcc')" id="bcc-link" class="iconlink add"><roundcube:label name="addbcc" /></a>
- <a href="#reply-to" onclick="return UI.show_header_row('replyto')" id="replyto-link" class="iconlink add"><roundcube:label name="addreplyto" /></a>
- <a href="#followup-to" onclick="return UI.show_header_row('followupto')" id="followupto-link" class="iconlink add"><roundcube:label name="addfollowupto" /></a>
+ <a href="#cc" onclick="return UI.show_header_row('cc')" id="cc-link" class="iconlink add" tabindex="3"><roundcube:label name="addcc" /></a>
+ <a href="#bcc" onclick="return UI.show_header_row('bcc')" id="bcc-link" class="iconlink add" tabindex="3"><roundcube:label name="addbcc" /></a>
+ <a href="#reply-to" onclick="return UI.show_header_row('replyto')" id="replyto-link" class="iconlink add" tabindex="3"><roundcube:label name="addreplyto" /></a>
+ <a href="#followup-to" onclick="return UI.show_header_row('followupto')" id="followupto-link" class="iconlink add" tabindex="3"><roundcube:label name="addfollowupto" /></a>
</td>
</tr><tr>
<td class="title"><label for="compose-subject"><roundcube:label name="subject" /></label></td>
- <td class="editfield"><roundcube:object name="composeSubject" id="compose-subject" form="form" tabindex="8" /></td>
+ <td class="editfield"><roundcube:object name="composeSubject" id="compose-subject" form="form" tabindex="1" /></td>
</tr>
</tbody>
</table>
<div id="composebuttons" class="formbuttons">
- <roundcube:button command="extwin" type="link" class="button extwin" classSel="button extwin pressed" innerClass="icon" title="openinextwin" content="[]" condition="!env:extwin" />
+ <roundcube:button command="extwin" type="link" class="button extwin" classSel="button extwin pressed" innerClass="icon" title="openinextwin" label="openinextwin" condition="!env:extwin" />
</div>
<!-- (collapsable) message options -->
-<div id="composeoptions">
+<div id="composeoptions" role="region" aria-labelledby="aria-label-composeoptions">
+ <h2 id="aria-label-composeoptions" class="voice"><roundcube:label name="arialabelcomposeoptions" /></h2>
<roundcube:if condition="!in_array('htmleditor', (array)config:dont_override)" />
<span class="composeoption">
<label><roundcube:label name="editortype" />
- <roundcube:object name="editorSelector" editorid="composebody" tabindex="14" /></label>
+ <roundcube:object name="editorSelector" editorid="composebody" tabindex="4" /></label>
</span>
<roundcube:endif />
<span class="composeoption">
<label for="rcmcomposepriority"><roundcube:label name="priority" />
- <roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" /></label>
+ <roundcube:object name="prioritySelector" form="form" id="rcmcomposepriority" tabindex="4" /></label>
</span>
<span class="composeoption">
- <label><roundcube:object name="receiptCheckBox" form="form" id="rcmcomposereceipt" /> <roundcube:label name="returnreceipt" /></label>
+ <label><roundcube:object name="receiptCheckBox" form="form" id="rcmcomposereceipt" tabindex="4" /> <roundcube:label name="returnreceipt" /></label>
</span>
<roundcube:if condition="config:smtp_server != ''" />
<span class="composeoption">
- <label><roundcube:object name="dsnCheckBox" form="form" id="rcmcomposedsn" /> <roundcube:label name="dsn" /></label>
+ <label><roundcube:object name="dsnCheckBox" form="form" id="rcmcomposedsn" tabindex="4" /> <roundcube:label name="dsn" /></label>
</span>
<roundcube:endif />
<roundcube:if condition="!config:no_save_sent_messages" />
<span class="composeoption">
- <label><roundcube:label name="savesentmessagein" /> <roundcube:object name="storetarget" maxlength="30" style="max-width:12em" /></label>
+ <label><roundcube:label name="savesentmessagein" /> <roundcube:object name="storetarget" maxlength="30" style="max-width:12em" tabindex="4" /></label>
</span>
<roundcube:endif />
<roundcube:container name="composeoptions" id="composeoptions" />
@@ -161,11 +167,13 @@
<!-- message compose body -->
<div id="composeview-bottom">
<div id="composebodycontainer">
- <roundcube:object name="composeBody" id="composebody" form="form" cols="70" rows="20" tabindex="9" />
+ <label for="composebody" class="voice"><roundcube:label name="arialabelmessagebody" /></label>
+ <roundcube:object name="composeBody" id="composebody" form="form" cols="70" rows="20" tabindex="1" />
</div>
- <div id="compose-attachments" class="rightcol">
+ <div id="compose-attachments" class="rightcol" role="region" aria-labelledby="aria-label-composeattachments">
+ <h2 id="aria-label-composeattachments" class="voice"><roundcube:label name="attachments" /></h2>
<div style="text-align:center; margin-bottom:20px">
- <roundcube:button name="addattachment" type="input" class="button" classSel="button pressed" label="addattachment" onclick="UI.show_uploadform();return false" />
+ <roundcube:button name="addattachment" type="input" class="button" classSel="button pressed" label="addattachment" onclick="UI.show_uploadform(event);return false" tabindex="1" />
</div>
<roundcube:object name="composeAttachmentList" id="attachment-list" class="attachmentslist" />
<roundcube:object name="fileDropArea" id="compose-attachments" />
@@ -187,7 +195,8 @@
</div><!-- end mainscreen -->
-<div id="upload-dialog" class="propform popupdialog" title="<roundcube:label name='addattachment' />">
+<div id="upload-dialog" class="propform popupdialog" title="<roundcube:label name='addattachment' />" aria-hidden="true">
+ <h2 id="aria-label-uploaddialog" class="voice"><roundcube:label name="arialabelattachmentuploadform" /></h2>
<roundcube:object name="composeAttachmentForm" id="uploadform" buttons="no" />
<div class="formbuttons">
<roundcube:button command="send-attachment" type="input" class="button mainaction" label="upload" />
@@ -195,15 +204,16 @@
</div>
</div>
-<div id="spellmenu" class="popupmenu"></div>
+<div id="spellmenu" class="popupmenu" aria-hidden="true"></div>
-<div id="responsesmenu" class="popupmenu">
- <ul class="toolbarmenu" id="textresponsesmenu">
- <li class="separator" id=""><label><roundcube:label name="insertresponse" /></label></li>
+<div id="responsesmenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-responsesmenu" class="voice"><roundcube:label name="arialabelresponsesmenu" /></h3>
+ <ul class="toolbarmenu" id="textresponsesmenu" role="menu" aria-labelledby="aria-label-responsesmenu">
+ <li role="separator" class="separator" id=""><label><roundcube:label name="insertresponse" /></label></li>
<roundcube:object name="responseslist" id="responseslist" tagname="ul" itemclass="active" />
- <li class="separator"><label><roundcube:label name="manageresponses" /></label></li>
- <li><roundcube:button command="save-response" type="link" label="savenewresponse" classAct="active" unselectable="on" /></li>
- <li><roundcube:button command="responses" type="link" label="editresponses" classAct="active" /></li>
+ <li role="separator" class="separator"><label><roundcube:label name="manageresponses" /></label></li>
+ <li role="menuitem"><roundcube:button command="save-response" type="link" label="savenewresponse" classAct="active" unselectable="on" /></li>
+ <li role="menuitem"><roundcube:button command="responses" type="link" label="editresponses" classAct="active" /></li>
</ul>
</div>
diff --git a/skins/larry/templates/contactedit.html b/skins/larry/templates/contactedit.html
index 3467ebe8e..b7aafed31 100644
--- a/skins/larry/templates/contactedit.html
+++ b/skins/larry/templates/contactedit.html
@@ -16,7 +16,8 @@
<div id="sourcename"><roundcube:label name="addressbook" />: <roundcube:var name="env:sourcename" condition="env:action!='add'" /><roundcube:object name="sourceselector" id="sourceselect" condition="env:action=='add'" /></div>
<roundcube:endif />
- <div id="contactphoto">
+ <fieldset id="contactphoto">
+ <legend class="voice"><roundcube:label name="contactphoto" /></legend>
<roundcube:object name="contactphoto" id="contactpic" placeholder="/images/contactpic.png" />
<roundcube:if condition="env:photocol" />
<roundcube:object name="fileDropArea" id="contactpic" />
@@ -25,7 +26,7 @@
<roundcube:button command="delete-photo" type="link" label="delete" class="iconlink delete disabled" classAct="iconlink delete active" condition="env:photocol" />
</div>
<roundcube:endif />
- </div>
+ </fieldset>
<roundcube:object name="contactedithead" id="contacthead" size="16" form="editform" />
<br style="clear:both" />
diff --git a/skins/larry/templates/folders.html b/skins/larry/templates/folders.html
index 56396bf1d..ffb0a7ee1 100644
--- a/skins/larry/templates/folders.html
+++ b/skins/larry/templates/folders.html
@@ -10,9 +10,11 @@
<div id="mainscreen" class="offset">
+<h1 class="voice"><roundcube:label name="settings" /> : <roundcube:label name="folders" /></h1>
+
<roundcube:include file="/includes/settingstabs.html" />
-<div id="settings-right">
+<div id="settings-right" role="main">
<div id="folderslist" class="uibox listbox">
<h2 id="folderslist-header" class="boxtitle"><span style="float:right"><roundcube:label name="subscribed" /></span><roundcube:label name="folders" /></h2>
@@ -20,11 +22,22 @@
<roundcube:object name="foldersubscription" form="subscriptionform" id="subscription-table" class="listing" noheader="true" />
</div>
<div id="folderslist-footer" class="boxfooter">
- <roundcube:button command="create-folder" type="link" title="createfolder" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="listbutton groupactions" onclick="UI.show_popup('mailboxmenu');return false" innerClass="inner" content="&#9881;" />
+ <roundcube:button command="create-folder" type="link" title="createfolder" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="createfolder" /><roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="listbutton groupactions" onclick="return UI.toggle_popup('mailboxmenu',event)" innerClass="inner" content="&#9881;" aria-haspopup="true" aria-expanded="false" aria-owns="mailboxoptionsmenu" />
<roundcube:if condition="env:quota" />
+ <span class="voice"><roundcube:label name="quota"></span>
<roundcube:object name="quotaDisplay" id="quotadisplay" class="countdisplay" display="text" />
<roundcube:endif />
</div>
+
+<div id="mailboxmenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-mailboxmenu" class="voice"><roundcube:label name="arialabelmailboxmenu" /></h3>
+ <ul class="toolbarmenu" id="mailboxoptionsmenu" role="menu" aria-labelledby="aria-label-mailboxmenu">
+ <li role="menuitem"><roundcube:button command="delete-folder" label="delete" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
+ <roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" />
+ </ul>
+</div>
+
</div>
<div id="folder-details" class="uibox contentbox">
@@ -37,14 +50,6 @@
</div>
-<div id="mailboxmenu" class="popupmenu">
- <ul class="toolbarmenu" id="mailboxoptionsmenu">
- <li><roundcube:button command="delete-folder" label="delete" classAct="active" /></li>
- <li><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
- <roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" />
- </ul>
-</div>
-
<roundcube:include file="/includes/footer.html" />
</body>
diff --git a/skins/larry/templates/identities.html b/skins/larry/templates/identities.html
index e3d2cc842..91f7f8f71 100644
--- a/skins/larry/templates/identities.html
+++ b/skins/larry/templates/identities.html
@@ -10,23 +10,25 @@
<div id="mainscreen" class="offset">
+<h1 class="voice"><roundcube:label name="settings" /> : <roundcube:label name="identities" /></h1>
+
<roundcube:include file="/includes/settingstabs.html" />
-<div id="settings-right">
+<div id="settings-right" role="main" aria-labelledby="aria-label-identitieslist">
<div id="identitieslist" class="uibox listbox">
-<h2 class="boxtitle"><roundcube:label name="identities" /></h2>
+<h2 class="boxtitle" id="aria-label-identitieslist"><roundcube:label name="identities" /></h2>
<div class="scroller withfooter">
-<roundcube:object name="identitiesList" id="identities-table" class="listing" cellspacing="0" summary="Identities list" noheader="true" editIcon="" />
+<roundcube:object name="identitiesList" id="identities-table" class="listing" noheader="true" editIcon="" role="listbox" />
</div>
<div class="boxfooter">
-<roundcube:button command="add" type="link" title="newidentity" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" condition="config:identities_level:0<2" /><roundcube:button command="delete" type="link" title="delete" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" content="-" condition="config:identities_level:0<2" />
+<roundcube:button command="add" type="link" title="newidentity" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="newidentity" condition="config:identities_level:0<2" /><roundcube:button command="delete" type="link" title="delete" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" label="delete" condition="config:identities_level:0<2" />
</div>
</div>
<div id="identity-details" class="uibox contentbox">
<div class="iframebox">
- <roundcube:object name="identityframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
+ <roundcube:object name="identityframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" title="arialabelidentityeditfrom" />
</div>
</div>
diff --git a/skins/larry/templates/importcontacts.html b/skins/larry/templates/importcontacts.html
index a670d0354..2bc1d4a26 100644
--- a/skins/larry/templates/importcontacts.html
+++ b/skins/larry/templates/importcontacts.html
@@ -15,7 +15,7 @@
</div>
<div id="pluginbody" class="offset uibox contentbox">
-<h2 class="boxtitle"><roundcube:label name="importcontacts" /></h2>
+<h1 class="boxtitle"><roundcube:label name="importcontacts" /></h1>
<div id="import-box" class="boxcontent">
<roundcube:object name="importstep" class="propform" />
diff --git a/skins/larry/templates/login.html b/skins/larry/templates/login.html
index 64ff6be92..557b029ee 100644
--- a/skins/larry/templates/login.html
+++ b/skins/larry/templates/login.html
@@ -7,8 +7,10 @@
</head>
<body>
+<h1 class="voice"><roundcube:object name="productname" /> <roundcube:label name="login" /></h1>
+
<div id="login-form">
-<div class="box-inner">
+<div class="box-inner" role="main">
<roundcube:object name="logo" src="/images/roundcube_logo.png" id="logo" />
<roundcube:form name="form" method="post">
@@ -17,15 +19,15 @@
</div>
-<div class="box-bottom">
+<div class="box-bottom" role="complementary">
<roundcube:object name="message" id="message" />
<noscript>
<p class="noscriptwarning"><roundcube:label name="noscriptwarning" /></p>
</noscript>
</div>
-<div id="bottomline">
- <roundcube:var name="config:product_name"> <roundcube:object name="version" condition="config:display_version" />
+<div id="bottomline" role="contentinfo">
+ <roundcube:object name="productname" /> <roundcube:object name="version" condition="config:display_version" />
<roundcube:if condition="config:support_url" />
&nbsp;&#9679;&nbsp; <a href="<roundcube:var name='config:support_url' />" target="_blank" class="support-link"><roundcube:label name="support" /></a>
<roundcube:endif />
diff --git a/skins/larry/templates/mail.html b/skins/larry/templates/mail.html
index 1e4a3ce8c..1ca5fbba0 100644
--- a/skins/larry/templates/mail.html
+++ b/skins/larry/templates/mail.html
@@ -17,8 +17,11 @@
<div id="mainscreen">
+<h1 class="voice"><roundcube:label name="mail" /></h1>
+
<!-- toolbar -->
-<div id="messagetoolbar" class="toolbar">
+<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
+<div id="messagetoolbar" class="toolbar" role="toolbar" aria-labelledby="aria-label-toolbar">
<roundcube:button command="checkmail" type="link" class="button checkmail disabled" classAct="button checkmail" classSel="button checkmail pressed" label="refresh" title="checkmail" />
<roundcube:include file="/includes/mailtoolbar.html" />
</div>
@@ -27,14 +30,35 @@
<!-- search filter -->
<div id="searchfilter">
- <roundcube:object name="searchfilter" class="searchfilter decorated" />
+ <label for="messagessearchfilter" class="voice"><roundcube:label name="arialabelmessagessearchfilter" /></label>
+ <roundcube:object name="searchfilter" class="searchfilter decorated" id="messagessearchfilter" aria-controls="messagelist" />
</div>
<!-- search box -->
-<div id="quicksearchbar" class="searchbox">
+<div id="quicksearchbar" class="searchbox" role="search" aria-labelledby="aria-label-searchform">
+<h2 id="aria-label-searchform" class="voice"><roundcube:label name="arialabelmailsearchform" /></h2>
+<label for="quicksearchbox" class="voice"><roundcube:label name="arialabelmailquicksearchbox" /></label>
<roundcube:object name="searchform" id="quicksearchbox" />
-<roundcube:button name="searchmenulink" id="searchmenulink" class="iconbutton searchoptions" onclick="UI.show_popup('searchmenu');return false" title="searchmod" content=" " />
-<roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " />
+<roundcube:button command="menu-open" prop="searchmenu" id="searchmenulink" class="iconbutton searchoptions" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="searchmenu-menu" />
+<roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" />
+
+<div id="searchmenu" class="popupmenu" data-editable="true">
+ <h3 id="aria-label-searchmenu" class="voice"><roundcube:label name="searchmod" /></h3>
+ <ul class="toolbarmenu" id="searchmenu-menu" role="menu" aria-labelledby="aria-label-searchmenu">
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="subject" id="s_mod_subject" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="subject" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="from" id="s_mod_from" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="from" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="to" id="s_mod_to" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="to" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="cc" id="s_mod_cc" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="cc" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="bcc" id="s_mod_bcc" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="bcc" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="body" id="s_mod_body" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="body" /></span></label></li>
+ <li role="menuitem"><label><input type="checkbox" name="s_mods[]" value="text" id="s_mod_text" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="msgtext" /></span></label></li>
+ <li role="separator" class="separator"><label><roundcube:label name="searchscope" /></label></li>
+ <li role="menuitem"><label><input type="radio" name="s_scope" value="base" id="s_scope_base" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="currentfolder" /></span></label></li>
+ <li role="menuitem"><label><input type="radio" name="s_scope" value="sub" id="s_scope_sub" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="subfolders" /></span></label></li>
+ <li role="menuitem"><label><input type="radio" name="s_scope" value="all" id="s_scope_all" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="allfolders" /></span></label></li>
+ </ul>
+</div>
+
</div>
</div>
@@ -43,13 +67,15 @@
<div id="mailview-left">
<!-- folders list -->
-<div id="mailboxcontainer" class="uibox listbox">
+<div id="mailboxcontainer" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist">
+<h2 id="aria-label-folderlist" class="voice"><roundcube:label name="arialabelfolderlist" /></h2>
<div id="folderlist-content" class="scroller withfooter">
<roundcube:object name="mailboxlist" id="mailboxlist" class="treelist listing" folder_filter="mail" unreadwrap="%s" />
</div>
<div id="folderlist-footer" class="boxfooter">
- <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="listbutton groupactions" onclick="UI.show_popup('mailboxmenu');return false" innerClass="inner" content="&#9881;" />
+ <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="listbutton groupactions" onclick="UI.toggle_popup('mailboxmenu',event);return false" innerClass="inner" content="&#9881;" aria-haspopup="true" aria-expanded="false" aria-owns="mailboxoptionsmenu" />
<roundcube:if condition="env:quota" />
+ <span class="voice"><roundcube:label name="quota"></span>
<roundcube:object name="quotaDisplay" id="quotadisplay" class="countdisplay" display="text" />
<roundcube:endif />
</div>
@@ -57,7 +83,7 @@
</div>
-<div id="mailview-right">
+<div id="mailview-right" role="main">
<roundcube:if condition="config:preview_pane == true" />
<div id="mailview-top" class="uibox">
@@ -67,10 +93,20 @@
<!-- messagelist -->
<div id="messagelistcontainer" class="boxlistcontent">
+<h2 id="aria-label-messagelist" class="voice"><roundcube:label name="arialabelmessagelist" /></h2>
<roundcube:object name="messages"
id="messagelist"
class="records-table messagelist sortheader fixedheader"
- optionsmenuIcon="true" />
+ optionsmenuIcon="true"
+ aria-labelledby="aria-label-messagelist" />
+</div>
+
+<div class="voice" role="note">
+<h3><roundcube:label name="helplistnavigation" /></h3>
+<pre>
+<roundcube:label name="helplistkeyboardnavigation" />
+<roundcube:label name="helplistkeyboardnavmessages" />
+</pre>
</div>
<!-- list footer -->
@@ -81,33 +117,34 @@
</div>
<div id="listselectors">
- <a href="#select" id="listselectmenulink" class="menuselector" onclick="UI.show_popup('listselectmenu');return false"><span class="handle"><roundcube:label name="select" /></span></a>
+ <a href="#select" id="listselectmenulink" class="menuselector" onclick="UI.toggle_popup('listselectmenu', event);return false" aria-haspopup="true" aria-expanded="false" aria-owns="listselectmenu-menu"><span class="handle"><roundcube:label name="select" /></span></a>
<roundcube:if condition="env:threads" />
- &nbsp; <a href="#threads" id="threadselectmenulink" class="menuselector" onclick="UI.show_popup('threadselectmenu');return false"><span class="handle"><roundcube:label name="threads" /></span></a>
+ &nbsp; <a href="#threads" id="threadselectmenulink" class="menuselector" onclick="UI.toggle_popup('threadselectmenu', event);return false" aria-haspopup="true" aria-expanded="false" aria-owns="threadselectmenu-menu"><span class="handle"><roundcube:label name="threads" /></span></a>
<roundcube:endif />
</div>
<div id="countcontrols" class="pagenav dark">
- <roundcube:object name="messageCountDisplay" class="countdisplay" />
+ <roundcube:object name="messageCountDisplay" class="countdisplay" aria-live="polite" aria-relevant="text" />
<span class="pagenavbuttons">
- <roundcube:button command="firstpage" type="link" class="button firstpage disabled" classAct="button firstpage" classSel="button firstpage pressed" innerClass="inner" title="firstpage" content="|&amp;lt;" />
- <roundcube:button command="previouspage" type="link" class="button prevpage disabled" classAct="button prevpage" classSel="button prevpage pressed" innerClass="inner" title="previouspage" content="&amp;lt;" />
- <roundcube:button command="nextpage" type="link" class="button nextpage disabled" classAct="button nextpage" classSel="button nextpage pressed" innerClass="inner" title="nextpage" content="&amp;gt;" />
- <roundcube:button command="lastpage" type="link" class="button lastpage disabled" classAct="button lastpage" classSel="button lastpage pressed" innerClass="inner" title="lastpage" content="&amp;gt;|" />
+ <roundcube:button command="firstpage" type="link" class="button firstpage disabled" classAct="button firstpage" classSel="button firstpage pressed" innerClass="inner" title="firstpage" label="first" />
+ <roundcube:button command="previouspage" type="link" class="button prevpage disabled" classAct="button prevpage" classSel="button prevpage pressed" innerClass="inner" title="previouspage" label="previous" />
+ <roundcube:button command="nextpage" type="link" class="button nextpage disabled" classAct="button nextpage" classSel="button nextpage pressed" innerClass="inner" title="nextpage" label="next" />
+ <roundcube:button command="lastpage" type="link" class="button lastpage disabled" classAct="button lastpage" classSel="button lastpage pressed" innerClass="inner" title="lastpage" label="last" />
</span>
</div>
<roundcube:container name="listcontrols" id="listcontrols" />
- <a href="#preview" id="mailpreviewtoggle" title="<roundcube:label name='previewpane' />"></a>
+ <a href="#preview" id="mailpreviewtoggle" class="iconbutton" title="<roundcube:label name='previewpane' />" role="button" tabindex="0"><roundcube:label name="previewpane" /></a>
</div>
</div><!-- end mailview-top -->
<div id="mailview-bottom" class="uibox">
-<div id="mailpreviewframe" class="iframebox">
-<roundcube:object name="messagecontentframe" id="messagecontframe" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
+<div id="mailpreviewframe" class="iframebox" role="complementary" aria-labelledby="aria-label-mailpreviewframe">
+<h2 id="aria-label-mailpreviewframe" class="voice"><roundcube:label name="arialabelmailpreviewframe" /></h2>
+<roundcube:object name="messagecontentframe" id="messagecontframe" style="width:100%; height:100%" frameborder="0" src="/watermark.html" title="arialabelmailpreviewframe" />
</div>
</div><!-- end mailview-bottom -->
@@ -118,59 +155,47 @@
</div><!-- end mainscreen -->
-<div id="searchmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><label><input type="checkbox" name="s_mods[]" value="subject" id="s_mod_subject" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="subject" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="from" id="s_mod_from" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="from" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="to" id="s_mod_to" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="to" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="cc" id="s_mod_cc" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="cc" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="bcc" id="s_mod_bcc" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="bcc" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="body" id="s_mod_body" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="body" /></span></label></li>
- <li><label><input type="checkbox" name="s_mods[]" value="text" id="s_mod_text" onclick="UI.set_searchmod(this)" /> <span><roundcube:label name="msgtext" /></span></label></li>
- <li class="separator"><label><roundcube:label name="searchscope" /></label></li>
- <li><label><input type="radio" name="s_scope" value="base" id="s_scope_base" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="currentfolder" /></span></label></li>
- <li><label><input type="radio" name="s_scope" value="sub" id="s_scope_sub" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="subfolders" /></span></label></li>
- <li><label><input type="radio" name="s_scope" value="all" id="s_scope_all" onclick="UI.set_searchscope(this)" /> <span><roundcube:label name="allfolders" /></span></label></li>
- </ul>
-</div>
-
-<div id="dragmessagemenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><roundcube:button command="move" onclick="return rcmail.drag_menu_action('move')" label="move" classAct="active" /></li>
- <li><roundcube:button command="copy" onclick="return rcmail.drag_menu_action('copy')" label="copy" classAct="active" /></li>
+<div id="dragmessagemenu" class="popupmenu" aria-hidden="true">
+ <ul class="toolbarmenu" role="menu">
+ <li role="menuitem"><roundcube:button command="move" onclick="return rcmail.drag_menu_action('move')" label="move" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="copy" onclick="return rcmail.drag_menu_action('copy')" label="copy" classAct="active" /></li>
</ul>
</div>
-<div id="mailboxmenu" class="popupmenu">
- <ul class="toolbarmenu" id="mailboxoptionsmenu">
- <li><roundcube:button command="expunge" type="link" label="compact" classAct="active" /></li>
- <li><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
- <li><roundcube:button command="import-messages" name="messageimport" type="link" classAct="active" label="importmessages" onclick="if(rcmail.command_enabled('import-messages'))UI.show_uploadform();return false" /></li>
- <li><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li>
+<div id="mailboxmenu" class="popupmenu" aria-hidden="true">
+ <h3 id="aria-label-mailboxmenu" class="voice"><roundcube:label name="arialabelmailboxmenu" /></h3>
+ <ul class="toolbarmenu" id="mailboxoptionsmenu" role="menu" aria-labelledby="aria-label-mailboxmenu">
+ <li role="menuitem"><roundcube:button command="expunge" type="link" label="compact" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="purge" type="link" label="empty" classAct="active" /></li>
+ <li role="menuitem"><roundcube:button command="import-messages" name="messageimport" type="link" classAct="active" label="importmessages" onclick="if(rcmail.command_enabled('import-messages'))UI.show_uploadform();return false" /></li>
+ <li role="menuitem"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li>
<roundcube:container name="mailboxoptions" id="mailboxoptionsmenu" />
</ul>
</div>
-<div id="listselectmenu" class="popupmenu dropdown">
- <ul class="toolbarmenu iconized">
- <li><roundcube:button command="select-all" type="link" label="all" class="icon" classAct="icon active" innerclass="icon mail" /></li>
- <li><roundcube:button command="select-all" type="link" prop="page" label="currpage" class="icon" classAct="icon active" innerclass="icon list" /></li>
- <li><roundcube:button command="select-all" type="link" prop="unread" label="unread" class="icon" classAct="icon active" innerclass="icon unread" /></li>
- <li><roundcube:button command="select-all" type="link" prop="flagged" label="flagged" class="icon" classAct="icon active" innerclass="icon flagged" /></li>
- <li><roundcube:button command="select-all" type="link" prop="invert" label="invert" class="icon" classAct="icon active" innerclass="icon invert" /></li>
- <li><roundcube:button command="select-none" type="link" label="none" class="icon" classAct="icon active" innerclass="icon cross" /></li>
+<div id="listselectmenu" class="popupmenu dropdown" aria-hidden="true">
+ <h3 id="aria-label-listselectmenu" class="voice"><roundcube:label name="arialabellistselectmenu" /></h3>
+ <ul id="listselectmenu-menu" class="toolbarmenu iconized" role="menu" aria-labelledby="aria-label-listselectmenu">
+ <li role="menuitem"><roundcube:button command="select-all" type="link" label="all" class="icon" classAct="icon active" innerclass="icon mail" /></li>
+ <li role="menuitem"><roundcube:button command="select-all" type="link" prop="page" label="currpage" class="icon" classAct="icon active" innerclass="icon list" /></li>
+ <li role="menuitem"><roundcube:button command="select-all" type="link" prop="unread" label="unread" class="icon" classAct="icon active" innerclass="icon unread" /></li>
+ <li role="menuitem"><roundcube:button command="select-all" type="link" prop="flagged" label="flagged" class="icon" classAct="icon active" innerclass="icon flagged" /></li>
+ <li role="menuitem"><roundcube:button command="select-all" type="link" prop="invert" label="invert" class="icon" classAct="icon active" innerclass="icon invert" /></li>
+ <li role="menuitem"><roundcube:button command="select-none" type="link" label="none" class="icon" classAct="icon active" innerclass="icon cross" /></li>
</ul>
</div>
-<div id="threadselectmenu" class="popupmenu dropdown">
- <ul class="toolbarmenu">
- <li><roundcube:button command="expand-all" type="link" label="expand-all" class="icon" classAct="icon active" innerclass="icon conversation" /></li>
- <li><roundcube:button command="expand-unread" type="link" label="expand-unread" class="icon" classAct="icon active" innerclass="icon conversation" /></li>
- <li><roundcube:button command="collapse-all" type="link" label="collapse-all" class="icon" classAct="icon active" innerclass="icon conversation" /></li>
+<div id="threadselectmenu" class="popupmenu dropdown" aria-hidden="true">
+ <h3 id="aria-label-threadselectmenu" class="voice"><roundcube:label name="arialabelthreadselectmenu" /></h3>
+ <ul id="threadselectmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-threadselectmenu">
+ <li role="menuitem"><roundcube:button command="expand-all" type="link" label="expand-all" class="icon" classAct="icon active" innerclass="icon conversation" /></li>
+ <li role="menuitem"><roundcube:button command="expand-unread" type="link" label="expand-unread" class="icon" classAct="icon active" innerclass="icon conversation" /></li>
+ <li role="menuitem"><roundcube:button command="collapse-all" type="link" label="collapse-all" class="icon" classAct="icon active" innerclass="icon conversation" /></li>
</ul>
</div>
-<div id="listoptions" class="propform popupdialog">
+<div id="listoptions" class="propform popupdialog" role="dialog" aria-labelledby="aria-label-listoptions" aria-hidden="true">
+<h2 id="aria-label-listoptions" class="voice"><roundcube:label name="arialabelmessagelistoptions" /></h2>
<roundcube:if condition="!in_array('list_cols', (array)config:dont_override)" />
<fieldset class="floating">
<legend><roundcube:label name="listcolumns" /></legend>
@@ -219,11 +244,12 @@
<br style="clear:both" />
<div class="formbuttons">
<roundcube:button command="menu-save" id="listmenusave" type="input" class="button mainaction" label="save" />
- <roundcube:button command="menu-open" id="listmenucancel" type="input" class="button" label="cancel" />
+ <roundcube:button command="menu-close" prop="messagelistmenu" id="listmenucancel" type="input" class="button" label="cancel" />
</div>
</div>
-<div id="upload-dialog" class="propform popupdialog" title="<roundcube:label name='importmessages' />">
+<div id="upload-dialog" class="propform popupdialog" title="<roundcube:label name='importmessages' />" aria-hidden="true">
+ <h2 id="aria-label-uploaddialog" class="voice"><roundcube:label name="arialabelmailimportdialog" /></h2>
<roundcube:object name="messageimportform" id="uploadform" buttons="no" />
<div class="formbuttons">
<roundcube:button command="import-messages" type="input" class="button mainaction" label="upload" />
diff --git a/skins/larry/templates/message.html b/skins/larry/templates/message.html
index a661f5720..30c3d3d3e 100644
--- a/skins/larry/templates/message.html
+++ b/skins/larry/templates/message.html
@@ -10,8 +10,11 @@
<div id="mainscreen">
+<h1 class="voice"><roundcube:object name="messageHeaders" valueOf="subject" /></h1>
+
<!-- toolbar -->
-<div id="messagetoolbar" class="toolbar fullwidth">
+<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
+<div id="messagetoolbar" class="toolbar fullwidth" role="toolbar" aria-labelledby="aria-label-toolbar">
<roundcube:if condition="!env:extwin" />
<roundcube:button command="list" type="link" class="button back disabled" classAct="button back" classSel="button back pressed" label="back" />
<roundcube:endif />
@@ -25,7 +28,8 @@
<div id="mailview-left">
<!-- folders list -->
-<div id="mailboxcontainer" class="uibox listbox">
+<div id="mailboxcontainer" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist">
+<h2 id="aria-label-folderlist" class="voice"><roundcube:label name="arialabelfolderlist" /></h2>
<div class="scroller">
<roundcube:object name="mailboxlist" id="mailboxlist" class="treelist listing" folder_filter="mail" unreadwrap="%s" />
</div>
@@ -33,27 +37,22 @@
</div>
-<div id="mailview-right" class="uibox">
+<div id="mailview-right" class="uibox" role="main">
<roundcube:else />
<roundcube:object name="mailboxlist" folder_filter="mail" type="js" />
-<div id="mailview-right" class="offset fullwidth uibox">
+<div id="mailview-right" class="offset fullwidth uibox" role="main">
<roundcube:endif />
<div id="messageheader">
<span class="moreheaderstoggle"></span>
-<h2 class="subject"><roundcube:object name="messageHeaders" valueOf="subject" /></h2>
-<div class="message-headers">
-<roundcube:object name="messageHeaders" class="headers-table" addicon="/images/addcontact.png" exclude="subject" max="20" />
-</div>
-<roundcube:object name="messageFullHeaders" id="full-headers" />
-
<!-- record navigation -->
-<div id="countcontrols" class="pagenav">
+<div id="countcontrols" class="pagenav" role="navigation" aria-labelledby="aria-label-countcontrols">
+ <h2 id="aria-label-countcontrols" class="voice"><roundcube:label name="arialabelmessagenav" /></h2>
<roundcube:object name="messageCountDisplay" class="countdisplay" />
- <roundcube:button command="previousmessage" type="link" class="button prevpage disabled" classAct="button prevpage" classSel="button prevpage pressed" innerClass="inner" title="previousmessage" content="&amp;lt;" />
- <roundcube:button command="nextmessage" type="link" class="button nextpage disabled" classAct="button nextpage" classSel="button nextpage pressed" innerClass="inner" title="nextmessage" content="&amp;gt;" />
+ <roundcube:button command="previousmessage" type="link" class="button prevpage disabled" classAct="button prevpage" classSel="button prevpage pressed" innerClass="inner" title="previousmessage" label="previous" />
+ <roundcube:button command="nextmessage" type="link" class="button nextpage disabled" classAct="button nextpage" classSel="button nextpage pressed" innerClass="inner" title="nextmessage" label="next" />
</div>
<roundcube:if condition="env:optional_format=='text'" />
@@ -70,15 +69,22 @@
</div>
<roundcube:endif />
+<h2 class="subject"><span class="voice"><roundcube:label name="subject" />: </span><roundcube:object name="messageHeaders" valueOf="subject" /></h2>
+<div class="message-headers">
+<roundcube:object name="messageHeaders" class="headers-table" addicon="/images/addcontact.png" exclude="subject" max="20" />
+</div>
+<roundcube:object name="messageFullHeaders" id="full-headers" />
<div id="contactphoto"><roundcube:object name="contactphoto" /></div>
</div>
<div id="messagecontent">
-<div class="rightcol">
+<div class="rightcol" role="region" aria-labelledby="aria-label-messageattachments">
+<h2 id="aria-label-messageattachments" class="voice"><roundcube:label name="attachments" /></h2>
<roundcube:object name="messageAttachments" id="attachment-list" class="attachmentslist" />
</div>
-<div class="leftcol">
+<div class="leftcol" role="region" aria-labelledby="aria-label-messagebody">
+<h2 id="aria-label-messagebody" class="voice"><roundcube:label name="arialabelmessagebody" /></h2>
<roundcube:object name="messageObjects" id="message-objects" />
<roundcube:object name="messageBody" id="messagebody" headertableclass="message-partheaders headers-table" />
</div>
@@ -92,11 +98,11 @@
</div><!-- end mainscreen -->
-<div id="attachmentmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li>
- <li><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li>
- <roundcube:container name="attachmentmenu" id="attachmentmenu" />
+<div id="attachmentmenu" class="popupmenu" aria-hidden="true">
+ <ul class="toolbarmenu" id="attachmentoptionsmenu" role="menu">
+ <li role="menuitem"><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li>
+ <li role="menuitem"><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li>
+ <roundcube:container name="attachmentmenu" id="attachmentoptionsmenu" />
</ul>
</div>
diff --git a/skins/larry/templates/messageerror.html b/skins/larry/templates/messageerror.html
index d509ce804..c5c95214c 100644
--- a/skins/larry/templates/messageerror.html
+++ b/skins/larry/templates/messageerror.html
@@ -16,11 +16,12 @@
<div id="mainscreen">
+<h1 class="voice"><roundcube:label name="messageopenerror" /></h1>
+
<!-- toolbar -->
-<div id="messagetoolbar" class="fullwidth">
- <div id="mailtoolbar" class="toolbar">
- <roundcube:button command="list" type="link" class="button back disabled" classAct="button back" classSel="button back pressed" label="back" />
- </div>
+<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
+<div id="messagetoolbar" class="toolbar fullwidth" role="toolbar" aria-labelledby="aria-label-toolbar">
+ <roundcube:button command="list" type="link" class="button back disabled" classAct="button back" classSel="button back pressed" label="back" />
</div>
<div id="mainscreencontent">
@@ -28,7 +29,8 @@
<div id="mailview-left">
<!-- folders list -->
-<div id="mailboxcontainer" class="uibox listbox">
+<div id="mailboxcontainer" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist">
+<h2 id="aria-label-folderlist" class="voice"><roundcube:label name="arialabelfolderlist" /></h2>
<div class="scroller">
<roundcube:object name="mailboxlist" id="mailboxlist" class="treelist listing" folder_filter="mail" unreadwrap="%s" />
</div>
@@ -36,7 +38,7 @@
</div>
-<div id="mailview-right" class="offset uibox">
+<div id="mailview-right" class="uibox">
<div id="messagecontent" class="watermark"></div>
diff --git a/skins/larry/templates/messagepart.html b/skins/larry/templates/messagepart.html
index 3b878c9d7..edf275f6e 100644
--- a/skins/larry/templates/messagepart.html
+++ b/skins/larry/templates/messagepart.html
@@ -10,7 +10,10 @@
<div id="mainscreen">
-<div id="messagetoolbar" class="toolbar fullwidth">
+<h1 class="voice"><roundcube:label name="attachment" />: <roundcube:var name="env:filename" /></h1>
+
+<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
+<div id="messagetoolbar" class="toolbar fullwidth" role="toolbar" aria-labelledby="aria-label-toolbar">
<roundcube:button command="download" type="link" class="button download disabled" classAct="button download" classSel="button download pressed" label="download" />
<roundcube:button command="print" type="link" class="button print disabled" classAct="button print" classSel="button print pressed" label="print" />
<roundcube:container name="toolbar" id="messagetoolbar" />
@@ -18,16 +21,17 @@
<div id="mainscreencontent">
-<div id="messagepartheader" class="uibox listbox">
- <h2 class="boxtitle"><roundcube:label name="properties" /></h2>
+<div id="messagepartheader" class="uibox listbox" role="contentinfo" aria-labelledby="aria-label-contentinfo">
+ <h2 class="boxtitle" id="aria-label-contentinfo"><roundcube:label name="properties" /></h2>
<div class="scroller">
<roundcube:object name="messagePartControls" class="listing" />
</div>
</div>
-<div id="messagepartcontainer" class="uibox">
+<div id="messagepartcontainer" class="uibox" role="main" aria-labelledby="aria-label-messagepart">
+ <h2 id="aria-label-messagepart" class="voice"><roundcube:label name="arialabelattachmentpreview" /></h2>
<div class="iframebox">
- <roundcube:object name="messagePartFrame" id="messagepartframe" frameborder="0" />
+ <roundcube:object name="messagePartFrame" id="messagepartframe" frameborder="0" title="arialabelattachmentpreview" />
</div>
</div>
diff --git a/skins/larry/templates/messagepreview.html b/skins/larry/templates/messagepreview.html
index 4a6d76ead..03fc91505 100644
--- a/skins/larry/templates/messagepreview.html
+++ b/skins/larry/templates/messagepreview.html
@@ -7,9 +7,33 @@
<body class="iframe fullheight">
<div id="messageheader" class="previewheader">
-<h3 class="subject"><roundcube:object name="messageHeaders" valueOf="subject" /></h3>
-<a href="#details" id="previewheaderstoggle" class="moreheaderstoggle"><span class="iconlink" title="<roundcube:label name='togglemoreheaders' />"></span></a>
+<!-- record navigation -->
+<div id="countcontrols" role="toolbar" aria-labelledby="aria-label-messagetoolbar">
+<h2 id="aria-label-messagetoolbar" class="voice"><roundcube:label name="arialabelmessageactions" /></h2>
+<roundcube:if condition="env:optional_format=='text'" />
+ <span class="buttongroup">
+ <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html selected" innerClass="icon" title="changeformathtml" content="HTML" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text" classSel="button changeformat text pressed" innerClass="icon" title="changeformattext" content="Text" />
+ </span>
+ &nbsp;
+<roundcube:elseif condition="env:optional_format=='html'" />
+ <span class="buttongroup">
+ <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html" classSel="button changeformat html pressed" innerClass="icon" title="changeformathtml" content="HTML" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text selected" innerClass="icon" title="changeformattext" content="Text" />
+ </span>
+ &nbsp;
+<roundcube:endif />
+<roundcube:if condition="env:mailbox != config:drafts_mbox">
+ <roundcube:button command="reply" type="link" class="button reply" classSel="button reply pressed" innerClass="icon" title="replytomessage" label="replytomessage" />
+ <roundcube:button command="reply-all" type="link" class="button replyall" classSel="button replyall pressed" innerClass="icon" title="replytoallmessage" label="replytoallmessage" />
+ <roundcube:button command="forward" type="link" class="button forward" classSel="button forward pressed" innerClass="icon" title="forwardmessage" label="forwardmessage" />
+ &nbsp;
+<roundcube:endif />
+ <roundcube:button command="extwin" type="link" class="button extwin" classSel="button extwin pressed" innerClass="icon" title="openinextwin" label="openinextwin" />
+</div>
+
+<h3 class="subject"><span class="voice"><roundcube:label name="subject" />: </span><roundcube:object name="messageHeaders" valueOf="subject" /></h3>
+
+<a href="#details" id="previewheaderstoggle" class="moreheaderstoggle" aria-expanded="false"><span class="iconlink" title="<roundcube:label name='togglemoreheaders' />"></span></a>
<div id="contactphoto"><roundcube:object name="contactphoto" /></div>
<table class="headers-table" id="preview-shortheaders"><tbody><tr>
@@ -28,45 +52,25 @@
<roundcube:object name="messageFullHeaders" id="full-headers" />
-<!-- record navigation -->
-<div id="countcontrols">
-<roundcube:if condition="env:optional_format=='text'" />
- <span class="buttongroup">
- <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html selected" innerClass="icon" title="changeformathtml" content="HTML" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text" classSel="button changeformat text pressed" innerClass="icon" title="changeformattext" content="Text" />
- </span>
- &nbsp;
-<roundcube:elseif condition="env:optional_format=='html'" />
- <span class="buttongroup">
- <roundcube:button command="change-format" prop="html" type="link" class="button first changeformat html" classSel="button changeformat html pressed" innerClass="icon" title="changeformathtml" content="HTML" /><roundcube:button command="change-format" prop="text" type="link" class="button last changeformat text selected" innerClass="icon" title="changeformattext" content="Text" />
- </span>
- &nbsp;
-<roundcube:endif />
-<roundcube:if condition="env:mailbox != config:drafts_mbox">
- <roundcube:button command="reply" type="link" class="button reply" classSel="button reply pressed" innerClass="icon" title="replytomessage" content="&lt;-" />
- <roundcube:button command="reply-all" type="link" class="button replyall" classSel="button replyall pressed" innerClass="icon" title="replytoallmessage" content="&lt;&lt;-" />
- <roundcube:button command="forward" type="link" class="button forward" classSel="button forward pressed" innerClass="icon" title="forwardmessage" content="-&gt;" />
- &nbsp;
-<roundcube:endif />
- <roundcube:button command="extwin" type="link" class="button extwin" classSel="button extwin pressed" innerClass="icon" title="openinextwin" content="[]" />
-</div>
-
</div>
-<div id="messagepreview">
-<div class="rightcol">
+<div id="messagepreview" role="main">
+<div class="rightcol" role="region" aria-labelledby="aria-label-messageattachments">
+<h2 id="aria-label-messageattachments" class="voice"><roundcube:label name="attachments" /></h2>
<roundcube:object name="messageAttachments" id="attachment-list" class="attachmentslist" />
</div>
-<div class="leftcol">
+<div class="leftcol" role="region" aria-labelledby="aria-label-messagebody">
+<h2 id="aria-label-messagebody" class="voice"><roundcube:label name="arialabelmessagebody" /></h2>
<roundcube:object name="messageObjects" id="message-objects" />
<roundcube:object name="messageBody" id="messagebody" headertableclass="message-partheaders headers-table" />
</div>
</div>
-<div id="attachmentmenu" class="popupmenu">
- <ul class="toolbarmenu">
- <li><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li>
- <li><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li>
- <roundcube:container name="attachmentmenu" id="attachmentmenu" />
+<div id="attachmentmenu" class="popupmenu" aria-hidden="true">
+ <ul class="toolbarmenu" id="attachmentoptionsmenu" role="menu">
+ <li role="menuitem"><roundcube:button command="open-attachment" id="attachmenuopen" type="link" label="open" class="icon" classAct="icon active" innerclass="icon extwin" /></li>
+ <li role="menuitem"><roundcube:button command="download-attachment" id="attachmenudownload" type="link" label="download" class="icon" classAct="icon active" innerclass="icon download" /></li>
+ <roundcube:container name="attachmentmenu" id="attachmentoptionsmenu" />
</ul>
</div>
diff --git a/skins/larry/templates/responses.html b/skins/larry/templates/responses.html
index 8e6884539..503ed2177 100644
--- a/skins/larry/templates/responses.html
+++ b/skins/larry/templates/responses.html
@@ -10,23 +10,25 @@
<div id="mainscreen" class="offset">
+<h1 class="voice"><roundcube:label name="settings" /> : <roundcube:label name="identities" /></h1>
+
<roundcube:include file="/includes/settingstabs.html" />
-<div id="settings-right">
+<div id="settings-right" role="main" aria-labelledby="aria-label-responseslist">
<div id="identitieslist" class="uibox listbox">
-<h2 class="boxtitle"><roundcube:label name="responses" /></h2>
+<h2 class="boxtitle" id="aria-label-responseslist"><roundcube:label name="responses" /></h2>
<div class="scroller withfooter">
-<roundcube:object name="responsesList" id="identities-table" class="listing" cellspacing="0" summary="Responses list" noheader="true" />
+<roundcube:object name="responsesList" id="identities-table" class="listing" cellspacing="0" noheader="true" role="listbox" />
</div>
<div class="boxfooter">
-<roundcube:button command="add" type="link" title="savenewresponse" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" content="+" /><roundcube:button command="delete" type="link" title="delete" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" content="-" />
+<roundcube:button command="add" type="link" title="savenewresponse" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="savenewresponse" /><roundcube:button command="delete" type="link" title="delete" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" label="delete" />
</div>
</div>
<div id="identity-details" class="uibox contentbox">
<div class="iframebox">
- <roundcube:object name="responseframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
+ <roundcube:object name="responseframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" title="arialabelresonseeditfrom" />
</div>
</div>
diff --git a/skins/larry/templates/settings.html b/skins/larry/templates/settings.html
index 08df7686e..406b9c9b3 100644
--- a/skins/larry/templates/settings.html
+++ b/skins/larry/templates/settings.html
@@ -10,19 +10,22 @@
<div id="mainscreen" class="offset">
+<h1 class="voice"><roundcube:label name="settings" /> : <roundcube:label name="preferences" /></h1>
+
<roundcube:include file="/includes/settingstabs.html" />
<div id="settings-right">
-<div id="sectionslist" class="uibox listbox">
+<div id="sectionslist" class="uibox listbox" role="navigation" aria-labelledby="aria-label-pefsection">
+<h2 id="aria-label-pefsection" class="boxtitle"><roundcube:label name="section" /></h2>
<div class="scroller">
- <roundcube:object name="sectionslist" id="sections-table" class="listing" />
+ <roundcube:object name="sectionslist" id="sections-table" class="listing iconized" noheader="true" />
</div>
</div>
-<div id="preferences-box" class="uibox contentbox">
+<div id="preferences-box" class="uibox contentbox" role="main">
<div class="iframebox">
- <roundcube:object name="prefsframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
+ <roundcube:object name="prefsframe" id="preferences-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" title="arialabelpreferencesform" />
</div>
</div>
diff --git a/skins/larry/ui.js b/skins/larry/ui.js
index 391e7ab9d..47183f73b 100644
--- a/skins/larry/ui.js
+++ b/skins/larry/ui.js
@@ -20,13 +20,10 @@ function rcube_mail_ui()
searchmenu: { editable:1, callback:searchmenu },
attachmentmenu: { },
listoptions: { editable:1 },
- dragmenu: { sticky:1 },
groupmenu: { above:1 },
mailboxmenu: { above:1 },
spellmenu: { callback: spellmenu },
- // toggle: #1486823, #1486930
- 'attachment-form': { editable:1, above:1, toggle:!bw.ie&&!bw.linux },
- 'upload-form': { editable:1, toggle:!bw.ie&&!bw.linux }
+ 'folder-selector': { iconized:1 }
};
var me = this;
@@ -40,6 +37,7 @@ function rcube_mail_ui()
this.init_tabs = init_tabs;
this.show_about = show_about;
this.show_popup = show_popup;
+ this.toggle_popup = toggle_popup;
this.add_popup = add_popup;
this.set_searchmod = set_searchmod;
this.set_searchscope = set_searchscope;
@@ -138,8 +136,9 @@ function rcube_mail_ui()
/*** mail task ***/
if (rcmail.env.task == 'mail') {
- rcmail.addEventListener('menu-open', menu_open)
- .addEventListener('menu-save', menu_save)
+ rcmail.addEventListener('menu-open', menu_toggle)
+ .addEventListener('menu-close', menu_toggle)
+ .addEventListener('menu-save', save_listoptions)
.addEventListener('responseafterlist', function(e){ switch_view_mode(rcmail.env.threading ? 'thread' : 'list', true) })
.addEventListener('responseaftersearch', function(e){ switch_view_mode(rcmail.env.threading ? 'thread' : 'list', true) });
@@ -157,7 +156,14 @@ function rcube_mail_ui()
// add menu link for each attachment
$('#attachment-list > li').each(function() {
- $(this).append($('<a class="drop"></a>').click(function() { attachmentmenu(this); }));
+ $(this).append($('<a class="drop" tabindex="0" aria-haspopup="true">Show options</a>')
+ .bind('click keypress', function(e) {
+ if (e.type != 'keypress' || rcube_event.get_keycode(e) == 13) {
+ attachmentmenu(this, e);
+ return false;
+ }
+ })
+ );
});
if (get_pref('previewheaders') == '1') {
@@ -184,11 +190,13 @@ function rcube_mail_ui()
}
}
- $('#composeoptionstoggle').click(function(){
- $('#composeoptionstoggle').toggleClass('remove');
- $('#composeoptions').toggle();
+ $('#composeoptionstoggle').click(function(e){
+ var expanded = $('#composeoptions').toggle().is(':visible');
+ $('#composeoptionstoggle').toggleClass('remove').attr('aria-expanded', expanded ? 'true' : 'false');
layout_composeview();
- save_pref('composeoptions', $('#composeoptions').is(':visible') ? '1' : '0');
+ save_pref('composeoptions', expanded ? '1' : '0');
+ if (!rcube_event.is_keyboard(e))
+ this.blur();
return false;
}).css('cursor', 'pointer');
@@ -210,7 +218,7 @@ function rcube_mail_ui()
}
else if (rcmail.env.action == 'list' || !rcmail.env.action) {
var previewframe = $('#mailpreviewframe').is(':visible');
- $('#mailpreviewtoggle').addClass(previewframe ? 'enabled' : 'closed').click(function(e){ toggle_preview_pane(e); return false });
+ $('#mailpreviewtoggle').addClass(previewframe ? 'enabled' : 'closed').attr('aria-expanded', previewframe ? 'true' : 'false').click(function(e){ toggle_preview_pane(e); return false });
$('#maillistmode').addClass(rcmail.env.threading ? '' : 'selected').click(function(e){ switch_view_mode('list'); return false });
$('#mailthreadmode').addClass(rcmail.env.threading ? 'selected' : '').click(function(e){ switch_view_mode('thread'); return false });
@@ -265,7 +273,9 @@ function rcube_mail_ui()
orientation:'v', relative:true, start:266, min:180, size:12 }).init();
}
else if (rcmail.env.action == 'edit-prefs') {
- $('<a href="#toggle">&#9660;</a>')
+ $('<a href="#toggle"></a>')
+ .text(env.toggleoptions)
+ .attr('title', env.toggleoptions)
.addClass('advanced-toggle')
.appendTo('#preferences-details fieldset.advanced legend');
@@ -333,6 +343,10 @@ function rcube_mail_ui()
var val = $('option:selected', this).text();
$(this).next().children().text(val);
});
+
+ select
+ .on('focus', function(e){ overlay.addClass('focus'); })
+ .on('blur', function(e){ overlay.removeClass('focus'); });
});
// set min-width to show all toolbar buttons
@@ -341,63 +355,12 @@ function rcube_mail_ui()
screen.css('min-width', $('.toolbar').width() + $('#quicksearchbar').width() + $('#searchfilter').width() + 30);
}
- $(document.body)
- .bind('mouseup', body_mouseup)
- .bind('keyup', function(e){
- if (e.keyCode == 27) {
- for (var id in popups) {
- if (popups[id].is(':visible'))
- show_popup(id, false);
- }
- }
- });
-
- $('iframe').load(function(e){
- // this = iframe
- try {
- var doc = this.contentDocument ? this.contentDocument : this.contentWindow ? this.contentWindow.document : null;
- $(doc).mouseup(body_mouseup);
- }
- catch (e) {
- // catch possible "Permission denied" error in IE
- };
- })
- .contents().mouseup(body_mouseup);
-
// don't use $(window).resize() due to some unwanted side-effects
window.onresize = resize;
resize();
}
/**
- * Handler for mouse-up events on the document body.
- * This will close all open popup menus
- */
- function body_mouseup(e)
- {
- var config, obj, target = e.target;
-
- if (target.className == 'inner')
- target = e.target.parentNode;
-
- for (var id in popups) {
- obj = popups[id];
- config = popupconfig[id];
- if (obj.is(':visible')
- && target.id != id+'link'
- && target != obj.get(0) // check if scroll bar was clicked (#1489832)
- && !config.toggle
- && (!config.editable || !target_overlaps(target, obj.get(0)))
- && (!config.sticky || !rcube_mouse_is_over(e, obj.get(0)))
- && !$(target).is('.folder-selector-link')
- ) {
- var myid = id+'';
- window.setTimeout(function() { show_popupmenu(myid, false); }, 10);
- }
- }
- }
-
- /**
* Update UI on window resize
*/
function resize(e)
@@ -475,6 +438,8 @@ function rcube_mail_ui()
minHeight: 90
}).show();
+ me.messagedialog.closest('div[role=dialog]').attr('role', 'alertdialog');
+
me.message_timer = window.setTimeout(dialog_close, p.timeout);
}
}
@@ -489,7 +454,7 @@ function rcube_mail_ui()
$('#message-objects div a').addClass('button');
if (!$('#attachment-list li').length) {
- $('div.rightcol').hide();
+ $('div.rightcol').hide().attr('aria-hidden', 'true');
$('div.leftcol').css('margin-right', '0');
}
}
@@ -586,75 +551,35 @@ function rcube_mail_ui()
/**
* Trigger for popup menus
*/
- function show_popup(popup, show, config)
+ function toggle_popup(popup, e, config)
{
// auto-register menu object
if (config || !popupconfig[popup])
add_popup(popup, config);
- var visible = show_popupmenu(popup, show),
- config = popupconfig[popup];
- if (typeof config.callback == 'function')
- config.callback(visible);
+ return rcmail.command('menu-open', popup, e.target, e);
}
/**
- * Show/hide a specific popup menu
+ * (Deprecated) trigger for popup menus
*/
- function show_popupmenu(popup, show)
+ function show_popup(popup, show, config)
{
- var obj = popups[popup],
- config = popupconfig[popup],
- ref = $(config.link ? config.link : '#'+popup+'link'),
- above = config.above;
-
- if (!obj) {
- obj = popups[popup] = $('#'+popup);
- obj.appendTo(document.body); // move them to top for proper absolute positioning
- }
-
- if (!obj || !obj.length)
- return false;
-
- if (typeof show == 'undefined')
- show = obj.is(':visible') ? false : true;
- else if (config.toggle && show && obj.is(':visible'))
- show = false;
-
- if (show && ref.length) {
- var parent = ref.parent(),
- win = $(window),
- pos;
-
- if (parent.hasClass('dropbutton'))
- ref = parent;
+ // auto-register menu object
+ if (config || !popupconfig[popup])
+ add_popup(popup, config);
+ config = popupconfig[popup] || {};
+ var ref = $(config.link ? config.link : '#'+popup+'link'),
pos = ref.offset();
- ref.offsetHeight = ref.outerHeight();
- if (!above && pos.top + ref.offsetHeight + obj.height() > win.height())
- above = true;
- if (pos.left + obj.width() > win.width())
- pos.left = win.width() - obj.width() - 12;
-
- obj.css({ left:pos.left, top:(pos.top + (above ? -obj.height() : ref.offsetHeight)) });
- }
-
- obj[show?'show':'hide']();
-
- return show;
- }
-
- /**
- *
- */
- function target_overlaps(target, elem)
- {
- while (target.parentNode) {
- if (target.parentNode == elem)
- return true;
- target = target.parentNode;
- }
- return false;
+ if (ref.has('.inner'))
+ ref = ref.children('.inner');
+
+ // fire command with simulated mouse click event
+ return rcmail.command('menu-open',
+ { menu:popup, show:show },
+ ref.get(0),
+ $.Event('click', { target:ref.get(0), pageX:pos.left, pageY:pos.top, clientX:pos.left, clientY:pos.top }));
}
@@ -670,7 +595,7 @@ function rcube_mail_ui()
topstyles, bottomstyles, uid;
frame.toggle();
- button.removeClass().addClass(visible ? 'enabled' : 'closed');
+ button.removeClass().toggleClass('enabled closed').attr('aria-expanded', visible ? 'true' : 'false');
if (visible) {
$('#mailview-top').removeClass('fullheight').css({ bottom:'auto' });
@@ -720,9 +645,9 @@ function rcube_mail_ui()
// add toggle button to full headers table
if (full.is(':visible'))
- button.attr('href', '#hide').removeClass('add').addClass('remove')
+ button.attr('href', '#hide').removeClass('add').addClass('remove').attr('aria-expanded', 'true');
else
- button.attr('href', '#details').removeClass('remove').addClass('add')
+ button.attr('href', '#details').removeClass('remove').addClass('add').attr('aria-expanded', 'false');
save_pref('previewheaders', full.is(':visible') ? '1' : '0');
}
@@ -734,25 +659,57 @@ function rcube_mail_ui()
function switch_view_mode(mode, force)
{
if (force || !$('#mail'+mode+'mode').hasClass('disabled')) {
- $('#maillistmode, #mailthreadmode').removeClass('selected');
- $('#mail'+mode+'mode').addClass('selected');
+ $('#maillistmode, #mailthreadmode').removeClass('selected').attr('tabindex', '0').attr('aria-disabled', 'false');
+ $('#mail'+mode+'mode').addClass('selected').attr('tabindex', '-1').attr('aria-disabled', 'true');
}
}
- /**** popup callbacks ****/
+ /**** popup menu callbacks ****/
- function menu_open(p)
+ /**
+ * Handler for menu-open and menu-close events
+ */
+ function menu_toggle(p)
{
- if (p && p.props && p.props.menu == 'attachmentmenu')
- show_popupmenu('attachmentmenu');
- else
- show_listoptions();
- }
+ if (p && p.name == 'messagelistmenu') {
+ show_listoptions(p);
+ }
+ else if (p) {
+ // adjust menu position according to config
+ var config = popupconfig[p.name] || {},
+ ref = $(config.link || '#'+p.name+'link'),
+ visible = p.obj && p.obj.is(':visible'),
+ above = config.above;
+
+ // fix position according to config
+ if (p.obj && visible && ref.length) {
+ var parent = ref.parent(),
+ win = $(window), pos;
+
+ if (parent.hasClass('dropbutton'))
+ ref = parent;
+
+ if (config.above || ref.hasClass('dropbutton')) {
+ pos = ref.offset();
+ p.obj.css({ left:pos.left+'px', top:(pos.top + (config.above ? -p.obj.height() : ref.outerHeight()))+'px' });
+ }
+ }
- function menu_save(prop)
- {
- save_listoptions();
+ // add the right classes
+ if (p.obj && config.iconized) {
+ p.obj.children('ul').addClass('iconized');
+ }
+
+ // apply some data-attributes from menu config
+ if (p.obj && config.editable)
+ p.obj.attr('data-editable', 'true');
+
+ // trigger callback function
+ if (typeof config.callback == 'function') {
+ config.callback(visible, p);
+ }
+ }
}
function searchmenu(show)
@@ -789,7 +746,7 @@ function rcube_mail_ui()
}
}
- function attachmentmenu(elem)
+ function attachmentmenu(elem, event)
{
var id = elem.parentNode.id.replace(/^attach/, '');
@@ -802,41 +759,44 @@ function rcube_mail_ui()
});
popupconfig.attachmentmenu.link = elem;
- rcmail.command('menu-open', {menu: 'attachmentmenu', id: id});
+ rcmail.command('menu-open', {menu: 'attachmentmenu', id: id}, elem, event);
}
- function spellmenu(show)
+ function spellmenu(show, p)
{
- var link, li,
+ var k, link, li,
lang = rcmail.spellcheck_lang(),
- menu = popups.spellmenu,
- ul = $('ul', menu);
+ ul = $('ul', p.obj);
if (!ul.length) {
- ul = $('<ul class="toolbarmenu selectable">');
-
- for (i in rcmail.env.spell_langs) {
- li = $('<li>');
- link = $('<a href="#"></a>').text(rcmail.env.spell_langs[i])
- .addClass('active').data('lang', i)
- .click(function() {
- rcmail.spellcheck_lang_set($(this).data('lang'));
+ ul = $('<ul class="toolbarmenu selectable" role="menu">');
+
+ for (k in rcmail.env.spell_langs) {
+ li = $('<li role="menuitem">');
+ link = $('<a href="#'+k+'" tabindex="0"></a>').text(rcmail.env.spell_langs[k])
+ .addClass('active').data('lang', k)
+ .bind('click keypress', function(e) {
+ if (e.type != 'keypress' || rcube_event.get_keycode(e) == 13) {
+ rcmail.spellcheck_lang_set($(this).data('lang'));
+ rcmail.hide_menu('spellmenu', e);
+ return false;
+ }
});
link.appendTo(li);
li.appendTo(ul);
}
- ul.appendTo(menu);
+ ul.appendTo(p.obj);
}
// select current language
$('li', ul).each(function() {
var el = $('a', this);
if (el.data('lang') == lang)
- el.addClass('selected');
+ el.addClass('selected').attr('aria-selected', 'true');
else if (el.hasClass('selected'))
- el.removeClass('selected');
+ el.removeClass('selected').removeAttr('aria-selected');
});
}
@@ -844,13 +804,13 @@ function rcube_mail_ui()
/**
*
*/
- function show_listoptions()
+ function show_listoptions(p)
{
var $dialog = $('#listoptions');
// close the dialog
if ($dialog.is(':visible')) {
- $dialog.dialog('close');
+ $dialog.dialog('close', p.originalEvent);
return;
}
@@ -869,8 +829,13 @@ function rcube_mail_ui()
resizable: false,
closeOnEscape: true,
title: null,
- close: function() {
+ open: function(e) {
+ setTimeout(function(){ $dialog.find('a, input:not(:disabled)').not('[aria-disabled=true]').first().focus(); }, 100);
+ },
+ close: function(e) {
$dialog.dialog('destroy').hide();
+ if (e.originalEvent && rcube_event.is_keyboard(e.originalEvent))
+ $('#listmenulink').focus();
},
minWidth: 500,
width: $dialog.width()+25
@@ -881,10 +846,13 @@ function rcube_mail_ui()
/**
*
*/
- function save_listoptions()
+ function save_listoptions(p)
{
$('#listoptions').dialog('close');
+ if (rcube_event.is_keyboard(p.originalEvent))
+ $('#listmenulink').focus();
+
var sort = $('input[name="sort_col"]:checked').val(),
ord = $('input[name="sort_ord"]:checked').val(),
cols = $('input[name="list_col[]"]:checked')
@@ -982,7 +950,7 @@ function rcube_mail_ui()
});
}
- function show_uploadform()
+ function show_uploadform(e)
{
var $dialog = $('#upload-dialog');
@@ -1008,6 +976,10 @@ function rcube_mail_ui()
resizable: false,
closeOnEscape: true,
title: $dialog.attr('title'),
+ open: function(e) {
+ if (!document.all)
+ $('input[type=file]', $dialog).first().click();
+ },
close: function() {
try { $('#upload-dialog form').get(0).reset(); }
catch(e){ } // ignore errors
@@ -1017,9 +989,6 @@ function rcube_mail_ui()
},
width: 480
}).show();
-
- if (!document.all)
- $('input[type=file]', $dialog).first().click();
}
function add_uploadfile(e)
@@ -1086,47 +1055,35 @@ function rcube_mail_ui()
content.attr('id', id);
}
- // first hide not selected tabs
- current = current || 0;
- fs.each(function(idx) { if (idx != current) $(this).hide(); });
-
// create tabs container
- var tabs = $('<div>').addClass('tabsbar').prependTo(content);
+ var tabs = $('<ul>').addClass('tabsbar').prependTo(content);
// convert fildsets into tabs
fs.each(function(idx) {
- var tab, a, elm = $(this), legend = elm.children('legend');
+ var tab, a, elm = $(this),
+ legend = elm.children('legend'),
+ tid = id + '-t' + idx;
// create a tab
- a = $('<a>').text(legend.text()).attr('href', '#');
- tab = $('<span>').attr({'id': 'tab'+idx, 'class': 'tablink'})
- .click(function() { show_tab(id, idx); return false })
+ a = $('<a>').text(legend.text()).attr('href', '#' + tid);
+ tab = $('<li>').addClass('tablink');
// remove legend
legend.remove();
- // style fieldset
- elm.addClass('tab');
- // style selected tab
- if (idx == current)
- tab.addClass('selected');
+
+ // link fieldset with tab item
+ elm.attr('id', tid);
// add the tab to container
tab.append(a).appendTo(tabs);
});
- }
-
- function show_tab(id, index)
- {
- var fs = $('#'+id).children('fieldset');
- fs.each(function(idx) {
- // Show/hide fieldset (tab content)
- $(this)[index==idx ? 'show' : 'hide']();
- // Select/unselect tab
- $('#tab'+idx).toggleClass('selected', idx==index);
+ // use jquery UI tabs widget to do the interaction and styling
+ content.tabs({
+ active: current || 0,
+ heightStyle: 'content',
+ activate: function(e, ui) {resize(); }
});
-
- resize();
}
/**
@@ -1237,6 +1194,7 @@ function rcube_splitter(p)
this.handle = $('<div>')
.attr('id', this.id)
.attr('unselectable', 'on')
+ .attr('role', 'presentation')
.addClass('splitter ' + (this.horizontal ? 'splitter-h' : 'splitter-v'))
.appendTo(this.parent)
.bind('mousedown', onDragStart);