├── .gitignore ├── CNAME ├── Gemfile ├── Gemfile.lock ├── _config.yml ├── _includes ├── designer.html ├── editorial.html ├── engineers.html ├── footer.html ├── head.html ├── output.html ├── pm.html ├── qa.html └── tools.html ├── _layouts ├── default.html ├── page.html └── post.html ├── _posts ├── 2016-07-15-process.markdown ├── 2016-07-15-why.markdown └── 2016-09-14-resources.markdown ├── _sass ├── _components │ ├── _c-footer.scss │ ├── _c-guidelines.scss │ ├── _c-header.scss │ ├── _c-hero.scss │ └── _c-nav.scss ├── _layout.scss ├── _reset.scss ├── _typography.scss └── _vars.scss ├── assets ├── check.svg ├── fav.png └── voxmedia-pattern.jpg ├── css └── main.scss ├── feed.xml ├── index.html ├── js ├── clipboard.min.js ├── global-helpers.js ├── list-builder.js ├── navbar.js └── scrollHandling.js └── readme.md /.gitignore: -------------------------------------------------------------------------------- 1 | _site 2 | .sass-cache 3 | .jekyll-metadata 4 | .bundle/ -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | accessibility.voxmedia.com -------------------------------------------------------------------------------- /Gemfile: -------------------------------------------------------------------------------- 1 | source "https://rubygems.org" 2 | 3 | gem 'jekyll' 4 | -------------------------------------------------------------------------------- /Gemfile.lock: -------------------------------------------------------------------------------- 1 | GEM 2 | remote: https://rubygems.org/ 3 | specs: 4 | colorator (0.1) 5 | ffi (1.9.13) 6 | jekyll (3.1.6) 7 | colorator (~> 0.1) 8 | jekyll-sass-converter (~> 1.0) 9 | jekyll-watch (~> 1.1) 10 | kramdown (~> 1.3) 11 | liquid (~> 3.0) 12 | mercenary (~> 0.3.3) 13 | rouge (~> 1.7) 14 | safe_yaml (~> 1.0) 15 | jekyll-sass-converter (1.4.0) 16 | sass (~> 3.4) 17 | jekyll-watch (1.4.0) 18 | listen (~> 3.0, < 3.1) 19 | kramdown (1.11.1) 20 | liquid (3.0.6) 21 | listen (3.0.8) 22 | rb-fsevent (~> 0.9, >= 0.9.4) 23 | rb-inotify (~> 0.9, >= 0.9.7) 24 | mercenary (0.3.6) 25 | rb-fsevent (0.9.7) 26 | rb-inotify (0.9.7) 27 | ffi (>= 0.5.0) 28 | rouge (1.11.1) 29 | safe_yaml (1.0.4) 30 | sass (3.4.22) 31 | 32 | PLATFORMS 33 | ruby 34 | 35 | DEPENDENCIES 36 | jekyll 37 | 38 | BUNDLED WITH 39 | 1.12.5 40 | -------------------------------------------------------------------------------- /_config.yml: -------------------------------------------------------------------------------- 1 | # Welcome to Jekyll! 2 | # 3 | # This config file is meant for settings that affect your whole blog, values 4 | # which you are expected to set up once and rarely need to edit after that. 5 | # For technical reasons, this file is *NOT* reloaded automatically when you use 6 | # 'jekyll serve'. If you change this file, please restart the server process. 7 | 8 | # Site settings 9 | title: Vox Product Accessibility Guidelines 10 | email: voxproduct@voxmedia.com 11 | description: > # this means to ignore newlines until "baseurl:" 12 | As journalists, advertisers, producers, and creators, content is at our core at Vox Media. We want to ensure that everyone—regardless of ability, situation, or context—can access it. 13 | baseurl: "" # the subpath of your site, e.g. /blog 14 | url: "http://accessibility.voxmedia.com" # the base hostname & protocol for your site 15 | twitter_username: jekyllrb 16 | github_username: jekyll 17 | 18 | # Build settings 19 | markdown: kramdown 20 | -------------------------------------------------------------------------------- /_includes/designer.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Designers

4 | 5 | 90 |
91 | -------------------------------------------------------------------------------- /_includes/editorial.html: -------------------------------------------------------------------------------- 1 |
2 |

Editorial

3 | 55 |
56 | -------------------------------------------------------------------------------- /_includes/engineers.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Engineers

4 | 5 | 144 |
145 | -------------------------------------------------------------------------------- /_includes/footer.html: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /_includes/head.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | {% if page.title %}{{ page.title | escape }}{% else %}{{ site.title | escape }}{% endif %} 7 | 8 | 9 | 10 | 11 | 12 | 15 | 16 | -------------------------------------------------------------------------------- /_includes/output.html: -------------------------------------------------------------------------------- 1 | Jump to preview 2 |
3 | 4 | 5 |
6 | 7 | 8 | 9 |
10 | 11 |
12 | -------------------------------------------------------------------------------- /_includes/pm.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Project Managers

