diff options
author | Thomas Bruederli <thomas@roundcube.net> | 2014-06-05 09:18:07 +0200 |
---|---|---|
committer | Thomas Bruederli <thomas@roundcube.net> | 2014-06-05 09:18:07 +0200 |
commit | 99cdca46b7bcc46fe6affd9e9f9f60a546b2e5b8 (patch) | |
tree | e3d0bec8e981825e98681fb4d5ec1ec73ee65c40 /skins/larry | |
parent | 17a76c3fd7665e92d2160f2178e31b3821a98e1e (diff) | |
parent | 3412e50b54e3daac8745234e21ab6e72be0ed165 (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/larry')
23 files changed, 895 insertions, 701 deletions
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 && !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="⚙" /> + <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="|&lt;" /> - <roundcube:button command="previouspage" type="link" class="icon prevpage disabled" classAct="icon prevpage" title="previouspage" content="&lt;" /> - <roundcube:button command="nextpage" type="link" class="icon nextpage disabled" classAct="icon nextpage" title="nextpage" content="&gt;" /> - <roundcube:button command="lastpage" type="link" class="icon lastpage disabled" classAct="icon lastpage" title="lastpage" content="&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="|&lt;" /> - <roundcube:button command="previouspage" type="link" class="icon prevpage disabled" classAct="icon prevpage" title="previouspage" content="&lt;" /> - <roundcube:button command="nextpage" type="link" class="icon nextpage disabled" classAct="icon nextpage" title="nextpage" content="&gt;" /> - <roundcube:button command="lastpage" type="link" class="icon lastpage disabled" classAct="icon lastpage" title="lastpage" content="&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="⚙" /> + <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="⚙" 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" /> ● <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="⚙" /> + <roundcube:button name="mailboxmenulink" id="mailboxmenulink" type="link" title="folderactions" class="listbutton groupactions" onclick="UI.toggle_popup('mailboxmenu',event);return false" innerClass="inner" content="⚙" 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" /> - <a href="#threads" id="threadselectmenulink" class="menuselector" onclick="UI.show_popup('threadselectmenu');return false"><span class="handle"><roundcube:label name="threads" /></span></a> + <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="|&lt;" /> - <roundcube:button command="previouspage" type="link" class="button prevpage disabled" classAct="button prevpage" classSel="button prevpage pressed" innerClass="inner" title="previouspage" content="&lt;" /> - <roundcube:button command="nextpage" type="link" class="button nextpage disabled" classAct="button nextpage" classSel="button nextpage pressed" innerClass="inner" title="nextpage" content="&gt;" /> - <roundcube:button command="lastpage" type="link" class="button lastpage disabled" classAct="button lastpage" classSel="button lastpage pressed" innerClass="inner" title="lastpage" content="&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="&lt;" /> - <roundcube:button command="nextmessage" type="link" class="button nextpage disabled" classAct="button nextpage" classSel="button nextpage pressed" innerClass="inner" title="nextmessage" content="&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> + +<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> + +<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" /> + +<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> - -<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> - -<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="<-" /> - <roundcube:button command="reply-all" type="link" class="button replyall" classSel="button replyall pressed" innerClass="icon" title="replytoallmessage" content="<<-" /> - <roundcube:button command="forward" type="link" class="button forward" classSel="button forward pressed" innerClass="icon" title="forwardmessage" content="->" /> - -<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">▼</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); |