#467296 by Frank Ralf, mgifford, Everett Zufelt, Cliff,seutje, Bojhan, kat3_drx, et al: Accessibility improvements for vertical tabs.
parent
401a7ad2dd
commit
145e717897
|
@ -2722,7 +2722,9 @@ function theme_vertical_tabs($variables) {
|
||||||
// Add required JavaScript and Stylesheet.
|
// Add required JavaScript and Stylesheet.
|
||||||
drupal_add_library('system', 'vertical-tabs');
|
drupal_add_library('system', 'vertical-tabs');
|
||||||
|
|
||||||
return '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
|
$output = '<h2 class="element-invisible">' . t('Vertical Tabs') . '</h2>';
|
||||||
|
$output .= '<div class="vertical-tabs-panes">' . $element['#children'] . '</div>';
|
||||||
|
return $output;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -40,23 +40,25 @@ div.vertical-tabs ul.vertical-tabs-list li a {
|
||||||
line-height: 1.3em;
|
line-height: 1.3em;
|
||||||
height: 1%;
|
height: 1%;
|
||||||
}
|
}
|
||||||
div.vertical-tabs ul.vertical-tabs-list li a:focus {
|
div.vertical-tabs ul.vertical-tabs-list li a:focus strong,
|
||||||
|
div.vertical-tabs ul.vertical-tabs-list li a:active strong,
|
||||||
|
div.vertical-tabs ul.vertical-tabs-list li a:hover strong {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
div.vertical-tabs ul.vertical-tabs-list li a:focus,
|
||||||
|
div.vertical-tabs ul.vertical-tabs-list li a:active {
|
||||||
position: relative;
|
position: relative;
|
||||||
z-index: 5;
|
z-index: 5;
|
||||||
}
|
}
|
||||||
div.vertical-tabs ul.vertical-tabs-list li a:hover {
|
div.vertical-tabs ul.vertical-tabs-list li a:hover {
|
||||||
text-decoration: none;
|
outline: 1px dotted;
|
||||||
}
|
}
|
||||||
div.vertical-tabs ul.vertical-tabs-list li.selected {
|
div.vertical-tabs ul.vertical-tabs-list li.selected {
|
||||||
background: #fff;
|
background-color: #fff;
|
||||||
border-right-width: 0;
|
border-right-width: 0;
|
||||||
position: relative;
|
position: relative;
|
||||||
}
|
}
|
||||||
div.vertical-tabs ul.vertical-tabs-list li.selected a:focus {
|
div.vertical-tabs ul.vertical-tabs-list span.selected strong {
|
||||||
outline: 0;
|
|
||||||
}
|
|
||||||
div.vertical-tabs ul.vertical-tabs-list li.selected strong,
|
|
||||||
div.vertical-tabs ul.vertical-tabs-list li.selected small {
|
|
||||||
color: #000;
|
color: #000;
|
||||||
}
|
}
|
||||||
div.vertical-tabs ul.vertical-tabs-list .summary {
|
div.vertical-tabs ul.vertical-tabs-list .summary {
|
||||||
|
|
|
@ -17,39 +17,42 @@ Drupal.behaviors.verticalTabs = {
|
||||||
attach: function (context) {
|
attach: function (context) {
|
||||||
$('.vertical-tabs-panes', context).once('vertical-tabs', function () {
|
$('.vertical-tabs-panes', context).once('vertical-tabs', function () {
|
||||||
var focusID = $(':hidden.vertical-tabs-active-tab', this).val();
|
var focusID = $(':hidden.vertical-tabs-active-tab', this).val();
|
||||||
var focus;
|
var tab_focus;
|
||||||
|
|
||||||
// Check if there are some fieldsets that can be converted to vertical-tabs
|
// Check if there are some fieldsets that can be converted to vertical-tabs
|
||||||
var $fieldsets = $('> fieldset', this);
|
var $fieldsets = $('> fieldset', this);
|
||||||
if ($fieldsets.length == 0) {
|
if ($fieldsets.length == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the tab column.
|
// Create the tab column.
|
||||||
var list = $('<ul class="vertical-tabs-list"></ul>');
|
var tab_list = $('<ul class="vertical-tabs-list"></ul>');
|
||||||
$(this).wrap('<div class="vertical-tabs clearfix"></div>').before(list);
|
$(this).wrap('<div class="vertical-tabs clearfix"></div>').before(tab_list);
|
||||||
|
|
||||||
// Transform each fieldset into a tab.
|
// Transform each fieldset into a tab.
|
||||||
$fieldsets.each(function () {
|
$fieldsets.each(function () {
|
||||||
var tab = new Drupal.verticalTab({ title: $('> legend', this).text(), fieldset: $(this) });
|
var vertical_tab = new Drupal.verticalTab({
|
||||||
list.append(tab.item);
|
title: $('> legend', this).text(),
|
||||||
|
fieldset: $(this)
|
||||||
|
});
|
||||||
|
tab_list.append(vertical_tab.item);
|
||||||
$(this)
|
$(this)
|
||||||
.removeClass('collapsible collapsed')
|
.removeClass('collapsible collapsed')
|
||||||
.addClass('vertical-tabs-pane')
|
.addClass('vertical-tabs-pane')
|
||||||
.data('verticalTab', tab);
|
.data('verticalTab', vertical_tab);
|
||||||
if (this.id == focusID) {
|
if (this.id == focusID) {
|
||||||
focus = $(this);
|
tab_focus = $(this);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('> li:first', list).addClass('first');
|
$('> li:first', tab_list).addClass('first');
|
||||||
$('> li:last', list).addClass('last');
|
$('> li:last', tab_list).addClass('last');
|
||||||
|
|
||||||
if (!focus) {
|
if (!tab_focus) {
|
||||||
focus = $('> .vertical-tabs-pane:first', this);
|
tab_focus = $('> .vertical-tabs-pane:first', this);
|
||||||
}
|
}
|
||||||
if (focus.length) {
|
if (tab_focus.length) {
|
||||||
focus.data('verticalTab').focus();
|
tab_focus.data('verticalTab').focus();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -72,6 +75,27 @@ Drupal.verticalTab = function (settings) {
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Keyboard events added:
|
||||||
|
// Pressing the Enter key will open the tab pane.
|
||||||
|
this.link.keydown(function(event) {
|
||||||
|
if (event.keyCode == 13) {
|
||||||
|
self.focus();
|
||||||
|
// Set focus on the first input field of the visible fieldset/tab pane.
|
||||||
|
$("fieldset.vertical-tabs-pane :input:visible:enabled:first").focus();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Pressing the Enter key lets you leave the tab again.
|
||||||
|
this.fieldset.keydown(function(event) {
|
||||||
|
// Enter key should not trigger inside <textarea> to allow for multi-line entries.
|
||||||
|
if (event.keyCode == 13 && event.target.nodeName != "TEXTAREA") {
|
||||||
|
// Set focus on the selected tab button again.
|
||||||
|
$(".vertical-tab-button.selected a").focus();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
this.fieldset
|
this.fieldset
|
||||||
.bind('summaryUpdated', function () {
|
.bind('summaryUpdated', function () {
|
||||||
self.updateSummary();
|
self.updateSummary();
|
||||||
|
@ -96,6 +120,9 @@ Drupal.verticalTab.prototype = {
|
||||||
.siblings(':hidden.vertical-tabs-active-tab')
|
.siblings(':hidden.vertical-tabs-active-tab')
|
||||||
.val(this.fieldset.attr('id'));
|
.val(this.fieldset.attr('id'));
|
||||||
this.item.addClass('selected');
|
this.item.addClass('selected');
|
||||||
|
// Mark the active tab for screen readers.
|
||||||
|
$('#active-vertical-tab').remove();
|
||||||
|
this.link.append('<span id="active-vertical-tab" class="element-invisible">' + Drupal.t('(active tab)') + '</span>');
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -160,10 +187,10 @@ Drupal.verticalTab.prototype = {
|
||||||
*/
|
*/
|
||||||
Drupal.theme.prototype.verticalTab = function (settings) {
|
Drupal.theme.prototype.verticalTab = function (settings) {
|
||||||
var tab = {};
|
var tab = {};
|
||||||
tab.item = $('<li class="vertical-tab-button"></li>')
|
tab.item = $('<li class="vertical-tab-button" tabindex="-1"></li>')
|
||||||
.append(tab.link = $('<a href="#"></a>')
|
.append(tab.link = $('<a href="#"></a>')
|
||||||
.append(tab.title = $('<strong></strong>').text(settings.title))
|
.append(tab.title = $('<strong></strong>').text(settings.title))
|
||||||
.append(tab.summary = $('<small class="summary"></small>')
|
.append(tab.summary = $('<span class="summary"></span>')
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
return tab;
|
return tab;
|
||||||
|
|
Loading…
Reference in New Issue