4 | 42 |
43 | -------------------------------------------------------------------------------- /_includes/qa.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |

Quality Assurance

4 | 51 |
52 | -------------------------------------------------------------------------------- /_includes/tools.html: -------------------------------------------------------------------------------- 1 |
2 |

Tools

3 | 24 |
25 | -------------------------------------------------------------------------------- /_layouts/default.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | {% include head.html %} 4 | 5 | {{ content }} 6 | {% include footer.html %} 7 | 8 | 9 | -------------------------------------------------------------------------------- /_layouts/page.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 |
6 |

{{ page.title }}

7 |
8 |
9 | {{ content }} 10 |
11 |
12 | -------------------------------------------------------------------------------- /_layouts/post.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 |
5 | 6 |
7 |

{{ page.title }}

8 |
9 |
10 | {{ content }} 11 |
12 |
13 | -------------------------------------------------------------------------------- /_posts/2016-07-15-process.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "About this project" 4 | date: 2016-07-11 5 | categories: process 6 | --- 7 | 8 | We have many advocates for accessibility throughout the company, but at the time of our gathering, we didn’t have a company-wide structure in place to implement standards across the board. Over the course of two days, we documented role-specific best practices and how each team member could implement them into their actual work. Later, we shared what we learned with the company. 9 | 10 | Two months later, in July, we picked up the project again at our annual hack week, Vax. We sketched, wireframed, and built this checklist as a tool for teams to use. Guidelines are listed by role because everyone is responsible for accessibility on a team. 11 | 12 | Read more about our initial work on the Vox Product blog. 13 | -------------------------------------------------------------------------------- /_posts/2016-07-15-why.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Our Story" 4 | date: 2016-07-11 5 | categories: why 6 | --- 7 | 8 | This idea inspired us to outline a few guiding principles to help us convey our philosophy on accessibility. We hope these principles can help continue the conversation on why accessibility matters and encourage us to put what we preach into practice. 9 | 10 | ### 1. People want to access our content and use our tools; let’s make it easy for them. 11 | 12 | We at Vox Media are in the business of producing content that informs our audiences and tools that support our teams, and we need to make it as easy as possible for people to access our work. When we do our jobs well, everyone who wants to enjoy our content and work within our systems can do so. When we don’t do our jobs, we are the ones hindering their access. 13 | 14 | ### 2. We should never make assumptions about our users. 15 | 16 | Making a product accessible does not mean targeting a specific subset of people. Rather, accessible design, or universal design, is about making products usable by the greatest number of people possible. We should not assume we know how our users are engaging with our content, and should understand that it may be "seen" by a number of assistive technologies, including automated tools, keyboard-only navigation, and screen readers. 17 | 18 | In addition, applying universal design principles to our process makes the products better for everyone, and improves the experience across the board. 19 | 20 | ### 3. This is where the industry is going. Get on board or get left behind. 21 | 22 | Accessibility may seem like a lofty goal, but it’s really just part of doing good work. And fortunately, accessibility practices are here to stay. Accessibility will eventually be a legal requirement for online properties. Investing in accessibility now will ensure that we’re not playing catch up when U.S. laws adapt. 23 | 24 | ### 4. Accessibility is everyone’s responsibility. 25 | 26 | Accessibility is not a checklist item that only needs to be considered in some projects, or at the end of a process. Rather, these practices should be woven into every step of a project and role in a team. An accessible product stems from everyone on a team owning and shouldering the responsibility. It's part of our jobs as creators. 27 | 28 | -------------------------------------------------------------------------------- /_posts/2016-09-14-resources.markdown: -------------------------------------------------------------------------------- 1 | --- 2 | layout: post 3 | title: "Resources" 4 | date: 2016-09-14 5 | categories: resources 6 | --- 7 | 8 | ## Websites 9 | - Web Content Accessibility Guidelines (WCAG) 2.0 - [W3C](https://www.w3.org/TR/WCAG20/) 10 | - Web Accessibility in Mind - [Webaim](http://webaim.org/) 11 | - Interactive WCAG 2.0 - [Viget](http://code.viget.com/interactive-wcag/#responsibility=&level=aa) 12 | - A List Apart Accessibility - [A List Apart](http://alistapart.com/topic/accessibility) 13 | 14 | ## Courses 15 | - Web Accessibility: Developing with Empathy - [Udacity](https://www.udacity.com/course/web-accessibility--ud891) 16 | - Accessibility - [Treehouse](https://teamtreehouse.com/library/accessibility) 17 | - Web Accessibility: Getting Started - [Pluralsight](https://www.pluralsight.com/courses/web-accessibility-getting-started) 18 | - Meeting Web Accessibility Guidelines (Section 508/ WCAG 2.0) - [Pluralsight](https://www.pluralsight.com/courses/web-accessibility-meeting-guidelines) 19 | 20 | ## Newsletters 21 | - Accessibility Weekly - [A11yweekly](http://a11yweekly.com/) 22 | - Wuhcag - [Wuhcag](https://www.wuhcag.com/) 23 | 24 | ## Books 25 | - Design For Real Life - [A Book Apart](https://abookapart.com/products/design-for-real-life) 26 | - A Web For Everyone - [Rosenfeld](http://rosenfeldmedia.com/books/a-web-for-everyone/) 27 | - Inclusive Design Patterns by Heydon Pickering - [Smashing Magazine](https://www.smashingmagazine.com/books/#inclusive-design-patterns) 28 | - Accessibility for Everyone by Laura Kalbag - [A Book Apart](https://abookapart.com/products/accessibility-for-everyone) -------------------------------------------------------------------------------- /_sass/_components/_c-footer.scss: -------------------------------------------------------------------------------- 1 | .ally-svg { 2 | margin: 2.5em 0; 3 | text-align: center; 4 | svg { 5 | margin: 0 auto; 6 | max-width: 200px; 7 | } 8 | } 9 | 10 | .c-footer { 11 | font-size: 16px; 12 | background: $color-body; 13 | color: #fff; 14 | padding: 2em 0 1em; 15 | a { 16 | color: $color-link-light; 17 | &:hover { 18 | color: $color-link-light-hover; 19 | } 20 | } 21 | svg { 22 | display: block; 23 | margin: 2em 0 0; 24 | max-width: 200px; 25 | width: 100%; 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /_sass/_components/_c-guidelines.scss: -------------------------------------------------------------------------------- 1 | .c-guidelines { 2 | @media(min-width: $break-medium-small) { 3 | margin-top: 5em; 4 | } 5 | 6 | label { 7 | font-size: 1.3em; 8 | @media(min-width: $break-medium-small) { 9 | font-size: 1.5em; 10 | } 11 | 12 | // handle the sticky nav when anchor links are clicked 13 | &:target { 14 | display: inline-block; 15 | padding-top: 60px; 16 | } 17 | } 18 | 19 | ul { 20 | margin-left: 30px; 21 | } 22 | 23 | div[id]:before { 24 | content: ''; 25 | display: block; 26 | margin-top: -60px; 27 | padding-top: 60px; 28 | @media(min-width: $break-medium-small) { 29 | margin-top: -50px; 30 | padding-top: 50px; 31 | } 32 | } 33 | 34 | input[type="checkbox"] { 35 | cursor: pointer; 36 | height: 15px; 37 | left: -30px; 38 | opacity: 0; 39 | position: absolute; 40 | top: 7px; 41 | width: 15px; 42 | z-index: 1; 43 | @media(min-width: $break-medium-small) { 44 | top: 10px; 45 | } 46 | } 47 | 48 | b:before { 49 | border: 1px solid #979797; 50 | content: ''; 51 | cursor: pointer; 52 | height: 15px; 53 | left: -30px; 54 | position: absolute; 55 | top: 7px; 56 | transition: all 200ms; 57 | width: 15px; 58 | background-position: center center; 59 | background-repeat: no-repeat; 60 | background-size: 80%; 61 | @media(min-width: $break-medium-small) { 62 | top: 10px; 63 | } 64 | } 65 | 66 | input[type="checkbox"]:checked + b:before { 67 | background-color: $color-link; 68 | background-image: url('/assets/check.svg'); 69 | border-color: $color-link; 70 | } 71 | 72 | input[type="checkbox"]:focus + b:before { 73 | transition: all 200ms; 74 | border: 1px solid $color-dark-green; 75 | box-shadow: 0 2px 8px $color-light-green; 76 | } 77 | 78 | textarea { 79 | margin: 0.5em 0 .5em 0;; 80 | padding: 1em; 81 | width: calc(100% - 30px); 82 | height: 300px; 83 | font-family: $font-body; 84 | color: $color-medium-gray; 85 | font-size: 14px; 86 | border: 1px solid lighten($color-medium-gray, 50%); 87 | } 88 | 89 | &__preview { 90 | label { 91 | font-size: 1em; 92 | } 93 | } 94 | 95 | &__floaty-button { 96 | @extend button; 97 | bottom: 20px; 98 | display: none; 99 | left: 20px; 100 | position: fixed; 101 | z-index: 10000; 102 | } 103 | 104 | &__options { 105 | display: inline-block; 106 | font-size: .8em; 107 | input { 108 | margin-right: .3em; 109 | margin-right: .5em; 110 | top: -2px; 111 | position: relative; 112 | } 113 | label { 114 | margin-right: 5px; 115 | } 116 | } 117 | 118 | &__copy { 119 | margin-top: .8em; 120 | @media(min-width: $break-medium) { 121 | float: right; 122 | margin-top: 0; 123 | } 124 | } 125 | } 126 | 127 | -------------------------------------------------------------------------------- /_sass/_components/_c-header.scss: -------------------------------------------------------------------------------- 1 | .c-header { 2 | background: $color-light-gray; 3 | padding: 2em 0; 4 | h1 { 5 | color: $color-dark-green; 6 | } 7 | @media(min-width: $break-medium-small) { 8 | padding: 3em 0; 9 | } 10 | 11 | p { 12 | font-size: 1.15em; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /_sass/_components/_c-hero.scss: -------------------------------------------------------------------------------- 1 | .c-hero { 2 | background-image: url('/assets/voxmedia-pattern.jpg'); 3 | padding: 3.5em 0; 4 | color: $color-body; 5 | h1 { 6 | font-size: 4em; 7 | margin-bottom: 0.2em; 8 | line-height: 1; 9 | @media(max-width: $break-medium-small) { 10 | font-size: 3.2em; 11 | } 12 | } 13 | 14 | p { 15 | font-size: 1.25em; 16 | background: lighten($color-light-green, 35%); 17 | line-height: 1.2; 18 | display: inline; 19 | } 20 | &__links { 21 | position: absolute; 22 | top: 20px; 23 | right: 20px; 24 | 25 | a:first-of-type { 26 | margin-right: 25px; 27 | } 28 | a { 29 | color: $color-dark-gray; 30 | outline: none; 31 | padding: .1em; 32 | transition: all 200ms; 33 | font-weight: 800; 34 | text-decoration: none; 35 | letter-spacing: 1px; 36 | text-transform: uppercase; 37 | font-size: .8em; 38 | border-bottom: 1px solid transparent; 39 | } 40 | 41 | a:hover { 42 | color: $color-medium-gray; 43 | } 44 | @media(max-width: $break-medium-small) { 45 | position: static; 46 | top: 10px; 47 | right: auto; 48 | margin: -1.5em 0 1.5em .8em; 49 | } 50 | } 51 | } -------------------------------------------------------------------------------- /_sass/_components/_c-nav.scss: -------------------------------------------------------------------------------- 1 | .c-nav { 2 | background-color: lighten($color-light-green, 35%); 3 | letter-spacing: 1px; 4 | position: absolute; 5 | text-align: center; 6 | text-transform: uppercase; 7 | width: 100%; 8 | z-index: 10000; 9 | line-height: 0; 10 | @media(max-width: $break-medium) { 11 | position: relative; 12 | } 13 | 14 | &.is-fixed { 15 | position: fixed; 16 | top: 0; 17 | @media(max-width: $break-medium) { 18 | position: relative; 19 | } 20 | } 21 | 22 | a { 23 | border-color: transparent; 24 | color: $color-body; 25 | display: block; 26 | overflow: hidden; 27 | padding: 1.5em .8em; 28 | position: relative; 29 | font-weight: 300; 30 | &:before { 31 | background-color: lighten($color-light-green, 45%); 32 | bottom: -100%; 33 | content: ''; 34 | display: block; 35 | height: 100%; 36 | left: 0; 37 | position: absolute; 38 | right: 0; 39 | transition: 200ms bottom; 40 | width: 100%; 41 | z-index: -1; 42 | } 43 | &:hover, 44 | &.is-active { 45 | color: $color-body; 46 | &:before { 47 | bottom: 0; 48 | transition: 200ms bottom; 49 | } 50 | } 51 | } 52 | 53 | &__item { 54 | display: inline-block; 55 | margin-bottom: 0; 56 | @media(max-width: $break-medium) { 57 | border-bottom: 1px solid lighten($color-light-green, 20%); 58 | display: block; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /_sass/_layout.scss: -------------------------------------------------------------------------------- 1 | .l-wrapper { 2 | margin: 0 auto; 3 | max-width: $page-width; 4 | padding: 0 .8em; 5 | position: relative; 6 | 7 | } 8 | 9 | .l-segment { 10 | margin: 2em 0; 11 | @media(min-width: $break-medium-small) { 12 | margin: 3em 0; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /_sass/_reset.scss: -------------------------------------------------------------------------------- 1 | /* http://meyerweb.com/eric/tools/css/reset/ 2 | v2.0 | 20110126 3 | License: none (public domain) 4 | */ 5 | 6 | html, body, div, span, applet, object, iframe, 7 | h1, h2, h3, h4, h5, h6, p, blockquote, pre, 8 | a, abbr, acronym, address, big, cite, code, 9 | del, dfn, em, img, ins, kbd, q, s, samp, 10 | small, strike, strong, sub, sup, tt, var, 11 | b, u, i, center, 12 | dl, dt, dd, ol, ul, li, 13 | fieldset, form, label, legend, 14 | table, caption, tbody, tfoot, thead, tr, th, td, 15 | article, aside, canvas, details, embed, 16 | figure, figcaption, footer, header, hgroup, 17 | menu, nav, output, ruby, section, summary, 18 | time, mark, audio, video { 19 | margin: 0; 20 | padding: 0; 21 | border: 0; 22 | font-size: 100%; 23 | font: inherit; 24 | vertical-align: baseline; 25 | } 26 | /* HTML5 display-role reset for older browsers */ 27 | article, aside, details, figcaption, figure, 28 | footer, header, hgroup, menu, nav, section { 29 | display: block; 30 | } 31 | body { 32 | line-height: 1; 33 | } 34 | ol, ul { 35 | list-style: none; 36 | } 37 | blockquote, q { 38 | quotes: none; 39 | } 40 | blockquote:before, blockquote:after, 41 | q:before, q:after { 42 | content: ''; 43 | content: none; 44 | } 45 | table { 46 | border-collapse: collapse; 47 | border-spacing: 0; 48 | } -------------------------------------------------------------------------------- /_sass/_typography.scss: -------------------------------------------------------------------------------- 1 | body { 2 | color: $color-body; 3 | font-family: $font-body; 4 | font-size: 16px; 5 | font-weight: 300; 6 | line-height: 1.2; 7 | @media(min-width: $break-medium-small) { 8 | font-size: 17px; 9 | } 10 | } 11 | 12 | h1, h2, h3, h4, h5, h6 { 13 | font-family: $font-headline; 14 | font-weight: 700; 15 | margin-bottom: .5em; 16 | } 17 | 18 | h1 { 19 | font-size: 2em; 20 | @media(min-width: $break-medium-small) { 21 | font-size: 2.7em; 22 | } 23 | } 24 | 25 | h2 { 26 | font-size: 1.5em; 27 | @media(min-width: $break-medium-small) { 28 | font-size: 1.75em; 29 | } 30 | } 31 | 32 | .resources h2:not(:first-child) { 33 | padding-top: 1.25em; 34 | } 35 | 36 | h3 { 37 | font-family: $font-body; 38 | font-size: 1em; 39 | margin: .8em 0; 40 | } 41 | 42 | a { 43 | border: 1px solid transparent; 44 | border-bottom: 1px solid $color-medium-gray; 45 | color: $color-link; 46 | outline: none; 47 | text-decoration: none; 48 | transition: all 200ms; 49 | font-weight: 800; 50 | &:hover { 51 | color: $color-link-hover; 52 | } 53 | &:focus { 54 | border: 1px solid $color-dark-green; 55 | box-shadow: 0 2px 8px $color-light-green; 56 | } 57 | } 58 | 59 | button { 60 | -webkit-appearance: none; 61 | background-color: $color-link; 62 | border: 0; 63 | color: #fff; 64 | cursor: pointer; 65 | font-size: .8em; 66 | font-weight: 300; 67 | font-family: inherit; 68 | letter-spacing: .5px; 69 | padding: 10px; 70 | text-transform: uppercase; 71 | transition: 200ms background-color; 72 | &:hover { 73 | color: #fff; 74 | background-color: $color-link-hover; 75 | transition: 200ms background-color; 76 | } 77 | } 78 | 79 | p { 80 | line-height: 1.4; 81 | margin-bottom: .5em; 82 | } 83 | 84 | li { 85 | position: relative; 86 | margin-bottom: 1.7em; 87 | @media(min-width: $break-medium-small) { 88 | margin-bottom: 1em; 89 | } 90 | } 91 | 92 | strong { 93 | font-weight: bold; 94 | } -------------------------------------------------------------------------------- /_sass/_vars.scss: -------------------------------------------------------------------------------- 1 | // Colors 2 | $color-dark-green: #4B7C36; 3 | $color-light-green: #62A146; 4 | $color-dark-gray: #292929; 5 | $color-medium-gray: #555555; 6 | $color-light-gray: #f5f5f5; 7 | 8 | $color-body: $color-dark-gray; 9 | $color-link: $color-dark-green; 10 | $color-link-hover: darken($color-link, 20%); 11 | 12 | $color-link-light: $color-light-green; 13 | $color-link-light-hover: darken($color-light-green, 10%); 14 | 15 | // Fonts 16 | $font-body: -apple-system, BlinkMacSystemFont, 17 | "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", 18 | "Fira Sans", "Droid Sans", "Helvetica Neue", 19 | sans-serif; 20 | $font-headline: Georgia, serif; 21 | 22 | // layout 23 | $page-width: 750px; 24 | 25 | // Break points 26 | $break-small: 400px; 27 | $break-medium-small: 600px; 28 | $break-medium: 728px; 29 | $break-large-medium: 880px; 30 | $break-large: 950px; 31 | $break-xlarge-large: 1080px; 32 | -------------------------------------------------------------------------------- /assets/check.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 5 | 8 | 9 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /assets/fav.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxmedia/accessibility/a4789725584a59c67df7f376a1d6f0ba9de2f406/assets/fav.png -------------------------------------------------------------------------------- /assets/voxmedia-pattern.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/voxmedia/accessibility/a4789725584a59c67df7f376a1d6f0ba9de2f406/assets/voxmedia-pattern.jpg -------------------------------------------------------------------------------- /css/main.scss: -------------------------------------------------------------------------------- 1 | --- 2 | # Only the main Sass file needs front matter (the dashes are enough) 3 | --- 4 | @import 'reset'; 5 | @import 'vars'; 6 | @import 'layout'; 7 | @import 'typography'; 8 | @import '_components/_c-nav'; 9 | @import '_components/_c-header'; 10 | @import '_components/_c-guidelines'; 11 | @import '_components/_c-footer'; 12 | @import '_components/_c-hero'; 13 | -------------------------------------------------------------------------------- /feed.xml: -------------------------------------------------------------------------------- 1 | --- 2 | layout: null 3 | --- 4 | 5 | 6 | 7 | {{ site.title | xml_escape }} 8 | {{ site.description | xml_escape }} 9 | {{ site.url }}{{ site.baseurl }}/ 10 | 11 | {{ site.time | date_to_rfc822 }} 12 | {{ site.time | date_to_rfc822 }} 13 | Jekyll v{{ jekyll.version }} 14 | {% for post in site.posts limit:10 %} 15 | 16 | {{ post.title | xml_escape }} 17 | {{ post.content | xml_escape }} 18 | {{ post.date | date_to_rfc822 }} 19 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 20 | {{ post.url | prepend: site.baseurl | prepend: site.url }} 21 | {% for tag in post.tags %} 22 | {{ tag | xml_escape }} 23 | {% endfor %} 24 | {% for cat in post.categories %} 25 | {{ cat | xml_escape }} 26 | {% endfor %} 27 | 28 | {% endfor %} 29 | 30 | 31 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | --- 2 | layout: default 3 | --- 4 | 5 |
6 | 7 |
8 |

