Repository: nature/pa11y-dashboard Branch: main Commit: 2327a1b664fb Files: 369 Total size: 4.2 MB Directory structure: gitextract_db6hdddw/ ├── .bowerrc ├── .dockerignore ├── .editorconfig ├── .github/ │ ├── issue_template.md │ └── workflows/ │ └── tests.yml ├── .gitignore ├── .npmrc ├── .nvmrc ├── CHANGELOG.md ├── CONTRIBUTING.md ├── Dockerfile.example ├── LICENSE ├── MIGRATION.md ├── Makefile ├── README.md ├── app.js ├── bower.json ├── config/ │ ├── development.sample.json │ ├── production.sample.json │ └── test.sample.json ├── config.js ├── data/ │ ├── standards.js │ └── techniques.js ├── eslint.config.js ├── index.js ├── package.json ├── public/ │ ├── js/ │ │ ├── site.js │ │ └── vendor/ │ │ ├── bootstrap/ │ │ │ ├── .bower.json │ │ │ ├── CNAME │ │ │ ├── CONTRIBUTING.md │ │ │ ├── DOCS-LICENSE │ │ │ ├── Gruntfile.js │ │ │ ├── LICENSE │ │ │ ├── LICENSE-MIT │ │ │ ├── README.md │ │ │ ├── _config.yml │ │ │ ├── _includes/ │ │ │ │ ├── ads.html │ │ │ │ ├── footer.html │ │ │ │ ├── header.html │ │ │ │ ├── nav-about.html │ │ │ │ ├── nav-components.html │ │ │ │ ├── nav-css.html │ │ │ │ ├── nav-customize.html │ │ │ │ ├── nav-getting-started.html │ │ │ │ ├── nav-javascript.html │ │ │ │ ├── nav-main.html │ │ │ │ ├── old-bs-docs.html │ │ │ │ └── social-buttons.html │ │ │ ├── _layouts/ │ │ │ │ ├── default.html │ │ │ │ └── home.html │ │ │ ├── about.html │ │ │ ├── bower.json │ │ │ ├── browserstack.json │ │ │ ├── components.html │ │ │ ├── composer.json │ │ │ ├── css.html │ │ │ ├── customize.html │ │ │ ├── dist/ │ │ │ │ ├── css/ │ │ │ │ │ ├── bootstrap-theme.css │ │ │ │ │ └── bootstrap.css │ │ │ │ └── js/ │ │ │ │ └── bootstrap.js │ │ │ ├── docs-assets/ │ │ │ │ ├── css/ │ │ │ │ │ ├── docs.css │ │ │ │ │ └── pygments-manni.css │ │ │ │ └── js/ │ │ │ │ ├── application.js │ │ │ │ ├── customizer.js │ │ │ │ ├── filesaver.js │ │ │ │ ├── holder.js │ │ │ │ ├── ie8-responsive-file-warning.js │ │ │ │ ├── jszip.js │ │ │ │ ├── less.js │ │ │ │ ├── raw-files.js │ │ │ │ └── uglify.js │ │ │ ├── examples/ │ │ │ │ ├── carousel/ │ │ │ │ │ ├── carousel.css │ │ │ │ │ └── index.html │ │ │ │ ├── grid/ │ │ │ │ │ ├── grid.css │ │ │ │ │ └── index.html │ │ │ │ ├── jumbotron/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── jumbotron.css │ │ │ │ ├── jumbotron-narrow/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── jumbotron-narrow.css │ │ │ │ ├── justified-nav/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── justified-nav.css │ │ │ │ ├── navbar/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── navbar.css │ │ │ │ ├── navbar-fixed-top/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── navbar-fixed-top.css │ │ │ │ ├── navbar-static-top/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── navbar-static-top.css │ │ │ │ ├── non-responsive/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── non-responsive.css │ │ │ │ ├── offcanvas/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── offcanvas.css │ │ │ │ │ └── offcanvas.js │ │ │ │ ├── signin/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── signin.css │ │ │ │ ├── starter-template/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── starter-template.css │ │ │ │ ├── sticky-footer/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── sticky-footer.css │ │ │ │ ├── sticky-footer-navbar/ │ │ │ │ │ ├── index.html │ │ │ │ │ └── sticky-footer-navbar.css │ │ │ │ └── theme/ │ │ │ │ ├── index.html │ │ │ │ └── theme.css │ │ │ ├── getting-started.html │ │ │ ├── index.html │ │ │ ├── javascript.html │ │ │ ├── js/ │ │ │ │ ├── affix.js │ │ │ │ ├── alert.js │ │ │ │ ├── button.js │ │ │ │ ├── carousel.js │ │ │ │ ├── collapse.js │ │ │ │ ├── dropdown.js │ │ │ │ ├── modal.js │ │ │ │ ├── popover.js │ │ │ │ ├── scrollspy.js │ │ │ │ ├── tab.js │ │ │ │ ├── tests/ │ │ │ │ │ ├── index.html │ │ │ │ │ ├── unit/ │ │ │ │ │ │ ├── affix.js │ │ │ │ │ │ ├── alert.js │ │ │ │ │ │ ├── button.js │ │ │ │ │ │ ├── carousel.js │ │ │ │ │ │ ├── collapse.js │ │ │ │ │ │ ├── dropdown.js │ │ │ │ │ │ ├── modal.js │ │ │ │ │ │ ├── phantom.js │ │ │ │ │ │ ├── popover.js │ │ │ │ │ │ ├── scrollspy.js │ │ │ │ │ │ ├── tab.js │ │ │ │ │ │ ├── tooltip.js │ │ │ │ │ │ └── transition.js │ │ │ │ │ └── vendor/ │ │ │ │ │ ├── jquery.js │ │ │ │ │ ├── qunit.css │ │ │ │ │ └── qunit.js │ │ │ │ ├── tooltip.js │ │ │ │ └── transition.js │ │ │ ├── less/ │ │ │ │ ├── alerts.less │ │ │ │ ├── badges.less │ │ │ │ ├── bootstrap.less │ │ │ │ ├── breadcrumbs.less │ │ │ │ ├── button-groups.less │ │ │ │ ├── buttons.less │ │ │ │ ├── carousel.less │ │ │ │ ├── close.less │ │ │ │ ├── code.less │ │ │ │ ├── component-animations.less │ │ │ │ ├── dropdowns.less │ │ │ │ ├── forms.less │ │ │ │ ├── glyphicons.less │ │ │ │ ├── grid.less │ │ │ │ ├── input-groups.less │ │ │ │ ├── jumbotron.less │ │ │ │ ├── labels.less │ │ │ │ ├── list-group.less │ │ │ │ ├── media.less │ │ │ │ ├── mixins.less │ │ │ │ ├── modals.less │ │ │ │ ├── navbar.less │ │ │ │ ├── navs.less │ │ │ │ ├── normalize.less │ │ │ │ ├── pager.less │ │ │ │ ├── pagination.less │ │ │ │ ├── panels.less │ │ │ │ ├── popovers.less │ │ │ │ ├── print.less │ │ │ │ ├── progress-bars.less │ │ │ │ ├── responsive-utilities.less │ │ │ │ ├── scaffolding.less │ │ │ │ ├── tables.less │ │ │ │ ├── theme.less │ │ │ │ ├── thumbnails.less │ │ │ │ ├── tooltip.less │ │ │ │ ├── type.less │ │ │ │ ├── utilities.less │ │ │ │ ├── variables.less │ │ │ │ └── wells.less │ │ │ └── package.json │ │ ├── flot/ │ │ │ ├── .bower.json │ │ │ ├── .gitignore │ │ │ ├── .travis.yml │ │ │ ├── API.md │ │ │ ├── CONTRIBUTING.md │ │ │ ├── FAQ.md │ │ │ ├── LICENSE.txt │ │ │ ├── Makefile │ │ │ ├── NEWS.md │ │ │ ├── PLUGINS.md │ │ │ ├── README.md │ │ │ ├── component.json │ │ │ ├── examples/ │ │ │ │ ├── ajax/ │ │ │ │ │ ├── data-eu-gdp-growth-1.json │ │ │ │ │ ├── data-eu-gdp-growth-2.json │ │ │ │ │ ├── data-eu-gdp-growth-3.json │ │ │ │ │ ├── data-eu-gdp-growth-4.json │ │ │ │ │ ├── data-eu-gdp-growth-5.json │ │ │ │ │ ├── data-eu-gdp-growth.json │ │ │ │ │ ├── data-japan-gdp-growth.json │ │ │ │ │ ├── data-usa-gdp-growth.json │ │ │ │ │ └── index.html │ │ │ │ ├── annotating/ │ │ │ │ │ └── index.html │ │ │ │ ├── axes-interacting/ │ │ │ │ │ └── index.html │ │ │ │ ├── axes-multiple/ │ │ │ │ │ └── index.html │ │ │ │ ├── axes-time/ │ │ │ │ │ └── index.html │ │ │ │ ├── axes-time-zones/ │ │ │ │ │ ├── date.js │ │ │ │ │ ├── index.html │ │ │ │ │ └── tz/ │ │ │ │ │ ├── africa │ │ │ │ │ ├── antarctica │ │ │ │ │ ├── asia │ │ │ │ │ ├── australasia │ │ │ │ │ ├── backward │ │ │ │ │ ├── etcetera │ │ │ │ │ ├── europe │ │ │ │ │ ├── factory │ │ │ │ │ ├── iso3166.tab │ │ │ │ │ ├── leapseconds │ │ │ │ │ ├── northamerica │ │ │ │ │ ├── pacificnew │ │ │ │ │ ├── solar87 │ │ │ │ │ ├── solar88 │ │ │ │ │ ├── solar89 │ │ │ │ │ ├── southamerica │ │ │ │ │ ├── systemv │ │ │ │ │ ├── yearistype.sh │ │ │ │ │ └── zone.tab │ │ │ │ ├── basic-options/ │ │ │ │ │ └── index.html │ │ │ │ ├── basic-usage/ │ │ │ │ │ └── index.html │ │ │ │ ├── canvas/ │ │ │ │ │ └── index.html │ │ │ │ ├── categories/ │ │ │ │ │ └── index.html │ │ │ │ ├── examples.css │ │ │ │ ├── image/ │ │ │ │ │ └── index.html │ │ │ │ ├── index.html │ │ │ │ ├── interacting/ │ │ │ │ │ └── index.html │ │ │ │ ├── navigate/ │ │ │ │ │ └── index.html │ │ │ │ ├── percentiles/ │ │ │ │ │ └── index.html │ │ │ │ ├── realtime/ │ │ │ │ │ └── index.html │ │ │ │ ├── resize/ │ │ │ │ │ └── index.html │ │ │ │ ├── selection/ │ │ │ │ │ └── index.html │ │ │ │ ├── series-errorbars/ │ │ │ │ │ └── index.html │ │ │ │ ├── series-pie/ │ │ │ │ │ └── index.html │ │ │ │ ├── series-toggle/ │ │ │ │ │ └── index.html │ │ │ │ ├── series-types/ │ │ │ │ │ └── index.html │ │ │ │ ├── stacking/ │ │ │ │ │ └── index.html │ │ │ │ ├── symbols/ │ │ │ │ │ └── index.html │ │ │ │ ├── threshold/ │ │ │ │ │ └── index.html │ │ │ │ ├── tracking/ │ │ │ │ │ └── index.html │ │ │ │ ├── visitors/ │ │ │ │ │ └── index.html │ │ │ │ └── zooming/ │ │ │ │ └── index.html │ │ │ ├── excanvas.js │ │ │ ├── excanvas.min.js │ │ │ ├── flot.jquery.json │ │ │ ├── jquery.colorhelpers.js │ │ │ ├── jquery.flot.canvas.js │ │ │ ├── jquery.flot.categories.js │ │ │ ├── jquery.flot.crosshair.js │ │ │ ├── jquery.flot.dashes.js │ │ │ ├── jquery.flot.errorbars.js │ │ │ ├── jquery.flot.fillbetween.js │ │ │ ├── jquery.flot.image.js │ │ │ ├── jquery.flot.js │ │ │ ├── jquery.flot.navigate.js │ │ │ ├── jquery.flot.pie.js │ │ │ ├── jquery.flot.resize.js │ │ │ ├── jquery.flot.selection.js │ │ │ ├── jquery.flot.stack.js │ │ │ ├── jquery.flot.symbol.js │ │ │ ├── jquery.flot.threshold.js │ │ │ ├── jquery.flot.time.js │ │ │ ├── jquery.js │ │ │ └── package.json │ │ └── jquery/ │ │ ├── .bower.json │ │ ├── .gitignore │ │ ├── README.md │ │ ├── bower.json │ │ ├── component.json │ │ ├── composer.json │ │ ├── jquery-migrate.js │ │ ├── jquery.js │ │ └── package.json │ └── less/ │ ├── alerts.less │ ├── badges.less │ ├── bootswatch.less │ ├── breadcrumbs.less │ ├── button-groups.less │ ├── buttons.less │ ├── carousel.less │ ├── close.less │ ├── code.less │ ├── component-animations.less │ ├── dropdowns.less │ ├── forms.less │ ├── glyphicons.less │ ├── grid.less │ ├── ie8and.less │ ├── input-groups.less │ ├── jumbotron.less │ ├── labels.less │ ├── list-group.less │ ├── main.less │ ├── media.less │ ├── mixins.less │ ├── modals.less │ ├── navbar.less │ ├── navs.less │ ├── normalize.less │ ├── pager.less │ ├── pagination.less │ ├── panels.less │ ├── popovers.less │ ├── print.less │ ├── progress-bars.less │ ├── responsive-utilities.less │ ├── scaffolding.less │ ├── site-ie8and.less │ ├── site-nojavascript.less │ ├── site-responsive.less │ ├── site.less │ ├── tables.less │ ├── theme.less │ ├── thumbnails.less │ ├── tooltip.less │ ├── type.less │ ├── utilities.less │ ├── variables-flatly.less │ ├── variables.less │ └── wells.less ├── route/ │ ├── health.js │ ├── index.js │ ├── new.js │ ├── result/ │ │ ├── download.js │ │ └── index.js │ └── task/ │ ├── delete.js │ ├── edit.js │ ├── ignore.js │ ├── index.js │ ├── run.js │ └── unignore.js ├── test/ │ └── integration/ │ ├── helper/ │ │ └── navigate.js │ ├── route/ │ │ ├── health.js │ │ ├── index.js │ │ ├── new.js │ │ ├── result/ │ │ │ ├── download.js │ │ │ └── index.js │ │ └── task/ │ │ ├── delete.js │ │ ├── edit.js │ │ ├── index.js │ │ └── run.js │ └── setup.js └── view/ ├── 404.html ├── 500.html ├── helper/ │ ├── conditionals.js │ ├── date.js │ ├── string.js │ └── url.js ├── index.html ├── layout/ │ └── default.html ├── new.html ├── partial/ │ ├── breadcrumb.html │ ├── graph.html │ ├── page-footer.html │ ├── page-header.html │ ├── result-header.html │ ├── result.html │ ├── task-header.html │ └── tasks.html ├── presenter/ │ ├── ignore.js │ ├── result-list.js │ ├── result.js │ └── task.js ├── result/ │ └── index.html └── task/ ├── delete.html ├── edit.html └── index.html ================================================ FILE CONTENTS ================================================ ================================================ FILE: .bowerrc ================================================ { "directory" : "public/js/vendor" } ================================================ FILE: .dockerignore ================================================ # Version control .git .github # Dependencies (must be rebuilt inside the container) node_modules # Tests test # Build tooling and dev config Makefile bower.json eslint.config.js .bowerrc .editorconfig .markdownlint.jsonc .npmrc .nvmrc # LESS source files (compiled CSS is in public/css) public/less # Config files (may contain credentials; samples are kept) config/development.json config/production.json config/test.json # Documentation *.md # Debug logs npm-debug.log ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 end_of_line = lf indent_size = 4 indent_style = tab insert_final_newline = true trim_trailing_whitespace = true [*.md] indent_style = space trim_trailing_whitespace = false [*.yml] indent_style = space indent_size = 2 [package.json] indent_style = space indent_size = 2 ================================================ FILE: .github/issue_template.md ================================================ **This repository's issues are reserved for feature requests, bug reports, and other issues with Pa11y Dashboard itself.** If you need help using Pa11y Dashboard, we recommend using [Stack Overflow](https://stackoverflow.com/questions/tagged/pa11y). For a bug report, please use the template below. To keep the backlog clean and actionable, issues may be immediately closed if they do not follow one this template. --- ## Expected behaviour ## Actual behaviour ## Steps to reproduce ## Environment _Please specify the versions of Pa11y Dashboard, MongoDB, and Node.js that can be sued to reproduce this issue._ ================================================ FILE: .github/workflows/tests.yml ================================================ on: push: branches: - main pull_request: jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v5 - uses: actions/setup-node@v6 with: node-version: 20 - run: npm ci - run: npm run lint test: name: test (node ${{ matrix.node }}, mongodb ${{ matrix.mongo }}) runs-on: ubuntu-latest strategy: fail-fast: false matrix: node: [20, 22, 24] mongo: [latest] include: - { node: 20, mongo: 7.0.25 } - { node: 20, mongo: 6.0.11 } - { node: 20, mongo: 5.0.22 } - { node: 20, mongo: 4.4.25 } - { node: 20, mongo: 3.6.23 } - { node: 20, mongo: 2.6.12 } steps: - name: Disable AppArmor User Namespace Restrictions, required to open Chrome on Ubuntu 23.10+ without --no-sandbox). See https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md. run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns - uses: actions/checkout@v5 - uses: actions/setup-node@v6 with: node-version: ${{ matrix.node }} - run: npm ci - name: Supply MongoDB ${{ matrix.mongo }} uses: supercharge/mongodb-github-action@1.12.0 with: mongodb-version: ${{ matrix.mongo }} - name: Supply integration test configuration file run: cp config/test.sample.json config/test.json - name: Make dashboard available to be integration-tested run: NODE_ENV=test node index.js & - name: Wait for dashboard to respond uses: iFaxity/wait-on-action@v1.1.0 with: resource: http://localhost:4000 delay: 1000 timeout: 30000 log: true - run: NODE_ENV=test npm test ================================================ FILE: .gitignore ================================================ # Logs logs/ *.log npm-debug.log* yarn-debug.log* yarn-error.log* lerna-debug.log* # Diagnostic reports (https://nodejs.org/api/report.html) report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json # Runtime data pids/ *.pid *.seed *.pid.lock # Coverage directories and files coverage/ *.lcov .nyc_output/ lib-cov/ # Dependency directories node_modules/ jspm_packages/ bower_components/ # Compiled binary addons (https://nodejs.org/api/addons.html) build/Release # node-waf configuration .lock-wscript # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) .grunt # TypeScript cache *.tsbuildinfo # Optional npm cache directory .npm # Optional eslint cache .eslintcache # Optional stylelint cache .stylelintcache # Optional REPL history .node_repl_history # Output of 'npm pack' *.tgz /package # Yarn .yarn-integrity .pnp.* .yarn/* !.yarn/patches !.yarn/plugins !.yarn/releases !.yarn/sdks !.yarn/versions # pnpm .pnpm-store/ # dotenv environment variable files .env .env.* !.env.example !.env.sample # macOS .DS_Store .AppleDouble .LSOverride ._* __MACOSX/ .DocumentRevisions-V100 .fseventsd .Spotlight-V100 .TemporaryItems .Trashes .VolumeIcon.icns .com.apple.timemachine.donotpresent .AppleDB .AppleDesktop Network Trash Folder Temporary Items .apdisk # Editors .idea/ .vscode/ *.swp *.swo *~ # Config files (ignore credentials, keep samples) config/*.json !config/*.sample.json ================================================ FILE: .npmrc ================================================ lockfile-version=2 ================================================ FILE: .nvmrc ================================================ 24 ================================================ FILE: CHANGELOG.md ================================================ # Changelog ## 5.2.0 (2026-03-25) Additional containerisation-related improvements. * Add new /health health check endpoint to help containerisation * Minor refactoring of initialisation code * Add example Dockerfile and containerisation tips * Minor documentation improvements **Full Changelog**: https://github.com/pa11y/pa11y-dashboard/compare/5.1.0...5.2.0 ## 5.1.0 (2026-03-10) Improve compatibility with Twelve-Factor App methodology * Add support for passing Chrome/Chromium config as environment variables, as currently this was only possible via a config file. These are part of the browser config that is sent to webservice and it's usually required in containerised environments. * Improve documentation around containerisation. * Improve SIGTERM and SIGINT signal handling for a more graceful shutdown process. **Full Changelog**: https://github.com/pa11y/pa11y-dashboard/compare/5.0.1...5.1.0 ## 5.0.1 (2026-03-03) * Update dependencies to latest compatible versions by @josebolos in https://github.com/pa11y/pa11y-dashboard/pull/349 **Full Changelog**: https://github.com/pa11y/pa11y-dashboard/compare/5.0.0...5.0.1 ## 5.0.0 (commited 2025-11-12, tagged 2026-03-03) ### Changes * Improve console messaging (thanks @sangitamane) * Address linting issues (thanks @josebolos and @hollsk) * Various accessibility improvements to dashboard pages (thanks @sangitamane) * Improve version support and its verification * **Major:** Use `pa11y-webservice@5` (which uses `pa11y@9`) * **Major:** Support Node `20`, `22`, `24` (support for `< 20` dropped) * Support MongoDB `2`, `4`, `5`, `6`, `7`, `latest` * Fix various integration test issues * Other minor dependency upgrades * Update support policy ### New contributors +* @danyalaytekin made their first contribution in https://github.com/pa11y/a11y-dashboard/pull/315 ### Full diff * [4.2.0...5.0.0](https://github.com/pa11y/pa11y-dashboard/compare/4.2.0...5.0.0) ## 4.2.0 (2022-03-30) * Add request logging for easier debugging * Dependencies update ## 4.1.0 (2021-11-26) * Add support for new WCAG 2.1 rules and remove all references to Section 508. * Move troubleshooting guide to the README. ## 4.0.0 (2021-11-26) * Update pa11y to version 6. * Drop support for versions of Node.js older than 12. * Update MongoDB Node driver from v2 to v3, which adds support for MongoDB v4 databases. ## 3.3.0 (2021-04-27) * Add new list view to the dashboard (thanks @sangitamane) * Upgrade express-hbs to the latest version in order to address several potential vulnerabilities * Fixes a MongoDB "ObjectID generation failed" error. * Update pa11y-webservice to version 3.2.1 and pa11y to version 5.3.1 ## 3.2.0 (2020-10-05) * Update pa11y to version 5.3.0, which means better compatibility with sites using AMD modules * Update pa11y-webservice to version 3.2.0, which adds the ability to configure the number of workers running pa11y tests * Update several dependencies * Replace chalk with kleur ## 3.1.0 (2019-09-27) * Display the task ID before each line of output, so it's clear to which task a line of output belongs to when they run in parallel. * Bump pa11y-webservice version, which fixes an issue with some pages failing to run. * Fix incorrect routes passing an invalid value to Mongo's ObjectID. ## 3.0.0 (2019-07-16) * Update pa11y to v5, which replaces Phantomjs with Headless Chrome * Update dependencies * Several bug fixes and documentation updates * See the [migration guide](https://github.com/pa11y/pa11y-dashboard/blob/master/MIGRATION.md#migrating-from-20-to-30) for details of the breaking changes in this release ## 2.4.2 (2018-06-21) * Update dependencies * body-parser: ~1.17.1 to ^1.18.3 * compression: ~1.6 to ^1.7.2 * express: ~4.15.2 to ^4.16.3 * moment: ~2.15.2 to ^2.22.2 ## 2.4.1 (2017-11-28) * Update dependencies * pa11y-webservice: ^2.3.0 to ^2.3.1 ## 2.4.0 (2017-11-23) * Add the ability to export the results graph as a PNG, see #197 for more information ## 2.3.0 (2017-10-31) * Large overhaul of the results page, see #196 for more information ## 2.2.2 (2017-03-23) * Upgrades `body-parser` and `express`. Fixes a vulnerability in `qs`: https://snyk.io/vuln/npm:qs:20170213 ## 2.2.1 (2017-02-07) * Fix task editing when no actions are specified ## 2.2.0 (2017-01-27) * Add support for Pa11y actions * Update dependencies * pa11y-webservice: ~2.1.2 to ^2.3.0 ## 2.1.2 (2016-12-12) * Hide the "add" button in readonly mode * Add a contributing guide ## 2.1.1 (2016-11-20) * Use arrows instead of plus and minus for collapsibles/expanders * Supply more detailed 500 messages ## 2.1.0 (2016-11-07) * Allow for configuration files to be JavaScript rather than JSON * Allow setting of HTTP headers for task runs * Allow hiding/ignoring elements for task runs * Update dependencies and devDependencies * pa11y-webservice: ~2.0.1 to ^2.1.2 * mocha: ^3 to ^2 (temporary – tests weren't running) ## 2.0.1 (2016-09-12) * Update dependencies and devDependencies * express: ~4.13 to ~4.14 * pa11y-webservice: ~2.0 to ^2.0.1 * request: ^2 to ^2.74 * mocha: ^2 to ^3 * pa11y-webservice-client-node: ~1.2 to ^1.2.1 This fixes the following vulnerabilities: * https://nodesecurity.io/advisories/45 * https://nodesecurity.io/advisories/63 * https://nodesecurity.io/advisories/65 * https://nodesecurity.io/advisories/106 * https://nodesecurity.io/advisories/121 * https://nodesecurity.io/advisories/130 ## 2.0.0 (2016-06-05) * Drop Node.js 0.10–0.12 support * Update dependencies * pa11y-webservice: ~1.11 to ~2.0 * See the [migration guide](https://github.com/pa11y/dashboard/blob/master/MIGRATION.md#migrating-from-10-to-20) for details ## 1.12.1 (2016-06-05) * Update references/links after a repo rename ## 1.12.0 (2016-05-26) * Update Node.js version support to 0.10–6.0 * Update dependencies * body-parser: added at ~1.15 * chalk: ~0.2 to ~1.1 * compression: added at ~1.6 * express: ~3.4 to ~4.13 * express-hbs: ~0.2 to ~1.0 * moment: ~2.2 to ~2.13 * pa11y-webservice: ~1.10 to ~1.11 * pa11y-webservice-client-node: ~1.1 to ~1.2 * bower: ~1.2 to ~1.7 * cheerio: added at ~0.20 * jsdom: removed * request: ~2.27 to ^2 * uglify-js: ~2.4 to ~2.6 ## 1.11.0 (2016-05-23) * Add the ability to configure task wait times * Allow configuration by environment variables * Update repository references to the new Pa11y organisation * Add a changelog ## 1.10.0 (2016-05-18) * Automatically focus on the filter input box when you select the filter * Make a task URL clickable * Tweak the documentation to make it more usable * Add a resources section to the README ## 1.9.0 (2016-04-25) * Show errors' context and selector on the results page * Add context and selector to CSV output * Fix lint errors * Switch from Grunt to Make * Add a `SIGINT` handler * Update dependencies * pa11y-webservice: ~1.6 to ~1.8 ## 1.8.2 (2016-02-10) * Update the license in the footer ## 1.8.1 (2016-02-10) * Update repository references to springernature ## 1.8.0 (2016-02-04) * Make the graph more accessible to color-blind users * Fix lint errors ## 1.7.0 (2016-01-29) * Hide the date list from individual result pages * Make the date selector properly keyboard accessible * Change the options button into a more accessible list * Make the errors/warnings/notices lists keyboard accessible ## 1.6.1 (2016-01-26) * Add keyboard access for filters * Fix lint errors ## 1.6.0 (2015-08-20) * Hide all graph data except for errors by default ## 1.5.0 (2015-07-06) * Add the ability to use HTTP basic auth with task URLs * Update dependencies * pa11y-webservice: ~1.5 to ~1.6 ## 1.4.0 (2015-07-02) * Add the ability to set a per-task timeout ## 1.3.2 (2015-01-17) * Update dependencies * pa11y-webservice: ~1.3 to ~1.4 ## 1.3.1 (2014-03-05) * Fix the URL filter position when in demo mode ## 1.3.0 (2014-03-04) * Add filtering of tasks on the home page * Add the ability to ignore certain rules * Add the ability to ignore a rule from the result page * Tweak the display of task cards ## 1.2.3 (2014-01-13) * Fix CSV export for the OS X version of Excel ## 1.2.2 (2014-01-09) * Fix spacing issues when the graph is not visible * Add notes on publishing a release ## 1.2.1 (2014-01-08) * Fix dropdown positioning in Internet Explorer 7 and 8 ## 1.2.0 (2013-12-12) * Add HTML Codesniffer links on the results page * Display the ignore rules for results on the results page * Link the breadcrumbs on task sub-pages * Fix an issue with saving empty ignore rules * Cache-bust the CSS and JavaScript * Add the ability to edit tasks * Fix lint errors * Tweaks to the display of the graphs * Update dependencies * pa11y-webservice: ~1.1 to ~1.2 * pa11y-webservice-client-node: ~1.0 to ~1.1 ## 1.1.0 (2013-11-22) * Add a functional test suite * Allow the webservice to run automatically * Documentation improvements * Add a Travis config * Fix lint errors ## 1.0.0 (2013-11-19) * Initial stable release * Add the ability to set a site-wide message * Add a demo mode for demo/public-facing sites * Disable search engine indexing by default * Tweak the task header at smaller screen sizes * Make checkboxes on the graph WCAG2AA compliant * Make checkbox inputs and labels WCAG2AA compliant on new URL page * Colour changes to ensure there are no contrast issues * Make the copy more consistent * Update screenshots * Update dependencies * pa11y-webservice-client-node: 1.0.0-beta.7 to ~1.0 ## 1.0.0-beta.3 pre-release (2013-11-12) * Fix lint errors * Add descriptive labels to tasks * Add a name field to "New URL" form * Add a WCAG 2.0 link to the footer * Tweak the layout at smaller screen sizes * Notify users when there are no ignored rules * Fix the expires headers for front end assets * Move from Make to Grunt * Compress static files * Minify the site JavaScript * Compile LESS files with grunt * Add a watch task to recompile assets on change * Commit compiled front-end code to the repo * Add development instructions * Update screenshots * Update dependencies * pa11y-webservice-client-node: 1.0.0-beta.4 to 1.0.0-beta.7 ## 1.0.0-beta.2 pre-release (2013-10-04) * Add screenshots to the README * Fix margins * Add bower package management * Stop the graph from appearing if there's only one result * Add the ability to run tasks ad-hoc * Add more useful information to the footer * General copy edits * Update dependencies * pa11y-webservice-client-node: 1.0.0-beta.3 to 1.0.0-beta.4 ## 1.0.0-beta.1 pre-release (2013-09-27) * Initial release ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing Guide Thanks for getting involved :tada: The Pa11y team loves to see new contributors, and we strive to provide a welcoming and inclusive environment. We ask that all contributors read and follow [our code of conduct][code-of-conduct] before joining. If you represent an organisation, then you might find our [guide for companies][companies] helpful. Our website outlines the many ways that you can contribute to Pa11y: - [Help us to talk to our users][communications] - [Help us out with design][designers] - [Help us with our code][developers] [code-of-conduct]: https://pa11y.org/contributing/code-of-conduct/ [communications]: https://pa11y.org/contributing/communications/ [companies]: https://pa11y.org/contributing/companies/ [designers]: https://pa11y.org/contributing/designers/ [developers]: https://pa11y.org/contributing/developers/ ================================================ FILE: Dockerfile.example ================================================ # Example Dockerfile for Pa11y Dashboard # # This is a starting point that you can adapt to your infrastructure. It is NOT # intended to be used as-is. # # What this file provides: # # - Multi-stage build to keep the final image small # - All Chromium system dependencies needed by Puppeteer # - Puppeteer cache handled correctly across build stages # - Non-root user for running the application and Chromium # # What you still need to provide: # # - A MongoDB instance (external; NOT included in this image) # - Runtime configuration via environment variables (see README.md) # # Adapt this file to your needs. Common customisations include: # # - Adding corporate CA certificates (see commented-out example below) # - Changing the Node.js or Debian version # - Using `git clone` instead of `COPY` if your Dockerfile lives in a # separate deployment repo (see commented-out alternative below) # --- Build stage --- FROM node:24-slim AS build # Ensure the base image is fully up to date before installing dependencies RUN apt -qq update && \ DEBIAN_FRONTEND=noninteractive apt -yqq full-upgrade && \ DEBIAN_FRONTEND=noninteractive apt -yqq autoremove && \ rm -rf /var/lib/apt/lists/* # -- If your organisation uses a corporate proxy or TLS-intercepting CA # (e.g. Zscaler), uncomment the following lines and place your CA # certificate in the build context: # # COPY your-corporate-ca.pem /usr/local/share/ca-certificates/corporate-ca.crt # RUN apt -qq update && \ # DEBIAN_FRONTEND=noninteractive apt -yqq --no-install-recommends install \ # ca-certificates && \ # update-ca-certificates && \ # rm -rf /var/lib/apt/lists/* WORKDIR /app # Copy application source into the build context. # The .dockerignore file excludes dev files, tests, and config files. COPY . . # -- Alternative: if your Dockerfile lives in a separate deployment repo # (not inside the pa11y-dashboard repo), replace the `COPY . .` above # with a git clone. This is useful when your deployment repo only # contains infrastructure files (Dockerfile, CI config, manifests). # # ARG PA11Y_DASHBOARD_VERSION=main # RUN apt -qq update && \ # DEBIAN_FRONTEND=noninteractive apt -yqq --no-install-recommends install \ # git ca-certificates && \ # rm -rf /var/lib/apt/lists/* # RUN git clone --depth 1 --branch ${PA11Y_DASHBOARD_VERSION} \ # https://github.com/pa11y/pa11y-dashboard.git . # Install system libraries required by Puppeteer's bundled Chromium binary. # These must be present at `npm ci` time because Puppeteer downloads and # validates Chrome during installation. RUN apt -qq update && \ DEBIAN_FRONTEND=noninteractive apt -yqq --no-install-recommends install \ fonts-liberation \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libx11-xcb1 \ libxcomposite1 \ libxdamage1 \ libxrandr2 \ xdg-utils \ wget \ && rm -rf /var/lib/apt/lists/* # Puppeteer downloads Chromium to a cache directory during `npm ci`. By # default this goes to ~/.cache, which is outside /app and would not survive # the COPY --from=build in the runtime stage. Setting PUPPETEER_CACHE_DIR # inside /app ensures the Chromium binary is included in the final image. ENV PUPPETEER_CACHE_DIR=/app/.cache/puppeteer RUN npm ci --omit=dev # --- Runtime stage --- FROM node:24-slim # Install the same Chromium system libraries in the runtime stage. # Only runtime dependencies are needed here (no wget, git, etc.). RUN apt -qq update && \ DEBIAN_FRONTEND=noninteractive apt -yqq --no-install-recommends install \ fonts-liberation \ libasound2 \ libatk-bridge2.0-0 \ libatk1.0-0 \ libcups2 \ libdbus-1-3 \ libdrm2 \ libgbm1 \ libgtk-3-0 \ libnspr4 \ libnss3 \ libx11-xcb1 \ libxcomposite1 \ libxdamage1 \ libxrandr2 \ xdg-utils \ && rm -rf /var/lib/apt/lists/* # -- If you added a corporate CA certificate in the build stage, repeat it # here so that outbound HTTPS requests at runtime also work: # # RUN apt -qq update && \ # DEBIAN_FRONTEND=noninteractive apt -yqq --no-install-recommends install \ # ca-certificates && \ # rm -rf /var/lib/apt/lists/* # COPY your-corporate-ca.pem /usr/local/share/ca-certificates/corporate-ca.crt # RUN update-ca-certificates # ENV NODE_EXTRA_CA_CERTS=/etc/ssl/certs/ca-certificates.crt # Run as a non-root user. Chromium will refuse to launch as root without # --no-sandbox, and running as non-root is good practice regardless. RUN groupadd -r pptruser && useradd -r -g pptruser -G audio,video pptruser \ && mkdir -p /home/pptruser/Downloads \ && chown -R pptruser:pptruser /home/pptruser WORKDIR /app COPY --from=build /app /app RUN chown -R pptruser:pptruser /app USER pptruser ENV NODE_ENV=production # Must match the PUPPETEER_CACHE_DIR used in the build stage ENV PUPPETEER_CACHE_DIR=/app/.cache/puppeteer EXPOSE 4000 CMD ["node", "index.js"] ================================================ FILE: LICENSE ================================================ GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. 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 them 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 prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. 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. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey 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; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If 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 convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU 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 that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. 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. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 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. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . ================================================ FILE: MIGRATION.md ================================================ # Migration Guide Pa11y Dashboard's API changes between major versions. This is a guide to help you make the switch when this happens. ## Table of contents * [Table of contents](#table-of-contents) * [Migrating from 4.0 to 5.0](#migrating-from-40-to-50) * [Migrating from 3.0 to 4.0](#migrating-from-30-to-40) * [Migrating from 2.0 to 3.0](#migrating-from-20-to-30) * [PhantomJS to Headless Chrome](#phantomjs-to-headless-chrome) * [Node.js Support](#nodejs-support) * [Miscellaneous](#miscellaneous) * [Migrating from 1.0 to 2.0](#migrating-from-10-to-20) * [Node.js Support](#nodejs-support-1) ## Migrating from 4.0 to 5.0 Pa11y Dashboard 5 requires Node.js version 20 or greater. ## Migrating from 3.0 to 4.0 Pa11y Dashboard requires Node.js version 12 or greater. Versions 8 and 10 are not supported any more. In addition, to use Pa11y Dashboard 4 with a version of Ubuntu above 20.04, a path to the Chrome executable must be defined in `chromeLaunchConfig`, as `chromeLaunchConfig.executablePath`. See the README's [Pa11y Dashboard and Linux/Ubuntu](README.md#pa11y-dashboard-and-linuxubuntu) section for details. ## Migrating from 2.0 to 3.0 ### PhantomJS to Headless Chrome Pa11y Dashboard 3 uses version 5 of Pa11y, which replaces PhantomJS with [Headless Chrome](https://developers.google.com/web/updates/2017/04/headless-chrome). This allows us to use more modern JavaScript APIs and make Pa11y testing more stable. As a result of this change, [Pa11y Dashboard's requirements](../README.md#requirements) have changed, and you may need to install additional dependencies required by Chrome before being able to use this version. ### Node.js Support Pa11y Dashboard 3 requires Node.js version 8 or greater. Versions 4 and 6 are not supported any more. ### Miscellaneous The default viewport dimensions for Pa11y have been changed from `1024x768` to `1280x1024`. This could make pa11y report a different number of errors if different content appears on the page based on its width, so results obtained with v2 and v3 may not be comparable. ## Migrating from 1.0 to 2.0 ### Node.js Support The only breaking change in Pa11y Dashboard 2.0 is that Node.js 0.10 and 0.12 are no longer supported. We'll be using newer ES6 features in upcoming releases which will not work in these older Node.js versions. ================================================ FILE: Makefile ================================================ # Client-side asset tasks # ----------------------- less: @lessc -x ./public/less/main.less ./public/css/site.min.css @$(TASK_DONE) uglify: @uglifyjs \ public/js/vendor/jquery/jquery.min.js \ public/js/vendor/bootstrap/js/alert.js \ public/js/vendor/bootstrap/js/dropdown.js \ public/js/vendor/bootstrap/js/tooltip.js \ public/js/vendor/bootstrap/js/transition.js \ public/js/vendor/bootstrap/js/collapse.js \ public/js/vendor/bootstrap/js/tab.js \ public/js/vendor/bootstrap/js/popover.js \ public/js/vendor/flot/jquery.flot.js \ public/js/vendor/flot/jquery.flot.dashes.js \ public/js/vendor/flot/jquery.flot.time.js \ public/js/vendor/flot/jquery.flot.selection.js \ public/js/vendor/flot/jquery.flot.resize.js \ public/js/vendor/helpers/html2canvas.min.js \ public/js/site.js \ -o ./public/js/site.min.js @$(TASK_DONE) ================================================ FILE: README.md ================================================ # Pa11y Dashboard Pa11y Dashboard is a web interface to the [Pa11y][pa11y] accessibility reporter, allowing you to focus on *fixing* issues rather than hunting them down. ![Version][shield-version] [![Node.js version support][shield-node]][info-node] [![Build status][shield-build]][info-build] [![GPL-3.0 licensed][shield-license]][info-license] ![dashboard](https://user-images.githubusercontent.com/6110968/61603347-0bce1000-abf2-11e9-87b2-a53f91d315bb.jpg) ![results-page](https://user-images.githubusercontent.com/6110968/62183438-05851580-b30f-11e9-9bc4-b6a4823ae9e8.jpg) --- ## Running Pa11y Dashboard ### Requirements - [Node.js][node]: Pa11y Dashboard 5 requires a stable (even-numbered) version of Node.js of 20 or above. - [MongoDB][mongodb]: This project depends on Pa11y Webservice, which stores test results in a MongoDB database and expects one to be available and running. #### Pa11y Dashboard and Linux/Ubuntu Pa11y Dashboard uses Puppeteer, which bundles its own Chromium binary. On some Linux distributions (notably Ubuntu 20.04 and above), this bundled binary may fail to launch because required shared libraries are not installed by default. There are two ways to resolve this: 1. **Install the missing system dependencies** so that the bundled Chromium works. The list of required packages varies by distribution. Refer to [Puppeteer's troubleshooting guide](https://pptr.dev/troubleshooting#chrome-doesnt-launch-on-linux) for the current list. 2. **Use a system-installed Chromium** instead of the bundled one. Install your distribution's Chromium package (e.g. `apt install chromium-browser`) and point Pa11y Dashboard to it via the `executablePath` option in [`chromeLaunchConfig`](#chromelaunchconfig), or the `CHROMIUM_EXECUTABLE` environment variable (e.g. `/usr/bin/chromium-browser`). ### Setting up Pa11y Dashboard In order to run Pa11y Dashboard, we recommend cloning this repository locally: ```sh git clone https://github.com/pa11y/pa11y-dashboard.git ``` Then installing the dependencies: ```sh cd pa11y-dashboard npm install ``` #### Installing MongoDB Instructions for installing and running MongoDB are outside the scope of this document. When in doubt, please refer to the [MongoDB installation instructions](https://docs.mongodb.com/manual/installation/) for details of how to install and run MongoDB on your specific operating system. An example of the installation and configuration process for macOS follows. Pa11y Dashboard uses [MongoDB Node.js Driver][mongodb-package] version 3, which [may not support some features][mongodb-package-compatibility] of MongoDB versions 6 and beyond. We do however test against MongoDB versions 2 to 7, plus the latest major version, which at the time of writing is `8`. ##### Example MongoDB installation for macOS On recent versions of macOS (10.13 or later), you can use [Homebrew] to install MongoDB Community Edition. Tap the MongoDB Homebrew Tap: ```sh brew tap mongodb/brew ``` Install a supported Community version of MongoDB: ```sh brew install mongodb-community@8.0 ``` Start the MongoDB server: ```sh brew services start mongodb/brew/mongodb-community@8.0 ``` Check that the service has started properly: ```console $ brew services list Name Status User Plist mongodb-community started pa11y /Users/pa11y/Library/LaunchAgents/homebrew.mxcl.mongodb-community.plist ``` #### Configuring Pa11y Dashboard The last step before being able to run Pa11y Dashboard is to define a configuration for it. This can be done in two ways: ##### Option 1: Using environment variables Each configuration can be set with an environment variable rather than a config file. For example to run the application on port `8080` you can use the following: ```sh PORT=8080 node index.js ``` A more complete example using all available environment variables, as you might use in a Docker or cloud deployment: ```sh PORT=8080 \ NOINDEX=true \ READONLY=false \ WEBSERVICE_DATABASE=mongodb://user:password@mongo-host:27017/pa11y \ WEBSERVICE_HOST=0.0.0.0 \ WEBSERVICE_PORT=3000 \ WEBSERVICE_CRON="0 30 0 * * *" \ CHROMIUM_FLAGS="--no-sandbox,--disable-setuid-sandbox" \ node index.js ``` The [available configurations](#configurations) are documented in the next section. ##### Option 2: Using config files You can store the configuration for Pa11y Dashboard on a JSON file. You can use a different configuration file for each environment you're planning to run Pa11y Dashboard on. You can choose a specific environment to run the application from by setting the `NODE_ENV` environment variable: ```sh NODE_ENV=development node index.js ``` Three example files are provided in this repository, you can copy and customise them to your liking: ```sh cp config/development.sample.json config/development.json ``` ```sh cp config/test.sample.json config/test.json ``` ```sh cp config/production.sample.json config/production.json ``` The [production example](config/production.sample.json) uses all the existing configuration options as it would typically be used in a containerised environment: ```json { "port": 8080, "noindex": true, "readonly": false, "webservice": { "database": "mongodb://user:password@mongo-host:27017/pa11y", "host": "0.0.0.0", "port": 3000, "cron": "0 30 0 * * *", "chromeLaunchConfig": { "args": [ "--no-sandbox", "--disable-setuid-sandbox" ] } } } ``` The [available configurations](#configurations) are documented in the next section. If you run into problems, check the [troubleshooting guide](#troubleshooting). ### Running in Docker and other containerised environments Pa11y Dashboard uses Puppeteer to launch a Chromium browser for accessibility testing. If you are running Pa11y Dashboard inside a Docker container, a Kubernetes pod, or any similar containerised environment, you will almost certainly need to pass the `--no-sandbox` and `--disable-setuid-sandbox` flags to Chromium. This is necessary because Chromium relies on Linux user namespaces to sandbox its renderer processes. Disabling Chrome's sandbox with `--no-sandbox` is standard practice in containerised deployments and is safe provided the container runtime's own isolation is in place. The `--disable-setuid-sandbox` flag disables Chrome's older setuid-based sandbox fallback, which requires a setuid-root helper binary that is typically unavailable (and undesirable) in non-root container images. Set these flags using the `CHROMIUM_FLAGS` environment variable or the `chromeLaunchConfig.args` config file option, as shown in the [configuration examples above](#configuring-pa11y-dashboard). #### Cloud environment considerations Pa11y Dashboard runs by default an embedded instance of [Pa11y Webservice][pa11y-webservice], which schedules accessibility tests using a cron expression. Each instance of the webservice runs its own independent cron scheduler with no distributed queue. If you deploy multiple replicas (as is typically the default in most cloud environments) of Pa11y Dashboard with an embedded webservice, every replica will trigger the same scheduled tests independently. This will result in duplicated test runs and duplicated results in the database. To avoid this, consider one of the following approaches: - **Limit to a single replica.** If running the embedded webservice, ensure only one replica is active. This is the simplest option but sacrifices availability. - **Run the webservice separately.** Deploy [Pa11y Webservice][pa11y-webservice] as a single-instance service and point the dashboard at it by setting [`webservice`](#webservice) to its URL. This way you can scale the dashboard replicas freely without duplicating scheduled tests. #### Example Dockerfile An example Dockerfile is provided at [`Dockerfile.example`](Dockerfile.example) to help you get started with containerised deployments. It is a starting point — **you are expected to review it and adapt it to your specific infrastructure before use**. The example Dockerfile handles the non-obvious parts of containerising a Puppeteer-based application: - **Multi-stage build** to keep the final image small (build tools and git are not included in the runtime image). - **Chromium system dependencies** — Puppeteer bundles its own Chromium binary, but that binary depends on shared libraries that are not present in slim base images. The Dockerfile installs all required libraries in both the build and runtime stages. - **Puppeteer cache directory** — Puppeteer downloads Chromium to a cache directory during `npm install`. By default this goes to `~/.cache`, which is outside the application directory and would not survive the `COPY --from=build` step in a multi-stage build. The Dockerfile sets `PUPPETEER_CACHE_DIR` inside the application directory so the Chromium binary is carried over to the final image. - **Non-root user** — the application and Chromium run as a non-root user (`pptruser`). The Dockerfile does **not** include MongoDB. You are expected to provision your database separately (as a managed service, a sidecar container, or however your organisation handles databases) and pass the connection string via the `WEBSERVICE_DATABASE` environment variable. **Approach 1 — Dockerfile inside the pa11y-dashboard repo:** If you are building directly from a clone of this repository then the default `COPY . .` instruction in the example Dockerfile will work. The included [`.dockerignore`](.dockerignore) excludes tests, development tooling, and config files from the build context. Copy the example and build: ```sh cp Dockerfile.example Dockerfile docker build -t pa11y-dashboard . ``` **Approach 2 — Dockerfile in a separate deployment repo:** If you prefer to keep your deployment configuration (Dockerfile, CI/CD pipeline, manifests) in a separate repository, switch from `COPY . .` to the commented-out `git clone` alternative in the Dockerfile. This clones pa11y-dashboard at a pinned version during the build, keeping your deployment repo independent from the application source code. See the comments in `Dockerfile.example` for instructions. **Running the image:** Pass all configuration via environment variables at runtime. No config files need to be baked into the image. For example: ```sh docker run -p 4000:4000 \ -e WEBSERVICE_DATABASE="mongodb://user:password@your-mongo-host:27017/pa11y" \ -e WEBSERVICE_HOST="0.0.0.0" \ -e WEBSERVICE_CRON="0 30 0 * * *" \ -e CHROMIUM_FLAGS="--no-sandbox,--disable-setuid-sandbox" \ pa11y-dashboard ``` ### Configurations The boot configurations for Pa11y Dashboard are as follows. Look at the sample JSON files in the repo for example usage. #### `port` *(number)* The port to run the application on. Set via a config file or the `PORT` environment variable. #### `noindex` *(boolean)* If set to `true` (default), the dashboard will not be indexed by search engines. Set to `false` to allow indexing. Set via a config file or the `NOINDEX` environment variable. #### `readonly` *(boolean)* If set to `true`, users will not be able to add, delete or run URLs (defaults to `false`). Set via a config file or the `READONLY` environment variable. #### `siteMessage` *(string)* A message to display prominently on the site home page. Defaults to `null`. #### `webservice` This can either be an object containing [Pa11y Webservice configurations][pa11y-webservice-config], or a string which is the base URL of a Pa11y Webservice instance you are running separately. If using environment variables, prefix the webservice vars with `WEBSERVICE_`. #### `chromeLaunchConfig` Configuration for the Chromium instance launched by Pa11y. When using a config file, this is an object nested under `webservice`: ```json "webservice": { "chromeLaunchConfig": { "args": ["--no-sandbox", "--disable-setuid-sandbox"], "executablePath": "/usr/bin/chromium" } } ``` When using environment variables, the following options are available: - `CHROMIUM_FLAGS`: A comma-separated list of flags to pass to Chromium. For example, `--no-sandbox,--disable-setuid-sandbox`. - `CHROMIUM_EXECUTABLE`: The path to a Chromium executable to use instead of Puppeteer's bundled binary. See [Pa11y Dashboard and Linux/Ubuntu](#pa11y-dashboard-and-linuxubuntu) for when this is needed. ## Contributing There are many ways to contribute to Pa11y Dashboard, we cover these in the [contributing guide](CONTRIBUTING.md) for this repo. If you're ready to contribute some code, you'll need to clone the repo and get set up as outlined in the [setup guide](#setting-up-pa11y-dashboard). You'll then need to start the application in test mode with: ```sh NODE_ENV=test node index.js ``` You'll now be able to run the following commands: ```sh npm run lint # Lint the code npm test # Run all tests ``` To compile the client-side JavaScript and CSS, you'll need the following commands. Compiled code is committed to the repository. ```sh make less # Compile the site CSS from LESS files make uglify # Compile and uglify the client-side JavaScript ``` ## Troubleshooting ### Common issues - `500` errors or `Could not connect to pa11y-webservice` messages are often related to MongoDB. Ensure that you have the [appropriate version of MongoDB](#installing-mongodb) installed, and that it's running - it doesn't always start automatically. - Error messages saying that pa11y-webservice isn't running may be due to dependency installation problems. Try deleting your `pa11y-dashboard/node_modules` directory and running `npm install` again. ### Create a new issue Check the [issue tracker][issues] for similar issues before creating a new one. If the problem that you're experiencing is not covered by one of the existing issues, you can [create a new issue][issues-create]. Please include your node.js and MongoDB version numbers, and your operating system, as well as any information that may be useful in debugging the issue. ## Support and migration > [!NOTE] > We maintain a [migration guide](MIGRATION.md) to help you migrate between major versions. When we release a new major version we will continue to support the previous major version for 6 months. This support will be limited to fixes for critical bugs and security issues. If you're opening an issue related to this project, please mention the specific version that the issue affects. The following table lists the major versions available and, for each previous major version, its end-of-support date, and its final minor version released. | Major version | Last minor release | Node.js support | Support end date | | :------------ | :----------------- | :-------------------------- | :--------------- | | `5` | | `20`, `22`, `24` | ✅ Current major version | | `4` | `4.2` | `12`, `14`, `16`, `18`, `20`| May 2026 | | `3` | `3.3` | `8`, `10` | May 2022 | | `2` | `2.4` | `4`, `6` | January 2020 | | `1` | `1.12` | `0.10`, `0.12`, `4`, `6` | December 2016 | ## License Pa11y Dashboard is licensed under the [GNU General Public License 3.0][info-license]. Copyright © 2016-2025, Team Pa11y and contributors [homebrew]: https://brew.sh/ [issues]: https://github.com/pa11y/pa11y-dashboard/issues?utf8=%E2%9C%93&q=is%3Aissue [issues-create]: https://github.com/pa11y/pa11y-dashboard/issues/new [mongodb]: http://www.mongodb.org/ [mongodb-package]: https://www.npmjs.com/package/mongodb [mongodb-package-compatibility]: https://docs.mongodb.com/drivers/node/current/compatibility [node]: http://nodejs.org/ [pa11y]: https://github.com/pa11y/pa11y [pa11y-webservice-config]: https://github.com/pa11y/webservice#configurations [info-node]: package.json [info-build]: https://github.com/pa11y/pa11y-dashboard/actions/workflows/tests.yml [info-license]: LICENSE [shield-version]: https://img.shields.io/github/package-json/v/pa11y/pa11y-dashboard.svg [shield-node]: https://img.shields.io/node/v/pa11y/pa11y-dashboard.svg [shield-build]: https://github.com/pa11y/pa11y-dashboard/actions/workflows/tests.yml/badge.svg [shield-license]: https://img.shields.io/badge/license-GPL%203.0-blue.svg ================================================ FILE: app.js ================================================ // This file is part of Pa11y Dashboard. // // Pa11y Dashboard is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Pa11y Dashboard is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Pa11y Dashboard. If not, see . 'use strict'; const bodyParser = require('body-parser'); const compression = require('compression'); const createClient = require('pa11y-webservice-client-node'); const {EventEmitter} = require('events'); const express = require('express'); const hbs = require('express-hbs'); const morgan = require('morgan'); const {nanoid} = require('nanoid'); const http = require('http'); const path = require('path'); const pkg = require('./package.json'); module.exports = initApp; function initApp(config, callback) { config = defaultConfig(config); let webserviceUrl = config.webservice; if (typeof webserviceUrl === 'object') { webserviceUrl = `http://${webserviceUrl.host}:${webserviceUrl.port}/`; } const app = new EventEmitter(); app.express = express(); app.server = http.createServer(app.express); app.webservice = createClient(webserviceUrl); loadMiddleware(app); // View engine loadViewEngine(app, config); // Load routes loadRoutes(app, config); // Error handling loadErrorHandling(app, config, callback); } function defaultConfig(config) { if (typeof config.noindex !== 'boolean') { config.noindex = true; } if (typeof config.readonly !== 'boolean') { config.readonly = false; } return config; } function loadMiddleware(app) { app.express.use(compression()); // Adds an ID to every request, used later for logging app.express.use(addRequestId); // Logging middleware morgan.token('id', request => { return request.id; }); // Log the start of all HTTP requests const startLog = '[:date[iso] #:id] Started :method :url for :remote-addr'; // Immediate: true is required to log the request // before the response happens app.express.use(morgan(startLog, {immediate: true})); // Log the end of all HTTP requests const endLog = '[:date[iso] #:id] Completed :status :res[content-length] in :response-time ms'; app.express.use(morgan(endLog)); // Public files app.express.use(express.static(path.join(__dirname, 'public'), { maxAge: (process.env.NODE_ENV === 'production' ? 604800000 : 0) })); // General express config app.express.disable('x-powered-by'); app.express.use(bodyParser.urlencoded({ extended: true })); } function loadViewEngine(app, config) { app.express.engine('html', hbs.express4({ extname: '.html', contentHelperName: 'content', layoutsDir: path.join(__dirname, 'view', 'layout'), partialsDir: path.join(__dirname, 'view', 'partial'), defaultLayout: path.join(__dirname, 'view', 'layout', 'default') })); app.express.set('views', path.join(__dirname, 'view')); app.express.set('view engine', 'html'); // View helpers require('./view/helper/date')(hbs); require('./view/helper/string')(hbs); require('./view/helper/url')(hbs); require('./view/helper/conditionals')(hbs); // Populate view locals app.express.locals = { lang: 'en', year: (new Date()).getFullYear(), version: pkg.version, repo: pkg.homepage, bugtracker: pkg.bugs, noindex: config.noindex, readonly: config.readonly, siteMessage: config.siteMessage, settings: {} }; app.express.use((request, response, next) => { response.locals.isHomePage = (request.path === '/'); response.locals.host = request.hostname; next(); }); } function loadRoutes(app, config) { // Health check endpoint (must be registered before task routes // to avoid the ID parameter matching '/health' as a task ID) require('./route/health')(app); // Because there's some overlap between the different routes, // they have to be loaded in a specific order in order to avoid // passing mongo the wrong id which would result in // "ObjectID generation failed." errors (e.g. #277) require('./route/index')(app); require('./route/result/download')(app); if (!config.readonly) { require('./route/new')(app); require('./route/task/delete')(app); require('./route/task/run')(app); require('./route/task/edit')(app); require('./route/task/ignore')(app); require('./route/task/unignore')(app); } // Needs to be loaded after `/route/new` require('./route/task/index')(app); // Needs to be loaded after `/route/task/edit` require('./route/result/index')(app); } function loadErrorHandling(app, config, callback) { app.express.get('*', (request, response) => { response.status(404); response.render('404'); }); app.express.use((error, request, response, next) => { /* eslint no-unused-vars: 'off' */ if (error.code === 'ECONNREFUSED') { error = new Error('Could not connect to Pa11y Webservice'); } app.emit('route-error', error); if (process.env.NODE_ENV !== 'production') { response.locals.error = error; } response.status(500); response.render('500'); }); app.server.listen(config.port, error => { callback(error, app); }); } // Express middleware function addRequestId(request, response, next) { // Create a random request (nano)id, 10 characters long // Nano ids are [0-9A-Za-z_-] so chance of collision is 1 in 64^10 // If a site has so much traffic that this chance is too high // we probably have worse things to worry about request.id = nanoid(10); next(); } ================================================ FILE: bower.json ================================================ { "name": "pa11y-dashboard", "dependencies": { "jquery": "~1.10", "bootstrap": "~3.0", "flot": "~0.8" } } ================================================ FILE: config/development.sample.json ================================================ { "port": 4000, "noindex": true, "readonly": false, "webservice": { "database": "mongodb://localhost/pa11y-webservice-dev", "host": "0.0.0.0", "port": 3000, "cron": "0 30 0 * * *" } } ================================================ FILE: config/production.sample.json ================================================ { "port": 8080, "noindex": true, "readonly": false, "webservice": { "database": "mongodb://user:password@mongo-host:27017/pa11y", "host": "0.0.0.0", "port": 3000, "cron": "0 30 0 * * *", "chromeLaunchConfig": { "args": [ "--no-sandbox", "--disable-setuid-sandbox" ] } } } ================================================ FILE: config/test.sample.json ================================================ { "port": 4000, "noindex": true, "readonly": false, "webservice": { "database": "mongodb://127.0.0.1/pa11y-dashboard-integration-test", "host": "127.0.0.1", "port": 3000, "cron": "0 30 0 * * *" } } ================================================ FILE: config.js ================================================ // This file is part of Pa11y Dashboard. // // Pa11y Dashboard is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Pa11y Dashboard is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Pa11y Dashboard. If not, see . 'use strict'; const fs = require('fs'); const environment = (process.env.NODE_ENV || 'development'); const jsonPath = `./config/${environment}.json`; const jsPath = `./config/${environment}.js`; if (fs.existsSync(jsonPath)) { module.exports = require(jsonPath); } else if (fs.existsSync(jsPath)) { module.exports = require(jsPath); } else { const webserviceConfig = { database: env('WEBSERVICE_DATABASE', 'mongodb://localhost/pa11y-webservice'), host: env('WEBSERVICE_HOST', '0.0.0.0'), port: Number(env('WEBSERVICE_PORT', '3000')), cron: env('WEBSERVICE_CRON', false) }; const chromiumFlags = env('CHROMIUM_FLAGS', undefined); const chromiumExecutable = env('CHROMIUM_EXECUTABLE', undefined); if (chromiumFlags || chromiumExecutable) { webserviceConfig.chromeLaunchConfig = {}; if (chromiumFlags) { webserviceConfig.chromeLaunchConfig.args = chromiumFlags.split(','); } if (chromiumExecutable) { webserviceConfig.chromeLaunchConfig.executablePath = chromiumExecutable; } } module.exports = { port: Number(env('PORT', '4000')), noindex: env('NOINDEX', 'true') === 'true', readonly: env('READONLY', 'false') === 'true', webservice: env('WEBSERVICE_URL', webserviceConfig) }; } function env(name, defaultValue) { const value = process.env[name]; return typeof value === 'string' ? value : defaultValue; } ================================================ FILE: data/standards.js ================================================ // This file is part of Pa11y Dashboard. // // Pa11y Dashboard is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Pa11y Dashboard is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Pa11y Dashboard. If not, see . 'use strict'; module.exports = function getStandards() { return [ { title: 'WCAG2A', rules: [ { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H30.2', description: 'Img element is the only content of the link, but is missing alt text. The alt text should describe the purpose of the link.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H37', description: 'Img element missing an alt attribute. Use the alt attribute to specify a short text alternative.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H67.1', description: 'Img element with empty alt text must have absent or empty title attribute.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H67.2', description: 'Img element is marked so that it is ignored by Assistive Technology.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.G94.Image', description: 'Ensure that the img element\'s alt text serves the same purpose and presents the same information as the image.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H36', description: 'Image submit button missing an alt attribute. Specify a text alternative that describes the button\'s function, using the alt attribute' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.G94.Button', description: 'Ensure that the image submit button\'s alt text identifies the purpose of the button.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H24', description: 'Area element in an image map missing an alt attribute. Each area element must have a text alternative that describes the function of the image map area.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H24.2', description: 'Ensure that the area element\'s text alternative serves the same purpose as the part of image map image it references.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.G73,G74', description: 'If this image cannot be fully described in a short text alternative, ensure a long text alternative is also available, such as in the body text or through a link.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H2.EG5', description: 'Img element inside a link must not use alt text that duplicates the text content of the link.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H2.EG4', description: 'Img element inside a link has empty or missing alt text when a link beside it contains link text. Consider combining the links.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H2.EG3', description: 'Img element inside a link must not use alt text that duplicates the content of a text link beside it.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H53', description: 'Object elements must contain a text alternative after all other alternatives are exhausted.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.G94,G92.Object', description: 'Check that short (and if appropriate, long) text alternatives are available for non-text content that serve the same purpose and present the same information.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H35.3', description: 'Applet elements must contain a text alternative in the element\'s body, for browsers without support for the applet element.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.H35.2', description: 'Applet elements must contain an alt attribute, to provide a text alternative to browsers supporting the element but are unable to load the applet.' }, { name: 'WCAG2A.Principle1.Guideline1_1.1_1_1.G94,G92.Applet', description: 'Check that short (and if appropriate, long) text alternatives are available for non-text content that serve the same purpose and present the same information.' }, { name: 'WCAG2A.Principle1.Guideline1_2.1_2_1.G158', description: 'If this embedded object contains pre-recorded audio only, and is not provided as an alternative for text content, check that an alternative text version is available.' }, { name: 'WCAG2A.Principle1.Guideline1_2.1_2_1.G159,G166', description: 'If this embedded object contains pre-recorded video only, and is not provided as an alternative for text content, check that an alternative text version is available, or an audio track is provided that presents equivalent information.' }, { name: 'WCAG2A.Principle1.Guideline1_2.1_2_2.G87,G93', description: 'If this embedded object contains pre-recorded synchronised media and is not provided as an alternative for text content, check that captions are provided for audio content.' }, { name: 'WCAG2A.Principle1.Guideline1_2.1_2_3.G69,G78,G173,G8', description: 'If this embedded object contains pre-recorded synchronised media and is not provided as an alternative for text content, check that an audio description of its video, and/or an alternative text version of the content is provided.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H42.2', description: 'Heading tag found with no content. Text that is not intended as a heading should not be marked up with heading tags.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H93', description: 'Multiple labels exist with the same "for" attribute. If these labels refer to different form controls, the controls should have unique "id" attributes.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.NonExistent', description: 'This label\'s "for" attribute contains an ID that does not exist in the document.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.NonExistentFragment', description: 'This label\'s "for" attribute contains an ID that does not exist in the document fragment.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.NotFormControl', description: 'This label\'s "for" attribute contains an ID that points to an element that is not a form control.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.NoForAttr', description: 'Label found without a "for" attribute, and therefore not explicitly associated with a form control.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.NoId', description: 'Form control does not have an ID, therefore it cannot have an explicit label.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H65.3', description: 'Form control without a label contains an empty title attribute. The title attribute should identify the purpose of the control.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H65', description: 'Check that the title attribute identifies the purpose of the control, and that a label element is not appropriate.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.2', description: 'Form control does not have an explicit label or title attribute, identifying the purpose of the control.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.NoLabelAllowed', description: 'Label element should not be used for this type of form control.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.1.After', description: 'The label element for this control should be placed after this element.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H44.1.Before', description: 'The label element for this control should be placed before this element.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H49.[NodeName]', description: 'Semantic markup should be used to mark emphasised or special text so that it can be programmatically determined.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H49.AlignAttr', description: 'Semantic markup should be used to mark emphasised or special text so that it can be programmatically determined.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H42', description: 'Heading markup should be used if this content is intended as a heading.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H63.3', description: 'Table cell has an invalid scope attribute. Valid values are row, col, rowgroup, or colgroup.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H63.2', description: 'Scope attributes on td elements that act as headers for other elements are obsolete in HTML5. Use a th element instead.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H43.ScopeAmbiguous', description: 'Scope attributes on th elements are ambiguous in a table with multiple levels of headings. Use the headers attribute on td elements instead.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H43.IncorrectAttr', description: 'Incorrect headers attribute on this td element. Expected "[expected headers]" but found "[actual headers]"' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H43.HeadersRequired', description: 'The relationship between td elements and their associated th elements is not defined. As this table has multiple levels of th elements, you must use the headers attribute on td elements.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H43.MissingHeaderIds', description: 'Not all th elements in this table contain an id attribute. These cells should contain ids so that they may be referenced by td elements headers attributes.\'' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H43.MissingHeadersAttrs', description: 'Not all td elements in this table contain a headers attribute. Each headers attribute should list the ids of all th elements associated with that cell.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H43,H63', description: 'The relationship between td elements and their associated th elements is not defined. Use either the scope attribute on th elements, or the headers attribute on td elements.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H63.1', description: 'Not all th elements in this table have a scope attribute. These cells should contain a scope attribute to identify their association with td elements.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H39,H73.4', description: 'If this table is a data table, and both a summary attribute and a caption element are present, the summary should not duplicate the caption.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H73.3.Check', description: 'If this table is a data table, check that the summary attribute describes the tables organization or explains how to use the table.\'' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H73.3.NoSummary', description: 'If this table is a data table, consider using the summary attribute of the table element to give an overview of this table.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H39.3.Check', description: 'If this table is a data table, check that the caption element accurately describes this table.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H39.3.NoCaption', description: 'If this table is a data table, consider using a caption element to the table element to identify this table.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H71.3', description: 'Fieldset does not contain a legend element. All fieldsets should contain a legend element that describes a description of the field group.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H85.2', description: 'If this selection list contains groups of related options, they should be grouped with optgroup.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H71.2', description: 'Radio buttons or check boxes with the same name attribute must be contained within a fieldset element.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H48.1', description: 'Content appears to have the visual appearance of a bulleted list. It may be appropriate to mark this content up using a ul element.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H48.2', description: 'Content appears to have the visual appearance of a numbered list. It may be appropriate to mark this content up using an ol element.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.G141', description: 'The heading structure is not logically nested. This [heading] element (should be a [correct heading] to be properly nested / appears to be the primary document heading, so should be an h1 element).' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_1.H48', description: 'If this element contains a navigation section, it is recommended that it be marked up as a list.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_2.G57', description: 'Check that the content is ordered in a meaningful sequence when linearised, such as when style sheets are disabled.' }, { name: 'WCAG2A.Principle1.Guideline1_3.1_3_3.G96', description: 'Where instructions are provided for understanding the content, do not rely on sensory characteristics alone (such as shape, size or location) to describe objects.' }, { name: 'WCAG2A.Principle1.Guideline1_4.1_4_1.G14,G182', description: 'Check that any information conveyed using colour alone is also available in text, or through other visual cues.' }, { name: 'WCAG2A.Principle1.Guideline1_4.1_4_2.F23', description: 'If any audio plays automatically for longer than 3 seconds, check that there is the ability to pause, stop or mute the audio.' }, { name: 'WCAG2A.Principle1.Guideline1_4.1_4_3.F24.BGColour', description: 'Check that this element has an inherited foreground colour to complement the corresponding inline background colour or image.' }, { name: 'WCAG2A.Principle1.Guideline1_4.1_4_3.F24.FGColour', description: 'Check that this element has an inherited background colour or image to complement the corresponding inline foreground colour.' }, { name: 'WCAG2A.Principle2.Guideline2_1.2_1_1.SCR20.DblClick', description: 'Ensure the functionality provided by double-clicking on this element is available through the keyboard.' }, { name: 'WCAG2A.Principle2.Guideline2_1.2_1_1.SCR20.MouseOver', description: 'Ensure the functionality provided by mousing over this element is available through the keyboard; for instance, using the focus event.' }, { name: 'WCAG2A.Principle2.Guideline2_1.2_1_1.SCR20.MouseOut', description: 'Ensure the functionality provided by mousing out of this element is available through the keyboard; for instance, using the blur event.' }, { name: 'WCAG2A.Principle2.Guideline2_1.2_1_1.SCR20.MouseMove', description: 'Ensure the functionality provided by moving the mouse on this element is available through the keyboard.' }, { name: 'WCAG2A.Principle2.Guideline2_1.2_1_1.SCR20.MouseDown', description: 'Ensure the functionality provided by mousing down on this element is available through the keyboard; for instance, using the keydown event.' }, { name: 'WCAG2A.Principle2.Guideline2_1.2_1_1.SCR20.MouseUp', description: 'Ensure the functionality provided by mousing up on this element is available through the keyboard; for instance, using the keyup event.' }, { name: 'WCAG2A.Principle2.Guideline2_1.2_1_2.F10', description: 'Check that this applet or plugin provides the ability to move the focus away from itself when using the keyboard.' }, { name: 'WCAG2A.1.Principle1.Guideline2_1.2_1_4.Check', description: 'Check that if a keyboard shortcut is implemented in content using only letter (including upper- and lower-case letters), punctuation, number, or symbol characters, then at least one of the following is true: \nTurn off: A mechanism is available to turn the shortcut off;\nRemap: A mechanism is available to remap the shortcut to use one or more non- printable keyboard characters(e.g.Ctrl, Alt, etc);\nActive only on focus: The keyboard shortcut for a user interface component is only active when that component has focus.' }, { name: 'WCAG2A.Principle2.Guideline2_2.2_2_1.F40.2', description: 'Meta refresh tag used to redirect to another page, with a time limit that is not zero. Users cannot control this time limit.' }, { name: 'WCAG2A.Principle2.Guideline2_2.2_2_1.F41.2', description: 'Meta refresh tag used to refresh the current page. Users cannot control the time limit for this refresh.' }, { name: 'WCAG2A.Principle2.Guideline2_2.2_2_2.SCR33,SCR22,G187,G152,G186,G191', description: 'If any part of the content moves, scrolls or blinks for more than 5 seconds, or auto-updates, check that there is a mechanism available to pause, stop, or hide the content.' }, { name: 'WCAG2A.Principle2.Guideline2_2.2_2_2.F4', description: 'Ensure there is a mechanism available to stop this blinking element in less than five seconds.' }, { name: 'WCAG2A.Principle2.Guideline2_2.2_2_2.F47', description: 'Blink elements cannot satisfy the requirement that blinking information can be stopped within five seconds.' }, { name: 'WCAG2A.Principle1.Guideline2_2.2_2_6.Check', description: 'Check that users are warned of the duration of any user inactivity that could cause data loss, unless the data is preserved for more than 20 hours when the user does not take any actions.' }, { name: 'WCAG2A.Principle2.Guideline2_3.2_3_1.G19,G176', description: 'Check that no component of the content flashes more than three times in any 1-second period, or that the size of any flashing area is sufficiently small.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_1.H64.1', description: 'Iframe element requires a non-empty title attribute that identifies the frame.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_1.H64.2', description: 'Check that the title attribute of this element contains text that identifies the frame.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_1.G1,G123,G124,H69', description: 'Ensure that any common navigation elements can be bypassed; for instance, by use of skip links, header elements, or ARIA landmark roles.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchId', description: 'This link points to a named anchor "[link target]" within the document, but no anchor exists with that name.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchIdFragment2.4.2', description: 'This link points to a named anchor "[link target]" within the document, but no anchor exists with that name in the fragment tested.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_2.H25.1.NoTitleEl', description: 'A title should be provided for the document, using a non-empty title element in the head section.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_2.H25.1.EmptyTitle', description: 'The title element in the head section should be non-empty.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_2.H25.2', description: 'Check that the title element describes the document.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_3.H4.2', description: 'If tabindex is used, check that the tab order specified by the tabindex attributes follows relationships in the content.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_4.H77,H78,H79,H80,H81,H33', description: 'Check that the link text combined with programmatically determined link context, or its title attribute, identifies the purpose of the link.' }, { name: 'WCAG2A.Principle2.Guideline2_4.2_4_4.H77,H78,H79,H80,H81', description: 'Check that the link text combined with programmatically determined link context identifies the purpose of the link.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_1.Check', description: 'Check that all functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture, unless a multipoint or path-based gesture is essential.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_2.SinglePointer_Check', description: 'Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_2.Mousedown_Check', description: 'This element has an mousedown event listener. Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_2.Touchstart_Check', description: 'This element has a touchstart event listener. Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_3_F96.Check', description: 'Check that for user interface components with labels that include text or images of text, the name contains the text that is presented visually.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_3_F96.AccessibleName', description: 'Accessible name for this element does not contain the visible label text. Check that for user interface components with labels that include text or images of text, the name contains the text that is presented visually.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_4.Check', description: 'Check that functionality that can be operated by device motion or user motion can also be operated by user interface components and responding to the motion can be disabled to prevent accidental actuation, except when: \nSupported Interface: The motion is used to operate functionality through an accessibility supported interface; \nEssential: The motion is essential for the function and doing so would invalidate the activity.' }, { name: 'WCAG2A.Principle1.Guideline2_5.2_5_4.Devicemotion', description: 'This element has a devicemotion event listener. Check that functionality that can be operated by device motion or user motion can also be operated by user interface components and responding to the motion can be disabled to prevent accidental actuation, except when: \nSupported Interface: The motion is used to operate functionality through an accessibility supported interface; \nEssential: The motion is essential for the function and doing so would invalidate the activity.' }, { name: 'WCAG2A.Principle3.Guideline3_1.3_1_1.H57.2', description: 'The html element should have a lang or xml:lang attribute which describes the language of the document.' }, { name: 'WCAG2A.Principle3.Guideline3_1.3_1_1.H57.3.Lang', description: 'The language specified in the lang attribute of the document element does not appear to be well-formed.' }, { name: 'WCAG2A.Principle3.Guideline3_1.3_1_1.H57.3.XmlLang', description: 'The language specified in the xml:lang attribute of the document element does not appear to be well-formed.' }, { name: 'WCAG2A.Principle3.Guideline3_2.3_2_1.G107', description: 'Check that a change of context does not occur when any input field receives focus.' }, { name: 'WCAG2A.Principle3.Guideline3_2.3_2_2.H32.2', description: 'Form does not contain a submit button (input type="submit", input type="image", or button type="submit").' }, { name: 'WCAG2A.Principle3.Guideline3_3.3_3_1.G83,G84,G85', description: 'If an input error is automatically detected in this form, check that the item(s) in error are identified and the error(s) are described to the user in text.' }, { name: 'WCAG2A.Principle3.Guideline3_3.3_3_2.G131,G89,G184,H90', description: 'Check that descriptive labels or instructions (including for required fields) are provided for user input in this form.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_1.F77', description: 'Duplicate id attribute value "[Element ID]" found on the web page.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91.A.Empty', description: 'Anchor element found with an ID but without a href or link text. Consider moving its ID to a parent or nearby element.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91.A.EmptyWithName', description: 'Anchor element found with a name attribute but without a href or link text. Consider moving the name attribute to become an ID of a parent or nearby element.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91.A.EmptyNoId', description: 'Anchor element found with no link content and no name and/or ID attribute.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91.A.NoHref', description: 'Anchor elements should not be used for defining in-page link targets. If not using the ID for other purposes (such as CSS or scripting), consider moving it to a parent element.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91.A.Placeholder', description: 'Anchor element found with link content, but no href and/or ID attribute has been supplied.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91.A.NoContent', description: 'Anchor element found with a valid href attribute, but no link content has been supplied.' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91.[NodeName].Name', description: 'This /[element type/] does not have a name available to an accessibility API. Valid names are [valid names for this element].' }, { name: 'WCAG2A.Principle4.Guideline4_1.4_1_2.H91./[NodeName/].Value', description: 'This /[element type/] does not have a value available to an accessibility API. Add one /[using a element-specific method/].' } ] }, { title: 'WCAG2AA', rules: [ { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H30.2', description: 'Img element is the only content of the link, but is missing alt text. The alt text should describe the purpose of the link.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H37', description: 'Img element missing an alt attribute. Use the alt attribute to specify a short text alternative.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H67.1', description: 'Img element with empty alt text must have absent or empty title attribute.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H67.2', description: 'Img element is marked so that it is ignored by Assistive Technology.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.G94.Image', description: 'Ensure that the img element\'s alt text serves the same purpose and presents the same information as the image.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H36', description: 'Image submit button missing an alt attribute. Specify a text alternative that describes the button\'s function, using the alt attribute' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.G94.Button', description: 'Ensure that the image submit button\'s alt text identifies the purpose of the button.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H24', description: 'Area element in an image map missing an alt attribute. Each area element must have a text alternative that describes the function of the image map area.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H24.2', description: 'Ensure that the area element\'s text alternative serves the same purpose as the part of image map image it references.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.G73,G74', description: 'If this image cannot be fully described in a short text alternative, ensure a long text alternative is also available, such as in the body text or through a link.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H2.EG5', description: 'Img element inside a link must not use alt text that duplicates the text content of the link.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H2.EG4', description: 'Img element inside a link has empty or missing alt text when a link beside it contains link text. Consider combining the links.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H2.EG3', description: 'Img element inside a link must not use alt text that duplicates the content of a text link beside it.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H53', description: 'Object elements must contain a text alternative after all other alternatives are exhausted.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.G94,G92.Object', description: 'Check that short (and if appropriate, long) text alternatives are available for non-text content that serve the same purpose and present the same information.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H35.3', description: 'Applet elements must contain a text alternative in the element\'s body, for browsers without support for the applet element.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.H35.2', description: 'Applet elements must contain an alt attribute, to provide a text alternative to browsers supporting the element but are unable to load the applet.' }, { name: 'WCAG2AA.Principle1.Guideline1_1.1_1_1.G94,G92.Applet', description: 'Check that short (and if appropriate, long) text alternatives are available for non-text content that serve the same purpose and present the same information.' }, { name: 'WCAG2AA.Principle1.Guideline1_2.1_2_1.G158', description: 'If this embedded object contains pre-recorded audio only, and is not provided as an alternative for text content, check that an alternative text version is available.' }, { name: 'WCAG2AA.Principle1.Guideline1_2.1_2_1.G159,G166', description: 'If this embedded object contains pre-recorded video only, and is not provided as an alternative for text content, check that an alternative text version is available, or an audio track is provided that presents equivalent information.' }, { name: 'WCAG2AA.Principle1.Guideline1_2.1_2_2.G87,G93', description: 'If this embedded object contains pre-recorded synchronised media and is not provided as an alternative for text content, check that captions are provided for audio content.' }, { name: 'WCAG2AA.Principle1.Guideline1_2.1_2_4.G9,G87,G93', description: 'If this embedded object contains synchronised media, check that captions are provided for live audio content.' }, { name: 'WCAG2AA.Principle1.Guideline1_2.1_2_5.G78,G173,G8', description: 'If this embedded object contains pre-recorded synchronised media, check that an audio description is provided for its video content.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H42.2', description: 'Heading tag found with no content. Text that is not intended as a heading should not be marked up with heading tags.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H93', description: 'Multiple labels exist with the same "for" attribute. If these labels refer to different form controls, the controls should have unique "id" attributes.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.NonExistent', description: 'This label\'s "for" attribute contains an ID that does not exist in the document.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.NonExistentFragment', description: 'This label\'s "for" attribute contains an ID that does not exist in the document fragment.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.NotFormControl', description: 'This label\'s "for" attribute contains an ID that points to an element that is not a form control.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.NoForAttr', description: 'Label found without a "for" attribute, and therefore not explicitly associated with a form control.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.NoId', description: 'Form control does not have an ID, therefore it cannot have an explicit label.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H65.3', description: 'Form control without a label contains an empty title attribute. The title attribute should identify the purpose of the control.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H65', description: 'Check that the title attribute identifies the purpose of the control, and that a label element is not appropriate.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.2', description: 'Form control does not have an explicit label or title attribute, identifying the purpose of the control.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.NoLabelAllowed', description: 'Label element should not be used for this type of form control.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.1.After', description: 'The label element for this control should be placed after this element.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H44.1.Before', description: 'The label element for this control should be placed before this element.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H49.[NodeName]', description: 'Semantic markup should be used to mark emphasised or special text so that it can be programmatically determined.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr', description: 'Semantic markup should be used to mark emphasised or special text so that it can be programmatically determined.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H42', description: 'Heading markup should be used if this content is intended as a heading.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H63.3', description: 'Table cell has an invalid scope attribute. Valid values are row, col, rowgroup, or colgroup.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H63.2', description: 'Scope attributes on td elements that act as headers for other elements are obsolete in HTML5. Use a th element instead.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H43.ScopeAmbiguous', description: 'Scope attributes on th elements are ambiguous in a table with multiple levels of headings. Use the headers attribute on td elements instead.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H43.IncorrectAttr', description: 'Incorrect headers attribute on this td element. Expected "[expected headers]" but found "[actual headers]"' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H43.HeadersRequired', description: 'The relationship between td elements and their associated th elements is not defined. As this table has multiple levels of th elements, you must use the headers attribute on td elements.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H43.MissingHeaderIds', description: 'Not all th elements in this table contain an id attribute. These cells should contain ids so that they may be referenced by td elements headers attributes.\'' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H43.MissingHeadersAttrs', description: 'Not all td elements in this table contain a headers attribute. Each headers attribute should list the ids of all th elements associated with that cell.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H43,H63', description: 'The relationship between td elements and their associated th elements is not defined. Use either the scope attribute on th elements, or the headers attribute on td elements.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H63.1', description: 'Not all th elements in this table have a scope attribute. These cells should contain a scope attribute to identify their association with td elements.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H39,H73.4', description: 'If this table is a data table, and both a summary attribute and a caption element are present, the summary should not duplicate the caption.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H73.3.Check', description: 'If this table is a data table, check that the summary attribute describes the tables organization or explains how to use the table.\'' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H73.3.NoSummary', description: 'If this table is a data table, consider using the summary attribute of the table element to give an overview of this table.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H39.3.Check', description: 'If this table is a data table, check that the caption element accurately describes this table.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H39.3.NoCaption', description: 'If this table is a data table, consider using a caption element to the table element to identify this table.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H71.3', description: 'Fieldset does not contain a legend element. All fieldsets should contain a legend element that describes a description of the field group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H85.2', description: 'If this selection list contains groups of related options, they should be grouped with optgroup.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H71.2', description: 'Radio buttons or check boxes with the same name attribute must be contained within a fieldset element.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H48.1', description: 'Content appears to have the visual appearance of a bulleted list. It may be appropriate to mark this content up using a ul element.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H48.2', description: 'Content appears to have the visual appearance of a numbered list. It may be appropriate to mark this content up using an ol element.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.G141', description: 'The heading structure is not logically nested. This [heading] element (should be a [correct heading] to be properly nested / appears to be the primary document heading, so should be an h1 element).' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_1.H48', description: 'If this element contains a navigation section, it is recommended that it be marked up as a list.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_2.G57', description: 'Check that the content is ordered in a meaningful sequence when linearised, such as when style sheets are disabled.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_3.G96', description: 'Where instructions are provided for understanding the content, do not rely on sensory characteristics alone (such as shape, size or location) to describe objects.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_4.RestrictView', description: 'Check that content does not restrict its view and operation to a single display orientation, such as portrait or landscape, unless a specific display orientation is essential.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.FaultyValue', description: 'This element contains a potentially faulty value in its autocomplete attribute.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Text', description: 'Invalid autocomplete value. Element does not belong to Text control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Multiline', description: 'Invalid autocomplete value. Element does not belong to Multiline control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Password', description: 'Invalid autocomplete value. Element does not belong to Password control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Url', description: 'Invalid autocomplete value. Element does not belong to Url control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Telephone', description: 'Invalid autocomplete value. Element does not belong to Telephone control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Numeric', description: 'Invalid autocomplete value. Element does not belong to Numeric control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Month', description: 'Invalid autocomplete value. Element does not belong to Month control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Date', description: 'Invalid autocomplete value. Element does not belong to Date control group.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.Purpose', description: 'Check that the input field serves a purpose identified in the Input Purposes for User Interface Components section; and that the content is implemented using technologies with support for identifying the expected meaning for form input data.' }, { name: 'WCAG2AA.Principle1.Guideline1_3.1_3_5_H98.MissingAutocomplete', description: 'This element does not have an autocomplete attribute. If this field collects information about the user, consider adding one to comply with this Success Criterion.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_1.G14,G182', description: 'Check that any information conveyed using colour alone is also available in text, or through other visual cues.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_2.F23', description: 'If any audio plays automatically for longer than 3 seconds, check that there is the ability to pause, stop or mute the audio.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.G18.Fail', description: 'This element has insufficient contrast at this conformance level. Expected a contrast ratio of at least 4.5:1, but text in this element has a contrast ratio of /{value/}. Recommendation: /{colour recommendations/}.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.G145', description: 'This element has insufficient contrast at this conformance level. Expected a contrast ratio of at least 3:1, but text in this element has a contrast ratio of /{value/}. Recommendation: /{colour recommendations/}.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.G18', description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 4.5:1.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.G1451', description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 3:1.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.F24.BGColour', description: 'Check that this element has an inherited foreground colour to complement the corresponding inline background colour or image.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_3.F24.FGColour', description: 'Check that this element has an inherited background colour or image to complement the corresponding inline foreground colour.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_4.G142', description: 'Check that text can be resized without assistive technology up to 200 percent without loss of content or functionality.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_5.G140,C22,C30.AALevel', description: 'If the technologies being used can achieve the visual presentation, check that text is used to convey information rather than images of text, except when the image of text is essential to the information being conveyed, or can be visually customised to the user\'s requirements.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Check', description: 'Check that content can be presented without loss of information or functionality, and without requiring scrolling in two dimensions for: \nVertical scrolling content at a width equivalent to 320 CSS pixels;\\n Horizontal scrolling content at a height equivalent to 256 CSS pixels; \nExcept for parts of the content which require two-dimensional layout for usage or meaning.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Fixed', description: 'Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Scrolling' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Zoom', description: 'Interfering with a user agents ability to zoom may be a failure of this Success Criterion.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_11_G195,G207,G18,G145,G174,F78.Check', description: 'Check that the visual presentation of the following have a contrast ratio of at least 3:1 against adjacent color(s): \nUser Interface Components: Visual information required to identify user interface components and states, except for inactive components or where the appearance of the component is determined by the user agent and not modified by the author; \nGraphical Objects: Parts of graphics required to understand the content, except when a particular presentation of graphics is essential to the information being conveyed.' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_12_C36,C35.Check', description: 'Check that no loss of content or functionality occurs by setting all of the following and by changing no other style property: \nLine height(line spacing) to at least 1.5 times the font size; \nSpacing following paragraphs to at least 2 times the font size; \nLetter spacing(tracking) to at least 0.12 times the font size; \nWord spacing to at least 0.16 times the font size' }, { name: 'WCAG2AA.Principle1.Guideline1_4.1_4_13_F95.Check', description: 'Check that where receiving and then removing pointer hover or keyboard focus triggers additional content to become visible and then hidden, the following are true: \nDismissable: A mechanism is available to dismiss the additional content without moving pointer hover or keyboard focus, unless the additional content communicates an input error or does not obscure or replace other content; \nHoverable: If pointer hover can trigger the additional content, then the pointer can be moved over the additional content without the additional content disappearing; \nPersistent: The additional content remains visible until the hover or focus trigger is removed, the user dismisses it, or its information is no longer valid.' }, { name: 'WCAG2AA.Principle2.Guideline2_1.2_1_1.SCR20.DblClick', description: 'Ensure the functionality provided by double-clicking on this element is available through the keyboard.' }, { name: 'WCAG2AA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOver', description: 'Ensure the functionality provided by mousing over this element is available through the keyboard; for instance, using the focus event.' }, { name: 'WCAG2AA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOut', description: 'Ensure the functionality provided by mousing out of this element is available through the keyboard; for instance, using the blur event.' }, { name: 'WCAG2AA.Principle2.Guideline2_1.2_1_1.SCR20.MouseMove', description: 'Ensure the functionality provided by moving the mouse on this element is available through the keyboard.' }, { name: 'WCAG2AA.Principle2.Guideline2_1.2_1_1.SCR20.MouseDown', description: 'Ensure the functionality provided by mousing down on this element is available through the keyboard; for instance, using the keydown event.' }, { name: 'WCAG2AA.Principle2.Guideline2_1.2_1_1.SCR20.MouseUp', description: 'Ensure the functionality provided by mousing up on this element is available through the keyboard; for instance, using the keyup event.' }, { name: 'WCAG2AA.Principle2.Guideline2_1.2_1_2.F10', description: 'Check that this applet or plugin provides the ability to move the focus away from itself when using the keyboard.' }, { name: 'WCAG2AA.Principle1.Guideline2_1.2_1_4.Check', description: 'Check that if a keyboard shortcut is implemented in content using only letter (including upper- and lower-case letters), punctuation, number, or symbol characters, then at least one of the following is true: \nTurn off: A mechanism is available to turn the shortcut off; \nRemap: A mechanism is available to remap the shortcut to use one or more non- printable keyboard characters(e.g.Ctrl, Alt, etc); \nActive only on focus: The keyboard shortcut for a user interface component is only active when that component has focus.' }, { name: 'WCAG2AA.Principle2.Guideline2_2.2_2_1.F40.2', description: 'Meta refresh tag used to redirect to another page, with a time limit that is not zero. Users cannot control this time limit.' }, { name: 'WCAG2AA.Principle2.Guideline2_2.2_2_1.F41.2', description: 'Meta refresh tag used to refresh the current page. Users cannot control the time limit for this refresh.' }, { name: 'WCAG2AA.Principle2.Guideline2_2.2_2_2.SCR33,SCR22,G187,G152,G186,G191', description: 'If any part of the content moves, scrolls or blinks for more than 5 seconds, or auto-updates, check that there is a mechanism available to pause, stop, or hide the content.' }, { name: 'WCAG2AA.Principle2.Guideline2_2.2_2_2.F4', description: 'Ensure there is a mechanism available to stop this blinking element in less than five seconds.' }, { name: 'WCAG2AA.Principle2.Guideline2_2.2_2_2.F47', description: 'Blink elements cannot satisfy the requirement that blinking information can be stopped within five seconds.' }, { name: 'WCAG2AA.Principle1.Guideline2_2.2_2_6.Check', description: 'Check that users are warned of the duration of any user inactivity that could cause data loss, unless the data is preserved for more than 20 hours when the user does not take any actions.' }, { name: 'WCAG2AA.Principle2.Guideline2_3.2_3_1.G19,G176', description: 'Check that no component of the content flashes more than three times in any 1-second period, or that the size of any flashing area is sufficiently small.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_1.H64.1', description: 'Iframe element requires a non-empty title attribute that identifies the frame.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_1.H64.2', description: 'Check that the title attribute of this element contains text that identifies the frame.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_1.G1,G123,G124,H69', description: 'Ensure that any common navigation elements can be bypassed; for instance, by use of skip links, header elements, or ARIA landmark roles.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchId', description: 'This link points to a named anchor "[link target]" within the document, but no anchor exists with that name.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchIdFragment2.4.2', description: 'This link points to a named anchor "[link target]" within the document, but no anchor exists with that name in the fragment tested.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_2.H25.1.NoTitleEl', description: 'A title should be provided for the document, using a non-empty title element in the head section.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_2.H25.1.EmptyTitle', description: 'The title element in the head section should be non-empty.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_2.H25.2', description: 'Check that the title element describes the document.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_3.H4.2', description: 'If tabindex is used, check that the tab order specified by the tabindex attributes follows relationships in the content.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_4.H77,H78,H79,H80,H81,H33', description: 'Check that the link text combined with programmatically determined link context, or its title attribute, identifies the purpose of the link.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_4.H77,H78,H79,H80,H81', description: 'Check that the link text combined with programmatically determined link context identifies the purpose of the link.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_5.G125,G64,G63,G161,G126,G185', description: 'If this Web page is not part of a linear process, check that there is more than one way of locating this Web page within a set of Web pages.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_6.G130,G131', description: 'Check that headings and labels describe topic or purpose.' }, { name: 'WCAG2AA.Principle2.Guideline2_4.2_4_7.G149,G165,G195,C15,SCR31', description: 'Check that there is at least one mode of operation where the keyboard focus indicator can be visually located on user interface controls.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_1.Check', description: 'Check that all functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture, unless a multipoint or path-based gesture is essential.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_2.SinglePointer_Check', description: 'Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_2.Mousedown_Check', description: 'This element has an mousedown event listener. Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_2.Touchstart_Check', description: 'This element has a touchstart event listener. Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_3_F96.Check', description: 'Check that for user interface components with labels that include text or images of text, the name contains the text that is presented visually.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_3_F96.AccessibleName', description: 'Accessible name for this element does not contain the visible label text. Check that for user interface components with labels that include text or images of text, the name contains the text that is presented visually.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_4.Check', description: 'Check that functionality that can be operated by device motion or user motion can also be operated by user interface components and responding to the motion can be disabled to prevent accidental actuation, except when: \nSupported Interface: The motion is used to operate functionality through an accessibility supported interface; \nEssential: The motion is essential for the function and doing so would invalidate the activity.' }, { name: 'WCAG2AA.Principle1.Guideline2_5.2_5_4.Devicemotion', description: 'WCAG2AA.This element has a devicemotion event listener. Check that functionality that can be operated by device motion or user motion can also be operated by user interface components and responding to the motion can be disabled to prevent accidental actuation, except when: \nSupported Interface: The motion is used to operate functionality through an accessibility supported interface; \nEssential: The motion is essential for the function and doing so would invalidate the activity.' }, { name: 'WCAG2AA.Principle3.Guideline3_1.3_1_1.H57.2', description: 'The html element should have a lang or xml:lang attribute which describes the language of the document.' }, { name: 'WCAG2AA.Principle3.Guideline3_1.3_1_1.H57.3.Lang', description: 'The language specified in the lang attribute of the document element does not appear to be well-formed.' }, { name: 'WCAG2AA.Principle3.Guideline3_1.3_1_1.H57.3.XmlLang', description: 'The language specified in the xml:lang attribute of the document element does not appear to be well-formed.' }, { name: 'WCAG2AA.Principle3.Guideline3_1.3_1_2.H58', description: 'Ensure that any change in language is marked using the lang and/or xml:lang attribute on an element, as appropriate.' }, { name: 'WCAG2AA.Principle3.Guideline3_1.3_1_2.H58.1.Lang', description: 'The language specified in the lang attribute of this element does not appear to be well-formed.' }, { name: 'WCAG2AA.Principle3.Guideline3_1.3_1_2.H58.1.XmlLang', description: 'The language specified in the xml:lang attribute of this element does not appear to be well-formed.' }, { name: 'WCAG2AA.Principle3.Guideline3_2.3_2_1.G107', description: 'Check that a change of context does not occur when any input field receives focus.' }, { name: 'WCAG2AA.Principle3.Guideline3_2.3_2_2.H32.2', description: 'Form does not contain a submit button (input type="submit", input type="image", or button type="submit").' }, { name: 'WCAG2AA.Principle3.Guideline3_2.3_2_3.G61', description: 'Check that navigational mechanisms that are repeated on multiple Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.' }, { name: 'WCAG2AA.Principle3.Guideline3_2.3_2_4.G197', description: 'Check that components that have the same functionality within this Web page are identified consistently in the set of Web pages to which it belongs.' }, { name: 'WCAG2AA.Principle3.Guideline3_3.3_3_1.G83,G84,G85', description: 'If an input error is automatically detected in this form, check that the item(s) in error are identified and the error(s) are described to the user in text.' }, { name: 'WCAG2AA.Principle3.Guideline3_3.3_3_2.G131,G89,G184,H90', description: 'Check that descriptive labels or instructions (including for required fields) are provided for user input in this form.' }, { name: 'WCAG2AA.Principle3.Guideline3_3.3_3_3.G177', description: 'Check that this form provides suggested corrections to errors in user input, unless it would jeopardize the security or purpose of the content.' }, { name: 'WCAG2AA.Principle3.Guideline3_3.3_3_4.G98,G99,G155,G164,G168.LegalForms', description: 'If this form would bind a user to a financial or legal commitment, modify/delete user-controllable data, or submit test responses, ensure that submissions are either reversible, checked for input errors, and/or confirmed by the user.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_1.F77', description: 'Duplicate id attribute value "[Element ID]" found on the web page.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.Empty', description: 'Anchor element found with an ID but without a href or link text. Consider moving its ID to a parent or nearby element.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyWithName', description: 'Anchor element found with a name attribute but without a href or link text. Consider moving the name attribute to become an ID of a parent or nearby element.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyNoId', description: 'Anchor element found with no link content and no name and/or ID attribute.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.NoHref', description: 'Anchor elements should not be used for defining in-page link targets. If not using the ID for other purposes (such as CSS or scripting), consider moving it to a parent element.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.Placeholder', description: 'Anchor element found with link content, but no href and/or ID attribute has been supplied.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.A.NoContent', description: 'Anchor element found with a valid href attribute, but no link content has been supplied.' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.[NodeName].Name', description: 'This [element type] does not have a name available to an accessibility API. Valid names are [valid names for this element].' }, { name: 'WCAG2AA.Principle4.Guideline4_1.4_1_2.H91.[NodeName].Value', description: 'This [element type] does not have a value available to an accessibility API. Add one [using a element-specific method].' }, { name: 'WCAG2AA.Principle1.Guideline4_1.4_1_3_ARIA22,G199,ARIA19,G83,G84,G85,G139,G177,G194,ARIA23.Check', description: 'Check that status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.' } ] }, { title: 'WCAG2AAA', rules: [ { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H30.2', description: 'Img element is the only content of the link, but is missing alt text. The alt text should describe the purpose of the link.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H37', description: 'Img element missing an alt attribute. Use the alt attribute to specify a short text alternative.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H67.1', description: 'Img element with empty alt text must have absent or empty title attribute.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H67.2', description: 'Img element is marked so that it is ignored by Assistive Technology.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.G94.Image', description: 'Ensure that the img element\'s alt text serves the same purpose and presents the same information as the image.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H36', description: 'Image submit button missing an alt attribute. Specify a text alternative that describes the button\'s function, using the alt attribute' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.G94.Button', description: 'Ensure that the image submit button\'s alt text identifies the purpose of the button.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H24', description: 'Area element in an image map missing an alt attribute. Each area element must have a text alternative that describes the function of the image map area.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H24.2', description: 'Ensure that the area element\'s text alternative serves the same purpose as the part of image map image it references.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.G73,G74', description: 'If this image cannot be fully described in a short text alternative, ensure a long text alternative is also available, such as in the body text or through a link.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H2.EG5', description: 'Img element inside a link must not use alt text that duplicates the text content of the link.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H2.EG4', description: 'Img element inside a link has empty or missing alt text when a link beside it contains link text. Consider combining the links.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H2.EG3', description: 'Img element inside a link must not use alt text that duplicates the content of a text link beside it.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H53', description: 'Object elements must contain a text alternative after all other alternatives are exhausted.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.G94,G92.Object', description: 'Check that short (and if appropriate, long) text alternatives are available for non-text content that serve the same purpose and present the same information.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H35.3', description: 'Applet elements must contain a text alternative in the element\'s body, for browsers without support for the applet element.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.H35.2', description: 'Applet elements must contain an alt attribute, to provide a text alternative to browsers supporting the element but are unable to load the applet.' }, { name: 'WCAG2AAA.Principle1.Guideline1_1.1_1_1.G94,G92.Applet', description: 'Check that short (and if appropriate, long) text alternatives are available for non-text content that serve the same purpose and present the same information.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_1.G158', description: 'If this embedded object contains pre-recorded audio only, and is not provided as an alternative for text content, check that an alternative text version is available.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_1.G159,G166', description: 'If this embedded object contains pre-recorded video only, and is not provided as an alternative for text content, check that an alternative text version is available, or an audio track is provided that presents equivalent information.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_2.G87,G93', description: 'If this embedded object contains pre-recorded synchronised media and is not provided as an alternative for text content, check that captions are provided for audio content.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_4.G9,G87,G93', description: 'If this embedded object contains synchronised media, check that captions are provided for live audio content.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_5.G78,G173,G8', description: 'If this embedded object contains pre-recorded synchronised media, check that an audio description is provided for its video content.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_6.G54,G81', description: 'If this embedded object contains pre-recorded synchronised media, check that a sign language interpretation is provided for its audio.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_7.G8', description: 'If this embedded object contains synchronised media, and where pauses in foreground audio is not sufficient to allow audio descriptions to convey the sense of pre-recorded video, check that an extended audio description is provided, either through scripting or an alternate version.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_8.G69,G159', description: 'If this embedded object contains pre-recorded synchronised media or video-only content, check that an alternative text version of the content is provided.' }, { name: 'WCAG2AAA.Principle1.Guideline1_2.1_2_9.G150,G151,G157', description: 'If this embedded object contains live audio-only content, check that an alternative text version of the content is provided.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42.2', description: 'Heading tag found with no content. Text that is not intended as a heading should not be marked up with heading tags.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H93', description: 'Multiple labels exist with the same "for" attribute. If these labels refer to different form controls, the controls should have unique "id" attributes.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.NonExistent', description: 'This label\'s "for" attribute contains an ID that does not exist in the document.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.NonExistentFragment', description: 'This label\'s "for" attribute contains an ID that does not exist in the document fragment.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.NotFormControl', description: 'This label\'s "for" attribute contains an ID that points to an element that is not a form control.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.NoForAttr', description: 'Label found without a "for" attribute, and therefore not explicitly associated with a form control.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.NoId', description: 'Form control does not have an ID, therefore it cannot have an explicit label.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H65.3', description: 'Form control without a label contains an empty title attribute. The title attribute should identify the purpose of the control.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H65', description: 'Check that the title attribute identifies the purpose of the control, and that a label element is not appropriate.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.2', description: 'Form control does not have an explicit label or title attribute, identifying the purpose of the control.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.NoLabelAllowed', description: 'Label element should not be used for this type of form control.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.1.After', description: 'The label element for this control should be placed after this element.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H44.1.Before', description: 'The label element for this control should be placed before this element.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.[NodeName]', description: 'Semantic markup should be used to mark emphasised or special text so that it can be programmatically determined.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H49.AlignAttr', description: 'Semantic markup should be used to mark emphasised or special text so that it can be programmatically determined.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H42', description: 'Heading markup should be used if this content is intended as a heading.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H63.3', description: 'Table cell has an invalid scope attribute. Valid values are row, col, rowgroup, or colgroup.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H63.2', description: 'Scope attributes on td elements that act as headers for other elements are obsolete in HTML5. Use a th element instead.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H43.ScopeAmbiguous', description: 'Scope attributes on th elements are ambiguous in a table with multiple levels of headings. Use the headers attribute on td elements instead.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H43.IncorrectAttr', description: 'Incorrect headers attribute on this td element. Expected "[expected headers]" but found "[actual headers]"' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H43.HeadersRequired', description: 'The relationship between td elements and their associated th elements is not defined. As this table has multiple levels of th elements, you must use the headers attribute on td elements.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H43.MissingHeaderIds', description: 'Not all th elements in this table contain an id attribute. These cells should contain ids so that they may be referenced by td elements headers attributes.\'' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H43.MissingHeadersAttrs', description: 'Not all td elements in this table contain a headers attribute. Each headers attribute should list the ids of all th elements associated with that cell.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H43,H63', description: 'The relationship between td elements and their associated th elements is not defined. Use either the scope attribute on th elements, or the headers attribute on td elements.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H63.1', description: 'Not all th elements in this table have a scope attribute. These cells should contain a scope attribute to identify their association with td elements.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H39,H73.4', description: 'If this table is a data table, and both a summary attribute and a caption element are present, the summary should not duplicate the caption.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H73.3.Check', description: 'If this table is a data table, check that the summary attribute describes the tables organization or explains how to use the table.\'' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H73.3.NoSummary', description: 'If this table is a data table, consider using the summary attribute of the table element to give an overview of this table.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H39.3.Check', description: 'If this table is a data table, check that the caption element accurately describes this table.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H39.3.NoCaption', description: 'If this table is a data table, consider using a caption element to the table element to identify this table.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H71.3', description: 'Fieldset does not contain a legend element. All fieldsets should contain a legend element that describes a description of the field group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H85.2', description: 'If this selection list contains groups of related options, they should be grouped with optgroup.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H71.2', description: 'Radio buttons or check boxes with the same name attribute must be contained within a fieldset element.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.1', description: 'Content appears to have the visual appearance of a bulleted list. It may be appropriate to mark this content up using a ul element.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48.2', description: 'Content appears to have the visual appearance of a numbered list. It may be appropriate to mark this content up using an ol element.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.G141', description: 'The heading structure is not logically nested. This [heading] element (should be a [correct heading] to be properly nested / appears to be the primary document heading, so should be an h1 element).' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_1.H48', description: 'If this element contains a navigation section, it is recommended that it be marked up as a list.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_2.G57', description: 'Check that the content is ordered in a meaningful sequence when linearised, such as when style sheets are disabled.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_3.G96', description: 'Where instructions are provided for understanding the content, do not rely on sensory characteristics alone (such as shape, size or location) to describe objects.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_4.RestrictView', description: 'Check that content does not restrict its view and operation to a single display orientation, such as portrait or landscape, unless a specific display orientation is essential.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.FaultyValue', description: 'This element contains a potentially faulty value in its autocomplete attribute.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Text', description: 'Invalid autocomplete value. Element does not belong to Text control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Multiline', description: 'Invalid autocomplete value. Element does not belong to Multiline control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Password', description: 'Invalid autocomplete value. Element does not belong to Password control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Url', description: 'Invalid autocomplete value. Element does not belong to Url control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Telephone', description: 'Invalid autocomplete value. Element does not belong to Telephone control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Numeric', description: 'Invalid autocomplete value. Element does not belong to Numeric control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Month', description: 'Invalid autocomplete value. Element does not belong to Month control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.InvalidAutocomplete_Date', description: 'Invalid autocomplete value. Element does not belong to Date control group.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.Purpose', description: 'Check that the input field serves a purpose identified in the Input Purposes for User Interface Components section; and that the content is implemented using technologies with support for identifying the expected meaning for form input data.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_5_H98.MissingAutocomplete', description: 'This element does not have an autocomplete attribute. If this field collects information about the user, consider adding one to comply with this Success Criterion.' }, { name: 'WCAG2AAA.Principle1.Guideline1_3.1_3_6_ARIA11.Check', description: 'Check that the purpose of User Interface Components, icons, and regions can be programmatically determined.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_1.G14,G182', description: 'Check that any information conveyed using colour alone is also available in text, or through other visual cues.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_2.F23', description: 'If any audio plays automatically for longer than 3 seconds, check that there is the ability to pause, stop or mute the audio.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G17', description: 'This element has insufficient contrast at this conformance level. Expected a contrast ratio of at least 7:1, but text in this element has a contrast ratio of /{value/}. Recommendation: /{colour recommendations/}.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18', description: 'This element has insufficient contrast at this conformance level. Expected a contrast ratio of at least 4.5:1, but text in this element has a contrast ratio of /{value/}. Recommendation: /{colour recommendations/}.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G17-1', description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 7:1.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_6.G18-1', description: 'This element\'s text is placed on a background image. Ensure the contrast ratio between the text and all covered parts of the image are at least 4.5:1.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_7.G56', description: 'For pre-recorded audio-only content that is primarily speech (such as narration), any background sounds should be muteable, or be at least 20 dB (or about 4 times) quieter than the speech.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_8.G148,G156,G175', description: 'Check that a mechanism is available for the user to select foreground and background colours for blocks of text, either through the Web page or the browser.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_8.H87,C20', description: 'Check that a mechanism exists to reduce the width of a block of text to no more than 80 characters (or 40 in Chinese, Japanese or Korean script).' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_8.C19,G172,G169', description: 'Check that blocks of text are not fully justified - that is, to both left and right edges - or a mechanism exists to remove full justification.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_8.G188,C21', description: 'Check that line spacing in blocks of text are at least 150% in paragraphs, and paragraph spacing is at least 1.5 times the line spacing, or that a mechanism is available to achieve this.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_8.H87,G146,C26', description: 'Check that text can be resized without assistive technology up to 200 percent without requiring the user to scroll horizontally on a full-screen window.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_9.G140,C22,C30.NoException', description: 'Check that images of text are only used for pure decoration or where a particular presentation of text is essential to the information being conveyed.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Check', description: 'Check that content can be presented without loss of information or functionality, and without requiring scrolling in two dimensions for: \nVertical scrolling content at a width equivalent to 320 CSS pixels;\\n Horizontal scrolling content at a height equivalent to 256 CSS pixels; \nExcept for parts of the content which require two-dimensional layout for usage or meaning.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Fixed', description: 'Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Scrolling' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_10_C32,C31,C33,C38,SCR34,G206.Zoom', description: 'Interfering with a user agents ability to zoom may be a failure of this Success Criterion.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_11_G195,G207,G18,G145,G174,F78.Check', description: 'Check that the visual presentation of the following have a contrast ratio of at least 3:1 against adjacent color(s): \nUser Interface Components: Visual information required to identify user interface components and states, except for inactive components or where the appearance of the component is determined by the user agent and not modified by the author; \nGraphical Objects: Parts of graphics required to understand the content, except when a particular presentation of graphics is essential to the information being conveyed.' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_12_C36,C35.Check', description: 'Check that no loss of content or functionality occurs by setting all of the following and by changing no other style property: \nLine height(line spacing) to at least 1.5 times the font size; \nSpacing following paragraphs to at least 2 times the font size; \nLetter spacing(tracking) to at least 0.12 times the font size; \nWord spacing to at least 0.16 times the font size' }, { name: 'WCAG2AAA.Principle1.Guideline1_4.1_4_13_F95.Check', description: 'Check that where receiving and then removing pointer hover or keyboard focus triggers additional content to become visible and then hidden, the following are true: \nDismissable: A mechanism is available to dismiss the additional content without moving pointer hover or keyboard focus, unless the additional content communicates an input error or does not obscure or replace other content; \nHoverable: If pointer hover can trigger the additional content, then the pointer can be moved over the additional content without the additional content disappearing; \nPersistent: The additional content remains visible until the hover or focus trigger is removed, the user dismisses it, or its information is no longer valid.' }, { name: 'WCAG2AAA.Principle1.Guideline2_1.2_1_4.Check', description: 'Check that if a keyboard shortcut is implemented in content using only letter (including upper- and lower-case letters), punctuation, number, or symbol characters, then at least one of the following is true: \nTurn off: A mechanism is available to turn the shortcut off; \nRemap: A mechanism is available to remap the shortcut to use one or more non- printable keyboard characters(e.g.Ctrl, Alt, etc); \nActive only on focus: The keyboard shortcut for a user interface component is only active when that component has focus.' }, { name: 'WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.DblClick', description: 'Ensure the functionality provided by double-clicking on this element is available through the keyboard.' }, { name: 'WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOver', description: 'Ensure the functionality provided by mousing over this element is available through the keyboard; for instance, using the focus event.' }, { name: 'WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseOut', description: 'Ensure the functionality provided by mousing out of this element is available through the keyboard; for instance, using the blur event.' }, { name: 'WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseMove', description: 'Ensure the functionality provided by moving the mouse on this element is available through the keyboard.' }, { name: 'WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseDown', description: 'Ensure the functionality provided by mousing down on this element is available through the keyboard; for instance, using the keydown event.' }, { name: 'WCAG2AAA.Principle2.Guideline2_1.2_1_1.SCR20.MouseUp', description: 'Ensure the functionality provided by mousing up on this element is available through the keyboard; for instance, using the keyup event.' }, { name: 'WCAG2AAA.Principle2.Guideline2_1.2_1_2.F10', description: 'Check that this applet or plugin provides the ability to move the focus away from itself when using the keyboard.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_1.F40.2', description: 'Meta refresh tag used to redirect to another page, with a time limit that is not zero. Users cannot control this time limit.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_1.F41.2', description: 'Meta refresh tag used to refresh the current page. Users cannot control the time limit for this refresh.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_2.SCR33,SCR22,G187,G152,G186,G191', description: 'If any part of the content moves, scrolls or blinks for more than 5 seconds, or auto-updates, check that there is a mechanism available to pause, stop, or hide the content.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_2.F4', description: 'Ensure there is a mechanism available to stop this blinking element in less than five seconds.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_2.F47', description: 'Blink elements cannot satisfy the requirement that blinking information can be stopped within five seconds.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_3.G5', description: 'Check that 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.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_4.SCR14', description: 'Check that all interruptions (including updates to content) can be postponed or suppressed by the user, except interruptions involving an emergency.' }, { name: 'WCAG2AAA.Principle2.Guideline2_2.2_2_5.G105,G181', description: 'If this Web page is part of a set of Web pages with an inactivity time limit, check that an authenticated user can continue the activity without loss of data after re-authenticating.' }, { name: 'WCAG2AAA.Principle1.Guideline2_2.2_2_6.Check', description: 'Check that users are warned of the duration of any user inactivity that could cause data loss, unless the data is preserved for more than 20 hours when the user does not take any actions.' }, { name: 'WCAG2AAA.Principle2.Guideline2_3.2_3_2.G19', description: 'Check that no component of the content flashes more than three times in any 1-second period.' }, { name: 'WCAG2AAA.Principle1.Guideline2_3.2_3_3.Check', description: 'Check that motion animation triggered by interaction can be disabled, unless the animation is essential to the functionality or the information being conveyed.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_1.Check', description: 'Check that all functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture, unless a multipoint or path-based gesture is essential.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_2.SinglePointer_Check', description: 'Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_2.Mousedown_Check', description: 'This element has an mousedown event listener. Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_2.Touchstart_Check', description: 'This element has a touchstart event listener. Check that for functionality that can be operated using a single pointer, at least one of the following is true: \nNo Down- Event: The down - event of the pointer is not used to execute any part of the function; \nAbort or Undo: Completion of the function is on the up - event, and a mechanism is available to abort the function before completion or to undo the function after completion; \nUp Reversal: The up - event reverses any outcome of the preceding down - event; \nEssential: Completing the function on the down - event is essential.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_3_F96.Check', description: 'Check that for user interface components with labels that include text or images of text, the name contains the text that is presented visually.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_3_F96.AccessibleName', description: 'Accessible name for this element does not contain the visible label text. Check that for user interface components with labels that include text or images of text, the name contains the text that is presented visually.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_4.Check', description: 'Check that functionality that can be operated by device motion or user motion can also be operated by user interface components and responding to the motion can be disabled to prevent accidental actuation, except when: \nSupported Interface: The motion is used to operate functionality through an accessibility supported interface; \nEssential: The motion is essential for the function and doing so would invalidate the activity.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_4.Devicemotion', description: 'WCAG2AA.This element has a devicemotion event listener. Check that functionality that can be operated by device motion or user motion can also be operated by user interface components and responding to the motion can be disabled to prevent accidental actuation, except when: \nSupported Interface: The motion is used to operate functionality through an accessibility supported interface; \nEssential: The motion is essential for the function and doing so would invalidate the activity.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_5.Check', description: 'Check that the size of the target for pointer inputs is at least 44 by 44 CSS pixels except when:\nEquivalent: The target is available through an equivalent link or control on the same page that is at least 44 by 44 CSS pixels;\nInline: The target is in a sentence or block of text;\nUser Agent Control: The size of the target is determined by the user agent and is not modified by the author;\nEssential: A particular presentation of the target is essential to the information being conveyed.' }, { name: 'WCAG2AAA.Principle1.Guideline2_5.2_5_6.Check', description: 'Check that the content does not restrict use of input modalities available on a platform except where the restriction is essential, required to ensure the security of the content, or required to respect user settings.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_1.H64.1', description: 'Iframe element requires a non-empty title attribute that identifies the frame.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_1.H64.2', description: 'Check that the title attribute of this element contains text that identifies the frame.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_1.G1,G123,G124,H69', description: 'Ensure that any common navigation elements can be bypassed; for instance, by use of skip links, header elements, or ARIA landmark roles.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchId', description: 'This link points to a named anchor "[link target]" within the document, but no anchor exists with that name.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_1.G1,G123,G124.NoSuchIdFragment2.4.2', description: 'This link points to a named anchor "[link target]" within the document, but no anchor exists with that name in the fragment tested.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_2.H25.1.NoTitleEl', description: 'A title should be provided for the document, using a non-empty title element in the head section.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_2.H25.1.EmptyTitle', description: 'The title element in the head section should be non-empty.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_2.H25.2', description: 'Check that the title element describes the document.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_3.H4.2', description: 'If tabindex is used, check that the tab order specified by the tabindex attributes follows relationships in the content.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_5.G125,G64,G63,G161,G126,G185', description: 'If this Web page is not part of a linear process, check that there is more than one way of locating this Web page within a set of Web pages.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_6.G130,G131', description: 'Check that headings and labels describe topic or purpose.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_7.G149,G165,G195,C15,SCR31', description: 'Check that there is at least one mode of operation where the keyboard focus indicator can be visually located on user interface controls.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.1', description: 'Link elements can only be located in the head section of the document.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2a', description: 'Link element is missing a non-empty rel attribute identifying the link type.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_8.H59.2b', description: 'Link element is missing a non-empty href attribute pointing to the resource being linked.' }, { name: 'WCAG2AAA.Principle2.Guideline2_4.2_4_9.H30', description: 'Check that text of the link describes the purpose of the link.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_1.H57.2', description: 'The html element should have a lang or xml:lang attribute which describes the language of the document.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_1.H57.3.Lang', description: 'The language specified in the lang attribute of the document element does not appear to be well-formed.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_1.H57.3.XmlLang', description: 'The language specified in the xml:lang attribute of the document element does not appear to be well-formed.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_2.H58', description: 'Ensure that any change in language is marked using the lang and/or xml:lang attribute on an element, as appropriate.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_2.H58.1.Lang', description: 'The language specified in the lang attribute of this element does not appear to be well-formed.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_2.H58.1.XmlLang', description: 'The language specified in the xml:lang attribute of this element does not appear to be well-formed.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_3.H40,H54,H60,G62,G70', description: 'Check that there is a mechanism available for identifying specific definitions of words or phrases used in an unusual or restricted way, including idioms and jargon.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_4.G102,G55,G62,H28,G97', description: 'Check that a mechanism for identifying the expanded form or meaning of abbreviations is available.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_5.G86,G103,G79,G153,G160', description: 'Where the content requires reading ability more advanced than the lower secondary education level, supplemental content or an alternative version should be provided.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_6.H62.1.HTML5', description: 'Ruby element does not contain an rt element containing pronunciation information for its body text.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_6.H62.1.XHTML11', description: 'Ruby element does not contain an rt element containing pronunciation information for the text inside the rb element.' }, { name: 'WCAG2AAA.Principle3.Guideline3_1.3_1_6.H62.2', description: 'Ruby element does not contain rp elements, which provide extra punctuation to browsers not supporting ruby text.' }, { name: 'WCAG2AAA.Principle3.Guideline3_2.3_2_1.G107', description: 'Check that a change of context does not occur when any input field receives focus.' }, { name: 'WCAG2AAA.Principle3.Guideline3_2.3_2_2.H32.2', description: 'Form does not contain a submit button (input type="submit", input type="image", or button type="submit").' }, { name: 'WCAG2AAA.Principle3.Guideline3_2.3_2_3.G61', description: 'Check that navigational mechanisms that are repeated on multiple Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.' }, { name: 'WCAG2AAA.Principle3.Guideline3_2.3_2_4.G197', description: 'Check that components that have the same functionality within this Web page are identified consistently in the set of Web pages to which it belongs.' }, { name: 'WCAG2AAA.Principle3.Guideline3_2.3_2_5.H83.3', description: 'Check that this link\'s link text contains information indicating that the link will open in a new window.' }, { name: 'WCAG2AAA.Principle3.Guideline3_3.3_3_1.G83,G84,G85', description: 'If an input error is automatically detected in this form, check that the item(s) in error are identified and the error(s) are described to the user in text.' }, { name: 'WCAG2AAA.Principle3.Guideline3_3.3_3_2.G131,G89,G184,H90', description: 'Check that descriptive labels or instructions (including for required fields) are provided for user input in this form.' }, { name: 'WCAG2AAA.Principle3.Guideline3_3.3_3_3.G177', description: 'Check that this form provides suggested corrections to errors in user input, unless it would jeopardize the security or purpose of the content.' }, { name: 'WCAG2AAA.Principle3.Guideline3_3.3_3_5.G71,G184,G193', description: 'Check that context-sensitive help is available for this form, at a Web-page and/or control level.' }, { name: 'WCAG2AAA.Principle3.Guideline3_3.3_3_6.G98,G99,G155,G164,G168.AllForms', description: 'Check that submissions to this form are either reversible, checked for input errors, and/or confirmed by the user.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_1.F77', description: 'Duplicate id attribute value "[Element ID]" found on the web page.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Empty', description: 'Anchor element found with an ID but without a href or link text. Consider moving its ID to a parent or nearby element.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyWithName', description: 'Anchor element found with a name attribute but without a href or link text. Consider moving the name attribute to become an ID of a parent or nearby element.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.EmptyNoId', description: 'Anchor element found with no link content and no name and/or ID attribute.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.NoHref', description: 'Anchor elements should not be used for defining in-page link targets. If not using the ID for other purposes (such as CSS or scripting), consider moving it to a parent element.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.Placeholder', description: 'Anchor element found with link content, but no href and/or ID attribute has been supplied.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.A.NoContent', description: 'Anchor element found with a valid href attribute, but no link content has been supplied.' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.[NodeName].Name', description: 'This [element type] does not have a name available to an accessibility API. Valid names are [valid names for this element].' }, { name: 'WCAG2AAA.Principle4.Guideline4_1.4_1_2.H91.[NodeName].Value', description: 'This [element type] does not have a value available to an accessibility API. Add one [using a element-specific method].' }, { name: 'WCAG2AAA.Principle1.Guideline4_1.4_1_3_ARIA22,G199,ARIA19,G83,G84,G85,G139,G177,G194,ARIA23.Check', description: 'Check that status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.' } ] } ]; }; ================================================ FILE: data/techniques.js ================================================ // This file is part of Pa11y Dashboard. // // Pa11y Dashboard is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Pa11y Dashboard is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Pa11y Dashboard. If not, see . 'use strict'; module.exports = function getTechniques() { return { H30: { title: 'H30: Providing link text that describes the purpose of a link for anchor elements', url: 'http://www.w3.org/TR/WCAG20-TECHS/H30' }, H37: { title: 'H37: Using alt attributes on img elements', url: 'http://www.w3.org/TR/WCAG20-TECHS/H37' }, H67: { title: 'H67: Using null alt text and no title attribute on img elements for images that AT should ignore', url: 'http://www.w3.org/TR/WCAG20-TECHS/H67' }, G94: { title: 'G94: Providing short text alternative for non-text content that serves the same purpose and presents the same information as the non-text content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G94' }, H36: { title: 'H36: Using alt attributes on images used as submit buttons', url: 'http://www.w3.org/TR/WCAG20-TECHS/H36' }, H24: { title: 'H24: Providing text alternatives for the area elements of image maps ', url: 'http://www.w3.org/TR/WCAG20-TECHS/H24' }, G73: { title: 'G73: Providing a long description in another location with a link to it that is immediately adjacent to the non-text content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G73' }, G74: { title: 'G74: Providing a long description in text near the non-text content, with a reference to the location of the long description in the short description', url: 'http://www.w3.org/TR/WCAG20-TECHS/G74' }, H2: { title: 'H2: Combining adjacent image and text links for the same resource', url: 'http://www.w3.org/TR/WCAG20-TECHS/H2' }, H53: { title: 'H53: Using the body of the object element', url: 'http://www.w3.org/TR/WCAG20-TECHS/H53' }, G92: { title: 'G92: Providing long description for non-text content that serves the same purpose and presents the same information', url: 'http://www.w3.org/TR/WCAG20-TECHS/G92' }, H35: { title: 'H35: Providing text alternatives on applet elements ', url: 'http://www.w3.org/TR/WCAG20-TECHS/H35' }, G158: { title: 'G158: Providing an alternative for time-based media for audio-only content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G158' }, G159: { title: 'G159: Providing an alternative for time-based media for video-only content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G159' }, G166: { title: 'G166: Providing audio that describes the important video content and describing it as such', url: 'http://www.w3.org/TR/WCAG20-TECHS/G166' }, G87: { title: 'G87: Providing closed captions', url: 'http://www.w3.org/TR/WCAG20-TECHS/G87' }, G93: { title: 'G93: Providing open (always visible) captions', url: 'http://www.w3.org/TR/WCAG20-TECHS/G93' }, G69: { title: 'G69: Providing an alternative for time based media', url: 'http://www.w3.org/TR/WCAG20-TECHS/G69' }, G78: { title: 'G78: Providing a second, user-selectable, audio track that includes audio descriptions', url: 'http://www.w3.org/TR/WCAG20-TECHS/G78' }, G173: { title: 'G173: Providing a version of a movie with audio descriptions', url: 'http://www.w3.org/TR/WCAG20-TECHS/G173' }, G8: { title: 'G8: Providing a movie with extended audio descriptions', url: 'http://www.w3.org/TR/WCAG20-TECHS/G8' }, G9: { title: 'G9: Creating captions for live synchronized media', url: 'http://www.w3.org/TR/WCAG20-TECHS/G9' }, G54: { title: 'G54: Including a sign language interpreter in the video stream', url: 'http://www.w3.org/TR/WCAG20-TECHS/G54' }, G81: { title: 'G81: Providing a synchronized video of the sign language interpreter that can be displayed in a different viewport or overlaid on the image by the player', url: 'http://www.w3.org/TR/WCAG20-TECHS/G81' }, G150: { title: 'G150: Providing text based alternatives for live audio-only content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G150' }, G151: { title: 'G151: Providing a link to a text transcript of a prepared statement or script if the script is followed', url: 'http://www.w3.org/TR/WCAG20-TECHS/G151' }, G157: { title: 'G157: Incorporating a live audio captioning service into a Web page', url: 'http://www.w3.org/TR/WCAG20-TECHS/G157' }, H42: { title: 'H42: Using h1-h6 to identify headings', url: 'http://www.w3.org/TR/WCAG20-TECHS/H42' }, H93: { title: 'H93: Ensuring that id attributes are unique on a Web page', url: 'http://www.w3.org/TR/WCAG20-TECHS/H93' }, H44: { title: 'H44: Using label elements to associate text labels with form controls', url: 'http://www.w3.org/TR/WCAG20-TECHS/H44' }, H65: { title: 'H65: Using the title attribute to identify form controls when the label element cannot be used', url: 'http://www.w3.org/TR/WCAG20-TECHS/H65' }, H49: { title: 'H49: Using semantic markup to mark emphasized or special text', url: 'http://www.w3.org/TR/WCAG20-TECHS/H49' }, H63: { title: 'H63: Using the scope attribute to associate header cells and data cells in data tables', url: 'http://www.w3.org/TR/WCAG20-TECHS/H63' }, H43: { title: 'H43: Using id and headers attributes to associate data cells with header cells in data tables', url: 'http://www.w3.org/TR/WCAG20-TECHS/H43' }, H39: { title: 'H39: Using caption elements to associate data table captions with data tables', url: 'http://www.w3.org/TR/WCAG20-TECHS/H39' }, H73: { title: 'H73: Using the summary attribute of the table element to give an overview of data tables', url: 'http://www.w3.org/TR/WCAG20-TECHS/H73' }, H71: { title: 'H71: Providing a description for groups of form controls using fieldset and legend elements ', url: 'http://www.w3.org/TR/WCAG20-TECHS/H71' }, H85: { title: 'H85: Using OPTGROUP to group OPTION elements inside a SELECT', url: 'http://www.w3.org/TR/WCAG20-TECHS/H85' }, H48: { title: 'H48: Using ol, ul and dl for lists or groups of links', url: 'http://www.w3.org/TR/WCAG20-TECHS/H48' }, G141: { title: 'G141: Organizing a page using headings', url: 'http://www.w3.org/TR/WCAG20-TECHS/G141' }, G57: { title: 'G57: Ordering the content in a meaningful sequence', url: 'http://www.w3.org/TR/WCAG20-TECHS/G57' }, G96: { title: 'G96: Providing textual identification of items that otherwise rely only on sensory information to be understood', url: 'http://www.w3.org/TR/WCAG20-TECHS/G96' }, G14: { title: 'G14: Ensuring that information conveyed by color differences is also available in text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G14' }, G182: { title: 'G182: Ensuring that additional visual cues are available when text color differences are used to convey information', url: 'http://www.w3.org/TR/WCAG20-TECHS/G182' }, F23: { title: 'F23: Failure of 1.4.2 due to playing a sound longer than 3 seconds where there is no mechanism to turn it off', url: 'http://www.w3.org/TR/WCAG20-TECHS/F23' }, G18: { title: 'G18: Ensuring that a contrast ratio of at least 4.5:1 exists between text (and images of text) and background behind the text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G18' }, G145: { title: 'G145: Ensuring that a contrast ratio of at least 3:1 exists between text (and images of text) and background behind the text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G145' }, F24: { title: 'F24: 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', url: 'http://www.w3.org/TR/WCAG20-TECHS/F24' }, G142: { title: 'G142: Using a technology that has commonly-available user agents that support zoom', url: 'http://www.w3.org/TR/WCAG20-TECHS/G142' }, G140: { title: 'G140: Separating information and structure from presentation to enable different presentations', url: 'http://www.w3.org/TR/WCAG20-TECHS/G140' }, C22: { title: 'C22: Using CSS to control visual presentation of text', url: 'http://www.w3.org/TR/WCAG20-TECHS/C22' }, C30: { title: 'C30: Using CSS to replace text with images of text and providing user interface controls to switch', url: 'http://www.w3.org/TR/WCAG20-TECHS/C30' }, G17: { title: 'G17: Ensuring that a contrast ratio of at least 7:1 exists between text (and images of text) and background behind the text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G17' }, G56: { title: 'G56: Mixing audio files so that non-speech sounds are at least 20 decibels lower than the speech audio content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G56' }, G148: { title: 'G148: Not specifying background color, not specifying text color, and not using technology features that change those defaults', url: 'http://www.w3.org/TR/WCAG20-TECHS/G148' }, G156: { title: 'G156: Using a technology that has commonly-available user agents that can change the foreground and background of blocks of text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G156' }, G175: { title: 'G175: Providing a multi color selection tool on the page for foreground and background colors', url: 'http://www.w3.org/TR/WCAG20-TECHS/G175' }, H87: { title: 'G146: Using liquid layout', url: 'http://www.w3.org/TR/WCAG20-TECHS/G146' }, C19: { title: 'C19: Specifying alignment either to the left OR right in CSS', url: 'http://www.w3.org/TR/WCAG20-TECHS/C19' }, G172: { title: 'G172: Providing a mechanism to remove full justification of text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G172' }, G169: { title: 'G169: Aligning text on only one side', url: 'http://www.w3.org/TR/WCAG20-TECHS/G169' }, G188: { title: 'G188: Providing a button on the page to increase line spaces and paragraph spaces', url: 'http://www.w3.org/TR/WCAG20-TECHS/G188' }, C21: { title: 'C21: Specifying line spacing in CSS', url: 'http://www.w3.org/TR/WCAG20-TECHS/C21' }, SCR20: { title: 'SCR20: Using both keyboard and other device-specific functions', url: 'http://www.w3.org/TR/WCAG20-TECHS/SCR20' }, F10: { title: 'F10: 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', url: 'http://www.w3.org/TR/WCAG20-TECHS/F10' }, F40: { title: 'F40: Failure of Success Criterion 2.2.1 and 2.2.4 due to using meta redirect with a time limit', url: 'http://www.w3.org/TR/WCAG20-TECHS/F40' }, F41: { title: 'F41: Failure of Success Criterion 2.2.1, 2.2.4, and 3.2.5 due to using meta refresh to reload the page', url: 'http://www.w3.org/TR/WCAG20-TECHS/F41' }, SCR33: { title: 'SCR33: Using script to scroll content, and providing a mechanism to pause it', url: 'http://www.w3.org/TR/WCAG20-TECHS/SCR33' }, SCR22: { title: 'SCR22: Using scripts to control blinking and stop it in five seconds or less', url: 'http://www.w3.org/TR/WCAG20-TECHS/SCR22' }, G187: { title: 'G187: Using a technology to include blinking content that can be turned off via the user agent', url: 'http://www.w3.org/TR/WCAG20-TECHS/G187' }, G152: { title: 'G152: Setting animated gif images to stop blinking after n cycles (within 5 seconds)', url: 'http://www.w3.org/TR/WCAG20-TECHS/G152' }, G186: { title: 'G186: Using a control in the Web page that stops moving, blinking, or auto-updating content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G186' }, G191: { title: 'G191: Providing a link, button, or other mechanism that reloads the page without any blinking content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G191' }, F4: { title: 'F4: Failure of Success Criterion 2.2.2 due to using text-decoration:blink without a mechanism to stop it in less than five seconds', url: 'http://www.w3.org/TR/WCAG20-TECHS/F4' }, F47: { title: 'F47: Failure of Success Criterion 2.2.2 due to using the blink element', url: 'http://www.w3.org/TR/WCAG20-TECHS/F47' }, G5: { title: 'G5: Allowing users to complete an activity without any time limit', url: 'http://www.w3.org/TR/WCAG20-TECHS/G5' }, SCR14: { title: 'SCR14: Using scripts to make nonessential alerts optional', url: 'http://www.w3.org/TR/WCAG20-TECHS/SCR14' }, G105: { title: 'G105: Saving data so that it can be used after a user re-authenticates', url: 'http://www.w3.org/TR/WCAG20-TECHS/G105' }, G181: { title: 'G181: Encoding user data as hidden or encrypted data in a re-authorization page', url: 'http://www.w3.org/TR/WCAG20-TECHS/G181' }, G19: { title: 'G19: Ensuring that no component of the content flashes more than three times in any 1-second period', url: 'http://www.w3.org/TR/WCAG20-TECHS/G19' }, G176: { title: 'G176: Keeping the flashing area small enough', url: 'http://www.w3.org/TR/WCAG20-TECHS/G176' }, H64: { title: 'H64: Using the title attribute of the frame and iframe elements', url: 'http://www.w3.org/TR/WCAG20-TECHS/H64' }, G1: { title: 'G1: Adding a link at the top of each page that goes directly to the main content area', url: 'http://www.w3.org/TR/WCAG20-TECHS/G1' }, G123: { title: 'G123: Adding a link at the beginning of a block of repeated content to go to the end of the block', url: 'http://www.w3.org/TR/WCAG20-TECHS/G123' }, G124: { title: 'G124: Adding links at the top of the page to each area of the content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G124' }, H69: { title: 'H69: Providing heading elements at the beginning of each section of content', url: 'http://www.w3.org/TR/WCAG20-TECHS/H69' }, H25: { title: 'H25: Providing a title using the title element', url: 'http://www.w3.org/TR/WCAG20-TECHS/H25' }, H4: { title: 'H4: Creating a logical tab order through links, form controls, and objects', url: 'http://www.w3.org/TR/WCAG20-TECHS/H4' }, H77: { title: 'H77: Identifying the purpose of a link using link text combined with its enclosing list item', url: 'http://www.w3.org/TR/WCAG20-TECHS/H77' }, H78: { title: 'H78: Identifying the purpose of a link using link text combined with its enclosing paragraph', url: 'http://www.w3.org/TR/WCAG20-TECHS/H78' }, H79: { title: 'H79: Identifying the purpose of a link in a data table using the link text combined with its enclosing table cell and associated table header cells', url: 'http://www.w3.org/TR/WCAG20-TECHS/H79' }, H80: { title: 'H80: Identifying the purpose of a link using link text combined with the preceding heading element', url: 'http://www.w3.org/TR/WCAG20-TECHS/H80' }, H81: { title: 'H81: 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', url: 'http://www.w3.org/TR/WCAG20-TECHS/H81' }, H33: { title: 'H33: Supplementing link text with the title attribute', url: 'http://www.w3.org/TR/WCAG20-TECHS/H33' }, G125: { title: 'G125: Providing links to navigate to related Web pages', url: 'http://www.w3.org/TR/WCAG20-TECHS/G125' }, G64: { title: 'G64: Providing a Table of Contents', url: 'http://www.w3.org/TR/WCAG20-TECHS/G64' }, G63: { title: 'G63: Providing a site map', url: 'http://www.w3.org/TR/WCAG20-TECHS/G63' }, G161: { title: 'G161: Providing a search function to help users find content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G161' }, G126: { title: 'G126: Providing a list of links to all other Web pages', url: 'http://www.w3.org/TR/WCAG20-TECHS/G126' }, G185: { title: 'G185: Linking to all of the pages on the site from the home page', url: 'http://www.w3.org/TR/WCAG20-TECHS/G185' }, G130: { title: 'G130: Providing descriptive headings', url: 'http://www.w3.org/TR/WCAG20-TECHS/G130' }, G131: { title: 'G131: Providing descriptive labels', url: 'http://www.w3.org/TR/WCAG20-TECHS/G131' }, G149: { title: 'G149: Using user interface components that are highlighted by the user agent when they receive focus', url: 'http://www.w3.org/TR/WCAG20-TECHS/G149' }, G165: { title: 'G165: Using the default focus indicator for the platform so that high visibility default focus indicators will carry over', url: 'http://www.w3.org/TR/WCAG20-TECHS/G165' }, G195: { title: 'G195: Using an author-supplied, highly visible focus indicator', url: 'http://www.w3.org/TR/WCAG20-TECHS/G195' }, C15: { title: 'C15: Using CSS to change the presentation of a user interface component when it receives focus', url: 'http://www.w3.org/TR/WCAG20-TECHS/C15' }, SCR31: { title: 'SCR31: Using script to change the background color or border of the element with focus', url: 'http://www.w3.org/TR/WCAG20-TECHS/SCR31' }, H59: { title: 'H59: Using the link element and navigation tools', url: 'http://www.w3.org/TR/WCAG20-TECHS/H59' }, H57: { title: 'H57: Using language attributes on the html element ', url: 'http://www.w3.org/TR/WCAG20-TECHS/H57' }, H58: { title: 'H58: Using language attributes to identify changes in the human language ', url: 'http://www.w3.org/TR/WCAG20-TECHS/H58' }, H40: { title: 'H40: Using description lists', url: 'http://www.w3.org/TR/WCAG20-TECHS/H40' }, H54: { title: 'H54: Using the dfn element to identify the defining instance of a word', url: 'http://www.w3.org/TR/WCAG20-TECHS/H54' }, H60: { title: 'H60: Using the link element to link to a glossary', url: 'http://www.w3.org/TR/WCAG20-TECHS/H60' }, G62: { title: 'G62: Providing a glossary', url: 'http://www.w3.org/TR/WCAG20-TECHS/G62' }, G70: { title: 'G70: Providing a function to search an online dictionary', url: 'http://www.w3.org/TR/WCAG20-TECHS/G70' }, G102: { title: 'G102: Providing the expansion or explanation of an abbreviation', url: 'http://www.w3.org/TR/WCAG20-TECHS/G102' }, G55: { title: 'G55: Linking to definitions', url: 'http://www.w3.org/TR/WCAG20-TECHS/G55' }, H28: { title: 'H28: Providing definitions for abbreviations by using the abbr element', url: 'http://www.w3.org/TR/WCAG20-TECHS/H28' }, G97: { title: 'G97: Providing the first use of an abbreviation immediately before or after the expanded form', url: 'http://www.w3.org/TR/WCAG20-TECHS/G97' }, G86: { title: 'G86: Providing a text summary that can be understood by people with lower secondary education level reading ability', url: 'http://www.w3.org/TR/WCAG20-TECHS/G86' }, G103: { title: 'G103: Providing visual illustrations, pictures, and symbols to help explain ideas, events, and processes', url: 'http://www.w3.org/TR/WCAG20-TECHS/G103' }, G79: { title: 'G79: Providing a spoken version of the text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G79' }, G153: { title: 'G153: Making the text easier to read', url: 'http://www.w3.org/TR/WCAG20-TECHS/G153' }, G160: { title: 'G160: Providing sign language versions of information, ideas, and processes that must be understood in order to use the content', url: 'http://www.w3.org/TR/WCAG20-TECHS/G160' }, H62: { title: 'H62: Using the ruby element', url: 'http://www.w3.org/TR/WCAG20-TECHS/H62' }, G107: { title: 'G107: Using \'activate\' rather than \'focus\' as a trigger for changes of context', url: 'http://www.w3.org/TR/WCAG20-TECHS/G107' }, H32: { title: 'H32: Providing submit buttons', url: 'http://www.w3.org/TR/WCAG20-TECHS/H32' }, G61: { title: 'G61: Presenting repeated components in the same relative order each time they appear', url: 'http://www.w3.org/TR/WCAG20-TECHS/G61' }, G197: { title: 'G197: Using labels, names, and text alternatives consistently for content that has the same functionality', url: 'http://www.w3.org/TR/WCAG20-TECHS/G197' }, H83: { title: 'H83: Using the target attribute to open a new window on user request and indicating this in link text', url: 'http://www.w3.org/TR/WCAG20-TECHS/H83' }, G83: { title: 'G83: Providing text descriptions to identify required fields that were not completed', url: 'http://www.w3.org/TR/WCAG20-TECHS/G83' }, G84: { title: 'G84: Providing a text description when the user provides information that is not in the list of allowed values', url: 'http://www.w3.org/TR/WCAG20-TECHS/G84' }, G85: { title: 'G85: Providing a text description when user input falls outside the required format or values', url: 'http://www.w3.org/TR/WCAG20-TECHS/G85' }, G89: { title: 'G89: Providing expected data format and example', url: 'http://www.w3.org/TR/WCAG20-TECHS/G89' }, G184: { title: 'G184: Providing text instructions at the beginning of a form or set of fields that describes the necessary input', url: 'http://www.w3.org/TR/WCAG20-TECHS/G184' }, H90: { title: 'H90: Indicating required form controls using label or legend', url: 'http://www.w3.org/TR/WCAG20-TECHS/H90' }, G177: { title: 'G177: Providing suggested correction text', url: 'http://www.w3.org/TR/WCAG20-TECHS/G177' }, G98: { title: 'G98: Providing the ability for the user to review and correct answers before submitting', url: 'http://www.w3.org/TR/WCAG20-TECHS/G98' }, G99: { title: 'G99: Providing the ability to recover deleted information', url: 'http://www.w3.org/TR/WCAG20-TECHS/G99' }, G155: { title: 'G155: Providing a checkbox in addition to a submit button', url: 'http://www.w3.org/TR/WCAG20-TECHS/G155' }, G164: { title: 'G164: Providing a stated time within which an online request (or transaction) may be amended or canceled by the user after making the request', url: 'http://www.w3.org/TR/WCAG20-TECHS/G164' }, G168: { title: 'G168: Requesting confirmation to continue with selected action', url: 'http://www.w3.org/TR/WCAG20-TECHS/G168' }, G71: { title: 'G71: Providing a help link on every Web page', url: 'http://www.w3.org/TR/WCAG20-TECHS/G71' }, G193: { title: 'G193: Providing help by an assistant in the Web page', url: 'http://www.w3.org/TR/WCAG20-TECHS/G193' }, F77: { title: 'F77: Failure of Success Criterion 4.1.1 due to duplicate values of type ID', url: 'http://www.w3.org/TR/WCAG20-TECHS/F77' }, H91: { title: 'H91: Using HTML form controls and links', url: 'http://www.w3.org/TR/WCAG20-TECHS/H91' }, F102: { title: 'F102: Failure of Success Criterion 1.4.10 due to content disappearing and not being available when content has reflowed', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F102' }, F103: { title: 'F103: Failure of Success Criterion 4.1.3 due to providing status messages that cannot be programmatically determined through role or properties', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F103' }, F104: { title: 'F104: Failure of Success Criterion 1.4.12 due to clipped or overlapped content when text spacing is adjusted', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F104' }, F105: { title: 'F105: Failure of Success Criterion 2.5.1 due to providing functionality via a path- based gesture without simple pointer alternative', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F105' }, F106: { title: 'F106: Failure due to inability to deactivate motion actuation', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F106' }, G216: { title: 'G216: Providing single point activation for a control slider', url: 'https://www.w3.org/WAI/WCAG21/Techniques/general/G216' }, G215: { title: 'G215: Providing controls to achieve the same result as path based or multipoint gestures', url: 'https://www.w3.org/WAI/WCAG21/Techniques/general/G215' }, F100: { title: 'F100: Failure of Success Criterion 1.3.4 due to showing a message asking to reorient device', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F100' }, G214: { title: 'G214: Using a control to allow access to content in different orientations which is otherwise restricted', url: 'https://www.w3.org/WAI/WCAG21/Techniques/general/G214' }, C40: { title: 'C40: Creating a two-color focus indicator to ensure sufficient contrast with all components', url: 'https://www.w3.org/WAI/WCAG21/Techniques/css/C40' }, F99: { title: 'F99: Failure of Success Criterion 2.1.4 due to implementing character key shortcuts that cannot be turned off or remapped', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F99' }, SCR39: { title: 'SCR39: Making content on focus or hover hoverable, dismissible, and persistent', url: 'https://www.w3.org/WAI/WCAG21/Techniques/client-side-script/SCR39' }, G212: { title: 'G212: Using native controls to ensure functionality is triggered on the up-event.', url: 'https://www.w3.org/WAI/WCAG21/Techniques/general/G212' }, F98: { title: 'F98: Failure due to interactions being limited to touch-only on touchscreen devices', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F98' }, G213: { title: 'G213: Provide conventional controls and an application setting for motion activated input', url: 'https://www.w3.org/WAI/WCAG21/Techniques/general/G213' }, ARIA24: { title: 'ARIA24: Semantically identifying a font icon with role="img"', url: 'https://www.w3.org/WAI/WCAG21/Techniques/aria/ARIA24' }, F97: { title: 'F97: Failure due to locking the orientation to landscape or portrait view', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F97' }, F52: { title: 'F52: 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 ', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F52' }, G209: { title: 'G209: Provide sufficient contrast at the boundaries between adjoining colors', url: 'https://www.w3.org/WAI/WCAG21/Techniques/general/G209' }, C39: { title: 'C39: Using the CSS reduce-motion query to prevent motion', url: 'https://www.w3.org/WAI/WCAG21/Techniques/css/C39' }, G207: { title: 'G207: Ensuring that a contrast ratio of 3:1 is provided for icons', url: 'https://www.w3.org/WAI/WCAG21/Techniques/general/G207' }, C38: { title: 'C38: Using CSS width, max-width and flexbox to fit labels and inputs', url: 'https://www.w3.org/WAI/WCAG21/Techniques/css/C38' }, C34: { title: 'C34: Using media queries to un-fixing sticky headers / footers', url: 'https://www.w3.org/WAI/WCAG21/Techniques/css/C34' }, C36: { title: 'C36: Allowing for text spacing override', url: 'https://www.w3.org/WAI/WCAG21/Techniques/css/C36' }, C37: { title: 'C37: Using CSS max-width and height to fit images', url: 'https://www.w3.org/WAI/WCAG21/Techniques/css/C37' }, F95: { title: 'F95: Failure of Success Criterion 1.4.13 due to content shown on hover not being hoverable', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F95' }, F96: { title: 'F96: Failure due to the accessible name not containing the visible label text', url: 'https://www.w3.org/WAI/WCAG21/Techniques/failures/F96' } }; }; ================================================ FILE: eslint.config.js ================================================ 'use strict'; const {defineConfig} = require('eslint/config'); const configPa11y = require('eslint-config-pa11y'); module.exports = defineConfig([ configPa11y, { ignores: [ 'public/js/*' ] }, { files: ['test/**/*.js', 'test/**/*.cjs'], rules: { 'prefer-arrow-callback': 'off', 'no-invalid-this': 'off', 'n/no-unsupported-features/node-builtins': ['error', { ignores: ['fetch'] }] } }, { files: ['data/*'], rules: { 'max-len': 'off' } } ]); ================================================ FILE: index.js ================================================ // This file is part of Pa11y Dashboard. // // Pa11y Dashboard is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Pa11y Dashboard is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Pa11y Dashboard. If not, see . 'use strict'; const initService = require('pa11y-webservice'); const kleur = require('kleur'); const config = require('./config'); const initDashboard = require('./app'); initDashboard(config, (error, app) => { if (error) { console.error(error.stack); process.exit(1); } setupSignalHandlers(app); logStartup(app); setupErrorLogging(app); startWebservice(); }); // Handle SIGINT and SIGTERM signals so hopefully in-flight requests and // Chromium processes are not orphaned on shutdown function setupSignalHandlers(app) { function gracefulShutdown(signal) { console.log(`\nGracefully shutting down (${signal})`); app.server.close(() => { console.log('HTTP server closed'); process.exit(0); }); } process.on('SIGINT', () => gracefulShutdown('SIGINT')); process.on('SIGTERM', () => gracefulShutdown('SIGTERM')); } // Log both the intended URI and the actual bound address, which can differ when // the OS assigns a different port or the app binds to 0.0.0.0 vs localhost function logStartup(app) { const mode = process.env.NODE_ENV; const dashboardAddress = app.server.address(); console.log(kleur.underline().magenta('\nPa11y Dashboard started')); console.log(kleur.grey('mode: %s'), mode); console.log(kleur.grey('uri (intended): %s'), `http://localhost:${config.port}/`); console.log( kleur.grey(`uri (actual, ${dashboardAddress.family}): %s`), `http://${dashboardAddress.address}:${dashboardAddress.port}/` ); } // Route errors are emitted as events rather than crashing the process // so they need an explicit listener to be logged function setupErrorLogging(app) { app.on('route-error', routeError => { const stack = (routeError.stack ? routeError.stack.split('\n') : [routeError.message]); const msg = kleur.red(stack.shift()); console.error(''); console.error(msg); console.error(kleur.grey(stack.join('\n'))); }); } // Start webservice unless we're connecting to an already-running external webservice instead function startWebservice() { if (typeof config.webservice !== 'object') { return; } const mode = process.env.NODE_ENV; console.log(kleur.underline().cyan('\nPa11y Webservice starting')); initService(config.webservice, (webserviceError, webservice) => { if (webserviceError) { console.error(webserviceError.stack); process.exit(1); } console.log(kleur.cyan('\nPa11y Webservice started')); console.log(kleur.grey('mode: %s'), mode); console.log(kleur.grey('uri: %s'), webservice.server.info.uri); console.log(kleur.grey('database: %s'), config.webservice.database); console.log(kleur.grey('cron: %s'), config.webservice.cron); }); } ================================================ FILE: package.json ================================================ { "name": "pa11y-dashboard", "version": "5.2.0", "private": true, "description": "Pa11y Dashboard is a visual web interface to the Pa11y accessibility reporter", "keywords": [ "a11y", "accessibility", "analysis", "aria", "audit", "automation", "checker", "compliance", "dashboard", "htmlcs", "open-source", "pa11y", "puppeteer", "report", "standards", "testing", "validator", "WCAG" ], "author": "Team Pa11y", "contributors": [ "Perry Harlock (http://www.phwebs.co.uk/)", "Rowan Manning (http://rowanmanning.com/)" ], "repository": { "type": "git", "url": "https://github.com/pa11y/pa11y-dashboard.git" }, "homepage": "https://github.com/pa11y/pa11y-dashboard", "bugs": "https://github.com/pa11y/pa11y-dashboard/issues", "license": "GPL-3.0", "engines": { "node": ">=20" }, "dependencies": { "body-parser": "~1.20.4", "compression": "~1.8.1", "express": "~4.22.1", "express-hbs": "~2.5.0", "http-headers": "~3.0.2", "kleur": "~4.1.5", "lodash.groupby": "~4.6.0", "lodash.keys": "~4.2.0", "moment": "~2.30.1", "morgan": "~1.10.1", "nanoid": "~5.1.7", "pa11y-webservice": "^5.0.1", "pa11y-webservice-client-node": "^5.0.0" }, "devDependencies": { "bower": "^1.8.13", "cheerio": "^1.1.2", "eslint": "^9.39.1", "eslint-config-pa11y": "^4.0.0", "less": "^3.11.1", "mocha": "^11.7.5", "proclaim": "^3.6.0", "uglify-js": "^3.11.0" }, "scripts": { "start": "node index.js", "test": "npm run test:integration", "test:integration": "mocha 'test/integration/**/*.js' --recursive --timeout 20000 --slow 4000", "lint": "eslint ." } } ================================================ FILE: public/js/site.js ================================================ // This file is part of Pa11y Dashboard. // // Pa11y Dashboard is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Pa11y Dashboard is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Pa11y Dashboard. If not, see . $(document).ready(function(){ var data = {}; var standardsList = $('[data-role="standards-list"]'); var standardSelect = $('[data-role="new-task-select"]'); var taskListSelector = $('[data-role="task-list"] a'); var detailsCollapse = $('[data-role="details-collapse"]'); var contextPopover = $('[data-role="context-popover"]'); var ruleTooltip = $('[data-role="rule-tooltip"]'); var toTopLinks = $('[data-role="top"]'); var zoomResetButton = $('[data-role="zoom-reset"]'); var graphContainer = $('[data-role="graph"]'); var dateSelectDropdownMenu = $('[data-role="date-select-dropdown-menu"]'); var legend = graphContainer.parent('.graph-container').find('.dashedLegend'); var list = localStorage.getItem("listview") || ""; // get choice or nothing var graphOptions = { series: { dashes: { show: false, lineWidth: 3 }, lines: { show: true }, points: { show: true }, hoverable: true }, xaxis: { mode: 'time', tickLength: 0, minTickSize: [1, 'day'], timeformat: '%d %b' }, yaxis: { tickDecimals: 0 }, lines: { lineWidth: 3 }, points: { fill: true, radius:4, lineWidth:3 }, shadowSize: 0, grid: { backgroundColor: '#fff', borderColor: '#808080', hoverable: true, clickable: true, borderWidth: { top: 1, right: 1, bottom: 1, left: 1 } }, selection: { mode: 'x' } }; // have we declared a custom legend if (legend.length === 1) { $('body').addClass('custom-legend'); } // Update details button title by click detailsCollapse.click(function(){ $(this).toggleClass('btn_state_collapsed'); }); // Initialize context popovers $(contextPopover).popover({ container: 'body', placement: 'bottom' }); $(document.body).click(function (e) { $(contextPopover).each(function () { if (!$(this).is(e.target) && $(this).has(e.target).length === 0 && $('.popover').has(e.target).length === 0) { if ($(this).data('bs.popover').tip().hasClass('in')) { $(this).popover('toggle'); } } }); }); // Back to top links toTopLinks.click( function(e){ e.preventDefault(); $(animateSection($('#top'), -55)); }); // Switch standards list of rules switchStandardsList(standardSelect); $('.rules-list-title').addClass('hidden'); $('.date-links').removeClass('list-group date-links').addClass('dropdown-menu'); $('.dropdown-menu a').removeClass('list-group-item'); dateSelectDropdownMenu.removeClass('hidden'); standardSelect.change( function(){ switchStandardsList($(this)); }); taskListSelector.click( function(e) { e.preventDefault(); target = $(this).attr('href'); animateSection($(target), -25); if (!$(target).hasClass('showing')) { $(target).click(); } }); zoomResetButton.click( function() { plotGraphData(); toggleResetZoomButton(); }); $.each(graphContainer, function(){ getGraphData(); plotGraphData(); }); ruleTooltip.tooltip(); // Function to animate sections function animateSection (sectionName, offset){ $('html,body').animate({ scrollTop: $(sectionName).offset().top + offset }, 750); } // Standards list switcher for new task form function switchStandardsList(el){ standardsList.hide(); chosenValue = (el.val()); $('[data-attr="' + chosenValue + '"]').show(); } function getGraphData() { $($('[data-role="url-stats"]').get().reverse()).each( function() { var el = $(this); storeDatum(el, getXAxisLabel(el)); }); } function getXAxisLabel (el) { return el.find('[data-role="date"]').attr('data-value'); } function storeDatum (el, label) { $.each(el.find('[data-label]'), function() { var type = $(this).attr('data-label'); var value = $(this).html(); if (typeof data[type] === 'undefined') { data[type] = []; } data[type].push([label, +value]); }); } function plotGraphData () { $.plot(graphContainer, getData(), graphOptions); exportGraph(); } function getData() { return [ { color: 'rgb(216, 61, 45)', label: 'Errors', data: data.error }, { color: 'rgb(168, 103, 0)', label: 'Warnings', data: data.warning, lines: { show: false }, dashes: { show: true, dashLength: [10, 5] } }, { color: 'rgb(23, 123, 190)', label: 'Notices', data: data.notice, lines: { show: false }, dashes: { show: true, dashLength: 5 } } ]; } function toggleResetZoomButton() { zoomResetButton.toggleClass('hidden'); } function exportGraph() { var exportBtn = $('.btn_action_export'); exportBtn.click(function(e) { e.preventDefault(); var fileName = $('h1').text().toLowerCase().split(' ').join('_'); var date = new Date(); fileName += '_' + date.getDate() + '-' + (date.getMonth() + 1) + '-' + date.getFullYear(); html2canvas($('.graph').get(0), { onrendered: function (canvas) { downloadFile(canvas.toDataURL('image/png'), fileName + '.png'); } }); }); } function downloadFile(dataurl, filename) { var link = document.createElement('a'); link.href = dataurl; link.setAttribute('download', filename); var clickEvent = document.createEvent('MouseEvents'); clickEvent.initEvent('click', false, true); link.dispatchEvent(clickEvent); return false; } graphContainer.bind('plotselected', function (event, ranges) { // clamp the zooming to prevent eternal zoom if (ranges.xaxis.to - ranges.xaxis.from < 0.00001) { ranges.xaxis.to = ranges.xaxis.from + 0.00001; } if (ranges.yaxis.to - ranges.yaxis.from < 0.00001) { ranges.yaxis.to = ranges.yaxis.from + 0.00001; } // do the zooming plot = $.plot(graphContainer, getData(ranges.xaxis.from, ranges.xaxis.to), $.extend(true, {}, graphOptions, { xaxis: { min: ranges.xaxis.from, max: ranges.xaxis.to }, yaxis: { min: ranges.yaxis.from, max: ranges.yaxis.to } }) ); if (!zoomResetButton.is(':visible')) { toggleResetZoomButton(); } }); var choiceContainer = $('[data-role="series-checkboxes"]'); var datasets = getData(); $.each(datasets, function(key, val) { var lowerCaseValue = (val.label.substring(0, val.label.length - 1)).toLowerCase(); choiceContainer.append( '
  • ' + '
    ' + '' + '' + '
    ' + '
  • ' ); }); choiceContainer.find('input').click(plotAccordingToChoices); choiceContainer.find('[data-stat-type=errors]').click(); function plotAccordingToChoices() { var data = []; var labels = []; choiceContainer.find('input:checked').each(function () { var key = $(this).attr('name'); if (key && datasets[key]) { labels.push(datasets[key].label); data.push(datasets[key]); } }); if (labels.length && legend.length === 1) { legend.find('tr').hide(); $.each(labels, function (index, value) { $('.legend' + value).parents('tr').show(); }); legend.show(); } else { legend.hide(); } if (data.length > -1) { $.plot(graphContainer, data, graphOptions); } } function showTooltip(x, y, contents) { $('
    ' + contents + '
    ').css({top: y + 5,left: x + 5}).appendTo('body').fadeIn(200); } var previousPoint = null; graphContainer.bind('plothover', function (event, pos, item) { if (item) { if (previousPoint !== item.dataIndex) { previousPoint = item.dataIndex; $('[data-role="tooltip"]').remove(); var count = item.datapoint[1].toFixed(0); var date = $.plot.formatDate(new Date(item.datapoint[0]), '%d %b' + ' (%H:%M)'); var contents = '

    ' + date + '
    ' + count + ' ' + item.series.label + ''; showTooltip(item.pageX, item.pageY, contents); } } else { $('[data-role="tooltip"]').remove(); previousPoint = null; } }); // Task filter function initTaskFilter (container) { var tasks = initTaskFilterTasks(container); var input = initTaskFilterInput(container, tasks); } function initTaskFilterTasks (container) { var tasks = container.find('[data-role=task]'); return tasks; } function initTaskFilterInput (container, tasks) { var input = container.find('[data-role=input]'); input.on('keyup', function () { filterTasks(tasks, input.val()); }); return input; } function filterTasks (tasks, query) { query = $.trim(query.replace(/[^a-z0-9\s]+/gi, '')); tasks.removeClass('hidden'); if (/^\s*$/.test(query)) { return; } var queryRegExp = new RegExp('(' + query.replace(/\s+/gi, '|') + ')', 'i'); tasks.filter(function () { return !queryRegExp.test($(this).data('keywords')); }).addClass('hidden'); } var taskLists = $('[data-control=task-list]'); if (taskLists.length > 0) { $('[data-control=task-list]').each(function () { initTaskFilter($(this)); }); } // Extend public/js/vendor/bootstrap/js/collapse.js // Add keyboard control for filters $.fn.collapse.Constructor.prototype.keydown = function (e) { var $this = $(this); var k = e.which || e.keyCode; if (!/(13|32)/.test(k)) { return; } if (k === 13 || k === 32) { $this.click(); } e.preventDefault(); e.stopPropagation(); }; $('[data-toggle="collapse"]').attr('role', 'button').attr('tabindex', 0); $(document).on( 'keydown.collapse.data-api', '[data-toggle="collapse"]', $.fn.collapse.Constructor.prototype.keydown ); // List View $('.btn-list').click(function () { var elements = $("#grid-container .task-card"); for (i = 0; i < elements.length; i++) { $(elements[i]).removeClass('col-md-4 col-sm-6'); $(elements[i]).addClass('col-md-12'); $(elements[i]).find('.gridview:nth-child(1)').addClass('listview col-md-9 col-sm-8'); $(elements[i]).find('.gridview:nth-child(2)').addClass('listview col-md-3 col-sm-4 task-actions clearfix'); $(elements[i]).find('.gridview').removeClass('gridview'); }; $('.view-btn').removeClass('btn-default') $(this).addClass('btn-default'); localStorage.setItem("listview", "yes") //save the choice }); // Grid View $('.btn-grid').click(function () { var elements = $("#grid-container .task-card"); for (i = 0; i < elements.length; i++) { $(elements[i]).removeClass('col-md-12'); $(elements[i]).addClass('col-md-4 col-sm-6'); $(elements[i]).find('.listview').addClass('gridview') $(elements[i]).find('.listview:nth-child(1)').removeClass('listview col-md-9 col-sm-8'); $(elements[i]).find('.listview:nth-child(2)').removeClass('listview col-md-3 col-sm-4 task-actions clearfix'); }; $('.view-btn').removeClass('btn-default') $(this).addClass('btn-default') localStorage.setItem("listview", "") //clears the choice }); //load the view as per user's choice if (list === 'yes') { $('.btn-list').trigger('click'); } }); ================================================ FILE: public/js/vendor/bootstrap/.bower.json ================================================ { "name": "bootstrap", "version": "3.0.1", "main": [ "./dist/js/bootstrap.js", "./dist/css/bootstrap.css", "./dist/fonts/*" ], "ignore": [ "**/.*" ], "dependencies": { "jquery": ">= 1.9.0" }, "homepage": "https://github.com/twbs/bootstrap", "_release": "3.0.1", "_resolution": { "type": "version", "tag": "v3.0.1", "commit": "867e2bef8d9c9b901022899227b306a532f5baf3" }, "_source": "git://github.com/twbs/bootstrap.git", "_target": "~3.0", "_originalSource": "bootstrap" } ================================================ FILE: public/js/vendor/bootstrap/CNAME ================================================ getbootstrap.com ================================================ FILE: public/js/vendor/bootstrap/CONTRIBUTING.md ================================================ # Contributing to Bootstrap Looking to contribute something to Bootstrap? **Here's how you can help.** ## Reporting issues We only accept issues that are bug reports or feature requests. Bugs must be isolated and reproducible problems that we can fix within the Bootstrap core. Please read the following guidelines before opening any issue. 1. **Search for existing issues.** We get a lot of duplicate issues, and you'd help us out a lot by first checking if someone else has reported the same issue. Moreover, the issue may have already been resolved with a fix available. 2. **Create an isolated and reproducible test case.** Be sure the problem exists in Bootstrap's code with a [reduced test case](http://css-tricks.com/reduced-test-cases/) that should be included in each bug report. 3. **Include a live example.** Make use of jsFiddle or jsBin to share your isolated test cases. 4. **Share as much information as possible.** Include operating system and version, browser and version, version of Bootstrap, customized or vanilla build, etc. where appropriate. Also include steps to reproduce the bug. ## Pull requests - CSS changes must be done in `.less` files first, never just the compiled `.css` files - If modifying the `.less` files, always recompile and commit the compiled files `bootstrap.css` and `bootstrap.min.css` - Try not to pollute your pull request with unintended changes--keep them simple and small - Try to share which browsers your code has been tested in before submitting a pull request - Pull requests should always be against the `master` branch, never against `gh-pages`. ## Coding standards ### HTML - Two spaces for indentation, never tabs - Double quotes only, never single quotes - Always use proper indentation - Use tags and elements appropriate for an HTML5 doctype (e.g., self-closing tags) - Use CDNs and HTTPS for third-party JS when possible. We don't use protocol-relative URLs in this case because they break when viewing the page locally via `file://`. ### CSS - Adhere to the [RECESS CSS property order](http://markdotto.com/2011/11/29/css-property-order/) - Multiple-line approach (one property and value per line) - Always a space after a property's colon (e.g., `display: block;` and not `display:block;`) - End all lines with a semi-colon - For multiple, comma-separated selectors, place each selector on its own line - Attribute selectors, like `input[type="text"]` should always wrap the attribute's value in double quotes, for consistency and safety (see this [blog post on unquoted attribute values](http://mathiasbynens.be/notes/unquoted-attribute-values) that can lead to XSS attacks). ### JS - No semicolons - Comma first - 2 spaces (no tabs) - strict mode - "Attractive" ## License With v3.1, we're moving from the Apache 2 to the MIT license for the Bootstrap code (not the docs). We're in the process of collecting permissions from all Bootstrap contributors with code still part of the project to make this happen. For details, please see [#2054](https://github.com/twbs/bootstrap/issues/2054). By contributing your code, you agree to dual-license your contribution under the [Apache 2](https://github.com/twbs/bootstrap/blob/master/LICENSE) and [MIT](https://github.com/twbs/bootstrap/blob/master/MIT) licenses. ================================================ FILE: public/js/vendor/bootstrap/DOCS-LICENSE ================================================ Creative Commons Legal Code Attribution 3.0 Unported CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM ITS USE. License THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS. 1. Definitions a. "Adaptation" means a work based upon the Work, or upon the Work and other pre-existing works, such as a translation, adaptation, derivative work, arrangement of music or other alterations of a literary or artistic work, or phonogram or performance and includes cinematographic adaptations or any other form in which the Work may be recast, transformed, or adapted including in any form recognizably derived from the original, except that a work that constitutes a Collection will not be considered an Adaptation for the purpose of this License. For the avoidance of doubt, where the Work is a musical work, performance or phonogram, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered an Adaptation for the purpose of this License. b. "Collection" means a collection of literary or artistic works, such as encyclopedias and anthologies, or performances, phonograms or broadcasts, or other works or subject matter other than works listed in Section 1(f) below, which, by reason of the selection and arrangement of their contents, constitute intellectual creations, in which the Work is included in its entirety in unmodified form along with one or more other contributions, each constituting separate and independent works in themselves, which together are assembled into a collective whole. A work that constitutes a Collection will not be considered an Adaptation (as defined above) for the purposes of this License. c. "Distribute" means to make available to the public the original and copies of the Work or Adaptation, as appropriate, through sale or other transfer of ownership. d. "Licensor" means the individual, individuals, entity or entities that offer(s) the Work under the terms of this License. e. "Original Author" means, in the case of a literary or artistic work, the individual, individuals, entity or entities who created the Work or if no individual or entity can be identified, the publisher; and in addition (i) in the case of a performance the actors, singers, musicians, dancers, and other persons who act, sing, deliver, declaim, play in, interpret or otherwise perform literary or artistic works or expressions of folklore; (ii) in the case of a phonogram the producer being the person or legal entity who first fixes the sounds of a performance or other sounds; and, (iii) in the case of broadcasts, the organization that transmits the broadcast. f. "Work" means the literary and/or artistic work offered under the terms of this License including without limitation any production in the literary, scientific and artistic domain, whatever may be the mode or form of its expression including digital form, such as a book, pamphlet and other writing; a lecture, address, sermon or other work of the same nature; a dramatic or dramatico-musical work; a choreographic work or entertainment in dumb show; a musical composition with or without words; a cinematographic work to which are assimilated works expressed by a process analogous to cinematography; a work of drawing, painting, architecture, sculpture, engraving or lithography; a photographic work to which are assimilated works expressed by a process analogous to photography; a work of applied art; an illustration, map, plan, sketch or three-dimensional work relative to geography, topography, architecture or science; a performance; a broadcast; a phonogram; a compilation of data to the extent it is protected as a copyrightable work; or a work performed by a variety or circus performer to the extent it is not otherwise considered a literary or artistic work. g. "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation. h. "Publicly Perform" means to perform public recitations of the Work and to communicate to the public those public recitations, by any means or process, including by wire or wireless means or public digital performances; to make available to the public Works in such a way that members of the public may access these Works from a place and at a place individually chosen by them; to perform the Work to the public by any means or process and the communication to the public of the performances of the Work, including by public digital performance; to broadcast and rebroadcast the Work by any means including signs, sounds or images. i. "Reproduce" means to make copies of the Work by any means including without limitation by sound or visual recordings and the right of fixation and reproducing fixations of the Work, including storage of a protected performance or phonogram in digital form or other electronic medium. 2. Fair Dealing Rights. Nothing in this License is intended to reduce, limit, or restrict any uses free from copyright or rights arising from limitations or exceptions that are provided for in connection with the copyright protection under copyright law or other applicable laws. 3. License Grant. Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below: a. to Reproduce the Work, to incorporate the Work into one or more Collections, and to Reproduce the Work as incorporated in the Collections; b. to create and Reproduce Adaptations provided that any such Adaptation, including any translation in any medium, takes reasonable steps to clearly label, demarcate or otherwise identify that changes were made to the original Work. For example, a translation could be marked "The original work was translated from English to Spanish," or a modification could indicate "The original work has been modified."; c. to Distribute and Publicly Perform the Work including as incorporated in Collections; and, d. to Distribute and Publicly Perform Adaptations. e. For the avoidance of doubt: i. Non-waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme cannot be waived, the Licensor reserves the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; ii. Waivable Compulsory License Schemes. In those jurisdictions in which the right to collect royalties through any statutory or compulsory licensing scheme can be waived, the Licensor waives the exclusive right to collect such royalties for any exercise by You of the rights granted under this License; and, iii. Voluntary License Schemes. The Licensor waives the right to collect royalties, whether individually or, in the event that the Licensor is a member of a collecting society that administers voluntary licensing schemes, via that society, from any exercise by You of the rights granted under this License. The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. Subject to Section 8(f), all rights not expressly granted by Licensor are hereby reserved. 4. Restrictions. The license granted in Section 3 above is expressly made subject to and limited by the following restrictions: a. You may Distribute or Publicly Perform the Work only under the terms of this License. You must include a copy of, or the Uniform Resource Identifier (URI) for, this License with every copy of the Work You Distribute or Publicly Perform. You may not offer or impose any terms on the Work that restrict the terms of this License or the ability of the recipient of the Work to exercise the rights granted to that recipient under the terms of the License. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties with every copy of the Work You Distribute or Publicly Perform. When You Distribute or Publicly Perform the Work, You may not impose any effective technological measures on the Work that restrict the ability of a recipient of the Work from You to exercise the rights granted to that recipient under the terms of the License. This Section 4(a) applies to the Work as incorporated in a Collection, but this does not require the Collection apart from the Work itself to be made subject to the terms of this License. If You create a Collection, upon notice from any Licensor You must, to the extent practicable, remove from the Collection any credit as required by Section 4(b), as requested. If You create an Adaptation, upon notice from any Licensor You must, to the extent practicable, remove from the Adaptation any credit as required by Section 4(b), as requested. b. If You Distribute, or Publicly Perform the Work or any Adaptations or Collections, You must, unless a request has been made pursuant to Section 4(a), keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or if the Original Author and/or Licensor designate another party or parties (e.g., a sponsor institute, publishing entity, journal) for attribution ("Attribution Parties") in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; (ii) the title of the Work if supplied; (iii) to the extent reasonably practicable, the URI, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and (iv) , consistent with Section 3(b), in the case of an Adaptation, a credit identifying the use of the Work in the Adaptation (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). The credit required by this Section 4 (b) may be implemented in any reasonable manner; provided, however, that in the case of a Adaptation or Collection, at a minimum such credit will appear, if a credit for all contributing authors of the Adaptation or Collection appears, then as part of these credits and in a manner at least as prominent as the credits for the other contributing authors. For the avoidance of doubt, You may only use the credit required by this Section for the purpose of attribution in the manner set out above and, by exercising Your rights under this License, You may not implicitly or explicitly assert or imply any connection with, sponsorship or endorsement by the Original Author, Licensor and/or Attribution Parties, as appropriate, of You or Your use of the Work, without the separate, express prior written permission of the Original Author, Licensor and/or Attribution Parties. c. Except as otherwise agreed in writing by the Licensor or as may be otherwise permitted by applicable law, if You Reproduce, Distribute or Publicly Perform the Work either by itself or as part of any Adaptations or Collections, You must not distort, mutilate, modify or take other derogatory action in relation to the Work which would be prejudicial to the Original Author's honor or reputation. Licensor agrees that in those jurisdictions (e.g. Japan), in which any exercise of the right granted in Section 3(b) of this License (the right to make Adaptations) would be deemed to be a distortion, mutilation, modification or other derogatory action prejudicial to the Original Author's honor and reputation, the Licensor will waive or not assert, as appropriate, this Section, to the fullest extent permitted by the applicable national law, to enable You to reasonably exercise Your right under Section 3(b) of this License (right to make Adaptations) but not otherwise. 5. Representations, Warranties and Disclaimer UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. 6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. Termination a. This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Adaptations or Collections from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License. b. Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above. 8. Miscellaneous a. Each time You Distribute or Publicly Perform the Work or a Collection, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License. b. Each time You Distribute or Publicly Perform an Adaptation, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License. c. If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. d. No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent. e. This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You. f. The rights granted under, and the subject matter referenced, in this License were drafted utilizing the terminology of the Berne Convention for the Protection of Literary and Artistic Works (as amended on September 28, 1979), the Rome Convention of 1961, the WIPO Copyright Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 and the Universal Copyright Convention (as revised on July 24, 1971). These rights and subject matter take effect in the relevant jurisdiction in which the License terms are sought to be enforced according to the corresponding provisions of the implementation of those treaty provisions in the applicable national law. If the standard suite of rights granted under applicable copyright law includes additional rights not granted under this License, such additional rights are deemed to be included in the License; this License is not intended to restrict the license of any rights under applicable law. Creative Commons Notice Creative Commons is not a party to this License, and makes no warranty whatsoever in connection with the Work. Creative Commons will not be liable to You or any party on any legal theory for any damages whatsoever, including without limitation any general, special, incidental or consequential damages arising in connection to this license. Notwithstanding the foregoing two (2) sentences, if Creative Commons has expressly identified itself as the Licensor hereunder, it shall have all rights and obligations of Licensor. Except for the limited purpose of indicating to the public that the Work is licensed under the CCPL, Creative Commons does not authorize the use by either party of the trademark "Creative Commons" or any related trademark or logo of Creative Commons without the prior written consent of Creative Commons. Any permitted use will be in compliance with Creative Commons' then-current trademark usage guidelines, as may be published on its website or otherwise made available upon request from time to time. For the avoidance of doubt, this trademark restriction does not form part of this License. Creative Commons may be contacted at http://creativecommons.org/. ================================================ FILE: public/js/vendor/bootstrap/Gruntfile.js ================================================ /* jshint node: true */ module.exports = function(grunt) { "use strict"; var btoa = require('btoa') // Project configuration. grunt.initConfig({ // Metadata. pkg: grunt.file.readJSON('package.json'), banner: '/*!\n' + ' * Bootstrap v<%= pkg.version %> by @fat and @mdo\n' + ' * Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + ' * Licensed under <%= _.pluck(pkg.licenses, "url").join(", ") %>\n' + ' *\n' + ' * Designed and built with all the love in the world by @mdo and @fat.\n' + ' */\n\n', jqueryCheck: 'if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") }\n\n', // Task configuration. clean: { dist: ['dist'] }, jshint: { options: { jshintrc: 'js/.jshintrc' }, gruntfile: { src: 'Gruntfile.js' }, src: { src: ['js/*.js'] }, test: { src: ['js/tests/unit/*.js'] } }, concat: { options: { banner: '<%= banner %><%= jqueryCheck %>', stripBanners: false }, bootstrap: { src: [ 'js/transition.js', 'js/alert.js', 'js/button.js', 'js/carousel.js', 'js/collapse.js', 'js/dropdown.js', 'js/modal.js', 'js/tooltip.js', 'js/popover.js', 'js/scrollspy.js', 'js/tab.js', 'js/affix.js' ], dest: 'dist/js/<%= pkg.name %>.js' } }, uglify: { options: { banner: '<%= banner %>', report: 'min' }, bootstrap: { src: ['<%= concat.bootstrap.dest %>'], dest: 'dist/js/<%= pkg.name %>.min.js' } }, recess: { options: { compile: true, banner: '<%= banner %>' }, bootstrap: { src: ['less/bootstrap.less'], dest: 'dist/css/<%= pkg.name %>.css' }, min: { options: { compress: true }, src: ['less/bootstrap.less'], dest: 'dist/css/<%= pkg.name %>.min.css' }, theme: { src: ['less/theme.less'], dest: 'dist/css/<%= pkg.name %>-theme.css' }, theme_min: { options: { compress: true }, src: ['less/theme.less'], dest: 'dist/css/<%= pkg.name %>-theme.min.css' } }, copy: { fonts: { expand: true, src: ["fonts/*"], dest: 'dist/' } }, qunit: { options: { inject: 'js/tests/unit/phantom.js' }, files: ['js/tests/*.html'] }, connect: { server: { options: { port: 3000, base: '.' } } }, jekyll: { docs: {} }, validation: { options: { reset: true, relaxerror: [ "Bad value X-UA-Compatible for attribute http-equiv on element meta.", "Element img is missing required attribute src." ] }, files: { src: ["_gh_pages/**/*.html"] } }, watch: { src: { files: '<%= jshint.src.src %>', tasks: ['jshint:src', 'qunit'] }, test: { files: '<%= jshint.test.src %>', tasks: ['jshint:test', 'qunit'] }, recess: { files: 'less/*.less', tasks: ['recess'] } } }); // These plugins provide necessary tasks. grunt.loadNpmTasks('browserstack-runner'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-qunit'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-html-validation'); grunt.loadNpmTasks('grunt-jekyll'); grunt.loadNpmTasks('grunt-recess'); // Docs HTML validation task grunt.registerTask('validate-html', ['jekyll', 'validation']); // Test task. var testSubtasks = ['dist-css', 'jshint', 'qunit', 'validate-html']; // Only run BrowserStack tests under Travis if (process.env.TRAVIS) { // Only run BrowserStack tests if this is a mainline commit in twbs/bootstrap, or you have your own BrowserStack key if ((process.env.TRAVIS_REPO_SLUG === 'twbs/bootstrap' && process.env.TRAVIS_PULL_REQUEST === 'false') || process.env.TWBS_HAVE_OWN_BROWSERSTACK_KEY) { testSubtasks.push('browserstack_runner'); } } grunt.registerTask('test', testSubtasks); // JS distribution task. grunt.registerTask('dist-js', ['concat', 'uglify']); // CSS distribution task. grunt.registerTask('dist-css', ['recess']); // Fonts distribution task. grunt.registerTask('dist-fonts', ['copy']); // Full distribution task. grunt.registerTask('dist', ['clean', 'dist-css', 'dist-fonts', 'dist-js']); // Default task. grunt.registerTask('default', ['test', 'dist', 'build-customizer']); // task for building customizer grunt.registerTask('build-customizer', 'Add scripts/less files to customizer.', function () { var fs = require('fs') function getFiles(type) { var files = {} fs.readdirSync(type) .filter(function (path) { return type == 'fonts' ? true : new RegExp('\\.' + type + '$').test(path) }) .forEach(function (path) { var fullPath = type + '/' + path return files[path] = (type == 'fonts' ? btoa(fs.readFileSync(fullPath)) : fs.readFileSync(fullPath, 'utf8')) }) return 'var __' + type + ' = ' + JSON.stringify(files) + '\n' } var files = getFiles('js') + getFiles('less') + getFiles('fonts') fs.writeFileSync('docs-assets/js/raw-files.js', files) }); }; ================================================ FILE: public/js/vendor/bootstrap/LICENSE ================================================ Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS ================================================ FILE: public/js/vendor/bootstrap/LICENSE-MIT ================================================ The MIT License (MIT) Copyright (c) 2013 Twitter, Inc 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. ================================================ FILE: public/js/vendor/bootstrap/README.md ================================================ # [Bootstrap](http://getbootstrap.com) [![Build Status](https://secure.travis-ci.org/twbs/bootstrap.png)](http://travis-ci.org/twbs/bootstrap) [![devDependency Status](https://david-dm.org/twbs/bootstrap/dev-status.png)](https://david-dm.org/twbs/bootstrap#info=devDependencies) Bootstrap is a sleek, intuitive, and powerful front-end framework for faster and easier web development, created and maintained by [Mark Otto](http://twitter.com/mdo) and [Jacob Thornton](http://twitter.com/fat). To get started, check out ! ## Quick start Three quick start options are available: * [Download the latest release](https://github.com/twbs/bootstrap/releases/tag/v3.0.0). * Clone the repo: `git clone https://github.com/twbs/bootstrap.git`. * Install with [Bower](http://bower.io): `bower install bootstrap`. Read the [Getting Started page](http://getbootstrap.com/getting-started/) for information on the framework contents, templates and examples, and more. ### What's included Within the download you'll find the following directories and files, logically grouping common assets and providing both compiled and minified variations. You'll see something like this: ``` bootstrap/ ├── css/ │ ├── bootstrap.css │ ├── bootstrap.min.css │ ├── bootstrap-theme.css │ └── bootstrap-theme.min.css ├── js/ │ ├── bootstrap.js │ └── bootstrap.min.js └── fonts/ ├── glyphicons-halflings-regular.eot ├── glyphicons-halflings-regular.svg ├── glyphicons-halflings-regular.ttf └── glyphicons-halflings-regular.woff ``` We provide compiled CSS and JS (`bootstrap.*`), as well as compiled and minified CSS and JS (`bootstrap.min.*`). Fonts from Glyphicons are included, as is the optional Bootstrap theme. ## Bugs and feature requests Have a bug or a feature request? [Please open a new issue](https://github.com/twbs/bootstrap/issues). Before opening any issue, please search for existing issues and read the [Issue Guidelines](https://github.com/necolas/issue-guidelines), written by [Nicolas Gallagher](https://github.com/necolas/). You may use [this JS Bin](http://jsbin.com/aKiCIDO/1/edit) as a template for your bug reports. ## Documentation Bootstrap's documentation, included in this repo in the root directory, is built with [Jekyll](http://jekyllrb.com) and publicly hosted on GitHub Pages at . The docs may also be run locally. ### Running documentation locally 1. If necessary, [install Jekyll](http://jekyllrb.com/docs/installation) (requires v1.x). 2. From the root `/bootstrap` directory, run `jekyll serve` in the command line. - **Windows users:** run `chcp 65001` first to change the command prompt's character encoding ([code page](http://en.wikipedia.org/wiki/Windows_code_page)) to UTF-8 so Jekyll runs without errors. 3. Open in your browser, and voilà. Learn more about using Jekyll by reading its [documentation](http://jekyllrb.com/docs/home/). ### Documentation for previous releases Documentation for v2.3.2 has been made available for the time being at while folks transition to Bootstrap 3. [Previous releases](https://github.com/twbs/bootstrap/releases) and their documentation are also available for download. ## Compiling CSS and JavaScript Bootstrap uses [Grunt](http://gruntjs.com/) with convenient methods for working with the framework. It's how we compile our code, run tests, and more. To use it, install the required dependencies as directed and then run some Grunt commands. ### Install Grunt From the command line: 1. Install `grunt-cli` globally with `npm install -g grunt-cli`. 2. Navigate to the root `/bootstrap` directory, then run `npm install`. npm will look at [package.json](package.json) and automatically install the necessary local dependencies listed there. When completed, you'll be able to run the various Grunt commands provided from the command line. **Unfamiliar with `npm`? Don't have node installed?** That's a-okay. npm stands for [node packaged modules](http://npmjs.org/) and is a way to manage development dependencies through node.js. [Download and install node.js](http://nodejs.org/download/) before proceeding. ### Available Grunt commands #### Build - `grunt` Run `grunt` to run tests locally and compile the CSS and JavaScript into `/dist`. **Uses [recess](http://twitter.github.io/recess/) and [UglifyJS](http://lisperator.net/uglifyjs/).** #### Only compile CSS and JavaScript - `grunt dist` `grunt dist` creates the `/dist` directory with compiled files. **Uses [recess](http://twitter.github.io/recess/) and [UglifyJS](http://lisperator.net/uglifyjs/).** #### Tests - `grunt test` Runs [JSHint](http://jshint.com) and [QUnit](http://qunitjs.com/) tests headlessly in [PhantomJS](http://phantomjs.org/) (used for CI). #### Watch - `grunt watch` This is a convenience method for watching just Less files and automatically building them whenever you save. ### Troubleshooting dependencies Should you encounter problems with installing dependencies or running Grunt commands, uninstall all previous dependency versions (global and local). Then, rerun `npm install`. ## Contributing Please read through our [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md). Included are directions for opening issues, coding standards, and notes on development. More over, if your pull request contains JavaScript patches or features, you must include relevant unit tests. All HTML and CSS should conform to the [Code Guide](http://github.com/mdo/code-guide), maintained by [Mark Otto](http://github.com/mdo). Editor preferences are available in the [editor config](.editorconfig) for easy use in common text editors. Read more and download plugins at . With v3.1, we're moving from the Apache 2 to the MIT license for the Bootstrap code (not the docs). Please see the [contributing guidelines](https://github.com/twbs/bootstrap/blob/master/CONTRIBUTING.md) for more information. ## Community Keep track of development and community news. * Follow [@twbootstrap on Twitter](http://twitter.com/twbootstrap). * Read and subscribe to [The Official Bootstrap Blog](http://blog.getbootstrap.com). * Have a question that's not a feature request or bug report? [Ask on the mailing list.](http://groups.google.com/group/twitter-bootstrap) * Chat with fellow Bootstrappers in IRC. On the `irc.freenode.net` server, in the `##twitter-bootstrap` channel. ## Versioning For transparency and insight into our release cycle, and for striving to maintain backward compatibility, Bootstrap will be maintained under the Semantic Versioning guidelines as much as possible. Releases will be numbered with the following format: `..` And constructed with the following guidelines: * Breaking backward compatibility bumps the major (and resets the minor and patch) * New additions without breaking backward compatibility bumps the minor (and resets the patch) * Bug fixes and misc changes bumps the patch For more information on SemVer, please visit . ## Authors **Mark Otto** + + **Jacob Thornton** + + ## Copyright and license Copyright 2013 Twitter, Inc under [the Apache 2.0 license](LICENSE). ================================================ FILE: public/js/vendor/bootstrap/_config.yml ================================================ # Dependencies markdown: rdiscount pygments: true # Permalinks permalink: pretty # Server destination: ./_gh_pages exclude: [".editorconfig", ".gitignore", "bower.json", "composer.json", "CONTRIBUTING.md", "CNAME", "LICENSE", "Gruntfile.js", "package.json", "node_modules", "README.md", "less"] port: 9001 # Custom vars current_version: 3.0.1 repo: https://github.com/twbs/bootstrap download_source: https://github.com/twbs/bootstrap/archive/v3.0.1.zip download_dist: https://github.com/twbs/bootstrap/releases/download/v3.0.1/bootstrap-3.0.1-dist.zip blog: http://blog.getbootstrap.com expo: http://expo.getbootstrap.com cdn_css: //netdna.bootstrapcdn.com/bootstrap/3.0.1/css/bootstrap.min.css cdn_theme_css: //netdna.bootstrapcdn.com/bootstrap/3.0.1/css/bootstrap-theme.min.css cdn_js: //netdna.bootstrapcdn.com/bootstrap/3.0.1/js/bootstrap.min.js ================================================ FILE: public/js/vendor/bootstrap/_includes/ads.html ================================================

    ================================================ FILE: public/js/vendor/bootstrap/_includes/footer.html ================================================ {% if page.slug == "customize" %} {% endif %} ================================================ FILE: public/js/vendor/bootstrap/_includes/header.html ================================================ {% if page.title == "Bootstrap" %} {{ page.title }} {% else %} {{ page.title }} · Bootstrap {% endif %} ================================================ FILE: public/js/vendor/bootstrap/_includes/nav-about.html ================================================
  • History
  • Core team
  • Community
  • Translations
  • ================================================ FILE: public/js/vendor/bootstrap/_includes/nav-components.html ================================================
  • Glyphicons
  • Dropdowns
  • Button groups
  • Button dropdowns
  • Input groups
  • Navs
  • Navbar
  • Breadcrumbs
  • Pagination
  • Labels
  • Badges
  • Jumbotron
  • Page header
  • Thumbnails
  • Alerts
  • Progress bars
  • Media object
  • List group
  • Panels
  • Wells
  • ================================================ FILE: public/js/vendor/bootstrap/_includes/nav-css.html ================================================
  • Overview
  • Grid system
  • Typography
  • Code
  • Tables
  • Forms
  • Buttons
  • Images
  • Helper classes
  • Responsive utilities
  • ================================================ FILE: public/js/vendor/bootstrap/_includes/nav-customize.html ================================================
  • LESS components
  • jQuery plugins
  • LESS variables
  • Download
  • ================================================ FILE: public/js/vendor/bootstrap/_includes/nav-getting-started.html ================================================
  • Download Bootstrap
  • What's included
  • Basic template
  • Examples
  • Disabling responsiveness
  • Migrating from 2.x to 3.0
  • Browser support
  • Third party support
  • Accessibility
  • License FAQs
  • Customizing Bootstrap
  • ================================================ FILE: public/js/vendor/bootstrap/_includes/nav-javascript.html ================================================
  • Overview
  • Transitions
  • Modal
  • Dropdown
  • Scrollspy
  • Tab
  • Tooltip
  • Popover
  • Alert
  • Button
  • Collapse
  • Carousel
  • Affix
  • ================================================ FILE: public/js/vendor/bootstrap/_includes/nav-main.html ================================================ ================================================ FILE: public/js/vendor/bootstrap/_includes/old-bs-docs.html ================================================
    Looking for Bootstrap 2.3.2 docs? We've moved it to a new home while we push forward with Bootstrap 3. Read the blog for details.
    ================================================ FILE: public/js/vendor/bootstrap/_includes/social-buttons.html ================================================ ================================================ FILE: public/js/vendor/bootstrap/_layouts/default.html ================================================ {% include header.html %} Skip to main content {% include nav-main.html %}

    {{ page.title }}

    {{ page.lead }}

    {% include ads.html %}
    {% include old-bs-docs.html %}
    {{ content }}
    {% include footer.html %} ================================================ FILE: public/js/vendor/bootstrap/_layouts/home.html ================================================ {% include header.html %} Skip to main content {% include nav-main.html %} {{ content }} {% include footer.html %} ================================================ FILE: public/js/vendor/bootstrap/about.html ================================================ --- layout: default title: About slug: about lead: "Learn about the history of Bootstrap, meet the core team, and check out the ever-growing community resources." base_url: "../" ---

    Originally created by a designer and a developer at Twitter, Bootstrap has become one of the most popular front-end frameworks and open source projects in the world.

    Bootstrap was created at Twitter in mid-2010 by @mdo and @fat. Prior to being an open-sourced framework, Bootstrap was known as Twitter Blueprint. A few months into development, Twitter held its first Hack Week and the project exploded as developers of all skill levels jumped in without any external guidance. It served as the style guide for internal tools development at the company for over a year before its public release, and continues to do so today.

    Originally released on , we've since had over twenty releases, including two major rewrites with v2 and v3. With Bootstrap 2, we added responsive functionality to the entire framework as an optional stylesheet. Building on that with Bootstrap 3, we rewrote the library once more to make it responsive by default with a mobile first approach.

    Bootstrap is maintained by the founding team and a small group of invaluable core contributors, with the massive support and involvement of our community.

    Get involved with Bootstrap development by opening an issue or submitting a pull request. Read our contributing guidelines for information on how we develop.

    Stay up to date on the development of Bootstrap and reach out to the community with these helpful resources.

    You can also follow @twbootstrap on Twitter for the latest gossip and awesome music videos.

    Community members have translated Bootstrap's documentation into various langauges. None are officially supported and may not always be up to date.

    Have another language to add, or perhaps a different or better translation? Let us know by opening an issue.

    ================================================ FILE: public/js/vendor/bootstrap/bower.json ================================================ { "name": "bootstrap", "version": "3.0.1", "main": ["./dist/js/bootstrap.js", "./dist/css/bootstrap.css", "./dist/fonts/*"], "ignore": [ "**/.*" ], "dependencies": { "jquery": ">= 1.9.0" } } ================================================ FILE: public/js/vendor/bootstrap/browserstack.json ================================================ { "username": "--secure--", "key": "--secure--", "test_path": "js/tests/index.html", "browsers": [ { "browser": "firefox", "browser_version": "latest", "os": "OS X", "os_version": "Mountain Lion" }, { "browser": "safari", "browser_version": "latest", "os": "OS X", "os_version": "Mountain Lion" }, { "browser": "chrome", "browser_version": "latest", "os": "OS X", "os_version": "Mountain Lion" }, { "browser": "firefox", "browser_version": "latest", "os": "Windows", "os_version": "7" }, { "browser": "chrome", "browser_version": "latest", "os": "Windows", "os_version": "7" } ] } ================================================ FILE: public/js/vendor/bootstrap/components.html ================================================ --- layout: default title: Components slug: components lead: "Over a dozen reusable components built to provide iconography, dropdowns, navigation, alerts, popovers, and much more." base_url: "../" ---

    Available glyphs

    Includes 200 glyphs in font format from the Glyphicon Halflings set. Glyphicons Halflings are normally not available for free, but their creator has made them available for Bootstrap free of cost. As a thank you, we only ask that you to include a link back to Glyphicons whenever possible.

    • .glyphicon .glyphicon-adjust
    • .glyphicon .glyphicon-align-center
    • .glyphicon .glyphicon-align-justify
    • .glyphicon .glyphicon-align-left
    • .glyphicon .glyphicon-align-right
    • .glyphicon .glyphicon-arrow-down
    • .glyphicon .glyphicon-arrow-left
    • .glyphicon .glyphicon-arrow-right
    • .glyphicon .glyphicon-arrow-up
    • .glyphicon .glyphicon-asterisk
    • .glyphicon .glyphicon-backward
    • .glyphicon .glyphicon-ban-circle
    • .glyphicon .glyphicon-barcode
    • .glyphicon .glyphicon-bell
    • .glyphicon .glyphicon-bold
    • .glyphicon .glyphicon-book
    • .glyphicon .glyphicon-bookmark
    • .glyphicon .glyphicon-briefcase
    • .glyphicon .glyphicon-bullhorn
    • .glyphicon .glyphicon-calendar
    • .glyphicon .glyphicon-camera
    • .glyphicon .glyphicon-certificate
    • .glyphicon .glyphicon-check
    • .glyphicon .glyphicon-chevron-down
    • .glyphicon .glyphicon-chevron-left
    • .glyphicon .glyphicon-chevron-right
    • .glyphicon .glyphicon-chevron-up
    • .glyphicon .glyphicon-circle-arrow-down
    • .glyphicon .glyphicon-circle-arrow-left
    • .glyphicon .glyphicon-circle-arrow-right
    • .glyphicon .glyphicon-circle-arrow-up
    • .glyphicon .glyphicon-cloud
    • .glyphicon .glyphicon-cloud-download
    • .glyphicon .glyphicon-cloud-upload
    • .glyphicon .glyphicon-cog
    • .glyphicon .glyphicon-collapse-down
    • .glyphicon .glyphicon-collapse-up
    • .glyphicon .glyphicon-comment
    • .glyphicon .glyphicon-compressed
    • .glyphicon .glyphicon-copyright-mark
    • .glyphicon .glyphicon-credit-card
    • .glyphicon .glyphicon-cutlery
    • .glyphicon .glyphicon-dashboard
    • .glyphicon .glyphicon-download
    • .glyphicon .glyphicon-download-alt
    • .glyphicon .glyphicon-earphone
    • .glyphicon .glyphicon-edit
    • .glyphicon .glyphicon-eject
    • .glyphicon .glyphicon-envelope
    • .glyphicon .glyphicon-euro
    • .glyphicon .glyphicon-exclamation-sign
    • .glyphicon .glyphicon-expand
    • .glyphicon .glyphicon-export
    • .glyphicon .glyphicon-eye-close
    • .glyphicon .glyphicon-eye-open
    • .glyphicon .glyphicon-facetime-video
    • .glyphicon .glyphicon-fast-backward
    • .glyphicon .glyphicon-fast-forward
    • .glyphicon .glyphicon-file
    • .glyphicon .glyphicon-film
    • .glyphicon .glyphicon-filter
    • .glyphicon .glyphicon-fire
    • .glyphicon .glyphicon-flag
    • .glyphicon .glyphicon-flash
    • .glyphicon .glyphicon-floppy-disk
    • .glyphicon .glyphicon-floppy-open
    • .glyphicon .glyphicon-floppy-remove
    • .glyphicon .glyphicon-floppy-save
    • .glyphicon .glyphicon-floppy-saved
    • .glyphicon .glyphicon-folder-close
    • .glyphicon .glyphicon-folder-open
    • .glyphicon .glyphicon-font
    • .glyphicon .glyphicon-forward
    • .glyphicon .glyphicon-fullscreen
    • .glyphicon .glyphicon-gbp
    • .glyphicon .glyphicon-gift
    • .glyphicon .glyphicon-glass
    • .glyphicon .glyphicon-globe
    • .glyphicon .glyphicon-hand-down
    • .glyphicon .glyphicon-hand-left
    • .glyphicon .glyphicon-hand-right
    • .glyphicon .glyphicon-hand-up
    • .glyphicon .glyphicon-hd-video
    • .glyphicon .glyphicon-hdd
    • .glyphicon .glyphicon-header
    • .glyphicon .glyphicon-headphones
    • .glyphicon .glyphicon-heart
    • .glyphicon .glyphicon-heart-empty
    • .glyphicon .glyphicon-home
    • .glyphicon .glyphicon-import
    • .glyphicon .glyphicon-inbox
    • .glyphicon .glyphicon-indent-left
    • .glyphicon .glyphicon-indent-right
    • .glyphicon .glyphicon-info-sign
    • .glyphicon .glyphicon-italic
    • .glyphicon .glyphicon-leaf
    • .glyphicon .glyphicon-link
    • .glyphicon .glyphicon-list
    • .glyphicon .glyphicon-list-alt
    • .glyphicon .glyphicon-lock
    • .glyphicon .glyphicon-log-in
    • .glyphicon .glyphicon-log-out
    • .glyphicon .glyphicon-magnet
    • .glyphicon .glyphicon-map-marker
    • .glyphicon .glyphicon-minus
    • .glyphicon .glyphicon-minus-sign
    • .glyphicon .glyphicon-move
    • .glyphicon .glyphicon-music
    • .glyphicon .glyphicon-new-window
    • .glyphicon .glyphicon-off
    • .glyphicon .glyphicon-ok
    • .glyphicon .glyphicon-ok-circle
    • .glyphicon .glyphicon-ok-sign
    • .glyphicon .glyphicon-open
    • .glyphicon .glyphicon-paperclip
    • .glyphicon .glyphicon-pause
    • .glyphicon .glyphicon-pencil
    • .glyphicon .glyphicon-phone
    • .glyphicon .glyphicon-phone-alt
    • .glyphicon .glyphicon-picture
    • .glyphicon .glyphicon-plane
    • .glyphicon .glyphicon-play
    • .glyphicon .glyphicon-play-circle
    • .glyphicon .glyphicon-plus
    • .glyphicon .glyphicon-plus-sign
    • .glyphicon .glyphicon-print
    • .glyphicon .glyphicon-pushpin
    • .glyphicon .glyphicon-qrcode
    • .glyphicon .glyphicon-question-sign
    • .glyphicon .glyphicon-random
    • .glyphicon .glyphicon-record
    • .glyphicon .glyphicon-refresh
    • .glyphicon .glyphicon-registration-mark
    • .glyphicon .glyphicon-remove
    • .glyphicon .glyphicon-remove-circle
    • .glyphicon .glyphicon-remove-sign
    • .glyphicon .glyphicon-repeat
    • .glyphicon .glyphicon-resize-full
    • .glyphicon .glyphicon-resize-horizontal
    • .glyphicon .glyphicon-resize-small
    • .glyphicon .glyphicon-resize-vertical
    • .glyphicon .glyphicon-retweet
    • .glyphicon .glyphicon-road
    • .glyphicon .glyphicon-save
    • .glyphicon .glyphicon-saved
    • .glyphicon .glyphicon-screenshot
    • .glyphicon .glyphicon-sd-video
    • .glyphicon .glyphicon-search
    • .glyphicon .glyphicon-send
    • .glyphicon .glyphicon-share
    • .glyphicon .glyphicon-share-alt
    • .glyphicon .glyphicon-shopping-cart
    • .glyphicon .glyphicon-signal
    • .glyphicon .glyphicon-sort
    • .glyphicon .glyphicon-sort-by-alphabet
    • .glyphicon .glyphicon-sort-by-alphabet-alt
    • .glyphicon .glyphicon-sort-by-attributes
    • .glyphicon .glyphicon-sort-by-attributes-alt
    • .glyphicon .glyphicon-sort-by-order
    • .glyphicon .glyphicon-sort-by-order-alt
    • .glyphicon .glyphicon-sound-5-1
    • .glyphicon .glyphicon-sound-6-1
    • .glyphicon .glyphicon-sound-7-1
    • .glyphicon .glyphicon-sound-dolby
    • .glyphicon .glyphicon-sound-stereo
    • .glyphicon .glyphicon-star
    • .glyphicon .glyphicon-star-empty
    • .glyphicon .glyphicon-stats
    • .glyphicon .glyphicon-step-backward
    • .glyphicon .glyphicon-step-forward
    • .glyphicon .glyphicon-stop
    • .glyphicon .glyphicon-subtitles
    • .glyphicon .glyphicon-tag
    • .glyphicon .glyphicon-tags
    • .glyphicon .glyphicon-tasks
    • .glyphicon .glyphicon-text-height
    • .glyphicon .glyphicon-text-width
    • .glyphicon .glyphicon-th
    • .glyphicon .glyphicon-th-large
    • .glyphicon .glyphicon-th-list
    • .glyphicon .glyphicon-thumbs-down
    • .glyphicon .glyphicon-thumbs-up
    • .glyphicon .glyphicon-time
    • .glyphicon .glyphicon-tint
    • .glyphicon .glyphicon-tower
    • .glyphicon .glyphicon-transfer
    • .glyphicon .glyphicon-trash
    • .glyphicon .glyphicon-tree-conifer
    • .glyphicon .glyphicon-tree-deciduous
    • .glyphicon .glyphicon-unchecked
    • .glyphicon .glyphicon-upload
    • .glyphicon .glyphicon-usd
    • .glyphicon .glyphicon-user
    • .glyphicon .glyphicon-volume-down
    • .glyphicon .glyphicon-volume-off
    • .glyphicon .glyphicon-volume-up
    • .glyphicon .glyphicon-warning-sign
    • .glyphicon .glyphicon-wrench
    • .glyphicon .glyphicon-zoom-in
    • .glyphicon .glyphicon-zoom-out

    How to use

    For performance reasons, all icons require a base class and individual icon class. To use, place the following code just about anywhere. Be sure to leave a space between the icon and text for proper padding.

    {% highlight html %} {% endhighlight %}

    Examples

    Use them in buttons, button groups for a toolbar, navigation, or prepended form inputs.

    {% highlight html %} {% endhighlight %}

    Toggleable, contextual menu for displaying lists of links. Made interactive with the dropdown JavaScript plugin.

    Wrap the dropdown's trigger and the dropdown menu within .dropdown, or another element that declares position: relative;. Then add the menu's HTML.

    {% highlight html %} {% endhighlight %}

    Add .pull-right to a .dropdown-menu to right align the dropdown menu.

    {% highlight html %} {% endhighlight %}

    Add a header to label sections of actions in any dropdown menu.

    {% highlight html %} {% endhighlight %}

    Add .disabled to a <li> in the dropdown to disable the link.

    {% highlight html %} {% endhighlight %}

    Group a series of buttons together on a single line with the button group. Add on optional JavaScript radio and checkbox style behavior with our buttons plugin.

    Tooltips & popovers in button groups require special setting

    When using tooltips or popovers on elements within a .btn-group, you'll have to specify the option container: 'body' to avoid unwanted side effects (such as the element growing wider and/or losing its rounded corners when the tooltip or popover is triggered).

    Basic example

    Wrap a series of buttons with .btn in .btn-group.

    {% highlight html %}
    {% endhighlight %}

    Button toolbar

    Combine sets of <div class="btn-group"> into a <div class="btn-toolbar"> for more complex components.

    {% highlight html %} {% endhighlight %}

    Sizing

    Instead of applying button sizing classes to every button in a group, just add .btn-group-* to the .btn-group.

    {% highlight html %}
    ...
    ...
    ...
    ...
    {% endhighlight %}

    Nesting

    Place a .btn-group within another .btn-group when you want dropdown menus mixed with a series of buttons.

    {% highlight html %} {% endhighlight %}

    Vertical variation

    Make a set of buttons appear vertically stacked rather than horizontally.

    {% highlight html %}
    ...
    {% endhighlight %}

    Justified link variation

    Make a group of buttons stretch at the same size to span the entire width of its parent.

    Element-specific usage

    This only works with <a> elements as the <button> doesn't pick up these styles.

    {% highlight html %}
    ...
    {% endhighlight %}

    Use any button to trigger a dropdown menu by placing it within a .btn-group and providing the proper menu markup.

    Plugin dependency

    Button dropdowns require the dropdown plugin to be included in your version of Bootstrap.

    Single button dropdowns

    Turn a button into a dropdown toggle with some basic markup changes.

    {% highlight html %} {% endhighlight %}

    Split button dropdowns

    Similarly, create split button dropdowns with the same markup changes, only with a separate button.

    {% highlight html %} {% endhighlight %}

    Sizing

    Button dropdowns work with buttons of all sizes.

    {% highlight html %}
    {% endhighlight %}

    Dropup variation

    Trigger dropdown menus above elements by adding .dropup to the parent.

    {% highlight html %}
    {% endhighlight %}

    Extend form controls by adding text or buttons before, after, or on both sides of any text-based input. Use .input-group with an .input-group-addon to prepend or append elements to a .form-control.

    Cross-browser compatibility

    Avoid using <select> elements here as they cannot be fully styled in WebKit browsers.

    Tooltips & popovers in input groups require special setting

    When using tooltips or popovers on elements within an .input-group, you'll have to specify the option container: 'body' to avoid unwanted side effects (such as the element growing wider and/or losing its rounded corners when the tooltip or popover is triggered).

    Don't mix with form groups

    Do not apply input group classes directly to form groups. An input group is an isolated component.

    Basic example

    @

    .00

    $ .00
    {% highlight html %}
    @
    .00
    $ .00
    {% endhighlight %}

    Sizing

    Add the relative form sizing classes to the .input-group itself and contents within will automatically resize—no need for repeating the form control size classes on each element.

    @

    @

    @
    {% highlight html %}
    @
    @
    @
    {% endhighlight %}

    Checkboxes and radio addons

    Place any checkbox or radio option within an input group's addon instead of text.

    {% highlight html %}
    {% endhighlight %}

    Button addons

    Buttons in input groups are a bit different and require one extra level of nesting. Instead of .input-group-addon, you'll need to use .input-group-btn to wrap the buttons. This is required due to default browser styles that cannot be overridden.

    {% highlight html %}
    {% endhighlight %}

    Buttons with dropdowns

    {% highlight html %} {% endhighlight %}

    Segmented buttons

    {% highlight html %}
    {% endhighlight %}

    Navs available in Bootstrap have shared markup, starting with the base .nav class, as well as shared states. Swap modifier classes to switch between each style.

    Note the .nav-tabs class requires the .nav base class.

    {% highlight html %} {% endhighlight %}

    Requires JavaScript tabs plugin

    For tabs with tabbable areas, you must use the tabs JavaScript plugin.

    Take that same HTML, but use .nav-pills instead:

    {% highlight html %} {% endhighlight %}

    Pills are also vertically stackable. Just add .nav-stacked.

    {% highlight html %} {% endhighlight %}

    Easily make tabs or pills equal widths of their parent at screens wider than 768px with .nav-justified. On smaller screens, the nav links are stacked.

    WebKit and responsive justified navs

    Chrome and Safari both exhibit a bug in which resizing your browser horizontally causes rendering errors in the justified nav that are cleared upon refreshing. This bug is also shown in the justified nav example.

    {% highlight html %} {% endhighlight %}

    For any nav component (tabs, pills, or list), add .disabled for gray links and no hover effects.

    Link functionality not impacted

    This class will only change the <a>'s appearance, not its functionality. Use custom JavaScript to disable links here.

    {% highlight html %} {% endhighlight %}

    Add dropdown menus with a little extra HTML and the dropdowns JavaScript plugin.

    Tabs with dropdowns

    {% highlight html %} {% endhighlight %}

    Pills with dropdowns

    {% highlight html %} {% endhighlight %}

    Navbars are responsive meta components that serve as navigation headers for your application or site. They begin collapsed (and are toggleable) in mobile views and become horizontal as the available viewport width increases.

    Customize the collapsing point

    Depending on the content in your navbar, you might need to change the point at which your navbar switches between collapsed and horizontal mode. Customize the @grid-float-breakpoint variable or add your own media query.

    Requires JavaScript

    If JavaScript is disabled and the viewport is narrow enough that the navbar collapses, it will be impossible to expand the navbar and view the content within the .navbar-collapse.

    {% highlight html %} {% endhighlight %}

    Plugin dependency

    The responsive navbar requires the collapse plugin to be included in your version of Bootstrap.

    Make navbars accessible

    Be sure to add a role="navigation" to every navbar to help with accessibility.

    Place form content within .navbar-form for proper vertical alignment and collapsed behavior in narrow viewports. Use the alignment options to decide where it resides within the navbar content.

    As a heads up, .navbar-form shares much of its code with .form-inline via mixin.

    {% highlight html %} {% endhighlight %}

    Always add labels

    Screen readers will have trouble with your forms if you don't include a label for every input. For these inline navbar forms, you can hide the labels using the .sr-only class.

    Add the .navbar-btn class to <button> elements not residing in a <form> to vertically center them in the navbar.

    {% highlight html %} {% endhighlight %}

    Context-specific usage

    Like the standard button classes, .navbar-btn can be used on <a> and <input> elements. However, neither .navbar-btn nor the standard button classes should be used on <a> elements within .navbar-nav.

    Wrap strings of text in an element with .navbar-text, usually on a <p> tag for proper leading and color.

    {% highlight html %} {% endhighlight %}

    For folks using standard links that are not within the regular navbar navigation component, use the .navbar-link class to add the proper colors for the default and inverse navbar options.

    {% highlight html %} {% endhighlight %}

    Align nav links, forms, buttons, or text, using the .navbar-left or .navbar-right utility classes. Both classes will add a CSS float in the specified direction. For example, to align nav links, put them in a separate <ul> with the respective utility class applied.

    These classes are mixin-ed versions of .pull-left and .pull-right, but they're scoped to media queries for easier handling of navbar components across device sizes.

    Add .navbar-fixed-top.

    {% highlight html %} {% endhighlight %}

    Body padding required

    The fixed navbar will overlay your other content, unless you add padding to the top of the <body>. Try out your own values or use our snippet below. Tip: By default, the navbar is 50px high.

    {% highlight css %} body { padding-top: 70px; } {% endhighlight %}

    Make sure to include this after the core Bootstrap CSS.

    Add .navbar-fixed-bottom instead.

    {% highlight html %} {% endhighlight %}

    Body padding required

    The fixed navbar will overlay your other content, unless you add padding to the bottom of the <body>. Try out your own values or use our snippet below. Tip: By default, the navbar is 50px high.

    {% highlight css %} body { padding-bottom: 70px; } {% endhighlight %}

    Make sure to include this after the core Bootstrap CSS.

    Create a full-width navbar that scrolls away with the page by adding .navbar-static-top. Unlike the .navbar-fixed-* classes, you do not need to change any padding on the body.

    {% highlight html %} {% endhighlight %}

    Modify the look of the navbar by adding .navbar-inverse.

    {% highlight html %} {% endhighlight %}

    Indicate the current page's location within a navigational hierarchy.

    Separators are automatically added in CSS through :before and content.

    {% highlight html %} {% endhighlight %}

    Provide pagination links for your site or app with the multi-page pagination component, or the simpler pager alternative.

    Default pagination

    Simple pagination inspired by Rdio, great for apps and search results. The large block is hard to miss, easily scalable, and provides large click areas.

    {% highlight html %} {% endhighlight %}

    Disabled and active states

    Links are customizable for different circumstances. Use .disabled for unclickable links and .active to indicate the current page.

    {% highlight html %} {% endhighlight %}

    You can optionally swap out active or disabled anchors for <span> to remove click functionality while retaining intended styles.

    {% highlight html %}
    • «
    • 1 (current)
    • ...
    {% endhighlight %}

    Sizing

    Fancy larger or smaller pagination? Add .pagination-lg or .pagination-sm for additional sizes.

    {% highlight html %}
      ...
      ...
      ...
    {% endhighlight %}

    Pager

    Quick previous and next links for simple pagination implementations with light markup and styles. It's great for simple sites like blogs or magazines.

    Default example

    By default, the pager centers links.

    {% highlight html %} {% endhighlight %}

    Aligned links

    Alternatively, you can align each link to the sides:

    {% highlight html %} {% endhighlight %}

    Optional disabled state

    Pager links also use the general .disabled utility class from the pagination.

    {% highlight html %} {% endhighlight %}

    Example

    Example heading New

    Example heading New

    Example heading New

    Example heading New

    Example heading New
    Example heading New
    {% highlight html %}

    Example heading New

    {% endhighlight %}

    Available variations

    Add any of the below mentioned modifier classes to change the appearance of a label.

    Default Primary Success Info Warning Danger
    {% highlight html %} Default Primary Success Info Warning Danger {% endhighlight %}

    Easily highlight new or unread items by adding a <span class="badge"> to links, Bootstrap navs, and more.

    {% highlight html %} Inbox 42 {% endhighlight %}

    Self collapsing

    When there are no new or unread items, badges will simply collapse (via CSS's :empty selector) provided no content exists within.

    Cross-browser compatibility

    Badges won't self collapse in Internet Explorer 8 because it lacks support for the :empty selector.

    Adapts to active nav states

    Built-in styles are included for placing badges in active states in pill and list navigations.

    {% highlight html %} {% endhighlight %}

    A lightweight, flexible component that can optionally extend the entire viewport to showcase key content on your site.

    Hello, world!

    This is a simple hero unit, a simple jumbotron-style component for calling extra attention to featured content or information.

    Learn more

    {% highlight html %}

    Hello, world!

    ...

    Learn more

    {% endhighlight %}

    To make the jumbotron full width, and without rounded corners, place it outside all .containers and instead add a .container within.

    {% highlight html %}
    ...
    {% endhighlight %}

    A simple shell for an h1 to appropriately space out and segment sections of content on a page. It can utilize the h1's default small element, as well as most other components (with additional styles).

    {% highlight html %} {% endhighlight %}

    Extend Bootstrap's grid system with the thumbnail component to easily display grids of images, videos, text, and more.

    Default example

    By default, Bootstrap's thumbnails are designed to showcase linked images with minimal required markup.

    {% highlight html %}
    ...
    {% endhighlight %}

    Custom content

    With a bit of extra markup, it's possible to add any kind of HTML content like headings, paragraphs, or buttons into thumbnails.

    Generic placeholder thumbnail

    Thumbnail label

    Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

    Button Button

    Generic placeholder thumbnail

    Thumbnail label

    Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

    Button Button

    Generic placeholder thumbnail

    Thumbnail label

    Cras justo odio, dapibus ac facilisis in, egestas eget quam. Donec id elit non mi porta gravida at eget metus. Nullam id dolor id nibh ultricies vehicula ut id elit.

    Button Button

    {% highlight html %}
    ...

    Thumbnail label

    ...

    Button Button

    {% endhighlight %}

    Provide contextual feedback messages for typical user actions with the handful of available and flexible alert messages. For inline dismissal, use the alerts jQuery plugin.

    Examples

    Wrap any text and an optional dismiss button in .alert and one of the four contextual classes (e.g., .alert-success) for basic alert messages.

    No default class

    Alerts don't have default classes, only base and modifier classes. A default gray alert doesn't make too much sense, so you're required to specify a type via contextual class. Choose from success, info, warning, or danger.

    Well done! You successfully read this important alert message.
    Heads up! This alert needs your attention, but it's not super important.
    Warning! Best check yo self, you're not looking too good.
    Oh snap! Change a few things up and try submitting again.
    {% highlight html %}
    ...
    ...
    ...
    ...
    {% endhighlight %}

    Dismissable alerts

    Build on any alert by adding an optional .alert-dismissable and close button.

    Warning! Best check yo self, you're not looking too good.
    {% highlight html %}
    Warning! Best check yo self, you're not looking too good.
    {% endhighlight %}

    Ensure proper behavior across all devices

    Be sure to use the <button> element with the data-dismiss="alert" data attribute.

    Use the .alert-link utility class to quickly provide matching colored links within any alert.

    Well done! You successfully read this important alert message.
    Heads up! This alert needs your attention, but it's not super important.
    Warning! Best check yo self, you're not looking too good.
    Oh snap! Change a few things up and try submitting again.
    {% highlight html %}
    ...
    ...
    ...
    ...
    {% endhighlight %}

    Provide up-to-date feedback on the progress of a workflow or action with simple yet flexible progress bars.

    Cross-browser compatibility

    Progress bars use CSS3 transitions and animations to achieve some of their effects. These features are not supported in Internet Explorer 9 and below or older versions of Firefox. Opera 12 does not support animations.

    Basic example

    Default progress bar.

    60% Complete
    {% highlight html %}
    60% Complete
    {% endhighlight %}

    Contextual alternatives

    Progress bars use some of the same button and alert classes for consistent styles.

    40% Complete (success)
    20% Complete
    60% Complete (warning)
    80% Complete (danger)
    {% highlight html %}
    40% Complete (success)
    20% Complete
    60% Complete (warning)
    80% Complete
    {% endhighlight %}

    Striped

    Uses a gradient to create a striped effect. Not available in IE8.

    40% Complete (success)
    20% Complete
    60% Complete (warning)
    80% Complete (danger)
    {% highlight html %}
    40% Complete (success)
    20% Complete
    60% Complete (warning)
    80% Complete (danger)
    {% endhighlight %}

    Animated

    Add .active to .progress-striped to animate the stripes right to left. Not available in all versions of IE.

    45% Complete
    {% highlight html %}
    45% Complete
    {% endhighlight %}

    Stacked

    Place multiple bars into the same .progress to stack them.

    35% Complete (success)
    20% Complete (warning)
    10% Complete (danger)
    {% highlight html %}
    35% Complete (success)
    20% Complete (warning)
    10% Complete (danger)
    {% endhighlight %}

    Abstract object styles for building various types of components (like blog comments, Tweets, etc) that feature a left- or right-aligned image alongside textual content.

    Default media

    The default media allow to float a media object (images, video, audio) to the left or right of a content block.

    Generic placeholder image

    Media heading

    Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.
    Generic placeholder image

    Media heading

    Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.
    Generic placeholder image

    Media heading

    Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis. Fusce condimentum nunc ac nisi vulputate fringilla. Donec lacinia congue felis in faucibus.
    {% highlight html %}
    ...

    Media heading

    ...
    {% endhighlight %}

    Media list

    With a bit of extra markup, you can use media inside list (useful for comment threads or articles lists).

    • Generic placeholder image

      Media heading

      Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis.

      Generic placeholder image

      Nested media heading

      Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis.
      Generic placeholder image

      Nested media heading

      Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis.
      Generic placeholder image

      Nested media heading

      Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis.
    • Generic placeholder image

      Media heading

      Cras sit amet nibh libero, in gravida nulla. Nulla vel metus scelerisque ante sollicitudin commodo. Cras purus odio, vestibulum in vulputate at, tempus viverra turpis.
    {% highlight html %}
    • ...

      Media heading

      ...
    {% endhighlight %}

    List groups are a flexible and powerful component for displaying not only simple lists of elements, but complex ones with custom content.

    Basic example

    The most basic list group is simply an unordered list with list items, and the proper classes. Build upon it with the options that follow, or your own CSS as needed.

    • Cras justo odio
    • Dapibus ac facilisis in
    • Morbi leo risus
    • Porta ac consectetur ac
    • Vestibulum at eros
    {% highlight html %}
    • Cras justo odio
    • Dapibus ac facilisis in
    • Morbi leo risus
    • Porta ac consectetur ac
    • Vestibulum at eros
    {% endhighlight %}

    Badges

    Add the badges component to any list group item and it will automatically be positioned on the right.

    • 14 Cras justo odio
    • 2 Dapibus ac facilisis in
    • 1 Morbi leo risus
    {% highlight html %}
    • 14 Cras justo odio
    {% endhighlight %}

    Linked items

    Linkify list group items by using anchor tags instead of list items (that also means a parent <div> instead of an <ul>). No need for individual parents around each element.

    {% highlight html %} {% endhighlight %}

    Custom content

    Add nearly any HTML within, even for linked list groups like the one below.

    {% highlight html %} {% endhighlight %}

    While not always necessary, sometimes you need to put your DOM in a box. For those situations, try the panel component.

    Basic example

    By default, all the .panel does is apply some basic border and padding to contain some content.

    Basic panel example
    {% highlight html %}
    Basic panel example
    {% endhighlight %}

    Panel with heading

    Easily add a heading container to your panel with .panel-heading. You may also include any <h1>-<h6> with a .panel-title class to add a pre-styled heading.

    Panel heading without title
    Panel content

    Panel title

    Panel content
    {% highlight html %}
    Panel heading without title
    Panel content

    Panel title

    Panel content
    {% endhighlight %}

    Wrap buttons or secondary text in .panel-footer. Note that panel footers do not inherit colors and borders when using contextual variations as they are not meant to be in the foreground.

    Panel content
    {% highlight html %}
    Panel content
    {% endhighlight %}

    Contextual alternatives

    Like other components, easily make a panel more meaningful to a particular context by adding any of the contextual state classes.

    Panel title

    Panel content

    Panel title

    Panel content

    Panel title

    Panel content

    Panel title

    Panel content

    Panel title

    Panel content
    {% highlight html %}
    ...
    ...
    ...
    ...
    ...
    {% endhighlight %}

    With tables

    Add any non-bordered .table within a panel for a seamless design. If there is a .panel-body, we add an extra border to the top of the table for separation.

    Panel heading

    Some default panel content here. Nulla vitae elit libero, a pharetra augue. Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit.

    # First Name Last Name Username
    1 Mark Otto @mdo
    2 Jacob Thornton @fat
    3 Larry the Bird @twitter
    {% highlight html %}
    Panel heading

    ...

    ...
    {% endhighlight %}

    If there is no panel body, the component moves from panel header to table without interruption.

    Panel heading
    # First Name Last Name Username
    1 Mark Otto @mdo
    2 Jacob Thornton @fat
    3 Larry the Bird @twitter
    {% highlight html %}
    Panel heading
    ...
    {% endhighlight %}

    With list groups

    Easily include full-width list groups within any panel.

    Panel heading

    Some default panel content here. Nulla vitae elit libero, a pharetra augue. Aenean lacinia bibendum nulla sed consectetur. Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Nullam id dolor id nibh ultricies vehicula ut id elit.

    • Cras justo odio
    • Dapibus ac facilisis in
    • Morbi leo risus
    • Porta ac consectetur ac
    • Vestibulum at eros
    {% highlight html %}
    Panel heading

    ...

    • Cras justo odio
    • Dapibus ac facilisis in
    • Morbi leo risus
    • Porta ac consectetur ac
    • Vestibulum at eros
    {% endhighlight %}

    Default well

    Use the well as a simple effect on an element to give it an inset effect.

    Look, I'm in a well!
    {% highlight html %}
    ...
    {% endhighlight %}

    Optional classes

    Control padding and rounded corners with two optional modifier classes.

    Look, I'm in a large well!
    {% highlight html %}
    ...
    {% endhighlight %}
    Look, I'm in a small well!
    {% highlight html %}
    ...
    {% endhighlight %}
    ================================================ FILE: public/js/vendor/bootstrap/composer.json ================================================ { "name": "twbs/bootstrap" , "description": "Sleek, intuitive, and powerful mobile first front-end framework for faster and easier web development." , "keywords": ["bootstrap", "css"] , "homepage": "http://getbootstrap.com" , "authors": [ { "name": "Mark Otto", "email": "markdotto@gmail.com" }, { "name": "Jacob Thornton", "email": "jacobthornton@gmail.com" } ] , "support": { "issues": "https://github.com/twbs/bootstrap/issues" } , "license": "Apache-2.0" } ================================================ FILE: public/js/vendor/bootstrap/css.html ================================================ --- layout: default title: CSS slug: css lead: "Global CSS settings, fundamental HTML elements styled and enhanced with extensible classes, and an advanced grid system." base_url: "../" ---

    Get the lowdown on the key pieces of Bootstrap's infrastructure, including our approach to better, faster, stronger web development.

    HTML5 doctype

    Bootstrap makes use of certain HTML elements and CSS properties that require the use of the HTML5 doctype. Include it at the beginning of all your projects.

    {% highlight html %} ... {% endhighlight %}

    Mobile first

    With Bootstrap 2, we added optional mobile friendly styles for key aspects of the framework. With Bootstrap 3, we've rewritten the project to be mobile friendly from the start. Instead of adding on optional mobile styles, they're baked right into the core. In fact, Bootstrap is mobile first. Mobile first styles can be found throughout the entire library instead of in separate files.

    To ensure proper rendering and touch zooming, add the viewport meta tag to your <head>.

    {% highlight html %} {% endhighlight %}

    You can disable zooming capabilities on mobile devices by adding user-scalable=no to the viewport meta tag. This disables zooming, meaning users are only able to scroll, and results in your site feeling a bit more like a native application. Overall we don't recommend this on every site, so use caution!

    {% highlight html %} {% endhighlight %}

    Responsive images

    Images in Bootstrap 3 can be made responsive-friendly via the addition of the .img-responsive class. This applies max-width: 100%; and height: auto; to the image so that it scales nicely to the parent element.

    {% highlight html %} Responsive image {% endhighlight %}

    Bootstrap sets basic global display, typography, and link styles. Specifically, we:

    • Set background-color: #fff; on the body
    • Use the @font-family-base, @font-size-base, and @line-height-base attributes as our typographic base
    • Set the global link color via @link-color and apply link underlines only on :hover

    These styles can be found within scaffolding.less.

    Normalize

    For improved cross-browser rendering, we use Normalize, a project by Nicolas Gallagher and Jonathan Neal.

    Containers

    Easily center a page's contents by wrapping its contents in a .container. Containers set max-width at various media query breakpoints to match our grid system.

    {% highlight html %}
    ...
    {% endhighlight %}

    Bootstrap includes a responsive, mobile first fluid grid system that appropriately scales up to 12 columns as the device or viewport size increases. It includes predefined classes for easy layout options, as well as powerful mixins for generating more semantic layouts.

    Introduction

    Grid systems are used for creating page layouts through a series of rows and columns that house your content. Here's how the Bootstrap grid system works:

    • Rows must be placed within a .container for proper alignment and padding.
    • Use rows to create horizontal groups of columns.
    • Content should be placed within columns, and only columns may be immediate children of rows.
    • Predefined grid classes like .row and .col-xs-4 are available for quickly making grid layouts. LESS mixins can also be used for more semantic layouts.
    • Columns create gutters (gaps between column content) via padding. That padding is offset in rows for the first and last column via negative margin on .rows.
    • Grid columns are created by specifying the number of twelve available columns you wish to span. For example, three equal columns would use three .col-xs-4.

    Look to the examples for applying these principles to your code.

    Grids and full-width layouts

    Folks looking to create fully fluid layouts (meaning your site stretches the entire width of the viewport) must wrap their grid content in a containing element with padding: 0 15px; to offset the margin: 0 -15px; used on .rows.

    Media queries

    We use the following media queries in our LESS files to create the key breakpoints in our grid system.

    {% highlight css %} /* Extra small devices (phones, less than 768px) */ /* No media query since this is the default in Bootstrap */ /* Small devices (tablets, 768px and up) */ @media (min-width: @screen-sm-min) { ... } /* Medium devices (desktops, 992px and up) */ @media (min-width: @screen-md-min) { ... } /* Large devices (large desktops, 1200px and up) */ @media (min-width: @screen-lg-min) { ... } {% endhighlight %}

    We occasionally expand on these media queries to include a max-width to limit CSS to a narrower set of devices.

    {% highlight css %} @media (max-width: @screen-xs-max) { ... } @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) { ... } @media (min-width: @screen-md-min) and (max-width: @screen-md-max) { ... } @media (min-width: @screen-lg-min) { ... } {% endhighlight %}

    Grid options

    See how aspects of the Bootstrap grid system work across multiple devices with a handy table.

    Extra small devices Phones (<768px) Small devices Tablets (≥768px) Medium devices Desktops (≥992px) Large devices Desktops (≥1200px)
    Grid behavior Horizontal at all times Collapsed to start, horizontal above breakpoints
    Max container width None (auto) 750px 970px 1170px
    Class prefix .col-xs- .col-sm- .col-md- .col-lg-
    # of columns 12
    Max column width Auto 60px 78px 95px
    Gutter width 30px (15px on each side of a column)
    Nestable Yes
    Offsets N/A Yes
    Column ordering N/A Yes

    Grid classes apply to devices with screen widths greater than or equal to the breakpoint sizes, and override grid classes targeted at smaller devices. Therefore, applying any .col-md- class to an element will not only affect its styling on medium devices but also on large devices if a .col-lg- class is not present.

    Example: Stacked-to-horizontal

    Using a single set of .col-md-* grid classes, you can create a basic grid system that starts out stacked on mobile devices and tablet devices (the extra small to small range) before becoming horizontal on desktop (medium) devices. Place grid columns in any .row.

    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-8
    .col-md-4
    .col-md-4
    .col-md-4
    .col-md-4
    .col-md-6
    .col-md-6
    {% highlight html %}
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-1
    .col-md-8
    .col-md-4
    .col-md-4
    .col-md-4
    .col-md-4
    .col-md-6
    .col-md-6
    {% endhighlight %}

    Example: Mobile and desktop

    Don't want your columns to simply stack in smaller devices? Use the extra small and medium device grid classes by adding .col-xs-* .col-md-* to your columns. See the example below for a better idea of how it all works.

    .col-xs-12 .col-md-8
    .col-xs-6 .col-md-4
    .col-xs-6 .col-md-4
    .col-xs-6 .col-md-4
    .col-xs-6 .col-md-4
    .col-xs-6
    .col-xs-6
    {% highlight html %}
    .col-xs-12 .col-md-8
    .col-xs-6 .col-md-4
    .col-xs-6 .col-md-4
    .col-xs-6 .col-md-4
    .col-xs-6 .col-md-4
    .col-xs-6
    .col-xs-6
    {% endhighlight %}

    Example: Mobile, tablet, desktops

    Build on the previous example by creating even more dynamic and powerful layouts with tablet .col-sm-* classes.

    .col-xs-12 .col-sm-6 .col-md-8
    .col-xs-6 .col-md-4
    .col-xs-6 .col-sm-4
    .col-xs-6 .col-sm-4
    .col-xs-6 .col-sm-4
    {% highlight html %}
    .col-xs-12 .col-sm-6 .col-md-8
    .col-xs-6 .col-md-4
    .col-xs-6 .col-sm-4
    .col-xs-6 .col-sm-4
    .col-xs-6 .col-sm-4
    {% endhighlight %}

    Responsive column resets

    With the four tiers of grids available you're bound to run into issues where, at certain breakpoints, your columns don't clear quite right as one is taller than the other. To fix that, use a combination of a .clearfix and our responsive utility classes.

    .col-xs-6 .col-sm-3
    Resize your viewport or check it out on your phone for an example.
    .col-xs-6 .col-sm-3
    .col-xs-6 .col-sm-3
    .col-xs-6 .col-sm-3
    {% highlight html %}
    .col-xs-6 .col-sm-3
    .col-xs-6 .col-sm-3
    .col-xs-6 .col-sm-3
    .col-xs-6 .col-sm-3
    {% endhighlight %}

    In addition to column clearing at responsive breakpoints, you may need to reset offsets, pushes, or pulls. Those resets are available for medium and large grid tiers only, since they start only at the (second) small grid tier. See this in action in the grid example.

    {% highlight html %}
    .col-sm-5 .col-md-6
    .col-sm-5 .col-sm-offset-2 .col-md-6 .col-md-offset-0
    .col-sm-6 .col-md-5 .col-lg-6
    .col-sm-6 .col-md-5 .col-md-offset-2 .col-lg-6 .col-lg-offset-0
    {% endhighlight %}

    Offsetting columns

    Move columns to the right using .col-md-offset-* classes. These classes increase the left margin of a column by * columns. For example, .col-md-offset-4 moves .col-md-4 over four columns.

    .col-md-4
    .col-md-4 .col-md-offset-4
    .col-md-3 .col-md-offset-3
    .col-md-3 .col-md-offset-3
    .col-md-6 .col-md-offset-3
    {% highlight html %}
    .col-md-4
    .col-md-4 .col-md-offset-4
    .col-md-3 .col-md-offset-3
    .col-md-3 .col-md-offset-3
    .col-md-6 .col-md-offset-3
    {% endhighlight %}

    Nesting columns

    To nest your content with the default grid, add a new .row and set of .col-md-* columns within an existing .col-md-* column. Nested rows should include a set of columns that add up to 12.

    Level 1: .col-md-9
    Level 2: .col-md-6
    Level 2: .col-md-6
    {% highlight html %}
    Level 1: .col-md-9
    Level 2: .col-md-6
    Level 2: .col-md-6
    {% endhighlight %}

    Column ordering

    Easily change the order of our built-in grid columns with .col-md-push-* and .col-md-pull-* modifier classes.

    .col-md-9 .col-md-push-3
    .col-md-3 .col-md-pull-9
    {% highlight html %}
    .col-md-9 .col-md-push-3
    .col-md-3 .col-md-pull-9
    {% endhighlight %}

    LESS mixins and variables

    In addition to prebuilt grid classes for fast layouts, Bootstrap includes LESS variables and mixins for quickly generating your own simple, semantic layouts.

    Variables

    Variables determine the number of columns, the gutter width, and the media query point at which to begin floating columns. We use these to generate the predefined grid classes documented above, as well as for the custom mixins listed below.

    {% highlight css %} @grid-columns: 12; @grid-gutter-width: 30px; @grid-float-breakpoint: 768px; {% endhighlight %}

    Mixins

    Mixins are used in conjunction with the grid variables to generate semantic CSS for individual grid columns.

    {% highlight css %} // Creates a wrapper for a series of columns .make-row(@gutter: @grid-gutter-width) { // Then clear the floated columns .clearfix(); @media (min-width: @screen-sm-min) { margin-left: (@gutter / -2); margin-right: (@gutter / -2); } // Negative margin nested rows out to align the content of columns .row { margin-left: (@gutter / -2); margin-right: (@gutter / -2); } } // Generate the extra small columns .make-xs-column(@columns; @gutter: @grid-gutter-width) { position: relative; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); // Calculate width based on number of columns available @media (min-width: @grid-float-breakpoint) { float: left; width: percentage((@columns / @grid-columns)); } } // Generate the small columns .make-sm-column(@columns; @gutter: @grid-gutter-width) { position: relative; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); // Calculate width based on number of columns available @media (min-width: @screen-sm-min) { float: left; width: percentage((@columns / @grid-columns)); } } // Generate the small column offsets .make-sm-column-offset(@columns) { @media (min-width: @screen-sm-min) { margin-left: percentage((@columns / @grid-columns)); } } .make-sm-column-push(@columns) { @media (min-width: @screen-sm-min) { left: percentage((@columns / @grid-columns)); } } .make-sm-column-pull(@columns) { @media (min-width: @screen-sm-min) { right: percentage((@columns / @grid-columns)); } } // Generate the medium columns .make-md-column(@columns; @gutter: @grid-gutter-width) { position: relative; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); // Calculate width based on number of columns available @media (min-width: @screen-md-min) { float: left; width: percentage((@columns / @grid-columns)); } } // Generate the medium column offsets .make-md-column-offset(@columns) { @media (min-width: @screen-md-min) { margin-left: percentage((@columns / @grid-columns)); } } .make-md-column-push(@columns) { @media (min-width: @screen-md-min) { left: percentage((@columns / @grid-columns)); } } .make-md-column-pull(@columns) { @media (min-width: @screen-md-min) { right: percentage((@columns / @grid-columns)); } } // Generate the large columns .make-lg-column(@columns; @gutter: @grid-gutter-width) { position: relative; // Prevent columns from collapsing when empty min-height: 1px; // Inner gutter via padding padding-left: (@gutter / 2); padding-right: (@gutter / 2); // Calculate width based on number of columns available @media (min-width: @screen-lg-min) { float: left; width: percentage((@columns / @grid-columns)); } } // Generate the large column offsets .make-lg-column-offset(@columns) { @media (min-width: @screen-lg-min) { margin-left: percentage((@columns / @grid-columns)); } } .make-lg-column-push(@columns) { @media (min-width: @screen-lg-min) { left: percentage((@columns / @grid-columns)); } } .make-lg-column-pull(@columns) { @media (min-width: @screen-lg-min) { right: percentage((@columns / @grid-columns)); } } {% endhighlight %}

    Example usage

    You can modify the variables to your own custom values, or just use the mixins with their default values. Here's an example of using the default settings to create a two-column layout with a gap between.

    {% highlight css %} .wrapper { .make-row(); } .content-main { .make-lg-column(8); } .content-secondary { .make-lg-column(3); .make-lg-column-offset(1); } {% endhighlight %} {% highlight html %}
    ...
    ...
    {% endhighlight %}

    Headings

    All HTML headings, <h1> through <h6>, are available. .h1 through .h6 classes are also available, for when you want to match the font styling of a heading but still want your text to be displayed inline.

    h1. Bootstrap heading

    Semibold 36px

    h2. Bootstrap heading

    Semibold 30px

    h3. Bootstrap heading

    Semibold 24px

    h4. Bootstrap heading

    Semibold 18px
    h5. Bootstrap heading
    Semibold 14px
    h6. Bootstrap heading
    Semibold 12px
    {% highlight html %}

    h1. Bootstrap heading

    h2. Bootstrap heading

    h3. Bootstrap heading

    h4. Bootstrap heading

    h5. Bootstrap heading
    h6. Bootstrap heading
    {% endhighlight %}

    Create lighter, secondary text in any heading with a generic <small> tag or the .small class.

    h1. Bootstrap heading Secondary text

    h2. Bootstrap heading Secondary text

    h3. Bootstrap heading Secondary text

    h4. Bootstrap heading Secondary text

    h5. Bootstrap heading Secondary text
    h6. Bootstrap heading Secondary text
    {% highlight html %}

    h1. Bootstrap heading Secondary text

    h2. Bootstrap heading Secondary text

    h3. Bootstrap heading Secondary text

    h4. Bootstrap heading Secondary text

    h5. Bootstrap heading Secondary text
    h6. Bootstrap heading Secondary text
    {% endhighlight %}

    Body copy

    Bootstrap's global default font-size is 14px, with a line-height of 1.428. This is applied to the <body> and all paragraphs. In addition, <p> (paragraphs) receive a bottom margin of half their computed line-height (10px by default).

    Nullam quis risus eget urna mollis ornare vel eu leo. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam id dolor id nibh ultricies vehicula.

    Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec ullamcorper nulla non metus auctor fringilla. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit. Donec ullamcorper nulla non metus auctor fringilla.

    Maecenas sed diam eget risus varius blandit sit amet non magna. Donec id elit non mi porta gravida at eget metus. Duis mollis, est non commodo luctus, nisi erat porttitor ligula, eget lacinia odio sem nec elit.

    {% highlight html %}

    ...

    {% endhighlight %}

    Lead body copy

    Make a paragraph stand out by adding .lead.

    Vivamus sagittis lacus vel augue laoreet rutrum faucibus dolor auctor. Duis mollis, est non commodo luctus.

    {% highlight html %}

    ...

    {% endhighlight %}

    Built with Less

    The typographic scale is based on two LESS variables in variables.less: @font-size-base and @line-height-base. The first is the base font-size used throughout and the second is the base line-height. We use those variables and some simple math to create the margins, paddings, and line-heights of all our type and more. Customize them and Bootstrap adapts.

    Emphasis

    Make use of HTML's default emphasis tags with lightweight styles.

    Small text

    For de-emphasizing inline or blocks of text, use the <small> tag to set text at 85% the size of the parent. Heading elements receive their own font-size for nested <small> elements.

    You may alternatively use an inline element with .small in place of any <small>

    This line of text is meant to be treated as fine print.

    {% highlight html %} This line of text is meant to be treated as fine print. {% endhighlight %}

    Bold

    For emphasizing a snippet of text with a heavier font-weight.

    The following snippet of text is rendered as bold text.

    {% highlight html %} rendered as bold text {% endhighlight %}

    Italics

    For emphasizing a snippet of text with italics.

    The following snippet of text is rendered as italicized text.

    {% highlight html %} rendered as italicized text {% endhighlight %}

    Alternate elements

    Feel free to use <b> and <i> in HTML5. <b> is meant to highlight words or phrases without conveying additional importance while <i> is mostly for voice, technical terms, etc.

    Alignment classes

    Easily realign text to components with text alignment classes.

    Left aligned text.

    Center aligned text.

    Right aligned text.

    {% highlight html %}

    Left aligned text.

    Center aligned text.

    Right aligned text.

    {% endhighlight %}

    Emphasis classes

    Convey meaning through color with a handful of emphasis utility classes. These may also be applied to links and will darken on hover just like our default link styles.

    Fusce dapibus, tellus ac cursus commodo, tortor mauris nibh.

    Nullam id dolor id nibh ultricies vehicula ut id elit.

    Duis mollis, est non commodo luctus, nisi erat porttitor ligula.

    Maecenas sed diam eget risus varius blandit sit amet non magna.

    Etiam porta sem malesuada magna mollis euismod.

    Donec ullamcorper nulla non metus auctor fringilla.

    {% highlight html %}

    ...

    ...

    ...

    ...

    ...

    ...

    {% endhighlight %}

    Dealing with specificity

    Sometimes emphasis classes cannot be applied due to the specificity of another selector. In most cases, a sufficient workaround is to wrap your text in a <span> with the class.

    Abbreviations

    Stylized implementation of HTML's <abbr> element for abbreviations and acronyms to show the expanded version on hover. Abbreviations with a title attribute have a light dotted bottom border and a help cursor on hover, providing additional context on hover.

    Basic abbreviation

    For expanded text on long hover of an abbreviation, include the title attribute with the <abbr> element.

    An abbreviation of the word attribute is attr.

    {% highlight html %} attr {% endhighlight %}

    Initialism

    Add .initialism to an abbreviation for a slightly smaller font-size.

    HTML is the best thing since sliced bread.

    {% highlight html %} HTML {% endhighlight %}

    Addresses

    Present contact information for the nearest ancestor or the entire body of work. Preserve formatting by ending all lines with <br>.

    Twitter, Inc.
    795 Folsom Ave, Suite 600
    San Francisco, CA 94107
    P: (123) 456-7890
    Full Name
    first.last@example.com
    {% highlight html %}
    Twitter, Inc.
    795 Folsom Ave, Suite 600
    San Francisco, CA 94107
    P: (123) 456-7890
    Full Name
    first.last@example.com
    {% endhighlight %}

    Blockquotes

    For quoting blocks of content from another source within your document.

    Default blockquote

    Wrap <blockquote> around any HTML as the quote. For straight quotes, we recommend a <p>.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    {% highlight html %}

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    {% endhighlight %}

    Blockquote options

    Style and content changes for simple variations on a standard <blockquote>.

    Naming a source

    Add <small> tag for identifying the source. Wrap the name of the source work in <cite>.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    Someone famous in Source Title
    {% highlight html %}

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    Someone famous in Source Title
    {% endhighlight %}

    Alternate displays

    Use .pull-right for a floated, right-aligned blockquote.

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer posuere erat a ante.

    Someone famous in Source Title
    {% highlight html %}
    ...
    {% endhighlight %}

    Lists

    Unordered

    A list of items in which the order does not explicitly matter.

    • Lorem ipsum dolor sit amet
    • Consectetur adipiscing elit
    • Integer molestie lorem at massa
    • Facilisis in pretium nisl aliquet
    • Nulla volutpat aliquam velit
      • Phasellus iaculis neque
      • Purus sodales ultricies
      • Vestibulum laoreet porttitor sem
      • Ac tristique libero volutpat at
    • Faucibus porta lacus fringilla vel
    • Aenean sit amet erat nunc
    • Eget porttitor lorem
    {% highlight html %}
    • ...
    {% endhighlight %}

    Ordered

    A list of items in which the order does explicitly matter.

    1. Lorem ipsum dolor sit amet
    2. Consectetur adipiscing elit
    3. Integer molestie lorem at massa
    4. Facilisis in pretium nisl aliquet
    5. Nulla volutpat aliquam velit
    6. Faucibus porta lacus fringilla vel
    7. Aenean sit amet erat nunc
    8. Eget porttitor lorem
    {% highlight html %}
    1. ...
    {% endhighlight %}

    Unstyled

    Remove the default list-style and left margin on list items (immediate children only). This only applies to immediate children list items, meaning you will need to add the class for any nested lists as well.

    • Lorem ipsum dolor sit amet
    • Consectetur adipiscing elit
    • Integer molestie lorem at massa
    • Facilisis in pretium nisl aliquet
    • Nulla volutpat aliquam velit
      • Phasellus iaculis neque
      • Purus sodales ultricies
      • Vestibulum laoreet porttitor sem
      • Ac tristique libero volutpat at
    • Faucibus porta lacus fringilla vel
    • Aenean sit amet erat nunc
    • Eget porttitor lorem
    {% highlight html %}
    • ...
    {% endhighlight %}

    Inline

    Place all list items on a single line with display: inline-block; and some light padding.

    • Lorem ipsum
    • Phasellus iaculis
    • Nulla volutpat
    {% highlight html %}
    • ...
    {% endhighlight %}

    Description

    A list of terms with their associated descriptions.

    Description lists
    A description list is perfect for defining terms.
    Euismod
    Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.
    Donec id elit non mi porta gravida at eget metus.
    Malesuada porta
    Etiam porta sem malesuada magna mollis euismod.
    {% highlight html %}
    ...
    ...
    {% endhighlight %}

    Horizontal description

    Make terms and descriptions in <dl> line up side-by-side. Starts off stacked like default <dl>s, but when the navbar expands, so do these.

    Description lists
    A description list is perfect for defining terms.
    Euismod
    Vestibulum id ligula porta felis euismod semper eget lacinia odio sem nec elit.
    Donec id elit non mi porta gravida at eget metus.
    Malesuada porta
    Etiam porta sem malesuada magna mollis euismod.
    Felis euismod semper eget lacinia
    Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.
    {% highlight html %}
    ...
    ...
    {% endhighlight %}

    Auto-truncating

    Horizontal description lists will truncate terms that are too long to fit in the left column with text-overflow. In narrower viewports, they will change to the default stacked layout.

    Inline

    Wrap inline snippets of code with <code>.

    For example, <section> should be wrapped as inline.
    {% highlight html %} For example, <section> should be wrapped as inline. {% endhighlight %}

    Basic block

    Use <pre> for multiple lines of code. Be sure to escape any angle brackets in the code for proper rendering.

    <p>Sample text here...</p>
    {% highlight html %}
    <p>Sample text here...</p>
    {% endhighlight %}

    You may optionally add the .pre-scrollable class, which will set a max-height of 350px and provide a y-axis scrollbar.

    Basic example

    For basic styling—light padding and only horizontal dividers—add the base class .table to any <table>. It may seem super redundant, but given the widespread use of tables for other plugins like calendars and date pickers, we've opted to isolate our custom table styles.

    # First Name Last Name Username
    1 Mark Otto @mdo
    2 Jacob Thornton @fat
    3 Larry the Bird @twitter
    {% highlight html %} ...
    {% endhighlight %}

    Striped rows

    Use .table-striped to add zebra-striping to any table row within the <tbody>.

    Cross-browser compatibility

    Striped tables are styled via the :nth-child CSS selector, which is not available in Internet Explorer 8.

    # First Name Last Name Username
    1 Mark Otto @mdo
    2 Jacob Thornton @fat
    3 Larry the Bird @twitter
    {% highlight html %} ...
    {% endhighlight %}

    Bordered table

    Add .table-bordered for borders on all sides of the table and cells.

    # First Name Last Name Username
    1 Mark Otto @mdo
    Mark Otto @TwBootstrap
    2 Jacob Thornton @fat
    3 Larry the Bird @twitter
    {% highlight html %} ...
    {% endhighlight %}

    Hover rows

    Add .table-hover to enable a hover state on table rows within a <tbody>.

    # First Name Last Name Username
    1 Mark Otto @mdo
    2 Jacob Thornton @fat
    3 Larry the Bird @twitter
    {% highlight html %} ...
    {% endhighlight %}

    Condensed table

    Add .table-condensed to make tables more compact by cutting cell padding in half.

    # First Name Last Name Username
    1 Mark Otto @mdo
    2 Jacob Thornton @fat
    3 Larry the Bird @twitter
    {% highlight html %} ...
    {% endhighlight %}

    Contextual classes

    Use contextual classes to color table rows or individual cells.

    Class Description
    .active Applies the hover color to a particular row or cell
    .success Indicates a successful or positive action
    .warning Indicates a warning that might need attention
    .danger Indicates a dangerous or potentially negative action
    # Column heading Column heading Column heading
    1 Column content Column content Column content
    2 Column content Column content Column content
    3 Column content Column content Column content
    4 Column content Column content Column content
    5 Column content Column content Column content
    6 Column content Column content Column content
    7 Column content Column content Column content
    {% highlight html %} ... ... ... ... ... ... ... ... {% endhighlight %}

    Responsive tables

    Create responsive tables by wrapping any .table in .table-responsive to make them scroll horizontally up to small devices (under 768px). When viewing on anything larger than 768px wide, you will not see any difference in these tables.

    # Table heading Table heading Table heading Table heading Table heading Table heading
    1 Table cell Table cell Table cell Table cell Table cell Table cell
    2 Table cell Table cell Table cell Table cell Table cell Table cell
    3 Table cell Table cell Table cell Table cell Table cell Table cell
    # Table heading Table heading Table heading Table heading Table heading Table heading
    1 Table cell Table cell Table cell Table cell Table cell Table cell
    2 Table cell Table cell Table cell Table cell Table cell Table cell
    3 Table cell Table cell Table cell Table cell Table cell Table cell
    {% highlight html %}
    ...
    {% endhighlight %}

    Basic example

    Individual form controls automatically receive some global styling. All textual <input>, <textarea>, and <select> elements with .form-control are set to width: 100%; by default. Wrap labels and controls in .form-group for optimum spacing.

    Example block-level help text here.

    {% highlight html %}

    Example block-level help text here.

    {% endhighlight %}

    Inline form

    Add .form-inline for left-aligned and inline-block controls for a compact layout.

    Requires custom widths

    Inputs, selects, and textareas are 100% wide by default in Bootstrap. To use the inline form, you'll have to set a width on the form controls used within.

    Always add labels

    Screen readers will have trouble with your forms if you don't include a label for every input. For these inline forms, you can hide the labels using the .sr-only class.

    {% highlight html %}
    {% endhighlight %}

    Horizontal form

    Use Bootstrap's predefined grid classes to align labels and groups of form controls in a horizontal layout by adding .form-horizontal to the form. Doing so changes .form-groups to behave as grid rows, so no need for .row.

    {% highlight html %}
    {% endhighlight %}

    Supported controls

    Examples of standard form controls supported in an example form layout.

    Inputs

    Most common form control, text-based input fields. Includes support for all HTML5 types: text, password, datetime, datetime-local, date, month, time, week, number, email, url, search, tel, and color.

    Type declaration required

    Inputs will only be fully styled if their type is properly declared.

    {% highlight html %} {% endhighlight %}

    Input groups

    To add integrated text or buttons before and/or after any text-based <input>, check out the input group component.

    Textarea

    Form control which supports multiple lines of text. Change rows attribute as necessary.

    {% highlight html %} {% endhighlight %}

    Checkboxes and radios

    Checkboxes are for selecting one or several options in a list while radios are for selecting one option from many.

    Default (stacked)


    {% highlight html %}
    {% endhighlight %}

    Inline checkboxes

    Use .checkbox-inline or .radio-inline class to a series of checkboxes or radios for controls appear on the same line.

    {% highlight html %} {% endhighlight %}

    Selects

    Use the default option, or add multiple to show multiple options at once.


    {% highlight html %} {% endhighlight %}

    Static control

    When you need to place plain text next to a form label within a horizontal form, use the .form-control-static class on a <p>.

    email@example.com

    {% highlight html %}

    email@example.com

    {% endhighlight %}

    Form states

    Provide feedback to users or visitors with basic feedback states on form controls and labels.

    Input focus

    We remove the default outline styles on some form controls and apply a box-shadow in its place for :focus.

    {% highlight html %} {% endhighlight %}

    Disabled inputs

    Add the disabled attribute on an input to prevent user input and trigger a slightly different look.

    {% highlight html %} {% endhighlight %}

    Disabled fieldsets

    Add the disabled attribute to a <fieldset> to disable all the controls within the <fieldset> at once.

    Link functionality of <a> not impacted

    This class will only change the appearance of <a class="btn btn-default"> buttons, not their functionality. Use custom JavaScript to disable links here.

    Cross-browser compatibility

    While Bootstrap will apply these styles in all browsers, Internet Explorer 9 and below don't actually support the disabled attribute on a <fieldset>. Use custom JavaScript to disable the fieldset in these browsers.

    {% highlight html %}
    {% endhighlight %}

    Validation states

    Bootstrap includes validation styles for error, warning, and success states on form controls. To use, add .has-warning, .has-error, or .has-success to the parent element. Any .control-label, .form-control, and .help-block within that element will receive the validation styles.

    {% highlight html %}
    {% endhighlight %}

    Control sizing

    Set heights using classes like .input-lg, and set widths using grid column classes like .col-lg-*.

    Height sizing

    Create larger or smaller form controls that match button sizes.

    {% highlight html %} {% endhighlight %}

    Column sizing

    Wrap inputs in grid columns, or any custom parent element, to easily enforce desired widths.

    {% highlight html %}
    {% endhighlight %}

    Help text

    Block level help text for form controls.

    A block of help text that breaks onto a new line and may extend beyond one line.
    {% highlight html %} A block of help text that breaks onto a new line and may extend beyond one line. {% endhighlight %}

    Options

    Use any of the available button classes to quickly create a styled button.

    {% highlight html %} {% endhighlight %}

    Sizes

    Fancy larger or smaller buttons? Add .btn-lg, .btn-sm, or .btn-xs for additional sizes.

    {% highlight html %}

    {% endhighlight %}

    Create block level buttons—those that span the full width of a parent— by adding .btn-block.

    {% highlight html %} {% endhighlight %}

    Active state

    Buttons will appear pressed (with a darker background, darker border, and inset shadow) when active. For <button> elements, this is done via :active. For <a> elements, it's done with .active. However, you may use .active <button>s should you need to replicate the active state progammatically.

    Button element

    No need to add :active as it's a pseudo-class, but if you need to force the same appearance, go ahead and add .active.

    {% highlight html %} {% endhighlight %}

    Anchor element

    Add the .active class to <a> buttons.

    Primary link Link

    {% highlight html %} Primary link Link {% endhighlight %}

    Disabled state

    Make buttons look unclickable by fading them back 50%.

    Button element

    Add the disabled attribute to <button> buttons.

    {% highlight html %} {% endhighlight %}

    Cross-browser compatibility

    If you add the disabled attribute to a <button>, Internet Explorer 9 and below will render text gray with a nasty text-shadow that we cannot fix.

    Anchor element

    Add the .disabled class to <a> buttons.

    Primary link Link

    {% highlight html %} Primary link Link {% endhighlight %}

    We use .disabled as a utility class here, similar to the common .active class, so no prefix is required.

    Link functionality not impacted

    This class will only change the <a>'s appearance, not its functionality. Use custom JavaScript to disable links here.

    Context-specific usage

    While button classes can be used on <a> and <button> elements, only <button> elements are supported within our nav and navbar components.

    Button tags

    Use the button classes on an <a>, <button>, or <input> element.

    Link
    {% highlight html %} Link {% endhighlight %}

    Cross-browser rendering

    As a best practice, we highly recommend using the <button> element whenever possible to ensure matching cross-browser rendering.

    Among other things, there's a Firefox bug that prevents us from setting the line-height of <input>-based buttons, causing them to not exactly match the height of other buttons on Firefox.

    Add classes to an <img> element to easily style images in any project.

    Cross-browser compatibility

    Keep in mind that Internet Explorer 8 lacks support for rounded corners.

    A generic square placeholder image with rounded corners A generic square placeholder image where only the portion within the circle circumscribed about said square is visible A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera
    {% highlight html %} ... ... ... {% endhighlight %}

    Responsive images

    Looking for how to make images more responsive? Check out the responsive images section up top.

    Close icon

    Use the generic close icon for dismissing content like modals and alerts.

    {% highlight html %} {% endhighlight %}

    Carets

    Use carets to indicate dropdown functionality and direction. Note that the default caret will reverse automatically in dropup menus.

    {% highlight html %} {% endhighlight %}

    Quick floats

    Float an element to the left or right with a class. !important is included to avoid specificity issues. Classes can also be used as mixins.

    {% highlight html %}
    ...
    ...
    {% endhighlight %} {% highlight css %} // Classes .pull-left { float: left !important; } .pull-right { float: right !important; } // Usage as mixins .element { .pull-left(); } .another-element { .pull-right(); } {% endhighlight %}

    Not for use in navbars

    To align components in navbars with utility classes, use .navbar-left or .navbar-right instead. See the navbar docs for details.

    Center content blocks

    Set an element to display: block and center via margin. Available as a mixin and class.

    {% highlight html %}
    ...
    {% endhighlight %} {% highlight css %} // Classes .center-block { display: block; margin-left: auto; margin-right: auto; } // Usage as mixins .element { .center-block(); } {% endhighlight %}

    Clearfix

    Clear the float on any element with the .clearfix class. Utilizes the micro clearfix as popularized by Nicolas Gallagher. Can also be used as a mixin.

    {% highlight html %}
    ...
    {% endhighlight %} {% highlight css %} // Mixin itself .clearfix() { &:before, &:after { content: " "; display: table; } &:after { clear: both; } } // Usage as a Mixin .element { .clearfix(); } {% endhighlight %}

    Showing and hiding content

    Force an element to be shown or hidden (including for screen readers) with the use of .show and .hidden classes. These classes use !important to avoid specificity conflicts, just like the quick floats. They are only available for block level toggling. They can also be used as mixins.

    .hide is available, but it does not always affect screen readers and is deprecated as of v3.0.1. Use .hidden or .sr-only instead.

    Furthermore, .invisible can be used to toggle only the visibility of an element, meaning its display is not modified and the element can still affect the flow of the document.

    {% highlight html %}
    ...
    {% endhighlight %} {% highlight css %} // Classes .show { display: block !important; } .hidden { display: none !important; visibility: hidden !important; } .invisible { visibility: hidden; } // Usage as mixins .element { .show(); } .another-element { .hidden(); } {% endhighlight %}

    Screen reader content

    Hide an element to all devices except screen readers with .sr-only. Necessary for following accessibility best practices. Can also be used as a mixin.

    {% highlight html %} Skip to main content {% endhighlight %} {% highlight css %} // Usage as a Mixin .skip-navigation { .sr-only(); } {% endhighlight %}

    Image replacement

    Utilize the .text-hide class or mixin to help replace an element's text content with a background image.

    {% highlight html %}

    Custom heading

    {% endhighlight %} {% highlight css %} // Usage as a Mixin .heading { .text-hide(); } {% endhighlight %}

    For faster mobile-friendly development, use these utility classes for showing and hiding content by device via media query. Also included are utility classes for toggling content when printed.

    Try to use these on a limited basis and avoid creating entirely different versions of the same site. Instead, use them to complement each device's presentation. Responsive utilities are currently only available for block and table toggling. Use with inline and table elements is currently not supported.

    Available classes

    Use a single or combination of the available classes for toggling content across viewport breakpoints.

    Extra small devices Phones (<768px) Small devices Tablets (≥768px) Medium devices Desktops (≥992px) Large devices Desktops (≥1200px)
    .visible-xs Visible
    .visible-sm Visible
    .visible-md Visible
    .visible-lg Visible
    .hidden-xs Visible Visible Visible
    .hidden-sm Visible Visible Visible
    .hidden-md Visible Visible Visible
    .hidden-lg Visible Visible Visible

    Print classes

    Similar to the regular responsive classes, use these for toggling content for print.

    Class Browser Print
    .visible-print Visible
    .hidden-print Visible

    Test cases

    Resize your browser or load on different devices to test the responsive utility classes.

    Visible on...

    Green checkmarks indicate the element is visible in your current viewport.

    ✔ Visible on x-small
    ✔ Visible on small
    Medium ✔ Visible on medium
    ✔ Visible on large
    ✔ Visible on x-small and small
    ✔ Visible on medium and large
    ✔ Visible on x-small and medium
    ✔ Visible on small and large
    ✔ Visible on x-small and large
    ✔ Visible on small and medium

    Hidden on...

    Here, green checkmarks also indicate the element is hidden in your current viewport.

    ✔ Hidden on x-small
    ✔ Hidden on small
    Medium ✔ Hidden on medium
    ✔ Hidden on large
    ✔ Hidden on x-small and small
    ✔ Hidden on medium and large
    ✔ Hidden on x-small and medium
    ✔ Hidden on small and large
    ✔ Hidden on x-small and large
    ✔ Hidden on small and medium
    ================================================ FILE: public/js/vendor/bootstrap/customize.html ================================================ --- layout: default title: Customize and download slug: customize lead: Customize Bootstrap's components, LESS variables, and jQuery plugins to get your very own version. base_url: "../" ---

    Choose which LESS files to compile into your custom build of Bootstrap. Not sure which files to use? Read through the CSS and Components pages in the docs.

    Common CSS

    Components

    JavaScript components

    Utilities

    Choose which jQuery plugins should be included in your custom JavaScript files. Unsure what to include? Read the JavaScript page in the docs.

    Linked to components

    Magic

    Produces two files

    All checked plugins will be compiled into a readable bootstrap.js and a minified bootstrap.min.js. We recommend you use the minified version in production.

    jQuery required

    All plugins require the latest version of jQuery to be included.

    Customize LESS variables to define colors, sizes and more inside your custom CSS stylesheets.

    Basics

    Color system

    Body scaffolding

    Background color for <body>.

    Global text color on <body>.

    Global textual link color

    Link hover color set via darken() function

    Typography

    Generic font variables

    Default sans-serif fonts.

    Default serif fonts.

    Default monospace fonts for <code> and <pre>.

    Base type styes

    Heading font sizes

    Headings

    Code blocks

    Media queries breakpoints

    Layout and grid system

    For @screen-sm-min and up.

    For @screen-md-min and up.

    For @screen-lg-min and up.

    Number of columns in the grid.

    Padding between columns.

    Point at which the navbar stops collapsing.

    Components

    Padding

    Rounded corners

    Component active state

    Global color for active items (e.g., navs or dropdowns)

    Global background color for active items (e.g., navs or dropdowns)

    Carets

    Buttons

    Default

    Primary

    Info

    Success

    Warning

    Danger

    Form states and alerts

    Success

    Warning

    Danger

    Info

    Alerts

    Base styles

    Warning

    Success

    Danger

    Info

    Navbar

    Base styles

    Default navbar

    Basics

    Links

    Brand

    Toggle

    Inverted navbar

    Basics

    Links

    Brand

    Toggle

    Nav

    Default nav

    Common values

    Pills

    Tabs

    Tables

    Default padding for <th>s and <td>s

    Default padding cells in .table-condensed

    Default background color used for all tables.

    Background color used for .table-striped.

    Background color used for .table-hover.

    Border color for table and cell borders.

    Forms

    Inputs

    Text color for <input>s

    <input> background color

    <input> border color

    <input> border radius

    Placeholder text color

    Input states

    Border color for inputs on focus

    <input disabled> background color

    Input sizes

    Default .form-control height

    Large .form-control height

    Small .form-control height

    Legend

    Input groups

    Background color for textual input addons

    Border color for textual input addons

    Dropdowns

    Dropdown menu

    Dropdown menu background color

    Dropdown menu border color

    Dropdown menu border color for IE8

    Indicator arrow for showing an element has a dropdown

    Dropdown divider top border color

    Text color for headers within dropdown menus

    Dropdown items

    Dropdown text color

    Hovered dropdown menu entry text color

    Hovered dropdown menu entry text color

    Active dropdown menu entry text color

    Active dropdown menu entry background color

    Disabled dropdown menu entry background color

    Panels and wells

    Common panel styles

    Border color for elements within panels

    Contextual panel colors

    Default

    Primary

    Success

    Info

    Warning

    Danger

    Wells

    Accordion

    Badges

    Base styles

    States

    Linked badge text color on hover

    Badge text color in active nav link

    Badge background color in active nav link

    Breadcrumbs

    Breadcrumb text color

    Breadcrumb background color

    Text color of current page in the breadcrumb

    Textual separator for between breadcrumb elements

    Jumbotron

    Modals

    Base modal

    Padding applied to the modal body

    Modal backdrop background color

    Modal header and footer

    Padding applied to the modal title

    Modal title line-height

    Modal header border color

    Modal footer border color

    Modal content

    Background color of modal content area

    Modal content border color

    Modal content border color for IE8

    List group

    Base styles

    Background color on .list-group-item

    .list-group-item border color

    List group border radius

    Hover and active states

    Background color of single list elements on hover

    Text color of active list elements

    Background color of active list elements

    Border color of active list elements

    Thumbnails

    Base thumbnail

    Padding around the thumbnail image

    Thumbnail background color

    Thumbnail border color

    Thumbnail border radius

    Thumbnail captions

    Padding around the thumbnail caption

    Custom text color for thumbnail captions

    Progress bars

    Shared styles

    Background color of the whole progress component

    Info progress bar text color

    Info progress bar text shadow

    Default progress bar color

    Contextual states

    Success progress bar color

    Info progress bar color

    Warning progress bar color

    Danger progress bar color

    Pagination

    Default styles

    Background color

    Border color

    Background hover color

    Disabled and active states

    Disabled text color

    Active background color

    Active text color

    Pager

    Pager border radius

    Pager disabled state color

    Labels

    Default label text color

    Default text color of a linked label

    Default label background color

    Primary label background color

    Success label background color

    Info label background color

    Warning label background color

    Danger label background color

    Tooltips and popovers

    Tooltip

    Tooltip text color

    Tooltip background color

    Tooltip arrow width

    Tooltip arrow color

    Tooltip max width

    Popovers

    Base styles

    Popover body background color

    Popover maximum width

    Popover border color

    Popover fallback border color

    Popover title background color

    Popover arrows

    Popover arrow width

    Popover arrow color

    Popover outer arrow width

    Popover outer arrow color

    Popover outer arrow fallback color

    Close button

    Type

    Text muted color

    Abbreviations and acronyms border color

    Headings small color

    Blockquote small color

    Blockquote border color

    Page header border color

    Other

    Horizontal line color

    Horizontal offset for forms and lists

    Hooray! Your custom version of Bootstrap is now ready to be compiled. Just click the button below to finish the process.

    ================================================ FILE: public/js/vendor/bootstrap/dist/css/bootstrap-theme.css ================================================ /*! * Bootstrap v3.0.1 by @fat and @mdo * Copyright 2013 Twitter, Inc. * Licensed under http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */ .btn-default, .btn-primary, .btn-success, .btn-info, .btn-warning, .btn-danger { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); } .btn-default:active, .btn-primary:active, .btn-success:active, .btn-info:active, .btn-warning:active, .btn-danger:active, .btn-default.active, .btn-primary.active, .btn-success.active, .btn-info.active, .btn-warning.active, .btn-danger.active { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn:active, .btn.active { background-image: none; } .btn-default { text-shadow: 0 1px 0 #fff; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#e0e0e0)); background-image: -webkit-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); background-image: -moz-linear-gradient(top, #ffffff 0%, #e0e0e0 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%); background-repeat: repeat-x; border-color: #dbdbdb; border-color: #ccc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .btn-default:hover, .btn-default:focus { background-color: #e0e0e0; background-position: 0 -15px; } .btn-default:active, .btn-default.active { background-color: #e0e0e0; border-color: #dbdbdb; } .btn-primary { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#2d6ca2)); background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #2d6ca2 100%); background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%); background-repeat: repeat-x; border-color: #2b669a; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .btn-primary:hover, .btn-primary:focus { background-color: #2d6ca2; background-position: 0 -15px; } .btn-primary:active, .btn-primary.active { background-color: #2d6ca2; border-color: #2b669a; } .btn-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#419641)); background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: -moz-linear-gradient(top, #5cb85c 0%, #419641 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); background-repeat: repeat-x; border-color: #3e8f3e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .btn-success:hover, .btn-success:focus { background-color: #419641; background-position: 0 -15px; } .btn-success:active, .btn-success.active { background-color: #419641; border-color: #3e8f3e; } .btn-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#eb9316)); background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: -moz-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); background-repeat: repeat-x; border-color: #e38d13; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .btn-warning:hover, .btn-warning:focus { background-color: #eb9316; background-position: 0 -15px; } .btn-warning:active, .btn-warning.active { background-color: #eb9316; border-color: #e38d13; } .btn-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c12e2a)); background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: -moz-linear-gradient(top, #d9534f 0%, #c12e2a 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); background-repeat: repeat-x; border-color: #b92c28; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .btn-danger:hover, .btn-danger:focus { background-color: #c12e2a; background-position: 0 -15px; } .btn-danger:active, .btn-danger.active { background-color: #c12e2a; border-color: #b92c28; } .btn-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#2aabd2)); background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: -moz-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); background-repeat: repeat-x; border-color: #28a4c9; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .btn-info:hover, .btn-info:focus { background-color: #2aabd2; background-position: 0 -15px; } .btn-info:active, .btn-info.active { background-color: #2aabd2; border-color: #28a4c9; } .thumbnail, .img-thumbnail { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { background-color: #e8e8e8; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { background-color: #357ebd; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); } .navbar-default { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ffffff), to(#f8f8f8)); background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: -moz-linear-gradient(top, #ffffff 0%, #f8f8f8 100%); background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%); background-repeat: repeat-x; border-radius: 4px; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075); } .navbar-default .navbar-nav > .active > a { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f3f3f3)); background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); background-image: -moz-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%); background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0); -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075); } .navbar-brand, .navbar-nav > li > a { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25); } .navbar-inverse { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#3c3c3c), to(#222222)); background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: -moz-linear-gradient(top, #3c3c3c 0%, #222222 100%); background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .navbar-inverse .navbar-nav > .active > a { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#222222), to(#282828)); background-image: -webkit-linear-gradient(top, #222222 0%, #282828 100%); background-image: -moz-linear-gradient(top, #222222 0%, #282828 100%); background-image: linear-gradient(to bottom, #222222 0%, #282828 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0); -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25); } .navbar-inverse .navbar-brand, .navbar-inverse .navbar-nav > li > a { text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar-static-top, .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } .alert { text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2); -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05); } .alert-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#c8e5bc)); background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: -moz-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); background-repeat: repeat-x; border-color: #b2dba1; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); } .alert-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#b9def0)); background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: -moz-linear-gradient(top, #d9edf7 0%, #b9def0 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); background-repeat: repeat-x; border-color: #9acfea; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); } .alert-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#f8efc0)); background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: -moz-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); background-repeat: repeat-x; border-color: #f5e79e; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); } .alert-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#e7c3c3)); background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: -moz-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); background-repeat: repeat-x; border-color: #dca7a7; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); } .progress { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#ebebeb), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: -moz-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); } .progress-bar { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3071a9)); background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3071a9 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0); } .progress-bar-success { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5cb85c), to(#449d44)); background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: -moz-linear-gradient(top, #5cb85c 0%, #449d44 100%); background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); } .progress-bar-info { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#5bc0de), to(#31b0d5)); background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: -moz-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); } .progress-bar-warning { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f0ad4e), to(#ec971f)); background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: -moz-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); } .progress-bar-danger { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9534f), to(#c9302c)); background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: -moz-linear-gradient(top, #d9534f 0%, #c9302c 100%); background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); } .list-group { border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075); } .list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus { text-shadow: 0 -1px 0 #3071a9; background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#3278b3)); background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #3278b3 100%); background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%); background-repeat: repeat-x; border-color: #3278b3; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0); } .panel { -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .panel-default > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f5f5f5), to(#e8e8e8)); background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: -moz-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); } .panel-primary > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#428bca), to(#357ebd)); background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: -moz-linear-gradient(top, #428bca 0%, #357ebd 100%); background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0); } .panel-success > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#dff0d8), to(#d0e9c6)); background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: -moz-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); } .panel-info > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#d9edf7), to(#c4e3f3)); background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: -moz-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); } .panel-warning > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#fcf8e3), to(#faf2cc)); background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: -moz-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); } .panel-danger > .panel-heading { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#f2dede), to(#ebcccc)); background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: -moz-linear-gradient(top, #f2dede 0%, #ebcccc 100%); background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); } .well { background-image: -webkit-gradient(linear, left 0%, left 100%, from(#e8e8e8), to(#f5f5f5)); background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: -moz-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); background-repeat: repeat-x; border-color: #dcdcdc; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1); } ================================================ FILE: public/js/vendor/bootstrap/dist/css/bootstrap.css ================================================ /*! * Bootstrap v3.0.1 by @fat and @mdo * Copyright 2013 Twitter, Inc. * Licensed under http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */ /*! normalize.css v2.1.3 | MIT License | git.io/normalize */ article, aside, details, figcaption, figure, footer, header, hgroup, main, nav, section, summary { display: block; } audio, canvas, video { display: inline-block; } audio:not([controls]) { display: none; height: 0; } [hidden], template { display: none; } html { font-family: sans-serif; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } body { margin: 0; } a { background: transparent; } a:focus { outline: thin dotted; } a:active, a:hover { outline: 0; } h1 { margin: 0.67em 0; font-size: 2em; } abbr[title] { border-bottom: 1px dotted; } b, strong { font-weight: bold; } dfn { font-style: italic; } hr { height: 0; -moz-box-sizing: content-box; box-sizing: content-box; } mark { color: #000; background: #ff0; } code, kbd, pre, samp { font-family: monospace, serif; font-size: 1em; } pre { white-space: pre-wrap; } q { quotes: "\201C" "\201D" "\2018" "\2019"; } small { font-size: 80%; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { border: 0; } svg:not(:root) { overflow: hidden; } figure { margin: 0; } fieldset { padding: 0.35em 0.625em 0.75em; margin: 0 2px; border: 1px solid #c0c0c0; } legend { padding: 0; border: 0; } button, input, select, textarea { margin: 0; font-family: inherit; font-size: 100%; } button, input { line-height: normal; } button, select { text-transform: none; } button, html input[type="button"], input[type="reset"], input[type="submit"] { cursor: pointer; -webkit-appearance: button; } button[disabled], html input[disabled] { cursor: default; } input[type="checkbox"], input[type="radio"] { padding: 0; box-sizing: border-box; } 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-cancel-button, input[type="search"]::-webkit-search-decoration { -webkit-appearance: none; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } textarea { overflow: auto; vertical-align: top; } table { border-collapse: collapse; border-spacing: 0; } @media print { * { color: #000 !important; text-shadow: none !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 2cm .5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } select { background: #fff !important; } .navbar { display: none; } .table td, .table th { background-color: #fff !important; } .btn > .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px solid #000; } .table { border-collapse: collapse !important; } .table-bordered th, .table-bordered td { border: 1px solid #ddd !important; } } *, *:before, *:after { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } html { font-size: 62.5%; -webkit-tap-highlight-color: rgba(0, 0, 0, 0); } body { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 1.428571429; color: #333333; background-color: #ffffff; } input, button, select, textarea { font-family: inherit; font-size: inherit; line-height: inherit; } a { color: #428bca; text-decoration: none; } a:hover, a:focus { color: #2a6496; text-decoration: underline; } a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } img { vertical-align: middle; } .img-responsive { display: block; height: auto; max-width: 100%; } .img-rounded { border-radius: 6px; } .img-thumbnail { display: inline-block; height: auto; max-width: 100%; padding: 4px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .img-circle { border-radius: 50%; } hr { margin-top: 20px; margin-bottom: 20px; border: 0; border-top: 1px solid #eeeeee; } .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0, 0, 0, 0); border: 0; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 16px; font-weight: 200; line-height: 1.4; } @media (min-width: 768px) { .lead { font-size: 21px; } } small, .small { font-size: 85%; } cite { font-style: normal; } .text-muted { color: #999999; } .text-primary { color: #428bca; } .text-primary:hover { color: #3071a9; } .text-warning { color: #c09853; } .text-warning:hover { color: #a47e3c; } .text-danger { color: #b94a48; } .text-danger:hover { color: #953b39; } .text-success { color: #468847; } .text-success:hover { color: #356635; } .text-info { color: #3a87ad; } .text-info:hover { color: #2d6987; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } h1, h2, h3, h4, h5, h6, .h1, .h2, .h3, .h4, .h5, .h6 { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: inherit; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small, .h1 small, .h2 small, .h3 small, .h4 small, .h5 small, .h6 small, h1 .small, h2 .small, h3 .small, h4 .small, h5 .small, h6 .small, .h1 .small, .h2 .small, .h3 .small, .h4 .small, .h5 .small, .h6 .small { font-weight: normal; line-height: 1; color: #999999; } h1, h2, h3 { margin-top: 20px; margin-bottom: 10px; } h1 small, h2 small, h3 small, h1 .small, h2 .small, h3 .small { font-size: 65%; } h4, h5, h6 { margin-top: 10px; margin-bottom: 10px; } h4 small, h5 small, h6 small, h4 .small, h5 .small, h6 .small { font-size: 75%; } h1, .h1 { font-size: 36px; } h2, .h2 { font-size: 30px; } h3, .h3 { font-size: 24px; } h4, .h4 { font-size: 18px; } h5, .h5 { font-size: 14px; } h6, .h6 { font-size: 12px; } .page-header { padding-bottom: 9px; margin: 40px 0 20px; border-bottom: 1px solid #eeeeee; } ul, ol { margin-top: 0; margin-bottom: 10px; } ul ul, ol ul, ul ol, ol ol { margin-bottom: 0; } .list-unstyled { padding-left: 0; list-style: none; } .list-inline { padding-left: 0; list-style: none; } .list-inline > li { display: inline-block; padding-right: 5px; padding-left: 5px; } .list-inline > li:first-child { padding-left: 0; } dl { margin-bottom: 20px; } dt, dd { line-height: 1.428571429; } dt { font-weight: bold; } dd { margin-left: 0; } @media (min-width: 768px) { .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; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } .dl-horizontal dd:before, .dl-horizontal dd:after { display: table; content: " "; } .dl-horizontal dd:after { clear: both; } } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #999999; } abbr.initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 10px 20px; margin: 0 0 20px; border-left: 5px solid #eeeeee; } blockquote p { font-size: 17.5px; font-weight: 300; line-height: 1.25; } blockquote p:last-child { margin-bottom: 0; } blockquote small { display: block; line-height: 1.428571429; color: #999999; } blockquote small:before { content: '\2014 \00A0'; } blockquote.pull-right { padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; } blockquote.pull-right p, blockquote.pull-right small, blockquote.pull-right .small { text-align: right; } blockquote.pull-right small:before, blockquote.pull-right .small:before { content: ''; } blockquote.pull-right small:after, blockquote.pull-right .small:after { content: '\00A0 \2014'; } blockquote:before, blockquote:after { content: ""; } address { margin-bottom: 20px; font-style: normal; line-height: 1.428571429; } code, kbd, pre, samp { font-family: Monaco, Menlo, Consolas, "Courier New", monospace; } code { padding: 2px 4px; font-size: 90%; color: #c7254e; white-space: nowrap; background-color: #f9f2f4; border-radius: 4px; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 1.428571429; color: #333333; word-break: break-all; word-wrap: break-word; background-color: #f5f5f5; border: 1px solid #cccccc; border-radius: 4px; } pre code { padding: 0; font-size: inherit; color: inherit; white-space: pre-wrap; background-color: transparent; border-radius: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .container { padding-right: 15px; padding-left: 15px; margin-right: auto; margin-left: auto; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .container:before, .container:after { display: table; content: " "; } .container:after { clear: both; } .row { margin-right: -15px; margin-left: -15px; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .row:before, .row:after { display: table; content: " "; } .row:after { clear: both; } .col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { position: relative; min-height: 1px; padding-right: 15px; padding-left: 15px; } .col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11 { float: left; } .col-xs-12 { width: 100%; } .col-xs-11 { width: 91.66666666666666%; } .col-xs-10 { width: 83.33333333333334%; } .col-xs-9 { width: 75%; } .col-xs-8 { width: 66.66666666666666%; } .col-xs-7 { width: 58.333333333333336%; } .col-xs-6 { width: 50%; } .col-xs-5 { width: 41.66666666666667%; } .col-xs-4 { width: 33.33333333333333%; } .col-xs-3 { width: 25%; } .col-xs-2 { width: 16.666666666666664%; } .col-xs-1 { width: 8.333333333333332%; } .col-xs-pull-12 { right: 100%; } .col-xs-pull-11 { right: 91.66666666666666%; } .col-xs-pull-10 { right: 83.33333333333334%; } .col-xs-pull-9 { right: 75%; } .col-xs-pull-8 { right: 66.66666666666666%; } .col-xs-pull-7 { right: 58.333333333333336%; } .col-xs-pull-6 { right: 50%; } .col-xs-pull-5 { right: 41.66666666666667%; } .col-xs-pull-4 { right: 33.33333333333333%; } .col-xs-pull-3 { right: 25%; } .col-xs-pull-2 { right: 16.666666666666664%; } .col-xs-pull-1 { right: 8.333333333333332%; } .col-xs-push-12 { left: 100%; } .col-xs-push-11 { left: 91.66666666666666%; } .col-xs-push-10 { left: 83.33333333333334%; } .col-xs-push-9 { left: 75%; } .col-xs-push-8 { left: 66.66666666666666%; } .col-xs-push-7 { left: 58.333333333333336%; } .col-xs-push-6 { left: 50%; } .col-xs-push-5 { left: 41.66666666666667%; } .col-xs-push-4 { left: 33.33333333333333%; } .col-xs-push-3 { left: 25%; } .col-xs-push-2 { left: 16.666666666666664%; } .col-xs-push-1 { left: 8.333333333333332%; } .col-xs-offset-12 { margin-left: 100%; } .col-xs-offset-11 { margin-left: 91.66666666666666%; } .col-xs-offset-10 { margin-left: 83.33333333333334%; } .col-xs-offset-9 { margin-left: 75%; } .col-xs-offset-8 { margin-left: 66.66666666666666%; } .col-xs-offset-7 { margin-left: 58.333333333333336%; } .col-xs-offset-6 { margin-left: 50%; } .col-xs-offset-5 { margin-left: 41.66666666666667%; } .col-xs-offset-4 { margin-left: 33.33333333333333%; } .col-xs-offset-3 { margin-left: 25%; } .col-xs-offset-2 { margin-left: 16.666666666666664%; } .col-xs-offset-1 { margin-left: 8.333333333333332%; } @media (min-width: 768px) { .container { width: 750px; } .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11 { float: left; } .col-sm-12 { width: 100%; } .col-sm-11 { width: 91.66666666666666%; } .col-sm-10 { width: 83.33333333333334%; } .col-sm-9 { width: 75%; } .col-sm-8 { width: 66.66666666666666%; } .col-sm-7 { width: 58.333333333333336%; } .col-sm-6 { width: 50%; } .col-sm-5 { width: 41.66666666666667%; } .col-sm-4 { width: 33.33333333333333%; } .col-sm-3 { width: 25%; } .col-sm-2 { width: 16.666666666666664%; } .col-sm-1 { width: 8.333333333333332%; } .col-sm-pull-12 { right: 100%; } .col-sm-pull-11 { right: 91.66666666666666%; } .col-sm-pull-10 { right: 83.33333333333334%; } .col-sm-pull-9 { right: 75%; } .col-sm-pull-8 { right: 66.66666666666666%; } .col-sm-pull-7 { right: 58.333333333333336%; } .col-sm-pull-6 { right: 50%; } .col-sm-pull-5 { right: 41.66666666666667%; } .col-sm-pull-4 { right: 33.33333333333333%; } .col-sm-pull-3 { right: 25%; } .col-sm-pull-2 { right: 16.666666666666664%; } .col-sm-pull-1 { right: 8.333333333333332%; } .col-sm-push-12 { left: 100%; } .col-sm-push-11 { left: 91.66666666666666%; } .col-sm-push-10 { left: 83.33333333333334%; } .col-sm-push-9 { left: 75%; } .col-sm-push-8 { left: 66.66666666666666%; } .col-sm-push-7 { left: 58.333333333333336%; } .col-sm-push-6 { left: 50%; } .col-sm-push-5 { left: 41.66666666666667%; } .col-sm-push-4 { left: 33.33333333333333%; } .col-sm-push-3 { left: 25%; } .col-sm-push-2 { left: 16.666666666666664%; } .col-sm-push-1 { left: 8.333333333333332%; } .col-sm-offset-12 { margin-left: 100%; } .col-sm-offset-11 { margin-left: 91.66666666666666%; } .col-sm-offset-10 { margin-left: 83.33333333333334%; } .col-sm-offset-9 { margin-left: 75%; } .col-sm-offset-8 { margin-left: 66.66666666666666%; } .col-sm-offset-7 { margin-left: 58.333333333333336%; } .col-sm-offset-6 { margin-left: 50%; } .col-sm-offset-5 { margin-left: 41.66666666666667%; } .col-sm-offset-4 { margin-left: 33.33333333333333%; } .col-sm-offset-3 { margin-left: 25%; } .col-sm-offset-2 { margin-left: 16.666666666666664%; } .col-sm-offset-1 { margin-left: 8.333333333333332%; } } @media (min-width: 992px) { .container { width: 970px; } .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11 { float: left; } .col-md-12 { width: 100%; } .col-md-11 { width: 91.66666666666666%; } .col-md-10 { width: 83.33333333333334%; } .col-md-9 { width: 75%; } .col-md-8 { width: 66.66666666666666%; } .col-md-7 { width: 58.333333333333336%; } .col-md-6 { width: 50%; } .col-md-5 { width: 41.66666666666667%; } .col-md-4 { width: 33.33333333333333%; } .col-md-3 { width: 25%; } .col-md-2 { width: 16.666666666666664%; } .col-md-1 { width: 8.333333333333332%; } .col-md-pull-12 { right: 100%; } .col-md-pull-11 { right: 91.66666666666666%; } .col-md-pull-10 { right: 83.33333333333334%; } .col-md-pull-9 { right: 75%; } .col-md-pull-8 { right: 66.66666666666666%; } .col-md-pull-7 { right: 58.333333333333336%; } .col-md-pull-6 { right: 50%; } .col-md-pull-5 { right: 41.66666666666667%; } .col-md-pull-4 { right: 33.33333333333333%; } .col-md-pull-3 { right: 25%; } .col-md-pull-2 { right: 16.666666666666664%; } .col-md-pull-1 { right: 8.333333333333332%; } .col-md-push-12 { left: 100%; } .col-md-push-11 { left: 91.66666666666666%; } .col-md-push-10 { left: 83.33333333333334%; } .col-md-push-9 { left: 75%; } .col-md-push-8 { left: 66.66666666666666%; } .col-md-push-7 { left: 58.333333333333336%; } .col-md-push-6 { left: 50%; } .col-md-push-5 { left: 41.66666666666667%; } .col-md-push-4 { left: 33.33333333333333%; } .col-md-push-3 { left: 25%; } .col-md-push-2 { left: 16.666666666666664%; } .col-md-push-1 { left: 8.333333333333332%; } .col-md-offset-12 { margin-left: 100%; } .col-md-offset-11 { margin-left: 91.66666666666666%; } .col-md-offset-10 { margin-left: 83.33333333333334%; } .col-md-offset-9 { margin-left: 75%; } .col-md-offset-8 { margin-left: 66.66666666666666%; } .col-md-offset-7 { margin-left: 58.333333333333336%; } .col-md-offset-6 { margin-left: 50%; } .col-md-offset-5 { margin-left: 41.66666666666667%; } .col-md-offset-4 { margin-left: 33.33333333333333%; } .col-md-offset-3 { margin-left: 25%; } .col-md-offset-2 { margin-left: 16.666666666666664%; } .col-md-offset-1 { margin-left: 8.333333333333332%; } } @media (min-width: 1200px) { .container { width: 1170px; } .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11 { float: left; } .col-lg-12 { width: 100%; } .col-lg-11 { width: 91.66666666666666%; } .col-lg-10 { width: 83.33333333333334%; } .col-lg-9 { width: 75%; } .col-lg-8 { width: 66.66666666666666%; } .col-lg-7 { width: 58.333333333333336%; } .col-lg-6 { width: 50%; } .col-lg-5 { width: 41.66666666666667%; } .col-lg-4 { width: 33.33333333333333%; } .col-lg-3 { width: 25%; } .col-lg-2 { width: 16.666666666666664%; } .col-lg-1 { width: 8.333333333333332%; } .col-lg-pull-12 { right: 100%; } .col-lg-pull-11 { right: 91.66666666666666%; } .col-lg-pull-10 { right: 83.33333333333334%; } .col-lg-pull-9 { right: 75%; } .col-lg-pull-8 { right: 66.66666666666666%; } .col-lg-pull-7 { right: 58.333333333333336%; } .col-lg-pull-6 { right: 50%; } .col-lg-pull-5 { right: 41.66666666666667%; } .col-lg-pull-4 { right: 33.33333333333333%; } .col-lg-pull-3 { right: 25%; } .col-lg-pull-2 { right: 16.666666666666664%; } .col-lg-pull-1 { right: 8.333333333333332%; } .col-lg-push-12 { left: 100%; } .col-lg-push-11 { left: 91.66666666666666%; } .col-lg-push-10 { left: 83.33333333333334%; } .col-lg-push-9 { left: 75%; } .col-lg-push-8 { left: 66.66666666666666%; } .col-lg-push-7 { left: 58.333333333333336%; } .col-lg-push-6 { left: 50%; } .col-lg-push-5 { left: 41.66666666666667%; } .col-lg-push-4 { left: 33.33333333333333%; } .col-lg-push-3 { left: 25%; } .col-lg-push-2 { left: 16.666666666666664%; } .col-lg-push-1 { left: 8.333333333333332%; } .col-lg-offset-12 { margin-left: 100%; } .col-lg-offset-11 { margin-left: 91.66666666666666%; } .col-lg-offset-10 { margin-left: 83.33333333333334%; } .col-lg-offset-9 { margin-left: 75%; } .col-lg-offset-8 { margin-left: 66.66666666666666%; } .col-lg-offset-7 { margin-left: 58.333333333333336%; } .col-lg-offset-6 { margin-left: 50%; } .col-lg-offset-5 { margin-left: 41.66666666666667%; } .col-lg-offset-4 { margin-left: 33.33333333333333%; } .col-lg-offset-3 { margin-left: 25%; } .col-lg-offset-2 { margin-left: 16.666666666666664%; } .col-lg-offset-1 { margin-left: 8.333333333333332%; } } table { max-width: 100%; background-color: transparent; } th { text-align: left; } .table { width: 100%; margin-bottom: 20px; } .table > thead > tr > th, .table > tbody > tr > th, .table > tfoot > tr > th, .table > thead > tr > td, .table > tbody > tr > td, .table > tfoot > tr > td { padding: 8px; line-height: 1.428571429; vertical-align: top; border-top: 1px solid #dddddd; } .table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid #dddddd; } .table > caption + thead > tr:first-child > th, .table > colgroup + thead > tr:first-child > th, .table > thead:first-child > tr:first-child > th, .table > caption + thead > tr:first-child > td, .table > colgroup + thead > tr:first-child > td, .table > thead:first-child > tr:first-child > td { border-top: 0; } .table > tbody + tbody { border-top: 2px solid #dddddd; } .table .table { background-color: #ffffff; } .table-condensed > thead > tr > th, .table-condensed > tbody > tr > th, .table-condensed > tfoot > tr > th, .table-condensed > thead > tr > td, .table-condensed > tbody > tr > td, .table-condensed > tfoot > tr > td { padding: 5px; } .table-bordered { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > tbody > tr > th, .table-bordered > tfoot > tr > th, .table-bordered > thead > tr > td, .table-bordered > tbody > tr > td, .table-bordered > tfoot > tr > td { border: 1px solid #dddddd; } .table-bordered > thead > tr > th, .table-bordered > thead > tr > td { border-bottom-width: 2px; } .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 col[class*="col-"] { display: table-column; float: none; } table td[class*="col-"], table th[class*="col-"] { display: table-cell; float: none; } .table > thead > tr > td.active, .table > tbody > tr > td.active, .table > tfoot > tr > td.active, .table > thead > tr > th.active, .table > tbody > tr > th.active, .table > tfoot > tr > th.active, .table > thead > tr.active > td, .table > tbody > tr.active > td, .table > tfoot > tr.active > td, .table > thead > tr.active > th, .table > tbody > tr.active > th, .table > tfoot > tr.active > th { background-color: #f5f5f5; } .table > thead > tr > td.success, .table > tbody > tr > td.success, .table > tfoot > tr > td.success, .table > thead > tr > th.success, .table > tbody > tr > th.success, .table > tfoot > tr > th.success, .table > thead > tr.success > td, .table > tbody > tr.success > td, .table > tfoot > tr.success > td, .table > thead > tr.success > th, .table > tbody > tr.success > th, .table > tfoot > tr.success > th { background-color: #dff0d8; } .table-hover > tbody > tr > td.success:hover, .table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr.success:hover > th { background-color: #d0e9c6; } .table > thead > tr > td.danger, .table > tbody > tr > td.danger, .table > tfoot > tr > td.danger, .table > thead > tr > th.danger, .table > tbody > tr > th.danger, .table > tfoot > tr > th.danger, .table > thead > tr.danger > td, .table > tbody > tr.danger > td, .table > tfoot > tr.danger > td, .table > thead > tr.danger > th, .table > tbody > tr.danger > th, .table > tfoot > tr.danger > th { background-color: #f2dede; } .table-hover > tbody > tr > td.danger:hover, .table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr.danger:hover > th { background-color: #ebcccc; } .table > thead > tr > td.warning, .table > tbody > tr > td.warning, .table > tfoot > tr > td.warning, .table > thead > tr > th.warning, .table > tbody > tr > th.warning, .table > tfoot > tr > th.warning, .table > thead > tr.warning > td, .table > tbody > tr.warning > td, .table > tfoot > tr.warning > td, .table > thead > tr.warning > th, .table > tbody > tr.warning > th, .table > tfoot > tr.warning > th { background-color: #fcf8e3; } .table-hover > tbody > tr > td.warning:hover, .table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr.warning:hover > th { background-color: #faf2cc; } @media (max-width: 767px) { .table-responsive { width: 100%; margin-bottom: 15px; overflow-x: scroll; overflow-y: hidden; border: 1px solid #dddddd; -ms-overflow-style: -ms-autohiding-scrollbar; -webkit-overflow-scrolling: touch; } .table-responsive > .table { margin-bottom: 0; } .table-responsive > .table > thead > tr > th, .table-responsive > .table > tbody > tr > th, .table-responsive > .table > tfoot > tr > th, .table-responsive > .table > thead > tr > td, .table-responsive > .table > tbody > tr > td, .table-responsive > .table > tfoot > tr > td { white-space: nowrap; } .table-responsive > .table-bordered { border: 0; } .table-responsive > .table-bordered > thead > tr > th:first-child, .table-responsive > .table-bordered > tbody > tr > th:first-child, .table-responsive > .table-bordered > tfoot > tr > th:first-child, .table-responsive > .table-bordered > thead > tr > td:first-child, .table-responsive > .table-bordered > tbody > tr > td:first-child, .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .table-responsive > .table-bordered > thead > tr > th:last-child, .table-responsive > .table-bordered > tbody > tr > th:last-child, .table-responsive > .table-bordered > tfoot > tr > th:last-child, .table-responsive > .table-bordered > thead > tr > td:last-child, .table-responsive > .table-bordered > tbody > tr > td:last-child, .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .table-responsive > .table-bordered > tbody > tr:last-child > th, .table-responsive > .table-bordered > tfoot > tr:last-child > th, .table-responsive > .table-bordered > tbody > tr:last-child > td, .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } } fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: inherit; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } label { display: inline-block; margin-bottom: 5px; font-weight: bold; } input[type="search"] { -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"] { display: block; } select[multiple], select[size] { height: auto; } select optgroup { font-family: inherit; font-size: inherit; font-style: inherit; } 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; } input[type="number"]::-webkit-outer-spin-button, input[type="number"]::-webkit-inner-spin-button { height: auto; } output { display: block; padding-top: 7px; font-size: 14px; line-height: 1.428571429; color: #555555; vertical-align: middle; } .form-control:-moz-placeholder { color: #999999; } .form-control::-moz-placeholder { color: #999999; } .form-control:-ms-input-placeholder { color: #999999; } .form-control::-webkit-input-placeholder { color: #999999; } .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14px; line-height: 1.428571429; color: #555555; vertical-align: middle; background-color: #ffffff; background-image: none; border: 1px solid #cccccc; border-radius: 4px; -webkit-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-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s; } .form-control:focus { border-color: #66afe9; outline: 0; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6); } .form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control { cursor: not-allowed; background-color: #eeeeee; } textarea.form-control { height: auto; } .form-group { margin-bottom: 15px; } .radio, .checkbox { display: block; min-height: 20px; padding-left: 20px; margin-top: 10px; margin-bottom: 10px; vertical-align: middle; } .radio label, .checkbox label { display: inline; margin-bottom: 0; font-weight: normal; cursor: pointer; } .radio input[type="radio"], .radio-inline input[type="radio"], .checkbox input[type="checkbox"], .checkbox-inline input[type="checkbox"] { float: left; margin-left: -20px; } .radio + .radio, .checkbox + .checkbox { margin-top: -5px; } .radio-inline, .checkbox-inline { display: inline-block; padding-left: 20px; margin-bottom: 0; font-weight: normal; vertical-align: middle; cursor: pointer; } .radio-inline + .radio-inline, .checkbox-inline + .checkbox-inline { margin-top: 0; margin-left: 10px; } input[type="radio"][disabled], input[type="checkbox"][disabled], .radio[disabled], .radio-inline[disabled], .checkbox[disabled], .checkbox-inline[disabled], fieldset[disabled] input[type="radio"], fieldset[disabled] input[type="checkbox"], fieldset[disabled] .radio, fieldset[disabled] .radio-inline, fieldset[disabled] .checkbox, fieldset[disabled] .checkbox-inline { cursor: not-allowed; } .input-sm { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-sm { height: 30px; line-height: 30px; } textarea.input-sm { height: auto; } .input-lg { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-lg { height: 45px; line-height: 45px; } textarea.input-lg { height: auto; } .has-warning .help-block, .has-warning .control-label, .has-warning .radio, .has-warning .checkbox, .has-warning .radio-inline, .has-warning .checkbox-inline { color: #c09853; } .has-warning .form-control { border-color: #c09853; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-warning .form-control:focus { border-color: #a47e3c; -webkit-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; } .has-warning .input-group-addon { color: #c09853; background-color: #fcf8e3; border-color: #c09853; } .has-error .help-block, .has-error .control-label, .has-error .radio, .has-error .checkbox, .has-error .radio-inline, .has-error .checkbox-inline { color: #b94a48; } .has-error .form-control { border-color: #b94a48; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-error .form-control:focus { border-color: #953b39; -webkit-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; } .has-error .input-group-addon { color: #b94a48; background-color: #f2dede; border-color: #b94a48; } .has-success .help-block, .has-success .control-label, .has-success .radio, .has-success .checkbox, .has-success .radio-inline, .has-success .checkbox-inline { color: #468847; } .has-success .form-control { border-color: #468847; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .has-success .form-control:focus { border-color: #356635; -webkit-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; } .has-success .input-group-addon { color: #468847; background-color: #dff0d8; border-color: #468847; } .form-control-static { margin-bottom: 0; } .help-block { display: block; margin-top: 5px; margin-bottom: 10px; color: #737373; } @media (min-width: 768px) { .form-inline .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .form-inline .form-control { display: inline-block; } .form-inline .radio, .form-inline .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } .form-horizontal .control-label, .form-horizontal .radio, .form-horizontal .checkbox, .form-horizontal .radio-inline, .form-horizontal .checkbox-inline { padding-top: 7px; margin-top: 0; margin-bottom: 0; } .form-horizontal .form-group { margin-right: -15px; margin-left: -15px; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-group:before, .form-horizontal .form-group:after { display: table; content: " "; } .form-horizontal .form-group:after { clear: both; } .form-horizontal .form-control-static { padding-top: 7px; } @media (min-width: 768px) { .form-horizontal .control-label { text-align: right; } } .btn { display: inline-block; padding: 6px 12px; margin-bottom: 0; font-size: 14px; font-weight: normal; line-height: 1.428571429; text-align: center; white-space: nowrap; vertical-align: middle; cursor: pointer; background-image: none; border: 1px solid transparent; border-radius: 4px; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; -o-user-select: none; user-select: none; } .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn:hover, .btn:focus { color: #333333; text-decoration: none; } .btn:active, .btn.active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn.disabled, .btn[disabled], fieldset[disabled] .btn { pointer-events: none; cursor: not-allowed; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; box-shadow: none; } .btn-default { color: #333333; background-color: #ffffff; border-color: #cccccc; } .btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { color: #333333; background-color: #ebebeb; border-color: #adadad; } .btn-default:active, .btn-default.active, .open .dropdown-toggle.btn-default { background-image: none; } .btn-default.disabled, .btn-default[disabled], fieldset[disabled] .btn-default, .btn-default.disabled:hover, .btn-default[disabled]:hover, fieldset[disabled] .btn-default:hover, .btn-default.disabled:focus, .btn-default[disabled]:focus, fieldset[disabled] .btn-default:focus, .btn-default.disabled:active, .btn-default[disabled]:active, fieldset[disabled] .btn-default:active, .btn-default.disabled.active, .btn-default[disabled].active, fieldset[disabled] .btn-default.active { background-color: #ffffff; border-color: #cccccc; } .btn-primary { color: #ffffff; background-color: #428bca; border-color: #357ebd; } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { color: #ffffff; background-color: #3276b1; border-color: #285e8e; } .btn-primary:active, .btn-primary.active, .open .dropdown-toggle.btn-primary { background-image: none; } .btn-primary.disabled, .btn-primary[disabled], fieldset[disabled] .btn-primary, .btn-primary.disabled:hover, .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary:hover, .btn-primary.disabled:focus, .btn-primary[disabled]:focus, fieldset[disabled] .btn-primary:focus, .btn-primary.disabled:active, .btn-primary[disabled]:active, fieldset[disabled] .btn-primary:active, .btn-primary.disabled.active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary.active { background-color: #428bca; border-color: #357ebd; } .btn-warning { color: #ffffff; background-color: #f0ad4e; border-color: #eea236; } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { color: #ffffff; background-color: #ed9c28; border-color: #d58512; } .btn-warning:active, .btn-warning.active, .open .dropdown-toggle.btn-warning { background-image: none; } .btn-warning.disabled, .btn-warning[disabled], fieldset[disabled] .btn-warning, .btn-warning.disabled:hover, .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning:hover, .btn-warning.disabled:focus, .btn-warning[disabled]:focus, fieldset[disabled] .btn-warning:focus, .btn-warning.disabled:active, .btn-warning[disabled]:active, fieldset[disabled] .btn-warning:active, .btn-warning.disabled.active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning.active { background-color: #f0ad4e; border-color: #eea236; } .btn-danger { color: #ffffff; background-color: #d9534f; border-color: #d43f3a; } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { color: #ffffff; background-color: #d2322d; border-color: #ac2925; } .btn-danger:active, .btn-danger.active, .open .dropdown-toggle.btn-danger { background-image: none; } .btn-danger.disabled, .btn-danger[disabled], fieldset[disabled] .btn-danger, .btn-danger.disabled:hover, .btn-danger[disabled]:hover, fieldset[disabled] .btn-danger:hover, .btn-danger.disabled:focus, .btn-danger[disabled]:focus, fieldset[disabled] .btn-danger:focus, .btn-danger.disabled:active, .btn-danger[disabled]:active, fieldset[disabled] .btn-danger:active, .btn-danger.disabled.active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger.active { background-color: #d9534f; border-color: #d43f3a; } .btn-success { color: #ffffff; background-color: #5cb85c; border-color: #4cae4c; } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { color: #ffffff; background-color: #47a447; border-color: #398439; } .btn-success:active, .btn-success.active, .open .dropdown-toggle.btn-success { background-image: none; } .btn-success.disabled, .btn-success[disabled], fieldset[disabled] .btn-success, .btn-success.disabled:hover, .btn-success[disabled]:hover, fieldset[disabled] .btn-success:hover, .btn-success.disabled:focus, .btn-success[disabled]:focus, fieldset[disabled] .btn-success:focus, .btn-success.disabled:active, .btn-success[disabled]:active, fieldset[disabled] .btn-success:active, .btn-success.disabled.active, .btn-success[disabled].active, fieldset[disabled] .btn-success.active { background-color: #5cb85c; border-color: #4cae4c; } .btn-info { color: #ffffff; background-color: #5bc0de; border-color: #46b8da; } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { color: #ffffff; background-color: #39b3d7; border-color: #269abc; } .btn-info:active, .btn-info.active, .open .dropdown-toggle.btn-info { background-image: none; } .btn-info.disabled, .btn-info[disabled], fieldset[disabled] .btn-info, .btn-info.disabled:hover, .btn-info[disabled]:hover, fieldset[disabled] .btn-info:hover, .btn-info.disabled:focus, .btn-info[disabled]:focus, fieldset[disabled] .btn-info:focus, .btn-info.disabled:active, .btn-info[disabled]:active, fieldset[disabled] .btn-info:active, .btn-info.disabled.active, .btn-info[disabled].active, fieldset[disabled] .btn-info.active { background-color: #5bc0de; border-color: #46b8da; } .btn-link { font-weight: normal; color: #428bca; cursor: pointer; border-radius: 0; } .btn-link, .btn-link:active, .btn-link[disabled], fieldset[disabled] .btn-link { background-color: transparent; -webkit-box-shadow: none; box-shadow: none; } .btn-link, .btn-link:hover, .btn-link:focus, .btn-link:active { border-color: transparent; } .btn-link:hover, .btn-link:focus { color: #2a6496; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, fieldset[disabled] .btn-link:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:focus { color: #999999; text-decoration: none; } .btn-lg { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-sm, .btn-xs { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-xs { padding: 1px 5px; } .btn-block { display: block; width: 100%; padding-right: 0; padding-left: 0; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { display: none; } .collapse.in { display: block; } .collapsing { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; transition: height 0.35s ease; } @font-face { font-family: 'Glyphicons Halflings'; src: url('../fonts/glyphicons-halflings-regular.eot'); src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); } .glyphicon { position: relative; top: 1px; display: inline-block; font-family: 'Glyphicons Halflings'; -webkit-font-smoothing: antialiased; font-style: normal; font-weight: normal; line-height: 1; -moz-osx-font-smoothing: grayscale; } .glyphicon:empty { width: 1em; } .glyphicon-asterisk:before { content: "\2a"; } .glyphicon-plus:before { content: "\2b"; } .glyphicon-euro:before { content: "\20ac"; } .glyphicon-minus:before { content: "\2212"; } .glyphicon-cloud:before { content: "\2601"; } .glyphicon-envelope:before { content: "\2709"; } .glyphicon-pencil:before { content: "\270f"; } .glyphicon-glass:before { content: "\e001"; } .glyphicon-music:before { content: "\e002"; } .glyphicon-search:before { content: "\e003"; } .glyphicon-heart:before { content: "\e005"; } .glyphicon-star:before { content: "\e006"; } .glyphicon-star-empty:before { content: "\e007"; } .glyphicon-user:before { content: "\e008"; } .glyphicon-film:before { content: "\e009"; } .glyphicon-th-large:before { content: "\e010"; } .glyphicon-th:before { content: "\e011"; } .glyphicon-th-list:before { content: "\e012"; } .glyphicon-ok:before { content: "\e013"; } .glyphicon-remove:before { content: "\e014"; } .glyphicon-zoom-in:before { content: "\e015"; } .glyphicon-zoom-out:before { content: "\e016"; } .glyphicon-off:before { content: "\e017"; } .glyphicon-signal:before { content: "\e018"; } .glyphicon-cog:before { content: "\e019"; } .glyphicon-trash:before { content: "\e020"; } .glyphicon-home:before { content: "\e021"; } .glyphicon-file:before { content: "\e022"; } .glyphicon-time:before { content: "\e023"; } .glyphicon-road:before { content: "\e024"; } .glyphicon-download-alt:before { content: "\e025"; } .glyphicon-download:before { content: "\e026"; } .glyphicon-upload:before { content: "\e027"; } .glyphicon-inbox:before { content: "\e028"; } .glyphicon-play-circle:before { content: "\e029"; } .glyphicon-repeat:before { content: "\e030"; } .glyphicon-refresh:before { content: "\e031"; } .glyphicon-list-alt:before { content: "\e032"; } .glyphicon-lock:before { content: "\e033"; } .glyphicon-flag:before { content: "\e034"; } .glyphicon-headphones:before { content: "\e035"; } .glyphicon-volume-off:before { content: "\e036"; } .glyphicon-volume-down:before { content: "\e037"; } .glyphicon-volume-up:before { content: "\e038"; } .glyphicon-qrcode:before { content: "\e039"; } .glyphicon-barcode:before { content: "\e040"; } .glyphicon-tag:before { content: "\e041"; } .glyphicon-tags:before { content: "\e042"; } .glyphicon-book:before { content: "\e043"; } .glyphicon-bookmark:before { content: "\e044"; } .glyphicon-print:before { content: "\e045"; } .glyphicon-camera:before { content: "\e046"; } .glyphicon-font:before { content: "\e047"; } .glyphicon-bold:before { content: "\e048"; } .glyphicon-italic:before { content: "\e049"; } .glyphicon-text-height:before { content: "\e050"; } .glyphicon-text-width:before { content: "\e051"; } .glyphicon-align-left:before { content: "\e052"; } .glyphicon-align-center:before { content: "\e053"; } .glyphicon-align-right:before { content: "\e054"; } .glyphicon-align-justify:before { content: "\e055"; } .glyphicon-list:before { content: "\e056"; } .glyphicon-indent-left:before { content: "\e057"; } .glyphicon-indent-right:before { content: "\e058"; } .glyphicon-facetime-video:before { content: "\e059"; } .glyphicon-picture:before { content: "\e060"; } .glyphicon-map-marker:before { content: "\e062"; } .glyphicon-adjust:before { content: "\e063"; } .glyphicon-tint:before { content: "\e064"; } .glyphicon-edit:before { content: "\e065"; } .glyphicon-share:before { content: "\e066"; } .glyphicon-check:before { content: "\e067"; } .glyphicon-move:before { content: "\e068"; } .glyphicon-step-backward:before { content: "\e069"; } .glyphicon-fast-backward:before { content: "\e070"; } .glyphicon-backward:before { content: "\e071"; } .glyphicon-play:before { content: "\e072"; } .glyphicon-pause:before { content: "\e073"; } .glyphicon-stop:before { content: "\e074"; } .glyphicon-forward:before { content: "\e075"; } .glyphicon-fast-forward:before { content: "\e076"; } .glyphicon-step-forward:before { content: "\e077"; } .glyphicon-eject:before { content: "\e078"; } .glyphicon-chevron-left:before { content: "\e079"; } .glyphicon-chevron-right:before { content: "\e080"; } .glyphicon-plus-sign:before { content: "\e081"; } .glyphicon-minus-sign:before { content: "\e082"; } .glyphicon-remove-sign:before { content: "\e083"; } .glyphicon-ok-sign:before { content: "\e084"; } .glyphicon-question-sign:before { content: "\e085"; } .glyphicon-info-sign:before { content: "\e086"; } .glyphicon-screenshot:before { content: "\e087"; } .glyphicon-remove-circle:before { content: "\e088"; } .glyphicon-ok-circle:before { content: "\e089"; } .glyphicon-ban-circle:before { content: "\e090"; } .glyphicon-arrow-left:before { content: "\e091"; } .glyphicon-arrow-right:before { content: "\e092"; } .glyphicon-arrow-up:before { content: "\e093"; } .glyphicon-arrow-down:before { content: "\e094"; } .glyphicon-share-alt:before { content: "\e095"; } .glyphicon-resize-full:before { content: "\e096"; } .glyphicon-resize-small:before { content: "\e097"; } .glyphicon-exclamation-sign:before { content: "\e101"; } .glyphicon-gift:before { content: "\e102"; } .glyphicon-leaf:before { content: "\e103"; } .glyphicon-fire:before { content: "\e104"; } .glyphicon-eye-open:before { content: "\e105"; } .glyphicon-eye-close:before { content: "\e106"; } .glyphicon-warning-sign:before { content: "\e107"; } .glyphicon-plane:before { content: "\e108"; } .glyphicon-calendar:before { content: "\e109"; } .glyphicon-random:before { content: "\e110"; } .glyphicon-comment:before { content: "\e111"; } .glyphicon-magnet:before { content: "\e112"; } .glyphicon-chevron-up:before { content: "\e113"; } .glyphicon-chevron-down:before { content: "\e114"; } .glyphicon-retweet:before { content: "\e115"; } .glyphicon-shopping-cart:before { content: "\e116"; } .glyphicon-folder-close:before { content: "\e117"; } .glyphicon-folder-open:before { content: "\e118"; } .glyphicon-resize-vertical:before { content: "\e119"; } .glyphicon-resize-horizontal:before { content: "\e120"; } .glyphicon-hdd:before { content: "\e121"; } .glyphicon-bullhorn:before { content: "\e122"; } .glyphicon-bell:before { content: "\e123"; } .glyphicon-certificate:before { content: "\e124"; } .glyphicon-thumbs-up:before { content: "\e125"; } .glyphicon-thumbs-down:before { content: "\e126"; } .glyphicon-hand-right:before { content: "\e127"; } .glyphicon-hand-left:before { content: "\e128"; } .glyphicon-hand-up:before { content: "\e129"; } .glyphicon-hand-down:before { content: "\e130"; } .glyphicon-circle-arrow-right:before { content: "\e131"; } .glyphicon-circle-arrow-left:before { content: "\e132"; } .glyphicon-circle-arrow-up:before { content: "\e133"; } .glyphicon-circle-arrow-down:before { content: "\e134"; } .glyphicon-globe:before { content: "\e135"; } .glyphicon-wrench:before { content: "\e136"; } .glyphicon-tasks:before { content: "\e137"; } .glyphicon-filter:before { content: "\e138"; } .glyphicon-briefcase:before { content: "\e139"; } .glyphicon-fullscreen:before { content: "\e140"; } .glyphicon-dashboard:before { content: "\e141"; } .glyphicon-paperclip:before { content: "\e142"; } .glyphicon-heart-empty:before { content: "\e143"; } .glyphicon-link:before { content: "\e144"; } .glyphicon-phone:before { content: "\e145"; } .glyphicon-pushpin:before { content: "\e146"; } .glyphicon-usd:before { content: "\e148"; } .glyphicon-gbp:before { content: "\e149"; } .glyphicon-sort:before { content: "\e150"; } .glyphicon-sort-by-alphabet:before { content: "\e151"; } .glyphicon-sort-by-alphabet-alt:before { content: "\e152"; } .glyphicon-sort-by-order:before { content: "\e153"; } .glyphicon-sort-by-order-alt:before { content: "\e154"; } .glyphicon-sort-by-attributes:before { content: "\e155"; } .glyphicon-sort-by-attributes-alt:before { content: "\e156"; } .glyphicon-unchecked:before { content: "\e157"; } .glyphicon-expand:before { content: "\e158"; } .glyphicon-collapse-down:before { content: "\e159"; } .glyphicon-collapse-up:before { content: "\e160"; } .glyphicon-log-in:before { content: "\e161"; } .glyphicon-flash:before { content: "\e162"; } .glyphicon-log-out:before { content: "\e163"; } .glyphicon-new-window:before { content: "\e164"; } .glyphicon-record:before { content: "\e165"; } .glyphicon-save:before { content: "\e166"; } .glyphicon-open:before { content: "\e167"; } .glyphicon-saved:before { content: "\e168"; } .glyphicon-import:before { content: "\e169"; } .glyphicon-export:before { content: "\e170"; } .glyphicon-send:before { content: "\e171"; } .glyphicon-floppy-disk:before { content: "\e172"; } .glyphicon-floppy-saved:before { content: "\e173"; } .glyphicon-floppy-remove:before { content: "\e174"; } .glyphicon-floppy-save:before { content: "\e175"; } .glyphicon-floppy-open:before { content: "\e176"; } .glyphicon-credit-card:before { content: "\e177"; } .glyphicon-transfer:before { content: "\e178"; } .glyphicon-cutlery:before { content: "\e179"; } .glyphicon-header:before { content: "\e180"; } .glyphicon-compressed:before { content: "\e181"; } .glyphicon-earphone:before { content: "\e182"; } .glyphicon-phone-alt:before { content: "\e183"; } .glyphicon-tower:before { content: "\e184"; } .glyphicon-stats:before { content: "\e185"; } .glyphicon-sd-video:before { content: "\e186"; } .glyphicon-hd-video:before { content: "\e187"; } .glyphicon-subtitles:before { content: "\e188"; } .glyphicon-sound-stereo:before { content: "\e189"; } .glyphicon-sound-dolby:before { content: "\e190"; } .glyphicon-sound-5-1:before { content: "\e191"; } .glyphicon-sound-6-1:before { content: "\e192"; } .glyphicon-sound-7-1:before { content: "\e193"; } .glyphicon-copyright-mark:before { content: "\e194"; } .glyphicon-registration-mark:before { content: "\e195"; } .glyphicon-cloud-download:before { content: "\e197"; } .glyphicon-cloud-upload:before { content: "\e198"; } .glyphicon-tree-conifer:before { content: "\e199"; } .glyphicon-tree-deciduous:before { content: "\e200"; } .caret { display: inline-block; width: 0; height: 0; margin-left: 2px; vertical-align: middle; border-top: 4px solid #000000; border-right: 4px solid transparent; border-bottom: 0 dotted; border-left: 4px solid transparent; } .dropdown { position: relative; } .dropdown-toggle:focus { outline: 0; } .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; font-size: 14px; list-style: none; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.15); border-radius: 4px; -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 1.428571429; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus { color: #262626; text-decoration: none; background-color: #f5f5f5; } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; background-color: #428bca; outline: 0; } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #999999; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; cursor: not-allowed; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled=false); } .open > .dropdown-menu { display: block; } .open > a { outline: 0; } .dropdown-header { display: block; padding: 3px 20px; font-size: 12px; line-height: 1.428571429; color: #999999; } .dropdown-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 990; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0 dotted; border-bottom: 4px solid #000000; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } @media (min-width: 768px) { .navbar-right .dropdown-menu { right: 0; left: auto; } } .btn-default .caret { border-top-color: #333333; } .btn-primary .caret, .btn-success .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret { border-top-color: #fff; } .dropup .btn-default .caret { border-bottom-color: #333333; } .dropup .btn-primary .caret, .dropup .btn-success .caret, .dropup .btn-warning .caret, .dropup .btn-danger .caret, .dropup .btn-info .caret { border-bottom-color: #fff; } .btn-group, .btn-group-vertical { position: relative; display: inline-block; vertical-align: middle; } .btn-group > .btn, .btn-group-vertical > .btn { position: relative; float: left; } .btn-group > .btn:hover, .btn-group-vertical > .btn:hover, .btn-group > .btn:focus, .btn-group-vertical > .btn:focus, .btn-group > .btn:active, .btn-group-vertical > .btn:active, .btn-group > .btn.active, .btn-group-vertical > .btn.active { z-index: 2; } .btn-group > .btn:focus, .btn-group-vertical > .btn:focus { outline: none; } .btn-group .btn + .btn, .btn-group .btn + .btn-group, .btn-group .btn-group + .btn, .btn-group .btn-group + .btn-group { margin-left: -1px; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar:before, .btn-toolbar:after { display: table; content: " "; } .btn-toolbar:after { clear: both; } .btn-toolbar .btn-group { float: left; } .btn-toolbar > .btn + .btn, .btn-toolbar > .btn-group + .btn, .btn-toolbar > .btn + .btn-group, .btn-toolbar > .btn-group + .btn-group { margin-left: 5px; } .btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { border-radius: 0; } .btn-group > .btn:first-child { margin-left: 0; } .btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn:last-child:not(:first-child), .btn-group > .dropdown-toggle:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group > .btn-group { float: left; } .btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group > .btn-group:first-child > .btn:last-child, .btn-group > .btn-group:first-child > .dropdown-toggle { border-top-right-radius: 0; border-bottom-right-radius: 0; } .btn-group > .btn-group:last-child > .btn:first-child { border-bottom-left-radius: 0; border-top-left-radius: 0; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group-xs > .btn { padding: 5px 10px; padding: 1px 5px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-sm > .btn { padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } .btn-group-lg > .btn { padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } .btn-group > .btn + .dropdown-toggle { padding-right: 8px; padding-left: 8px; } .btn-group > .btn-lg + .dropdown-toggle { padding-right: 12px; padding-left: 12px; } .btn-group.open .dropdown-toggle { -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); } .btn-group.open .dropdown-toggle.btn-link { -webkit-box-shadow: none; box-shadow: none; } .btn .caret { margin-left: 0; } .btn-lg .caret { border-width: 5px 5px 0; border-bottom-width: 0; } .dropup .btn-lg .caret { border-width: 0 5px 5px; } .btn-group-vertical > .btn, .btn-group-vertical > .btn-group { display: block; float: none; width: 100%; max-width: 100%; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group:before, .btn-group-vertical > .btn-group:after { display: table; content: " "; } .btn-group-vertical > .btn-group:after { clear: both; } .btn-group-vertical > .btn-group > .btn { float: none; } .btn-group-vertical > .btn + .btn, .btn-group-vertical > .btn + .btn-group, .btn-group-vertical > .btn-group + .btn, .btn-group-vertical > .btn-group + .btn-group { margin-top: -1px; margin-left: 0; } .btn-group-vertical > .btn:not(:first-child):not(:last-child) { border-radius: 0; } .btn-group-vertical > .btn:first-child:not(:last-child) { border-top-right-radius: 4px; border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn:last-child:not(:first-child) { border-top-right-radius: 0; border-bottom-left-radius: 4px; border-top-left-radius: 0; } .btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { border-radius: 0; } .btn-group-vertical > .btn-group:first-child > .btn:last-child, .btn-group-vertical > .btn-group:first-child > .dropdown-toggle { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .btn-group-vertical > .btn-group:last-child > .btn:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .btn-group-justified { display: table; width: 100%; border-collapse: separate; table-layout: fixed; } .btn-group-justified .btn { display: table-cell; float: none; width: 1%; } [data-toggle="buttons"] > .btn > input[type="radio"], [data-toggle="buttons"] > .btn > input[type="checkbox"] { display: none; } .input-group { position: relative; display: table; border-collapse: separate; } .input-group.col { float: none; padding-right: 0; padding-left: 0; } .input-group .form-control { width: 100%; margin-bottom: 0; } .input-group-lg > .form-control, .input-group-lg > .input-group-addon, .input-group-lg > .input-group-btn > .btn { height: 45px; padding: 10px 16px; font-size: 18px; line-height: 1.33; border-radius: 6px; } select.input-group-lg > .form-control, select.input-group-lg > .input-group-addon, select.input-group-lg > .input-group-btn > .btn { height: 45px; line-height: 45px; } textarea.input-group-lg > .form-control, textarea.input-group-lg > .input-group-addon, textarea.input-group-lg > .input-group-btn > .btn { height: auto; } .input-group-sm > .form-control, .input-group-sm > .input-group-addon, .input-group-sm > .input-group-btn > .btn { height: 30px; padding: 5px 10px; font-size: 12px; line-height: 1.5; border-radius: 3px; } select.input-group-sm > .form-control, select.input-group-sm > .input-group-addon, select.input-group-sm > .input-group-btn > .btn { height: 30px; line-height: 30px; } textarea.input-group-sm > .form-control, textarea.input-group-sm > .input-group-addon, textarea.input-group-sm > .input-group-btn > .btn { height: auto; } .input-group-addon, .input-group-btn, .input-group .form-control { display: table-cell; } .input-group-addon:not(:first-child):not(:last-child), .input-group-btn:not(:first-child):not(:last-child), .input-group .form-control:not(:first-child):not(:last-child) { border-radius: 0; } .input-group-addon, .input-group-btn { width: 1%; white-space: nowrap; vertical-align: middle; } .input-group-addon { padding: 6px 12px; font-size: 14px; font-weight: normal; line-height: 1; color: #555555; text-align: center; background-color: #eeeeee; border: 1px solid #cccccc; border-radius: 4px; } .input-group-addon.input-sm { padding: 5px 10px; font-size: 12px; border-radius: 3px; } .input-group-addon.input-lg { padding: 10px 16px; font-size: 18px; border-radius: 6px; } .input-group-addon input[type="radio"], .input-group-addon input[type="checkbox"] { margin-top: 0; } .input-group .form-control:first-child, .input-group-addon:first-child, .input-group-btn:first-child > .btn, .input-group-btn:first-child > .dropdown-toggle, .input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle) { border-top-right-radius: 0; border-bottom-right-radius: 0; } .input-group-addon:first-child { border-right: 0; } .input-group .form-control:last-child, .input-group-addon:last-child, .input-group-btn:last-child > .btn, .input-group-btn:last-child > .dropdown-toggle, .input-group-btn:first-child > .btn:not(:first-child) { border-bottom-left-radius: 0; border-top-left-radius: 0; } .input-group-addon:last-child { border-left: 0; } .input-group-btn { position: relative; white-space: nowrap; } .input-group-btn:first-child > .btn { margin-right: -1px; } .input-group-btn:last-child > .btn { margin-left: -1px; } .input-group-btn > .btn { position: relative; } .input-group-btn > .btn + .btn { margin-left: -4px; } .input-group-btn > .btn:hover, .input-group-btn > .btn:active { z-index: 2; } .nav { padding-left: 0; margin-bottom: 0; list-style: none; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav:before, .nav:after { display: table; content: " "; } .nav:after { clear: both; } .nav > li { position: relative; display: block; } .nav > li > a { position: relative; display: block; padding: 10px 15px; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li.disabled > a { color: #999999; } .nav > li.disabled > a:hover, .nav > li.disabled > a:focus { color: #999999; text-decoration: none; cursor: not-allowed; background-color: transparent; } .nav .open > a, .nav .open > a:hover, .nav .open > a:focus { background-color: #eeeeee; border-color: #428bca; } .nav .open > a .caret, .nav .open > a:hover .caret, .nav .open > a:focus .caret { border-top-color: #2a6496; border-bottom-color: #2a6496; } .nav .nav-divider { height: 1px; margin: 9px 0; overflow: hidden; background-color: #e5e5e5; } .nav > li > a > img { max-width: none; } .nav-tabs { border-bottom: 1px solid #dddddd; } .nav-tabs > li { float: left; margin-bottom: -1px; } .nav-tabs > li > a { margin-right: 2px; line-height: 1.428571429; border: 1px solid transparent; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover { border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus { color: #555555; cursor: default; background-color: #ffffff; border: 1px solid #dddddd; border-bottom-color: transparent; } .nav-tabs.nav-justified { width: 100%; border-bottom: 0; } .nav-tabs.nav-justified > li { float: none; } .nav-tabs.nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-tabs.nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-tabs.nav-justified > li { display: table-cell; width: 1%; } .nav-tabs.nav-justified > li > a { margin-bottom: 0; } } .nav-tabs.nav-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs.nav-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs.nav-justified > .active > a, .nav-tabs.nav-justified > .active > a:hover, .nav-tabs.nav-justified > .active > a:focus { border-bottom-color: #ffffff; } } .nav-pills > li { float: left; } .nav-pills > li > a { border-radius: 4px; } .nav-pills > li + li { margin-left: 2px; } .nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus { color: #ffffff; background-color: #428bca; } .nav-pills > li.active > a .caret, .nav-pills > li.active > a:hover .caret, .nav-pills > li.active > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .nav-stacked > li { float: none; } .nav-stacked > li + li { margin-top: 2px; margin-left: 0; } .nav-justified { width: 100%; } .nav-justified > li { float: none; } .nav-justified > li > a { margin-bottom: 5px; text-align: center; } .nav-justified > .dropdown .dropdown-menu { top: auto; left: auto; } @media (min-width: 768px) { .nav-justified > li { display: table-cell; width: 1%; } .nav-justified > li > a { margin-bottom: 0; } } .nav-tabs-justified { border-bottom: 0; } .nav-tabs-justified > li > a { margin-right: 0; border-radius: 4px; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border: 1px solid #dddddd; } @media (min-width: 768px) { .nav-tabs-justified > li > a { border-bottom: 1px solid #dddddd; border-radius: 4px 4px 0 0; } .nav-tabs-justified > .active > a, .nav-tabs-justified > .active > a:hover, .nav-tabs-justified > .active > a:focus { border-bottom-color: #ffffff; } } .tab-content > .tab-pane { display: none; } .tab-content > .active { display: block; } .nav .caret { border-top-color: #428bca; border-bottom-color: #428bca; } .nav a:hover .caret { border-top-color: #2a6496; border-bottom-color: #2a6496; } .nav-tabs .dropdown-menu { margin-top: -1px; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar { position: relative; min-height: 50px; margin-bottom: 20px; border: 1px solid transparent; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } .navbar:before, .navbar:after { display: table; content: " "; } .navbar:after { clear: both; } @media (min-width: 768px) { .navbar { border-radius: 4px; } } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } .navbar-header:before, .navbar-header:after { display: table; content: " "; } .navbar-header:after { clear: both; } @media (min-width: 768px) { .navbar-header { float: left; } } .navbar-collapse { max-height: 340px; padding-right: 15px; padding-left: 15px; overflow-x: visible; border-top: 1px solid transparent; box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1); -webkit-overflow-scrolling: touch; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse:before, .navbar-collapse:after { display: table; content: " "; } .navbar-collapse:after { clear: both; } .navbar-collapse.in { overflow-y: auto; } @media (min-width: 768px) { .navbar-collapse { width: auto; border-top: 0; box-shadow: none; } .navbar-collapse.collapse { display: block !important; height: auto !important; padding-bottom: 0; overflow: visible !important; } .navbar-collapse.in { overflow-y: auto; } .navbar-collapse .navbar-nav.navbar-left:first-child { margin-left: -15px; } .navbar-collapse .navbar-nav.navbar-right:last-child { margin-right: -15px; } .navbar-collapse .navbar-text:last-child { margin-right: 0; } } .container > .navbar-header, .container > .navbar-collapse { margin-right: -15px; margin-left: -15px; } @media (min-width: 768px) { .container > .navbar-header, .container > .navbar-collapse { margin-right: 0; margin-left: 0; } } .navbar-static-top { z-index: 1000; border-width: 0 0 1px; } @media (min-width: 768px) { .navbar-static-top { border-radius: 0; } } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; } @media (min-width: 768px) { .navbar-fixed-top, .navbar-fixed-bottom { border-radius: 0; } } .navbar-fixed-top { top: 0; border-width: 0 0 1px; } .navbar-fixed-bottom { bottom: 0; margin-bottom: 0; border-width: 1px 0 0; } .navbar-brand { float: left; padding: 15px 15px; font-size: 18px; line-height: 20px; } .navbar-brand:hover, .navbar-brand:focus { text-decoration: none; } @media (min-width: 768px) { .navbar > .container .navbar-brand { margin-left: -15px; } } .navbar-toggle { position: relative; float: right; padding: 9px 10px; margin-top: 8px; margin-right: 15px; margin-bottom: 8px; background-color: transparent; border: 1px solid transparent; border-radius: 4px; } .navbar-toggle .icon-bar { display: block; width: 22px; height: 2px; border-radius: 1px; } .navbar-toggle .icon-bar + .icon-bar { margin-top: 4px; } @media (min-width: 768px) { .navbar-toggle { display: none; } } .navbar-nav { margin: 7.5px -15px; } .navbar-nav > li > a { padding-top: 10px; padding-bottom: 10px; line-height: 20px; } @media (max-width: 767px) { .navbar-nav .open .dropdown-menu { position: static; float: none; width: auto; margin-top: 0; background-color: transparent; border: 0; box-shadow: none; } .navbar-nav .open .dropdown-menu > li > a, .navbar-nav .open .dropdown-menu .dropdown-header { padding: 5px 15px 5px 25px; } .navbar-nav .open .dropdown-menu > li > a { line-height: 20px; } .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus { background-image: none; } } @media (min-width: 768px) { .navbar-nav { float: left; margin: 0; } .navbar-nav > li { float: left; } .navbar-nav > li > a { padding-top: 15px; padding-bottom: 15px; } } @media (min-width: 768px) { .navbar-left { float: left !important; } .navbar-right { float: right !important; } } .navbar-form { padding: 10px 15px; margin-top: 8px; margin-right: -15px; margin-bottom: 8px; margin-left: -15px; border-top: 1px solid transparent; border-bottom: 1px solid transparent; -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); } @media (min-width: 768px) { .navbar-form .form-group { display: inline-block; margin-bottom: 0; vertical-align: middle; } .navbar-form .form-control { display: inline-block; } .navbar-form .radio, .navbar-form .checkbox { display: inline-block; padding-left: 0; margin-top: 0; margin-bottom: 0; } .navbar-form .radio input[type="radio"], .navbar-form .checkbox input[type="checkbox"] { float: none; margin-left: 0; } } @media (max-width: 767px) { .navbar-form .form-group { margin-bottom: 5px; } } @media (min-width: 768px) { .navbar-form { width: auto; padding-top: 0; padding-bottom: 0; margin-right: 0; margin-left: 0; border: 0; -webkit-box-shadow: none; box-shadow: none; } } .navbar-nav > li > .dropdown-menu { margin-top: 0; border-top-right-radius: 0; border-top-left-radius: 0; } .navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { border-bottom-right-radius: 0; border-bottom-left-radius: 0; } .navbar-nav.pull-right > li > .dropdown-menu, .navbar-nav > li > .dropdown-menu.pull-right { right: 0; left: auto; } .navbar-btn { margin-top: 8px; margin-bottom: 8px; } .navbar-text { float: left; margin-top: 15px; margin-bottom: 15px; } @media (min-width: 768px) { .navbar-text { margin-right: 15px; margin-left: 15px; } } .navbar-default { background-color: #f8f8f8; border-color: #e7e7e7; } .navbar-default .navbar-brand { color: #777777; } .navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus { color: #5e5e5e; background-color: transparent; } .navbar-default .navbar-text { color: #777777; } .navbar-default .navbar-nav > li > a { color: #777777; } .navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus { color: #cccccc; background-color: transparent; } .navbar-default .navbar-toggle { border-color: #dddddd; } .navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus { background-color: #dddddd; } .navbar-default .navbar-toggle .icon-bar { background-color: #cccccc; } .navbar-default .navbar-collapse, .navbar-default .navbar-form { border-color: #e7e7e7; } .navbar-default .navbar-nav > .dropdown > a:hover .caret, .navbar-default .navbar-nav > .dropdown > a:focus .caret { border-top-color: #333333; border-bottom-color: #333333; } .navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav > .open > a .caret, .navbar-default .navbar-nav > .open > a:hover .caret, .navbar-default .navbar-nav > .open > a:focus .caret { border-top-color: #555555; border-bottom-color: #555555; } .navbar-default .navbar-nav > .dropdown > a .caret { border-top-color: #777777; border-bottom-color: #777777; } @media (max-width: 767px) { .navbar-default .navbar-nav .open .dropdown-menu > li > a { color: #777777; } .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { color: #333333; background-color: transparent; } .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { color: #555555; background-color: #e7e7e7; } .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #cccccc; background-color: transparent; } } .navbar-default .navbar-link { color: #777777; } .navbar-default .navbar-link:hover { color: #333333; } .navbar-inverse { background-color: #222222; border-color: #080808; } .navbar-inverse .navbar-brand { color: #999999; } .navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-text { color: #999999; } .navbar-inverse .navbar-nav > li > a { color: #999999; } .navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus { color: #444444; background-color: transparent; } .navbar-inverse .navbar-toggle { border-color: #333333; } .navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus { background-color: #333333; } .navbar-inverse .navbar-toggle .icon-bar { background-color: #ffffff; } .navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { border-color: #101010; } .navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav > .dropdown > a:hover .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-inverse .navbar-nav > .dropdown > a .caret { border-top-color: #999999; border-bottom-color: #999999; } .navbar-inverse .navbar-nav > .open > a .caret, .navbar-inverse .navbar-nav > .open > a:hover .caret, .navbar-inverse .navbar-nav > .open > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } @media (max-width: 767px) { .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { border-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { color: #999999; } .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { color: #ffffff; background-color: transparent; } .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { color: #ffffff; background-color: #080808; } .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { color: #444444; background-color: transparent; } } .navbar-inverse .navbar-link { color: #999999; } .navbar-inverse .navbar-link:hover { color: #ffffff; } .breadcrumb { padding: 8px 15px; margin-bottom: 20px; list-style: none; background-color: #f5f5f5; border-radius: 4px; } .breadcrumb > li { display: inline-block; } .breadcrumb > li + li:before { padding: 0 5px; color: #cccccc; content: "/\00a0"; } .breadcrumb > .active { color: #999999; } .pagination { display: inline-block; padding-left: 0; margin: 20px 0; border-radius: 4px; } .pagination > li { display: inline; } .pagination > li > a, .pagination > li > span { position: relative; float: left; padding: 6px 12px; margin-left: -1px; line-height: 1.428571429; text-decoration: none; background-color: #ffffff; border: 1px solid #dddddd; } .pagination > li:first-child > a, .pagination > li:first-child > span { margin-left: 0; border-bottom-left-radius: 4px; border-top-left-radius: 4px; } .pagination > li:last-child > a, .pagination > li:last-child > span { border-top-right-radius: 4px; border-bottom-right-radius: 4px; } .pagination > li > a:hover, .pagination > li > span:hover, .pagination > li > a:focus, .pagination > li > span:focus { background-color: #eeeeee; } .pagination > .active > a, .pagination > .active > span, .pagination > .active > a:hover, .pagination > .active > span:hover, .pagination > .active > a:focus, .pagination > .active > span:focus { z-index: 2; color: #ffffff; cursor: default; background-color: #428bca; border-color: #428bca; } .pagination > .disabled > span, .pagination > .disabled > span:hover, .pagination > .disabled > span:focus, .pagination > .disabled > a, .pagination > .disabled > a:hover, .pagination > .disabled > a:focus { color: #999999; cursor: not-allowed; background-color: #ffffff; border-color: #dddddd; } .pagination-lg > li > a, .pagination-lg > li > span { padding: 10px 16px; font-size: 18px; } .pagination-lg > li:first-child > a, .pagination-lg > li:first-child > span { border-bottom-left-radius: 6px; border-top-left-radius: 6px; } .pagination-lg > li:last-child > a, .pagination-lg > li:last-child > span { border-top-right-radius: 6px; border-bottom-right-radius: 6px; } .pagination-sm > li > a, .pagination-sm > li > span { padding: 5px 10px; font-size: 12px; } .pagination-sm > li:first-child > a, .pagination-sm > li:first-child > span { border-bottom-left-radius: 3px; border-top-left-radius: 3px; } .pagination-sm > li:last-child > a, .pagination-sm > li:last-child > span { border-top-right-radius: 3px; border-bottom-right-radius: 3px; } .pager { padding-left: 0; margin: 20px 0; text-align: center; list-style: none; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager:before, .pager:after { display: table; content: " "; } .pager:after { clear: both; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #eeeeee; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #999999; cursor: not-allowed; background-color: #ffffff; } .label { display: inline; padding: .2em .6em .3em; font-size: 75%; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; border-radius: .25em; } .label[href]:hover, .label[href]:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label:empty { display: none; } .label-default { background-color: #999999; } .label-default[href]:hover, .label-default[href]:focus { background-color: #808080; } .label-primary { background-color: #428bca; } .label-primary[href]:hover, .label-primary[href]:focus { background-color: #3071a9; } .label-success { background-color: #5cb85c; } .label-success[href]:hover, .label-success[href]:focus { background-color: #449d44; } .label-info { background-color: #5bc0de; } .label-info[href]:hover, .label-info[href]:focus { background-color: #31b0d5; } .label-warning { background-color: #f0ad4e; } .label-warning[href]:hover, .label-warning[href]:focus { background-color: #ec971f; } .label-danger { background-color: #d9534f; } .label-danger[href]:hover, .label-danger[href]:focus { background-color: #c9302c; } .badge { display: inline-block; min-width: 10px; padding: 3px 7px; font-size: 12px; font-weight: bold; line-height: 1; color: #ffffff; text-align: center; white-space: nowrap; vertical-align: baseline; background-color: #999999; border-radius: 10px; } .badge:empty { display: none; } a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .btn .badge { position: relative; top: -1px; } a.list-group-item.active > .badge, .nav-pills > .active > a > .badge { color: #428bca; background-color: #ffffff; } .nav-pills > li > a > .badge { margin-left: 3px; } .jumbotron { padding: 30px; margin-bottom: 30px; font-size: 21px; font-weight: 200; line-height: 2.1428571435; color: inherit; background-color: #eeeeee; } .jumbotron h1 { line-height: 1; color: inherit; } .jumbotron p { line-height: 1.4; } .container .jumbotron { border-radius: 6px; } @media screen and (min-width: 768px) { .jumbotron { padding-top: 48px; padding-bottom: 48px; } .container .jumbotron { padding-right: 60px; padding-left: 60px; } .jumbotron h1 { font-size: 63px; } } .thumbnail { display: inline-block; display: block; height: auto; max-width: 100%; padding: 4px; margin-bottom: 20px; line-height: 1.428571429; background-color: #ffffff; border: 1px solid #dddddd; border-radius: 4px; -webkit-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } .thumbnail > img { display: block; height: auto; max-width: 100%; margin-right: auto; margin-left: auto; } a.thumbnail:hover, a.thumbnail:focus, a.thumbnail.active { border-color: #428bca; } .thumbnail .caption { padding: 9px; color: #333333; } .alert { padding: 15px; margin-bottom: 20px; border: 1px solid transparent; border-radius: 4px; } .alert h4 { margin-top: 0; color: inherit; } .alert .alert-link { font-weight: bold; } .alert > p, .alert > ul { margin-bottom: 0; } .alert > p + p { margin-top: 5px; } .alert-dismissable { padding-right: 35px; } .alert-dismissable .close { position: relative; top: -2px; right: -21px; color: inherit; } .alert-success { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .alert-success hr { border-top-color: #c9e2b3; } .alert-success .alert-link { color: #356635; } .alert-info { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .alert-info hr { border-top-color: #a6e1ec; } .alert-info .alert-link { color: #2d6987; } .alert-warning { color: #c09853; background-color: #fcf8e3; border-color: #faebcc; } .alert-warning hr { border-top-color: #f7e1b5; } .alert-warning .alert-link { color: #a47e3c; } .alert-danger { color: #b94a48; background-color: #f2dede; border-color: #ebccd1; } .alert-danger hr { border-top-color: #e4b9c0; } .alert-danger .alert-link { color: #953b39; } @-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; } } @-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: #f5f5f5; border-radius: 4px; -webkit-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; line-height: 20px; color: #ffffff; text-align: center; background-color: #428bca; -webkit-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-transition: width 0.6s ease; transition: width 0.6s ease; } .progress-striped .progress-bar { 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: 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-size: 40px 40px; } .progress.active .progress-bar { -webkit-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-bar-success { background-color: #5cb85c; } .progress-striped .progress-bar-success { 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: 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-bar-info { background-color: #5bc0de; } .progress-striped .progress-bar-info { 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: 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-bar-warning { background-color: #f0ad4e; } .progress-striped .progress-bar-warning { 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: 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-bar-danger { background-color: #d9534f; } .progress-striped .progress-bar-danger { 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: 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); } .media, .media-body { overflow: hidden; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { padding-left: 0; list-style: none; } .list-group { padding-left: 0; margin-bottom: 20px; } .list-group-item { position: relative; display: block; padding: 10px 15px; margin-bottom: -1px; background-color: #ffffff; border: 1px solid #dddddd; } .list-group-item:first-child { border-top-right-radius: 4px; border-top-left-radius: 4px; } .list-group-item:last-child { margin-bottom: 0; border-bottom-right-radius: 4px; border-bottom-left-radius: 4px; } .list-group-item > .badge { float: right; } .list-group-item > .badge + .badge { margin-right: 5px; } a.list-group-item { color: #555555; } a.list-group-item .list-group-item-heading { color: #333333; } a.list-group-item:hover, a.list-group-item:focus { text-decoration: none; background-color: #f5f5f5; } a.list-group-item.active, a.list-group-item.active:hover, a.list-group-item.active:focus { z-index: 2; color: #ffffff; background-color: #428bca; border-color: #428bca; } a.list-group-item.active .list-group-item-heading, a.list-group-item.active:hover .list-group-item-heading, a.list-group-item.active:focus .list-group-item-heading { color: inherit; } a.list-group-item.active .list-group-item-text, a.list-group-item.active:hover .list-group-item-text, a.list-group-item.active:focus .list-group-item-text { color: #e1edf7; } .list-group-item-heading { margin-top: 0; margin-bottom: 5px; } .list-group-item-text { margin-bottom: 0; line-height: 1.3; } .panel { margin-bottom: 20px; background-color: #ffffff; border: 1px solid transparent; border-radius: 4px; -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05); } .panel-body { padding: 15px; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel-body:before, .panel-body:after { display: table; content: " "; } .panel-body:after { clear: both; } .panel > .list-group { margin-bottom: 0; } .panel > .list-group .list-group-item { border-width: 1px 0; } .panel > .list-group .list-group-item:first-child { border-top-right-radius: 0; border-top-left-radius: 0; } .panel > .list-group .list-group-item:last-child { border-bottom: 0; } .panel-heading + .list-group .list-group-item:first-child { border-top-width: 0; } .panel > .table, .panel > .table-responsive { margin-bottom: 0; } .panel > .panel-body + .table, .panel > .panel-body + .table-responsive { border-top: 1px solid #dddddd; } .panel > .table-bordered, .panel > .table-responsive > .table-bordered { border: 0; } .panel > .table-bordered > thead > tr > th:first-child, .panel > .table-responsive > .table-bordered > thead > tr > th:first-child, .panel > .table-bordered > tbody > tr > th:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, .panel > .table-bordered > tfoot > tr > th:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, .panel > .table-bordered > thead > tr > td:first-child, .panel > .table-responsive > .table-bordered > thead > tr > td:first-child, .panel > .table-bordered > tbody > tr > td:first-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, .panel > .table-bordered > tfoot > tr > td:first-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { border-left: 0; } .panel > .table-bordered > thead > tr > th:last-child, .panel > .table-responsive > .table-bordered > thead > tr > th:last-child, .panel > .table-bordered > tbody > tr > th:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, .panel > .table-bordered > tfoot > tr > th:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, .panel > .table-bordered > thead > tr > td:last-child, .panel > .table-responsive > .table-bordered > thead > tr > td:last-child, .panel > .table-bordered > tbody > tr > td:last-child, .panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, .panel > .table-bordered > tfoot > tr > td:last-child, .panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { border-right: 0; } .panel > .table-bordered > thead > tr:last-child > th, .panel > .table-responsive > .table-bordered > thead > tr:last-child > th, .panel > .table-bordered > tbody > tr:last-child > th, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, .panel > .table-bordered > tfoot > tr:last-child > th, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th, .panel > .table-bordered > thead > tr:last-child > td, .panel > .table-responsive > .table-bordered > thead > tr:last-child > td, .panel > .table-bordered > tbody > tr:last-child > td, .panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, .panel > .table-bordered > tfoot > tr:last-child > td, .panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td { border-bottom: 0; } .panel-heading { padding: 10px 15px; border-bottom: 1px solid transparent; border-top-right-radius: 3px; border-top-left-radius: 3px; } .panel-heading > .dropdown .dropdown-toggle { color: inherit; } .panel-title { margin-top: 0; margin-bottom: 0; font-size: 16px; } .panel-title > a { color: inherit; } .panel-footer { padding: 10px 15px; background-color: #f5f5f5; border-top: 1px solid #dddddd; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px; } .panel-group .panel { margin-bottom: 0; overflow: hidden; border-radius: 4px; } .panel-group .panel + .panel { margin-top: 5px; } .panel-group .panel-heading { border-bottom: 0; } .panel-group .panel-heading + .panel-collapse .panel-body { border-top: 1px solid #dddddd; } .panel-group .panel-footer { border-top: 0; } .panel-group .panel-footer + .panel-collapse .panel-body { border-bottom: 1px solid #dddddd; } .panel-default { border-color: #dddddd; } .panel-default > .panel-heading { color: #333333; background-color: #f5f5f5; border-color: #dddddd; } .panel-default > .panel-heading + .panel-collapse .panel-body { border-top-color: #dddddd; } .panel-default > .panel-heading > .dropdown .caret { border-color: #333333 transparent; } .panel-default > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #dddddd; } .panel-primary { border-color: #428bca; } .panel-primary > .panel-heading { color: #ffffff; background-color: #428bca; border-color: #428bca; } .panel-primary > .panel-heading + .panel-collapse .panel-body { border-top-color: #428bca; } .panel-primary > .panel-heading > .dropdown .caret { border-color: #ffffff transparent; } .panel-primary > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #428bca; } .panel-success { border-color: #d6e9c6; } .panel-success > .panel-heading { color: #468847; background-color: #dff0d8; border-color: #d6e9c6; } .panel-success > .panel-heading + .panel-collapse .panel-body { border-top-color: #d6e9c6; } .panel-success > .panel-heading > .dropdown .caret { border-color: #468847 transparent; } .panel-success > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #d6e9c6; } .panel-warning { border-color: #faebcc; } .panel-warning > .panel-heading { color: #c09853; background-color: #fcf8e3; border-color: #faebcc; } .panel-warning > .panel-heading + .panel-collapse .panel-body { border-top-color: #faebcc; } .panel-warning > .panel-heading > .dropdown .caret { border-color: #c09853 transparent; } .panel-warning > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #faebcc; } .panel-danger { border-color: #ebccd1; } .panel-danger > .panel-heading { color: #b94a48; background-color: #f2dede; border-color: #ebccd1; } .panel-danger > .panel-heading + .panel-collapse .panel-body { border-top-color: #ebccd1; } .panel-danger > .panel-heading > .dropdown .caret { border-color: #b94a48 transparent; } .panel-danger > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #ebccd1; } .panel-info { border-color: #bce8f1; } .panel-info > .panel-heading { color: #3a87ad; background-color: #d9edf7; border-color: #bce8f1; } .panel-info > .panel-heading + .panel-collapse .panel-body { border-top-color: #bce8f1; } .panel-info > .panel-heading > .dropdown .caret { border-color: #3a87ad transparent; } .panel-info > .panel-footer + .panel-collapse .panel-body { border-bottom-color: #bce8f1; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; border-radius: 4px; -webkit-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-lg { padding: 24px; border-radius: 6px; } .well-sm { padding: 9px; border-radius: 3px; } .close { float: right; font-size: 21px; font-weight: bold; line-height: 1; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.5; filter: alpha(opacity=50); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .modal-open { overflow: hidden; } .modal { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; display: none; overflow: auto; overflow-y: scroll; } .modal.fade .modal-dialog { -webkit-transform: translate(0, -25%); -ms-transform: translate(0, -25%); transform: translate(0, -25%); -webkit-transition: -webkit-transform 0.3s ease-out; -moz-transition: -moz-transform 0.3s ease-out; -o-transition: -o-transform 0.3s ease-out; transition: transform 0.3s ease-out; } .modal.in .modal-dialog { -webkit-transform: translate(0, 0); -ms-transform: translate(0, 0); transform: translate(0, 0); } .modal-dialog { position: relative; z-index: 1050; width: auto; padding: 10px; margin-right: auto; margin-left: auto; } .modal-content { position: relative; background-color: #ffffff; border: 1px solid #999999; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; outline: none; -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5); background-clip: padding-box; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1030; background-color: #000000; } .modal-backdrop.fade { opacity: 0; filter: alpha(opacity=0); } .modal-backdrop.in { opacity: 0.5; filter: alpha(opacity=50); } .modal-header { min-height: 16.428571429px; padding: 15px; border-bottom: 1px solid #e5e5e5; } .modal-header .close { margin-top: -2px; } .modal-title { margin: 0; line-height: 1.428571429; } .modal-body { position: relative; padding: 20px; } .modal-footer { padding: 19px 20px 20px; margin-top: 15px; text-align: right; border-top: 1px solid #e5e5e5; } .modal-footer:before, .modal-footer:after { display: table; content: " "; } .modal-footer:after { clear: both; } .modal-footer:before, .modal-footer:after { display: table; 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; } .modal-footer .btn-block + .btn-block { margin-left: 0; } @media screen and (min-width: 768px) { .modal-dialog { width: 600px; padding-top: 30px; padding-bottom: 30px; } .modal-content { -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5); } } .tooltip { position: absolute; z-index: 1030; display: block; font-size: 12px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); visibility: visible; } .tooltip.in { opacity: 0.9; filter: alpha(opacity=90); } .tooltip.top { padding: 5px 0; margin-top: -3px; } .tooltip.right { padding: 0 5px; margin-left: 3px; } .tooltip.bottom { padding: 5px 0; margin-top: 3px; } .tooltip.left { padding: 0 5px; margin-left: -3px; } .tooltip-inner { max-width: 200px; padding: 3px 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: #000000; 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.top-left .tooltip-arrow { bottom: 0; left: 5px; border-top-color: #000000; border-width: 5px 5px 0; } .tooltip.top-right .tooltip-arrow { right: 5px; bottom: 0; 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; } .tooltip.bottom-left .tooltip-arrow { top: 0; left: 5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .tooltip.bottom-right .tooltip-arrow { top: 0; right: 5px; border-bottom-color: #000000; border-width: 0 5px 5px; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; white-space: normal; background-color: #ffffff; border: 1px solid #cccccc; border: 1px solid rgba(0, 0, 0, 0.2); border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); background-clip: padding-box; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -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; border-radius: 5px 5px 0 0; } .popover-content { padding: 9px 14px; } .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: 11px; } .popover .arrow:after { border-width: 10px; content: ""; } .popover.top .arrow { bottom: -11px; left: 50%; margin-left: -11px; border-top-color: #999999; border-top-color: rgba(0, 0, 0, 0.25); border-bottom-width: 0; } .popover.top .arrow:after { bottom: 1px; margin-left: -10px; border-top-color: #ffffff; border-bottom-width: 0; content: " "; } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-right-color: #999999; border-right-color: rgba(0, 0, 0, 0.25); border-left-width: 0; } .popover.right .arrow:after { bottom: -10px; left: 1px; border-right-color: #ffffff; border-left-width: 0; content: " "; } .popover.bottom .arrow { top: -11px; left: 50%; margin-left: -11px; border-bottom-color: #999999; border-bottom-color: rgba(0, 0, 0, 0.25); border-top-width: 0; } .popover.bottom .arrow:after { top: 1px; margin-left: -10px; border-bottom-color: #ffffff; border-top-width: 0; content: " "; } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-left-color: #999999; border-left-color: rgba(0, 0, 0, 0.25); border-right-width: 0; } .popover.left .arrow:after { right: 1px; bottom: -10px; border-left-color: #ffffff; border-right-width: 0; content: " "; } .carousel { position: relative; } .carousel-inner { position: relative; width: 100%; overflow: hidden; } .carousel-inner > .item { position: relative; display: none; -webkit-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; height: auto; max-width: 100%; line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 0; bottom: 0; left: 0; width: 15%; font-size: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); opacity: 0.5; filter: alpha(opacity=50); } .carousel-control.left { background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.5)), to(rgba(0, 0, 0, 0.0001))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.5) 0), color-stop(rgba(0, 0, 0, 0.0001) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0, rgba(0, 0, 0, 0.0001) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); } .carousel-control.right { right: 0; left: auto; background-image: -webkit-gradient(linear, 0 top, 100% top, from(rgba(0, 0, 0, 0.0001)), to(rgba(0, 0, 0, 0.5))); background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, 0.0001) 0), color-stop(rgba(0, 0, 0, 0.5) 100%)); background-image: -moz-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0, rgba(0, 0, 0, 0.5) 100%); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); } .carousel-control:hover, .carousel-control:focus { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-control .icon-prev, .carousel-control .icon-next, .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right { position: absolute; top: 50%; z-index: 5; display: inline-block; } .carousel-control .icon-prev, .carousel-control .glyphicon-chevron-left { left: 50%; } .carousel-control .icon-next, .carousel-control .glyphicon-chevron-right { right: 50%; } .carousel-control .icon-prev, .carousel-control .icon-next { width: 20px; height: 20px; margin-top: -10px; margin-left: -10px; font-family: serif; } .carousel-control .icon-prev:before { content: '\2039'; } .carousel-control .icon-next:before { content: '\203a'; } .carousel-indicators { position: absolute; bottom: 10px; left: 50%; z-index: 15; width: 60%; padding-left: 0; margin-left: -30%; text-align: center; list-style: none; } .carousel-indicators li { display: inline-block; width: 10px; height: 10px; margin: 1px; text-indent: -999px; cursor: pointer; background-color: #000 \9; background-color: rgba(0, 0, 0, 0); border: 1px solid #ffffff; border-radius: 10px; } .carousel-indicators .active { width: 12px; height: 12px; margin: 0; background-color: #ffffff; } .carousel-caption { position: absolute; right: 15%; bottom: 20px; left: 15%; z-index: 10; padding-top: 20px; padding-bottom: 20px; color: #ffffff; text-align: center; text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6); } .carousel-caption .btn { text-shadow: none; } @media screen and (min-width: 768px) { .carousel-control .glyphicons-chevron-left, .carousel-control .glyphicons-chevron-right, .carousel-control .icon-prev, .carousel-control .icon-next { width: 30px; height: 30px; margin-top: -15px; margin-left: -15px; font-size: 30px; } .carousel-caption { right: 20%; left: 20%; padding-bottom: 30px; } .carousel-indicators { bottom: 20px; } } .clearfix:before, .clearfix:after { display: table; content: " "; } .clearfix:after { clear: both; } .center-block { display: block; margin-right: auto; margin-left: auto; } .pull-right { float: right !important; } .pull-left { float: left !important; } .hide { display: none !important; } .show { display: block !important; } .invisible { visibility: hidden; } .text-hide { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .hidden { display: none !important; visibility: hidden !important; } .affix { position: fixed; } @-ms-viewport { width: device-width; } .visible-xs, tr.visible-xs, th.visible-xs, td.visible-xs { display: none !important; } @media (max-width: 767px) { .visible-xs { display: block !important; } tr.visible-xs { display: table-row !important; } th.visible-xs, td.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-xs.visible-sm { display: block !important; } tr.visible-xs.visible-sm { display: table-row !important; } th.visible-xs.visible-sm, td.visible-xs.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-xs.visible-md { display: block !important; } tr.visible-xs.visible-md { display: table-row !important; } th.visible-xs.visible-md, td.visible-xs.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-xs.visible-lg { display: block !important; } tr.visible-xs.visible-lg { display: table-row !important; } th.visible-xs.visible-lg, td.visible-xs.visible-lg { display: table-cell !important; } } .visible-sm, tr.visible-sm, th.visible-sm, td.visible-sm { display: none !important; } @media (max-width: 767px) { .visible-sm.visible-xs { display: block !important; } tr.visible-sm.visible-xs { display: table-row !important; } th.visible-sm.visible-xs, td.visible-sm.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-sm { display: block !important; } tr.visible-sm { display: table-row !important; } th.visible-sm, td.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-sm.visible-md { display: block !important; } tr.visible-sm.visible-md { display: table-row !important; } th.visible-sm.visible-md, td.visible-sm.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-sm.visible-lg { display: block !important; } tr.visible-sm.visible-lg { display: table-row !important; } th.visible-sm.visible-lg, td.visible-sm.visible-lg { display: table-cell !important; } } .visible-md, tr.visible-md, th.visible-md, td.visible-md { display: none !important; } @media (max-width: 767px) { .visible-md.visible-xs { display: block !important; } tr.visible-md.visible-xs { display: table-row !important; } th.visible-md.visible-xs, td.visible-md.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-md.visible-sm { display: block !important; } tr.visible-md.visible-sm { display: table-row !important; } th.visible-md.visible-sm, td.visible-md.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-md { display: block !important; } tr.visible-md { display: table-row !important; } th.visible-md, td.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-md.visible-lg { display: block !important; } tr.visible-md.visible-lg { display: table-row !important; } th.visible-md.visible-lg, td.visible-md.visible-lg { display: table-cell !important; } } .visible-lg, tr.visible-lg, th.visible-lg, td.visible-lg { display: none !important; } @media (max-width: 767px) { .visible-lg.visible-xs { display: block !important; } tr.visible-lg.visible-xs { display: table-row !important; } th.visible-lg.visible-xs, td.visible-lg.visible-xs { display: table-cell !important; } } @media (min-width: 768px) and (max-width: 991px) { .visible-lg.visible-sm { display: block !important; } tr.visible-lg.visible-sm { display: table-row !important; } th.visible-lg.visible-sm, td.visible-lg.visible-sm { display: table-cell !important; } } @media (min-width: 992px) and (max-width: 1199px) { .visible-lg.visible-md { display: block !important; } tr.visible-lg.visible-md { display: table-row !important; } th.visible-lg.visible-md, td.visible-lg.visible-md { display: table-cell !important; } } @media (min-width: 1200px) { .visible-lg { display: block !important; } tr.visible-lg { display: table-row !important; } th.visible-lg, td.visible-lg { display: table-cell !important; } } .hidden-xs { display: block !important; } tr.hidden-xs { display: table-row !important; } th.hidden-xs, td.hidden-xs { display: table-cell !important; } @media (max-width: 767px) { .hidden-xs, tr.hidden-xs, th.hidden-xs, td.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-xs.hidden-sm, tr.hidden-xs.hidden-sm, th.hidden-xs.hidden-sm, td.hidden-xs.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-xs.hidden-md, tr.hidden-xs.hidden-md, th.hidden-xs.hidden-md, td.hidden-xs.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-xs.hidden-lg, tr.hidden-xs.hidden-lg, th.hidden-xs.hidden-lg, td.hidden-xs.hidden-lg { display: none !important; } } .hidden-sm { display: block !important; } tr.hidden-sm { display: table-row !important; } th.hidden-sm, td.hidden-sm { display: table-cell !important; } @media (max-width: 767px) { .hidden-sm.hidden-xs, tr.hidden-sm.hidden-xs, th.hidden-sm.hidden-xs, td.hidden-sm.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-sm, tr.hidden-sm, th.hidden-sm, td.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-sm.hidden-md, tr.hidden-sm.hidden-md, th.hidden-sm.hidden-md, td.hidden-sm.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-sm.hidden-lg, tr.hidden-sm.hidden-lg, th.hidden-sm.hidden-lg, td.hidden-sm.hidden-lg { display: none !important; } } .hidden-md { display: block !important; } tr.hidden-md { display: table-row !important; } th.hidden-md, td.hidden-md { display: table-cell !important; } @media (max-width: 767px) { .hidden-md.hidden-xs, tr.hidden-md.hidden-xs, th.hidden-md.hidden-xs, td.hidden-md.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-md.hidden-sm, tr.hidden-md.hidden-sm, th.hidden-md.hidden-sm, td.hidden-md.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-md, tr.hidden-md, th.hidden-md, td.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-md.hidden-lg, tr.hidden-md.hidden-lg, th.hidden-md.hidden-lg, td.hidden-md.hidden-lg { display: none !important; } } .hidden-lg { display: block !important; } tr.hidden-lg { display: table-row !important; } th.hidden-lg, td.hidden-lg { display: table-cell !important; } @media (max-width: 767px) { .hidden-lg.hidden-xs, tr.hidden-lg.hidden-xs, th.hidden-lg.hidden-xs, td.hidden-lg.hidden-xs { display: none !important; } } @media (min-width: 768px) and (max-width: 991px) { .hidden-lg.hidden-sm, tr.hidden-lg.hidden-sm, th.hidden-lg.hidden-sm, td.hidden-lg.hidden-sm { display: none !important; } } @media (min-width: 992px) and (max-width: 1199px) { .hidden-lg.hidden-md, tr.hidden-lg.hidden-md, th.hidden-lg.hidden-md, td.hidden-lg.hidden-md { display: none !important; } } @media (min-width: 1200px) { .hidden-lg, tr.hidden-lg, th.hidden-lg, td.hidden-lg { display: none !important; } } .visible-print, tr.visible-print, th.visible-print, td.visible-print { display: none !important; } @media print { .visible-print { display: block !important; } tr.visible-print { display: table-row !important; } th.visible-print, td.visible-print { display: table-cell !important; } .hidden-print, tr.hidden-print, th.hidden-print, td.hidden-print { display: none !important; } } ================================================ FILE: public/js/vendor/bootstrap/dist/js/bootstrap.js ================================================ /*! * Bootstrap v3.0.1 by @fat and @mdo * Copyright 2013 Twitter, Inc. * Licensed under http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world by @mdo and @fat. */ if (typeof jQuery === "undefined") { throw new Error("Bootstrap requires jQuery") } /* ======================================================================== * Bootstrap: transition.js v3.0.0 * http://getbootstrap.com/javascript/#transitions * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) // ============================================================ function transitionEnd() { var el = document.createElement('bootstrap') var transEndEventNames = { 'WebkitTransition' : 'webkitTransitionEnd' , 'MozTransition' : 'transitionend' , 'OTransition' : 'oTransitionEnd otransitionend' , 'transition' : 'transitionend' } for (var name in transEndEventNames) { if (el.style[name] !== undefined) { return { end: transEndEventNames[name] } } } } // http://blog.alexmaccaw.com/css-transitions $.fn.emulateTransitionEnd = function (duration) { var called = false, $el = this $(this).one($.support.transition.end, function () { called = true }) var callback = function () { if (!called) $($el).trigger($.support.transition.end) } setTimeout(callback, duration) return this } $(function () { $.support.transition = transitionEnd() }) }(window.jQuery); /* ======================================================================== * Bootstrap: alert.js v3.0.0 * http://getbootstrap.com/javascript/#alerts * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // ALERT CLASS DEFINITION // ====================== var dismiss = '[data-dismiss="alert"]' var Alert = function (el) { $(el).on('click', dismiss, this.close) } Alert.prototype.close = function (e) { var $this = $(this) var selector = $this.attr('data-target') if (!selector) { selector = $this.attr('href') selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 } var $parent = $(selector) if (e) e.preventDefault() if (!$parent.length) { $parent = $this.hasClass('alert') ? $this : $this.parent() } $parent.trigger(e = $.Event('close.bs.alert')) if (e.isDefaultPrevented()) return $parent.removeClass('in') function removeElement() { $parent.trigger('closed.bs.alert').remove() } $.support.transition && $parent.hasClass('fade') ? $parent .one($.support.transition.end, removeElement) .emulateTransitionEnd(150) : removeElement() } // ALERT PLUGIN DEFINITION // ======================= var old = $.fn.alert $.fn.alert = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.alert') if (!data) $this.data('bs.alert', (data = new Alert(this))) if (typeof option == 'string') data[option].call($this) }) } $.fn.alert.Constructor = Alert // ALERT NO CONFLICT // ================= $.fn.alert.noConflict = function () { $.fn.alert = old return this } // ALERT DATA-API // ============== $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) }(window.jQuery); /* ======================================================================== * Bootstrap: button.js v3.0.0 * http://getbootstrap.com/javascript/#buttons * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // BUTTON PUBLIC CLASS DEFINITION // ============================== var Button = function (element, options) { this.$element = $(element) this.options = $.extend({}, Button.DEFAULTS, options) } Button.DEFAULTS = { loadingText: 'loading...' } Button.prototype.setState = function (state) { var d = 'disabled' var $el = this.$element var val = $el.is('input') ? 'val' : 'html' var data = $el.data() state = state + 'Text' if (!data.resetText) $el.data('resetText', $el[val]()) $el[val](data[state] || this.options[state]) // push to event loop to allow forms to submit setTimeout(function () { state == 'loadingText' ? $el.addClass(d).attr(d, d) : $el.removeClass(d).removeAttr(d); }, 0) } Button.prototype.toggle = function () { var $parent = this.$element.closest('[data-toggle="buttons"]') if ($parent.length) { var $input = this.$element.find('input') .prop('checked', !this.$element.hasClass('active')) .trigger('change') if ($input.prop('type') === 'radio') $parent.find('.active').removeClass('active') } this.$element.toggleClass('active') } // BUTTON PLUGIN DEFINITION // ======================== var old = $.fn.button $.fn.button = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.button') var options = typeof option == 'object' && option if (!data) $this.data('bs.button', (data = new Button(this, options))) if (option == 'toggle') data.toggle() else if (option) data.setState(option) }) } $.fn.button.Constructor = Button // BUTTON NO CONFLICT // ================== $.fn.button.noConflict = function () { $.fn.button = old return this } // BUTTON DATA-API // =============== $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) { var $btn = $(e.target) if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn') $btn.button('toggle') e.preventDefault() }) }(window.jQuery); /* ======================================================================== * Bootstrap: carousel.js v3.0.0 * http://getbootstrap.com/javascript/#carousel * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // CAROUSEL CLASS DEFINITION // ========================= var Carousel = function (element, options) { this.$element = $(element) this.$indicators = this.$element.find('.carousel-indicators') this.options = options this.paused = this.sliding = this.interval = this.$active = this.$items = null this.options.pause == 'hover' && this.$element .on('mouseenter', $.proxy(this.pause, this)) .on('mouseleave', $.proxy(this.cycle, this)) } Carousel.DEFAULTS = { interval: 5000 , pause: 'hover' , wrap: true } Carousel.prototype.cycle = function (e) { e || (this.paused = false) this.interval && clearInterval(this.interval) this.options.interval && !this.paused && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) return this } Carousel.prototype.getActiveIndex = function () { this.$active = this.$element.find('.item.active') this.$items = this.$active.parent().children() return this.$items.index(this.$active) } Carousel.prototype.to = function (pos) { var that = this var activeIndex = this.getActiveIndex() if (pos > (this.$items.length - 1) || pos < 0) return if (this.sliding) return this.$element.one('slid', function () { that.to(pos) }) if (activeIndex == pos) return this.pause().cycle() return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos])) } Carousel.prototype.pause = function (e) { e || (this.paused = true) if (this.$element.find('.next, .prev').length && $.support.transition.end) { this.$element.trigger($.support.transition.end) this.cycle(true) } this.interval = clearInterval(this.interval) return this } Carousel.prototype.next = function () { if (this.sliding) return return this.slide('next') } Carousel.prototype.prev = function () { if (this.sliding) return return this.slide('prev') } Carousel.prototype.slide = function (type, next) { var $active = this.$element.find('.item.active') var $next = next || $active[type]() var isCycling = this.interval var direction = type == 'next' ? 'left' : 'right' var fallback = type == 'next' ? 'first' : 'last' var that = this if (!$next.length) { if (!this.options.wrap) return $next = this.$element.find('.item')[fallback]() } this.sliding = true isCycling && this.pause() var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction }) if ($next.hasClass('active')) return if (this.$indicators.length) { this.$indicators.find('.active').removeClass('active') this.$element.one('slid', function () { var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()]) $nextIndicator && $nextIndicator.addClass('active') }) } if ($.support.transition && this.$element.hasClass('slide')) { this.$element.trigger(e) if (e.isDefaultPrevented()) return $next.addClass(type) $next[0].offsetWidth // force reflow $active.addClass(direction) $next.addClass(direction) $active .one($.support.transition.end, function () { $next.removeClass([type, direction].join(' ')).addClass('active') $active.removeClass(['active', direction].join(' ')) that.sliding = false setTimeout(function () { that.$element.trigger('slid') }, 0) }) .emulateTransitionEnd(600) } else { this.$element.trigger(e) if (e.isDefaultPrevented()) return $active.removeClass('active') $next.addClass('active') this.sliding = false this.$element.trigger('slid') } isCycling && this.cycle() return this } // CAROUSEL PLUGIN DEFINITION // ========================== var old = $.fn.carousel $.fn.carousel = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.carousel') var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) var action = typeof option == 'string' ? option : options.slide if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) if (typeof option == 'number') data.to(option) else if (action) data[action]() else if (options.interval) data.pause().cycle() }) } $.fn.carousel.Constructor = Carousel // CAROUSEL NO CONFLICT // ==================== $.fn.carousel.noConflict = function () { $.fn.carousel = old return this } // CAROUSEL DATA-API // ================= $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) { var $this = $(this), href var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7 var options = $.extend({}, $target.data(), $this.data()) var slideIndex = $this.attr('data-slide-to') if (slideIndex) options.interval = false $target.carousel(options) if (slideIndex = $this.attr('data-slide-to')) { $target.data('bs.carousel').to(slideIndex) } e.preventDefault() }) $(window).on('load', function () { $('[data-ride="carousel"]').each(function () { var $carousel = $(this) $carousel.carousel($carousel.data()) }) }) }(window.jQuery); /* ======================================================================== * Bootstrap: collapse.js v3.0.0 * http://getbootstrap.com/javascript/#collapse * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // COLLAPSE PUBLIC CLASS DEFINITION // ================================ var Collapse = function (element, options) { this.$element = $(element) this.options = $.extend({}, Collapse.DEFAULTS, options) this.transitioning = null if (this.options.parent) this.$parent = $(this.options.parent) if (this.options.toggle) this.toggle() } Collapse.DEFAULTS = { toggle: true } Collapse.prototype.dimension = function () { var hasWidth = this.$element.hasClass('width') return hasWidth ? 'width' : 'height' } Collapse.prototype.show = function () { if (this.transitioning || this.$element.hasClass('in')) return var startEvent = $.Event('show.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var actives = this.$parent && this.$parent.find('> .panel > .in') if (actives && actives.length) { var hasData = actives.data('bs.collapse') if (hasData && hasData.transitioning) return actives.collapse('hide') hasData || actives.data('bs.collapse', null) } var dimension = this.dimension() this.$element .removeClass('collapse') .addClass('collapsing') [dimension](0) this.transitioning = 1 var complete = function () { this.$element .removeClass('collapsing') .addClass('in') [dimension]('auto') this.transitioning = 0 this.$element.trigger('shown.bs.collapse') } if (!$.support.transition) return complete.call(this) var scrollSize = $.camelCase(['scroll', dimension].join('-')) this.$element .one($.support.transition.end, $.proxy(complete, this)) .emulateTransitionEnd(350) [dimension](this.$element[0][scrollSize]) } Collapse.prototype.hide = function () { if (this.transitioning || !this.$element.hasClass('in')) return var startEvent = $.Event('hide.bs.collapse') this.$element.trigger(startEvent) if (startEvent.isDefaultPrevented()) return var dimension = this.dimension() this.$element [dimension](this.$element[dimension]()) [0].offsetHeight this.$element .addClass('collapsing') .removeClass('collapse') .removeClass('in') this.transitioning = 1 var complete = function () { this.transitioning = 0 this.$element .trigger('hidden.bs.collapse') .removeClass('collapsing') .addClass('collapse') } if (!$.support.transition) return complete.call(this) this.$element [dimension](0) .one($.support.transition.end, $.proxy(complete, this)) .emulateTransitionEnd(350) } Collapse.prototype.toggle = function () { this[this.$element.hasClass('in') ? 'hide' : 'show']() } // COLLAPSE PLUGIN DEFINITION // ========================== var old = $.fn.collapse $.fn.collapse = function (option) { return this.each(function () { var $this = $(this) var data = $this.data('bs.collapse') var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) if (typeof option == 'string') data[option]() }) } $.fn.collapse.Constructor = Collapse // COLLAPSE NO CONFLICT // ==================== $.fn.collapse.noConflict = function () { $.fn.collapse = old return this } // COLLAPSE DATA-API // ================= $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) { var $this = $(this), href var target = $this.attr('data-target') || e.preventDefault() || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7 var $target = $(target) var data = $target.data('bs.collapse') var option = data ? 'toggle' : $this.data() var parent = $this.attr('data-parent') var $parent = parent && $(parent) if (!data || !data.transitioning) { if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed') $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed') } $target.collapse(option) }) }(window.jQuery); /* ======================================================================== * Bootstrap: dropdown.js v3.0.0 * http://getbootstrap.com/javascript/#dropdowns * ======================================================================== * Copyright 2013 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ======================================================================== */ +function ($) { "use strict"; // DROPDOWN CLASS DEFINITION // ========================= var backdrop = '.dropdown-backdrop' var toggle = '[data-toggle=dropdown]' var Dropdown = function (element) { var $el = $(element).on('click.bs.dropdown', this.toggle) } Dropdown.prototype.toggle = function (e) { var $this = $(this) if ($this.is('.disabled, :disabled')) return var $parent = getParent($this) var isActive = $parent.hasClass('open') clearMenus() if (!isActive) { if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { // if mobile we we use a backdrop because click events don't delegate $('