Here is a picture of my dog, Kogepan:
++ +
++ I should really use an ABBR tag in this paragraph because QUAIL is an acronym. +
+diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..dfe077042 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore index 1e810c884..411f11d6b 100644 --- a/.gitignore +++ b/.gitignore @@ -5,10 +5,7 @@ examples/wysiwyg/editors/aloha/* examples/wysiwyg/editors/tinymce/* examples/wysiwyg/editors/ckeditor/* examples/wysiwyg/editors/ckeditor4/* -_site node_modules/* -utilities/printTable.php - -utilities/guidelineFinder.php - -utilities/tests.json +.grunt/* +bower_components/* +lib/* \ No newline at end of file diff --git a/.jshintrc b/.jshintrc new file mode 100644 index 000000000..922bb3fde --- /dev/null +++ b/.jshintrc @@ -0,0 +1,18 @@ +{ + "curly": true, + "eqeqeq": true, + "immed": true, + "latedef": true, + "newcap": true, + "noarg": true, + "sub": true, + "undef": true, + "boss": true, + "eqnull": true, + "browser": true, + "jquery": true, + "globals": { + "quail": true, + "process": true + } +} \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index b6825861a..a2b03117b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,6 +2,14 @@ language: node_js node_js: - 0.8 +env: + global: + - secure: "chVihuGb0n35Lvu3H87JUCmVTg8UpIPLqRhtNHRQc/6a1bXH8Q0KMCIIhIO1lhSJXkIy/x9OwqXOve4Do8liXrwgJMuy673e9lGFxK4XFujTlvyEAwHhlMOhGpo/UYyt3wn3aFB0GY1lKn1+HtecJYSOqyVQ3unhY1lO1cCkkig=" + - secure: "BWWoZltjRxfbKF4AlrPq9aSumY63n/xDnSvmuHXAEmbfJoWpOXXB0me5H6515I0zH1hjpHyusmQ0UXfRQAie26kvpPyGIdjs12mfGT0hLrkdO2ua/OlosufatnZAb4F0eg9Z6AR2w+94BK5vNfc+gSbHWWI8SLjMa29Oz+WLdL0=" + install: - npm install grunt-cli -g - npm install + +after_success: + - grunt saucelabs --verbose \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 40aa11af1..086c69f78 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,28 @@ QUAIL Changelog =============== +2.1 +--- +- Changed license to MIT +- Quail is now split into various components and custom callbacks that are build using `grunt build` +- Configuration is now in YAML format +- Tests are explicitly aligned with WCAG techniques or success criteria. +- Tests can have translatable titles and default descriptions. +- Tests now support different configurations based on guideline alignment. + +2.0.4 +----- +- Moved source files to different files in `/src`, `/dist` is now built versions of quail. +- Renamed all test files to match their accessibility tests. +- Updated most test files to HTML5 doctype. +- Got rid of dependencies for pxtoem and hasEvent libraries. +- Made strings build into JS instead of needing ajax calls. + +2.0.3 +----- +- Added tags to tests so that they could be categorized by implementations. +- Cleaned up some Grunt linting. + 2.0.2 ----- - Added filtering as an extra option. diff --git a/Gruntfile.js b/Gruntfile.js index 0fb57b8b2..cd239a496 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -2,70 +2,187 @@ /*global module:false*/ module.exports = function(grunt) { + var buildId = (typeof process.env.TRAVIS_BUILD_ID !== 'undefined') ? process.env.TRAVIS_BUILD_ID : Date.now(); // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('quail.json'), + convert: { + yml2json: { + files: [ + { + expand: true, + cwd: 'src/resources/guidelines', + src: ['*.yml'], + dest: 'dist/guidelines/', + ext: '.json' + }, + { + expand: true, + cwd: 'src/resources', + src: ['*.yml'], + dest: 'dist/', + ext: '.json' + } + ] + } + }, + shell: { + hooks: { + command: 'cp git-hooks/pre-commit .git/hooks/' + } + }, concat: { options: { - banner: '/*! QUAIL quailjs.org | quailjs.org/license */', + banner: '<%= pkg.options.banner %>' + "\n" + ';(function($) {' + "\n", + footer: "\n" + '})(jQuery);', stripBanners: true - }, + }, dist: { - src: ['src/<%= pkg.name %>.js'] + src: ['src/js/core.js', 'src/js/components/*.js', 'src/js/strings/*.js', 'src/js/custom/*.js'], + dest: 'dist/quail.jquery.js' } }, uglify: { - options: { - banner: '<%= concat.options.banner %>' - }, dist: { - files : { - 'src/quail.min.js' : 'src/quail.js' + files: { + 'dist/quail.jquery.min.js': 'dist/quail.jquery.js' } + }, + options: { + banner: '<%= pkg.options.banner %>' } }, qunit: { files: ['test/quail.html'] }, - watch: { - files: '<%= jshint.files %>', - tasks: 'test' - }, jshint: { options: { - curly: true, - eqeqeq: true, - immed: true, - latedef: true, - newcap: true, - noarg: true, - sub: true, - undef: true, - boss: true, - eqnull: true, - browser: true, - globals: { - jQuery: true + jshintrc: '.jshintrc' + }, + files: ['Gruntfile.js', 'src/**/*.js'] + }, + watch: { + scripts: { + files: ['src/**/*.js', 'src/**/*.yml'], + tasks: ['convert', 'concat', 'jshint', 'buildGuideline', 'uglify'], + options: { + spawn: false } + } + }, + buildGuideline: { + dist: { + files: [ + { guideline: '508', src: 'dist/tests.json', dest: 'dist/guidelines/508.tests.json' }, + { guideline: 'wcag', src: 'dist/tests.json', dest: 'dist/guidelines/wcag.tests.json' } + ] + } + }, + compressTestsJson: { + dist: { + files: [ + { src: 'dist/tests.json', dest: 'dist/tests.min.json' } + ] + } + }, + 'gh-pages': { + options: { + base: '', + add: true }, - files: ['Gruntfile.js', 'src/quail.js', 'src/resources/**/*.json'] + src: ['dist/**'] + }, + connect: { + server: { + options: { + port: 9999 + } + } + }, + 'saucelabs-qunit': { + all: { + options: { + urls: ['http://127.0.0.1:9999/test/quail.html'], + tunnelTimeout: 10, + testTimeout: 900000000, + concurrency: 3, + detailedError: true, + build: buildId, + testname: buildId, + tags: [ + process.env.TRAVIS_BRANCH, + process.env.TRAVIS_COMMIT + ], + browsers: [ + { + browserName: 'chrome', + platform: 'OS X 10.9' + }, + { + browserName: 'chrome', + platform: 'Windows 8' + }, + { + browserName: 'firefox', + platform: 'OS X 10.9' + }, + { + browserName: 'firefox', + platform: 'Windows 8' + }, + { + browserName: 'opera' + }, + { + browserName: 'internet explorer', + version: '10' + }, + { + browserName: 'internet explorer', + version: '11', + platform: 'Windows 8.1' + }, + { + browserName: 'iphone' + } + ] + } + } + }, + bower: { + install: { } + }, + supressSaucelabsOutput: { + all: { } } }); - + grunt.loadTasks('tasks'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); - - // Linting, mostly to test JSON. - grunt.registerTask('lint', ['jshint']); + grunt.loadNpmTasks('grunt-contrib-concat'); + grunt.loadNpmTasks('grunt-convert'); + grunt.loadNpmTasks('grunt-shell'); + grunt.loadNpmTasks('grunt-gh-pages'); + grunt.loadNpmTasks('grunt-bower-task'); + grunt.loadNpmTasks('grunt-saucelabs'); + grunt.loadNpmTasks('grunt-contrib-connect'); // By default, just run tests - grunt.registerTask('default', ['test']); + grunt.registerTask('default', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'qunit']); + + // Build task. + grunt.registerTask('build', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'uglify']); // Release task. - grunt.registerTask('release', ['jshint', 'qunit', 'uglify']); + grunt.registerTask('release', ['bower:install', 'convert', 'concat', 'jshint', 'qunit', 'buildGuideline', 'compressTestsJson', 'uglify', 'gh-pages']); // Test task. - grunt.registerTask('test', ['jshint', 'qunit']); + grunt.registerTask('test', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'qunit']); + + // Saucelabs task (need to add your own environment variables) + grunt.registerTask('saucelabs', ['bower:install', 'convert', 'concat', 'jshint', 'buildGuideline', 'compressTestsJson', 'connect', 'supressSaucelabsOutput', 'saucelabs-qunit']); + + grunt.registerTask('publish', ['gh-pages']); }; diff --git a/LICENSE-GPL b/LICENSE-GPL deleted file mode 100644 index 07addd422..000000000 --- a/LICENSE-GPL +++ /dev/null @@ -1,280 +0,0 @@ -QUAIL is copyright (c) 2012 Kevin Miller - - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 000000000..6ebc84f96 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +Copyright 2013 Kevin Miller and other contributors +http://quailjs.org + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/README.md b/README.md index 131398d95..bfdfd2c23 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ -[![Build Status](https://secure.travis-ci.org/kevee/quail.png?branch=master)](http://travis-ci.org/kevee/quail) +[![Build Status](https://secure.travis-ci.org/kevee/quail.png?branch=master)](http://travis-ci.org/kevee/quail) [![Selenium Test Status](https://saucelabs.com/browser-matrix/quailjs.svg)](https://saucelabs.com/u/quailjs) -QUAIL: Accessibility Information Library +Quail: Accessibility Information Library ======================================== A jQuery plugin that lets you easily check HTML for adherence to accessibility standards. It comes with over 200 tests which implement Open Accessibility Tests and comes with WCAG 1.0, WCAG 2.0, and Section 508 guidelines. @@ -9,6 +9,20 @@ Developers can build their own guidelines, or easily build a custom guideline th **The project website is [quailjs.org](http://quailjs.org/).** +Building Quail +-------------- +If you are not familiar with using grunt or just want to download a pre-built version of quail, [visit the releases page for the project](https://github.com/kevee/quail/releases). + +If you are checking out quail from a repository, you will notice there is no `/dist` directory, quail must be built using [Grunt](http://gruntjs.com/). Use the following steps to get started (this is assuming you already have [Node](http://nodejs.org/) installed on your machine): + +``` +cd quail +npm install +grunt build +``` + +This does two things: it downloads libraries (like qunit and jQuery) into the `/lib` directory, and builds quail (both a development version and a minified, production version) into the `/dist` directory. + Documentation ------------- @@ -21,11 +35,12 @@ Pull requests should be made against the **dev** branch, as master is only for t Credits ------- -- QUAIL is maintained by [Kevin Miller](http://twitter.com/kevinmiyar) -- Part of QUAIL development is supported by [Cal State Monterey Bay](http://csumb.edu) -- Thanks to the hosts of [Chez JJ](http://chezjj.com/), who housed Kevin for a week while he worked on QUAIL 2. +- Quail is maintained by [Kevin Miller](http://twitter.com/kevinmiyar) +- Part of Quail development is supported by [Cal State Monterey Bay](http://csumb.edu) +- Many thanks to [Jesse Renée Beach](https://twitter.com/jessebeach) for promoting Quail and the many commits. +- Thanks to the hosts of [Chez JJ](http://chezjj.com/), who housed Kevin for a week while he worked on Quail 2. Legal ----- -QUAIL is covered under the GPL Version 2, and is copyright (c) 2012 by Kevin Miller. Current license is at http://quailjs.org/license. \ No newline at end of file +QUAIL is covered under the MIT License, and is copyright (c) 2013 by Kevin Miller. Current license is at http://quailjs.org/license. \ No newline at end of file diff --git a/bower.json b/bower.json new file mode 100644 index 000000000..7dd664074 --- /dev/null +++ b/bower.json @@ -0,0 +1,16 @@ +{ + "name": "quail", + "version": "2.1.0", + "main": "dist/quail.jquery.js", + "ignore": [ + ".jshintrc", + "**/*.txt" + ], + "dependencies": { + "jquery": "~2.0.3" + }, + "devDependencies": { + "qunit": "~1.12.0", + "qunit-composite": "https://github.com/jquery/qunit-composite.git" + } +} diff --git a/dist/guidelines/508.json b/dist/guidelines/508.json new file mode 100644 index 000000000..d90414c8c --- /dev/null +++ b/dist/guidelines/508.json @@ -0,0 +1,52 @@ +{ + "guidelines": { + "a": { + "title": "A text equivalent for every non-text element shall be provided (e.g., via 'alt', 'longdesc', or in element content)." + }, + "b": { + "title": "Equivalent alternatives for any multimedia presentation shall be synchronized with the presentation." + }, + "c": { + "title": "Web pages shall be designed so that all information conveyed with color is also available without color, for example from context or markup." + }, + "d": { + "title": "Documents shall be organized so they are readable without requiring an associated style sheet." + }, + "e": { + "title": "Redundant text links shall be provided for each active region of a server-side image map." + }, + "f": { + "title": "Client-side image maps shall be provided instead of server-side image maps except where the regions cannot be defined with an available geometric shape." + }, + "g": { + "title": "Row and column headers shall be identified for data tables." + }, + "h": { + "title": "Markup shall be used to associate data cells and header cells for data tables that have two or more logical levels of row or column headers." + }, + "i": { + "title": "Frames shall be titled with text that facilitates frame identification and navigation." + }, + "j": { + "title": "Pages shall be designed to avoid causing the screen to flicker with a frequency greater than 2 Hz and lower than 55 Hz." + }, + "k": { + "title": "A text-only page, with equivalent information or functionality, shall be provided to make a web site comply with the provisions of this part, when compliance cannot be accomplished in any other way. The content of the text-only page shall be updated whenever the primary page changes." + }, + "l": { + "title": "When pages utilize scripting languages to display content, or to create interface elements, the information provided by the script shall be identified with functional text that can be read by assistive technology." + }, + "m": { + "title": "When a web page requires that an applet, plug-in or other application be present on the client system to interpret page content, the page must provide a link to a plug-in or applet that complies with §1194.21(a) through (l)." + }, + "n": { + "title": "When electronic forms are designed to be completed on-line, the form shall allow people using assistive technology to access the information, field elements, and functionality required for completion and submission of the form, including all directions and cues." + }, + "o": { + "title": "A method shall be provided that permits users to skip repetitive navigation links." + }, + "p": { + "title": "When a timed response is required, the user shall be alerted and given sufficient time to indicate more time is required." + } + } +} \ No newline at end of file diff --git a/dist/guidelines/508.tests.json b/dist/guidelines/508.tests.json new file mode 100644 index 000000000..d3e3e6b87 --- /dev/null +++ b/dist/guidelines/508.tests.json @@ -0,0 +1 @@ +["aLinksToMultiMediaRequireTranscript","aLinksToSoundFilesNeedTranscripts","appletContainsTextEquivalent","appletContainsTextEquivalentInAlt","appletTextEquivalentsGetUpdated","appletUIMustBeAccessible","appletsDoNotFlicker","appletsDoneUseColorAlone","checkboxHasLabel","documentContentReadableWithoutStylesheets","fileHasLabel","imgAltIsDifferent","imgAltIsSameInText","imgAltIsTooLong","imgAltNotEmptyInAnchor","imgAltNotPlaceHolder","imgGifNoFlicker","imgHasAlt","imgMapAreasHaveDuplicateLink","imgNonDecorativeHasAlt","imgNotReferredToByColorAlone","imgWithMapHasUseMap","inputDoesNotUseColorAlone","inputImageAltIsNotFileName","inputImageAltIsNotPlaceholder","inputImageAltIsShort","inputImageHasAlt","objectDoesNotFlicker","objectDoesNotUseColorAlone","objectTextUpdatesWhenObjectChanges","passwordHasLabel","radioHasLabel","scriptInBodyMustHaveNoscript","scriptOnclickRequiresOnKeypress","scriptOndblclickRequiresOnKeypress","scriptOnmousedownRequiresOnKeypress","scriptOnmousemove","scriptOnmouseoutHasOnmouseblur","scriptOnmouseoverHasOnfocus","scriptOnmouseupHasOnkeyup","scriptUIMustBeAccessible","scriptsDoNotFlicker","scriptsDoNotUseColorAlone","skipToContentLinkProvided","tableDataShouldHaveTh","tableWithBothHeadersUseScope","videoProvidesCaptions"] \ No newline at end of file diff --git a/dist/guidelines/wcag.json b/dist/guidelines/wcag.json new file mode 100644 index 000000000..ab5d6e238 --- /dev/null +++ b/dist/guidelines/wcag.json @@ -0,0 +1,2323 @@ +{ + "guidelines": { + "1.1.1": { + "id": "text-equiv-all", + "title": "Non-text Content", + "description": "All non-text content that is presented to the user has a text alternative that serves the equivalent purpose, except for the situations listed below.", + "uri": "http://www.w3.org/TR/WCAG20/#text-equiv-all", + "techniques": [ + "C9", + "C18", + "F3", + "F13", + "F20", + "F30", + "F38", + "F39", + "F65", + "F67", + "F71", + "F72", + "FLASH1", + "FLASH2", + "FLASH3", + "FLASH5", + "FLASH6", + "FLASH11", + "FLASH25", + "FLASH27", + "FLASH28", + "FLASH29", + "FLASH30", + "FLASH32", + "G68", + "G73", + "G74", + "G82", + "G92", + "G94", + "G95", + "G100", + "G143", + "G144", + "G196", + "H2", + "H24", + "H27", + "H30", + "H35", + "H36", + "H37", + "H44", + "H45", + "H46", + "H53", + "H65", + "H67", + "H86", + "SL5", + "SL8", + "SL18", + "SL19", + "SL26", + "SL30" + ] + }, + "1.2.1": { + "id": "media-equiv-av-only-alt", + "title": "Audio-only and Video-only (Prerecorded)", + "description": "For prerecorded audio-only and prerecorded video-only media, the following are true, except when the audio or video is a media alternative for text and is clearly labeled as such:", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-av-only-alt", + "techniques": [ + "F30", + "F67", + "G158", + "G159", + "G166", + "SL17" + ] + }, + "1.2.2": { + "id": "media-equiv-captions", + "title": "Captions (Prerecorded)", + "description": "Captions are provided for all prerecorded audio content in synchronized media, except when the media is a media alternative for text and is clearly labeled as such.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-captions", + "techniques": [ + "F8", + "F74", + "F75", + "FLASH9", + "G87", + "G93", + "SL16", + "SL28", + "SM11", + "SM12" + ] + }, + "1.2.3": { + "id": "media-equiv-audio-desc", + "title": "Audio Description or Media Alternative (Prerecorded)", + "description": "An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media, except when the media is a media alternative for text and is clearly labeled as such.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-audio-desc", + "techniques": [ + "FLASH26", + "G8", + "G58", + "G69", + "G78", + "G173", + "G203", + "H53", + "SL1", + "SL17", + "SM1", + "SM2", + "SM6", + "SM7" + ] + }, + "1.2.4": { + "id": "media-equiv-real-time-captions", + "title": "Captions (Live)", + "description": "Captions are provided for all live audio content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-real-time-captions", + "techniques": [ + "G9", + "G87", + "G93", + "SM11", + "SM12" + ] + }, + "1.2.5": { + "id": "media-equiv-audio-desc-only", + "title": "Audio Description (Prerecorded)", + "description": "Audio description is provided for all prerecorded video content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-audio-desc-only", + "techniques": [ + "FLASH26", + "G8", + "G78", + "G173", + "G203", + "SL1", + "SM1", + "SM2", + "SM6", + "SM7" + ] + }, + "1.2.6": { + "id": "media-equiv-sign", + "title": "Sign Language (Prerecorded)", + "description": "Sign language interpretation is provided for all prerecorded audio content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-sign", + "techniques": [ + "G54", + "G81", + "SM13", + "SM14" + ] + }, + "1.2.7": { + "id": "media-equiv-extended-ad", + "title": "Extended Audio Description (Prerecorded)", + "description": "Where pauses in foreground audio are insufficient to allow audio descriptions to convey the sense of the video, extended audio description is provided for all prerecorded video content in synchronized media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-extended-ad", + "techniques": [ + "G8", + "SM1", + "SM2" + ] + }, + "1.2.8": { + "id": "media-equiv-text-doc", + "title": "Media Alternative (Prerecorded)", + "description": "An alternative for time-based media is provided for all prerecorded synchronized media and for all prerecorded video-only media.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-text-doc", + "techniques": [ + "F74", + "G58", + "G69", + "G159", + "H46", + "H53", + "SL17" + ] + }, + "1.2.9": { + "id": "media-equiv-live-audio-only", + "title": "Audio-only (Live)", + "description": "An alternative for time-based media that presents equivalent information for live audio-only content is provided.", + "uri": "http://www.w3.org/TR/WCAG20/#media-equiv-live-audio-only", + "techniques": [ + "G150", + "G151", + "G157" + ] + }, + "1.3.1": { + "id": "content-structure-separation-programmatic", + "title": "Info and Relationships", + "description": "Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.", + "uri": "http://www.w3.org/TR/WCAG20/#content-structure-separation-programmatic", + "techniques": [ + "ARIA1", + "ARIA2", + "C22", + "F2", + "F17", + "F33", + "F34", + "F42", + "F43", + "F46", + "F48", + "F62", + "F68", + "F87", + "F90", + "F91", + "FLASH8", + "FLASH21", + "FLASH23", + "FLASH25", + "FLASH29", + "FLASH31", + "FLASH32", + "G115", + "G117", + "G138", + "G140", + "G141", + "G162", + "H39", + "H42", + "H43", + "H44", + "H48", + "H49", + "H51", + "H63", + "H65", + "H71", + "H73", + "H85", + "T1", + "T2", + "T3", + "SCR21", + "SL20", + "SL26" + ] + }, + "1.3.2": { + "id": "content-structure-separation-sequence", + "title": "Meaningful Sequence", + "description": "When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.", + "uri": "http://www.w3.org/TR/WCAG20/#content-structure-separation-sequence", + "techniques": [ + "C6", + "C8", + "C27", + "F1", + "F32", + "F33", + "F34", + "F49", + "FLASH15", + "G57", + "H34", + "H56", + "SL34" + ] + }, + "1.3.3": { + "id": "content-structure-separation-understanding", + "title": "Sensory Characteristics", + "description": "Instructions provided for understandingand operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.", + "uri": "http://www.w3.org/TR/WCAG20/#content-structure-separation-understanding", + "techniques": [ + "F14", + "F26", + "G96" + ] + }, + "1.4.1": { + "id": "visual-audio-contrast-without-color", + "title": "Use of Color", + "description": "Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-without-color", + "techniques": [ + "C15", + "F13", + "F73", + "F81", + "G14", + "G111", + "G182", + "G183", + "H92" + ] + }, + "1.4.2": { + "id": "visual-audio-contrast-dis-audio", + "title": "Audio Control", + "description": "If any audio on a Web page plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-dis-audio", + "techniques": [ + "F23", + "FLASH18", + "FLASH34", + "G60", + "G170", + "G171", + "SL3", + "SL24" + ] + }, + "1.4.3": { + "id": "visual-audio-contrast-contrast", + "title": "Contrast (Minimum)", + "description": "The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, except for the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-contrast", + "techniques": [ + "F24", + "F83", + "G18", + "G145", + "G148", + "G156", + "G174", + "SL13" + ] + }, + "1.4.4": { + "id": "visual-audio-contrast-scale", + "title": "Resize text", + "description": "Except for captions and images of text, text can be resized without assistive technology up to 200 percent without loss of content or functionality.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-scale", + "techniques": [ + "C12", + "C13", + "C14", + "C17", + "C20", + "C22", + "C28", + "F69", + "F80", + "G142", + "G146", + "G178", + "G179", + "SCR34", + "SL22", + "SL23" + ] + }, + "1.4.5": { + "id": "visual-audio-contrast-text-presentation", + "title": "Images of Text", + "description": "If the technologies being used can achieve the visual presentation, text is used to convey information rather than images of text except for the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-text-presentation", + "techniques": [ + "C6", + "C8", + "C12", + "C13", + "C14", + "C22", + "C30", + "G140", + "SL31" + ] + }, + "1.4.6": { + "id": "visual-audio-contrast7", + "title": "Contrast (Enhanced)", + "description": "The visual presentation of text and images of text has a contrast ratio of at least 7:1, except for the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast7", + "techniques": [ + "F24", + "F83", + "G17", + "G18", + "G148", + "G156", + "G174", + "SL13" + ] + }, + "1.4.7": { + "id": "visual-audio-contrast-noaudio", + "title": "Low or No Background Audio", + "description": "For prerecorded audio-only content that (1) contains primarily speech in the foreground, (2) is not an audio CAPTCHA or audio logo, and (3) is not vocalization intended to be primarily musical expression such as singing or rapping, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-noaudio", + "techniques": [ + "G56" + ] + }, + "1.4.8": { + "id": "visual-audio-contrast-visual-presentation", + "title": "Visual Presentation", + "description": "For the visual presentation of blocks of text, a mechanism is available to achieve the following:", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-visual-presentation", + "techniques": [ + "C12", + "C13", + "C14", + "C19", + "C20", + "C21", + "C23", + "C24", + "C25", + "C26", + "F24", + "F88", + "FLASH33", + "G146", + "G148", + "G156", + "G169", + "G172", + "G175", + "G188", + "H87", + "SCR34" + ] + }, + "1.4.9": { + "id": "visual-audio-contrast-text-images", + "title": "Images of Text (No Exception)", + "description": "Images of text are only used for pure decoration or where a particular presentation of text is essential to the information being conveyed.", + "uri": "http://www.w3.org/TR/WCAG20/#visual-audio-contrast-text-images", + "techniques": [ + "C6", + "C8", + "C12", + "C13", + "C14", + "C22", + "C30", + "G140", + "SL31" + ] + }, + "2.1.1": { + "id": "keyboard-operation-keyboard-operable", + "title": "Keyboard", + "description": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes, except where the underlying function requires input that depends on the path of the user's movement and not just the endpoints.", + "uri": "http://www.w3.org/TR/WCAG20/#keyboard-operation-keyboard-operable", + "techniques": [ + "F42", + "F54", + "F55", + "FLASH14", + "FLASH16", + "FLASH17", + "FLASH22", + "G90", + "G202", + "H91", + "SCR2", + "SCR20", + "SCR29", + "SCR35", + "SL9", + "SL14", + "SL15" + ] + }, + "2.1.2": { + "id": "keyboard-operation-trapping", + "title": "No Keyboard Trap", + "description": "If keyboard focus can be moved to a component of the page using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.", + "uri": "http://www.w3.org/TR/WCAG20/#keyboard-operation-trapping", + "techniques": [ + "F10", + "FLASH17", + "G21" + ] + }, + "2.1.3": { + "id": "keyboard-operation-all-funcs", + "title": "Keyboard (No Exception)", + "description": "All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.", + "uri": "http://www.w3.org/TR/WCAG20/#keyboard-operation-all-funcs", + "techniques": [ + "F42", + "F54", + "F55", + "FLASH14", + "FLASH16", + "FLASH17", + "FLASH22", + "G90", + "G202", + "H91", + "SCR2", + "SCR20", + "SCR29", + "SCR35", + "SL9", + "SL14", + "SL15" + ] + }, + "2.2.1": { + "id": "time-limits-required-behaviors", + "title": "Timing Adjustable", + "description": "For each time limit that is set by the content, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-required-behaviors", + "techniques": [ + "F40", + "F41", + "F58", + "FLASH19", + "FLASH24", + "G4", + "G133", + "G180", + "G198", + "SCR1", + "SCR16", + "SCR33", + "SCR36", + "SL21" + ] + }, + "2.2.2": { + "id": "time-limits-pause", + "title": "Pause, Stop, Hide", + "description": "For moving, blinking, scrolling, or auto-updating information, all of the following are true:", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-pause", + "techniques": [ + "F4", + "F7", + "F16", + "F47", + "F50", + "FLASH35", + "FLASH36", + "G4", + "G11", + "G152", + "G186", + "G187", + "G191", + "SCR22", + "SCR33", + "SL11", + "SL12", + "SL24" + ] + }, + "2.2.3": { + "id": "time-limits-no-exceptions", + "title": "No Timing", + "description": "Timing is not an essential part of the event or activity presented by the content, except for non-interactive synchronized media and real-time events.", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-no-exceptions", + "techniques": [ + "G5" + ] + }, + "2.2.4": { + "id": "time-limits-postponed", + "title": "Interruptions", + "description": "Interruptions can be postponed or suppressed by the user, except interruptions involving an emergency.", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-postponed", + "techniques": [ + "F40", + "F41", + "G75", + "G76", + "SCR14" + ] + }, + "2.2.5": { + "id": "time-limits-server-timeout", + "title": "Re-authenticating", + "description": "When an authenticated session expires, the user can continue the activity without loss of data after re-authenticating.", + "uri": "http://www.w3.org/TR/WCAG20/#time-limits-server-timeout", + "techniques": [ + "F12", + "G105", + "G181" + ] + }, + "2.3.1": { + "id": "seizure-does-not-violate", + "title": "Three Flashes or Below Threshold", + "description": "Web pages do not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.", + "uri": "http://www.w3.org/TR/WCAG20/#seizure-does-not-violate", + "techniques": [ + "G15", + "G19", + "G176" + ] + }, + "2.3.2": { + "id": "seizure-three-times", + "title": "Three Flashes", + "description": "Web pages do not contain anything that flashes more than three times in any one second period.", + "uri": "http://www.w3.org/TR/WCAG20/#seizure-three-times", + "techniques": [ + "G19" + ] + }, + "2.4.1": { + "id": "navigation-mechanisms-skip", + "title": "Bypass Blocks", + "description": "A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-skip", + "techniques": [ + "C6", + "G1", + "G123", + "G124", + "H64", + "H69", + "H70", + "SCR28", + "SL25", + "SL29" + ] + }, + "2.4.2": { + "id": "navigation-mechanisms-title", + "title": "Page Titled", + "description": "Web pages have titles that describe topic or purpose.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-title", + "techniques": [ + "ARIA1", + "F25", + "G88", + "G127", + "H25" + ] + }, + "2.4.3": { + "id": "navigation-mechanisms-focus-order", + "title": "Focus Order", + "description": "If a Web page can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-focus-order", + "techniques": [ + "C27", + "F44", + "F85", + "FLASH15", + "G59", + "H4", + "SCR26", + "SCR27", + "SCR37", + "SL34" + ] + }, + "2.4.4": { + "id": "navigation-mechanisms-refs", + "title": "Link Purpose (In Context)", + "description": "The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link context, except where the purpose of the link would be ambiguous to users in general.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-refs", + "techniques": [ + "ARIA1", + "C7", + "F63", + "F89", + "FLASH5", + "FLASH7", + "FLASH27", + "G53", + "G91", + "G189", + "H2", + "H24", + "H30", + "H33", + "H77", + "H78", + "H79", + "H80", + "H81", + "SCR30", + "SL18" + ] + }, + "2.4.5": { + "id": "navigation-mechanisms-mult-loc", + "title": "Multiple Ways", + "description": "More than one way is available to locate a Web page within a set of Web pages except where the Web Page is the result of, or a step in, a process.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-mult-loc", + "techniques": [ + "G63", + "G64", + "G125", + "G126", + "G161", + "G185", + "H59" + ] + }, + "2.4.6": { + "id": "navigation-mechanisms-descriptive", + "title": "Headings and Labels", + "description": "Headings and labels describe topic or purpose.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-descriptive", + "techniques": [ + "G130", + "G131" + ] + }, + "2.4.7": { + "id": "navigation-mechanisms-focus-visible", + "title": "Focus Visible", + "description": "Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-focus-visible", + "techniques": [ + "C15", + "F55", + "F78", + "FLASH20", + "G149", + "G165", + "G195", + "SCR31", + "SL2", + "SL7" + ] + }, + "2.4.8": { + "id": "navigation-mechanisms-location", + "title": "Location", + "description": "Information about the user's location within a set of Web pages is available.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-location", + "techniques": [ + "G63", + "G65", + "G127", + "G128", + "H59" + ] + }, + "2.4.9": { + "id": "navigation-mechanisms-link", + "title": "Link Purpose (Link Only)", + "description": "A mechanism is available to allow the purpose of each link to be identified from link text alone, except where the purpose of the link would be ambiguous to users in general.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-link", + "techniques": [ + "C7", + "F84", + "F89", + "FLASH5", + "FLASH7", + "FLASH27", + "G91", + "G189", + "H2", + "H24", + "H30", + "H33", + "SCR30", + "SL18" + ] + }, + "2.4.10": { + "id": "navigation-mechanisms-headings", + "title": "Section Headings", + "description": "Section headings are used to organize the content.", + "uri": "http://www.w3.org/TR/WCAG20/#navigation-mechanisms-headings", + "techniques": [ + "G141" + ] + }, + "3.1.1": { + "id": "meaning-doc-lang-id", + "title": "Language of Page", + "description": "The default human language of each Web page can be programmatically determined.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-doc-lang-id", + "techniques": [ + "FLASH13", + "H57", + "SVR5" + ] + }, + "3.1.2": { + "id": "meaning-other-lang-id", + "title": "Language of Parts", + "description": "The human language of each passage or phrase in the content can be programmatically determined except for proper names, technical terms, words of indeterminate language, and words or phrases that have become part of the vernacular of the immediately surrounding text.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-other-lang-id", + "techniques": [ + "FLASH13", + "H58", + "SL4", + "SL27" + ] + }, + "3.1.3": { + "id": "meaning-idioms", + "title": "Unusual Words", + "description": "A mechanism is available for identifying specific definitions of words or phrases used in an unusual or restricted way, including idioms and jargon.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-idioms", + "techniques": [ + "G55", + "G62", + "G70", + "G101", + "G112", + "H40", + "H54", + "H60" + ] + }, + "3.1.4": { + "id": "meaning-located", + "title": "Abbreviations", + "description": "A mechanism for identifying the expanded form or meaning of abbreviations is available.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-located", + "techniques": [ + "G55", + "G62", + "G70", + "G97", + "G102", + "H28", + "H60" + ] + }, + "3.1.5": { + "id": "meaning-supplements", + "title": "Reading Level", + "description": "When text requires reading ability more advanced than the lower secondary education level after removal of proper names and titles, supplemental content, or a version that does not require reading ability more advanced than the lower secondary education level, is available.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-supplements", + "techniques": [ + "G79", + "G86", + "G103", + "G153", + "G160" + ] + }, + "3.1.6": { + "id": "meaning-pronunciation", + "title": "Pronunciation", + "description": "A mechanism is available for identifying specific pronunciation of words where meaning of the words, in context, is ambiguous without knowing the pronunciation.", + "uri": "http://www.w3.org/TR/WCAG20/#meaning-pronunciation", + "techniques": [ + "G62", + "G120", + "G121", + "G163", + "H62" + ] + }, + "3.2.1": { + "id": "consistent-behavior-receive-focus", + "title": "On Focus", + "description": "When any user interface component receives focus, it does not initiate a change of context.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-receive-focus", + "techniques": [ + "F52", + "F55", + "G107", + "G200", + "G201" + ] + }, + "3.2.2": { + "id": "consistent-behavior-unpredictable-change", + "title": "On Input", + "description": "Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-unpredictable-change", + "techniques": [ + "F36", + "F37", + "F76", + "FLASH4", + "G13", + "G80", + "G201", + "H32", + "H84", + "SCR19", + "SL10" + ] + }, + "3.2.3": { + "id": "consistent-behavior-consistent-locations", + "title": "Consistent Navigation", + "description": "Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-consistent-locations", + "techniques": [ + "F66", + "G61" + ] + }, + "3.2.4": { + "id": "consistent-behavior-consistent-functionality", + "title": "Consistent Identification", + "description": "Components that have the same functionality within a set of Web pages are identified consistently.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-consistent-functionality", + "techniques": [ + "F31", + "G197" + ] + }, + "3.2.5": { + "id": "consistent-behavior-no-extreme-changes-context", + "title": "Change on Request", + "description": "Changes of context are initiated only by user request or a mechanism is available to turn off such changes.", + "uri": "http://www.w3.org/TR/WCAG20/#consistent-behavior-no-extreme-changes-context", + "techniques": [ + "F9", + "F22", + "F41", + "F52", + "F60", + "F61", + "G76", + "G110", + "G200", + "H76", + "H83", + "SCR19", + "SCR24", + "SVR1" + ] + }, + "3.3.1": { + "id": "minimize-error-identified", + "title": "Error Identification", + "description": "If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-identified", + "techniques": [ + "FLASH12", + "G83", + "G84", + "G85", + "G139", + "G199", + "SCR18", + "SCR32", + "SL35" + ] + }, + "3.3.2": { + "id": "minimize-error-cues", + "title": "Labels or Instructions", + "description": "Labels or instructions are provided when content requires user input.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-cues", + "techniques": [ + "ARIA1", + "ARIA2", + "F82", + "FLASH8", + "FLASH10", + "FLASH25", + "FLASH29", + "FLASH32", + "G13", + "G83", + "G89", + "G131", + "G162", + "G167", + "G184", + "H44", + "H65", + "H71", + "H90", + "SL8", + "SL19", + "SL26" + ] + }, + "3.3.3": { + "id": "minimize-error-suggestions", + "title": "Error Suggestion", + "description": "If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-suggestions", + "techniques": [ + "ARIA2", + "ARIA3", + "FLASH12", + "G83", + "G84", + "G85", + "G139", + "G177", + "G199", + "SCR18", + "SCR32", + "SL35" + ] + }, + "3.3.4": { + "id": "minimize-error-reversible", + "title": "Error Prevention (Legal, Financial, Data)", + "description": "For Web pages that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-reversible", + "techniques": [ + "G98", + "G99", + "G155", + "G164", + "G168", + "G199", + "SCR18", + "SL35" + ] + }, + "3.3.5": { + "id": "minimize-error-context-help", + "title": "Help", + "description": "Context-sensitive help is available.", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-context-help", + "techniques": [ + "G71", + "G89", + "G184", + "G193", + "G194", + "H89" + ] + }, + "3.3.6": { + "id": "minimize-error-reversible-all", + "title": "Error Prevention (All)", + "description": "For Web pages that require the user to submit information, at least one of the following is true:", + "uri": "http://www.w3.org/TR/WCAG20/#minimize-error-reversible-all", + "techniques": [ + "G98", + "G99", + "G155", + "G164", + "G168", + "G199" + ] + }, + "4.1.1": { + "id": "ensure-compat-parses", + "title": "Parsing", + "description": "In content implemented using markup languages, elements have complete start and end tags, elements are nested according to their specifications, elements do not contain duplicate attributes, and any IDs are unique, except where the specifications allow these features.", + "uri": "http://www.w3.org/TR/WCAG20/#ensure-compat-parses", + "techniques": [ + "F17", + "F62", + "F70", + "F77", + "G134", + "G192", + "H74", + "H75", + "H88", + "H93", + "H94", + "SL33" + ] + }, + "4.1.2": { + "id": "ensure-compat-rsv", + "title": "Name, Role, Value", + "description": "For all user interface components (including but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.", + "uri": "http://www.w3.org/TR/WCAG20/#ensure-compat-rsv", + "techniques": [ + "F15", + "F20", + "F59", + "F68", + "F79", + "F86", + "F89", + "FLASH29", + "FLASH30", + "FLASH32", + "G10", + "G108", + "G135", + "H44", + "H64", + "H65", + "H88", + "H91", + "SL6", + "SL18", + "SL20", + "SL26", + "SL30", + "SL32" + ] + } + }, + "techniques": { + "ARIA1": { + "description": "Using the aria-describedby property to provide a descriptive label for input controls" + }, + "ARIA2": { + "description": "Identifying required fields with the aria-required property" + }, + "ARIA3": { + "description": "Identifying valid range information with the aria-valuemin and aria-valuemax properties" + }, + "C6": { + "description": "Positioning content based on structural markup" + }, + "C7": { + "description": "Using CSS to hide a portion of the link text" + }, + "C8": { + "description": "Using CSS letter-spacing to control spacing within a word" + }, + "C9": { + "description": "Using CSS to include decorative images" + }, + "C12": { + "description": "Using percent for font sizes" + }, + "C13": { + "description": "Using named font sizes" + }, + "C14": { + "description": "Using em units for font sizes" + }, + "C15": { + "description": "Using CSS to change the presentation of a user interface component when it receives focus" + }, + "C17": { + "description": "Scaling form elements which contain text" + }, + "C18": { + "description": "Using CSS margin and padding rules instead of spacer images for layout design" + }, + "C19": { + "description": "Specifying alignment either to the left OR right in CSS" + }, + "C20": { + "description": "Using relative measurements to set column widths so that lines can average 80 characters or less when the browser is resized" + }, + "C21": { + "description": "Specifying line spacing in CSS" + }, + "C22": { + "description": "Using CSS to control visual presentation of text" + }, + "C23": { + "description": "Specifying text and background colors of secondary content such as banners, features and navigation in CSS while not specifying text and background colors of the main content" + }, + "C24": { + "description": "Using percentage values in CSS for container sizes" + }, + "C25": { + "description": "Specifying borders and layout in CSS to delineate areas of a Web page while not specifying text and text-background colors" + }, + "C26": { + "description": "Providing options within the content to switch to a layout that does not require the user to scroll horizontally to read a line of text" + }, + "C27": { + "description": "Making the DOM order match the visual order" + }, + "C28": { + "description": "Specifying the size of text containers using em units" + }, + "C30": { + "description": "Using CSS to replace text with images of text and providing user interface controls to switch" + }, + "F1": { + "description": "Failure of Success Criterion 1.3.2 due to changing the meaning of content by positioning information with CSS" + }, + "F2": { + "description": "Failure of Success Criterion 1.3.1 due to using changes in text presentation to convey information without using the appropriate markup or text" + }, + "F3": { + "description": "Failure of Success Criterion 1.1.1 due to using CSS to include images that convey important information" + }, + "F4": { + "description": "Failure of Success Criterion 2.2.2 due to using text-decoration:blink without a mechanism to stop it in less than five seconds" + }, + "F7": { + "description": "Failure of Success Criterion 2.2.2 due to an object or applet, such as Java or Flash, that has blinking content without a mechanism to pause the content that blinks for more than five seconds" + }, + "F8": { + "description": "Failure of Success Criterion 1.2.2 due to captions omitting some dialogue or important sound effects" + }, + "F9": { + "description": "Failure of Success Criterion 3.2.5 due to changing the context when the user removes focus from a form element" + }, + "F10": { + "description": "Failure of Success Criterion 2.1.2 and Conformance Requirement 5 due to combining multiple content formats in a way that traps users inside one format type" + }, + "F12": { + "description": "Failure of Success Criterion 2.2.5 due to having a session time limit without a mechanism for saving user's input and re-establishing that information upon re-authentication" + }, + "F13": { + "description": "Failure of Success Criterion 1.1.1 and 1.4.1 due to having a text alternative that does not include information that is conveyed by color differences in the image" + }, + "F14": { + "description": "Failure of Success Criterion 1.3.3 due to identifying content only by its shape or location" + }, + "F15": { + "description": "Failure of Success Criterion 4.1.2 due to implementing custom controls that do not use an accessibility API for the technology, or do so incompletely" + }, + "F16": { + "description": "Failure of Success Criterion 2.2.2 due to including scrolling content where movement is not essential to the activity without also including a mechanism to pause and restart the content" + }, + "F17": { + "description": "Failure of Success Criterion 1.3.1 and 4.1.1 due to insufficient information in DOM to determine one-to-one relationships (e.g., between labels with same id) in HTML" + }, + "F20": { + "description": "Failure of Success Criterion 1.1.1 and 4.1.2 due to not updating text alternatives when changes to non-text content occur" + }, + "F22": { + "description": "Failure of Success Criterion 3.2.5 due to opening windows that are not requested by the user" + }, + "F23": { + "description": "Failure of 1.4.2 due to playing a sound longer than 3 seconds where there is no mechanism to turn it off" + }, + "F24": { + "description": "Failure of Success Criterion 1.4.3, 1.4.6 and 1.4.8 due to specifying foreground colors without specifying background colors or vice versa" + }, + "F25": { + "description": "Failure of Success Criterion 2.4.2 due to the title of a Web page not identifying the contents" + }, + "F26": { + "description": "Failure of Success Criterion 1.3.3 due to using a graphical symbol alone to convey information" + }, + "F30": { + "description": "Failure of Success Criterion 1.1.1 and 1.2.1 due to using text alternatives that are not alternatives (e.g., filenames or placeholder text)" + }, + "F31": { + "description": "Failure of Success Criterion 3.2.4 due to using two different labels for the same function on different Web pages within a set of Web pages" + }, + "F32": { + "description": "Failure of Success Criterion 1.3.2 due to using white space characters to control spacing within a word" + }, + "F33": { + "description": "Failure of Success Criterion 1.3.1 and 1.3.2 due to using white space characters to create multiple columns in plain text content" + }, + "F34": { + "description": "Failure of Success Criterion 1.3.1 and 1.3.2 due to using white space characters to format tables in plain text content" + }, + "F36": { + "description": "Failure of Success Criterion 3.2.2 due to automatically submitting a form and presenting new content without prior warning when the last field in the form is given a value" + }, + "F37": { + "description": "Failure of Success Criterion 3.2.2 due to launching a new window without prior warning when the status of a radio button, check box or select list is changed" + }, + "F38": { + "description": "Failure of Success Criterion 1.1.1 due to omitting the alt-attribute for non-text content used for decorative purposes only in HTML" + }, + "F39": { + "description": "Failure of Success Criterion 1.1.1 due to providing a text alternative that is not null (e.g., alt='spacer' or alt='image') for images that should be ignored by assistive technology" + }, + "F40": { + "description": "Failure of Success Criterion 2.2.1 and 2.2.4 due to using meta redirect with a time limit" + }, + "F41": { + "description": "Failure of Success Criterion 2.2.1, 2.2.4, and 3.2.5 due to using meta refresh with a time-out" + }, + "F42": { + "description": "Failure of Success Criterion 1.3.1 and 2.1.1 due to using scripting events to emulate links in a way that is not programmatically determinable" + }, + "F43": { + "description": "Failure of Success Criterion 1.3.1 due to using structural markup in a way that does not represent relationships in the content" + }, + "F44": { + "description": "Failure of Success Criterion 2.4.3 due to using tabindex to create a tab order that does not preserve meaning and operability" + }, + "F46": { + "description": "Failure of Success Criterion 1.3.1 due to using th elements, caption elements, or non-empty summary attributes in layout tables" + }, + "F47": { + "description": "Failure of Success Criterion 2.2.2 due to using the blink element" + }, + "F48": { + "description": "Failure of Success Criterion 1.3.1 due to using the pre element to markup tabular information" + }, + "F49": { + "description": "Failure of Success Criterion 1.3.2 due to using an HTML layout table that does not make sense when linearized " + }, + "F50": { + "description": "Failure of Success Criterion 2.2.2 due to a script that causes a blink effect without a mechanism to stop the blinking at 5 seconds or less" + }, + "F52": { + "description": "Failure of Success Criterion 3.2.1 and 3.2.5 due to opening a new window as soon as a new page is loaded" + }, + "F54": { + "description": "Failure of Success Criterion 2.1.1 due to using only pointing-device-specific event handlers (including gesture) for a function" + }, + "F55": { + "description": "Failure of Success Criteria 2.1.1, 2.4.7, and 3.2.1 due to using script to remove focus when focus is received" + }, + "F58": { + "description": "Failure of Success Criterion 2.2.1 due to using server-side techniques to automatically redirect pages after a time-out" + }, + "F59": { + "description": "Failure of Success Criterion 4.1.2 due to using script to make div or span a user interface control in HTML" + }, + "F60": { + "description": "Failure of Success Criterion 3.2.5 due to launching a new window when a user enters text into an input field" + }, + "F61": { + "description": "Failure of Success Criterion 3.2.5 due to complete change of main content through an automatic update that the user cannot disable from within the content" + }, + "F62": { + "description": "Failure of Success Criterion 1.3.1 and 4.1.1 due to insufficient information in DOM to determine specific relationships in XML" + }, + "F63": { + "description": "Failure of Success Criterion 2.4.4 due to providing link context only in content that is not related to the link" + }, + "F65": { + "description": "Failure of Success Criterion 1.1.1 due to omitting the alt attribute on img elements, area elements, and input elements of type 'image'" + }, + "F66": { + "description": "Failure of Success Criterion 3.2.3 due to presenting navigation links in a different relative order on different pages" + }, + "F67": { + "description": "Failure of Success Criterion 1.1.1 and 1.2.1 due to providing long descriptions for non-text content that does not serve the same purpose or does not present the same information" + }, + "F68": { + "description": "Failure of Success Criterion 1.3.1 and 4.1.2 due to the association of label and user interface controls not being programmatically determinable" + }, + "F69": { + "description": "Failure of Success Criterion 1.4.4 when resizing visually rendered text up to 200 percent causes the text, image or controls to be clipped, truncated or obscured" + }, + "F70": { + "description": "Failure of Success Criterion 4.1.1 due to incorrect use of start and end tags or attribute markup" + }, + "F71": { + "description": "Failure of Success Criterion 1.1.1 due to using text look-alikes to represent text without providing a text alternative" + }, + "F72": { + "description": "Failure of Success Criterion 1.1.1 due to using ASCII art without providing a text alternative" + }, + "F73": { + "description": "Failure of Success Criterion 1.4.1 due to creating links that are not visually evident without color vision" + }, + "F74": { + "description": "Failure of Success Criterion 1.2.2 and 1.2.8 due to not labeling a synchronized media alternative to text as an alternative" + }, + "F75": { + "description": "Failure of Success Criterion 1.2.2 by providing synchronized media without captions when the synchronized media presents more information than is presented on the page" + }, + "F76": { + "description": "Failure of Success Criterion 3.2.2 due to providing instruction material about the change of context by change of setting in a user interface element at a location that users may bypass" + }, + "F77": { + "description": "Failure of Success Criterion 4.1.1 due to duplicate values of type ID" + }, + "F78": { + "description": "Failure of Success Criterion 2.4.7 due to styling element outlines and borders in a way that removes or renders non-visible the visual focus indicator" + }, + "F79": { + "description": "Failure of Success Criterion 4.1.2 due to the focus state of a user interface component not being programmatically determinable or no notification of change of focus state available" + }, + "F80": { + "description": "Failure of Success Criterion 1.4.4 when text-based form controls do not resize when visually rendered text is resized up to 200%" + }, + "F81": { + "description": "Failure of Success Criterion 1.4.1 due to identifying required or error fields using color differences only" + }, + "F82": { + "description": "Failure of Success Criterion 3.3.2 by visually formatting a set of phone number fields but not including a text label" + }, + "F83": { + "description": "Failure of Success Criterion 1.4.3 and 1.4.6 due to using background images that do not provide sufficient contrast with foreground text (or images of text)" + }, + "F84": { + "description": "Failure of Success Criterion 2.4.9 due to using a non-specific link such as 'click here' or 'more' without a mechanism to change the link text to specific text." + }, + "F85": { + "description": "Failure of Success Criterion 2.4.3 due to using dialogs or menus that are not adjacent to their trigger control in the sequential navigation order" + }, + "F86": { + "description": "Failure of Success Criterion 4.1.2 due to not providing names for each part of a multi-part form field, such as a US telephone number" + }, + "F87": { + "description": "Failure of Success Criterion 1.3.1 due to inserting non-decorative content by using :before and :after pseudo-elements and the 'content' property in CSS" + }, + "F88": { + "description": "Failure of Success Criterion 1.4.8 due to using text that is justified (aligned to both the left and the right margins)" + }, + "F89": { + "description": "Failure of Success Criteria 2.4.4, 2.4.9 and 4.1.2 due to using null alt on an image where the image is the only content in a link" + }, + "F90": { + "description": "Failure of Success Criterion 1.3.1 for incorrectly associating table headers and content via the headers and id attributes" + }, + "F91": { + "description": "Failure of Success Criterion 1.3.1 for not correctly marking up table headers" + }, + "FLASH1": { + "description": "Setting the name property for a non-text object" + }, + "FLASH2": { + "description": "Setting the description property for a non-text object in Flash" + }, + "FLASH3": { + "description": "Marking objects in Flash so that they can be ignored by AT" + }, + "FLASH4": { + "description": "Providing submit buttons in Flash" + }, + "FLASH5": { + "description": "Combining adjacent image and text buttons for the same resource" + }, + "FLASH6": { + "description": "Creating accessible hotspots using invisible buttons" + }, + "FLASH7": { + "description": "Using scripting to change control labels" + }, + "FLASH8": { + "description": "Adding a group name to the accessible name of a form control" + }, + "FLASH9": { + "description": "Applying captions to prerecorded synchronized media" + }, + "FLASH10": { + "description": "Indicating required form controls in Flash" + }, + "FLASH11": { + "description": "Providing a longer text description of an object" + }, + "FLASH12": { + "description": "Providing client-side validation and adding error text via the accessible description" + }, + "FLASH13": { + "description": "Using HTML language attributes to specify language in Flash content" + }, + "FLASH14": { + "description": "Using redundant keyboard and mouse event handlers in Flash" + }, + "FLASH15": { + "description": "Using the tabIndex property to specify a logical reading order and a logical tab order in Flash" + }, + "FLASH16": { + "description": "Making actions keyboard accessible by using the click event on standard components" + }, + "FLASH17": { + "description": "Providing keyboard access to a Flash object and avoiding a keyboard trap" + }, + "FLASH18": { + "description": "Providing a control to turn off sounds that play automatically in Flash" + }, + "FLASH19": { + "description": "Providing a script that warns the user a time limit is about to expire and provides a way to extend it" + }, + "FLASH20": { + "description": "Reskinning Flash components to provide highly visible focus indication" + }, + "FLASH21": { + "description": "Using the DataGrid component to associate column headers with cells" + }, + "FLASH22": { + "description": "Adding keyboard-accessible actions to static elements" + }, + "FLASH23": { + "description": "Adding summary information to a DataGrid" + }, + "FLASH24": { + "description": "Allowing the user to extend the default time limit" + }, + "FLASH25": { + "description": "Labeling a form control by setting its accessible name" + }, + "FLASH26": { + "description": "Applying audio descriptions to Flash video" + }, + "FLASH27": { + "description": "Providing button labels that describe the purpose of a button" + }, + "FLASH28": { + "description": "Providing text alternatives for ASCII art, emoticons, and leetspeak in Flash" + }, + "FLASH29": { + "description": "Setting the label property for form components" + }, + "FLASH30": { + "description": "Specifying accessible names for image buttons" + }, + "FLASH31": { + "description": "Specifying caption text for a DataGrid" + }, + "FLASH32": { + "description": "Using auto labeling to associate text labels with form controls" + }, + "FLASH33": { + "description": "Using relative values for Flash object dimensions" + }, + "FLASH34": { + "description": "Turning off sounds that play automatically when an assistive technology is detected" + }, + "FLASH35": { + "description": "Using script to scroll Flash content, and providing a mechanism to pause it" + }, + "FLASH36": { + "description": "Using scripts to control blinking and stop it in five seconds or less" + }, + "G1": { + "description": "Adding a link at the top of each page that goes directly to the main content area" + }, + "G4": { + "description": "Allowing the content to be paused and restarted from where it was paused" + }, + "G5": { + "description": "Allowing users to complete an activity without any time limit" + }, + "G8": { + "description": "Providing a movie with extended audio descriptions" + }, + "G9": { + "description": "Creating captions for live synchronized media" + }, + "G10": { + "description": "Creating components using a technology that supports the accessibilityAPI features of the platforms on which the user agents will be run to expose thenames and roles, allow user-settable properties to be directly set, and providenotification of changes" + }, + "G11": { + "description": "Creating content that blinks for less than 5 seconds" + }, + "G13": { + "description": "Describing what will happen before a change to a form control that causes a change of context to occur is made" + }, + "G14": { + "description": "Ensuring that information conveyed by color differences is also available in text" + }, + "G15": { + "description": "Using a tool to ensure that content does not violate the general flash threshold or red flash threshold" + }, + "G17": { + "description": "Ensuring that a contrast ratio of at least 7:1 exists between text (and images of text)and background behind the text" + }, + "G18": { + "description": "Ensuring that a contrast ratio of at least 4.5:1 exists between text (and images of text) and background behind the text" + }, + "G19": { + "description": "Ensuring that no component of the content flashes more than three times in any 1-second period" + }, + "G21": { + "description": "Ensuring that users are not trapped in content" + }, + "G53": { + "description": "Identifying the purpose of a link using link text combined with the text of the enclosing sentence" + }, + "G54": { + "description": "Including a sign language interpreter in the video stream" + }, + "G55": { + "description": "Linking to definitions" + }, + "G56": { + "description": "Mixing audio files so that non-speech sounds are at least 20 decibelslower than the speech audio content" + }, + "G57": { + "description": "Ordering the content in a meaningful sequence" + }, + "G58": { + "description": "Placing a link to the alternative for time-based media immediately next to the non-text content" + }, + "G59": { + "description": "Placing the interactive elements in an order that follows sequences and relationships within the content" + }, + "G60": { + "description": "Playing a sound that turns off automatically within three seconds" + }, + "G61": { + "description": "Presenting repeated components in the same relative order each time they appear" + }, + "G62": { + "description": "Providing a glossary" + }, + "G63": { + "description": "Providing a site map" + }, + "G64": { + "description": "Providing a Table of Contents" + }, + "G65": { + "description": "Providing a breadcrumb trail" + }, + "G68": { + "description": "Providing a short text alternative that describes the purpose of liveaudio-only and live video-only content" + }, + "G69": { + "description": "Providing an alternative for time based media" + }, + "G70": { + "description": "Providing a function to search an online dictionary" + }, + "G71": { + "description": "Providing a help link on every Web page" + }, + "G73": { + "description": "Providing a long description in another location with a link to it thatis immediately adjacent to the non-text content" + }, + "G74": { + "description": "Providing a long description in text near the non-text content, with areference to the location of the long description in the short description" + }, + "G75": { + "description": "Providing a mechanism to postpone any updating of content" + }, + "G76": { + "description": "Providing a mechanism to request an update of the content instead ofupdating automatically" + }, + "G78": { + "description": "Providing a second, user-selectable, audio track that includes audio descriptions" + }, + "G79": { + "description": "Providing a spoken version of the text" + }, + "G80": { + "description": "Providing a submit button to initiate a change of context" + }, + "G81": { + "description": "Providing a synchronized video of the sign language interpreter that canbe displayed in a different viewport or overlaid on the image by the player" + }, + "G82": { + "description": "Providing a text alternative that identifies the purpose of the non-text content" + }, + "G83": { + "description": "Providing text descriptions to identify required fields that were not completed" + }, + "G84": { + "description": "Providing a text description when the user provides information that is not in the list of allowed values" + }, + "G85": { + "description": "Providing a text description when user input falls outside the required format or values" + }, + "G86": { + "description": "Providing a text summary that requires reading ability less advanced than the upper secondary education level" + }, + "G87": { + "description": "Providing closed captions" + }, + "G88": { + "description": "Providing descriptive titles for Web pages" + }, + "G89": { + "description": "Providing expected data format and example" + }, + "G90": { + "description": "Providing keyboard-triggered event handlers" + }, + "G91": { + "description": "Providing link text that describes the purpose of a link" + }, + "G92": { + "description": "Providing long description for non-text content that serves the samepurpose and presents the same information" + }, + "G93": { + "description": "Providing open (always visible) captions" + }, + "G94": { + "description": "Providing short text alternative for non-text content that serves the same purpose and presents the same information as the non-text content" + }, + "G95": { + "description": "Providing short text alternatives that provide a brief description ofthe non-text content" + }, + "G96": { + "description": "Providing textual identification of items that otherwise rely only on sensory information to be understood" + }, + "G97": { + "description": "Providing the first use of an abbreviation immediately before or after the expanded form" + }, + "G98": { + "description": "Providing the ability for the user to review and correct answers before submitting" + }, + "G99": { + "description": "Providing the ability to recover deleted information" + }, + "G100": { + "description": "Providing a short text alternative which is the accepted name or a descriptive name of the non-text content" + }, + "G101": { + "description": "Providing the definition of a word or phrase used in an unusual or restricted way" + }, + "G102": { + "description": "Providing the expansion or explanation of an abbreviation" + }, + "G103": { + "description": "Providing visual illustrations, pictures, and symbols to help explain ideas, events, and processes" + }, + "G105": { + "description": "Saving data so that it can be used after a user re-authenticates" + }, + "G107": { + "description": "Using 'activate' rather than 'focus' as a trigger for changes of context" + }, + "G108": { + "description": "Using markup features to expose the name and role, allow user-settable properties to be directly set, and provide notification of changes" + }, + "G110": { + "description": "Using an instant client-side redirect" + }, + "G111": { + "description": "Using color and pattern" + }, + "G112": { + "description": "Using inline definitions" + }, + "G115": { + "description": "Using semantic elements to mark up structure" + }, + "G117": { + "description": "Using text to convey information that is conveyed by variations in presentation of text" + }, + "G120": { + "description": "Providing the pronunciation immediately following the word" + }, + "G121": { + "description": "Linking to pronunciations" + }, + "G123": { + "description": "Adding a link at the beginning of a block of repeated content to go to the end of the block" + }, + "G124": { + "description": "Adding links at the top of the page to each area of the content" + }, + "G125": { + "description": "Providing links to navigate to related Web pages" + }, + "G126": { + "description": "Providing a list of links to all other Web pages" + }, + "G127": { + "description": "Identifying a Web page's relationship to a larger collection of Web pages" + }, + "G128": { + "description": "Indicating current location within navigation bars" + }, + "G130": { + "description": "Providing descriptive headings" + }, + "G131": { + "description": "Providing descriptive labels" + }, + "G133": { + "description": "Providing a checkbox on the first page of a multipart form that allows users to ask for longer session time limit or no session time limit" + }, + "G134": { + "description": "Validating Web pages" + }, + "G135": { + "description": "Using the accessibility API features of a technology to expose names androles, to allow user-settable properties to be directly set, and to providenotification of changes" + }, + "G138": { + "description": "Using semantic markup whenever color cues are used" + }, + "G139": { + "description": "Creating a mechanism that allows users to jump to errors" + }, + "G140": { + "description": "Separating information and structure from presentation to enable different presentations" + }, + "G141": { + "description": "Organizing a page using headings" + }, + "G142": { + "description": "Using a technology that has commonly-available user agents that support zoom" + }, + "G143": { + "description": "Providing a text alternative that describes the purpose of the CAPTCHA" + }, + "G144": { + "description": "Ensuring that the Web Page contains another CAPTCHA serving the same purpose using a different modality" + }, + "G145": { + "description": "Ensuring that a contrast ratio of at least 3:1 exists between text (and images of text) and background behind the text" + }, + "G146": { + "description": "Using liquid layout" + }, + "G148": { + "description": "Not specifying background color, not specifying text color, and not using technology features that change those defaults" + }, + "G149": { + "description": "Using user interface components that are highlighted by the user agent when they receive focus" + }, + "G150": { + "description": "Providing text based alternatives for live audio-only content" + }, + "G151": { + "description": "Providing a link to a text transcript of a prepared statement or script if the script is followed" + }, + "G152": { + "description": "Setting animated gif images to stop blinking after n cycles (within 5 seconds)" + }, + "G153": { + "description": "Making the text easier to read" + }, + "G155": { + "description": "Providing a checkbox in addition to a submit button" + }, + "G156": { + "description": "Using a technology that has commonly-available user agents that can change the foreground and background of blocks of text" + }, + "G157": { + "description": "Incorporating a live audio captioning service into a Web page" + }, + "G158": { + "description": "Providing an alternative for time-based media for audio-only content" + }, + "G159": { + "description": "Providing an alternative for time-based media for video-only content" + }, + "G160": { + "description": "Providing sign language versions of information, ideas, and processes that must be understood in order to use the content" + }, + "G161": { + "description": "Providing a search function to help users find content" + }, + "G162": { + "description": "Positioning labels to maximize predictability of relationships" + }, + "G163": { + "description": "Using standard diacritical marks that can be turned off" + }, + "G164": { + "description": "Providing a stated time within which an online request (or transaction) may be amended or canceled by the user after making the request" + }, + "G165": { + "description": "Using the default focus indicator for the platform so that high visibility default focus indicators will carry over" + }, + "G166": { + "description": "Providing audio that describes the important video content and describing it as such" + }, + "G167": { + "description": "Using an adjacent button to label the purpose of a field" + }, + "G168": { + "description": "Requesting confirmation to continue with selected action" + }, + "G169": { + "description": "Aligning text on only one side" + }, + "G170": { + "description": "Providing a control near the beginning of the Web page that turns off sounds that play automatically" + }, + "G171": { + "description": "Playing sounds only on user request" + }, + "G172": { + "description": "Providing a mechanism to remove full justification of text" + }, + "G173": { + "description": "Providing a version of a movie with audio descriptions" + }, + "G174": { + "description": "Providing a control with a sufficient contrast ratio that allows users to switch to a presentation that uses sufficient contrast" + }, + "G175": { + "description": "Providing a multi color selection tool on the page for foreground and background colors" + }, + "G176": { + "description": "Keeping the flashing area small enough" + }, + "G177": { + "description": "Providing suggested correction text" + }, + "G178": { + "description": "Providing controls on the Web page that allow users to incrementally change the size of all text on the page up to 200 percent" + }, + "G179": { + "description": "Ensuring that there is no loss of content or functionality when the text resizes and text containers do not change their width" + }, + "G180": { + "description": "Providing the user with a means to set the time limit to 10 times the default time limit" + }, + "G181": { + "description": "Encoding user data as hidden or encrypted data in a re-authorization page" + }, + "G182": { + "description": "Ensuring that additional visual cues are available when text color differences are used to convey information" + }, + "G183": { + "description": "Using a contrast ratio of 3:1 with surrounding text and providing additional visual cues on focus for links or controls where color alone is used to identify them" + }, + "G184": { + "description": "Providing text instructions at the beginning of a form or set of fields that describes the necessary input" + }, + "G185": { + "description": "Linking to all of the pages on the site from the home page" + }, + "G186": { + "description": "Using a control in the Web page that stops moving, blinking, or auto-updating content" + }, + "G187": { + "description": "Using a technology to include blinking content that can be turned off via the user agent" + }, + "G188": { + "description": "Providing a button on the page to increase line spaces and paragraph spaces" + }, + "G189": { + "description": "Providing a control near the beginning of the Web page that changes the link text" + }, + "G191": { + "description": "Providing a link, button, or other mechanism that reloads the page without any blinking content" + }, + "G192": { + "description": "Fully conforming to specifications" + }, + "G193": { + "description": "Providing help by an assistant in the Web page" + }, + "G194": { + "description": "Providing spell checking and suggestions for text input" + }, + "G195": { + "description": "Using an author-supplied, highly visible focus indicator" + }, + "G196": { + "description": "Using a text alternative on one item within a group of images that describes all items in the group" + }, + "G197": { + "description": "Using labels, names, and text alternatives consistently for content that has the same functionality" + }, + "G198": { + "description": "Providing a way for the user to turn the time limit off" + }, + "G199": { + "description": "Providing success feedback when data is submitted successfully" + }, + "G200": { + "description": "Opening new windows and tabs from a link only when necessary" + }, + "G201": { + "description": "Giving users advanced warning when opening a new window" + }, + "G202": { + "description": "Ensuring keyboard control for all functionality" + }, + "G203": { + "description": "Using a static text alternative to describe a talking head video" + }, + "H2": { + "description": "Combining adjacent image and text links for the same resource" + }, + "H4": { + "description": "Creating a logical tab order through links, form controls, and objects" + }, + "H24": { + "description": "Providing text alternatives for the area elements of image maps " + }, + "H25": { + "description": "Providing a title using the title element" + }, + "H27": { + "description": "Providing text and non-text alternatives for object" + }, + "H28": { + "description": "Providing definitions for abbreviations by using the abbr and acronym elements" + }, + "H30": { + "description": "Providing link text that describes the purpose of a link for anchor elements" + }, + "H32": { + "description": "Providing submit buttons" + }, + "H33": { + "description": "Supplementing link text with the title attribute" + }, + "H34": { + "description": "Using a Unicode right-to-left mark (RLM) or left-to-right mark (LRM) to mix textdirection inline" + }, + "H35": { + "description": "Providing text alternatives on applet elements" + }, + "H36": { + "description": "Using alt attributes on images used as submit buttons" + }, + "H37": { + "description": "Using alt attributes on img elements" + }, + "H39": { + "description": "Using caption elements to associate data table captions with data tables" + }, + "H40": { + "description": "Using definition lists" + }, + "H42": { + "description": "Using h1-h6 to identify headings" + }, + "H43": { + "description": "Using id and headers attributes to associate data cells with header cells indata tables" + }, + "H44": { + "description": "Using label elements to associate text labels with form controls" + }, + "H45": { + "description": "Using longdesc" + }, + "H46": { + "description": "Using noembed with embed" + }, + "H48": { + "description": "Using ol, ul and dl for lists or groups of links" + }, + "H49": { + "description": "Using semantic markup to mark emphasized or special text" + }, + "H51": { + "description": "Using table markup to present tabular information" + }, + "H53": { + "description": "Using the body of the object element" + }, + "H54": { + "description": "Using the dfn element to identify the defining instance of a word" + }, + "H56": { + "description": "Using the dir attribute on an inline element to resolve problems with nested directional runs" + }, + "H57": { + "description": "Using language attributes on the html element " + }, + "H58": { + "description": "Using language attributes to identify changes in the human language " + }, + "H59": { + "description": "Using the link element and navigation tools" + }, + "H60": { + "description": "Using the link element to link to a glossary" + }, + "H62": { + "description": "Using the ruby element" + }, + "H63": { + "description": "Using the scope attribute to associate header cells and data cells in datatables" + }, + "H64": { + "description": "Using the title attribute of the frame and iframe elements" + }, + "H65": { + "description": "Using the title attribute to identify form controls when the label element cannot be used" + }, + "H67": { + "description": "Using null alt text and no title attribute on img elements for images that ATshould ignore" + }, + "H69": { + "description": "Providing heading elements at the beginning of each section of content" + }, + "H70": { + "description": "Using frame elements to group blocks of repeated material" + }, + "H71": { + "description": "Providing a description for groups of form controls using fieldset and legendelements" + }, + "H73": { + "description": "Using the summary attribute of the table element to give an overview of datatables" + }, + "H74": { + "description": "Ensuring that opening and closing tags are used according to specification" + }, + "H75": { + "description": "Ensuring that Web pages are well-formed" + }, + "H76": { + "description": "Using meta refresh to create an instant client-side redirect" + }, + "H77": { + "description": "Identifying the purpose of a link using link text combined with its enclosing list item" + }, + "H78": { + "description": "Identifying the purpose of a link using link text combined with its enclosing paragraph" + }, + "H79": { + "description": "Identifying the purpose of a link using link text combined with its enclosing table cell and associated table headings" + }, + "H80": { + "description": "Identifying the purpose of a link using link text combined with the preceding heading element" + }, + "H81": { + "description": "Identifying the purpose of a link in a nested list using link text combined with the parent list item under which the list is nested" + }, + "H83": { + "description": "Using the target attribute to open a new window on user request and indicating this in link text" + }, + "H84": { + "description": "Using a button with a select element to perform an action" + }, + "H85": { + "description": "Using OPTGROUP to group OPTION elements inside a SELECT" + }, + "H86": { + "description": "Providing text alternatives for ASCII art, emoticons, and leetspeak" + }, + "H87": { + "description": "Not interfering with the user agent's reflow of text as the viewing window is narrowed" + }, + "H88": { + "description": "Using HTML according to spec" + }, + "H89": { + "description": "Using the title attribute to provide context-sensitive help" + }, + "H90": { + "description": "Indicating required form controls using label or legend" + }, + "H91": { + "description": "Using HTML form controls and links" + }, + "H92": { + "description": "Including a text cue for colored form control labels" + }, + "H93": { + "description": "Ensuring that id attributes are unique on a Web page" + }, + "H94": { + "description": "Ensuring that elements do not contain duplicate attributes" + }, + "T1": { + "description": "Using standard text formatting conventions for paragraphs" + }, + "T2": { + "description": "Using standard text formatting conventions for lists" + }, + "T3": { + "description": "Using standard text formatting conventions for headings" + }, + "SCR1": { + "description": "Allowing the user to extend the default time limit" + }, + "SCR2": { + "description": "Using redundant keyboard and mouse event handlers" + }, + "SCR14": { + "description": "Using scripts to make nonessential alerts optional" + }, + "SCR16": { + "description": "Providing a script that warns the user a time limit is about to expire" + }, + "SCR18": { + "description": "Providing client-side validation and alert" + }, + "SCR19": { + "description": "Using an onchange event on a select element without causing a change of context" + }, + "SCR20": { + "description": "Using both keyboard and other device-specific functions" + }, + "SCR21": { + "description": "Using functions of the Document Object Model (DOM) to add content to a page" + }, + "SCR22": { + "description": "Using scripts to control blinking and stop it in five seconds or less" + }, + "SCR24": { + "description": "Using progressive enhancement to open new windows on user request" + }, + "SCR26": { + "description": "Inserting dynamic content into the Document Object Model immediately following its trigger element" + }, + "SCR27": { + "description": "Reordering page sections using the Document Object Model" + }, + "SCR28": { + "description": "Using an expandable and collapsible menu to bypass block of content" + }, + "SCR29": { + "description": "Adding keyboard-accessible actions to static HTML elements" + }, + "SCR30": { + "description": "Using scripts to change the link text" + }, + "SCR31": { + "description": "Using script to change the background color or border of the element with focus" + }, + "SCR32": { + "description": "Providing client-side validation and adding error text via the DOM" + }, + "SCR33": { + "description": "Using script to scroll content, and providing a mechanism to pause it" + }, + "SCR34": { + "description": "Calculating size and position in a way that scales with text size" + }, + "SCR35": { + "description": "Making actions keyboard accessible by using the onclick event of anchors and buttons" + }, + "SCR36": { + "description": "Providing a mechanism to allow users to display moving, scrolling, or auto-updating text in a static window or area" + }, + "SCR37": { + "description": "Creating Custom Dialogs in a Device Independent Way" + }, + "SVR1": { + "description": "Implementing automatic redirects on the server side instead of on the client side" + }, + "SVR5": { + "description": "Specifying the default language in the HTTP header" + }, + "SL1": { + "description": "Accessing Alternate Audio Tracks in Silverlight Media" + }, + "SL2": { + "description": "Changing The Visual Focus Indicator in Silverlight" + }, + "SL3": { + "description": "Controlling Silverlight MediaElement Audio Volume" + }, + "SL4": { + "description": "Declaring Discrete Silverlight Objects to Specify Language Parts in the HTML DOM" + }, + "SL5": { + "description": "Defining a Focusable Image Class for Silverlight" + }, + "SL6": { + "description": "Defining a UI Automation Peer for a Custom Silverlight Control" + }, + "SL7": { + "description": "Designing a Focused Visual State for Custom Silverlight Controls" + }, + "SL8": { + "description": "Displaying HelpText in Silverlight User Interfaces" + }, + "SL9": { + "description": "Handling Key Events to Enable Keyboard Functionality in Silverlight" + }, + "SL10": { + "description": "Implementing a Submit-Form Pattern in Silverlight" + }, + "SL11": { + "description": "Pausing or Stopping A Decorative Silverlight Animation" + }, + "SL12": { + "description": "Pausing, Stopping, or Playing Media in Silverlight MediaElements" + }, + "SL13": { + "description": "Providing A Style Switcher To Switch To High Contrast" + }, + "SL14": { + "description": "Providing Custom Control Key Handling for Keyboard Functionality in Silverlight" + }, + "SL15": { + "description": "Providing Keyboard Shortcuts that Work Across the Entire Silverlight Application" + }, + "SL16": { + "description": "Providing Script-Embedded Text Captions for MediaElement Content" + }, + "SL17": { + "description": "Providing Static Alternative Content for Silverlight Media Playing in a MediaElement" + }, + "SL18": { + "description": "Providing Text Equivalent for Nontext Silverlight Controls With AutomationProperties.Name" + }, + "SL19": { + "description": "Providing User Instructions With AutomationProperties.HelpText in Silverlight" + }, + "SL20": { + "description": "Relying on Silverlight AutomationPeer Behavior to Set AutomationProperties.Name" + }, + "SL21": { + "description": "Replacing A Silverlight Timed Animation With a Nonanimated Element" + }, + "SL22": { + "description": "Supporting Browser Zoom in Silverlight" + }, + "SL23": { + "description": "Using A Style Switcher to Increase Font Size of Silverlight Text Elements" + }, + "SL24": { + "description": "Using AutoPlay to Keep Silverlight Media from Playing Automatically" + }, + "SL25": { + "description": "Using Controls and Programmatic Focus to Bypass Blocks of Content in Silverlight" + }, + "SL26": { + "description": "Using LabeledBy to Associate Labels and Targets in Silverlight" + }, + "SL27": { + "description": "Using Language/Culture Properties as Exposed by Silverlight Applications and Assistive Technologies" + }, + "SL28": { + "description": "Using Separate Text-Format Text Captions for MediaElement Content" + }, + "SL29": { + "description": "Using Silverlight 'List' Controls to Define Blocks that can be Bypassed" + }, + "SL30": { + "description": "Using Silverlight Control Compositing and AutomationProperties.Name" + }, + "SL31": { + "description": "Using Silverlight Font Properties to Control Text Presentation" + }, + "SL32": { + "description": "Using Silverlight Text Elements for Appropriate Accessibility Role" + }, + "SL33": { + "description": "Using Well-Formed XAML to Define a Silverlight User Interface" + }, + "SL34": { + "description": "Using the Silverlight Default Tab Sequence and Altering Tab Sequences With Properties" + }, + "SL35": { + "description": "Using the Validation and ValidationSummary APIs to Implement Client Side Forms Validation in Silverlight" + }, + "SM1": { + "description": "Adding extended audio description in SMIL 1.0" + }, + "SM2": { + "description": "Adding extended audio description in SMIL 2.0" + }, + "SM6": { + "description": "Providing audio description in SMIL 1.0" + }, + "SM7": { + "description": "Providing audio description in SMIL 2.0" + }, + "SM11": { + "description": "Providing captions through synchronized text streams in SMIL 1.0" + }, + "SM12": { + "description": "Providing captions through synchronized text streams in SMIL 2.0" + }, + "SM13": { + "description": "Providing sign language interpretation through synchronized video streams in SMIL 1.0" + }, + "SM14": { + "description": "Providing sign language interpretation through synchronized video streams in SMIL 2.0" + } + } +} \ No newline at end of file diff --git a/dist/guidelines/wcag.tests.json b/dist/guidelines/wcag.tests.json new file mode 100644 index 000000000..5fa6681d2 --- /dev/null +++ b/dist/guidelines/wcag.tests.json @@ -0,0 +1 @@ +["aAdjacentWithSameResourceShouldBeCombined","aImgAltNotRepetative","aLinkTextDoesNotBeginWithRedundantWord","aLinksDontOpenNewWindow","aLinksToMultiMediaRequireTranscript","aLinksToSoundFilesNeedTranscripts","aMustContainText","aSuspiciousLinkText","aTitleDescribesDestination","appletContainsTextEquivalent","appletContainsTextEquivalentInAlt","appletTextEquivalentsGetUpdated","appletUIMustBeAccessible","appletsDoNotFlicker","areaAltIdentifiesDestination","areaHasAltValue","areaLinksToSoundFile","blinkIsNotUsed","blockquoteNotUsedForIndentation","blockquoteUseForQuotations","checkboxHasLabel","cssDocumentMakesSenseStyleTurnedOff","cssTextHasContrast","documentAbbrIsUsed","documentAcronymsHaveElement","documentContentReadableWithoutStylesheets","documentHasTitleElement","documentIDsMustBeUnique","documentIsWrittenClearly","documentLangIsISO639Standard","documentMetaNotUsedWithTimeout","documentReadingDirection","documentTitleDescribesDocument","documentTitleIsNotPlaceholder","documentTitleNotEmpty","documentValidatesToDocType","documentVisualListsAreMarkedUp","documentWordsNotInLanguageAreMarked","embedHasAssociatedNoEmbed","embedProvidesMechanismToReturnToParent","emoticonsExcessiveUse","emoticonsMissingAbbr","fileHasLabel","formWithRequiredLabel","frameTitlesDescribeFunction","frameTitlesNotEmpty","frameTitlesNotPlaceholder","framesHaveATitle","headerH1","headerH1Format","headerH2","headerH2Format","headerH3","headerH3Format","headerH4","headerH4Format","headerH5","headerH5Format","headerH6Format","headersHaveText","headersUseToMarkSections","imgAltEmptyForDecorativeImages","imgAltIsDifferent","imgAltIsSameInText","imgAltIsTooLong","imgAltNotEmptyInAnchor","imgAltNotPlaceHolder","imgGifNoFlicker","imgHasAlt","imgHasLongDesc","imgNonDecorativeHasAlt","imgNotReferredToByColorAlone","inputCheckboxRequiresFieldset","inputImageAltIdentifiesPurpose","inputImageAltIsNotFileName","inputImageAltIsNotPlaceholder","inputImageAltIsShort","inputImageAltNotRedundant","inputImageHasAlt","inputImageNotDecorative","inputTextHasLabel","labelMustBeUnique","labelMustNotBeEmpty","legendDescribesListOfChoices","legendTextNotEmpty","legendTextNotPlaceholder","listNotUsedForFormatting","objectDoesNotFlicker","objectMustContainText","objectMustHaveTitle","pNotUsedAsHeader","paragarphIsWrittenClearly","passwordHasLabel","preShouldNotBeUsedForTabularLayout","radioHasLabel","radioMarkedWithFieldgroupAndLegend","scriptOnclickRequiresOnKeypress","scriptOndblclickRequiresOnKeypress","scriptOnmousedownRequiresOnKeypress","scriptOnmousemove","scriptOnmouseoutHasOnmouseblur","scriptOnmouseoverHasOnfocus","scriptOnmouseupHasOnkeyup","scriptsDoNotFlicker","selectHasAssociatedLabel","selectJumpMenu","selectWithOptionsHasOptgroup","siteMap","skipToContentLinkProvided","svgContainsTitle","tabIndexFollowsLogicalOrder","tableCaptionIdentifiesTable","tableComplexHasSummary","tableDataShouldHaveTh","tableLayoutDataShouldNotHaveTh","tableLayoutHasNoCaption","tableLayoutHasNoSummary","tableNotUsedForLayout","tableUsesCaption","tableUsesScopeForRow","tableWithBothHeadersUseScope","tabularDataIsInTable","textareaHasAssociatedLabel","videoProvidesCaptions","videosEmbeddedOrLinkedNeedCaptions"] \ No newline at end of file diff --git a/dist/quail.jquery.js b/dist/quail.jquery.js new file mode 100644 index 000000000..898bb65ba --- /dev/null +++ b/dist/quail.jquery.js @@ -0,0 +1,1748 @@ +/*! QUAIL quailjs.org | quailjs.org/license */ +;(function($) { +$.fn.quail = function(options) { + if (!this.length) { + return this; + } + quail.options = options; + + quail.html = this; + quail.run(); + + return this; +}; + +$.expr[':'].quailCss = function(obj, index, meta, stack) { + var args = meta[3].split(/\s*=\s*/); + return $(obj).css(args[0]).search(args[1]) > -1; +}; + +var quail = { + + options : { }, + + components : { }, + + testabilityTranslation : { + 0 : 'suggestion', + 0.5 : 'moderate', + 1 : 'severe' + }, + + html : { }, + + strings : { }, + + accessibilityResults : { }, + + accessibilityTests : { }, + + /** + * A list of HTML elements that can contain actual text. + */ + textSelector : 'p, h1, h2, h3, h4, h5, h6, div, pre, blockquote, aside, article, details, summary, figcaption, footer, header, hgroup, nav, section, strong, em, del, i, b', + + /** + * Suspect tags that would indicate a paragraph is being used as a header. + * I know, font tag, I know. Don't get me started. + */ + suspectPHeaderTags : ['strong', 'b', 'em', 'i', 'u', 'font'], + + /** + * Suspect CSS styles that might indicate a paragarph tag is being used as a header. + */ + suspectPCSSStyles : ['color', 'font-weight', 'font-size', 'font-family'], + + /** + * Main run function for quail. It bundles up some accessibility tests, + * and if tests are not passed, it instead fetches them using getJSON. + */ + run : function() { + if(quail.options.reset) { + quail.accessibilityResults = { }; + } + if(typeof quail.options.accessibilityTests !== 'undefined') { + quail.accessibilityTests = quail.options.accessibilityTests; + } + else { + $.ajax({ url : quail.options.jsonPath + '/tests.json', + async : false, + dataType : 'json', + success : function(data) { + if(typeof data === 'object') { + quail.accessibilityTests = data; + } + }}); + } + if(typeof quail.options.customTests !== 'undefined') { + for (var testName in quail.options.customTests) { + quail.accessibilityTests[testName] = quail.options.customTests[testName]; + } + } + if(typeof quail.options.guideline === 'string') { + $.ajax({ url : quail.options.jsonPath + '/guidelines/' + quail.options.guideline +'.tests.json', + async : false, + dataType : 'json', + success : function(data) { + quail.options.guideline = data; + }}); + } + if(typeof quail.options.guideline === 'undefined') { + quail.options.guideline = [ ]; + for (var guidelineTestName in quail.accessibilityTests) { + quail.options.guideline.push(guidelineTestName); + } + } + + quail.runTests(); + if(typeof quail.options.complete !== 'undefined') { + var results = {totals : {severe : 0, moderate : 0, suggestion : 0 }, + results : quail.accessibilityResults }; + $.each(results.results, function(testName, result) { + results.totals[quail.testabilityTranslation[quail.accessibilityTests[testName].testability]] += result.length; + }); + quail.options.complete(results); + } + }, + + getConfiguration : function(testName) { + if(typeof this.options.guidelineName === 'undefined' || + typeof this.accessibilityTests[testName].guidelines === 'undefined' || + typeof this.accessibilityTests[testName].guidelines[this.options.guidelineName] === 'undefined' || + typeof this.accessibilityTests[testName].guidelines[this.options.guidelineName].configuration === 'undefined') { + return false; + } + return this.accessibilityTests[testName].guidelines[this.options.guidelineName].configuration; + }, + + /** + * Utility function called whenever a test fails. + * If there is a callback for testFailed, then it + * packages the object and calls it. + */ + testFails : function(testName, $element, options) { + options = options || {}; + + if(typeof quail.options.preFilter !== 'undefined') { + if(quail.options.preFilter(testName, $element, options) === false) { + return; + } + } + + quail.accessibilityResults[testName].push($element); + if(typeof quail.options.testFailed !== 'undefined') { + var testability = (typeof quail.accessibilityTests[testName].testability !== 'undefined') ? + quail.accessibilityTests[testName].testability : + 'unknown'; + var severity = + quail.options.testFailed({element : $element, + testName : testName, + testability : testability, + severity : quail.testabilityTranslation[testability], + options : options + }); + } + }, + + /** + * Iterates over all the tests in the provided guideline and + * figures out which function or object will handle it. + * Custom callbacks are included directly, others might be part of a category + * of tests. + */ + runTests : function() { + $.each(quail.options.guideline, function(index, testName) { + if(typeof quail.accessibilityTests[testName] === 'undefined') { + return; + } + var testType = quail.accessibilityTests[testName].type; + if(typeof quail.accessibilityResults[testName] === 'undefined') { + quail.accessibilityResults[testName] = [ ]; + } + if(testType === 'selector') { + quail.html.find(quail.accessibilityTests[testName].selector).each(function() { + quail.testFails(testName, $(this)); + }); + } + if(testType === 'custom') { + if(typeof quail.accessibilityTests[testName].callback === 'object' || + typeof quail.accessibilityTests[testName].callback === 'function') { + quail.accessibilityTests[testName].callback(quail); + } + else { + if(typeof quail[quail.accessibilityTests[testName].callback] !== 'undefined') { + quail[quail.accessibilityTests[testName].callback](); + } + } + } + if(typeof quail.components[testType] !== 'undefined') { + quail.components[testType](testName, quail.accessibilityTests[testName]); + } + }); + }, + + /** + * Helper function to determine if a string of text is even readable. + * @todo - This will be added to in the future... we should also include + * phonetic tests. + */ + isUnreadable : function(text) { + if(typeof text !== 'string') { + return true; + } + return (text.trim().length) ? false : true; + }, + + /** + * Read more about this function here: https://github.com/kevee/quail/wiki/Layout-versus-data-tables + */ + isDataTable : function(table) { + //If there are less than three rows, why do a table? + if(table.find('tr').length < 3) { + return false; + } + //If you are scoping a table, it's probably not being used for layout + if(table.find('th[scope]').length) { + return true; + } + var numberRows = table.find('tr:has(td)').length; + //Check for odd cell spanning + var spanCells = table.find('td[rowspan], td[colspan]'); + var isDataTable = true; + if(spanCells.length) { + var spanIndex = {}; + spanCells.each(function() { + if(typeof spanIndex[$(this).index()] === 'undefined') { + spanIndex[$(this).index()] = 0; + } + spanIndex[$(this).index()]++; + }); + $.each(spanIndex, function(index, count) { + if(count < numberRows) { + isDataTable = false; + } + }); + } + //If there are sub tables, but not in the same column row after row, this is a layout table + var subTables = table.find('table'); + if(subTables.length) { + var subTablesIndexes = {}; + subTables.each(function() { + var parentIndex = $(this).parent('td').index(); + if(parentIndex !== false && typeof subTablesIndexes[parentIndex] === 'undefined') { + subTablesIndexes[parentIndex] = 0; + } + subTablesIndexes[parentIndex]++; + }); + $.each(subTablesIndexes, function(index, count) { + if(count < numberRows) { + isDataTable = false; + } + }); + } + return isDataTable; + }, + + /** + * Helper function to determine if a given URL is even valid. + */ + validURL : function(url) { + return (url.search(' ') === -1) ? true : false; + }, + + cleanString : function(string) { + return string.toLowerCase().replace(/^\s\s*/, ''); + }, + + containsReadableText : function(element, children) { + element = element.clone(); + element.find('option').remove(); + if(!quail.isUnreadable(element.text())) { + return true; + } + if(!quail.isUnreadable(element.attr('alt'))) { + return true; + } + if(children) { + var readable = false; + element.find('*').each(function() { + if(quail.containsReadableText($(this), true)) { + readable = true; + } + }); + if(readable) { + return true; + } + } + return false; + } +}; + +quail.components.acronym = function(testName, acronymTag) { + var predefined = { }; + var alreadyReported = { }; + quail.html.find('acronym[title], abbr[title]').each(function() { + predefined[$(this).text().toUpperCase()] = $(this).attr('title'); + }); + quail.html.find('p, div, h1, h2, h3, h4, h5').each(function(){ + var $el = $(this); + var words = $(this).text().split(' '); + if(words.length > 1 && $(this).text().toUpperCase() !== $(this).text()) { + $.each(words, function(index, word) { + word = word.replace(/[^a-zA-Zs]/, ''); + if(word.toUpperCase() === word && + word.length > 1 && + typeof predefined[word.toUpperCase()] === 'undefined') { + if(typeof alreadyReported[word.toUpperCase()] === 'undefined') { + quail.testFails(testName, $el, {acronym : word.toUpperCase()}); + } + alreadyReported[word.toUpperCase()] = word; + } + }); + } + }); +}; +quail.components.color = function(testName, options) { + if(options.bodyForegroundAttribute && options.bodyBackgroundAttribute) { + var $body = quail.html.find('body').clone(false, false); + var foreground = $body.attr(options.bodyForegroundAttribute); + var background = $body.attr(options.bodyBackgroundAttribute); + if(typeof foreground === 'undefined') { + foreground = 'rgb(0,0,0)'; + } + if(typeof background === 'undefined') { + foreground = 'rgb(255,255,255)'; + } + $body.css('color', foreground); + $body.css('background-color', background); + if((options.algorithm === 'wcag' && !quail.colors.passesWCAG($body)) || + (options.algorithm === 'wai' && !quail.colors.passesWAI($body))) { + quail.testFails(testName, $body); + } + } + quail.html.find(options.selector).filter(quail.textSelector).each(function() { + if(!quail.isUnreadable($(this).text()) && + (options.algorithm === 'wcag' && !quail.colors.passesWCAG($(this))) || + (options.algorithm === 'wai' && !quail.colors.passesWAI($(this)))) { + quail.testFails(testName, $(this)); + } + }); +}; + +/** + * Utility object to test for color contrast. + */ +quail.colors = { + + getLuminosity : function(foreground, background) { + foreground = this.cleanup(foreground); + background = this.cleanup(background); + + var RsRGB = foreground.r/255; + var GsRGB = foreground.g/255; + var BsRGB = foreground.b/255; + var R = (RsRGB <= 0.03928) ? RsRGB/12.92 : Math.pow((RsRGB+0.055)/1.055, 2.4); + var G = (GsRGB <= 0.03928) ? GsRGB/12.92 : Math.pow((GsRGB+0.055)/1.055, 2.4); + var B = (BsRGB <= 0.03928) ? BsRGB/12.92 : Math.pow((BsRGB+0.055)/1.055, 2.4); + + var RsRGB2 = background.r/255; + var GsRGB2 = background.g/255; + var BsRGB2 = background.b/255; + var R2 = (RsRGB2 <= 0.03928) ? RsRGB2/12.92 : Math.pow((RsRGB2+0.055)/1.055, 2.4); + var G2 = (GsRGB2 <= 0.03928) ? GsRGB2/12.92 : Math.pow((GsRGB2+0.055)/1.055, 2.4); + var B2 = (BsRGB2 <= 0.03928) ? BsRGB2/12.92 : Math.pow((BsRGB2+0.055)/1.055, 2.4); + var l1, l2; + l1 = (0.2126 * R + 0.7152 * G + 0.0722 * B); + l2 = (0.2126 * R2 + 0.7152 * G2 + 0.0722 * B2); + + return Math.round((Math.max(l1, l2) + 0.05)/(Math.min(l1, l2) + 0.05)*10)/10; + }, + + fetchImageColor : function(){ + var img = new Image(); + var src = $(this).css('background-image').replace('url(', '').replace(/'/, '').replace(')', ''); + img.src = src; + var can = document.createElement('canvas'); + var context = can.getContext('2d'); + context.drawImage(img, 0, 0); + var data = context.getImageData(0, 0, 1, 1).data; + return 'rgb(' + data[0] + ',' + data[1] + ',' + data[2] + ')'; + }, + + passesWCAG : function(element) { + return (quail.colors.getLuminosity(quail.colors.getColor(element, 'foreground'), quail.colors.getColor(element, 'background')) > 5); + }, + + passesWAI : function(element) { + var foreground = quail.colors.cleanup(quail.colors.getColor(element, 'foreground')); + var background = quail.colors.cleanup(quail.colors.getColor(element, 'background')); + return (quail.colors.getWAIErtContrast(foreground, background) > 500 && + quail.colors.getWAIErtBrightness(foreground, background) > 125); + }, + + getWAIErtContrast : function(foreground, background) { + var diffs = quail.colors.getWAIDiffs(foreground, background); + return diffs.red + diffs.green + diffs.blue; + }, + + getWAIErtBrightness : function(foreground, background) { + var diffs = quail.colors.getWAIDiffs(foreground, background); + return ((diffs.red * 299) + (diffs.green * 587) + (diffs.blue * 114)) / 1000; + + }, + + getWAIDiffs : function(foreground, background) { + var diff = { }; + diff.red = Math.abs(foreground.r - background.r); + diff.green = Math.abs(foreground.g - background.g); + diff.blue = Math.abs(foreground.b - background.b); + return diff; + }, + + getColor : function(element, type) { + if(type === 'foreground') { + return (element.css('color')) ? element.css('color') : 'rgb(255,255,255)'; + } + //return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; + if((element.css('background-color') !== 'rgba(0, 0, 0, 0)' && + element.css('background-color') !== 'transparent') || + element.get(0).tagName === 'body') { + return (element.css('background-color')) ? element.css('background-color') : 'rgb(0,0,0)'; + } + var color = 'rgb(0,0,0)'; + element.parents().each(function(){ + if ($(this).css('background-color') !== 'rgba(0, 0, 0, 0)' && + $(this).css('background-color') !== 'transparent') { + color = $(this).css('background-color'); + return false; + } + }); + return color; + }, + + cleanup : function(color) { + color = color.replace('rgb(', '').replace('rgba(', '').replace(')', '').split(','); + return { r : color[0], + g : color[1], + b : color[2], + a : ((typeof color[3] === 'undefined') ? false : color[3]) + }; + } + +}; +quail.components.convertToPx = function(unit) { + var $test = $('
').appendTo(quail.html); + var height = $test.height(); + $test.remove(); + return height; +}; + +quail.components.event = function(testName, options) { + var $items = (typeof options.selector === 'undefined') ? + quail.html.find('*') : + quail.html.find(options.selector); + $items.each(function() { + if(quail.components.hasEventListener($(this), options.searchEvent.replace('on', '')) && + (typeof options.correspondingEvent === 'undefined' || + !quail.components.hasEventListener($(this), options.correspondingEvent.replace('on', '')))) { + quail.testFails(testName, $(this)); + } + }); +}; +quail.components.hasEventListener = function(element, event) { + if(typeof $(element).attr('on' + event) !== 'undefined') { + return true; + } + return typeof $(element).get(0)[event] !== 'undefined'; +}; +quail.components.header = function(testName, options) { + var current = parseInt(options.selector.substr(-1, 1), 10); + var nextHeading = false; + quail.html.find('h1, h2, h3, h4, h5, h6').each(function() { + var number = parseInt($(this).get(0).tagName.substr(-1, 1), 10); + if(nextHeading && (number - 1 > current || number + 1 < current)) { + quail.testFails(testName, $(this)); + } + if(number === current) { + nextHeading = $(this); + } + if(nextHeading && number !== current) { + nextHeading = false; + } + }); +}; +quail.components.label = function(testName, options) { + quail.html.find(options.selector).each(function() { + if((!$(this).parent('label').length || + !quail.containsReadableText($(this).parent('label'))) && + (!quail.html.find('label[for=' + $(this).attr('id') + ']').length || + !quail.containsReadableText(quail.html.find('label[for=' + $(this).attr('id') + ']')))) { + quail.testFails(testName, $(this)); + } + }); +}; +quail.components.labelProximity = function(testName, options) { + quail.html.find(options.selector).each(function() { + var $label = quail.html.find('label[for=' + $(this).attr('id') + ']').first(); + if(!$label.length) { + quail.testFails(testName, $(this)); + } + if(!$(this).parent().is($label.parent())) { + quail.testFails(testName, $(this)); + } + }); +}; +quail.components.placeholder = function(testName, options) { + quail.html.find(options.selector).each(function() { + var text; + if(typeof options.attribute !== 'undefined') { + if(typeof $(this).attr(options.attribute) === 'undefined' || + (options.attribute === 'tabindex' && + $(this).attr(options.attribute) <= 0 + ) + ) { + quail.testFails(testName, $(this)); + return; + } + text = $(this).attr(options.attribute); + } + else { + text = $(this).text(); + $(this).find('img[alt]').each(function() { + text += $(this).attr('alt'); + }); + } + if(typeof text === 'string') { + text = quail.cleanString(text); + var regex = /^([0-9]*)(k|kb|mb|k bytes|k byte)$/g; + var regexResults = regex.exec(text.toLowerCase()); + if(regexResults && regexResults[0].length) { + quail.testFails(testName, $(this)); + } + else { + if(options.empty && quail.isUnreadable(text)) { + quail.testFails(testName, $(this)); + } + else { + if(quail.strings.placeholders.indexOf(text) > -1 ) { + quail.testFails(testName, $(this)); + } + } + } + } + else { + if(options.empty && typeof text !== 'number') { + quail.testFails(testName, $(this)); + } + } + }); +}; +quail.statistics = { + + setDecimal : function( num, numOfDec ){ + var pow10s = Math.pow( 10, numOfDec || 0 ); + return ( numOfDec ) ? Math.round( pow10s * num ) / pow10s : num; + }, + + average : function( numArr, numOfDec ){ + var i = numArr.length, + sum = 0; + while( i-- ){ + sum += numArr[ i ]; + } + return quail.statistics.setDecimal( (sum / numArr.length ), numOfDec ); + }, + + variance : function( numArr, numOfDec ){ + var avg = quail.statistics.average( numArr, numOfDec ), + i = numArr.length, + v = 0; + + while( i-- ){ + v += Math.pow( (numArr[ i ] - avg), 2 ); + } + v /= numArr.length; + return quail.statistics.setDecimal( v, numOfDec ); + }, + + standardDeviation : function( numArr, numOfDec ){ + var stdDev = Math.sqrt( quail.statistics.variance( numArr, numOfDec ) ); + return quail.statistics.setDecimal( stdDev, numOfDec ); + } +}; + +quail.components.textStatistics = { + + cleanText : function(text) { + return text.replace(/[,:;()\-]/, ' ') + .replace(/[\.!?]/, '.') + .replace(/[ ]*(\n|\r\n|\r)[ ]*/, ' ') + .replace(/([\.])[\. ]+/, '$1') + .replace(/[ ]*([\.])/, '$1') + .replace(/[ ]+/, ' ') + .toLowerCase(); + + }, + + sentenceCount : function(text) { + var copy = text; + return copy.split('.').length + 1; + }, + + wordCount : function(text) { + var copy = text; + return copy.split(' ').length + 1; + }, + + averageWordsPerSentence : function(text) { + return this.wordCount(text) / this.sentenceCount(text); + }, + + averageSyllablesPerWord : function(text) { + var that = this; + var count = 0; + var wordCount = that.wordCount(text); + if(!wordCount) { + return 0; + } + $.each(text.split(' '), function(index, word) { + count += that.syllableCount(word); + }); + return count / wordCount; + }, + + syllableCount : function(word) { + var matchedWord = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '') + .match(/[aeiouy]{1,2}/g); + if(!matchedWord || matchedWord.length === 0) { + return 1; + } + return matchedWord.length; + } +}; +quail.components.video = { + + youTube : { + + videoID : '', + + apiUrl : 'http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json', + + isVideo : function(url) { + var regExp = /^.*((youtu.be\/)|(v\/)|(\/u\/\w\/)|(embed\/)|(watch\?))\??v?=?([^#\&\?]*).*/; + var match = url.match(regExp); + if (match && match[7].length === 11) { + this.videoID = match[7]; + return true; + } + return false; + }, + + hasCaptions : function(callback) { + $.ajax({url : this.apiUrl.replace('%video', this.videoID), + async : false, + dataType : 'json', + success : function(data) { + callback((data.feed.openSearch$totalResults.$t > 0) ? true : false); + } + }); + } + } +}; +quail.strings.colors = { + "aliceblue": "f0f8ff", + "antiquewhite": "faebd7", + "aqua": "00ffff", + "aquamarine": "7fffd4", + "azure": "f0ffff", + "beige": "f5f5dc", + "bisque": "ffe4c4", + "black": "000000", + "blanchedalmond": "ffebcd", + "blue": "0000ff", + "blueviolet": "8a2be2", + "brown": "a52a2a", + "burlywood": "deb887", + "cadetblue": "5f9ea0", + "chartreuse": "7fff00", + "chocolate": "d2691e", + "coral": "ff7f50", + "cornflowerblue": "6495ed", + "cornsilk": "fff8dc", + "crimson": "dc143c", + "cyan": "00ffff", + "darkblue": "00008b", + "darkcyan": "008b8b", + "darkgoldenrod": "b8860b", + "darkgray": "a9a9a9", + "darkgreen": "006400", + "darkkhaki": "bdb76b", + "darkmagenta": "8b008b", + "darkolivegreen": "556b2f", + "darkorange": "ff8c00", + "darkorchid": "9932cc", + "darkred": "8b0000", + "darksalmon": "e9967a", + "darkseagreen": "8fbc8f", + "darkslateblue": "483d8b", + "darkslategray": "2f4f4f", + "darkturquoise": "00ced1", + "darkviolet": "9400d3", + "deeppink": "ff1493", + "deepskyblue": "00bfff", + "dimgray": "696969", + "dodgerblue": "1e90ff", + "firebrick": "b22222", + "floralwhite": "fffaf0", + "forestgreen": "228b22", + "fuchsia": "ff00ff", + "gainsboro": "dcdcdc", + "ghostwhite": "f8f8ff", + "gold": "ffd700", + "goldenrod": "daa520", + "gray": "808080", + "green": "008000", + "greenyellow": "adff2f", + "honeydew": "f0fff0", + "hotpink": "ff69b4", + "indianred": "cd5c5c", + "indigo": "4b0082", + "ivory": "fffff0", + "khaki": "f0e68c", + "lavender": "e6e6fa", + "lavenderblush": "fff0f5", + "lawngreen": "7cfc00", + "lemonchiffon": "fffacd", + "lightblue": "add8e6", + "lightcoral": "f08080", + "lightcyan": "e0ffff", + "lightgoldenrodyellow": "fafad2", + "lightgrey": "d3d3d3", + "lightgreen": "90ee90", + "lightpink": "ffb6c1", + "lightsalmon": "ffa07a", + "lightseagreen": "20b2aa", + "lightskyblue": "87cefa", + "lightslategray": "778899", + "lightsteelblue": "b0c4de", + "lightyellow": "ffffe0", + "lime": "00ff00", + "limegreen": "32cd32", + "linen": "faf0e6", + "magenta": "ff00ff", + "maroon": "800000", + "mediumaquamarine": "66cdaa", + "mediumblue": "0000cd", + "mediumorchid": "ba55d3", + "mediumpurple": "9370d8", + "mediumseagreen": "3cb371", + "mediumslateblue": "7b68ee", + "mediumspringgreen": "00fa9a", + "mediumturquoise": "48d1cc", + "mediumvioletred": "c71585", + "midnightblue": "191970", + "mintcream": "f5fffa", + "mistyrose": "ffe4e1", + "moccasin": "ffe4b5", + "navajowhite": "ffdead", + "navy": "000080", + "oldlace": "fdf5e6", + "olive": "808000", + "olivedrab": "6b8e23", + "orange": "ffa500", + "orangered": "ff4500", + "orchid": "da70d6", + "palegoldenrod": "eee8aa", + "palegreen": "98fb98", + "paleturquoise": "afeeee", + "palevioletred": "d87093", + "papayawhip": "ffefd5", + "peachpuff": "ffdab9", + "peru": "cd853f", + "pink": "ffc0cb", + "plum": "dda0dd", + "powderblue": "b0e0e6", + "purple": "800080", + "red": "ff0000", + "rosybrown": "bc8f8f", + "royalblue": "4169e1", + "saddlebrown": "8b4513", + "salmon": "fa8072", + "sandybrown": "f4a460", + "seagreen": "2e8b57", + "seashell": "fff5ee", + "sienna": "a0522d", + "silver": "c0c0c0", + "skyblue": "87ceeb", + "slateblue": "6a5acd", + "slategray": "708090", + "snow": "fffafa", + "springgreen": "00ff7f", + "steelblue": "4682b4", + "tan": "d2b48c", + "teal": "008080", + "thistle": "d8bfd8", + "tomato": "ff6347", + "turquoise": "40e0d0", + "violet": "ee82ee", + "wheat": "f5deb3", + "white": "ffffff", + "whitesmoke": "f5f5f5", + "yellow": "ffff00", + "yellowgreen": "9acd32" +}; +quail.strings.emoticons = [ + ":)", + ";)", + ":-)", + ":^)", + "=)", + "B)", + "8)", + "c8", + "cB", + "=]", + ":]", + "x]", + ":-)", + ":)", + ":o)", + "=]", + ":-D", + ":D", + "=D", + ":-(", + ":(", + "=(", + ":/", + ":P", + ":o" +]; + +quail.strings.languageCodes = [ + "bh", + "bi", + "nb", + "bs", + "br", + "bg", + "my", + "es", + "ca", + "km", + "ch", + "ce", + "ny", + "ny", + "zh", + "za", + "cu", + "cu", + "cv", + "kw", + "co", + "cr", + "hr", + "cs", + "da", + "dv", + "dv", + "nl", + "dz", + "en", + "eo", + "et", + "ee", + "fo", + "fj", + "fi", + "nl", + "fr", + "ff", + "gd", + "gl", + "lg", + "ka", + "de", + "ki", + "el", + "kl", + "gn", + "gu", + "ht", + "ht", + "ha", + "he", + "hz", + "hi", + "ho", + "hu", + "is", + "io", + "ig", + "id", + "ia", + "ie", + "iu", + "ik", + "ga", + "it", + "ja", + "jv", + "kl", + "kn", + "kr", + "ks", + "kk", + "ki", + "rw", + "ky", + "kv", + "kg", + "ko", + "kj", + "ku", + "kj", + "ky", + "lo", + "la", + "lv", + "lb", + "li", + "li", + "li", + "ln", + "lt", + "lu", + "lb", + "mk", + "mg", + "ms", + "ml", + "dv", + "mt", + "gv", + "mi", + "mr", + "mh", + "ro", + "ro", + "mn", + "na", + "nv", + "nv", + "nd", + "nr", + "ng", + "ne", + "nd", + "se", + "no", + "nb", + "nn", + "ii", + "ny", + "nn", + "ie", + "oc", + "oj", + "cu", + "cu", + "cu", + "or", + "om", + "os", + "os", + "pi", + "pa", + "ps", + "fa", + "pl", + "pt", + "pa", + "ps", + "qu", + "ro", + "rm", + "rn", + "ru", + "sm", + "sg", + "sa", + "sc", + "gd", + "sr", + "sn", + "ii", + "sd", + "si", + "si", + "sk", + "sl", + "so", + "st", + "nr", + "es", + "su", + "sw", + "ss", + "sv", + "tl", + "ty", + "tg", + "ta", + "tt", + "te", + "th", + "bo", + "ti", + "to", + "ts", + "tn", + "tr", + "tk", + "tw", + "ug", + "uk", + "ur", + "ug", + "uz", + "ca", + "ve", + "vi", + "vo", + "wa", + "cy", + "fy", + "wo", + "xh", + "yi", + "yo", + "za", + "zu" +]; +quail.strings.placeholders = [ +"title", +"untitled", +"untitled document", +"this is the title", +"the title", +"content", +" ", +"new page", +"new", +"nbsp", +" ", +"spacer", +"image", +"img", +"photo", +"frame", +"frame title", +"iframe", +"iframe title", +"legend" +]; +quail.strings.redundant = { + "inputImage":[ + "submit", + "button" + ], + "link":[ + "link to", + "link", + "go to", + "click here", + "link", + "click", + "more" + ], + "required":[ + "*" + ] +}; +quail.strings.siteMap = [ + "site map", + "map", + "sitemap" +]; +quail.strings.suspiciousLinks = [ +"click here", +"click", +"more", +"here", +"read more", +"download", +"add", +"delete", +"clone", +"order", +"view", +"read", +"clic aquí", +"clic", +"haga clic", +"más", +"aquí", +"image" +]; +quail.strings.symbols = [ + "|", + "*", + /\*/g, + "a
. elements may not use the \"javascript\" protocol in their \"href\" attributes."
+ }
+ },
+ "aSuspiciousLinkText": {
+ "callback": "aSuspiciousLinkText",
+ "strings": "suspiciousLinks",
+ "tags": [
+ "link",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H30"
+ ]
+ },
+ "2.4.4": {
+ "techniques": [
+ "H30"
+ ]
+ },
+ "2.4.9": {
+ "techniques": [
+ "H30"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Link text should be useful"
+ },
+ "description": {
+ "en": "Because many users of screen-readers use links to navigate the page, providing links with text that simply read \"click here\" gives no hint of the function of the link"
+ }
+ },
+ "aTitleDescribesDestination": {
+ "selector": "a[title]",
+ "tags": [
+ "link",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.4.9": {
+ "techniques": [
+ "H33",
+ "H25"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The title attribute of all source a (anchor) elements describes the link destination."
+ },
+ "description": {
+ "en": "Every link must have a \"title\" attribute which describes the purpose or destination of the link."
+ }
+ },
+ "addressForAuthor": {
+ "selector": "body:not(body:has(address))",
+ "tags": [
+ "document"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The document should contain an address for the author"
+ },
+ "description": {
+ "en": "Documents should provide a valid email address within an address
element."
+ }
+ },
+ "addressForAuthorMustBeValid": {
+ "selector": "address",
+ "tags": [
+ "document"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The document should contain a valid email address for the author"
+ },
+ "description": {
+ "en": "Documents should provide a valid email address within an address
element."
+ }
+ },
+ "appletContainsTextEquivalent": {
+ "callback": "appletContainsTextEquivalent",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "m"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "G74",
+ "H35"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All applets should contain the same content within the body of the applet"
+ },
+ "description": {
+ "en": "Applets should contain their text equivalents or description within the applet
tag itself."
+ }
+ },
+ "appletContainsTextEquivalentInAlt": {
+ "attribute": "alt",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "applet",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "placeholder",
+ "guidelines": {
+ "508": [
+ "m"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "G74",
+ "H35"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All applets should contain a text equivalent in the \"alt\" attribute"
+ },
+ "description": {
+ "en": "Applets should contain their text equivalents or description in an \"alt\" attribute."
+ }
+ },
+ "appletProvidesMechanismToReturnToParent": {
+ "selector": "applet",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "All applets should provide a way for keyboard users to escape"
+ },
+ "description": {
+ "en": "Ensure that a user who has only a keyboard as an input device can escape an applet
element. This requires manual confirmation."
+ }
+ },
+ "appletTextEquivalentsGetUpdated": {
+ "selector": "applet",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "m"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "G74",
+ "H35"
+ ]
+ }
+ }
+ }
+ },
+ "appletUIMustBeAccessible": {
+ "selector": "applet",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "m"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "G74",
+ "H35"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Any user interface in an applet must be accessible"
+ },
+ "description": {
+ "en": "Applet content should be assessed for accessibility."
+ }
+ },
+ "appletsDoNotFlicker": {
+ "selector": "applet",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "j"
+ ],
+ "wcag": {
+ "2.2.2": {
+ "techniques": [
+ "F7"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All applets do not flicker"
+ },
+ "description": {
+ "en": "Applets should not flicker."
+ }
+ },
+ "appletsDoneUseColorAlone": {
+ "selector": "applet",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "c"
+ ]
+ },
+ "title": {
+ "en": "Applets should not use color alone to communicate content"
+ },
+ "description": {
+ "en": "Applets should contain content that makes sense without color and is accessible to users who are color blind."
+ }
+ },
+ "areaAltIdentifiesDestination": {
+ "selector": "area[alt]",
+ "tags": [
+ "objects",
+ "applet",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "G74"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"area\" elements must have an \"alt\" attribute which describes the link destination"
+ },
+ "description": {
+ "en": "All area
elements within a map
must have an \"alt\" attribute"
+ }
+ },
+ "areaAltRefersToText": {
+ "selector": "area",
+ "tags": [
+ "imagemap",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Alt text for \"area\" elements should replicate the text found in the image"
+ },
+ "description": {
+ "en": "If an image is being used as a map, and an area
encompasses text within the image, then the \"alt\" attribute of that area
element should be the same as the text found in the image."
+ }
+ },
+ "areaDontOpenNewWindow": {
+ "selector": "area[target='new window'], area[target=_new], area[target=_blank], area[target=_blank]",
+ "tags": [
+ "imagemap",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "No \"area\" elements should open a new window without warning"
+ },
+ "description": {
+ "en": "No area
elements should open a new window without warning."
+ }
+ },
+ "areaHasAltValue": {
+ "selector": "area:not(area[alt])",
+ "tags": [
+ "imagemap",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "F65",
+ "G74",
+ "H24"
+ ]
+ },
+ "1.4.3": {
+ "techniques": [
+ "G145"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"area\" elements must have an \"alt\" attribute"
+ },
+ "description": {
+ "en": "All area
elements within a map
must have an \"alt\" attribute."
+ }
+ },
+ "areaLinksToSoundFile": {
+ "selector": "area[href$=wav], area[href$=snd], area[href$=mp3], area[href$=iff], area[href$=svx], area[href$=sam], area[href$=smp], area[href$=vce], area[href$=vox], area[href$=pcm], area[href$=aif]",
+ "tags": [
+ "imagemap",
+ "media",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "G74"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"area\" elements which link to a sound file should also provide a link to a transcript"
+ },
+ "description": {
+ "en": "All area
elements which link to a sound file should have a text transcript"
+ }
+ },
+ "ariaOrphanedContent": {
+ "selector": "body *:not(*[role] *, *[role], script, meta, link)",
+ "tags": [
+ "aria",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Pages using ARIA roles should not have orphaned content"
+ },
+ "description": {
+ "en": "If a page makes use of ARIA roles, then there should not be any content on the page which is not within an element that exposes a role, as it could cause that content to be rendreed inaccessible to users with screen readers."
+ }
+ },
+ "basefontIsNotUsed": {
+ "selector": "basefont",
+ "tags": [
+ "document",
+ "deprecated"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Basefont should not be used"
+ },
+ "description": {
+ "en": "The basefont
tag is deprecated and should not be used. Investigate using stylesheets instead."
+ }
+ },
+ "blinkIsNotUsed": {
+ "selector": "blink",
+ "tags": [
+ "deprecated",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.2.2": {
+ "techniques": [
+ "F47"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The \"blink\" tag should not be used"
+ },
+ "description": {
+ "en": "The blink
tag should not be used. Ever."
+ }
+ },
+ "blockquoteNotUsedForIndentation": {
+ "selector": "blockquote:not(blockquote[cite])",
+ "tags": [
+ "blockquote",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H49"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The \"blockquote\" tag should not be used just for indentation"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "blockquoteUseForQuotations": {
+ "callback": "blockquoteUseForQuotations",
+ "tags": [
+ "blockquote",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H49"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "If long quotes are in the document, use the \"blockquote\" element to mark them"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "bodyActiveLinkColorContrast": {
+ "algorithm": "wcag",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "alink",
+ "components": [
+ "color"
+ ],
+ "selector": "a:active",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": [],
+ "title": {
+ "en": "Contrast between active link text and background should be 5:1"
+ },
+ "description": {
+ "en": "The contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."
+ }
+ },
+ "bodyColorContrast": {
+ "algorithm": "wcag",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "text",
+ "components": [
+ "color"
+ ],
+ "selector": "body",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": [],
+ "title": {
+ "en": "Contrast between text and background should be 5:1"
+ },
+ "description": {
+ "en": "The contrast ratio of text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."
+ }
+ },
+ "bodyLinkColorContrast": {
+ "algorithm": "wcag",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "link",
+ "components": [
+ "color"
+ ],
+ "selector": "a",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": [],
+ "title": {
+ "en": "Contrast between link text and background should be 5:1"
+ },
+ "description": {
+ "en": "The contrast ratio of link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."
+ }
+ },
+ "bodyMustNotHaveBackground": {
+ "selector": "body[background]",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Body elements do not use a background image"
+ },
+ "description": {
+ "en": "The body
element for the page may not have a \"background\" attribute."
+ }
+ },
+ "bodyVisitedLinkColorContrast": {
+ "algorithm": "wcag",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "vlink",
+ "components": [
+ "color"
+ ],
+ "selector": "a:visited",
+ "tags": [
+ "link",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": [],
+ "title": {
+ "en": "Contrast between visited link text and background should be 5:1"
+ },
+ "description": {
+ "en": "The contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."
+ }
+ },
+ "boldIsNotUsed": {
+ "selector": "bold",
+ "tags": [
+ "semantics",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The \"b\" (bold) element is not used"
+ },
+ "description": {
+ "en": "The b
(bold) element provides no emphasis for non-sighted readers. Use the strong
tag instead."
+ }
+ },
+ "checkboxHasLabel": {
+ "components": [
+ "label"
+ ],
+ "selector": "input[type=checkbox]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "label",
+ "guidelines": {
+ "508": [
+ "c"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All checkboxes must have a corresponding label"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"checkbox\" should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"
+ }
+ },
+ "checkboxLabelIsNearby": {
+ "components": [
+ "labelProximity"
+ ],
+ "selector": "input[type=checkbox]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "labelProximity",
+ "guidelines": [],
+ "title": {
+ "en": "All \"checkbox\" input elements have a label that is close"
+ },
+ "description": {
+ "en": "All input elements of type \"checkbox\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."
+ }
+ },
+ "cssDocumentMakesSenseStyleTurnedOff": {
+ "selector": "link[rel=stylesheet], stylesheet, *[style]",
+ "tags": [
+ "color"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "G140"
+ ]
+ },
+ "1.4.5": {
+ "techniques": [
+ "G140"
+ ]
+ },
+ "1.4.9": {
+ "techniques": [
+ "G140"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The document must be readable with styles turned off"
+ },
+ "description": {
+ "en": "With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear."
+ }
+ },
+ "cssTextHasContrast": {
+ "algorithm": "wcag",
+ "bodyBackgroundAttribute": "color",
+ "bodyForegroundAttribute": "background",
+ "components": [
+ "color"
+ ],
+ "selector": "*",
+ "tags": [
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": {
+ "wcag": {
+ "1.4.3": {
+ "techniques": [
+ "G18"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All elements should have appropriate color contrast"
+ },
+ "description": {
+ "en": "For users who have color blindness, all text or other elements should have a color contrast of 5:1."
+ }
+ },
+ "doctypeProvided": {
+ "callback": "doctypeProvided",
+ "tags": [
+ "doctype"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "The document should contain a valid \"doctype\" declaration"
+ },
+ "description": {
+ "en": "Each document must contain a valid doctype declaration.."
+ }
+ },
+ "documentAbbrIsUsed": {
+ "callback": "documentAbbrIsUsed",
+ "components": [
+ "acronym"
+ ],
+ "tags": [
+ "acronym",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "3.1.4": {
+ "techniques": [
+ "H28"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Abbreviations must be marked with an \"abbr\" element"
+ },
+ "description": {
+ "en": "Abbreviations should be marked with an abbr
element, at least once on the page for each abbreviation."
+ }
+ },
+ "documentAcronymsHaveElement": {
+ "callback": "documentAcronymsHaveElement",
+ "components": [
+ "acronym"
+ ],
+ "tags": [
+ "acronym",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "3.1.4": {
+ "techniques": [
+ "H28"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Acronyms must be marked with an \"acronym\" element"
+ },
+ "description": {
+ "en": "Abbreviations should be marked with an acronym
element, at least once on the page for each abbreviation."
+ }
+ },
+ "documentAllColorsAreSet": {
+ "selector": "body:not(body[text][bgcolor][link][alink][vlink], body:not(body[text], body[bgcolor], body[link], body[alink], body[vlink]))",
+ "tags": [
+ "deprecated",
+ "color"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "All the document colors must be set"
+ },
+ "description": {
+ "en": "If any colors for text or the background are set in the body
element, then all colors must be set."
+ }
+ },
+ "documentAutoRedirectNotUsed": {
+ "selector": "meta[http-equiv=refresh]",
+ "tags": [
+ "document"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Auto-redirect with \"meta\" elements must not be used"
+ },
+ "description": {
+ "en": "Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed"
+ }
+ },
+ "documentColorWaiActiveLinkAlgorithm": {
+ "algorithm": "wai",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "alink",
+ "components": [
+ "color"
+ ],
+ "selector": "a:active",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": []
+ },
+ "documentColorWaiAlgorithm": {
+ "algorithm": "wai",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "text",
+ "components": [
+ "color"
+ ],
+ "selector": "body",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": []
+ },
+ "documentColorWaiLinkAlgorithm": {
+ "algorithm": "wai",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "link",
+ "components": [
+ "color"
+ ],
+ "selector": "a",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": []
+ },
+ "documentColorWaiVisitedLinkAlgorithm": {
+ "algorithm": "wai",
+ "bodyBackgroundAttribute": "bgcolor",
+ "bodyForegroundAttribute": "vlink",
+ "components": [
+ "color"
+ ],
+ "selector": "a:visited",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 1,
+ "type": "color",
+ "guidelines": []
+ },
+ "documentContentReadableWithoutStylesheets": {
+ "selector": "html:has(link[rel=stylesheet], style) body, body:has(*[style])",
+ "tags": [
+ "document",
+ "color"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "d"
+ ],
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "G140"
+ ]
+ },
+ "1.4.5": {
+ "techniques": [
+ "G140"
+ ]
+ },
+ "1.4.9": {
+ "techniques": [
+ "G140"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Content should be readable without style sheets"
+ },
+ "description": {
+ "en": "With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear."
+ }
+ },
+ "documentHasTitleElement": {
+ "selector": "html:not(html:has(title))",
+ "tags": [
+ "document",
+ "head"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.4.2": {
+ "techniques": [
+ "H25"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The document should have a title element"
+ },
+ "description": {
+ "en": "The document should have a title element."
+ }
+ },
+ "documentIDsMustBeUnique": {
+ "callback": "documentIDsMustBeUnique",
+ "tags": [
+ "document",
+ "semantics"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "4.1.1": {
+ "techniques": [
+ "F77"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All element \"id\" attributes must be unique"
+ },
+ "description": {
+ "en": "Element \"id\" attributes must be unique."
+ }
+ },
+ "documentIsWrittenClearly": {
+ "callback": "documentIsWrittenClearly",
+ "components": [
+ "textStatistics"
+ ],
+ "tags": [
+ "language",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "3.1.5": {
+ "techniques": [
+ "G86"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The document should be written to the target audience and read clearly"
+ },
+ "description": {
+ "en": "If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content."
+ }
+ },
+ "documentLangIsISO639Standard": {
+ "callback": "documentLangIsISO639Standard",
+ "strings": "languageCodes",
+ "tags": [
+ "document",
+ "language"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "3.1.1": {
+ "techniques": [
+ "H57"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The document's language attribute should be a standard code"
+ },
+ "description": {
+ "en": "The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639."
+ }
+ },
+ "documentLangNotIdentified": {
+ "selector": "html:not(html[lang])",
+ "tags": [
+ "document",
+ "language"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The document must have a \"lang\" attribute"
+ },
+ "description": {
+ "en": "The document should have a default langauge, by setting the \"lang\" attribute in the html
element."
+ }
+ },
+ "documentMetaNotUsedWithTimeout": {
+ "selector": "meta[http-equiv=refresh]",
+ "tags": [
+ "document"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.2.1": {
+ "techniques": [
+ "F40",
+ "F41"
+ ]
+ },
+ "2.2.4": {
+ "techniques": [
+ "F40",
+ "F41"
+ ]
+ },
+ "3.2.5": {
+ "techniques": [
+ "F41"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Meta elements must not be used to refresh the content of a page"
+ },
+ "description": {
+ "en": "Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \"refresh this\" link instead.."
+ }
+ },
+ "documentReadingDirection": {
+ "selector": "*[lang=he]:not(*[dir=rtl]), *[lang=ar]:not(*[dir=rtl])",
+ "tags": [
+ "document",
+ "language"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.2": {
+ "techniques": [
+ "H34"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Reading direction of text is correctly marked"
+ },
+ "description": {
+ "en": "Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared."
+ }
+ },
+ "documentStrictDocType": {
+ "callback": "documentStrictDocType",
+ "tags": [
+ "document",
+ "doctype"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "The page uses a strict doctype"
+ },
+ "description": {
+ "en": "The doctype of the page or document should be either an HTML or XHTML strict doctype."
+ }
+ },
+ "documentTitleDescribesDocument": {
+ "selector": "head title:first",
+ "tags": [
+ "document",
+ "head"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.4.2": {
+ "techniques": [
+ "F25",
+ "G88"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The title describes the document"
+ },
+ "description": {
+ "en": "The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another."
+ }
+ },
+ "documentTitleIsNotPlaceholder": {
+ "components": [
+ "placeholder"
+ ],
+ "content": true,
+ "selector": "head title:first",
+ "tags": [
+ "document",
+ "head"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "2.4.2": {
+ "techniques": [
+ "F25",
+ "G88"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The document title should not be placeholder text"
+ },
+ "description": {
+ "en": "The document title should not be wasted placeholder text which does not describe the page."
+ }
+ },
+ "documentTitleIsShort": {
+ "callback": "documentTitleIsShort",
+ "tags": [
+ "document",
+ "head"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "The document title should be short"
+ },
+ "description": {
+ "en": "The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion."
+ }
+ },
+ "documentTitleNotEmpty": {
+ "components": [
+ "placeholder"
+ ],
+ "content": true,
+ "empty": true,
+ "selector": "head title",
+ "tags": [
+ "document",
+ "head"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "2.4.2": {
+ "techniques": [
+ "F25",
+ "H25"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The document should not have an empty title"
+ },
+ "description": {
+ "en": "The document should have a title element that is not white space"
+ }
+ },
+ "documentValidatesToDocType": {
+ "callback": "documentValidatesToDocType",
+ "tags": [
+ "document",
+ "doctype"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "4.1.1": {
+ "techniques": [
+ "G134"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Document must validate to the doctype"
+ },
+ "description": {
+ "en": "The document must validate to the declared doctype."
+ }
+ },
+ "documentVisualListsAreMarkedUp": {
+ "callback": "documentVisualListsAreMarkedUp",
+ "tags": [
+ "list",
+ "semantics",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H28",
+ "T2"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Visual lists of items are marked using ordered or unordered lists"
+ },
+ "description": {
+ "en": "Use the ordered (ol
. or unordered (ul
. elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list."
+ }
+ },
+ "documentWordsNotInLanguageAreMarked": {
+ "selector": "body",
+ "tags": [
+ "language"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "3.1.2": {
+ "techniques": [
+ "H58"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Any words or phrases which are not the document's primary language should be marked"
+ },
+ "description": {
+ "en": "If a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text."
+ }
+ },
+ "embedHasAssociatedNoEmbed": {
+ "callback": "embedHasAssociatedNoEmbed",
+ "tags": [
+ "object",
+ "embed",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H46"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"embed\" elements have an associated \"noembed\" element"
+ },
+ "description": {
+ "en": "Because some users cannot use the embed
element, provide alternative content in a noembed
element."
+ }
+ },
+ "embedMustHaveAltAttribute": {
+ "selector": "embed:not(embed[alt])",
+ "tags": [
+ "object",
+ "embed",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Embed\" elements must have an \"alt\" attribute"
+ },
+ "description": {
+ "en": "All embed
elements must have an \"alt\" attribute."
+ }
+ },
+ "embedMustNotHaveEmptyAlt": {
+ "selector": "embed[alt=]",
+ "tags": [
+ "object",
+ "embed",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Embed\" elements cannot have an empty \"alt\" attribute"
+ },
+ "description": {
+ "en": "All embed
elements must have an \"alt\" attribute that is not empty."
+ }
+ },
+ "embedProvidesMechanismToReturnToParent": {
+ "selector": "embed",
+ "tags": [
+ "object",
+ "embed",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.1.2": {
+ "techniques": [
+ "G21"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All embed elements should provide a way for keyboard users to escape"
+ },
+ "description": {
+ "en": "Ensure that a user who has only a keyboard as an input device can escape an embed
element. This requires manual confirmation."
+ }
+ },
+ "emoticonsExcessiveUse": {
+ "callback": "emoticonsExcessiveUse",
+ "strings": "emoticons",
+ "tags": [
+ "language",
+ "emoticons",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H86"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Emoticons should not be used excessively"
+ },
+ "description": {
+ "en": "Emoticons should not be used excessively to communicate feelings or content. Try to rewrite the document to have more textual meaning, or wrapping the emoticons in an abbr
element as outlined below. Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document."
+ }
+ },
+ "emoticonsMissingAbbr": {
+ "callback": "emoticonsMissingAbbr",
+ "strings": "emoticons",
+ "tags": [
+ "language",
+ "emoticons",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H86"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Emoticons should have abbreviations"
+ },
+ "description": {
+ "en": "Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document. If this emoticon is important content, mark it up with an \"abbr\" or \"acronym\" tag."
+ }
+ },
+ "fileHasLabel": {
+ "components": [
+ "label"
+ ],
+ "selector": "input[type=file]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "label",
+ "guidelines": {
+ "508": [
+ "n"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"file\" input elements have a corresponding label"
+ },
+ "description": {
+ "en": "All input
elements of type \"file\" should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"
+ }
+ },
+ "fileLabelIsNearby": {
+ "components": [
+ "labelProximity"
+ ],
+ "selector": "input[type=file]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "labelProximity",
+ "guidelines": [],
+ "title": {
+ "en": "All \"file\" input elements have a label that is close"
+ },
+ "description": {
+ "en": "All input elements of type \"file\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."
+ }
+ },
+ "fontIsNotUsed": {
+ "selector": "font",
+ "tags": [
+ "deprecated",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Font elements should not be used"
+ },
+ "description": {
+ "en": "The basefont
tag is deprecated and should not be used. Investigate using stylesheets instead."
+ }
+ },
+ "formAllowsCheckIfIrreversable": {
+ "selector": "form",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": []
+ },
+ "formDeleteIsReversable": {
+ "selector": "form",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Deleting items using a form should be reversable"
+ },
+ "description": {
+ "en": "Check that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation."
+ }
+ },
+ "formErrorMessageHelpsUser": {
+ "selector": "form",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Forms offer the user a way to check the results of their form before performing an irrevokable action"
+ },
+ "description": {
+ "en": "If the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation."
+ }
+ },
+ "formHasGoodErrorMessage": {
+ "selector": "form",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Form error messages should assist in solving errors"
+ },
+ "description": {
+ "en": "If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \"required\" or \"error\" within the label
element of input items where the errors happened"
+ }
+ },
+ "formWithRequiredLabel": {
+ "callback": "formWithRequiredLabel",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "ARIA2"
+ ]
+ },
+ "1.4.1": {
+ "techniques": [
+ "F81"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "ARIA2",
+ "H90"
+ ]
+ },
+ "3.3.3": {
+ "techniques": [
+ "ARIA2"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Input items which are required are marked as so in the label element"
+ },
+ "description": {
+ "en": "If a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of \"required\" or the actual text \"required.\" The indicator that an item is required should be included in the input element's label
element."
+ }
+ },
+ "frameIsNotUsed": {
+ "selector": "frame",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Frames are not used"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "frameRelationshipsMustBeDescribed": {
+ "selector": "frameset:not(frameset[longdesc])",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Complex framesets should contain a \"longdesc\" attribute"
+ },
+ "description": {
+ "en": "If a frameset
contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames."
+ }
+ },
+ "frameSrcIsAccessible": {
+ "selector": "frame",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The source for each frame is accessible content."
+ },
+ "description": {
+ "en": "Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image."
+ }
+ },
+ "frameTitlesDescribeFunction": {
+ "attribute": "title",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "frame[title]",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 0,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "2.4.1": {
+ "techniques": [
+ "H64"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"frame\" elemetns should have a \"title\" attribute that describes the purpose of the frame"
+ },
+ "description": {
+ "en": "Each frame
elements should have a \"title\" attribute which describes the purpose or function of the frame."
+ }
+ },
+ "frameTitlesNotEmpty": {
+ "selector": "frame:not(frame[title]), frame[title=], iframe:not(iframe[title]), iframe[title=]",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.4.1": {
+ "techniques": [
+ "H64"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H64"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Frames cannot have empty \"title\" attributes"
+ },
+ "description": {
+ "en": "All frame
elements must have a valid \"title\" attribute."
+ }
+ },
+ "frameTitlesNotPlaceholder": {
+ "attribute": "title",
+ "components": [
+ "placeholder"
+ ],
+ "selector": "frame, iframe",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "2.4.1": {
+ "techniques": [
+ "H64"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H64"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Frames cannot have \"title\" attributes that are just placeholder text"
+ },
+ "description": {
+ "en": "Frame \"title\" attributes should not be simple placeholder text like \"frame"
+ }
+ },
+ "framesHaveATitle": {
+ "selector": "frame:not(frame[title]), iframe:not(iframe[title])",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.4.1": {
+ "techniques": [
+ "H64"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H64"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"frame\" elements should have a \"title\" attribute"
+ },
+ "description": {
+ "en": "Each frame
elements should have a \"title\" attribute."
+ }
+ },
+ "framesetIsNotUsed": {
+ "selector": "frameset",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The \"frameset\" element should not be used"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "framesetMustHaveNoFramesSection": {
+ "selector": "frameset:not(frameset:has(noframes))",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "All framesets should contain a noframes section"
+ },
+ "description": {
+ "en": "If a frameset
contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames."
+ }
+ },
+ "headerH1": {
+ "components": [
+ "header"
+ ],
+ "selector": "h1",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "header",
+ "guidelines": {
+ "wcag": {
+ "2.4.6": {
+ "techniques": [
+ "G130"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The header following an h1 is h1 or h2"
+ },
+ "description": {
+ "en": "The header following an h1
element should either be an h2
or another h1
. "
+ }
+ },
+ "headerH1Format": {
+ "components": [
+ "header"
+ ],
+ "selector": "h1",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "T3"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All h1 elements are not used for formatting"
+ },
+ "description": {
+ "en": "An h1
element may not be used purely for formatting."
+ }
+ },
+ "headerH2": {
+ "components": [
+ "header"
+ ],
+ "selector": "h2",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "header",
+ "guidelines": {
+ "wcag": {
+ "2.4.6": {
+ "techniques": [
+ "G130"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The header following an h2 is h1, h2 or h3"
+ },
+ "description": {
+ "en": "The header following an h2
element should either be an h3
, h1
or another h2
. "
+ }
+ },
+ "headerH2Format": {
+ "components": [
+ "header"
+ ],
+ "selector": "h2",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "T3"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All h2 elements are not used for formatting"
+ },
+ "description": {
+ "en": "An h2
element may not be used purely for formatting."
+ }
+ },
+ "headerH3": {
+ "components": [
+ "header"
+ ],
+ "selector": "h3",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "header",
+ "guidelines": {
+ "wcag": {
+ "2.4.6": {
+ "techniques": [
+ "G130"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The header following an h3 is h1, h2, h3 or h4"
+ },
+ "description": {
+ "en": "The header following an h3
element should either be an h4
, h2
, h1
or another h3
. "
+ }
+ },
+ "headerH3Format": {
+ "components": [
+ "header"
+ ],
+ "selector": "h3",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "T3"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All h3 elements are not used for formatting"
+ },
+ "description": {
+ "en": "An h3
element may not be used purely for formatting."
+ }
+ },
+ "headerH4": {
+ "components": [
+ "header"
+ ],
+ "selector": "h4",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "header",
+ "guidelines": {
+ "wcag": {
+ "2.4.6": {
+ "techniques": [
+ "G130"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The header following an h4 is h1, h2, h3, h4 or h5"
+ },
+ "description": {
+ "en": "The header following an h4
element should either be an h5
, h3
, h2
, h1
, or another h4
. "
+ }
+ },
+ "headerH4Format": {
+ "components": [
+ "header"
+ ],
+ "selector": "h4",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "T3"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All h4 elements are not used for formatting"
+ },
+ "description": {
+ "en": "An h4
element may not be used purely for formatting."
+ }
+ },
+ "headerH5": {
+ "components": [
+ "header"
+ ],
+ "selector": "h5",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "header",
+ "guidelines": {
+ "wcag": {
+ "2.4.6": {
+ "techniques": [
+ "G130"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The header following an h5 is h6 or any header less than h6"
+ },
+ "description": {
+ "en": "The header following an h5
element should either be an h6
, h3
, h2
, h1
, or another h5
. "
+ }
+ },
+ "headerH5Format": {
+ "selector": "h5",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "T3"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All h5 elements are not used for formatting"
+ },
+ "description": {
+ "en": "An h5
element may not be used purely for formatting."
+ }
+ },
+ "headerH6Format": {
+ "selector": "h6",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "T3"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All h6 elements are not used for formatting"
+ },
+ "description": {
+ "en": "An h6
element may not be used purely for formatting."
+ }
+ },
+ "headersHaveText": {
+ "components": [
+ "placeholder"
+ ],
+ "content": true,
+ "empty": true,
+ "selector": "h1, h2, h3, h4, h5, h6",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "G141"
+ ]
+ },
+ "2.4.10": {
+ "techniques": [
+ "G141"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All headers should contain readable text"
+ },
+ "description": {
+ "en": "Users with screen readers use headings like the tabs h1 to navigate the structure of a page. All headings should contain either text, or images with appropriate alt attributes."
+ }
+ },
+ "headersUseToMarkSections": {
+ "callback": "headersUseToMarkSections",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "G141"
+ ]
+ },
+ "2.4.10": {
+ "techniques": [
+ "G141"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Use headers to mark the beginning of each section"
+ },
+ "description": {
+ "en": "Check that each logical section of the page is broken or introduced with a header (
. h1-h6>) element."
+ }
+ },
+ "iIsNotUsed": {
+ "selector": "i",
+ "tags": [
+ "deprecated",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The \"i\" (italic) element is not used"
+ },
+ "description": {
+ "en": "The i
(italic) element provides no emphasis for non-sighted readers. Use the em
tag instead."
+ }
+ },
+ "iframeMustNotHaveLongdesc": {
+ "selector": "iframe[longdesc]",
+ "tags": [
+ "objects",
+ "iframe",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Inline frames (\"iframes\") should not have a \"longdesc\" attribute"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "imageMapServerSide": {
+ "selector": "img[ismap]",
+ "tags": [
+ "objects",
+ "iframe",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "All links in a server-side map should have duplicate links available in the document"
+ },
+ "description": {
+ "en": "Any image with an \"usemap\" attribute for a server-side image map should have the available links duplicated elsewhere."
+ }
+ },
+ "imgAltEmptyForDecorativeImages": {
+ "selector": "img[alt]",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.3": {
+ "techniques": [
+ "F26"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "If an image is purely decorative, the \"alt\" text must be empty"
+ },
+ "description": {
+ "en": "Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an \"alt\" attribute"
+ }
+ },
+ "imgAltIdentifiesLinkDestination": {
+ "selector": "a img[alt]:first",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Any image within a link must have \"alt\" text the describes the link destination"
+ },
+ "description": {
+ "en": "Any image that is within a link should have an \"alt\" attribute which identifies the destination or purpose of the link."
+ }
+ },
+ "imgAltIsDifferent": {
+ "callback": "imgAltIsDifferent",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H37"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Image \"alt\" attributes should not be the same as the filename"
+ },
+ "description": {
+ "en": "All img
elements should have an \"alt\" attribute that is not just the name of the file"
+ }
+ },
+ "imgAltIsSameInText": {
+ "selector": "img",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "G74",
+ "H37"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Check that any text within an image is also in the \"alt\" attribute"
+ },
+ "description": {
+ "en": "If an image has text within it, that text should be repeated in the \"alt\" attribute"
+ }
+ },
+ "imgAltIsTooLong": {
+ "callback": "imgAltIsTooLong",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H37"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Image Alt text is short"
+ },
+ "description": {
+ "en": "All \"alt\" attributes for img
elements should be clear and concise. \"Alt\" attributes over 100 characters long should be reviewed to see if they are too long."
+ }
+ },
+ "imgAltNotEmptyInAnchor": {
+ "callback": "imgAltNotEmptyInAnchor",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "2.4.4": {
+ "techniques": [
+ "H30"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "An image within a link cannot have an empty \"alt\" attribute if there is no other text within the link"
+ },
+ "description": {
+ "en": "Any image that is within a link (an a
element) that has no other text cannot have an empty or missing \"alt\" attribute."
+ }
+ },
+ "imgAltNotPlaceHolder": {
+ "attribute": "alt",
+ "components": [
+ "placeholder"
+ ],
+ "selector": "img",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "F30",
+ "F39"
+ ]
+ },
+ "1.2.1": {
+ "techniques": [
+ "F30"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Images should not have a simple placeholder text as an \"alt\" attribute"
+ },
+ "description": {
+ "en": "Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of placeholders."
+ }
+ },
+ "imgAltTextNotRedundant": {
+ "callback": "imgAltTextNotRedundant",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Unless the image files are the same, no image should contain redundant alt text"
+ },
+ "description": {
+ "en": "Every distinct image on a page should have it's own alt text which is different than all the others on the page to avoid redundancy and confusion."
+ }
+ },
+ "imgGifNoFlicker": {
+ "callback": "imgGifNoFlicker",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "j"
+ ],
+ "wcag": {
+ "2.2.2": {
+ "techniques": [
+ "G152"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Any animated GIF should not flicker"
+ },
+ "description": {
+ "en": "Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF using an online tool."
+ }
+ },
+ "imgHasAlt": {
+ "selector": "img:not(img[alt])",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "F65",
+ "H37"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Image elements must have an \"alt\" attribute"
+ },
+ "description": {
+ "en": "All img
elements must have an alt attribute"
+ }
+ },
+ "imgHasLongDesc": {
+ "callback": "imgHasLongDesc",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "2.4.4": {
+ "techniques": [
+ "G91"
+ ]
+ },
+ "2.4.9": {
+ "techniques": [
+ "G91"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "A \"longdesc\" attribute is required for any image where additional information not in the \"alt\" attribute is required"
+ },
+ "description": {
+ "en": "Any image that has an \"alt\" attribute that does not fully convey the meaning of the image must have a \"longdesc\" attribute."
+ }
+ },
+ "imgImportantNoSpacerAlt": {
+ "callback": "imgImportantNoSpacerAlt",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Images that are important should not have a purely white-space \"alt\" attribute"
+ },
+ "description": {
+ "en": "Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of white space (i.e. a space"
+ }
+ },
+ "imgMapAreasHaveDuplicateLink": {
+ "callback": "imgMapAreasHaveDuplicateLink",
+ "tags": [
+ "image",
+ "imagemap"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "ef",
+ "ef"
+ ]
+ },
+ "title": {
+ "en": "All links within a client-side image are duplicated elsewhere in the document"
+ },
+ "description": {
+ "en": "Any image that has a \"usemap\" attribute must have links replicated somewhere else in the document."
+ }
+ },
+ "imgNonDecorativeHasAlt": {
+ "callback": "imgNonDecorativeHasAlt",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "F38"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Any non-decorative images should have a non-empty \"alt\" attribute"
+ },
+ "description": {
+ "en": "Any image that is not used decorativey or which is purely for layout purposes cannot have an empty \"alt\" attribute."
+ }
+ },
+ "imgNotReferredToByColorAlone": {
+ "selector": "img",
+ "tags": [
+ "image",
+ "color",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "c"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "F13"
+ ]
+ },
+ "1.4.1": {
+ "techniques": [
+ "F13"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "For any image, the \"alt\" text cannot refer to color alone"
+ },
+ "description": {
+ "en": "The \"alt\" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the \"alt\" text to the meaning of the image"
+ }
+ },
+ "imgServerSideMapNotUsed": {
+ "selector": "img[ismap]",
+ "tags": [
+ "image",
+ "imagemap",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Server-side image maps should not be used"
+ },
+ "description": {
+ "en": "Server-side image maps should not be used."
+ }
+ },
+ "imgShouldNotHaveTitle": {
+ "selector": "img[title]",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Images should not have a \"title\" attribute"
+ },
+ "description": {
+ "en": "Images should not contain a \"title\" attribute."
+ }
+ },
+ "imgWithMapHasUseMap": {
+ "selector": "img[ismap]:not(img[usemap])",
+ "tags": [
+ "image",
+ "imagemap",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "ef",
+ "ef"
+ ]
+ },
+ "title": {
+ "en": "Any image with an \"ismap\" attribute have a valid \"usemap\" attribute"
+ },
+ "description": {
+ "en": "If an image has an \"ismap\" attribute"
+ }
+ },
+ "imgWithMathShouldHaveMathEquivalent": {
+ "callback": "imgWithMathShouldHaveMathEquivalent",
+ "tags": [
+ "image",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Images which contain math equations should provide equivalent MathML"
+ },
+ "description": {
+ "en": "Images which contain math equations should be accompanied or link to a document with the equivalent equation marked up with MathML."
+ }
+ },
+ "inputCheckboxHasTabIndex": {
+ "attribute": "tabindex",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=checkbox]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All \"checkbox\" input elements require a valid \"tabindex\" attribute"
+ },
+ "description": {
+ "en": "All input
elements of type \"checkbox\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."
+ }
+ },
+ "inputCheckboxRequiresFieldset": {
+ "callback": "inputCheckboxRequiresFieldset",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "3.3.2": {
+ "techniques": [
+ "H71"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Logical groups of check boxes should be grouped with a \"fieldset"
+ },
+ "description": {
+ "en": "Related \"checkbox\" input fields should be grouped together using a fieldset
."
+ }
+ },
+ "inputDoesNotUseColorAlone": {
+ "selector": "input:not(input[type=hidden])",
+ "tags": [
+ "form",
+ "color",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "c"
+ ]
+ },
+ "title": {
+ "en": "An \"input\" element should not use color alone"
+ },
+ "description": {
+ "en": "All input elements should not refer to content by color alone."
+ }
+ },
+ "inputElementsDontHaveAlt": {
+ "selector": "input[type!=image][alt]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Input elements which are not images should not have an \"alt\" attribute"
+ },
+ "description": {
+ "en": "Because of inconsistencies in how user agents use the \"alt\" attribute"
+ }
+ },
+ "inputFileHasTabIndex": {
+ "attribute": "tabindex",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=file]",
+ "tags": [
+ "form",
+ "tabindex"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All \"file\" input elements require a valid \"tabindex\" attribute"
+ },
+ "description": {
+ "en": "All input
elements of type \"file\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."
+ }
+ },
+ "inputImageAltIdentifiesPurpose": {
+ "selector": "input[type=image][alt]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H36"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute that describes the function of the input"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"image\" should have an \"alt\" attribute"
+ }
+ },
+ "inputImageAltIsNotFileName": {
+ "callback": "inputImageAltIsNotFileName",
+ "tags": [
+ "form",
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H36"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not the same as the filename"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"image\" should have an \"alt\" attribute"
+ }
+ },
+ "inputImageAltIsNotPlaceholder": {
+ "attribute": "alt",
+ "components": [
+ "placeholder"
+ ],
+ "selector": "input[type=image]",
+ "tags": [
+ "form",
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H36"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not placeholder text"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"image\" should have an \"alt\" attribute"
+ }
+ },
+ "inputImageAltIsShort": {
+ "callback": "inputImageAltIsShort",
+ "tags": [
+ "form",
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H36"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is as short as possible"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"image\" should have an \"alt\" attribute"
+ }
+ },
+ "inputImageAltNotRedundant": {
+ "callback": "inputImageAltNotRedundant",
+ "strings": "redundant.inputImage",
+ "tags": [
+ "form",
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H36"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The \"alt\" text for input \"image\" submit buttons must not be filler text"
+ },
+ "description": {
+ "en": "Every form image button should not simply use filler text like \"button\" or \"submit\" as the \"alt\" text."
+ }
+ },
+ "inputImageHasAlt": {
+ "selector": "input[type=image]:not(input[type=image][alt])",
+ "tags": [
+ "form",
+ "image",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "a"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "F65",
+ "G94",
+ "H36"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"input\" elements with a type of \"image\" must have an \"alt\" attribute"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"image\" should have an \"alt\" attribute."
+ }
+ },
+ "inputImageNotDecorative": {
+ "selector": "input[type=image]",
+ "tags": [
+ "form",
+ "image",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H36"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The \"alt\" text for input \"image\" buttons must be the same as text inside the image"
+ },
+ "description": {
+ "en": "Every form image button which has text within the image (say, a picture of the word \"Search\" in a special font)"
+ }
+ },
+ "inputPasswordHasTabIndex": {
+ "attribute": "tabindex",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=password]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All \"password\" input elements require a valid \"tabindex\" attribute"
+ },
+ "description": {
+ "en": "All input
elements of type \"password\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."
+ }
+ },
+ "inputRadioHasTabIndex": {
+ "attribute": "tabindex",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=radio]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All \"radio\" input elements require a valid \"tabindex\" attribute"
+ },
+ "description": {
+ "en": "All input
elements of type \"radio\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."
+ }
+ },
+ "inputSubmitHasTabIndex": {
+ "attribute": "tabindex",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=submit]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All input elements, type of \"submit\" have a valid tab index."
+ },
+ "description": {
+ "en": ""
+ }
+ },
+ "inputTextHasLabel": {
+ "selector": "input[type=text]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "label",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"input\" elements should have a corresponding \"label"
+ },
+ "description": {
+ "en": "All input
elements should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"
+ }
+ },
+ "inputTextHasTabIndex": {
+ "attribute": "tabindex",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=text]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All \"text\" input elements require a valid \"tabindex\" attribute"
+ },
+ "description": {
+ "en": "All input
elements of type \"text\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."
+ }
+ },
+ "inputTextHasValue": {
+ "attribute": "value",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=text]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All \"input\" elements of type \"text\" must have a default text"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"text\" should have a default text."
+ }
+ },
+ "inputTextValueNotEmpty": {
+ "attribute": "value",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "input[type=text]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "Text\" input elements require a non-whitespace default text"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"text\" should have a default text which is not empty."
+ }
+ },
+ "labelDoesNotContainInput": {
+ "selector": "label:has(input)",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Label elements should not contain an input element"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "labelMustBeUnique": {
+ "callback": "labelMustBeUnique",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F17"
+ ]
+ },
+ "4.1.1": {
+ "techniques": [
+ "F17"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Every form input must have only one label"
+ },
+ "description": {
+ "en": "Each form input should have only one label
element."
+ }
+ },
+ "labelMustNotBeEmpty": {
+ "components": [
+ "placeholder"
+ ],
+ "content": true,
+ "empty": true,
+ "selector": "label",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Labels must contain text"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "labelsAreAssignedToAnInput": {
+ "callback": "labelsAreAssignedToAnInput",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "All labels should be associated with an input"
+ },
+ "description": {
+ "en": "All label
elements should be assigned to an input item, and should have a for attribute which equals the id attribute of a form element."
+ }
+ },
+ "legendDescribesListOfChoices": {
+ "selector": "legend",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "2.4.6": {
+ "techniques": [
+ "G131"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"legend\" elements must describe the group of choices"
+ },
+ "description": {
+ "en": "If a legend
element is used in a fieldset, the legend
content must describe the group of choices."
+ }
+ },
+ "legendTextNotEmpty": {
+ "selector": "legend:empty",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H71"
+ ]
+ },
+ "2.4.6": {
+ "techniques": [
+ "G131"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H71"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Legend text must not contain just whitespace"
+ },
+ "description": {
+ "en": "If a legend
element is used in a fieldset, the legend
should not contain empty text."
+ }
+ },
+ "legendTextNotPlaceholder": {
+ "components": [
+ "placeholder"
+ ],
+ "content": true,
+ "emtpy": true,
+ "selector": "legend",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H71"
+ ]
+ },
+ "2.4.6": {
+ "techniques": [
+ "G131"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H71"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Legend\" text must not contain placeholder text like \"form\" or \"field"
+ },
+ "description": {
+ "en": "If a legend
element is used in a fieldset, the legend
should not contain useless placeholder text."
+ }
+ },
+ "liDontUseImageForBullet": {
+ "selector": "li:has(img)",
+ "tags": [
+ "list",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": []
+ },
+ "linkUsedForAlternateContent": {
+ "selector": "html:not(html:has(link[rel=alternate])) body",
+ "tags": [
+ "document"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Use a \"link\" element for alternate content"
+ },
+ "description": {
+ "en": "Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a link
element with a \"rel\" attribute of \"alternate\" in the document header."
+ }
+ },
+ "linkUsedToDescribeNavigation": {
+ "selector": "html:not(html:has(link[rel=index]))",
+ "tags": [
+ "document"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Document uses link element to describe navigation if it is within a collection."
+ },
+ "description": {
+ "en": "The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units."
+ }
+ },
+ "listNotUsedForFormatting": {
+ "callback": "listNotUsedForFormatting",
+ "tags": [
+ "list",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.2": {
+ "techniques": [
+ "F1"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Lists should not be used for formatting"
+ },
+ "description": {
+ "en": "Lists like ul
and ol
are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed."
+ }
+ },
+ "marqueeIsNotUsed": {
+ "selector": "marquee",
+ "tags": [
+ "deprecated",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "The \"marquee\" tag should not be used"
+ },
+ "description": {
+ "en": "The marquee
element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text."
+ }
+ },
+ "menuNotUsedToFormatText": {
+ "selector": "menu:not(menu li:parent(menu))",
+ "tags": [
+ "list",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Menu elements should not be used for formattin"
+ },
+ "description": {
+ "en": "Menu is a deprecated tag, but is still honored in a transitional DTD. Menu tags are to provide structure for a document and should not be used for formatting. If a menu tag is to be used, it should only contain an ordered or unordered list of links."
+ }
+ },
+ "noembedHasEquivalentContent": {
+ "selector": "noembed",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Noembed elements must be the same content as their \"embed\" element"
+ },
+ "description": {
+ "en": "All noembed
elements must contain or link to an accessible version of their embed
counterparts."
+ }
+ },
+ "noframesSectionMustHaveTextEquivalent": {
+ "selector": "frameset:not(frameset:has(noframes))",
+ "tags": [
+ "deprecated",
+ "frame"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "All \"noframes\" elements should contain the text content from all frames"
+ },
+ "description": {
+ "en": "The noframes
content should either replicate or link to the content visible within the frames."
+ }
+ },
+ "objectContentUsableWhenDisabled": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "When objects are disabled, content should still be available"
+ },
+ "description": {
+ "en": "The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the object
tag."
+ }
+ },
+ "objectDoesNotFlicker": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "j"
+ ],
+ "wcag": {
+ "2.2.2": {
+ "techniques": [
+ "F7"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Objects do not flicker"
+ },
+ "description": {
+ "en": "The content within an object
tag must not flicker."
+ }
+ },
+ "objectDoesNotUseColorAlone": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "c"
+ ]
+ },
+ "title": {
+ "en": "Objects must not use color to communicate alone"
+ },
+ "description": {
+ "en": "Objects should contain content that makes sense without color and is accessible to users who are color blind."
+ }
+ },
+ "objectInterfaceIsAccessible": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Interfaces within objects must be accessible"
+ },
+ "description": {
+ "en": "Object content should be assessed for accessibility."
+ }
+ },
+ "objectLinkToMultimediaHasTextTranscript": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Objects which reference multimedia files should also provide a link to a transcript"
+ },
+ "description": {
+ "en": "If an object contains a video, a link to the transcript should be provided near the object."
+ }
+ },
+ "objectMustContainText": {
+ "components": [
+ "placeholder"
+ ],
+ "content": true,
+ "empty": true,
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "FLASH1",
+ "H27"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Objects must contain their text equivalents"
+ },
+ "description": {
+ "en": "All object
elements should contain a text equivalent if the object cannot be rendered."
+ }
+ },
+ "objectMustHaveEmbed": {
+ "selector": "object:not(object:has(embed))",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Every object should contain an \"embed\" element"
+ },
+ "description": {
+ "en": "Every object
element must also contain an embed
element."
+ }
+ },
+ "objectMustHaveTitle": {
+ "selector": "object:not(object[title])",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H27"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Objects should have a title attribute"
+ },
+ "description": {
+ "en": "All object
elements should contain a \"title\" attribute."
+ }
+ },
+ "objectMustHaveValidTitle": {
+ "attribute": "title",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 1,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "Objects must not have an empty title attribute"
+ },
+ "description": {
+ "en": "All object
elements should have a \"title\" attribute which is not empty."
+ }
+ },
+ "objectProvidesMechanismToReturnToParent": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "All objects should provide a way for keyboard users to escape"
+ },
+ "description": {
+ "en": "Ensure that a user who has only a keyboard as an input device can escape a object
element. This requires manual confirmation."
+ }
+ },
+ "objectShouldHaveLongDescription": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "An object might require a long description"
+ },
+ "description": {
+ "en": "Objects might require a long description, especially if their content is complicated."
+ }
+ },
+ "objectTextUpdatesWhenObjectChanges": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "a"
+ ]
+ },
+ "title": {
+ "en": "The text equivalents of an object should update if the object changes"
+ },
+ "description": {
+ "en": "If an object changes, the text equivalent of that object should also change."
+ }
+ },
+ "objectUIMustBeAccessible": {
+ "selector": "object",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Content within an \"object\" element should be usable with objects disabled"
+ },
+ "description": {
+ "en": "Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes."
+ }
+ },
+ "objectWithClassIDHasNoText": {
+ "selector": "object[classid]:not(object[classid]:empty)",
+ "tags": [
+ "objects",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Objects with \"classid\" attributes should change their text if the content of the object changes"
+ },
+ "description": {
+ "en": "Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes."
+ }
+ },
+ "pNotUsedAsHeader": {
+ "callback": "pNotUsedAsHeader",
+ "tags": [
+ "header",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "G141",
+ "H42"
+ ]
+ },
+ "2.4.10": {
+ "techniques": [
+ "G141"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Paragraphs must not be used for headers"
+ },
+ "description": {
+ "en": "Headers like h1
. h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one."
+ }
+ },
+ "paragarphIsWrittenClearly": {
+ "callback": "paragarphIsWrittenClearly",
+ "components": [
+ "textStatistics"
+ ],
+ "tags": [
+ "language",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "3.1.5": {
+ "techniques": [
+ "G86"
+ ]
+ }
+ }
+ }
+ },
+ "passwordHasLabel": {
+ "components": [
+ "label"
+ ],
+ "selector": "input[type=password]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "label",
+ "guidelines": {
+ "508": [
+ "n"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All password input elements should have a corresponding label"
+ },
+ "description": {
+ "en": "All input
elements with a type of \"password\"should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"
+ }
+ },
+ "passwordLabelIsNearby": {
+ "components": [
+ "labelProximity"
+ ],
+ "selector": "input[type=password]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "labelProximity",
+ "guidelines": [],
+ "title": {
+ "en": "All \"password\" input elements have a label that is close"
+ },
+ "description": {
+ "en": "All input elements of type \"password\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."
+ }
+ },
+ "preShouldNotBeUsedForTabularLayout": {
+ "callback": "preShouldNotBeUsedForTabularLayout",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F33",
+ "F34",
+ "F48"
+ ]
+ },
+ "1.3.2": {
+ "techniques": [
+ "F33",
+ "F34"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Pre\" elements should not be used for tabular data"
+ },
+ "description": {
+ "en": "If a pre
element is used for tabular data, change the data to use a well-formed table."
+ }
+ },
+ "radioHasLabel": {
+ "components": [
+ "label"
+ ],
+ "selector": "input[type=radio]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "label",
+ "guidelines": {
+ "508": [
+ "n"
+ ],
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All \"radio\" input elements have a corresponding label"
+ },
+ "description": {
+ "en": "All input
elements of type \"radio\" should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"
+ }
+ },
+ "radioLabelIsNearby": {
+ "components": [
+ "labelProximity"
+ ],
+ "selector": "input[type=radio]",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "labelProximity",
+ "guidelines": [],
+ "title": {
+ "en": "All \"radio\" input elements have a label that is close"
+ },
+ "description": {
+ "en": "All input elements of type \"radio\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."
+ }
+ },
+ "radioMarkedWithFieldgroupAndLegend": {
+ "selector": "input[type=radio]:not(fieldset input[type=radio])",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H71"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H71"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All radio button groups are marked using fieldset and legend elements."
+ },
+ "description": {
+ "en": "form element content must contain both fieldset and legend elements if there are related radio buttons."
+ }
+ },
+ "scriptContentAccessibleWithScriptsTurnedOff": {
+ "selector": "script",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Content on the page should still be available if scripts are disabled"
+ },
+ "description": {
+ "en": "All scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available."
+ }
+ },
+ "scriptInBodyMustHaveNoscript": {
+ "selector": "html:not(html:has(noscript)):has(script) body",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "l"
+ ]
+ },
+ "title": {
+ "en": "Scripts should have a corresponding \"noscript\" element"
+ },
+ "description": {
+ "en": "Scripts should be followed by a noscripts
element to guide the user to content in an alternative way."
+ }
+ },
+ "scriptOnclickRequiresOnKeypress": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "correspondingEvent": "onkeypress",
+ "searchEvent": "onclick",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": {
+ "508": [
+ "l"
+ ],
+ "wcag": {
+ "2.1.1": {
+ "techniques": [
+ "G90",
+ "SCR2"
+ ]
+ },
+ "2.1.3": {
+ "techniques": [
+ "G90"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "If an element has an \"onclick\" attribute"
+ },
+ "description": {
+ "en": "it should also have an \"onkeypress\" attribute"
+ }
+ },
+ "scriptOndblclickRequiresOnKeypress": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "correspondingEvent": "onkeypress",
+ "searchEvent": "ondblclick",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": {
+ "508": [
+ "l"
+ ],
+ "wcag": {
+ "2.1.1": {
+ "techniques": [
+ "G90",
+ "SCR2"
+ ]
+ },
+ "2.1.3": {
+ "techniques": [
+ "G90"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Any element with an \"ondblclick\" attribute shoul have a keyboard-related action as well"
+ },
+ "description": {
+ "en": "If an element has an \"ondblclick\" attribute"
+ }
+ },
+ "scriptOnmousedownRequiresOnKeypress": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "correspondingEvent": "onkeydown",
+ "searchEvent": "onmousedown",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": {
+ "508": [
+ "l"
+ ],
+ "wcag": {
+ "2.1.1": {
+ "techniques": [
+ "G90",
+ "SCR2"
+ ]
+ },
+ "2.1.3": {
+ "techniques": [
+ "G90"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "If an element has a \"mousedown\" attribute"
+ },
+ "description": {
+ "en": "it should also have an \"onkeydown\" attribute"
+ }
+ },
+ "scriptOnmousemove": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "correspondingEvent": "onkeypress",
+ "searchEvent": "onmousemove",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": {
+ "508": [
+ "l"
+ ],
+ "wcag": {
+ "2.1.1": {
+ "techniques": [
+ "SCR2"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Any element with an \"onmousemove\" attribute shoul have a keyboard-related action as well"
+ },
+ "description": {
+ "en": "If an element has an \"onmousemove\" attribute"
+ }
+ },
+ "scriptOnmouseoutHasOnmouseblur": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "correspondingEvent": "onblur",
+ "searchEvent": "onmouseout",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": {
+ "508": [
+ "l"
+ ],
+ "wcag": {
+ "2.1.1": {
+ "techniques": [
+ "SCR2"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "If an element has a \"onmouseout\" attribute"
+ },
+ "description": {
+ "en": "it should also have an \"onblur\" attribute"
+ }
+ },
+ "scriptOnmouseoverHasOnfocus": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "correspondingEvent": "onfocus",
+ "searchEvent": "onmouseover",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": {
+ "508": [
+ "l"
+ ],
+ "wcag": {
+ "2.1.1": {
+ "techniques": [
+ "SCR2"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "If an element has an \"onmouseover\" attribute"
+ },
+ "description": {
+ "en": "it should also have an \"onfocus\" attribute"
+ }
+ },
+ "scriptOnmouseupHasOnkeyup": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "correspondingEvent": "onkeyup",
+ "searchEvent": "onmouseup",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": {
+ "508": [
+ "l"
+ ],
+ "wcag": {
+ "2.1.1": {
+ "techniques": [
+ "G90"
+ ]
+ },
+ "2.1.3": {
+ "techniques": [
+ "G90"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "If an element has an \"onmouseup\" attribute"
+ },
+ "description": {
+ "en": "it should also have an \"onkeyup\" attribute"
+ }
+ },
+ "scriptUIMustBeAccessible": {
+ "selector": "script",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "l"
+ ]
+ },
+ "title": {
+ "en": "The user interface for scripts should be accessible"
+ },
+ "description": {
+ "en": "All scripts should be assessed to see if their interface is accessible."
+ }
+ },
+ "scriptsDoNotFlicker": {
+ "selector": "script",
+ "tags": [
+ "javascript"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "j"
+ ],
+ "wcag": {
+ "2.2.2": {
+ "techniques": [
+ "F7"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Scripts should not cause the screen to flicker"
+ },
+ "description": {
+ "en": "All scripts should be assessed to see if their interface does not flicker."
+ }
+ },
+ "scriptsDoNotUseColorAlone": {
+ "selector": "script",
+ "tags": [
+ "javascript",
+ "color"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "c"
+ ]
+ },
+ "title": {
+ "en": "The interface in scripts should not use color alone"
+ },
+ "description": {
+ "en": "All scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone."
+ }
+ },
+ "selectDoesNotChangeContext": {
+ "components": [
+ "event",
+ "hasEventListener"
+ ],
+ "searchEvent": "onchange",
+ "selector": "select",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "event",
+ "guidelines": [],
+ "title": {
+ "en": "Select\" elemetns must not contain an \"onchange\" attribute"
+ },
+ "description": {
+ "en": "Actions like \"onchange\" can take control away from users who are trying to navigate the page. Using an \"onchange\" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action."
+ }
+ },
+ "selectHasAssociatedLabel": {
+ "components": [
+ "label"
+ ],
+ "selector": "select",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "label",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All select elements have an explicitly associated label."
+ },
+ "description": {
+ "en": "All select
elements should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"
+ }
+ },
+ "selectJumpMenu": {
+ "callback": "selectJumpMenu",
+ "components": [
+ "hasEventListener"
+ ],
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "3.2.2": {
+ "techniques": [
+ "F37"
+ ]
+ },
+ "3.2.5": {
+ "techniques": [
+ "F9"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Select jump menus should jump on button press, not on state change"
+ },
+ "description": {
+ "en": "If you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt."
+ }
+ },
+ "selectWithOptionsHasOptgroup": {
+ "selector": "select:not(select:has(optgroup)) option:nth-child(5)",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H85"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Form select elements should use optgroups for long selections"
+ },
+ "description": {
+ "en": ".. code-block:: html"
+ }
+ },
+ "siteMap": {
+ "callback": "siteMap",
+ "strings": "siteMap",
+ "tags": [
+ "document"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "2.4.5": {
+ "techniques": [
+ "G63"
+ ]
+ },
+ "2.4.8": {
+ "techniques": [
+ "G63"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Websites must have a site map"
+ },
+ "description": {
+ "en": "Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices."
+ }
+ },
+ "skipToContentLinkProvided": {
+ "selector": "body:not(body:has(a:first[href^=#]))",
+ "tags": [
+ "document"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "o"
+ ],
+ "wcag": {
+ "2.4.1": {
+ "techniques": [
+ "G1"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "A \"skip to content\" link should exist as one of the first links on the page"
+ },
+ "description": {
+ "en": "A link reading \"skip to content"
+ }
+ },
+ "svgContainsTitle": {
+ "selector": "svg:not(svg:has(title))",
+ "tags": [
+ "image",
+ "svg",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "F65"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Inline SVG should use Title elements"
+ },
+ "description": {
+ "en": "Any inline SVG image should have an embedded title
element"
+ }
+ },
+ "tabIndexFollowsLogicalOrder": {
+ "callback": "tabIndexFollowsLogicalOrder",
+ "tags": [
+ "document"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "2.4.3": {
+ "techniques": [
+ "H4"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "The tab order of a document is logical"
+ },
+ "description": {
+ "en": "Check that the tab-order of a page is logical."
+ }
+ },
+ "tableCaptionIdentifiesTable": {
+ "selector": "caption",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H39"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Captions should identify their table"
+ },
+ "description": {
+ "en": "Check to make sure that a table's caption identifies the table with a name, figure number, etc."
+ }
+ },
+ "tableComplexHasSummary": {
+ "selector": "table:not(table[summary], table:has(caption))",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H39"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Complex tables should have a summary"
+ },
+ "description": {
+ "en": "If a table is complex (for example, has some cells with \"colspan\" attributes"
+ }
+ },
+ "tableDataShouldHaveTh": {
+ "selector": "table:not(table:has(th))",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "g"
+ ],
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F91"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Data tables should contain \"th\" elements"
+ },
+ "description": {
+ "en": "Tables which contain data (as opposed to layout tables) should contain th
elements to mark headers for screen readers and enhance the structure of the document."
+ }
+ },
+ "tableHeaderLabelMustBeTerse": {
+ "callback": "tableHeaderLabelMustBeTerse",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Table header lables must be terse"
+ },
+ "description": {
+ "en": "The \"abbr\" attribute for table headers must be terse (less than 20 characters long)."
+ }
+ },
+ "tableIsGrouped": {
+ "selector": "table:not(table:has(thead), table:has(tfoot))",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Mark up the areas of tables using thead and tbody"
+ },
+ "description": {
+ "en": ""
+ }
+ },
+ "tableLayoutDataShouldNotHaveTh": {
+ "callback": "tableLayoutDataShouldNotHaveTh",
+ "tags": [
+ "table",
+ "layout",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F46"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Layout tables should not contain \"th\" elements"
+ },
+ "description": {
+ "en": "Tables which are used purely for layout (as opposed to data tables), should not contain th
elements, which would make the table appear to be a data table."
+ }
+ },
+ "tableLayoutHasNoCaption": {
+ "callback": "tableLayoutHasNoCaption",
+ "tags": [
+ "table",
+ "layout",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F46"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All tables used for layout have no \"caption\" element"
+ },
+ "description": {
+ "en": "If a table contains no data, and is used simply for layout, then it should not contain a caption
element."
+ }
+ },
+ "tableLayoutHasNoSummary": {
+ "callback": "tableLayoutHasNoSummary",
+ "tags": [
+ "table",
+ "layout",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F46"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All tables used for layout have no summary or an empty summary"
+ },
+ "description": {
+ "en": "If a table contains no data, and is used simply for layout, then it should not have a \"summary\" attribute"
+ }
+ },
+ "tableLayoutMakesSenseLinearized": {
+ "callback": "tableLayoutMakesSenseLinearized",
+ "tags": [
+ "table",
+ "layout",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "All tables used for layout should make sense when removed"
+ },
+ "description": {
+ "en": "If a table
element is used for layout purposes only, then the content of the table should make sense if the table is linearized."
+ }
+ },
+ "tableNotUsedForLayout": {
+ "callback": "tableNotUsedForLayout",
+ "tags": [
+ "table",
+ "layout"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.2": {
+ "techniques": [
+ "F49"
+ ]
+ }
+ }
+ }
+ },
+ "tableSummaryDescribesTable": {
+ "selector": "table[summary]",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "Table summaries should describe the navigation and structure of the table"
+ },
+ "description": {
+ "en": "Table summary
elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes."
+ }
+ },
+ "tableSummaryDoesNotDuplicateCaption": {
+ "callback": "tableSummaryDoesNotDuplicateCaption",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Table \"summary\" elements should not duplicate the \"caption\" element"
+ },
+ "description": {
+ "en": "The summary and the caption must be different, as both provide different information. A caption
. /code element identifies the table., while the \"summary\" attribute describes the table contents."
+ }
+ },
+ "tableSummaryIsEmpty": {
+ "attribute": "summary",
+ "components": [
+ "placeholder"
+ ],
+ "empty": true,
+ "selector": "table[summary]",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "placeholder",
+ "guidelines": [],
+ "title": {
+ "en": "All data tables should have a summary"
+ },
+ "description": {
+ "en": "If a table contains data, it should have a \"summary\" attribute."
+ }
+ },
+ "tableSummaryIsNotTooLong": {
+ "callback": "tableSummaryIsNotTooLong",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": []
+ },
+ "tableSummaryIsSufficient": {
+ "selector": "table[summary]",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0,
+ "type": "selector",
+ "guidelines": [],
+ "title": {
+ "en": "All data tables should have an adequate summary"
+ },
+ "description": {
+ "en": "If a table contains data, it should have a \"summary\" attribute that completely communicates the function and use of the table."
+ }
+ },
+ "tableUseColGroup": {
+ "callback": "tableUseColGroup",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Group columns using \"colgroup\" or \"col\" elements"
+ },
+ "description": {
+ "en": "To help complex table headers make sense, use colgroup
or col
to group them together."
+ }
+ },
+ "tableUsesAbbreviationForHeader": {
+ "callback": "tableUsesAbbreviationForHeader",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Table headers over 20 characters should provide an \"abbr\" attribute"
+ },
+ "description": {
+ "en": "For long table headers, use an \"abbr\" attribute that is less than short (less than 20 characters long)."
+ }
+ },
+ "tableUsesCaption": {
+ "selector": "table:not(table:has(caption))",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 1,
+ "type": "selector",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H39"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Data tables should contain a \"caption\" element if not described elsewhere"
+ },
+ "description": {
+ "en": "Unless otherwise described in the document, tables should contain caption
elements to describe the purpose of the table."
+ }
+ },
+ "tableUsesScopeForRow": {
+ "callback": "tableUsesScopeForRow",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "H63"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Data tables should use scoped headers for rows with headers"
+ },
+ "description": {
+ "en": "Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight."
+ }
+ },
+ "tableWithBothHeadersUseScope": {
+ "selector": "table:has(tr:not(table tr:first) th:not(th[scope]))",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "h"
+ ],
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F91"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "Data tables with multiple headers should use the \"scope\" attribute"
+ },
+ "description": {
+ "en": "Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells."
+ }
+ },
+ "tableWithMoreHeadersUseID": {
+ "callback": "tableWithMoreHeadersUseID",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "Complex data tables should provide \"id\" attributes to headers"
+ },
+ "description": {
+ "en": "and \"headers\" attributes for data cells"
+ }
+ },
+ "tabularDataIsInTable": {
+ "callback": "tabularDataIsInTable",
+ "tags": [
+ "table",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.3.1": {
+ "techniques": [
+ "F33",
+ "F34",
+ "F48"
+ ]
+ },
+ "1.3.2": {
+ "techniques": [
+ "F33",
+ "F34"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All tabular information should use a table"
+ },
+ "description": {
+ "en": "Tables should be used when displaying tabular information."
+ }
+ },
+ "textIsNotSmall": {
+ "callback": "textIsNotSmall",
+ "components": [
+ "convertToPx"
+ ],
+ "tags": [
+ "textsize",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "custom",
+ "guidelines": [],
+ "title": {
+ "en": "The text size is not less than 9 pixels high"
+ },
+ "description": {
+ "en": "To help users with difficulty reading small text, ensure text size is no less than 9 pixels high."
+ }
+ },
+ "textareaHasAssociatedLabel": {
+ "components": [
+ "label"
+ ],
+ "selector": "textarea",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 1,
+ "type": "label",
+ "guidelines": {
+ "wcag": {
+ "1.1.1": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "1.3.1": {
+ "techniques": [
+ "H44",
+ "F68"
+ ]
+ },
+ "3.3.2": {
+ "techniques": [
+ "H44"
+ ]
+ },
+ "4.1.2": {
+ "techniques": [
+ "H44"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All textareas should have a corresponding label"
+ },
+ "description": {
+ "en": "All textarea
elements should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"
+ }
+ },
+ "textareaLabelPositionedClose": {
+ "components": [
+ "labelProximity"
+ ],
+ "selector": "textarea",
+ "tags": [
+ "form",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "labelProximity",
+ "guidelines": [],
+ "title": {
+ "en": "All textareas should have a label that is close to it"
+ },
+ "description": {
+ "en": "All textarea
elements should have a corresponding label
element that is close in proximity.."
+ }
+ },
+ "videoProvidesCaptions": {
+ "selector": "video",
+ "tags": [
+ "media",
+ "content"
+ ],
+ "testability": 0.5,
+ "type": "selector",
+ "guidelines": {
+ "508": [
+ "b",
+ "b"
+ ],
+ "wcag": {
+ "1.2.2": {
+ "techniques": [
+ "G87"
+ ]
+ },
+ "1.2.4": {
+ "techniques": [
+ "G87"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All video tags must provide captions"
+ },
+ "description": {
+ "en": "All HTML5 video tags must provide captions."
+ }
+ },
+ "videosEmbeddedOrLinkedNeedCaptions": {
+ "callback": "videosEmbeddedOrLinkedNeedCaptions",
+ "components": [
+ "video"
+ ],
+ "tags": [
+ "media",
+ "content"
+ ],
+ "testability": 1,
+ "type": "custom",
+ "guidelines": {
+ "wcag": {
+ "1.2.2": {
+ "techniques": [
+ "G87"
+ ]
+ },
+ "1.2.4": {
+ "techniques": [
+ "G87"
+ ]
+ }
+ }
+ },
+ "title": {
+ "en": "All linked or embedded videos need captions"
+ },
+ "description": {
+ "en": "Any video hosted or otherwise which is linked or embedded must have a caption."
+ }
+ }
+}
\ No newline at end of file
diff --git a/dist/tests.min.json b/dist/tests.min.json
new file mode 100644
index 000000000..7fe28e303
--- /dev/null
+++ b/dist/tests.min.json
@@ -0,0 +1 @@
+{"aAdjacentWithSameResourceShouldBeCombined":{"callback":"aAdjacentWithSameResourceShouldBeCombined","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"2.4.4":{"techniques":["H2"]}}},"title":{"en":"Adjacent links that point to the same location should be merged"},"description":{"en":"Because many users of screen-readers use links to navigate the page, providing two links right next to eachother that points to the same location can be confusing. Try combining the links."}},"aImgAltNotRepetative":{"callback":"aImgAltNotRepetative","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H30"]},"2.4.4":{"techniques":["H30"]},"2.4.9":{"techniques":["H30"]}}},"title":{"en":"When an image is in a link, its \"alt\" attribute should not repeat other text in the link"},"description":{"en":"Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice."}},"aLinkTextDoesNotBeginWithRedundantWord":{"callback":"aLinkTextDoesNotBeginWithRedundantWord","strings":"redundant.link","tags":["link","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"2.4.9":{"techniques":["F84"]}}},"title":{"en":"Link text should not begin with redundant text"},"description":{"en":"Link text should not begin with redundant words or phrases like \"link\""}},"aLinksAreSeperatedByPrintableCharacters":{"callback":"aLinksAreSeperatedByPrintableCharacters","tags":["link","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"Lists of links should be seperated by printable characters"},"description":{"en":"If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this."}},"aLinksDontOpenNewWindow":{"selector":"a[target=_new], a[target=_blank], a[target=_blank]","tags":["link","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"3.2.5":{"techniques":["H83"]}}},"title":{"en":"Links should not open a new window without warning"},"description":{"en":"Links which open a new window using the \"target\" attribute should warn users."}},"aLinksNotSeparatedBySymbols":{"callback":"aLinksNotSeparatedBySymbols","tags":["link","content"],"testability":1,"type":"custom","guidelines":[]},"aLinksToMultiMediaRequireTranscript":{"selector":"a[href$='.wmv'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']","tags":["link","media","content"],"testability":0,"type":"selector","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"Any links to a multimedia file should also include a link to a transcript"},"description":{"en":"Links to a multimedia file should be followed by a link to a transcript of the file."}},"aLinksToSoundFilesNeedTranscripts":{"selector":"a[href$='.wav'], a[href$='.snd'], a[href$='.mp3'], a[href$='.iff'], a[href$='.svx'], a[href$='.sam'], a[href$='.smp'], a[href$='.vce'], a[href$='.vox'], a[href$='.pcm'], a[href$='.aif']","tags":["link","media","content"],"testability":0,"type":"selector","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"Any links to a sound file should also include a link to a transcript"},"description":{"en":"Links to a sound file should be followed by a link to a transcript of the file."}},"aMultimediaTextAlternative":{"selector":"a[href$='.wmv'], a[href$='.wav'], a[href$='.mpg'], a[href$='.mov'], a[href$='.ram'], a[href$='.aif']","tags":["link","media","content"],"testability":0,"type":"selector","guidelines":[]},"aMustContainText":{"callback":"aMustContainText","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H30"]},"2.4.4":{"techniques":["H30"]},"2.4.9":{"techniques":["H30"]}}},"title":{"en":"Links should contain text"},"description":{"en":"Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \"alt\" attributes and no other readable text) hinders these users."}},"aMustHaveTitle":{"selector":"a:not(a[title])","tags":["link","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"All links must have a \"title\" attribute"},"description":{"en":"Every link must have a \"title\" attribute."}},"aMustNotHaveJavascriptHref":{"selector":"a[href^='javascript:']","tags":["link","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Links should not use \"javascript\" in their location"},"description":{"en":"Anchor (a
. elements may not use the \"javascript\" protocol in their \"href\" attributes."}},"aSuspiciousLinkText":{"callback":"aSuspiciousLinkText","strings":"suspiciousLinks","tags":["link","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H30"]},"2.4.4":{"techniques":["H30"]},"2.4.9":{"techniques":["H30"]}}},"title":{"en":"Link text should be useful"},"description":{"en":"Because many users of screen-readers use links to navigate the page, providing links with text that simply read \"click here\" gives no hint of the function of the link"}},"aTitleDescribesDestination":{"selector":"a[title]","tags":["link","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.4.9":{"techniques":["H33","H25"]}}},"title":{"en":"The title attribute of all source a (anchor) elements describes the link destination."},"description":{"en":"Every link must have a \"title\" attribute which describes the purpose or destination of the link."}},"addressForAuthor":{"selector":"body:not(body:has(address))","tags":["document"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The document should contain an address for the author"},"description":{"en":"Documents should provide a valid email address within an address
element."}},"addressForAuthorMustBeValid":{"selector":"address","tags":["document"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"The document should contain a valid email address for the author"},"description":{"en":"Documents should provide a valid email address within an address
element."}},"appletContainsTextEquivalent":{"callback":"appletContainsTextEquivalent","tags":["objects","applet","content"],"testability":1,"type":"custom","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}},"title":{"en":"All applets should contain the same content within the body of the applet"},"description":{"en":"Applets should contain their text equivalents or description within the applet
tag itself."}},"appletContainsTextEquivalentInAlt":{"attribute":"alt","components":["placeholder"],"empty":true,"selector":"applet","tags":["objects","applet","content"],"testability":0.5,"type":"placeholder","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}},"title":{"en":"All applets should contain a text equivalent in the \"alt\" attribute"},"description":{"en":"Applets should contain their text equivalents or description in an \"alt\" attribute."}},"appletProvidesMechanismToReturnToParent":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"All applets should provide a way for keyboard users to escape"},"description":{"en":"Ensure that a user who has only a keyboard as an input device can escape an applet
element. This requires manual confirmation."}},"appletTextEquivalentsGetUpdated":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}}},"appletUIMustBeAccessible":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["m"],"wcag":{"1.1.1":{"techniques":["G74","H35"]}}},"title":{"en":"Any user interface in an applet must be accessible"},"description":{"en":"Applet content should be assessed for accessibility."}},"appletsDoNotFlicker":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["F7"]}}},"title":{"en":"All applets do not flicker"},"description":{"en":"Applets should not flicker."}},"appletsDoneUseColorAlone":{"selector":"applet","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"Applets should not use color alone to communicate content"},"description":{"en":"Applets should contain content that makes sense without color and is accessible to users who are color blind."}},"areaAltIdentifiesDestination":{"selector":"area[alt]","tags":["objects","applet","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"All \"area\" elements must have an \"alt\" attribute which describes the link destination"},"description":{"en":"All area
elements within a map
must have an \"alt\" attribute"}},"areaAltRefersToText":{"selector":"area","tags":["imagemap","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Alt text for \"area\" elements should replicate the text found in the image"},"description":{"en":"If an image is being used as a map, and an area
encompasses text within the image, then the \"alt\" attribute of that area
element should be the same as the text found in the image."}},"areaDontOpenNewWindow":{"selector":"area[target='new window'], area[target=_new], area[target=_blank], area[target=_blank]","tags":["imagemap","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"No \"area\" elements should open a new window without warning"},"description":{"en":"No area
elements should open a new window without warning."}},"areaHasAltValue":{"selector":"area:not(area[alt])","tags":["imagemap","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["F65","G74","H24"]},"1.4.3":{"techniques":["G145"]}}},"title":{"en":"All \"area\" elements must have an \"alt\" attribute"},"description":{"en":"All area
elements within a map
must have an \"alt\" attribute."}},"areaLinksToSoundFile":{"selector":"area[href$=wav], area[href$=snd], area[href$=mp3], area[href$=iff], area[href$=svx], area[href$=sam], area[href$=smp], area[href$=vce], area[href$=vox], area[href$=pcm], area[href$=aif]","tags":["imagemap","media","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["G74"]}}},"title":{"en":"All \"area\" elements which link to a sound file should also provide a link to a transcript"},"description":{"en":"All area
elements which link to a sound file should have a text transcript"}},"ariaOrphanedContent":{"selector":"body *:not(*[role] *, *[role], script, meta, link)","tags":["aria","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Pages using ARIA roles should not have orphaned content"},"description":{"en":"If a page makes use of ARIA roles, then there should not be any content on the page which is not within an element that exposes a role, as it could cause that content to be rendreed inaccessible to users with screen readers."}},"basefontIsNotUsed":{"selector":"basefont","tags":["document","deprecated"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Basefont should not be used"},"description":{"en":"The basefont
tag is deprecated and should not be used. Investigate using stylesheets instead."}},"blinkIsNotUsed":{"selector":"blink","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.2.2":{"techniques":["F47"]}}},"title":{"en":"The \"blink\" tag should not be used"},"description":{"en":"The blink
tag should not be used. Ever."}},"blockquoteNotUsedForIndentation":{"selector":"blockquote:not(blockquote[cite])","tags":["blockquote","content"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H49"]}}},"title":{"en":"The \"blockquote\" tag should not be used just for indentation"},"description":{"en":".. code-block:: html"}},"blockquoteUseForQuotations":{"callback":"blockquoteUseForQuotations","tags":["blockquote","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["H49"]}}},"title":{"en":"If long quotes are in the document, use the \"blockquote\" element to mark them"},"description":{"en":".. code-block:: html"}},"bodyActiveLinkColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"alink","components":["color"],"selector":"a:active","tags":["document","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between active link text and background should be 5:1"},"description":{"en":"The contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"bodyColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"text","components":["color"],"selector":"body","tags":["document","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between text and background should be 5:1"},"description":{"en":"The contrast ratio of text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"bodyLinkColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"link","components":["color"],"selector":"a","tags":["document","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between link text and background should be 5:1"},"description":{"en":"The contrast ratio of link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"bodyMustNotHaveBackground":{"selector":"body[background]","tags":["document","color"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Body elements do not use a background image"},"description":{"en":"The body
element for the page may not have a \"background\" attribute."}},"bodyVisitedLinkColorContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"vlink","components":["color"],"selector":"a:visited","tags":["link","color"],"testability":1,"type":"color","guidelines":[],"title":{"en":"Contrast between visited link text and background should be 5:1"},"description":{"en":"The contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. Learn more about color contrast and how to measure it."}},"boldIsNotUsed":{"selector":"bold","tags":["semantics","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"b\" (bold) element is not used"},"description":{"en":"The b
(bold) element provides no emphasis for non-sighted readers. Use the strong
tag instead."}},"checkboxHasLabel":{"components":["label"],"selector":"input[type=checkbox]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All checkboxes must have a corresponding label"},"description":{"en":"All input
elements with a type of \"checkbox\" should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"checkboxLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=checkbox]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"checkbox\" input elements have a label that is close"},"description":{"en":"All input elements of type \"checkbox\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"cssDocumentMakesSenseStyleTurnedOff":{"selector":"link[rel=stylesheet], stylesheet, *[style]","tags":["color"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["G140"]},"1.4.5":{"techniques":["G140"]},"1.4.9":{"techniques":["G140"]}}},"title":{"en":"The document must be readable with styles turned off"},"description":{"en":"With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear."}},"cssTextHasContrast":{"algorithm":"wcag","bodyBackgroundAttribute":"color","bodyForegroundAttribute":"background","components":["color"],"selector":"*","tags":["color"],"testability":1,"type":"color","guidelines":{"wcag":{"1.4.3":{"techniques":["G18"]}}},"title":{"en":"All elements should have appropriate color contrast"},"description":{"en":"For users who have color blindness, all text or other elements should have a color contrast of 5:1."}},"doctypeProvided":{"callback":"doctypeProvided","tags":["doctype"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"The document should contain a valid \"doctype\" declaration"},"description":{"en":"Each document must contain a valid doctype declaration.."}},"documentAbbrIsUsed":{"callback":"documentAbbrIsUsed","components":["acronym"],"tags":["acronym","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.4":{"techniques":["H28"]}}},"title":{"en":"Abbreviations must be marked with an \"abbr\" element"},"description":{"en":"Abbreviations should be marked with an abbr
element, at least once on the page for each abbreviation."}},"documentAcronymsHaveElement":{"callback":"documentAcronymsHaveElement","components":["acronym"],"tags":["acronym","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.4":{"techniques":["H28"]}}},"title":{"en":"Acronyms must be marked with an \"acronym\" element"},"description":{"en":"Abbreviations should be marked with an acronym
element, at least once on the page for each abbreviation."}},"documentAllColorsAreSet":{"selector":"body:not(body[text][bgcolor][link][alink][vlink], body:not(body[text], body[bgcolor], body[link], body[alink], body[vlink]))","tags":["deprecated","color"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"All the document colors must be set"},"description":{"en":"If any colors for text or the background are set in the body
element, then all colors must be set."}},"documentAutoRedirectNotUsed":{"selector":"meta[http-equiv=refresh]","tags":["document"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Auto-redirect with \"meta\" elements must not be used"},"description":{"en":"Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed"}},"documentColorWaiActiveLinkAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"alink","components":["color"],"selector":"a:active","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentColorWaiAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"text","components":["color"],"selector":"body","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentColorWaiLinkAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"link","components":["color"],"selector":"a","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentColorWaiVisitedLinkAlgorithm":{"algorithm":"wai","bodyBackgroundAttribute":"bgcolor","bodyForegroundAttribute":"vlink","components":["color"],"selector":"a:visited","tags":["document","color"],"testability":1,"type":"color","guidelines":[]},"documentContentReadableWithoutStylesheets":{"selector":"html:has(link[rel=stylesheet], style) body, body:has(*[style])","tags":["document","color"],"testability":0,"type":"selector","guidelines":{"508":["d"],"wcag":{"1.3.1":{"techniques":["G140"]},"1.4.5":{"techniques":["G140"]},"1.4.9":{"techniques":["G140"]}}},"title":{"en":"Content should be readable without style sheets"},"description":{"en":"With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear."}},"documentHasTitleElement":{"selector":"html:not(html:has(title))","tags":["document","head"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.4.2":{"techniques":["H25"]}}},"title":{"en":"The document should have a title element"},"description":{"en":"The document should have a title element."}},"documentIDsMustBeUnique":{"callback":"documentIDsMustBeUnique","tags":["document","semantics"],"testability":1,"type":"custom","guidelines":{"wcag":{"4.1.1":{"techniques":["F77"]}}},"title":{"en":"All element \"id\" attributes must be unique"},"description":{"en":"Element \"id\" attributes must be unique."}},"documentIsWrittenClearly":{"callback":"documentIsWrittenClearly","components":["textStatistics"],"tags":["language","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.5":{"techniques":["G86"]}}},"title":{"en":"The document should be written to the target audience and read clearly"},"description":{"en":"If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content."}},"documentLangIsISO639Standard":{"callback":"documentLangIsISO639Standard","strings":"languageCodes","tags":["document","language"],"testability":1,"type":"custom","guidelines":{"wcag":{"3.1.1":{"techniques":["H57"]}}},"title":{"en":"The document's language attribute should be a standard code"},"description":{"en":"The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639."}},"documentLangNotIdentified":{"selector":"html:not(html[lang])","tags":["document","language"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The document must have a \"lang\" attribute"},"description":{"en":"The document should have a default langauge, by setting the \"lang\" attribute in the html
element."}},"documentMetaNotUsedWithTimeout":{"selector":"meta[http-equiv=refresh]","tags":["document"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.2.1":{"techniques":["F40","F41"]},"2.2.4":{"techniques":["F40","F41"]},"3.2.5":{"techniques":["F41"]}}},"title":{"en":"Meta elements must not be used to refresh the content of a page"},"description":{"en":"Because different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \"refresh this\" link instead.."}},"documentReadingDirection":{"selector":"*[lang=he]:not(*[dir=rtl]), *[lang=ar]:not(*[dir=rtl])","tags":["document","language"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.2":{"techniques":["H34"]}}},"title":{"en":"Reading direction of text is correctly marked"},"description":{"en":"Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared."}},"documentStrictDocType":{"callback":"documentStrictDocType","tags":["document","doctype"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"The page uses a strict doctype"},"description":{"en":"The doctype of the page or document should be either an HTML or XHTML strict doctype."}},"documentTitleDescribesDocument":{"selector":"head title:first","tags":["document","head"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.4.2":{"techniques":["F25","G88"]}}},"title":{"en":"The title describes the document"},"description":{"en":"The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another."}},"documentTitleIsNotPlaceholder":{"components":["placeholder"],"content":true,"selector":"head title:first","tags":["document","head"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"2.4.2":{"techniques":["F25","G88"]}}},"title":{"en":"The document title should not be placeholder text"},"description":{"en":"The document title should not be wasted placeholder text which does not describe the page."}},"documentTitleIsShort":{"callback":"documentTitleIsShort","tags":["document","head"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"The document title should be short"},"description":{"en":"The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion."}},"documentTitleNotEmpty":{"components":["placeholder"],"content":true,"empty":true,"selector":"head title","tags":["document","head"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"2.4.2":{"techniques":["F25","H25"]}}},"title":{"en":"The document should not have an empty title"},"description":{"en":"The document should have a title element that is not white space"}},"documentValidatesToDocType":{"callback":"documentValidatesToDocType","tags":["document","doctype"],"testability":1,"type":"custom","guidelines":{"wcag":{"4.1.1":{"techniques":["G134"]}}},"title":{"en":"Document must validate to the doctype"},"description":{"en":"The document must validate to the declared doctype."}},"documentVisualListsAreMarkedUp":{"callback":"documentVisualListsAreMarkedUp","tags":["list","semantics","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["H28","T2"]}}},"title":{"en":"Visual lists of items are marked using ordered or unordered lists"},"description":{"en":"Use the ordered (ol
. or unordered (ul
. elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list."}},"documentWordsNotInLanguageAreMarked":{"selector":"body","tags":["language"],"testability":0,"type":"selector","guidelines":{"wcag":{"3.1.2":{"techniques":["H58"]}}},"title":{"en":"Any words or phrases which are not the document's primary language should be marked"},"description":{"en":"If a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text."}},"embedHasAssociatedNoEmbed":{"callback":"embedHasAssociatedNoEmbed","tags":["object","embed","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H46"]}}},"title":{"en":"All \"embed\" elements have an associated \"noembed\" element"},"description":{"en":"Because some users cannot use the embed
element, provide alternative content in a noembed
element."}},"embedMustHaveAltAttribute":{"selector":"embed:not(embed[alt])","tags":["object","embed","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Embed\" elements must have an \"alt\" attribute"},"description":{"en":"All embed
elements must have an \"alt\" attribute."}},"embedMustNotHaveEmptyAlt":{"selector":"embed[alt=]","tags":["object","embed","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Embed\" elements cannot have an empty \"alt\" attribute"},"description":{"en":"All embed
elements must have an \"alt\" attribute that is not empty."}},"embedProvidesMechanismToReturnToParent":{"selector":"embed","tags":["object","embed","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.1.2":{"techniques":["G21"]}}},"title":{"en":"All embed elements should provide a way for keyboard users to escape"},"description":{"en":"Ensure that a user who has only a keyboard as an input device can escape an embed
element. This requires manual confirmation."}},"emoticonsExcessiveUse":{"callback":"emoticonsExcessiveUse","strings":"emoticons","tags":["language","emoticons","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H86"]}}},"title":{"en":"Emoticons should not be used excessively"},"description":{"en":"Emoticons should not be used excessively to communicate feelings or content. Try to rewrite the document to have more textual meaning, or wrapping the emoticons in an abbr
element as outlined below. Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document."}},"emoticonsMissingAbbr":{"callback":"emoticonsMissingAbbr","strings":"emoticons","tags":["language","emoticons","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H86"]}}},"title":{"en":"Emoticons should have abbreviations"},"description":{"en":"Emoticons are not read by screen-readers, and are often used to communicate feelings or other things which are relevant to the content of the document. If this emoticon is important content, mark it up with an \"abbr\" or \"acronym\" tag."}},"fileHasLabel":{"components":["label"],"selector":"input[type=file]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["n"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All \"file\" input elements have a corresponding label"},"description":{"en":"All input
elements of type \"file\" should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"fileLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=file]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"file\" input elements have a label that is close"},"description":{"en":"All input elements of type \"file\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"fontIsNotUsed":{"selector":"font","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Font elements should not be used"},"description":{"en":"The basefont
tag is deprecated and should not be used. Investigate using stylesheets instead."}},"formAllowsCheckIfIrreversable":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[]},"formDeleteIsReversable":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Deleting items using a form should be reversable"},"description":{"en":"Check that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation."}},"formErrorMessageHelpsUser":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Forms offer the user a way to check the results of their form before performing an irrevokable action"},"description":{"en":"If the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation."}},"formHasGoodErrorMessage":{"selector":"form","tags":["form","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Form error messages should assist in solving errors"},"description":{"en":"If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \"required\" or \"error\" within the label
element of input items where the errors happened"}},"formWithRequiredLabel":{"callback":"formWithRequiredLabel","tags":["form","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["ARIA2"]},"1.4.1":{"techniques":["F81"]},"3.3.2":{"techniques":["ARIA2","H90"]},"3.3.3":{"techniques":["ARIA2"]}}},"title":{"en":"Input items which are required are marked as so in the label element"},"description":{"en":"If a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of \"required\" or the actual text \"required.\" The indicator that an item is required should be included in the input element's label
element."}},"frameIsNotUsed":{"selector":"frame","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Frames are not used"},"description":{"en":".. code-block:: html"}},"frameRelationshipsMustBeDescribed":{"selector":"frameset:not(frameset[longdesc])","tags":["deprecated","frame"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"Complex framesets should contain a \"longdesc\" attribute"},"description":{"en":"If a frameset
contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames."}},"frameSrcIsAccessible":{"selector":"frame","tags":["deprecated","frame"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"The source for each frame is accessible content."},"description":{"en":"Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image."}},"frameTitlesDescribeFunction":{"attribute":"title","components":["placeholder"],"empty":true,"selector":"frame[title]","tags":["deprecated","frame"],"testability":0,"type":"placeholder","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]}}},"title":{"en":"All \"frame\" elemetns should have a \"title\" attribute that describes the purpose of the frame"},"description":{"en":"Each frame
elements should have a \"title\" attribute which describes the purpose or function of the frame."}},"frameTitlesNotEmpty":{"selector":"frame:not(frame[title]), frame[title=], iframe:not(iframe[title]), iframe[title=]","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]},"4.1.2":{"techniques":["H64"]}}},"title":{"en":"Frames cannot have empty \"title\" attributes"},"description":{"en":"All frame
elements must have a valid \"title\" attribute."}},"frameTitlesNotPlaceholder":{"attribute":"title","components":["placeholder"],"selector":"frame, iframe","tags":["deprecated","frame"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]},"4.1.2":{"techniques":["H64"]}}},"title":{"en":"Frames cannot have \"title\" attributes that are just placeholder text"},"description":{"en":"Frame \"title\" attributes should not be simple placeholder text like \"frame"}},"framesHaveATitle":{"selector":"frame:not(frame[title]), iframe:not(iframe[title])","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":{"wcag":{"2.4.1":{"techniques":["H64"]},"4.1.2":{"techniques":["H64"]}}},"title":{"en":"All \"frame\" elements should have a \"title\" attribute"},"description":{"en":"Each frame
elements should have a \"title\" attribute."}},"framesetIsNotUsed":{"selector":"frameset","tags":["deprecated","frame"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"frameset\" element should not be used"},"description":{"en":".. code-block:: html"}},"framesetMustHaveNoFramesSection":{"selector":"frameset:not(frameset:has(noframes))","tags":["deprecated","frame"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"All framesets should contain a noframes section"},"description":{"en":"If a frameset
contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames."}},"headerH1":{"components":["header"],"selector":"h1","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h1 is h1 or h2"},"description":{"en":"The header following an h1
element should either be an h2
or another h1
. "}},"headerH1Format":{"components":["header"],"selector":"h1","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h1 elements are not used for formatting"},"description":{"en":"An h1
element may not be used purely for formatting."}},"headerH2":{"components":["header"],"selector":"h2","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h2 is h1, h2 or h3"},"description":{"en":"The header following an h2
element should either be an h3
, h1
or another h2
. "}},"headerH2Format":{"components":["header"],"selector":"h2","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h2 elements are not used for formatting"},"description":{"en":"An h2
element may not be used purely for formatting."}},"headerH3":{"components":["header"],"selector":"h3","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h3 is h1, h2, h3 or h4"},"description":{"en":"The header following an h3
element should either be an h4
, h2
, h1
or another h3
. "}},"headerH3Format":{"components":["header"],"selector":"h3","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h3 elements are not used for formatting"},"description":{"en":"An h3
element may not be used purely for formatting."}},"headerH4":{"components":["header"],"selector":"h4","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h4 is h1, h2, h3, h4 or h5"},"description":{"en":"The header following an h4
element should either be an h5
, h3
, h2
, h1
, or another h4
. "}},"headerH4Format":{"components":["header"],"selector":"h4","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h4 elements are not used for formatting"},"description":{"en":"An h4
element may not be used purely for formatting."}},"headerH5":{"components":["header"],"selector":"h5","tags":["header","content"],"testability":0,"type":"header","guidelines":{"wcag":{"2.4.6":{"techniques":["G130"]}}},"title":{"en":"The header following an h5 is h6 or any header less than h6"},"description":{"en":"The header following an h5
element should either be an h6
, h3
, h2
, h1
, or another h5
. "}},"headerH5Format":{"selector":"h5","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h5 elements are not used for formatting"},"description":{"en":"An h5
element may not be used purely for formatting."}},"headerH6Format":{"selector":"h6","tags":["header","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["T3"]}}},"title":{"en":"All h6 elements are not used for formatting"},"description":{"en":"An h6
element may not be used purely for formatting."}},"headersHaveText":{"components":["placeholder"],"content":true,"empty":true,"selector":"h1, h2, h3, h4, h5, h6","tags":["header","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.3.1":{"techniques":["G141"]},"2.4.10":{"techniques":["G141"]}}},"title":{"en":"All headers should contain readable text"},"description":{"en":"Users with screen readers use headings like the tabs h1 to navigate the structure of a page. All headings should contain either text, or images with appropriate alt attributes."}},"headersUseToMarkSections":{"callback":"headersUseToMarkSections","tags":["header","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["G141"]},"2.4.10":{"techniques":["G141"]}}},"title":{"en":"Use headers to mark the beginning of each section"},"description":{"en":"Check that each logical section of the page is broken or introduced with a header (
. h1-h6>) element."}},"iIsNotUsed":{"selector":"i","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"i\" (italic) element is not used"},"description":{"en":"The i
(italic) element provides no emphasis for non-sighted readers. Use the em
tag instead."}},"iframeMustNotHaveLongdesc":{"selector":"iframe[longdesc]","tags":["objects","iframe","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Inline frames (\"iframes\") should not have a \"longdesc\" attribute"},"description":{"en":".. code-block:: html"}},"imageMapServerSide":{"selector":"img[ismap]","tags":["objects","iframe","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"All links in a server-side map should have duplicate links available in the document"},"description":{"en":"Any image with an \"usemap\" attribute for a server-side image map should have the available links duplicated elsewhere."}},"imgAltEmptyForDecorativeImages":{"selector":"img[alt]","tags":["image","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.3":{"techniques":["F26"]}}},"title":{"en":"If an image is purely decorative, the \"alt\" text must be empty"},"description":{"en":"Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an \"alt\" attribute"}},"imgAltIdentifiesLinkDestination":{"selector":"a img[alt]:first","tags":["image","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Any image within a link must have \"alt\" text the describes the link destination"},"description":{"en":"Any image that is within a link should have an \"alt\" attribute which identifies the destination or purpose of the link."}},"imgAltIsDifferent":{"callback":"imgAltIsDifferent","tags":["image","content"],"testability":0.5,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H37"]}}},"title":{"en":"Image \"alt\" attributes should not be the same as the filename"},"description":{"en":"All img
elements should have an \"alt\" attribute that is not just the name of the file"}},"imgAltIsSameInText":{"selector":"img","tags":["image","content"],"testability":0,"type":"selector","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["G74","H37"]}}},"title":{"en":"Check that any text within an image is also in the \"alt\" attribute"},"description":{"en":"If an image has text within it, that text should be repeated in the \"alt\" attribute"}},"imgAltIsTooLong":{"callback":"imgAltIsTooLong","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H37"]}}},"title":{"en":"Image Alt text is short"},"description":{"en":"All \"alt\" attributes for img
elements should be clear and concise. \"Alt\" attributes over 100 characters long should be reviewed to see if they are too long."}},"imgAltNotEmptyInAnchor":{"callback":"imgAltNotEmptyInAnchor","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"2.4.4":{"techniques":["H30"]}}},"title":{"en":"An image within a link cannot have an empty \"alt\" attribute if there is no other text within the link"},"description":{"en":"Any image that is within a link (an a
element) that has no other text cannot have an empty or missing \"alt\" attribute."}},"imgAltNotPlaceHolder":{"attribute":"alt","components":["placeholder"],"selector":"img","tags":["image","content"],"testability":1,"type":"placeholder","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F30","F39"]},"1.2.1":{"techniques":["F30"]}}},"title":{"en":"Images should not have a simple placeholder text as an \"alt\" attribute"},"description":{"en":"Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of placeholders."}},"imgAltTextNotRedundant":{"callback":"imgAltTextNotRedundant","tags":["image","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"Unless the image files are the same, no image should contain redundant alt text"},"description":{"en":"Every distinct image on a page should have it's own alt text which is different than all the others on the page to avoid redundancy and confusion."}},"imgGifNoFlicker":{"callback":"imgGifNoFlicker","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["G152"]}}},"title":{"en":"Any animated GIF should not flicker"},"description":{"en":"Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF using an online tool."}},"imgHasAlt":{"selector":"img:not(img[alt])","tags":["image","content"],"testability":1,"type":"selector","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F65","H37"]}}},"title":{"en":"Image elements must have an \"alt\" attribute"},"description":{"en":"All img
elements must have an alt attribute"}},"imgHasLongDesc":{"callback":"imgHasLongDesc","tags":["image","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"2.4.4":{"techniques":["G91"]},"2.4.9":{"techniques":["G91"]}}},"title":{"en":"A \"longdesc\" attribute is required for any image where additional information not in the \"alt\" attribute is required"},"description":{"en":"Any image that has an \"alt\" attribute that does not fully convey the meaning of the image must have a \"longdesc\" attribute."}},"imgImportantNoSpacerAlt":{"callback":"imgImportantNoSpacerAlt","tags":["image","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"Images that are important should not have a purely white-space \"alt\" attribute"},"description":{"en":"Any image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of white space (i.e. a space"}},"imgMapAreasHaveDuplicateLink":{"callback":"imgMapAreasHaveDuplicateLink","tags":["image","imagemap"],"testability":1,"type":"custom","guidelines":{"508":["ef","ef"]},"title":{"en":"All links within a client-side image are duplicated elsewhere in the document"},"description":{"en":"Any image that has a \"usemap\" attribute must have links replicated somewhere else in the document."}},"imgNonDecorativeHasAlt":{"callback":"imgNonDecorativeHasAlt","tags":["image","content"],"testability":0.5,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F38"]}}},"title":{"en":"Any non-decorative images should have a non-empty \"alt\" attribute"},"description":{"en":"Any image that is not used decorativey or which is purely for layout purposes cannot have an empty \"alt\" attribute."}},"imgNotReferredToByColorAlone":{"selector":"img","tags":["image","color","content"],"testability":0,"type":"selector","guidelines":{"508":["c"],"wcag":{"1.1.1":{"techniques":["F13"]},"1.4.1":{"techniques":["F13"]}}},"title":{"en":"For any image, the \"alt\" text cannot refer to color alone"},"description":{"en":"The \"alt\" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the \"alt\" text to the meaning of the image"}},"imgServerSideMapNotUsed":{"selector":"img[ismap]","tags":["image","imagemap","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Server-side image maps should not be used"},"description":{"en":"Server-side image maps should not be used."}},"imgShouldNotHaveTitle":{"selector":"img[title]","tags":["image","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Images should not have a \"title\" attribute"},"description":{"en":"Images should not contain a \"title\" attribute."}},"imgWithMapHasUseMap":{"selector":"img[ismap]:not(img[usemap])","tags":["image","imagemap","content"],"testability":1,"type":"selector","guidelines":{"508":["ef","ef"]},"title":{"en":"Any image with an \"ismap\" attribute have a valid \"usemap\" attribute"},"description":{"en":"If an image has an \"ismap\" attribute"}},"imgWithMathShouldHaveMathEquivalent":{"callback":"imgWithMathShouldHaveMathEquivalent","tags":["image","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"Images which contain math equations should provide equivalent MathML"},"description":{"en":"Images which contain math equations should be accompanied or link to a document with the equivalent equation marked up with MathML."}},"inputCheckboxHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=checkbox]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"checkbox\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input
elements of type \"checkbox\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputCheckboxRequiresFieldset":{"callback":"inputCheckboxRequiresFieldset","tags":["form","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"3.3.2":{"techniques":["H71"]}}},"title":{"en":"Logical groups of check boxes should be grouped with a \"fieldset"},"description":{"en":"Related \"checkbox\" input fields should be grouped together using a fieldset
."}},"inputDoesNotUseColorAlone":{"selector":"input:not(input[type=hidden])","tags":["form","color","content"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"An \"input\" element should not use color alone"},"description":{"en":"All input elements should not refer to content by color alone."}},"inputElementsDontHaveAlt":{"selector":"input[type!=image][alt]","tags":["form","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Input elements which are not images should not have an \"alt\" attribute"},"description":{"en":"Because of inconsistencies in how user agents use the \"alt\" attribute"}},"inputFileHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=file]","tags":["form","tabindex"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"file\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input
elements of type \"file\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputImageAltIdentifiesPurpose":{"selector":"input[type=image][alt]","tags":["form","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute that describes the function of the input"},"description":{"en":"All input
elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltIsNotFileName":{"callback":"inputImageAltIsNotFileName","tags":["form","image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not the same as the filename"},"description":{"en":"All input
elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltIsNotPlaceholder":{"attribute":"alt","components":["placeholder"],"selector":"input[type=image]","tags":["form","image","content"],"testability":1,"type":"placeholder","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not placeholder text"},"description":{"en":"All input
elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltIsShort":{"callback":"inputImageAltIsShort","tags":["form","image","content"],"testability":1,"type":"custom","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is as short as possible"},"description":{"en":"All input
elements with a type of \"image\" should have an \"alt\" attribute"}},"inputImageAltNotRedundant":{"callback":"inputImageAltNotRedundant","strings":"redundant.inputImage","tags":["form","image","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"The \"alt\" text for input \"image\" submit buttons must not be filler text"},"description":{"en":"Every form image button should not simply use filler text like \"button\" or \"submit\" as the \"alt\" text."}},"inputImageHasAlt":{"selector":"input[type=image]:not(input[type=image][alt])","tags":["form","image","content"],"testability":1,"type":"selector","guidelines":{"508":["a"],"wcag":{"1.1.1":{"techniques":["F65","G94","H36"]}}},"title":{"en":"All \"input\" elements with a type of \"image\" must have an \"alt\" attribute"},"description":{"en":"All input
elements with a type of \"image\" should have an \"alt\" attribute."}},"inputImageNotDecorative":{"selector":"input[type=image]","tags":["form","image","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["H36"]}}},"title":{"en":"The \"alt\" text for input \"image\" buttons must be the same as text inside the image"},"description":{"en":"Every form image button which has text within the image (say, a picture of the word \"Search\" in a special font)"}},"inputPasswordHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=password]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"password\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input
elements of type \"password\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputRadioHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=radio]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"radio\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input
elements of type \"radio\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputSubmitHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=submit]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All input elements, type of \"submit\" have a valid tab index."},"description":{"en":""}},"inputTextHasLabel":{"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All \"input\" elements should have a corresponding \"label"},"description":{"en":"All input
elements should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"inputTextHasTabIndex":{"attribute":"tabindex","components":["placeholder"],"empty":true,"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"text\" input elements require a valid \"tabindex\" attribute"},"description":{"en":"All input
elements of type \"text\" should have a \"tabindex\" attribute to help navigate the form with a keyboard alone."}},"inputTextHasValue":{"attribute":"value","components":["placeholder"],"empty":true,"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"All \"input\" elements of type \"text\" must have a default text"},"description":{"en":"All input
elements with a type of \"text\" should have a default text."}},"inputTextValueNotEmpty":{"attribute":"value","components":["placeholder"],"empty":true,"selector":"input[type=text]","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"Text\" input elements require a non-whitespace default text"},"description":{"en":"All input
elements with a type of \"text\" should have a default text which is not empty."}},"labelDoesNotContainInput":{"selector":"label:has(input)","tags":["form","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Label elements should not contain an input element"},"description":{"en":".. code-block:: html"}},"labelMustBeUnique":{"callback":"labelMustBeUnique","tags":["form","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F17"]},"4.1.1":{"techniques":["F17"]}}},"title":{"en":"Every form input must have only one label"},"description":{"en":"Each form input should have only one label
element."}},"labelMustNotBeEmpty":{"components":["placeholder"],"content":true,"empty":true,"selector":"label","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"Labels must contain text"},"description":{"en":".. code-block:: html"}},"labelsAreAssignedToAnInput":{"callback":"labelsAreAssignedToAnInput","tags":["form","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"All labels should be associated with an input"},"description":{"en":"All label
elements should be assigned to an input item, and should have a for attribute which equals the id attribute of a form element."}},"legendDescribesListOfChoices":{"selector":"legend","tags":["form","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"2.4.6":{"techniques":["G131"]}}},"title":{"en":"All \"legend\" elements must describe the group of choices"},"description":{"en":"If a legend
element is used in a fieldset, the legend
content must describe the group of choices."}},"legendTextNotEmpty":{"selector":"legend:empty","tags":["form","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H71"]},"2.4.6":{"techniques":["G131"]},"3.3.2":{"techniques":["H71"]}}},"title":{"en":"Legend text must not contain just whitespace"},"description":{"en":"If a legend
element is used in a fieldset, the legend
should not contain empty text."}},"legendTextNotPlaceholder":{"components":["placeholder"],"content":true,"emtpy":true,"selector":"legend","tags":["form","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.3.1":{"techniques":["H71"]},"2.4.6":{"techniques":["G131"]},"3.3.2":{"techniques":["H71"]}}},"title":{"en":"Legend\" text must not contain placeholder text like \"form\" or \"field"},"description":{"en":"If a legend
element is used in a fieldset, the legend
should not contain useless placeholder text."}},"liDontUseImageForBullet":{"selector":"li:has(img)","tags":["list","content"],"testability":0.5,"type":"selector","guidelines":[]},"linkUsedForAlternateContent":{"selector":"html:not(html:has(link[rel=alternate])) body","tags":["document"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Use a \"link\" element for alternate content"},"description":{"en":"Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a link
element with a \"rel\" attribute of \"alternate\" in the document header."}},"linkUsedToDescribeNavigation":{"selector":"html:not(html:has(link[rel=index]))","tags":["document"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Document uses link element to describe navigation if it is within a collection."},"description":{"en":"The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units."}},"listNotUsedForFormatting":{"callback":"listNotUsedForFormatting","tags":["list","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.2":{"techniques":["F1"]}}},"title":{"en":"Lists should not be used for formatting"},"description":{"en":"Lists like ul
and ol
are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed."}},"marqueeIsNotUsed":{"selector":"marquee","tags":["deprecated","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"The \"marquee\" tag should not be used"},"description":{"en":"The marquee
element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text."}},"menuNotUsedToFormatText":{"selector":"menu:not(menu li:parent(menu))","tags":["list","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Menu elements should not be used for formattin"},"description":{"en":"Menu is a deprecated tag, but is still honored in a transitional DTD. Menu tags are to provide structure for a document and should not be used for formatting. If a menu tag is to be used, it should only contain an ordered or unordered list of links."}},"noembedHasEquivalentContent":{"selector":"noembed","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Noembed elements must be the same content as their \"embed\" element"},"description":{"en":"All noembed
elements must contain or link to an accessible version of their embed
counterparts."}},"noframesSectionMustHaveTextEquivalent":{"selector":"frameset:not(frameset:has(noframes))","tags":["deprecated","frame"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"All \"noframes\" elements should contain the text content from all frames"},"description":{"en":"The noframes
content should either replicate or link to the content visible within the frames."}},"objectContentUsableWhenDisabled":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"When objects are disabled, content should still be available"},"description":{"en":"The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the object
tag."}},"objectDoesNotFlicker":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["F7"]}}},"title":{"en":"Objects do not flicker"},"description":{"en":"The content within an object
tag must not flicker."}},"objectDoesNotUseColorAlone":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"Objects must not use color to communicate alone"},"description":{"en":"Objects should contain content that makes sense without color and is accessible to users who are color blind."}},"objectInterfaceIsAccessible":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Interfaces within objects must be accessible"},"description":{"en":"Object content should be assessed for accessibility."}},"objectLinkToMultimediaHasTextTranscript":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Objects which reference multimedia files should also provide a link to a transcript"},"description":{"en":"If an object contains a video, a link to the transcript should be provided near the object."}},"objectMustContainText":{"components":["placeholder"],"content":true,"empty":true,"selector":"object","tags":["objects","content"],"testability":1,"type":"placeholder","guidelines":{"wcag":{"1.1.1":{"techniques":["FLASH1","H27"]}}},"title":{"en":"Objects must contain their text equivalents"},"description":{"en":"All object
elements should contain a text equivalent if the object cannot be rendered."}},"objectMustHaveEmbed":{"selector":"object:not(object:has(embed))","tags":["objects","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Every object should contain an \"embed\" element"},"description":{"en":"Every object
element must also contain an embed
element."}},"objectMustHaveTitle":{"selector":"object:not(object[title])","tags":["objects","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["H27"]}}},"title":{"en":"Objects should have a title attribute"},"description":{"en":"All object
elements should contain a \"title\" attribute."}},"objectMustHaveValidTitle":{"attribute":"title","components":["placeholder"],"empty":true,"selector":"object","tags":["objects","content"],"testability":1,"type":"placeholder","guidelines":[],"title":{"en":"Objects must not have an empty title attribute"},"description":{"en":"All object
elements should have a \"title\" attribute which is not empty."}},"objectProvidesMechanismToReturnToParent":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"All objects should provide a way for keyboard users to escape"},"description":{"en":"Ensure that a user who has only a keyboard as an input device can escape a object
element. This requires manual confirmation."}},"objectShouldHaveLongDescription":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"An object might require a long description"},"description":{"en":"Objects might require a long description, especially if their content is complicated."}},"objectTextUpdatesWhenObjectChanges":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":{"508":["a"]},"title":{"en":"The text equivalents of an object should update if the object changes"},"description":{"en":"If an object changes, the text equivalent of that object should also change."}},"objectUIMustBeAccessible":{"selector":"object","tags":["objects","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Content within an \"object\" element should be usable with objects disabled"},"description":{"en":"Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes."}},"objectWithClassIDHasNoText":{"selector":"object[classid]:not(object[classid]:empty)","tags":["objects","content"],"testability":1,"type":"selector","guidelines":[],"title":{"en":"Objects with \"classid\" attributes should change their text if the content of the object changes"},"description":{"en":"Objects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes."}},"pNotUsedAsHeader":{"callback":"pNotUsedAsHeader","tags":["header","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["G141","H42"]},"2.4.10":{"techniques":["G141"]}}},"title":{"en":"Paragraphs must not be used for headers"},"description":{"en":"Headers like h1
. h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one."}},"paragarphIsWrittenClearly":{"callback":"paragarphIsWrittenClearly","components":["textStatistics"],"tags":["language","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.1.5":{"techniques":["G86"]}}}},"passwordHasLabel":{"components":["label"],"selector":"input[type=password]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["n"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All password input elements should have a corresponding label"},"description":{"en":"All input
elements with a type of \"password\"should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"passwordLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=password]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"password\" input elements have a label that is close"},"description":{"en":"All input elements of type \"password\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"preShouldNotBeUsedForTabularLayout":{"callback":"preShouldNotBeUsedForTabularLayout","tags":["table","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F33","F34","F48"]},"1.3.2":{"techniques":["F33","F34"]}}},"title":{"en":"Pre\" elements should not be used for tabular data"},"description":{"en":"If a pre
element is used for tabular data, change the data to use a well-formed table."}},"radioHasLabel":{"components":["label"],"selector":"input[type=radio]","tags":["form","content"],"testability":1,"type":"label","guidelines":{"508":["n"],"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All \"radio\" input elements have a corresponding label"},"description":{"en":"All input
elements of type \"radio\" should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"radioLabelIsNearby":{"components":["labelProximity"],"selector":"input[type=radio]","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All \"radio\" input elements have a label that is close"},"description":{"en":"All input elements of type \"radio\" must have a corresponding label that is close to the form element. Users of screen magnification or with reduced spatial skills are hampered in using a form element if the label for that element is located far away."}},"radioMarkedWithFieldgroupAndLegend":{"selector":"input[type=radio]:not(fieldset input[type=radio])","tags":["form","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H71"]},"3.3.2":{"techniques":["H71"]}}},"title":{"en":"All radio button groups are marked using fieldset and legend elements."},"description":{"en":"form element content must contain both fieldset and legend elements if there are related radio buttons."}},"scriptContentAccessibleWithScriptsTurnedOff":{"selector":"script","tags":["javascript"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Content on the page should still be available if scripts are disabled"},"description":{"en":"All scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available."}},"scriptInBodyMustHaveNoscript":{"selector":"html:not(html:has(noscript)):has(script) body","tags":["javascript"],"testability":0.5,"type":"selector","guidelines":{"508":["l"]},"title":{"en":"Scripts should have a corresponding \"noscript\" element"},"description":{"en":"Scripts should be followed by a noscripts
element to guide the user to content in an alternative way."}},"scriptOnclickRequiresOnKeypress":{"components":["event","hasEventListener"],"correspondingEvent":"onkeypress","searchEvent":"onclick","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90","SCR2"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"If an element has an \"onclick\" attribute"},"description":{"en":"it should also have an \"onkeypress\" attribute"}},"scriptOndblclickRequiresOnKeypress":{"components":["event","hasEventListener"],"correspondingEvent":"onkeypress","searchEvent":"ondblclick","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90","SCR2"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"Any element with an \"ondblclick\" attribute shoul have a keyboard-related action as well"},"description":{"en":"If an element has an \"ondblclick\" attribute"}},"scriptOnmousedownRequiresOnKeypress":{"components":["event","hasEventListener"],"correspondingEvent":"onkeydown","searchEvent":"onmousedown","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90","SCR2"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"If an element has a \"mousedown\" attribute"},"description":{"en":"it should also have an \"onkeydown\" attribute"}},"scriptOnmousemove":{"components":["event","hasEventListener"],"correspondingEvent":"onkeypress","searchEvent":"onmousemove","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["SCR2"]}}},"title":{"en":"Any element with an \"onmousemove\" attribute shoul have a keyboard-related action as well"},"description":{"en":"If an element has an \"onmousemove\" attribute"}},"scriptOnmouseoutHasOnmouseblur":{"components":["event","hasEventListener"],"correspondingEvent":"onblur","searchEvent":"onmouseout","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["SCR2"]}}},"title":{"en":"If an element has a \"onmouseout\" attribute"},"description":{"en":"it should also have an \"onblur\" attribute"}},"scriptOnmouseoverHasOnfocus":{"components":["event","hasEventListener"],"correspondingEvent":"onfocus","searchEvent":"onmouseover","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["SCR2"]}}},"title":{"en":"If an element has an \"onmouseover\" attribute"},"description":{"en":"it should also have an \"onfocus\" attribute"}},"scriptOnmouseupHasOnkeyup":{"components":["event","hasEventListener"],"correspondingEvent":"onkeyup","searchEvent":"onmouseup","tags":["javascript"],"testability":1,"type":"event","guidelines":{"508":["l"],"wcag":{"2.1.1":{"techniques":["G90"]},"2.1.3":{"techniques":["G90"]}}},"title":{"en":"If an element has an \"onmouseup\" attribute"},"description":{"en":"it should also have an \"onkeyup\" attribute"}},"scriptUIMustBeAccessible":{"selector":"script","tags":["javascript"],"testability":0,"type":"selector","guidelines":{"508":["l"]},"title":{"en":"The user interface for scripts should be accessible"},"description":{"en":"All scripts should be assessed to see if their interface is accessible."}},"scriptsDoNotFlicker":{"selector":"script","tags":["javascript"],"testability":0,"type":"selector","guidelines":{"508":["j"],"wcag":{"2.2.2":{"techniques":["F7"]}}},"title":{"en":"Scripts should not cause the screen to flicker"},"description":{"en":"All scripts should be assessed to see if their interface does not flicker."}},"scriptsDoNotUseColorAlone":{"selector":"script","tags":["javascript","color"],"testability":0,"type":"selector","guidelines":{"508":["c"]},"title":{"en":"The interface in scripts should not use color alone"},"description":{"en":"All scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone."}},"selectDoesNotChangeContext":{"components":["event","hasEventListener"],"searchEvent":"onchange","selector":"select","tags":["form","content"],"testability":1,"type":"event","guidelines":[],"title":{"en":"Select\" elemetns must not contain an \"onchange\" attribute"},"description":{"en":"Actions like \"onchange\" can take control away from users who are trying to navigate the page. Using an \"onchange\" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action."}},"selectHasAssociatedLabel":{"components":["label"],"selector":"select","tags":["form","content"],"testability":1,"type":"label","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All select elements have an explicitly associated label."},"description":{"en":"All select
elements should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"selectJumpMenu":{"callback":"selectJumpMenu","components":["hasEventListener"],"tags":["form","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"3.2.2":{"techniques":["F37"]},"3.2.5":{"techniques":["F9"]}}},"title":{"en":"Select jump menus should jump on button press, not on state change"},"description":{"en":"If you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt."}},"selectWithOptionsHasOptgroup":{"selector":"select:not(select:has(optgroup)) option:nth-child(5)","tags":["form","content"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H85"]}}},"title":{"en":"Form select elements should use optgroups for long selections"},"description":{"en":".. code-block:: html"}},"siteMap":{"callback":"siteMap","strings":"siteMap","tags":["document"],"testability":0,"type":"custom","guidelines":{"wcag":{"2.4.5":{"techniques":["G63"]},"2.4.8":{"techniques":["G63"]}}},"title":{"en":"Websites must have a site map"},"description":{"en":"Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices."}},"skipToContentLinkProvided":{"selector":"body:not(body:has(a:first[href^=#]))","tags":["document"],"testability":0.5,"type":"selector","guidelines":{"508":["o"],"wcag":{"2.4.1":{"techniques":["G1"]}}},"title":{"en":"A \"skip to content\" link should exist as one of the first links on the page"},"description":{"en":"A link reading \"skip to content"}},"svgContainsTitle":{"selector":"svg:not(svg:has(title))","tags":["image","svg","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.1.1":{"techniques":["F65"]}}},"title":{"en":"Inline SVG should use Title elements"},"description":{"en":"Any inline SVG image should have an embedded title
element"}},"tabIndexFollowsLogicalOrder":{"callback":"tabIndexFollowsLogicalOrder","tags":["document"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"2.4.3":{"techniques":["H4"]}}},"title":{"en":"The tab order of a document is logical"},"description":{"en":"Check that the tab-order of a page is logical."}},"tableCaptionIdentifiesTable":{"selector":"caption","tags":["table","content"],"testability":0,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H39"]}}},"title":{"en":"Captions should identify their table"},"description":{"en":"Check to make sure that a table's caption identifies the table with a name, figure number, etc."}},"tableComplexHasSummary":{"selector":"table:not(table[summary], table:has(caption))","tags":["table","content"],"testability":0.5,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H39"]}}},"title":{"en":"Complex tables should have a summary"},"description":{"en":"If a table is complex (for example, has some cells with \"colspan\" attributes"}},"tableDataShouldHaveTh":{"selector":"table:not(table:has(th))","tags":["table","content"],"testability":1,"type":"selector","guidelines":{"508":["g"],"wcag":{"1.3.1":{"techniques":["F91"]}}},"title":{"en":"Data tables should contain \"th\" elements"},"description":{"en":"Tables which contain data (as opposed to layout tables) should contain th
elements to mark headers for screen readers and enhance the structure of the document."}},"tableHeaderLabelMustBeTerse":{"callback":"tableHeaderLabelMustBeTerse","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"Table header lables must be terse"},"description":{"en":"The \"abbr\" attribute for table headers must be terse (less than 20 characters long)."}},"tableIsGrouped":{"selector":"table:not(table:has(thead), table:has(tfoot))","tags":["table","content"],"testability":0.5,"type":"selector","guidelines":[],"title":{"en":"Mark up the areas of tables using thead and tbody"},"description":{"en":""}},"tableLayoutDataShouldNotHaveTh":{"callback":"tableLayoutDataShouldNotHaveTh","tags":["table","layout","content"],"testability":0,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F46"]}}},"title":{"en":"Layout tables should not contain \"th\" elements"},"description":{"en":"Tables which are used purely for layout (as opposed to data tables), should not contain th
elements, which would make the table appear to be a data table."}},"tableLayoutHasNoCaption":{"callback":"tableLayoutHasNoCaption","tags":["table","layout","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F46"]}}},"title":{"en":"All tables used for layout have no \"caption\" element"},"description":{"en":"If a table contains no data, and is used simply for layout, then it should not contain a caption
element."}},"tableLayoutHasNoSummary":{"callback":"tableLayoutHasNoSummary","tags":["table","layout","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F46"]}}},"title":{"en":"All tables used for layout have no summary or an empty summary"},"description":{"en":"If a table contains no data, and is used simply for layout, then it should not have a \"summary\" attribute"}},"tableLayoutMakesSenseLinearized":{"callback":"tableLayoutMakesSenseLinearized","tags":["table","layout","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"All tables used for layout should make sense when removed"},"description":{"en":"If a table
element is used for layout purposes only, then the content of the table should make sense if the table is linearized."}},"tableNotUsedForLayout":{"callback":"tableNotUsedForLayout","tags":["table","layout"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.2":{"techniques":["F49"]}}}},"tableSummaryDescribesTable":{"selector":"table[summary]","tags":["table","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"Table summaries should describe the navigation and structure of the table"},"description":{"en":"Table summary
elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes."}},"tableSummaryDoesNotDuplicateCaption":{"callback":"tableSummaryDoesNotDuplicateCaption","tags":["table","content"],"testability":1,"type":"custom","guidelines":[],"title":{"en":"Table \"summary\" elements should not duplicate the \"caption\" element"},"description":{"en":"The summary and the caption must be different, as both provide different information. A caption
. /code element identifies the table., while the \"summary\" attribute describes the table contents."}},"tableSummaryIsEmpty":{"attribute":"summary","components":["placeholder"],"empty":true,"selector":"table[summary]","tags":["table","content"],"testability":0.5,"type":"placeholder","guidelines":[],"title":{"en":"All data tables should have a summary"},"description":{"en":"If a table contains data, it should have a \"summary\" attribute."}},"tableSummaryIsNotTooLong":{"callback":"tableSummaryIsNotTooLong","tags":["table","content"],"testability":0,"type":"custom","guidelines":[]},"tableSummaryIsSufficient":{"selector":"table[summary]","tags":["table","content"],"testability":0,"type":"selector","guidelines":[],"title":{"en":"All data tables should have an adequate summary"},"description":{"en":"If a table contains data, it should have a \"summary\" attribute that completely communicates the function and use of the table."}},"tableUseColGroup":{"callback":"tableUseColGroup","tags":["table","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"Group columns using \"colgroup\" or \"col\" elements"},"description":{"en":"To help complex table headers make sense, use colgroup
or col
to group them together."}},"tableUsesAbbreviationForHeader":{"callback":"tableUsesAbbreviationForHeader","tags":["table","content"],"testability":0,"type":"custom","guidelines":[],"title":{"en":"Table headers over 20 characters should provide an \"abbr\" attribute"},"description":{"en":"For long table headers, use an \"abbr\" attribute that is less than short (less than 20 characters long)."}},"tableUsesCaption":{"selector":"table:not(table:has(caption))","tags":["table","content"],"testability":1,"type":"selector","guidelines":{"wcag":{"1.3.1":{"techniques":["H39"]}}},"title":{"en":"Data tables should contain a \"caption\" element if not described elsewhere"},"description":{"en":"Unless otherwise described in the document, tables should contain caption
elements to describe the purpose of the table."}},"tableUsesScopeForRow":{"callback":"tableUsesScopeForRow","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["H63"]}}},"title":{"en":"Data tables should use scoped headers for rows with headers"},"description":{"en":"Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight."}},"tableWithBothHeadersUseScope":{"selector":"table:has(tr:not(table tr:first) th:not(th[scope]))","tags":["table","content"],"testability":0.5,"type":"selector","guidelines":{"508":["h"],"wcag":{"1.3.1":{"techniques":["F91"]}}},"title":{"en":"Data tables with multiple headers should use the \"scope\" attribute"},"description":{"en":"Where there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells."}},"tableWithMoreHeadersUseID":{"callback":"tableWithMoreHeadersUseID","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"Complex data tables should provide \"id\" attributes to headers"},"description":{"en":"and \"headers\" attributes for data cells"}},"tabularDataIsInTable":{"callback":"tabularDataIsInTable","tags":["table","content"],"testability":0.5,"type":"custom","guidelines":{"wcag":{"1.3.1":{"techniques":["F33","F34","F48"]},"1.3.2":{"techniques":["F33","F34"]}}},"title":{"en":"All tabular information should use a table"},"description":{"en":"Tables should be used when displaying tabular information."}},"textIsNotSmall":{"callback":"textIsNotSmall","components":["convertToPx"],"tags":["textsize","content"],"testability":0.5,"type":"custom","guidelines":[],"title":{"en":"The text size is not less than 9 pixels high"},"description":{"en":"To help users with difficulty reading small text, ensure text size is no less than 9 pixels high."}},"textareaHasAssociatedLabel":{"components":["label"],"selector":"textarea","tags":["form","content"],"testability":1,"type":"label","guidelines":{"wcag":{"1.1.1":{"techniques":["H44"]},"1.3.1":{"techniques":["H44","F68"]},"3.3.2":{"techniques":["H44"]},"4.1.2":{"techniques":["H44"]}}},"title":{"en":"All textareas should have a corresponding label"},"description":{"en":"All textarea
elements should have a corresponding label
element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user"}},"textareaLabelPositionedClose":{"components":["labelProximity"],"selector":"textarea","tags":["form","content"],"testability":0.5,"type":"labelProximity","guidelines":[],"title":{"en":"All textareas should have a label that is close to it"},"description":{"en":"All textarea
elements should have a corresponding label
element that is close in proximity.."}},"videoProvidesCaptions":{"selector":"video","tags":["media","content"],"testability":0.5,"type":"selector","guidelines":{"508":["b","b"],"wcag":{"1.2.2":{"techniques":["G87"]},"1.2.4":{"techniques":["G87"]}}},"title":{"en":"All video tags must provide captions"},"description":{"en":"All HTML5 video tags must provide captions."}},"videosEmbeddedOrLinkedNeedCaptions":{"callback":"videosEmbeddedOrLinkedNeedCaptions","components":["video"],"tags":["media","content"],"testability":1,"type":"custom","guidelines":{"wcag":{"1.2.2":{"techniques":["G87"]},"1.2.4":{"techniques":["G87"]}}},"title":{"en":"All linked or embedded videos need captions"},"description":{"en":"Any video hosted or otherwise which is linked or embedded must have a caption."}}}
\ No newline at end of file
diff --git a/docs/building.rst b/docs/building.rst
new file mode 100644
index 000000000..360105678
--- /dev/null
+++ b/docs/building.rst
@@ -0,0 +1,14 @@
+Building QUAIL
+==============
+
+For most purposes, you can simply `download the latest release of Quail img
elements must have an alt attribute"
....
The **test name** in this example is "imgHasAlt," which is the unique label for the test. These are used in creating guidelines. There are at least two definitions for each test:
- - **Type** - QUAIL has some default test types to simplify the process of writing test definitions. The simplest is a *selector*, which just takes a jQuery/Sizzle-compatable selector and finds all items that match that selector. For *selector* tests, we also must define the selector to use (in this case, `img:not(img[alt])`).
- - **Severity** - The default severity level. Severity is a measure of how certain we are a test will not create false positives:
- - **Severe** - We are 100% certain that this test is always correct. If an image is missing its `alt` attribute, it's missing its `alt` attribute.
- - **Moderate** - We are mostly certain this test is correct. This is usually found for content-related tests, like testing to see if a block of text is written at or below a certain grade level.
- - **Suggestion** - We cannot test for this, but can suggest things to manually review. For exmaple, we cannot test that content in a Flash object is accessible, but we can point out that a flash object is there and link to appropriate guidelines on making accessible flash.
+ - **type** - QUAIL has some default test types to simplify the process of writing test definitions. The simplest is a *selector*, which just takes a jQuery/Sizzle-compatable selector and finds all items that match that selector. For *selector* tests, we also must define the selector to use (in this case, `img:not(img[alt])`).
+ - **severity** - The default severity level. Severity is a measure of how certain we are a test will not create false positives:
+ - **severe** - We are 100% certain that this test is always correct. If an image is missing its `alt` attribute, it's missing its `alt` attribute.
+ - **moderate** - We are mostly certain this test is correct. This is usually found for content-related tests, like testing to see if a block of text is written at or below a certain grade level.
+ - **suggestion** - We cannot test for this, but can suggest things to manually review. For exmaple, we cannot test that content in a Flash object is accessible, but we can point out that a flash object is there and link to appropriate guidelines on making accessible flash.
+ - **guidelines** - A list of pre-defined guidelines (right now, either 508 or WCAG 2.0) including:
+ - **techinques** - The WCAG techniques aligned with this test
+ - **configuration** - Optional configuration options for this test only specific to this test.
+ - **title** - The human-readable title of the test, prefixed by language code.
+ - **description** - The human-readable description of the test, prefixed by language code.
Guidelines
----------
diff --git a/examples/common/bootstrap.css b/examples/common/bootstrap.css
deleted file mode 100644
index 9fa6f766f..000000000
--- a/examples/common/bootstrap.css
+++ /dev/null
@@ -1,5774 +0,0 @@
-/*!
- * Bootstrap v2.1.1
- *
- * Copyright 2012 Twitter, Inc
- * Licensed under the Apache License v2.0
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Designed and built with all the love in the world @twitter by @mdo and @fat.
- */
-
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-nav,
-section {
- display: block;
-}
-
-audio,
-canvas,
-video {
- display: inline-block;
- *display: inline;
- *zoom: 1;
-}
-
-audio:not([controls]) {
- display: none;
-}
-
-html {
- font-size: 100%;
- -webkit-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
-}
-
-a:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-a:hover,
-a:active {
- outline: 0;
-}
-
-sub,
-sup {
- position: relative;
- font-size: 75%;
- line-height: 0;
- vertical-align: baseline;
-}
-
-sup {
- top: -0.5em;
-}
-
-sub {
- bottom: -0.25em;
-}
-
-img {
- width: auto\9;
- height: auto;
- max-width: 100%;
- vertical-align: middle;
- border: 0;
- -ms-interpolation-mode: bicubic;
-}
-
-#map_canvas img {
- max-width: none;
-}
-
-button,
-input,
-select,
-textarea {
- margin: 0;
- font-size: 100%;
- vertical-align: middle;
-}
-
-button,
-input {
- *overflow: visible;
- line-height: normal;
-}
-
-button::-moz-focus-inner,
-input::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button,
-input[type="button"],
-input[type="reset"],
-input[type="submit"] {
- cursor: pointer;
- -webkit-appearance: button;
-}
-
-input[type="search"] {
- -webkit-box-sizing: content-box;
- -moz-box-sizing: content-box;
- box-sizing: content-box;
- -webkit-appearance: textfield;
-}
-
-input[type="search"]::-webkit-search-decoration,
-input[type="search"]::-webkit-search-cancel-button {
- -webkit-appearance: none;
-}
-
-textarea {
- overflow: auto;
- vertical-align: top;
-}
-
-.clearfix {
- *zoom: 1;
-}
-
-.clearfix:before,
-.clearfix:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.clearfix:after {
- clear: both;
-}
-
-.hide-text {
- font: 0/0 a;
- color: transparent;
- text-shadow: none;
- background-color: transparent;
- border: 0;
-}
-
-.input-block-level {
- display: block;
- width: 100%;
- min-height: 30px;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-body {
- margin: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 14px;
- line-height: 20px;
- color: #333333;
- background-color: #ffffff;
-}
-
-a {
- color: #0088cc;
- text-decoration: none;
-}
-
-a:hover {
- color: #005580;
- text-decoration: underline;
-}
-
-.img-rounded {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.img-polaroid {
- padding: 4px;
- background-color: #fff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
-}
-
-.img-circle {
- -webkit-border-radius: 500px;
- -moz-border-radius: 500px;
- border-radius: 500px;
-}
-
-.row {
- margin-left: -20px;
- *zoom: 1;
-}
-
-.row:before,
-.row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row:after {
- clear: both;
-}
-
-[class*="span"] {
- float: left;
- min-height: 1px;
- margin-left: 20px;
-}
-
-.container,
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-
-.span12 {
- width: 940px;
-}
-
-.span11 {
- width: 860px;
-}
-
-.span10 {
- width: 780px;
-}
-
-.span9 {
- width: 700px;
-}
-
-.span8 {
- width: 620px;
-}
-
-.span7 {
- width: 540px;
-}
-
-.span6 {
- width: 460px;
-}
-
-.span5 {
- width: 380px;
-}
-
-.span4 {
- width: 300px;
-}
-
-.span3 {
- width: 220px;
-}
-
-.span2 {
- width: 140px;
-}
-
-.span1 {
- width: 60px;
-}
-
-.offset12 {
- margin-left: 980px;
-}
-
-.offset11 {
- margin-left: 900px;
-}
-
-.offset10 {
- margin-left: 820px;
-}
-
-.offset9 {
- margin-left: 740px;
-}
-
-.offset8 {
- margin-left: 660px;
-}
-
-.offset7 {
- margin-left: 580px;
-}
-
-.offset6 {
- margin-left: 500px;
-}
-
-.offset5 {
- margin-left: 420px;
-}
-
-.offset4 {
- margin-left: 340px;
-}
-
-.offset3 {
- margin-left: 260px;
-}
-
-.offset2 {
- margin-left: 180px;
-}
-
-.offset1 {
- margin-left: 100px;
-}
-
-.row-fluid {
- width: 100%;
- *zoom: 1;
-}
-
-.row-fluid:before,
-.row-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.row-fluid:after {
- clear: both;
-}
-
-.row-fluid [class*="span"] {
- display: block;
- float: left;
- width: 100%;
- min-height: 30px;
- margin-left: 2.127659574468085%;
- *margin-left: 2.074468085106383%;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.row-fluid [class*="span"]:first-child {
- margin-left: 0;
-}
-
-.row-fluid .span12 {
- width: 100%;
- *width: 99.94680851063829%;
-}
-
-.row-fluid .span11 {
- width: 91.48936170212765%;
- *width: 91.43617021276594%;
-}
-
-.row-fluid .span10 {
- width: 82.97872340425532%;
- *width: 82.92553191489361%;
-}
-
-.row-fluid .span9 {
- width: 74.46808510638297%;
- *width: 74.41489361702126%;
-}
-
-.row-fluid .span8 {
- width: 65.95744680851064%;
- *width: 65.90425531914893%;
-}
-
-.row-fluid .span7 {
- width: 57.44680851063829%;
- *width: 57.39361702127659%;
-}
-
-.row-fluid .span6 {
- width: 48.93617021276595%;
- *width: 48.88297872340425%;
-}
-
-.row-fluid .span5 {
- width: 40.42553191489362%;
- *width: 40.37234042553192%;
-}
-
-.row-fluid .span4 {
- width: 31.914893617021278%;
- *width: 31.861702127659576%;
-}
-
-.row-fluid .span3 {
- width: 23.404255319148934%;
- *width: 23.351063829787233%;
-}
-
-.row-fluid .span2 {
- width: 14.893617021276595%;
- *width: 14.840425531914894%;
-}
-
-.row-fluid .span1 {
- width: 6.382978723404255%;
- *width: 6.329787234042553%;
-}
-
-.row-fluid .offset12 {
- margin-left: 104.25531914893617%;
- *margin-left: 104.14893617021275%;
-}
-
-.row-fluid .offset12:first-child {
- margin-left: 102.12765957446808%;
- *margin-left: 102.02127659574467%;
-}
-
-.row-fluid .offset11 {
- margin-left: 95.74468085106382%;
- *margin-left: 95.6382978723404%;
-}
-
-.row-fluid .offset11:first-child {
- margin-left: 93.61702127659574%;
- *margin-left: 93.51063829787232%;
-}
-
-.row-fluid .offset10 {
- margin-left: 87.23404255319149%;
- *margin-left: 87.12765957446807%;
-}
-
-.row-fluid .offset10:first-child {
- margin-left: 85.1063829787234%;
- *margin-left: 84.99999999999999%;
-}
-
-.row-fluid .offset9 {
- margin-left: 78.72340425531914%;
- *margin-left: 78.61702127659572%;
-}
-
-.row-fluid .offset9:first-child {
- margin-left: 76.59574468085106%;
- *margin-left: 76.48936170212764%;
-}
-
-.row-fluid .offset8 {
- margin-left: 70.2127659574468%;
- *margin-left: 70.10638297872339%;
-}
-
-.row-fluid .offset8:first-child {
- margin-left: 68.08510638297872%;
- *margin-left: 67.9787234042553%;
-}
-
-.row-fluid .offset7 {
- margin-left: 61.70212765957446%;
- *margin-left: 61.59574468085106%;
-}
-
-.row-fluid .offset7:first-child {
- margin-left: 59.574468085106375%;
- *margin-left: 59.46808510638297%;
-}
-
-.row-fluid .offset6 {
- margin-left: 53.191489361702125%;
- *margin-left: 53.085106382978715%;
-}
-
-.row-fluid .offset6:first-child {
- margin-left: 51.063829787234035%;
- *margin-left: 50.95744680851063%;
-}
-
-.row-fluid .offset5 {
- margin-left: 44.68085106382979%;
- *margin-left: 44.57446808510638%;
-}
-
-.row-fluid .offset5:first-child {
- margin-left: 42.5531914893617%;
- *margin-left: 42.4468085106383%;
-}
-
-.row-fluid .offset4 {
- margin-left: 36.170212765957444%;
- *margin-left: 36.06382978723405%;
-}
-
-.row-fluid .offset4:first-child {
- margin-left: 34.04255319148936%;
- *margin-left: 33.93617021276596%;
-}
-
-.row-fluid .offset3 {
- margin-left: 27.659574468085104%;
- *margin-left: 27.5531914893617%;
-}
-
-.row-fluid .offset3:first-child {
- margin-left: 25.53191489361702%;
- *margin-left: 25.425531914893618%;
-}
-
-.row-fluid .offset2 {
- margin-left: 19.148936170212764%;
- *margin-left: 19.04255319148936%;
-}
-
-.row-fluid .offset2:first-child {
- margin-left: 17.02127659574468%;
- *margin-left: 16.914893617021278%;
-}
-
-.row-fluid .offset1 {
- margin-left: 10.638297872340425%;
- *margin-left: 10.53191489361702%;
-}
-
-.row-fluid .offset1:first-child {
- margin-left: 8.51063829787234%;
- *margin-left: 8.404255319148938%;
-}
-
-[class*="span"].hide,
-.row-fluid [class*="span"].hide {
- display: none;
-}
-
-[class*="span"].pull-right,
-.row-fluid [class*="span"].pull-right {
- float: right;
-}
-
-.container {
- margin-right: auto;
- margin-left: auto;
- *zoom: 1;
-}
-
-.container:before,
-.container:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container:after {
- clear: both;
-}
-
-.container-fluid {
- padding-right: 20px;
- padding-left: 20px;
- *zoom: 1;
-}
-
-.container-fluid:before,
-.container-fluid:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.container-fluid:after {
- clear: both;
-}
-
-p {
- margin: 0 0 10px;
-}
-
-.lead {
- margin-bottom: 20px;
- font-size: 21px;
- font-weight: 200;
- line-height: 30px;
-}
-
-small {
- font-size: 85%;
-}
-
-strong {
- font-weight: bold;
-}
-
-em {
- font-style: italic;
-}
-
-cite {
- font-style: normal;
-}
-
-.muted {
- color: #999999;
-}
-
-.text-warning {
- color: #c09853;
-}
-
-.text-error {
- color: #b94a48;
-}
-
-.text-info {
- color: #3a87ad;
-}
-
-.text-success {
- color: #468847;
-}
-
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- margin: 10px 0;
- font-family: inherit;
- font-weight: bold;
- line-height: 1;
- color: inherit;
- text-rendering: optimizelegibility;
-}
-
-h1 small,
-h2 small,
-h3 small,
-h4 small,
-h5 small,
-h6 small {
- font-weight: normal;
- line-height: 1;
- color: #999999;
-}
-
-h1 {
- font-size: 36px;
- line-height: 40px;
-}
-
-h2 {
- font-size: 30px;
- line-height: 40px;
-}
-
-h3 {
- font-size: 24px;
- line-height: 40px;
-}
-
-h4 {
- font-size: 18px;
- line-height: 20px;
-}
-
-h5 {
- font-size: 14px;
- line-height: 20px;
-}
-
-h6 {
- font-size: 12px;
- line-height: 20px;
-}
-
-h1 small {
- font-size: 24px;
-}
-
-h2 small {
- font-size: 18px;
-}
-
-h3 small {
- font-size: 14px;
-}
-
-h4 small {
- font-size: 14px;
-}
-
-.page-header {
- padding-bottom: 9px;
- margin: 20px 0 30px;
- border-bottom: 1px solid #eeeeee;
-}
-
-ul,
-ol {
- padding: 0;
- margin: 0 0 10px 25px;
-}
-
-ul ul,
-ul ol,
-ol ol,
-ol ul {
- margin-bottom: 0;
-}
-
-li {
- line-height: 20px;
-}
-
-ul.unstyled,
-ol.unstyled {
- margin-left: 0;
- list-style: none;
-}
-
-dl {
- margin-bottom: 20px;
-}
-
-dt,
-dd {
- line-height: 20px;
-}
-
-dt {
- font-weight: bold;
-}
-
-dd {
- margin-left: 10px;
-}
-
-.dl-horizontal {
- *zoom: 1;
-}
-
-.dl-horizontal:before,
-.dl-horizontal:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.dl-horizontal:after {
- clear: both;
-}
-
-.dl-horizontal dt {
- float: left;
- width: 160px;
- overflow: hidden;
- clear: left;
- text-align: right;
- text-overflow: ellipsis;
- white-space: nowrap;
-}
-
-.dl-horizontal dd {
- margin-left: 180px;
-}
-
-hr {
- margin: 20px 0;
- border: 0;
- border-top: 1px solid #eeeeee;
- border-bottom: 1px solid #ffffff;
-}
-
-abbr[title] {
- cursor: help;
- border-bottom: 1px dotted #999999;
-}
-
-abbr.initialism {
- font-size: 90%;
- text-transform: uppercase;
-}
-
-blockquote {
- padding: 0 0 0 15px;
- margin: 0 0 20px;
- border-left: 5px solid #eeeeee;
-}
-
-blockquote p {
- margin-bottom: 0;
- font-size: 16px;
- font-weight: 300;
- line-height: 25px;
-}
-
-blockquote small {
- display: block;
- line-height: 20px;
- color: #999999;
-}
-
-blockquote small:before {
- content: '\2014 \00A0';
-}
-
-blockquote.pull-right {
- float: right;
- padding-right: 15px;
- padding-left: 0;
- border-right: 5px solid #eeeeee;
- border-left: 0;
-}
-
-blockquote.pull-right p,
-blockquote.pull-right small {
- text-align: right;
-}
-
-blockquote.pull-right small:before {
- content: '';
-}
-
-blockquote.pull-right small:after {
- content: '\00A0 \2014';
-}
-
-q:before,
-q:after,
-blockquote:before,
-blockquote:after {
- content: "";
-}
-
-address {
- display: block;
- margin-bottom: 20px;
- font-style: normal;
- line-height: 20px;
-}
-
-code,
-pre {
- padding: 0 3px 2px;
- font-family: Monaco, Menlo, Consolas, "Courier New", monospace;
- font-size: 12px;
- color: #333333;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-code {
- padding: 2px 4px;
- color: #d14;
- background-color: #f7f7f9;
- border: 1px solid #e1e1e8;
-}
-
-pre {
- display: block;
- padding: 9.5px;
- margin: 0 0 10px;
- font-size: 13px;
- line-height: 20px;
- word-break: break-all;
- word-wrap: break-word;
- white-space: pre;
- white-space: pre-wrap;
- background-color: #f5f5f5;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.15);
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-pre.prettyprint {
- margin-bottom: 20px;
-}
-
-pre code {
- padding: 0;
- color: inherit;
- background-color: transparent;
- border: 0;
-}
-
-.pre-scrollable {
- max-height: 340px;
- overflow-y: scroll;
-}
-
-form {
- margin: 0 0 20px;
-}
-
-fieldset {
- padding: 0;
- margin: 0;
- border: 0;
-}
-
-legend {
- display: block;
- width: 100%;
- padding: 0;
- margin-bottom: 20px;
- font-size: 21px;
- line-height: 40px;
- color: #333333;
- border: 0;
- border-bottom: 1px solid #e5e5e5;
-}
-
-legend small {
- font-size: 15px;
- color: #999999;
-}
-
-label,
-input,
-button,
-select,
-textarea {
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
-}
-
-input,
-button,
-select,
-textarea {
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
-}
-
-label {
- display: block;
- margin-bottom: 5px;
-}
-
-select,
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- display: inline-block;
- height: 20px;
- padding: 4px 6px;
- margin-bottom: 9px;
- font-size: 14px;
- line-height: 20px;
- color: #555555;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-input,
-textarea,
-.uneditable-input {
- width: 206px;
-}
-
-textarea {
- height: auto;
-}
-
-textarea,
-input[type="text"],
-input[type="password"],
-input[type="datetime"],
-input[type="datetime-local"],
-input[type="date"],
-input[type="month"],
-input[type="time"],
-input[type="week"],
-input[type="number"],
-input[type="email"],
-input[type="url"],
-input[type="search"],
-input[type="tel"],
-input[type="color"],
-.uneditable-input {
- background-color: #ffffff;
- border: 1px solid #cccccc;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -webkit-transition: border linear 0.2s, box-shadow linear 0.2s;
- -moz-transition: border linear 0.2s, box-shadow linear 0.2s;
- -o-transition: border linear 0.2s, box-shadow linear 0.2s;
- transition: border linear 0.2s, box-shadow linear 0.2s;
-}
-
-textarea:focus,
-input[type="text"]:focus,
-input[type="password"]:focus,
-input[type="datetime"]:focus,
-input[type="datetime-local"]:focus,
-input[type="date"]:focus,
-input[type="month"]:focus,
-input[type="time"]:focus,
-input[type="week"]:focus,
-input[type="number"]:focus,
-input[type="email"]:focus,
-input[type="url"]:focus,
-input[type="search"]:focus,
-input[type="tel"]:focus,
-input[type="color"]:focus,
-.uneditable-input:focus {
- border-color: rgba(82, 168, 236, 0.8);
- outline: 0;
- outline: thin dotted \9;
- /* IE6-9 */
-
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);
-}
-
-input[type="radio"],
-input[type="checkbox"] {
- margin: 4px 0 0;
- margin-top: 1px \9;
- *margin-top: 0;
- line-height: normal;
- cursor: pointer;
-}
-
-input[type="file"],
-input[type="image"],
-input[type="submit"],
-input[type="reset"],
-input[type="button"],
-input[type="radio"],
-input[type="checkbox"] {
- width: auto;
-}
-
-select,
-input[type="file"] {
- height: 30px;
- /* In IE7, the height of the select element cannot be changed by height, only font-size */
-
- *margin-top: 4px;
- /* For IE7, add top margin to align select with labels */
-
- line-height: 30px;
-}
-
-select {
- width: 220px;
- background-color: #ffffff;
- border: 1px solid #cccccc;
-}
-
-select[multiple],
-select[size] {
- height: auto;
-}
-
-select:focus,
-input[type="file"]:focus,
-input[type="radio"]:focus,
-input[type="checkbox"]:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.uneditable-input,
-.uneditable-textarea {
- color: #999999;
- cursor: not-allowed;
- background-color: #fcfcfc;
- border-color: #cccccc;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);
-}
-
-.uneditable-input {
- overflow: hidden;
- white-space: nowrap;
-}
-
-.uneditable-textarea {
- width: auto;
- height: auto;
-}
-
-input:-moz-placeholder,
-textarea:-moz-placeholder {
- color: #999999;
-}
-
-input:-ms-input-placeholder,
-textarea:-ms-input-placeholder {
- color: #999999;
-}
-
-input::-webkit-input-placeholder,
-textarea::-webkit-input-placeholder {
- color: #999999;
-}
-
-.radio,
-.checkbox {
- min-height: 18px;
- padding-left: 18px;
-}
-
-.radio input[type="radio"],
-.checkbox input[type="checkbox"] {
- float: left;
- margin-left: -18px;
-}
-
-.controls > .radio:first-child,
-.controls > .checkbox:first-child {
- padding-top: 5px;
-}
-
-.radio.inline,
-.checkbox.inline {
- display: inline-block;
- padding-top: 5px;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.radio.inline + .radio.inline,
-.checkbox.inline + .checkbox.inline {
- margin-left: 10px;
-}
-
-.input-mini {
- width: 60px;
-}
-
-.input-small {
- width: 90px;
-}
-
-.input-medium {
- width: 150px;
-}
-
-.input-large {
- width: 210px;
-}
-
-.input-xlarge {
- width: 270px;
-}
-
-.input-xxlarge {
- width: 530px;
-}
-
-input[class*="span"],
-select[class*="span"],
-textarea[class*="span"],
-.uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"] {
- float: none;
- margin-left: 0;
-}
-
-.input-append input[class*="span"],
-.input-append .uneditable-input[class*="span"],
-.input-prepend input[class*="span"],
-.input-prepend .uneditable-input[class*="span"],
-.row-fluid input[class*="span"],
-.row-fluid select[class*="span"],
-.row-fluid textarea[class*="span"],
-.row-fluid .uneditable-input[class*="span"],
-.row-fluid .input-prepend [class*="span"],
-.row-fluid .input-append [class*="span"] {
- display: inline-block;
-}
-
-input,
-textarea,
-.uneditable-input {
- margin-left: 0;
-}
-
-.controls-row [class*="span"] + [class*="span"] {
- margin-left: 20px;
-}
-
-input.span12,
-textarea.span12,
-.uneditable-input.span12 {
- width: 926px;
-}
-
-input.span11,
-textarea.span11,
-.uneditable-input.span11 {
- width: 846px;
-}
-
-input.span10,
-textarea.span10,
-.uneditable-input.span10 {
- width: 766px;
-}
-
-input.span9,
-textarea.span9,
-.uneditable-input.span9 {
- width: 686px;
-}
-
-input.span8,
-textarea.span8,
-.uneditable-input.span8 {
- width: 606px;
-}
-
-input.span7,
-textarea.span7,
-.uneditable-input.span7 {
- width: 526px;
-}
-
-input.span6,
-textarea.span6,
-.uneditable-input.span6 {
- width: 446px;
-}
-
-input.span5,
-textarea.span5,
-.uneditable-input.span5 {
- width: 366px;
-}
-
-input.span4,
-textarea.span4,
-.uneditable-input.span4 {
- width: 286px;
-}
-
-input.span3,
-textarea.span3,
-.uneditable-input.span3 {
- width: 206px;
-}
-
-input.span2,
-textarea.span2,
-.uneditable-input.span2 {
- width: 126px;
-}
-
-input.span1,
-textarea.span1,
-.uneditable-input.span1 {
- width: 46px;
-}
-
-.controls-row {
- *zoom: 1;
-}
-
-.controls-row:before,
-.controls-row:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.controls-row:after {
- clear: both;
-}
-
-.controls-row [class*="span"] {
- float: left;
-}
-
-input[disabled],
-select[disabled],
-textarea[disabled],
-input[readonly],
-select[readonly],
-textarea[readonly] {
- cursor: not-allowed;
- background-color: #eeeeee;
-}
-
-input[type="radio"][disabled],
-input[type="checkbox"][disabled],
-input[type="radio"][readonly],
-input[type="checkbox"][readonly] {
- background-color: transparent;
-}
-
-.control-group.warning > label,
-.control-group.warning .help-block,
-.control-group.warning .help-inline {
- color: #c09853;
-}
-
-.control-group.warning .checkbox,
-.control-group.warning .radio,
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- color: #c09853;
-}
-
-.control-group.warning input,
-.control-group.warning select,
-.control-group.warning textarea {
- border-color: #c09853;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.warning input:focus,
-.control-group.warning select:focus,
-.control-group.warning textarea:focus {
- border-color: #a47e3c;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e;
-}
-
-.control-group.warning .input-prepend .add-on,
-.control-group.warning .input-append .add-on {
- color: #c09853;
- background-color: #fcf8e3;
- border-color: #c09853;
-}
-
-.control-group.error > label,
-.control-group.error .help-block,
-.control-group.error .help-inline {
- color: #b94a48;
-}
-
-.control-group.error .checkbox,
-.control-group.error .radio,
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- color: #b94a48;
-}
-
-.control-group.error input,
-.control-group.error select,
-.control-group.error textarea {
- border-color: #b94a48;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.error input:focus,
-.control-group.error select:focus,
-.control-group.error textarea:focus {
- border-color: #953b39;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392;
-}
-
-.control-group.error .input-prepend .add-on,
-.control-group.error .input-append .add-on {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #b94a48;
-}
-
-.control-group.success > label,
-.control-group.success .help-block,
-.control-group.success .help-inline {
- color: #468847;
-}
-
-.control-group.success .checkbox,
-.control-group.success .radio,
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- color: #468847;
-}
-
-.control-group.success input,
-.control-group.success select,
-.control-group.success textarea {
- border-color: #468847;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.success input:focus,
-.control-group.success select:focus,
-.control-group.success textarea:focus {
- border-color: #356635;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b;
-}
-
-.control-group.success .input-prepend .add-on,
-.control-group.success .input-append .add-on {
- color: #468847;
- background-color: #dff0d8;
- border-color: #468847;
-}
-
-.control-group.info > label,
-.control-group.info .help-block,
-.control-group.info .help-inline {
- color: #3a87ad;
-}
-
-.control-group.info .checkbox,
-.control-group.info .radio,
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- color: #3a87ad;
-}
-
-.control-group.info input,
-.control-group.info select,
-.control-group.info textarea {
- border-color: #3a87ad;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);
-}
-
-.control-group.info input:focus,
-.control-group.info select:focus,
-.control-group.info textarea:focus {
- border-color: #2d6987;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3;
-}
-
-.control-group.info .input-prepend .add-on,
-.control-group.info .input-append .add-on {
- color: #3a87ad;
- background-color: #d9edf7;
- border-color: #3a87ad;
-}
-
-input:focus:required:invalid,
-textarea:focus:required:invalid,
-select:focus:required:invalid {
- color: #b94a48;
- border-color: #ee5f5b;
-}
-
-input:focus:required:invalid:focus,
-textarea:focus:required:invalid:focus,
-select:focus:required:invalid:focus {
- border-color: #e9322d;
- -webkit-box-shadow: 0 0 6px #f8b9b7;
- -moz-box-shadow: 0 0 6px #f8b9b7;
- box-shadow: 0 0 6px #f8b9b7;
-}
-
-.form-actions {
- padding: 19px 20px 20px;
- margin-top: 20px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border-top: 1px solid #e5e5e5;
- *zoom: 1;
-}
-
-.form-actions:before,
-.form-actions:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-actions:after {
- clear: both;
-}
-
-.help-block,
-.help-inline {
- color: #595959;
-}
-
-.help-block {
- display: block;
- margin-bottom: 10px;
-}
-
-.help-inline {
- display: inline-block;
- *display: inline;
- padding-left: 5px;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.input-append,
-.input-prepend {
- margin-bottom: 5px;
- font-size: 0;
- white-space: nowrap;
-}
-
-.input-append input,
-.input-prepend input,
-.input-append select,
-.input-prepend select,
-.input-append .uneditable-input,
-.input-prepend .uneditable-input {
- position: relative;
- margin-bottom: 0;
- *margin-left: 0;
- font-size: 14px;
- vertical-align: top;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-.input-append input:focus,
-.input-prepend input:focus,
-.input-append select:focus,
-.input-prepend select:focus,
-.input-append .uneditable-input:focus,
-.input-prepend .uneditable-input:focus {
- z-index: 2;
-}
-
-.input-append .add-on,
-.input-prepend .add-on {
- display: inline-block;
- width: auto;
- height: 20px;
- min-width: 16px;
- padding: 4px 5px;
- font-size: 14px;
- font-weight: normal;
- line-height: 20px;
- text-align: center;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #eeeeee;
- border: 1px solid #ccc;
-}
-
-.input-append .add-on,
-.input-prepend .add-on,
-.input-append .btn,
-.input-prepend .btn {
- vertical-align: top;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-append .active,
-.input-prepend .active {
- background-color: #a9dba9;
- border-color: #46a546;
-}
-
-.input-prepend .add-on,
-.input-prepend .btn {
- margin-right: -1px;
-}
-
-.input-prepend .add-on:first-child,
-.input-prepend .btn:first-child {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.input-append input,
-.input-append select,
-.input-append .uneditable-input {
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.input-append .add-on,
-.input-append .btn {
- margin-left: -1px;
-}
-
-.input-append .add-on:last-child,
-.input-append .btn:last-child {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-.input-prepend.input-append input,
-.input-prepend.input-append select,
-.input-prepend.input-append .uneditable-input {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.input-prepend.input-append .add-on:first-child,
-.input-prepend.input-append .btn:first-child {
- margin-right: -1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.input-prepend.input-append .add-on:last-child,
-.input-prepend.input-append .btn:last-child {
- margin-left: -1px;
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-input.search-query {
- padding-right: 14px;
- padding-right: 4px \9;
- padding-left: 14px;
- padding-left: 4px \9;
- /* IE7-8 doesn't have border-radius, so don't indent the padding */
-
- margin-bottom: 0;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-
-/* Allow for input prepend/append in search forms */
-
-.form-search .input-append .search-query,
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.form-search .input-append .search-query {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-
-.form-search .input-append .btn {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .search-query {
- -webkit-border-radius: 0 14px 14px 0;
- -moz-border-radius: 0 14px 14px 0;
- border-radius: 0 14px 14px 0;
-}
-
-.form-search .input-prepend .btn {
- -webkit-border-radius: 14px 0 0 14px;
- -moz-border-radius: 14px 0 0 14px;
- border-radius: 14px 0 0 14px;
-}
-
-.form-search input,
-.form-inline input,
-.form-horizontal input,
-.form-search textarea,
-.form-inline textarea,
-.form-horizontal textarea,
-.form-search select,
-.form-inline select,
-.form-horizontal select,
-.form-search .help-inline,
-.form-inline .help-inline,
-.form-horizontal .help-inline,
-.form-search .uneditable-input,
-.form-inline .uneditable-input,
-.form-horizontal .uneditable-input,
-.form-search .input-prepend,
-.form-inline .input-prepend,
-.form-horizontal .input-prepend,
-.form-search .input-append,
-.form-inline .input-append,
-.form-horizontal .input-append {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- vertical-align: middle;
- *zoom: 1;
-}
-
-.form-search .hide,
-.form-inline .hide,
-.form-horizontal .hide {
- display: none;
-}
-
-.form-search label,
-.form-inline label,
-.form-search .btn-group,
-.form-inline .btn-group {
- display: inline-block;
-}
-
-.form-search .input-append,
-.form-inline .input-append,
-.form-search .input-prepend,
-.form-inline .input-prepend {
- margin-bottom: 0;
-}
-
-.form-search .radio,
-.form-search .checkbox,
-.form-inline .radio,
-.form-inline .checkbox {
- padding-left: 0;
- margin-bottom: 0;
- vertical-align: middle;
-}
-
-.form-search .radio input[type="radio"],
-.form-search .checkbox input[type="checkbox"],
-.form-inline .radio input[type="radio"],
-.form-inline .checkbox input[type="checkbox"] {
- float: left;
- margin-right: 3px;
- margin-left: 0;
-}
-
-.control-group {
- margin-bottom: 10px;
-}
-
-legend + .control-group {
- margin-top: 20px;
- -webkit-margin-top-collapse: separate;
-}
-
-.form-horizontal .control-group {
- margin-bottom: 20px;
- *zoom: 1;
-}
-
-.form-horizontal .control-group:before,
-.form-horizontal .control-group:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.form-horizontal .control-group:after {
- clear: both;
-}
-
-.form-horizontal .control-label {
- float: left;
- width: 160px;
- padding-top: 5px;
- text-align: right;
-}
-
-.form-horizontal .controls {
- *display: inline-block;
- *padding-left: 20px;
- margin-left: 180px;
- *margin-left: 0;
-}
-
-.form-horizontal .controls:first-child {
- *padding-left: 180px;
-}
-
-.form-horizontal .help-block {
- margin-bottom: 0;
-}
-
-.form-horizontal input + .help-block,
-.form-horizontal select + .help-block,
-.form-horizontal textarea + .help-block {
- margin-top: 10px;
-}
-
-.form-horizontal .form-actions {
- padding-left: 180px;
-}
-
-table {
- max-width: 100%;
- background-color: transparent;
- border-collapse: collapse;
- border-spacing: 0;
-}
-
-.table {
- width: 100%;
- margin-bottom: 20px;
-}
-
-.table th,
-.table td {
- padding: 8px;
- line-height: 20px;
- text-align: left;
- vertical-align: top;
- border-top: 1px solid #dddddd;
-}
-
-.table th {
- font-weight: bold;
-}
-
-.table thead th {
- vertical-align: bottom;
-}
-
-.table caption + thead tr:first-child th,
-.table caption + thead tr:first-child td,
-.table colgroup + thead tr:first-child th,
-.table colgroup + thead tr:first-child td,
-.table thead:first-child tr:first-child th,
-.table thead:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table tbody + tbody {
- border-top: 2px solid #dddddd;
-}
-
-.table-condensed th,
-.table-condensed td {
- padding: 4px 5px;
-}
-
-.table-bordered {
- border: 1px solid #dddddd;
- border-collapse: separate;
- *border-collapse: collapse;
- border-left: 0;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.table-bordered th,
-.table-bordered td {
- border-left: 1px solid #dddddd;
-}
-
-.table-bordered caption + thead tr:first-child th,
-.table-bordered caption + tbody tr:first-child th,
-.table-bordered caption + tbody tr:first-child td,
-.table-bordered colgroup + thead tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child th,
-.table-bordered colgroup + tbody tr:first-child td,
-.table-bordered thead:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child th,
-.table-bordered tbody:first-child tr:first-child td {
- border-top: 0;
-}
-
-.table-bordered thead:first-child tr:first-child th:first-child,
-.table-bordered tbody:first-child tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered thead:first-child tr:first-child th:last-child,
-.table-bordered tbody:first-child tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-radius-topright: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child th:first-child,
-.table-bordered tbody:last-child tr:last-child td:first-child,
-.table-bordered tfoot:last-child tr:last-child td:first-child {
- -webkit-border-radius: 0 0 0 4px;
- -moz-border-radius: 0 0 0 4px;
- border-radius: 0 0 0 4px;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
-}
-
-.table-bordered thead:last-child tr:last-child th:last-child,
-.table-bordered tbody:last-child tr:last-child td:last-child,
-.table-bordered tfoot:last-child tr:last-child td:last-child {
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -moz-border-radius-bottomright: 4px;
-}
-
-.table-bordered caption + thead tr:first-child th:first-child,
-.table-bordered caption + tbody tr:first-child td:first-child,
-.table-bordered colgroup + thead tr:first-child th:first-child,
-.table-bordered colgroup + tbody tr:first-child td:first-child {
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.table-bordered caption + thead tr:first-child th:last-child,
-.table-bordered caption + tbody tr:first-child td:last-child,
-.table-bordered colgroup + thead tr:first-child th:last-child,
-.table-bordered colgroup + tbody tr:first-child td:last-child {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.table-striped tbody tr:nth-child(odd) td,
-.table-striped tbody tr:nth-child(odd) th {
- background-color: #f9f9f9;
-}
-
-.table-hover tbody tr:hover td,
-.table-hover tbody tr:hover th {
- background-color: #f5f5f5;
-}
-
-table [class*=span],
-.row-fluid table [class*=span] {
- display: table-cell;
- float: none;
- margin-left: 0;
-}
-
-.table .span1 {
- float: none;
- width: 44px;
- margin-left: 0;
-}
-
-.table .span2 {
- float: none;
- width: 124px;
- margin-left: 0;
-}
-
-.table .span3 {
- float: none;
- width: 204px;
- margin-left: 0;
-}
-
-.table .span4 {
- float: none;
- width: 284px;
- margin-left: 0;
-}
-
-.table .span5 {
- float: none;
- width: 364px;
- margin-left: 0;
-}
-
-.table .span6 {
- float: none;
- width: 444px;
- margin-left: 0;
-}
-
-.table .span7 {
- float: none;
- width: 524px;
- margin-left: 0;
-}
-
-.table .span8 {
- float: none;
- width: 604px;
- margin-left: 0;
-}
-
-.table .span9 {
- float: none;
- width: 684px;
- margin-left: 0;
-}
-
-.table .span10 {
- float: none;
- width: 764px;
- margin-left: 0;
-}
-
-.table .span11 {
- float: none;
- width: 844px;
- margin-left: 0;
-}
-
-.table .span12 {
- float: none;
- width: 924px;
- margin-left: 0;
-}
-
-.table .span13 {
- float: none;
- width: 1004px;
- margin-left: 0;
-}
-
-.table .span14 {
- float: none;
- width: 1084px;
- margin-left: 0;
-}
-
-.table .span15 {
- float: none;
- width: 1164px;
- margin-left: 0;
-}
-
-.table .span16 {
- float: none;
- width: 1244px;
- margin-left: 0;
-}
-
-.table .span17 {
- float: none;
- width: 1324px;
- margin-left: 0;
-}
-
-.table .span18 {
- float: none;
- width: 1404px;
- margin-left: 0;
-}
-
-.table .span19 {
- float: none;
- width: 1484px;
- margin-left: 0;
-}
-
-.table .span20 {
- float: none;
- width: 1564px;
- margin-left: 0;
-}
-
-.table .span21 {
- float: none;
- width: 1644px;
- margin-left: 0;
-}
-
-.table .span22 {
- float: none;
- width: 1724px;
- margin-left: 0;
-}
-
-.table .span23 {
- float: none;
- width: 1804px;
- margin-left: 0;
-}
-
-.table .span24 {
- float: none;
- width: 1884px;
- margin-left: 0;
-}
-
-.table tbody tr.success td {
- background-color: #dff0d8;
-}
-
-.table tbody tr.error td {
- background-color: #f2dede;
-}
-
-.table tbody tr.warning td {
- background-color: #fcf8e3;
-}
-
-.table tbody tr.info td {
- background-color: #d9edf7;
-}
-
-.table-hover tbody tr.success:hover td {
- background-color: #d0e9c6;
-}
-
-.table-hover tbody tr.error:hover td {
- background-color: #ebcccc;
-}
-
-.table-hover tbody tr.warning:hover td {
- background-color: #faf2cc;
-}
-
-.table-hover tbody tr.info:hover td {
- background-color: #c4e3f3;
-}
-
-[class^="icon-"],
-[class*=" icon-"] {
- display: inline-block;
- width: 14px;
- height: 14px;
- margin-top: 1px;
- *margin-right: .3em;
- line-height: 14px;
- vertical-align: text-top;
- background-image: url("../img/glyphicons-halflings.png");
- background-position: 14px 14px;
- background-repeat: no-repeat;
-}
-
-/* White icons with optional class, or on hover/active states of certain elements */
-
-.icon-white,
-.nav-tabs > .active > a > [class^="icon-"],
-.nav-tabs > .active > a > [class*=" icon-"],
-.nav-pills > .active > a > [class^="icon-"],
-.nav-pills > .active > a > [class*=" icon-"],
-.nav-list > .active > a > [class^="icon-"],
-.nav-list > .active > a > [class*=" icon-"],
-.navbar-inverse .nav > .active > a > [class^="icon-"],
-.navbar-inverse .nav > .active > a > [class*=" icon-"],
-.dropdown-menu > li > a:hover > [class^="icon-"],
-.dropdown-menu > li > a:hover > [class*=" icon-"],
-.dropdown-menu > .active > a > [class^="icon-"],
-.dropdown-menu > .active > a > [class*=" icon-"] {
- background-image: url("../img/glyphicons-halflings-white.png");
-}
-
-.icon-glass {
- background-position: 0 0;
-}
-
-.icon-music {
- background-position: -24px 0;
-}
-
-.icon-search {
- background-position: -48px 0;
-}
-
-.icon-envelope {
- background-position: -72px 0;
-}
-
-.icon-heart {
- background-position: -96px 0;
-}
-
-.icon-star {
- background-position: -120px 0;
-}
-
-.icon-star-empty {
- background-position: -144px 0;
-}
-
-.icon-user {
- background-position: -168px 0;
-}
-
-.icon-film {
- background-position: -192px 0;
-}
-
-.icon-th-large {
- background-position: -216px 0;
-}
-
-.icon-th {
- background-position: -240px 0;
-}
-
-.icon-th-list {
- background-position: -264px 0;
-}
-
-.icon-ok {
- background-position: -288px 0;
-}
-
-.icon-remove {
- background-position: -312px 0;
-}
-
-.icon-zoom-in {
- background-position: -336px 0;
-}
-
-.icon-zoom-out {
- background-position: -360px 0;
-}
-
-.icon-off {
- background-position: -384px 0;
-}
-
-.icon-signal {
- background-position: -408px 0;
-}
-
-.icon-cog {
- background-position: -432px 0;
-}
-
-.icon-trash {
- background-position: -456px 0;
-}
-
-.icon-home {
- background-position: 0 -24px;
-}
-
-.icon-file {
- background-position: -24px -24px;
-}
-
-.icon-time {
- background-position: -48px -24px;
-}
-
-.icon-road {
- background-position: -72px -24px;
-}
-
-.icon-download-alt {
- background-position: -96px -24px;
-}
-
-.icon-download {
- background-position: -120px -24px;
-}
-
-.icon-upload {
- background-position: -144px -24px;
-}
-
-.icon-inbox {
- background-position: -168px -24px;
-}
-
-.icon-play-circle {
- background-position: -192px -24px;
-}
-
-.icon-repeat {
- background-position: -216px -24px;
-}
-
-.icon-refresh {
- background-position: -240px -24px;
-}
-
-.icon-list-alt {
- background-position: -264px -24px;
-}
-
-.icon-lock {
- background-position: -287px -24px;
-}
-
-.icon-flag {
- background-position: -312px -24px;
-}
-
-.icon-headphones {
- background-position: -336px -24px;
-}
-
-.icon-volume-off {
- background-position: -360px -24px;
-}
-
-.icon-volume-down {
- background-position: -384px -24px;
-}
-
-.icon-volume-up {
- background-position: -408px -24px;
-}
-
-.icon-qrcode {
- background-position: -432px -24px;
-}
-
-.icon-barcode {
- background-position: -456px -24px;
-}
-
-.icon-tag {
- background-position: 0 -48px;
-}
-
-.icon-tags {
- background-position: -25px -48px;
-}
-
-.icon-book {
- background-position: -48px -48px;
-}
-
-.icon-bookmark {
- background-position: -72px -48px;
-}
-
-.icon-print {
- background-position: -96px -48px;
-}
-
-.icon-camera {
- background-position: -120px -48px;
-}
-
-.icon-font {
- background-position: -144px -48px;
-}
-
-.icon-bold {
- background-position: -167px -48px;
-}
-
-.icon-italic {
- background-position: -192px -48px;
-}
-
-.icon-text-height {
- background-position: -216px -48px;
-}
-
-.icon-text-width {
- background-position: -240px -48px;
-}
-
-.icon-align-left {
- background-position: -264px -48px;
-}
-
-.icon-align-center {
- background-position: -288px -48px;
-}
-
-.icon-align-right {
- background-position: -312px -48px;
-}
-
-.icon-align-justify {
- background-position: -336px -48px;
-}
-
-.icon-list {
- background-position: -360px -48px;
-}
-
-.icon-indent-left {
- background-position: -384px -48px;
-}
-
-.icon-indent-right {
- background-position: -408px -48px;
-}
-
-.icon-facetime-video {
- background-position: -432px -48px;
-}
-
-.icon-picture {
- background-position: -456px -48px;
-}
-
-.icon-pencil {
- background-position: 0 -72px;
-}
-
-.icon-map-marker {
- background-position: -24px -72px;
-}
-
-.icon-adjust {
- background-position: -48px -72px;
-}
-
-.icon-tint {
- background-position: -72px -72px;
-}
-
-.icon-edit {
- background-position: -96px -72px;
-}
-
-.icon-share {
- background-position: -120px -72px;
-}
-
-.icon-check {
- background-position: -144px -72px;
-}
-
-.icon-move {
- background-position: -168px -72px;
-}
-
-.icon-step-backward {
- background-position: -192px -72px;
-}
-
-.icon-fast-backward {
- background-position: -216px -72px;
-}
-
-.icon-backward {
- background-position: -240px -72px;
-}
-
-.icon-play {
- background-position: -264px -72px;
-}
-
-.icon-pause {
- background-position: -288px -72px;
-}
-
-.icon-stop {
- background-position: -312px -72px;
-}
-
-.icon-forward {
- background-position: -336px -72px;
-}
-
-.icon-fast-forward {
- background-position: -360px -72px;
-}
-
-.icon-step-forward {
- background-position: -384px -72px;
-}
-
-.icon-eject {
- background-position: -408px -72px;
-}
-
-.icon-chevron-left {
- background-position: -432px -72px;
-}
-
-.icon-chevron-right {
- background-position: -456px -72px;
-}
-
-.icon-plus-sign {
- background-position: 0 -96px;
-}
-
-.icon-minus-sign {
- background-position: -24px -96px;
-}
-
-.icon-remove-sign {
- background-position: -48px -96px;
-}
-
-.icon-ok-sign {
- background-position: -72px -96px;
-}
-
-.icon-question-sign {
- background-position: -96px -96px;
-}
-
-.icon-info-sign {
- background-position: -120px -96px;
-}
-
-.icon-screenshot {
- background-position: -144px -96px;
-}
-
-.icon-remove-circle {
- background-position: -168px -96px;
-}
-
-.icon-ok-circle {
- background-position: -192px -96px;
-}
-
-.icon-ban-circle {
- background-position: -216px -96px;
-}
-
-.icon-arrow-left {
- background-position: -240px -96px;
-}
-
-.icon-arrow-right {
- background-position: -264px -96px;
-}
-
-.icon-arrow-up {
- background-position: -289px -96px;
-}
-
-.icon-arrow-down {
- background-position: -312px -96px;
-}
-
-.icon-share-alt {
- background-position: -336px -96px;
-}
-
-.icon-resize-full {
- background-position: -360px -96px;
-}
-
-.icon-resize-small {
- background-position: -384px -96px;
-}
-
-.icon-plus {
- background-position: -408px -96px;
-}
-
-.icon-minus {
- background-position: -433px -96px;
-}
-
-.icon-asterisk {
- background-position: -456px -96px;
-}
-
-.icon-exclamation-sign {
- background-position: 0 -120px;
-}
-
-.icon-gift {
- background-position: -24px -120px;
-}
-
-.icon-leaf {
- background-position: -48px -120px;
-}
-
-.icon-fire {
- background-position: -72px -120px;
-}
-
-.icon-eye-open {
- background-position: -96px -120px;
-}
-
-.icon-eye-close {
- background-position: -120px -120px;
-}
-
-.icon-warning-sign {
- background-position: -144px -120px;
-}
-
-.icon-plane {
- background-position: -168px -120px;
-}
-
-.icon-calendar {
- background-position: -192px -120px;
-}
-
-.icon-random {
- width: 16px;
- background-position: -216px -120px;
-}
-
-.icon-comment {
- background-position: -240px -120px;
-}
-
-.icon-magnet {
- background-position: -264px -120px;
-}
-
-.icon-chevron-up {
- background-position: -288px -120px;
-}
-
-.icon-chevron-down {
- background-position: -313px -119px;
-}
-
-.icon-retweet {
- background-position: -336px -120px;
-}
-
-.icon-shopping-cart {
- background-position: -360px -120px;
-}
-
-.icon-folder-close {
- background-position: -384px -120px;
-}
-
-.icon-folder-open {
- width: 16px;
- background-position: -408px -120px;
-}
-
-.icon-resize-vertical {
- background-position: -432px -119px;
-}
-
-.icon-resize-horizontal {
- background-position: -456px -118px;
-}
-
-.icon-hdd {
- background-position: 0 -144px;
-}
-
-.icon-bullhorn {
- background-position: -24px -144px;
-}
-
-.icon-bell {
- background-position: -48px -144px;
-}
-
-.icon-certificate {
- background-position: -72px -144px;
-}
-
-.icon-thumbs-up {
- background-position: -96px -144px;
-}
-
-.icon-thumbs-down {
- background-position: -120px -144px;
-}
-
-.icon-hand-right {
- background-position: -144px -144px;
-}
-
-.icon-hand-left {
- background-position: -168px -144px;
-}
-
-.icon-hand-up {
- background-position: -192px -144px;
-}
-
-.icon-hand-down {
- background-position: -216px -144px;
-}
-
-.icon-circle-arrow-right {
- background-position: -240px -144px;
-}
-
-.icon-circle-arrow-left {
- background-position: -264px -144px;
-}
-
-.icon-circle-arrow-up {
- background-position: -288px -144px;
-}
-
-.icon-circle-arrow-down {
- background-position: -312px -144px;
-}
-
-.icon-globe {
- background-position: -336px -144px;
-}
-
-.icon-wrench {
- background-position: -360px -144px;
-}
-
-.icon-tasks {
- background-position: -384px -144px;
-}
-
-.icon-filter {
- background-position: -408px -144px;
-}
-
-.icon-briefcase {
- background-position: -432px -144px;
-}
-
-.icon-fullscreen {
- background-position: -456px -144px;
-}
-
-.dropup,
-.dropdown {
- position: relative;
-}
-
-.dropdown-toggle {
- *margin-bottom: -3px;
-}
-
-.dropdown-toggle:active,
-.open .dropdown-toggle {
- outline: 0;
-}
-
-.caret {
- display: inline-block;
- width: 0;
- height: 0;
- vertical-align: top;
- border-top: 4px solid #000000;
- border-right: 4px solid transparent;
- border-left: 4px solid transparent;
- content: "";
-}
-
-.dropdown .caret {
- margin-top: 8px;
- margin-left: 2px;
-}
-
-.dropdown-menu {
- position: absolute;
- top: 100%;
- left: 0;
- z-index: 1000;
- display: none;
- float: left;
- min-width: 160px;
- padding: 5px 0;
- margin: 2px 0 0;
- list-style: none;
- background-color: #ffffff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- *border-right-width: 2px;
- *border-bottom-width: 2px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.dropdown-menu .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-
-.dropdown-menu a {
- display: block;
- padding: 3px 20px;
- clear: both;
- font-weight: normal;
- line-height: 20px;
- color: #333333;
- white-space: nowrap;
-}
-
-.dropdown-menu li > a:hover,
-.dropdown-menu li > a:focus,
-.dropdown-submenu:hover > a {
- color: #ffffff;
- text-decoration: none;
- background-color: #0088cc;
- background-color: #0081c2;
- background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
- background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
- background-image: -o-linear-gradient(top, #0088cc, #0077b3);
- background-image: linear-gradient(to bottom, #0088cc, #0077b3);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu .active > a,
-.dropdown-menu .active > a:hover {
- color: #ffffff;
- text-decoration: none;
- background-color: #0088cc;
- background-color: #0081c2;
- background-image: linear-gradient(to bottom, #0088cc, #0077b3);
- background-image: -moz-linear-gradient(top, #0088cc, #0077b3);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));
- background-image: -webkit-linear-gradient(top, #0088cc, #0077b3);
- background-image: -o-linear-gradient(top, #0088cc, #0077b3);
- background-repeat: repeat-x;
- outline: 0;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);
-}
-
-.dropdown-menu .disabled > a,
-.dropdown-menu .disabled > a:hover {
- color: #999999;
-}
-
-.dropdown-menu .disabled > a:hover {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
-}
-
-.open {
- *z-index: 1000;
-}
-
-.open > .dropdown-menu {
- display: block;
-}
-
-.pull-right > .dropdown-menu {
- right: 0;
- left: auto;
-}
-
-.dropup .caret,
-.navbar-fixed-bottom .dropdown .caret {
- border-top: 0;
- border-bottom: 4px solid #000000;
- content: "";
-}
-
-.dropup .dropdown-menu,
-.navbar-fixed-bottom .dropdown .dropdown-menu {
- top: auto;
- bottom: 100%;
- margin-bottom: 1px;
-}
-
-.dropdown-submenu {
- position: relative;
-}
-
-.dropdown-submenu > .dropdown-menu {
- top: 0;
- left: 100%;
- margin-top: -6px;
- margin-left: -1px;
- -webkit-border-radius: 0 6px 6px 6px;
- -moz-border-radius: 0 6px 6px 6px;
- border-radius: 0 6px 6px 6px;
-}
-
-.dropdown-submenu:hover > .dropdown-menu {
- display: block;
-}
-
-.dropdown-submenu > a:after {
- display: block;
- float: right;
- width: 0;
- height: 0;
- margin-top: 5px;
- margin-right: -10px;
- border-color: transparent;
- border-left-color: #cccccc;
- border-style: solid;
- border-width: 5px 0 5px 5px;
- content: " ";
-}
-
-.dropdown-submenu:hover > a:after {
- border-left-color: #ffffff;
-}
-
-.dropdown .dropdown-menu .nav-header {
- padding-right: 20px;
- padding-left: 20px;
-}
-
-.typeahead {
- margin-top: 2px;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.well {
- min-height: 20px;
- padding: 19px;
- margin-bottom: 20px;
- background-color: #f5f5f5;
- border: 1px solid #e3e3e3;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);
-}
-
-.well blockquote {
- border-color: #ddd;
- border-color: rgba(0, 0, 0, 0.15);
-}
-
-.well-large {
- padding: 24px;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.well-small {
- padding: 9px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-.fade {
- opacity: 0;
- -webkit-transition: opacity 0.15s linear;
- -moz-transition: opacity 0.15s linear;
- -o-transition: opacity 0.15s linear;
- transition: opacity 0.15s linear;
-}
-
-.fade.in {
- opacity: 1;
-}
-
-.collapse {
- position: relative;
- height: 0;
- overflow: hidden;
- -webkit-transition: height 0.35s ease;
- -moz-transition: height 0.35s ease;
- -o-transition: height 0.35s ease;
- transition: height 0.35s ease;
-}
-
-.collapse.in {
- height: auto;
-}
-
-.close {
- float: right;
- font-size: 20px;
- font-weight: bold;
- line-height: 20px;
- color: #000000;
- text-shadow: 0 1px 0 #ffffff;
- opacity: 0.2;
- filter: alpha(opacity=20);
-}
-
-.close:hover {
- color: #000000;
- text-decoration: none;
- cursor: pointer;
- opacity: 0.4;
- filter: alpha(opacity=40);
-}
-
-button.close {
- padding: 0;
- cursor: pointer;
- background: transparent;
- border: 0;
- -webkit-appearance: none;
-}
-
-.btn {
- display: inline-block;
- *display: inline;
- padding: 4px 14px;
- margin-bottom: 0;
- *margin-left: .3em;
- font-size: 14px;
- line-height: 20px;
- *line-height: 20px;
- color: #333333;
- text-align: center;
- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);
- vertical-align: middle;
- cursor: pointer;
- background-color: #f5f5f5;
- *background-color: #e6e6e6;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));
- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);
- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6);
- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);
- background-repeat: repeat-x;
- border: 1px solid #bbbbbb;
- *border: 0;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- border-color: #e6e6e6 #e6e6e6 #bfbfbf;
- border-bottom-color: #a2a2a2;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
- *zoom: 1;
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn:hover,
-.btn:active,
-.btn.active,
-.btn.disabled,
-.btn[disabled] {
- color: #333333;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
-}
-
-.btn:active,
-.btn.active {
- background-color: #cccccc \9;
-}
-
-.btn:first-child {
- *margin-left: 0;
-}
-
-.btn:hover {
- color: #333333;
- text-decoration: none;
- background-color: #e6e6e6;
- *background-color: #d9d9d9;
- /* Buttons in IE7 don't get borders, so darken on hover */
-
- background-position: 0 -15px;
- -webkit-transition: background-position 0.1s linear;
- -moz-transition: background-position 0.1s linear;
- -o-transition: background-position 0.1s linear;
- transition: background-position 0.1s linear;
-}
-
-.btn:focus {
- outline: thin dotted #333;
- outline: 5px auto -webkit-focus-ring-color;
- outline-offset: -2px;
-}
-
-.btn.active,
-.btn:active {
- background-color: #e6e6e6;
- background-color: #d9d9d9 \9;
- background-image: none;
- outline: 0;
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn.disabled,
-.btn[disabled] {
- cursor: default;
- background-color: #e6e6e6;
- background-image: none;
- opacity: 0.65;
- filter: alpha(opacity=65);
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-large {
- padding: 9px 14px;
- font-size: 16px;
- line-height: normal;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.btn-large [class^="icon-"] {
- margin-top: 2px;
-}
-
-.btn-small {
- padding: 3px 9px;
- font-size: 12px;
- line-height: 18px;
-}
-
-.btn-small [class^="icon-"] {
- margin-top: 0;
-}
-
-.btn-mini {
- padding: 2px 6px;
- font-size: 11px;
- line-height: 17px;
-}
-
-.btn-block {
- display: block;
- width: 100%;
- padding-right: 0;
- padding-left: 0;
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
-}
-
-.btn-block + .btn-block {
- margin-top: 5px;
-}
-
-input[type="submit"].btn-block,
-input[type="reset"].btn-block,
-input[type="button"].btn-block {
- width: 100%;
-}
-
-.btn-primary.active,
-.btn-warning.active,
-.btn-danger.active,
-.btn-success.active,
-.btn-info.active,
-.btn-inverse.active {
- color: rgba(255, 255, 255, 0.75);
-}
-
-.btn {
- border-color: #c5c5c5;
- border-color: rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.15) rgba(0, 0, 0, 0.25);
-}
-
-.btn-primary {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #006dcc;
- *background-color: #0044cc;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));
- background-image: -webkit-linear-gradient(top, #0088cc, #0044cc);
- background-image: -o-linear-gradient(top, #0088cc, #0044cc);
- background-image: linear-gradient(to bottom, #0088cc, #0044cc);
- background-image: -moz-linear-gradient(top, #0088cc, #0044cc);
- background-repeat: repeat-x;
- border-color: #0044cc #0044cc #002a80;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-primary:hover,
-.btn-primary:active,
-.btn-primary.active,
-.btn-primary.disabled,
-.btn-primary[disabled] {
- color: #ffffff;
- background-color: #0044cc;
- *background-color: #003bb3;
-}
-
-.btn-primary:active,
-.btn-primary.active {
- background-color: #003399 \9;
-}
-
-.btn-warning {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #faa732;
- *background-color: #f89406;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-repeat: repeat-x;
- border-color: #f89406 #f89406 #ad6704;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-warning:hover,
-.btn-warning:active,
-.btn-warning.active,
-.btn-warning.disabled,
-.btn-warning[disabled] {
- color: #ffffff;
- background-color: #f89406;
- *background-color: #df8505;
-}
-
-.btn-warning:active,
-.btn-warning.active {
- background-color: #c67605 \9;
-}
-
-.btn-danger {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #da4f49;
- *background-color: #bd362f;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);
- background-image: linear-gradient(to bottom, #ee5f5b, #bd362f);
- background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);
- background-repeat: repeat-x;
- border-color: #bd362f #bd362f #802420;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-danger:hover,
-.btn-danger:active,
-.btn-danger.active,
-.btn-danger.disabled,
-.btn-danger[disabled] {
- color: #ffffff;
- background-color: #bd362f;
- *background-color: #a9302a;
-}
-
-.btn-danger:active,
-.btn-danger.active {
- background-color: #942a25 \9;
-}
-
-.btn-success {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #5bb75b;
- *background-color: #51a351;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));
- background-image: -webkit-linear-gradient(top, #62c462, #51a351);
- background-image: -o-linear-gradient(top, #62c462, #51a351);
- background-image: linear-gradient(to bottom, #62c462, #51a351);
- background-image: -moz-linear-gradient(top, #62c462, #51a351);
- background-repeat: repeat-x;
- border-color: #51a351 #51a351 #387038;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-success:hover,
-.btn-success:active,
-.btn-success.active,
-.btn-success.disabled,
-.btn-success[disabled] {
- color: #ffffff;
- background-color: #51a351;
- *background-color: #499249;
-}
-
-.btn-success:active,
-.btn-success.active {
- background-color: #408140 \9;
-}
-
-.btn-info {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #49afcd;
- *background-color: #2f96b4;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));
- background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);
- background-image: linear-gradient(to bottom, #5bc0de, #2f96b4);
- background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);
- background-repeat: repeat-x;
- border-color: #2f96b4 #2f96b4 #1f6377;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-info:hover,
-.btn-info:active,
-.btn-info.active,
-.btn-info.disabled,
-.btn-info[disabled] {
- color: #ffffff;
- background-color: #2f96b4;
- *background-color: #2a85a0;
-}
-
-.btn-info:active,
-.btn-info.active {
- background-color: #24748c \9;
-}
-
-.btn-inverse {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #363636;
- *background-color: #222222;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));
- background-image: -webkit-linear-gradient(top, #444444, #222222);
- background-image: -o-linear-gradient(top, #444444, #222222);
- background-image: linear-gradient(to bottom, #444444, #222222);
- background-image: -moz-linear-gradient(top, #444444, #222222);
- background-repeat: repeat-x;
- border-color: #222222 #222222 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.btn-inverse:hover,
-.btn-inverse:active,
-.btn-inverse.active,
-.btn-inverse.disabled,
-.btn-inverse[disabled] {
- color: #ffffff;
- background-color: #222222;
- *background-color: #151515;
-}
-
-.btn-inverse:active,
-.btn-inverse.active {
- background-color: #080808 \9;
-}
-
-button.btn,
-input[type="submit"].btn {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-
-button.btn::-moz-focus-inner,
-input[type="submit"].btn::-moz-focus-inner {
- padding: 0;
- border: 0;
-}
-
-button.btn.btn-large,
-input[type="submit"].btn.btn-large {
- *padding-top: 7px;
- *padding-bottom: 7px;
-}
-
-button.btn.btn-small,
-input[type="submit"].btn.btn-small {
- *padding-top: 3px;
- *padding-bottom: 3px;
-}
-
-button.btn.btn-mini,
-input[type="submit"].btn.btn-mini {
- *padding-top: 1px;
- *padding-bottom: 1px;
-}
-
-.btn-link,
-.btn-link:active,
-.btn-link[disabled] {
- background-color: transparent;
- background-image: none;
- -webkit-box-shadow: none;
- -moz-box-shadow: none;
- box-shadow: none;
-}
-
-.btn-link {
- color: #0088cc;
- cursor: pointer;
- border-color: transparent;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-link:hover {
- color: #005580;
- text-decoration: underline;
- background-color: transparent;
-}
-
-.btn-link[disabled]:hover {
- color: #333333;
- text-decoration: none;
-}
-
-.btn-group {
- position: relative;
- *margin-left: .3em;
- font-size: 0;
- white-space: nowrap;
- vertical-align: middle;
-}
-
-.btn-group:first-child {
- *margin-left: 0;
-}
-
-.btn-group + .btn-group {
- margin-left: 5px;
-}
-
-.btn-toolbar {
- margin-top: 10px;
- margin-bottom: 10px;
- font-size: 0;
-}
-
-.btn-toolbar .btn-group {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-
-.btn-toolbar .btn + .btn,
-.btn-toolbar .btn-group + .btn,
-.btn-toolbar .btn + .btn-group {
- margin-left: 5px;
-}
-
-.btn-group > .btn {
- position: relative;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group > .btn + .btn {
- margin-left: -1px;
-}
-
-.btn-group > .btn,
-.btn-group > .dropdown-menu {
- font-size: 14px;
-}
-
-.btn-group > .btn-mini {
- font-size: 11px;
-}
-
-.btn-group > .btn-small {
- font-size: 12px;
-}
-
-.btn-group > .btn-large {
- font-size: 16px;
-}
-
-.btn-group > .btn:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-bottomleft: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.btn-group > .btn:last-child,
-.btn-group > .dropdown-toggle {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -moz-border-radius-topright: 4px;
- -moz-border-radius-bottomright: 4px;
-}
-
-.btn-group > .btn.large:first-child {
- margin-left: 0;
- -webkit-border-bottom-left-radius: 6px;
- border-bottom-left-radius: 6px;
- -webkit-border-top-left-radius: 6px;
- border-top-left-radius: 6px;
- -moz-border-radius-bottomleft: 6px;
- -moz-border-radius-topleft: 6px;
-}
-
-.btn-group > .btn.large:last-child,
-.btn-group > .large.dropdown-toggle {
- -webkit-border-top-right-radius: 6px;
- border-top-right-radius: 6px;
- -webkit-border-bottom-right-radius: 6px;
- border-bottom-right-radius: 6px;
- -moz-border-radius-topright: 6px;
- -moz-border-radius-bottomright: 6px;
-}
-
-.btn-group > .btn:hover,
-.btn-group > .btn:focus,
-.btn-group > .btn:active,
-.btn-group > .btn.active {
- z-index: 2;
-}
-
-.btn-group .dropdown-toggle:active,
-.btn-group.open .dropdown-toggle {
- outline: 0;
-}
-
-.btn-group > .btn + .dropdown-toggle {
- *padding-top: 5px;
- padding-right: 8px;
- *padding-bottom: 5px;
- padding-left: 8px;
- -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group > .btn-mini + .dropdown-toggle {
- *padding-top: 2px;
- padding-right: 5px;
- *padding-bottom: 2px;
- padding-left: 5px;
-}
-
-.btn-group > .btn-small + .dropdown-toggle {
- *padding-top: 5px;
- *padding-bottom: 4px;
-}
-
-.btn-group > .btn-large + .dropdown-toggle {
- *padding-top: 7px;
- padding-right: 12px;
- *padding-bottom: 7px;
- padding-left: 12px;
-}
-
-.btn-group.open .dropdown-toggle {
- background-image: none;
- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.btn-group.open .btn.dropdown-toggle {
- background-color: #e6e6e6;
-}
-
-.btn-group.open .btn-primary.dropdown-toggle {
- background-color: #0044cc;
-}
-
-.btn-group.open .btn-warning.dropdown-toggle {
- background-color: #f89406;
-}
-
-.btn-group.open .btn-danger.dropdown-toggle {
- background-color: #bd362f;
-}
-
-.btn-group.open .btn-success.dropdown-toggle {
- background-color: #51a351;
-}
-
-.btn-group.open .btn-info.dropdown-toggle {
- background-color: #2f96b4;
-}
-
-.btn-group.open .btn-inverse.dropdown-toggle {
- background-color: #222222;
-}
-
-.btn .caret {
- margin-top: 8px;
- margin-left: 0;
-}
-
-.btn-mini .caret,
-.btn-small .caret,
-.btn-large .caret {
- margin-top: 6px;
-}
-
-.btn-large .caret {
- border-top-width: 5px;
- border-right-width: 5px;
- border-left-width: 5px;
-}
-
-.dropup .btn-large .caret {
- border-top: 0;
- border-bottom: 5px solid #000000;
-}
-
-.btn-primary .caret,
-.btn-warning .caret,
-.btn-danger .caret,
-.btn-info .caret,
-.btn-success .caret,
-.btn-inverse .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.btn-group-vertical {
- display: inline-block;
- *display: inline;
- /* IE7 inline-block hack */
-
- *zoom: 1;
-}
-
-.btn-group-vertical .btn {
- display: block;
- float: none;
- width: 100%;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.btn-group-vertical .btn + .btn {
- margin-top: -1px;
- margin-left: 0;
-}
-
-.btn-group-vertical .btn:first-child {
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-
-.btn-group-vertical .btn:last-child {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-
-.btn-group-vertical .btn-large:first-child {
- -webkit-border-radius: 6px 6px 0 0;
- -moz-border-radius: 6px 6px 0 0;
- border-radius: 6px 6px 0 0;
-}
-
-.btn-group-vertical .btn-large:last-child {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-
-.alert {
- padding: 8px 35px 8px 14px;
- margin-bottom: 20px;
- color: #c09853;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- background-color: #fcf8e3;
- border: 1px solid #fbeed5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.alert h4 {
- margin: 0;
-}
-
-.alert .close {
- position: relative;
- top: -2px;
- right: -21px;
- line-height: 20px;
-}
-
-.alert-success {
- color: #468847;
- background-color: #dff0d8;
- border-color: #d6e9c6;
-}
-
-.alert-danger,
-.alert-error {
- color: #b94a48;
- background-color: #f2dede;
- border-color: #eed3d7;
-}
-
-.alert-info {
- color: #3a87ad;
- background-color: #d9edf7;
- border-color: #bce8f1;
-}
-
-.alert-block {
- padding-top: 14px;
- padding-bottom: 14px;
-}
-
-.alert-block > p,
-.alert-block > ul {
- margin-bottom: 0;
-}
-
-.alert-block p + p {
- margin-top: 5px;
-}
-
-.nav {
- margin-bottom: 20px;
- margin-left: 0;
- list-style: none;
-}
-
-.nav > li > a {
- display: block;
-}
-
-.nav > li > a:hover {
- text-decoration: none;
- background-color: #eeeeee;
-}
-
-.nav > .pull-right {
- float: right;
-}
-
-.nav-header {
- display: block;
- padding: 3px 15px;
- font-size: 11px;
- font-weight: bold;
- line-height: 20px;
- color: #999999;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
- text-transform: uppercase;
-}
-
-.nav li + .nav-header {
- margin-top: 9px;
-}
-
-.nav-list {
- padding-right: 15px;
- padding-left: 15px;
- margin-bottom: 0;
-}
-
-.nav-list > li > a,
-.nav-list .nav-header {
- margin-right: -15px;
- margin-left: -15px;
- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);
-}
-
-.nav-list > li > a {
- padding: 3px 15px;
-}
-
-.nav-list > .active > a,
-.nav-list > .active > a:hover {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
- background-color: #0088cc;
-}
-
-.nav-list [class^="icon-"] {
- margin-right: 2px;
-}
-
-.nav-list .divider {
- *width: 100%;
- height: 1px;
- margin: 9px 1px;
- *margin: -5px 0 5px;
- overflow: hidden;
- background-color: #e5e5e5;
- border-bottom: 1px solid #ffffff;
-}
-
-.nav-tabs,
-.nav-pills {
- *zoom: 1;
-}
-
-.nav-tabs:before,
-.nav-pills:before,
-.nav-tabs:after,
-.nav-pills:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.nav-tabs:after,
-.nav-pills:after {
- clear: both;
-}
-
-.nav-tabs > li,
-.nav-pills > li {
- float: left;
-}
-
-.nav-tabs > li > a,
-.nav-pills > li > a {
- padding-right: 12px;
- padding-left: 12px;
- margin-right: 2px;
- line-height: 14px;
-}
-
-.nav-tabs {
- border-bottom: 1px solid #ddd;
-}
-
-.nav-tabs > li {
- margin-bottom: -1px;
-}
-
-.nav-tabs > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- line-height: 20px;
- border: 1px solid transparent;
- -webkit-border-radius: 4px 4px 0 0;
- -moz-border-radius: 4px 4px 0 0;
- border-radius: 4px 4px 0 0;
-}
-
-.nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #dddddd;
-}
-
-.nav-tabs > .active > a,
-.nav-tabs > .active > a:hover {
- color: #555555;
- cursor: default;
- background-color: #ffffff;
- border: 1px solid #ddd;
- border-bottom-color: transparent;
-}
-
-.nav-pills > li > a {
- padding-top: 8px;
- padding-bottom: 8px;
- margin-top: 2px;
- margin-bottom: 2px;
- -webkit-border-radius: 5px;
- -moz-border-radius: 5px;
- border-radius: 5px;
-}
-
-.nav-pills > .active > a,
-.nav-pills > .active > a:hover {
- color: #ffffff;
- background-color: #0088cc;
-}
-
-.nav-stacked > li {
- float: none;
-}
-
-.nav-stacked > li > a {
- margin-right: 0;
-}
-
-.nav-tabs.nav-stacked {
- border-bottom: 0;
-}
-
-.nav-tabs.nav-stacked > li > a {
- border: 1px solid #ddd;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.nav-tabs.nav-stacked > li:first-child > a {
- -webkit-border-top-right-radius: 4px;
- border-top-right-radius: 4px;
- -webkit-border-top-left-radius: 4px;
- border-top-left-radius: 4px;
- -moz-border-radius-topright: 4px;
- -moz-border-radius-topleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li:last-child > a {
- -webkit-border-bottom-right-radius: 4px;
- border-bottom-right-radius: 4px;
- -webkit-border-bottom-left-radius: 4px;
- border-bottom-left-radius: 4px;
- -moz-border-radius-bottomright: 4px;
- -moz-border-radius-bottomleft: 4px;
-}
-
-.nav-tabs.nav-stacked > li > a:hover {
- z-index: 2;
- border-color: #ddd;
-}
-
-.nav-pills.nav-stacked > li > a {
- margin-bottom: 3px;
-}
-
-.nav-pills.nav-stacked > li:last-child > a {
- margin-bottom: 1px;
-}
-
-.nav-tabs .dropdown-menu {
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
-}
-
-.nav-pills .dropdown-menu {
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.nav .dropdown-toggle .caret {
- margin-top: 6px;
- border-top-color: #0088cc;
- border-bottom-color: #0088cc;
-}
-
-.nav .dropdown-toggle:hover .caret {
- border-top-color: #005580;
- border-bottom-color: #005580;
-}
-
-/* move down carets for tabs */
-
-.nav-tabs .dropdown-toggle .caret {
- margin-top: 8px;
-}
-
-.nav .active .dropdown-toggle .caret {
- border-top-color: #fff;
- border-bottom-color: #fff;
-}
-
-.nav-tabs .active .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-
-.nav > .dropdown.active > a:hover {
- cursor: pointer;
-}
-
-.nav-tabs .open .dropdown-toggle,
-.nav-pills .open .dropdown-toggle,
-.nav > li.dropdown.open.active > a:hover {
- color: #ffffff;
- background-color: #999999;
- border-color: #999999;
-}
-
-.nav li.dropdown.open .caret,
-.nav li.dropdown.open.active .caret,
-.nav li.dropdown.open a:hover .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
- opacity: 1;
- filter: alpha(opacity=100);
-}
-
-.tabs-stacked .open > a:hover {
- border-color: #999999;
-}
-
-.tabbable {
- *zoom: 1;
-}
-
-.tabbable:before,
-.tabbable:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.tabbable:after {
- clear: both;
-}
-
-.tab-content {
- overflow: auto;
-}
-
-.tabs-below > .nav-tabs,
-.tabs-right > .nav-tabs,
-.tabs-left > .nav-tabs {
- border-bottom: 0;
-}
-
-.tab-content > .tab-pane,
-.pill-content > .pill-pane {
- display: none;
-}
-
-.tab-content > .active,
-.pill-content > .active {
- display: block;
-}
-
-.tabs-below > .nav-tabs {
- border-top: 1px solid #ddd;
-}
-
-.tabs-below > .nav-tabs > li {
- margin-top: -1px;
- margin-bottom: 0;
-}
-
-.tabs-below > .nav-tabs > li > a {
- -webkit-border-radius: 0 0 4px 4px;
- -moz-border-radius: 0 0 4px 4px;
- border-radius: 0 0 4px 4px;
-}
-
-.tabs-below > .nav-tabs > li > a:hover {
- border-top-color: #ddd;
- border-bottom-color: transparent;
-}
-
-.tabs-below > .nav-tabs > .active > a,
-.tabs-below > .nav-tabs > .active > a:hover {
- border-color: transparent #ddd #ddd #ddd;
-}
-
-.tabs-left > .nav-tabs > li,
-.tabs-right > .nav-tabs > li {
- float: none;
-}
-
-.tabs-left > .nav-tabs > li > a,
-.tabs-right > .nav-tabs > li > a {
- min-width: 74px;
- margin-right: 0;
- margin-bottom: 3px;
-}
-
-.tabs-left > .nav-tabs {
- float: left;
- margin-right: 19px;
- border-right: 1px solid #ddd;
-}
-
-.tabs-left > .nav-tabs > li > a {
- margin-right: -1px;
- -webkit-border-radius: 4px 0 0 4px;
- -moz-border-radius: 4px 0 0 4px;
- border-radius: 4px 0 0 4px;
-}
-
-.tabs-left > .nav-tabs > li > a:hover {
- border-color: #eeeeee #dddddd #eeeeee #eeeeee;
-}
-
-.tabs-left > .nav-tabs .active > a,
-.tabs-left > .nav-tabs .active > a:hover {
- border-color: #ddd transparent #ddd #ddd;
- *border-right-color: #ffffff;
-}
-
-.tabs-right > .nav-tabs {
- float: right;
- margin-left: 19px;
- border-left: 1px solid #ddd;
-}
-
-.tabs-right > .nav-tabs > li > a {
- margin-left: -1px;
- -webkit-border-radius: 0 4px 4px 0;
- -moz-border-radius: 0 4px 4px 0;
- border-radius: 0 4px 4px 0;
-}
-
-.tabs-right > .nav-tabs > li > a:hover {
- border-color: #eeeeee #eeeeee #eeeeee #dddddd;
-}
-
-.tabs-right > .nav-tabs .active > a,
-.tabs-right > .nav-tabs .active > a:hover {
- border-color: #ddd #ddd #ddd transparent;
- *border-left-color: #ffffff;
-}
-
-.nav > .disabled > a {
- color: #999999;
-}
-
-.nav > .disabled > a:hover {
- text-decoration: none;
- cursor: default;
- background-color: transparent;
-}
-
-.navbar {
- *position: relative;
- *z-index: 2;
- margin-bottom: 20px;
- overflow: visible;
- color: #777777;
-}
-
-.navbar-inner {
- min-height: 40px;
- padding-right: 20px;
- padding-left: 20px;
- background-color: #fafafa;
- background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));
- background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: -o-linear-gradient(top, #ffffff, #f2f2f2);
- background-image: linear-gradient(to bottom, #ffffff, #f2f2f2);
- background-repeat: repeat-x;
- border: 1px solid #d4d4d4;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);
- *zoom: 1;
- -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065);
-}
-
-.navbar-inner:before,
-.navbar-inner:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.navbar-inner:after {
- clear: both;
-}
-
-.navbar .container {
- width: auto;
-}
-
-.nav-collapse.collapse {
- height: auto;
-}
-
-.navbar .brand {
- display: block;
- float: left;
- padding: 10px 20px 10px;
- margin-left: -20px;
- font-size: 20px;
- font-weight: 200;
- color: #777777;
- text-shadow: 0 1px 0 #ffffff;
-}
-
-.navbar .brand:hover {
- text-decoration: none;
-}
-
-.navbar-text {
- margin-bottom: 0;
- line-height: 40px;
-}
-
-.navbar-link {
- color: #777777;
-}
-
-.navbar-link:hover {
- color: #333333;
-}
-
-.navbar .divider-vertical {
- height: 40px;
- margin: 0 9px;
- border-right: 1px solid #ffffff;
- border-left: 1px solid #f2f2f2;
-}
-
-.navbar .btn,
-.navbar .btn-group {
- margin-top: 5px;
-}
-
-.navbar .btn-group .btn,
-.navbar .input-prepend .btn,
-.navbar .input-append .btn {
- margin-top: 0;
-}
-
-.navbar-form {
- margin-bottom: 0;
- *zoom: 1;
-}
-
-.navbar-form:before,
-.navbar-form:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.navbar-form:after {
- clear: both;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .radio,
-.navbar-form .checkbox {
- margin-top: 5px;
-}
-
-.navbar-form input,
-.navbar-form select,
-.navbar-form .btn {
- display: inline-block;
- margin-bottom: 0;
-}
-
-.navbar-form input[type="image"],
-.navbar-form input[type="checkbox"],
-.navbar-form input[type="radio"] {
- margin-top: 3px;
-}
-
-.navbar-form .input-append,
-.navbar-form .input-prepend {
- margin-top: 6px;
- white-space: nowrap;
-}
-
-.navbar-form .input-append input,
-.navbar-form .input-prepend input {
- margin-top: 0;
-}
-
-.navbar-search {
- position: relative;
- float: left;
- margin-top: 5px;
- margin-bottom: 0;
-}
-
-.navbar-search .search-query {
- padding: 4px 14px;
- margin-bottom: 0;
- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
- font-size: 13px;
- font-weight: normal;
- line-height: 1;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-
-.navbar-static-top {
- position: static;
- width: 100%;
- margin-bottom: 0;
-}
-
-.navbar-static-top .navbar-inner {
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-fixed-top,
-.navbar-fixed-bottom {
- position: fixed;
- right: 0;
- left: 0;
- z-index: 1030;
- margin-bottom: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- border-width: 0 0 1px;
-}
-
-.navbar-fixed-bottom .navbar-inner {
- border-width: 1px 0 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-fixed-bottom .navbar-inner {
- padding-right: 0;
- padding-left: 0;
- -webkit-border-radius: 0;
- -moz-border-radius: 0;
- border-radius: 0;
-}
-
-.navbar-static-top .container,
-.navbar-fixed-top .container,
-.navbar-fixed-bottom .container {
- width: 940px;
-}
-
-.navbar-fixed-top {
- top: 0;
-}
-
-.navbar-fixed-top .navbar-inner,
-.navbar-static-top .navbar-inner {
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar-fixed-bottom {
- bottom: 0;
-}
-
-.navbar-fixed-bottom .navbar-inner {
- -webkit-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 0 rgba(0, 0, 0, 0.1), 0 -1px 10px rgba(0, 0, 0, 0.1);
-}
-
-.navbar .nav {
- position: relative;
- left: 0;
- display: block;
- float: left;
- margin: 0 10px 0 0;
-}
-
-.navbar .nav.pull-right {
- float: right;
- margin-right: 0;
-}
-
-.navbar .nav > li {
- float: left;
-}
-
-.navbar .nav > li > a {
- float: none;
- padding: 10px 15px 10px;
- color: #777777;
- text-decoration: none;
- text-shadow: 0 1px 0 #ffffff;
-}
-
-.navbar .nav .dropdown-toggle .caret {
- margin-top: 8px;
-}
-
-.navbar .nav > li > a:focus,
-.navbar .nav > li > a:hover {
- color: #333333;
- text-decoration: none;
- background-color: transparent;
-}
-
-.navbar .nav > .active > a,
-.navbar .nav > .active > a:hover,
-.navbar .nav > .active > a:focus {
- color: #555555;
- text-decoration: none;
- background-color: #e5e5e5;
- -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
- box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125);
-}
-
-.navbar .btn-navbar {
- display: none;
- float: right;
- padding: 7px 10px;
- margin-right: 5px;
- margin-left: 5px;
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #ededed;
- *background-color: #e5e5e5;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));
- background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5);
- background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5);
- background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5);
- background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5);
- background-repeat: repeat-x;
- border-color: #e5e5e5 #e5e5e5 #bfbfbf;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);
-}
-
-.navbar .btn-navbar:hover,
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active,
-.navbar .btn-navbar.disabled,
-.navbar .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #e5e5e5;
- *background-color: #d9d9d9;
-}
-
-.navbar .btn-navbar:active,
-.navbar .btn-navbar.active {
- background-color: #cccccc \9;
-}
-
-.navbar .btn-navbar .icon-bar {
- display: block;
- width: 18px;
- height: 2px;
- background-color: #f5f5f5;
- -webkit-border-radius: 1px;
- -moz-border-radius: 1px;
- border-radius: 1px;
- -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.btn-navbar .icon-bar + .icon-bar {
- margin-top: 3px;
-}
-
-.navbar .nav > li > .dropdown-menu:before {
- position: absolute;
- top: -7px;
- left: 9px;
- display: inline-block;
- border-right: 7px solid transparent;
- border-bottom: 7px solid #ccc;
- border-left: 7px solid transparent;
- border-bottom-color: rgba(0, 0, 0, 0.2);
- content: '';
-}
-
-.navbar .nav > li > .dropdown-menu:after {
- position: absolute;
- top: -6px;
- left: 10px;
- display: inline-block;
- border-right: 6px solid transparent;
- border-bottom: 6px solid #ffffff;
- border-left: 6px solid transparent;
- content: '';
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:before {
- top: auto;
- bottom: -7px;
- border-top: 7px solid #ccc;
- border-bottom: 0;
- border-top-color: rgba(0, 0, 0, 0.2);
-}
-
-.navbar-fixed-bottom .nav > li > .dropdown-menu:after {
- top: auto;
- bottom: -6px;
- border-top: 6px solid #ffffff;
- border-bottom: 0;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle,
-.navbar .nav li.dropdown.active > .dropdown-toggle,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle {
- color: #555555;
- background-color: #e5e5e5;
-}
-
-.navbar .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #777777;
- border-bottom-color: #777777;
-}
-
-.navbar .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #555555;
- border-bottom-color: #555555;
-}
-
-.navbar .pull-right > li > .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right {
- right: 0;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:before,
-.navbar .nav > li > .dropdown-menu.pull-right:before {
- right: 12px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu:after,
-.navbar .nav > li > .dropdown-menu.pull-right:after {
- right: 13px;
- left: auto;
-}
-
-.navbar .pull-right > li > .dropdown-menu .dropdown-menu,
-.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu {
- right: 100%;
- left: auto;
- margin-right: -1px;
- margin-left: 0;
- -webkit-border-radius: 6px 0 6px 6px;
- -moz-border-radius: 6px 0 6px 6px;
- border-radius: 6px 0 6px 6px;
-}
-
-.navbar-inverse {
- color: #999999;
-}
-
-.navbar-inverse .navbar-inner {
- background-color: #1b1b1b;
- background-image: -moz-linear-gradient(top, #222222, #111111);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));
- background-image: -webkit-linear-gradient(top, #222222, #111111);
- background-image: -o-linear-gradient(top, #222222, #111111);
- background-image: linear-gradient(to bottom, #222222, #111111);
- background-repeat: repeat-x;
- border-color: #252525;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);
-}
-
-.navbar-inverse .brand,
-.navbar-inverse .nav > li > a {
- color: #999999;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
-}
-
-.navbar-inverse .brand:hover,
-.navbar-inverse .nav > li > a:hover {
- color: #ffffff;
-}
-
-.navbar-inverse .nav > li > a:focus,
-.navbar-inverse .nav > li > a:hover {
- color: #ffffff;
- background-color: transparent;
-}
-
-.navbar-inverse .nav .active > a,
-.navbar-inverse .nav .active > a:hover,
-.navbar-inverse .nav .active > a:focus {
- color: #ffffff;
- background-color: #111111;
-}
-
-.navbar-inverse .navbar-link {
- color: #999999;
-}
-
-.navbar-inverse .navbar-link:hover {
- color: #ffffff;
-}
-
-.navbar-inverse .divider-vertical {
- border-right-color: #222222;
- border-left-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle {
- color: #ffffff;
- background-color: #111111;
-}
-
-.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret {
- border-top-color: #999999;
- border-bottom-color: #999999;
-}
-
-.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret,
-.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret {
- border-top-color: #ffffff;
- border-bottom-color: #ffffff;
-}
-
-.navbar-inverse .navbar-search .search-query {
- color: #ffffff;
- background-color: #515151;
- border-color: #111111;
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);
- -webkit-transition: none;
- -moz-transition: none;
- -o-transition: none;
- transition: none;
-}
-
-.navbar-inverse .navbar-search .search-query:-moz-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:-ms-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder {
- color: #cccccc;
-}
-
-.navbar-inverse .navbar-search .search-query:focus,
-.navbar-inverse .navbar-search .search-query.focused {
- padding: 5px 15px;
- color: #333333;
- text-shadow: 0 1px 0 #ffffff;
- background-color: #ffffff;
- border: 0;
- outline: 0;
- -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
- box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);
-}
-
-.navbar-inverse .btn-navbar {
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e0e0e;
- *background-color: #040404;
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));
- background-image: -webkit-linear-gradient(top, #151515, #040404);
- background-image: -o-linear-gradient(top, #151515, #040404);
- background-image: linear-gradient(to bottom, #151515, #040404);
- background-image: -moz-linear-gradient(top, #151515, #040404);
- background-repeat: repeat-x;
- border-color: #040404 #040404 #000000;
- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);
- filter: progid:dximagetransform.microsoft.gradient(enabled=false);
-}
-
-.navbar-inverse .btn-navbar:hover,
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active,
-.navbar-inverse .btn-navbar.disabled,
-.navbar-inverse .btn-navbar[disabled] {
- color: #ffffff;
- background-color: #040404;
- *background-color: #000000;
-}
-
-.navbar-inverse .btn-navbar:active,
-.navbar-inverse .btn-navbar.active {
- background-color: #000000 \9;
-}
-
-.breadcrumb {
- padding: 8px 15px;
- margin: 0 0 20px;
- list-style: none;
- background-color: #f5f5f5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.breadcrumb li {
- display: inline-block;
- *display: inline;
- text-shadow: 0 1px 0 #ffffff;
- *zoom: 1;
-}
-
-.breadcrumb .divider {
- padding: 0 5px;
- color: #ccc;
-}
-
-.breadcrumb .active {
- color: #999999;
-}
-
-.pagination {
- height: 40px;
- margin: 20px 0;
-}
-
-.pagination ul {
- display: inline-block;
- *display: inline;
- margin-bottom: 0;
- margin-left: 0;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
- *zoom: 1;
- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
-}
-
-.pagination ul > li {
- display: inline;
-}
-
-.pagination ul > li > a,
-.pagination ul > li > span {
- float: left;
- padding: 0 14px;
- line-height: 38px;
- text-decoration: none;
- background-color: #ffffff;
- border: 1px solid #dddddd;
- border-left-width: 0;
-}
-
-.pagination ul > li > a:hover,
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- background-color: #f5f5f5;
-}
-
-.pagination ul > .active > a,
-.pagination ul > .active > span {
- color: #999999;
- cursor: default;
-}
-
-.pagination ul > .disabled > span,
-.pagination ul > .disabled > a,
-.pagination ul > .disabled > a:hover {
- color: #999999;
- cursor: default;
- background-color: transparent;
-}
-
-.pagination ul > li:first-child > a,
-.pagination ul > li:first-child > span {
- border-left-width: 1px;
- -webkit-border-radius: 3px 0 0 3px;
- -moz-border-radius: 3px 0 0 3px;
- border-radius: 3px 0 0 3px;
-}
-
-.pagination ul > li:last-child > a,
-.pagination ul > li:last-child > span {
- -webkit-border-radius: 0 3px 3px 0;
- -moz-border-radius: 0 3px 3px 0;
- border-radius: 0 3px 3px 0;
-}
-
-.pagination-centered {
- text-align: center;
-}
-
-.pagination-right {
- text-align: right;
-}
-
-.pager {
- margin: 20px 0;
- text-align: center;
- list-style: none;
- *zoom: 1;
-}
-
-.pager:before,
-.pager:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.pager:after {
- clear: both;
-}
-
-.pager li {
- display: inline;
-}
-
-.pager a,
-.pager span {
- display: inline-block;
- padding: 5px 14px;
- background-color: #fff;
- border: 1px solid #ddd;
- -webkit-border-radius: 15px;
- -moz-border-radius: 15px;
- border-radius: 15px;
-}
-
-.pager a:hover {
- text-decoration: none;
- background-color: #f5f5f5;
-}
-
-.pager .next a,
-.pager .next span {
- float: right;
-}
-
-.pager .previous a {
- float: left;
-}
-
-.pager .disabled a,
-.pager .disabled a:hover,
-.pager .disabled span {
- color: #999999;
- cursor: default;
- background-color: #fff;
-}
-
-.modal-open .modal .dropdown-menu {
- z-index: 2050;
-}
-
-.modal-open .modal .dropdown.open {
- *z-index: 2050;
-}
-
-.modal-open .modal .popover {
- z-index: 2060;
-}
-
-.modal-open .modal .tooltip {
- z-index: 2080;
-}
-
-.modal-backdrop {
- position: fixed;
- top: 0;
- right: 0;
- bottom: 0;
- left: 0;
- z-index: 1040;
- background-color: #000000;
-}
-
-.modal-backdrop.fade {
- opacity: 0;
-}
-
-.modal-backdrop,
-.modal-backdrop.fade.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.modal {
- position: fixed;
- top: 50%;
- left: 50%;
- z-index: 1050;
- width: 560px;
- margin: -250px 0 0 -280px;
- overflow: auto;
- background-color: #ffffff;
- border: 1px solid #999;
- border: 1px solid rgba(0, 0, 0, 0.3);
- *border: 1px solid #999;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding-box;
- background-clip: padding-box;
-}
-
-.modal.fade {
- top: -25%;
- -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;
- -moz-transition: opacity 0.3s linear, top 0.3s ease-out;
- -o-transition: opacity 0.3s linear, top 0.3s ease-out;
- transition: opacity 0.3s linear, top 0.3s ease-out;
-}
-
-.modal.fade.in {
- top: 50%;
-}
-
-.modal-header {
- padding: 9px 15px;
- border-bottom: 1px solid #eee;
-}
-
-.modal-header .close {
- margin-top: 2px;
-}
-
-.modal-header h3 {
- margin: 0;
- line-height: 30px;
-}
-
-.modal-body {
- max-height: 400px;
- padding: 15px;
- overflow-y: auto;
-}
-
-.modal-form {
- margin-bottom: 0;
-}
-
-.modal-footer {
- padding: 14px 15px 15px;
- margin-bottom: 0;
- text-align: right;
- background-color: #f5f5f5;
- border-top: 1px solid #ddd;
- -webkit-border-radius: 0 0 6px 6px;
- -moz-border-radius: 0 0 6px 6px;
- border-radius: 0 0 6px 6px;
- *zoom: 1;
- -webkit-box-shadow: inset 0 1px 0 #ffffff;
- -moz-box-shadow: inset 0 1px 0 #ffffff;
- box-shadow: inset 0 1px 0 #ffffff;
-}
-
-.modal-footer:before,
-.modal-footer:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.modal-footer:after {
- clear: both;
-}
-
-.modal-footer .btn + .btn {
- margin-bottom: 0;
- margin-left: 5px;
-}
-
-.modal-footer .btn-group .btn + .btn {
- margin-left: -1px;
-}
-
-.tooltip {
- position: absolute;
- z-index: 1030;
- display: block;
- padding: 5px;
- font-size: 11px;
- opacity: 0;
- filter: alpha(opacity=0);
- visibility: visible;
-}
-
-.tooltip.in {
- opacity: 0.8;
- filter: alpha(opacity=80);
-}
-
-.tooltip.top {
- margin-top: -3px;
-}
-
-.tooltip.right {
- margin-left: 3px;
-}
-
-.tooltip.bottom {
- margin-top: 3px;
-}
-
-.tooltip.left {
- margin-left: -3px;
-}
-
-.tooltip-inner {
- max-width: 200px;
- padding: 3px 8px;
- color: #ffffff;
- text-align: center;
- text-decoration: none;
- background-color: #000000;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.tooltip-arrow {
- position: absolute;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.tooltip.top .tooltip-arrow {
- bottom: 0;
- left: 50%;
- margin-left: -5px;
- border-top-color: #000000;
- border-width: 5px 5px 0;
-}
-
-.tooltip.right .tooltip-arrow {
- top: 50%;
- left: 0;
- margin-top: -5px;
- border-right-color: #000000;
- border-width: 5px 5px 5px 0;
-}
-
-.tooltip.left .tooltip-arrow {
- top: 50%;
- right: 0;
- margin-top: -5px;
- border-left-color: #000000;
- border-width: 5px 0 5px 5px;
-}
-
-.tooltip.bottom .tooltip-arrow {
- top: 0;
- left: 50%;
- margin-left: -5px;
- border-bottom-color: #000000;
- border-width: 0 5px 5px;
-}
-
-.popover {
- position: absolute;
- top: 0;
- left: 0;
- z-index: 1010;
- display: none;
- width: 236px;
- padding: 1px;
- background-color: #ffffff;
- border: 1px solid #ccc;
- border: 1px solid rgba(0, 0, 0, 0.2);
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);
- -webkit-background-clip: padding-box;
- -moz-background-clip: padding;
- background-clip: padding-box;
-}
-
-.popover.top {
- margin-bottom: 10px;
-}
-
-.popover.right {
- margin-left: 10px;
-}
-
-.popover.bottom {
- margin-top: 10px;
-}
-
-.popover.left {
- margin-right: 10px;
-}
-
-.popover-title {
- padding: 8px 14px;
- margin: 0;
- font-size: 14px;
- font-weight: normal;
- line-height: 18px;
- background-color: #f7f7f7;
- border-bottom: 1px solid #ebebeb;
- -webkit-border-radius: 5px 5px 0 0;
- -moz-border-radius: 5px 5px 0 0;
- border-radius: 5px 5px 0 0;
-}
-
-.popover-content {
- padding: 9px 14px;
-}
-
-.popover-content p,
-.popover-content ul,
-.popover-content ol {
- margin-bottom: 0;
-}
-
-.popover .arrow,
-.popover .arrow:after {
- position: absolute;
- display: inline-block;
- width: 0;
- height: 0;
- border-color: transparent;
- border-style: solid;
-}
-
-.popover .arrow:after {
- z-index: -1;
- content: "";
-}
-
-.popover.top .arrow {
- bottom: -10px;
- left: 50%;
- margin-left: -10px;
- border-top-color: #ffffff;
- border-width: 10px 10px 0;
-}
-
-.popover.top .arrow:after {
- bottom: -1px;
- left: -11px;
- border-top-color: rgba(0, 0, 0, 0.25);
- border-width: 11px 11px 0;
-}
-
-.popover.right .arrow {
- top: 50%;
- left: -10px;
- margin-top: -10px;
- border-right-color: #ffffff;
- border-width: 10px 10px 10px 0;
-}
-
-.popover.right .arrow:after {
- bottom: -11px;
- left: -1px;
- border-right-color: rgba(0, 0, 0, 0.25);
- border-width: 11px 11px 11px 0;
-}
-
-.popover.bottom .arrow {
- top: -10px;
- left: 50%;
- margin-left: -10px;
- border-bottom-color: #ffffff;
- border-width: 0 10px 10px;
-}
-
-.popover.bottom .arrow:after {
- top: -1px;
- left: -11px;
- border-bottom-color: rgba(0, 0, 0, 0.25);
- border-width: 0 11px 11px;
-}
-
-.popover.left .arrow {
- top: 50%;
- right: -10px;
- margin-top: -10px;
- border-left-color: #ffffff;
- border-width: 10px 0 10px 10px;
-}
-
-.popover.left .arrow:after {
- right: -1px;
- bottom: -11px;
- border-left-color: rgba(0, 0, 0, 0.25);
- border-width: 11px 0 11px 11px;
-}
-
-.thumbnails {
- margin-left: -20px;
- list-style: none;
- *zoom: 1;
-}
-
-.thumbnails:before,
-.thumbnails:after {
- display: table;
- line-height: 0;
- content: "";
-}
-
-.thumbnails:after {
- clear: both;
-}
-
-.row-fluid .thumbnails {
- margin-left: 0;
-}
-
-.thumbnails > li {
- float: left;
- margin-bottom: 20px;
- margin-left: 20px;
-}
-
-.thumbnail {
- display: block;
- padding: 4px;
- line-height: 20px;
- border: 1px solid #ddd;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055);
- -webkit-transition: all 0.2s ease-in-out;
- -moz-transition: all 0.2s ease-in-out;
- -o-transition: all 0.2s ease-in-out;
- transition: all 0.2s ease-in-out;
-}
-
-a.thumbnail:hover {
- border-color: #0088cc;
- -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
- box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);
-}
-
-.thumbnail > img {
- display: block;
- max-width: 100%;
- margin-right: auto;
- margin-left: auto;
-}
-
-.thumbnail .caption {
- padding: 9px;
- color: #555555;
-}
-
-.label,
-.badge {
- font-size: 11.844px;
- font-weight: bold;
- line-height: 14px;
- color: #ffffff;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- white-space: nowrap;
- vertical-align: baseline;
- background-color: #999999;
-}
-
-.label {
- padding: 1px 4px 2px;
- -webkit-border-radius: 3px;
- -moz-border-radius: 3px;
- border-radius: 3px;
-}
-
-.badge {
- padding: 1px 9px 2px;
- -webkit-border-radius: 9px;
- -moz-border-radius: 9px;
- border-radius: 9px;
-}
-
-a.label:hover,
-a.badge:hover {
- color: #ffffff;
- text-decoration: none;
- cursor: pointer;
-}
-
-.label-important,
-.badge-important {
- background-color: #b94a48;
-}
-
-.label-important[href],
-.badge-important[href] {
- background-color: #953b39;
-}
-
-.label-warning,
-.badge-warning {
- background-color: #f89406;
-}
-
-.label-warning[href],
-.badge-warning[href] {
- background-color: #c67605;
-}
-
-.label-success,
-.badge-success {
- background-color: #468847;
-}
-
-.label-success[href],
-.badge-success[href] {
- background-color: #356635;
-}
-
-.label-info,
-.badge-info {
- background-color: #3a87ad;
-}
-
-.label-info[href],
-.badge-info[href] {
- background-color: #2d6987;
-}
-
-.label-inverse,
-.badge-inverse {
- background-color: #333333;
-}
-
-.label-inverse[href],
-.badge-inverse[href] {
- background-color: #1a1a1a;
-}
-
-.btn .label,
-.btn .badge {
- position: relative;
- top: -1px;
-}
-
-.btn-mini .label,
-.btn-mini .badge {
- top: 0;
-}
-
-@-webkit-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-moz-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-ms-keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-@-o-keyframes progress-bar-stripes {
- from {
- background-position: 0 0;
- }
- to {
- background-position: 40px 0;
- }
-}
-
-@keyframes progress-bar-stripes {
- from {
- background-position: 40px 0;
- }
- to {
- background-position: 0 0;
- }
-}
-
-.progress {
- height: 20px;
- margin-bottom: 20px;
- overflow: hidden;
- background-color: #f7f7f7;
- background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));
- background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);
- background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9);
- background-repeat: repeat-x;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);
- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);
-}
-
-.progress .bar {
- float: left;
- width: 0;
- height: 100%;
- font-size: 12px;
- color: #ffffff;
- text-align: center;
- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
- background-color: #0e90d2;
- background-image: -moz-linear-gradient(top, #149bdf, #0480be);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));
- background-image: -webkit-linear-gradient(top, #149bdf, #0480be);
- background-image: -o-linear-gradient(top, #149bdf, #0480be);
- background-image: linear-gradient(to bottom, #149bdf, #0480be);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);
- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -webkit-box-sizing: border-box;
- -moz-box-sizing: border-box;
- box-sizing: border-box;
- -webkit-transition: width 0.6s ease;
- -moz-transition: width 0.6s ease;
- -o-transition: width 0.6s ease;
- transition: width 0.6s ease;
-}
-
-.progress .bar + .bar {
- -webkit-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- -moz-box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
- box-shadow: inset 1px 0 0 rgba(0, 0, 0, 0.15), inset 0 -1px 0 rgba(0, 0, 0, 0.15);
-}
-
-.progress-striped .bar {
- background-color: #149bdf;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- -webkit-background-size: 40px 40px;
- -moz-background-size: 40px 40px;
- -o-background-size: 40px 40px;
- background-size: 40px 40px;
-}
-
-.progress.active .bar {
- -webkit-animation: progress-bar-stripes 2s linear infinite;
- -moz-animation: progress-bar-stripes 2s linear infinite;
- -ms-animation: progress-bar-stripes 2s linear infinite;
- -o-animation: progress-bar-stripes 2s linear infinite;
- animation: progress-bar-stripes 2s linear infinite;
-}
-
-.progress-danger .bar,
-.progress .bar-danger {
- background-color: #dd514c;
- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));
- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);
- background-image: linear-gradient(to bottom, #ee5f5b, #c43c35);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);
-}
-
-.progress-danger.progress-striped .bar,
-.progress-striped .bar-danger {
- background-color: #ee5f5b;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-success .bar,
-.progress .bar-success {
- background-color: #5eb95e;
- background-image: -moz-linear-gradient(top, #62c462, #57a957);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));
- background-image: -webkit-linear-gradient(top, #62c462, #57a957);
- background-image: -o-linear-gradient(top, #62c462, #57a957);
- background-image: linear-gradient(to bottom, #62c462, #57a957);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);
-}
-
-.progress-success.progress-striped .bar,
-.progress-striped .bar-success {
- background-color: #62c462;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-info .bar,
-.progress .bar-info {
- background-color: #4bb1cf;
- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));
- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);
- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);
- background-image: linear-gradient(to bottom, #5bc0de, #339bb9);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);
-}
-
-.progress-info.progress-striped .bar,
-.progress-striped .bar-info {
- background-color: #5bc0de;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.progress-warning .bar,
-.progress .bar-warning {
- background-color: #faa732;
- background-image: -moz-linear-gradient(top, #fbb450, #f89406);
- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));
- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);
- background-image: -o-linear-gradient(top, #fbb450, #f89406);
- background-image: linear-gradient(to bottom, #fbb450, #f89406);
- background-repeat: repeat-x;
- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);
-}
-
-.progress-warning.progress-striped .bar,
-.progress-striped .bar-warning {
- background-color: #fbb450;
- background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));
- background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
- background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);
-}
-
-.accordion {
- margin-bottom: 20px;
-}
-
-.accordion-group {
- margin-bottom: 2px;
- border: 1px solid #e5e5e5;
- -webkit-border-radius: 4px;
- -moz-border-radius: 4px;
- border-radius: 4px;
-}
-
-.accordion-heading {
- border-bottom: 0;
-}
-
-.accordion-heading .accordion-toggle {
- display: block;
- padding: 8px 15px;
-}
-
-.accordion-toggle {
- cursor: pointer;
-}
-
-.accordion-inner {
- padding: 9px 15px;
- border-top: 1px solid #e5e5e5;
-}
-
-.carousel {
- position: relative;
- margin-bottom: 20px;
- line-height: 1;
-}
-
-.carousel-inner {
- position: relative;
- width: 100%;
- overflow: hidden;
-}
-
-.carousel .item {
- position: relative;
- display: none;
- -webkit-transition: 0.6s ease-in-out left;
- -moz-transition: 0.6s ease-in-out left;
- -o-transition: 0.6s ease-in-out left;
- transition: 0.6s ease-in-out left;
-}
-
-.carousel .item > img {
- display: block;
- line-height: 1;
-}
-
-.carousel .active,
-.carousel .next,
-.carousel .prev {
- display: block;
-}
-
-.carousel .active {
- left: 0;
-}
-
-.carousel .next,
-.carousel .prev {
- position: absolute;
- top: 0;
- width: 100%;
-}
-
-.carousel .next {
- left: 100%;
-}
-
-.carousel .prev {
- left: -100%;
-}
-
-.carousel .next.left,
-.carousel .prev.right {
- left: 0;
-}
-
-.carousel .active.left {
- left: -100%;
-}
-
-.carousel .active.right {
- left: 100%;
-}
-
-.carousel-control {
- position: absolute;
- top: 40%;
- left: 15px;
- width: 40px;
- height: 40px;
- margin-top: -20px;
- font-size: 60px;
- font-weight: 100;
- line-height: 30px;
- color: #ffffff;
- text-align: center;
- background: #222222;
- border: 3px solid #ffffff;
- -webkit-border-radius: 23px;
- -moz-border-radius: 23px;
- border-radius: 23px;
- opacity: 0.5;
- filter: alpha(opacity=50);
-}
-
-.carousel-control.right {
- right: 15px;
- left: auto;
-}
-
-.carousel-control:hover {
- color: #ffffff;
- text-decoration: none;
- opacity: 0.9;
- filter: alpha(opacity=90);
-}
-
-.carousel-caption {
- position: absolute;
- right: 0;
- bottom: 0;
- left: 0;
- padding: 15px;
- background: #333333;
- background: rgba(0, 0, 0, 0.75);
-}
-
-.carousel-caption h4,
-.carousel-caption p {
- line-height: 20px;
- color: #ffffff;
-}
-
-.carousel-caption h4 {
- margin: 0 0 5px;
-}
-
-.carousel-caption p {
- margin-bottom: 0;
-}
-
-.hero-unit {
- padding: 60px;
- margin-bottom: 30px;
- background-color: #eeeeee;
- -webkit-border-radius: 6px;
- -moz-border-radius: 6px;
- border-radius: 6px;
-}
-
-.hero-unit h1 {
- margin-bottom: 0;
- font-size: 60px;
- line-height: 1;
- letter-spacing: -1px;
- color: inherit;
-}
-
-.hero-unit p {
- font-size: 18px;
- font-weight: 200;
- line-height: 30px;
- color: inherit;
-}
-
-.pull-right {
- float: right;
-}
-
-.pull-left {
- float: left;
-}
-
-.hide {
- display: none;
-}
-
-.show {
- display: block;
-}
-
-.invisible {
- visibility: hidden;
-}
-
-.affix {
- position: fixed;
-}
diff --git a/examples/editors/aloha.html b/examples/editors/aloha.html
new file mode 100644
index 000000000..583151060
--- /dev/null
+++ b/examples/editors/aloha.html
@@ -0,0 +1,63 @@
+
+
+
+
+ Here is a picture of my dog, Kogepan:
++ +
++ I should really use an ABBR tag in this paragraph because QUAIL is an acronym. +
+