Accessibility Guidelines

9 |

Making work accessible creates a better experience across the board. Use this checklist to help build accessibility into your process no matter your role or stage in a project.

10 |
11 |
12 | 13 |
14 |
15 |

The Checklist

16 |

Check the boxes of the guidelines that apply to your project
17 | Preview and copy the checklist to your clipboard
18 | Paste the checklist into a document, Slack, Trello—or however else your team organizes projects

19 |
20 |
21 | 22 | 31 | 32 |
33 | {% include designer.html %} 34 | 35 | {% include engineers.html %} 36 | 37 | {% include pm.html %} 38 | 39 | {% include qa.html %} 40 | 41 | {% include editorial.html %} 42 | 43 | {% include tools.html %} 44 | 45 | {% include output.html %} 46 |
47 | 48 |
49 |
50 |

Our Philosophy

51 |

As journalists, advertisers, producers, and creators, content is at our core at Vox Media. We want to ensure that everyone—regardless of ability, situation, or context—can access it.

52 |
53 |
54 | 55 |
56 |
57 | {% for post in site.categories.why %} 58 | {{ post.content }} 59 | {% endfor %} 60 |
61 |
62 | 63 |
64 |
65 |

Resources

66 |

We most certainly are not experts in terms of the best approaches to accessibility. Most of the work done by our team is based on a great deal of research and references. Below are some of our favorite resources.

67 |
68 |
69 | 70 |
71 |
72 | {% for post in site.categories.resources %} 73 | {{ post.content }} 74 | {% endfor %} 75 |
76 |
77 | 78 |
79 |
80 |

About This Project

81 |

This project started back in May of 2016, when six Vox Media team members gathered in Washington, D.C., for two days to figure out just how to approach accessibility on a company-wide scale.

82 |
83 |
84 | 85 |
86 |
87 | {% for post in site.categories.process %} 88 | {{ post.content }} 89 | {% endfor %} 90 |
91 |
92 | 93 |
94 | 95 |
96 | 97 | 104 | -------------------------------------------------------------------------------- /js/clipboard.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * clipboard.js v1.5.12 3 | * https://zenorocha.github.io/clipboard.js 4 | * 5 | * Licensed MIT © Zeno Rocha 6 | */ 7 | !function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,e.Clipboard=t()}}(function(){var t,e,n;return function t(e,n,o){function i(a,c){if(!n[a]){if(!e[a]){var s="function"==typeof require&&require;if(!c&&s)return s(a,!0);if(r)return r(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=n[a]={exports:{}};e[a][0].call(u.exports,function(t){var n=e[a][1][t];return i(n?n:t)},u,u.exports,t,e,n,o)}return n[a].exports}for(var r="function"==typeof require&&require,a=0;ao;o++)n[o].fn.apply(n[o].ctx,e);return this},off:function(t,e){var n=this.e||(this.e={}),o=n[t],i=[];if(o&&e)for(var r=0,a=o.length;a>r;r++)o[r].fn!==e&&o[r].fn._!==e&&i.push(o[r]);return i.length?n[t]=i:delete n[t],this}},e.exports=o},{}],8:[function(e,n,o){!function(i,r){if("function"==typeof t&&t.amd)t(["module","select"],r);else if("undefined"!=typeof o)r(n,e("select"));else{var a={exports:{}};r(a,i.select),i.clipboardAction=a.exports}}(this,function(t,e){"use strict";function n(t){return t&&t.__esModule?t:{"default":t}}function o(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}var i=n(e),r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol?"symbol":typeof t},a=function(){function t(t,e){for(var n=0;n 0 ? prev + str : str; 89 | }, active[0]); 90 | } 91 | 92 | function formatExtraLinks(el) { 93 | var links = $$('a', el); 94 | var start = formatters[outputType]; 95 | var result = []; 96 | links.forEach(function(link) { 97 | if (outputType === 'plaintext') { 98 | result.push(start + link.innerText + ': ' + link.href); 99 | } else { 100 | result.push(start + '[' + link.innerText + '](' + link.href + ')'); 101 | } 102 | }); 103 | return result.join(); 104 | } 105 | 106 | function outputPreview() { 107 | if (!active.length) { 108 | return false; 109 | } 110 | textarea.value = formatPreview(formatters[outputType]); 111 | } 112 | 113 | function rebuildActive() { 114 | var newActive = []; 115 | checkboxes.forEach(function(c) { 116 | if (c.checked) { 117 | var extra = null; 118 | 119 | if (c.getAttribute('data-include-links')) { 120 | extra = formatExtraLinks(document.querySelector(c.getAttribute('data-include-links'))); 121 | } 122 | // [description of the item, id for the label (for anchor links), extra info] 123 | var deets = [c.parentNode.querySelector('p').innerText, c.parentNode.id, extra] 124 | newActive.push(deets); 125 | } 126 | }); 127 | active = newActive; 128 | saveActive(); 129 | outputPreview(); 130 | } 131 | 132 | document.addEventListener('navStateChange', function(ev) { 133 | if (ev.detail.active && active.length) { 134 | floatyButton.style.display = "block"; 135 | } else if (!ev.detail.active) { 136 | floatyButton.style.display = "none"; 137 | } 138 | }); 139 | 140 | $$('[name="output_type"]').forEach(function(input) { 141 | if (input.checked) { 142 | outputType = input.value; 143 | } 144 | 145 | input.addEventListener('change', function(ev) { 146 | outputType = ev.target.value; 147 | outputPreview(); 148 | }); 149 | }); 150 | 151 | checkboxes = checkboxes.map(function(input) { 152 | if (input.getAttribute('data-skip')) { 153 | return false; 154 | } 155 | 156 | input.addEventListener('change', rebuildActive); 157 | return input; 158 | }); 159 | 160 | // On init check localStorage to see if the person 161 | // has previously visited, if so return things 162 | // to the way they left things 163 | var previousSelections = retrieveActive(); 164 | if (previousSelections) { 165 | active = previousSelections; 166 | highlightCheckboxes(); 167 | rebuildActive(); 168 | } 169 | 170 | })(document.querySelector('.c-guidelines')); 171 | -------------------------------------------------------------------------------- /js/navbar.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var fixedClass = 'is-fixed'; 3 | var navActiveClass = 'is-active'; 4 | var fixedNav = document.querySelector('.c-nav--sticky'); 5 | var sections = []; 6 | var activeEl; 7 | 8 | (function defineSectionHeights() { 9 | var segments = $$('.l-segment'); 10 | 11 | segments.forEach(function(seg) { 12 | if (!seg.id) { 13 | return false; 14 | } 15 | 16 | var navEl = document.querySelector('[data-nav="' + seg.id + '"]'); 17 | 18 | if (navEl) { 19 | var dims = seg.getBoundingClientRect(); 20 | var top = (dims.top + window.pageYOffset) - 100; 21 | sections.push([top, top + dims.height, navEl]); 22 | 23 | navEl.addEventListener('click', highlightActive); 24 | } 25 | }); 26 | })(); 27 | 28 | function highlightActive() { 29 | sections.forEach(function(section) { 30 | var Y = window.pageYOffset; 31 | if (Y > section[0] && Y < section[1]) { 32 | if (activeEl && activeEl[0] === section[0]) {return false;} 33 | 34 | if (activeEl) { 35 | activeEl[2].classList.remove(navActiveClass); 36 | } 37 | section[2].classList.add(navActiveClass); 38 | activeEl = section; 39 | } 40 | }) 41 | } 42 | 43 | document.addEventListener('navStateChange', function() { 44 | fixedNav.classList.toggle(fixedClass); 45 | }); 46 | 47 | document.addEventListener('navHighlightScroll', function() { 48 | highlightActive(); 49 | }) 50 | })(); 51 | -------------------------------------------------------------------------------- /js/scrollHandling.js: -------------------------------------------------------------------------------- 1 | (function() { 2 | var guidelinesSection = document.querySelector('.c-guidelines'); 3 | var startFixedPosition = document.querySelector('.c-nav--sticky').offsetTop; 4 | var endFixedPosition = guidelinesSection.offsetTop + guidelinesSection.offsetHeight; 5 | 6 | var navState = false; 7 | var hasScrolled = false; 8 | 9 | function navStateEvent() { 10 | var ev = new CustomEvent("navStateChange", { 11 | detail: { 12 | active: navState 13 | } 14 | }); 15 | document.dispatchEvent(ev); 16 | } 17 | 18 | function navHighlightEvent() { 19 | var ev = new Event("navHighlightScroll", {"cancelable": false}); 20 | document.dispatchEvent(ev); 21 | } 22 | 23 | function checkNavPosition () { 24 | var Y = window.pageYOffset; 25 | if (!navState && (Y > startFixedPosition || Y < endFixedPosition)) { 26 | navState = true; 27 | navStateEvent(); 28 | } 29 | 30 | if (navState && Y > startFixedPosition || Y < endFixedPosition) { 31 | navHighlightEvent(); 32 | } 33 | 34 | if (navState && (Y < startFixedPosition || Y > endFixedPosition)) { 35 | navState = false; 36 | navStateEvent(); 37 | } 38 | } 39 | 40 | // ANY ONSCROLL FUNCTIONS SHOULD BE ADDED HERE 41 | function checkScroll() { 42 | if (hasScrolled) { 43 | checkNavPosition(); 44 | hasScrolled = false; 45 | } 46 | 47 | // TODO stop this when a page isn't active 48 | return setTimeout(checkScroll, 100); 49 | } 50 | 51 | window.addEventListener('scroll', function(){ 52 | hasScrolled = true; 53 | }, false); 54 | 55 | checkScroll(); 56 | })(); 57 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Vox Product Accessibility Guidelines 2 | 3 | This project started back in May of 2016, when six Vox Media team members gathered in Washington, D.C., for two days to figure out just how to approach accessibility on a company-wide scale. 4 | 5 | We have many advocates for accessibility throughout the company, but at the time of our gathering, we didn’t have a company-wide structure in place to implement standards across the board. Over the course of two days, we documented role-specific best practices and how each team member could implement them into their actual work. Later, we shared what we learned with the company. 6 | 7 | Two months later, in July, we picked up the project again at our annual hack week, Vax. We sketched, wireframed, and built this checklist as a tool for teams to use. Guidelines are listed by role because everyone is responsible for accessibility on a team. 8 | 9 | Read more about our initial work on the Vox Product blog. 10 | 11 | ## Development 12 | This is built using [Jekyll](http://www.jekyllrb.com). To develop on this locally, you must: 13 | - `gem install bundler` if you don't already have bundler installed 14 | - `bundle install` 15 | - `bundle exec jekyll serve` to serve files locally 16 | - `bundle exec jekyll build` to build static assets to serve 17 | 18 | ## Contributing 19 | 20 | All contributions should abide by the [Vox Media Open Source Contributions guidelines](https://github.com/voxmedia/open-source-contribution-guidelines). 21 | 22 | ## License 23 | This is released under an [Attribution CC BY](https://creativecommons.org/licenses/by/4.0/) license. 24 | 25 | 26 | --------------------------------------------------------------------------------