diff --git a/how-to/.eleventy.js b/how-to/.eleventy.js index f3141cf..4b3d27d 100644 --- a/how-to/.eleventy.js +++ b/how-to/.eleventy.js @@ -1,15 +1,39 @@ const { EleventyHtmlBasePlugin } = require("@11ty/eleventy"); -const listOutcomes = require('./build/list-outcomes'); +const { access } = require("fs/promises"); +const { dirname } = require("path"); +const listOutcomes = require("./build/list-outcomes"); -module.exports = function(eleventyConfig) { +const fileExists = async (path) => access(path).then(() => true, () => false); + +function formatSlug(str) { + if (!str) return; + const parts = str.split("-"); + return parts.map((part) => part[0].toUpperCase() + part.slice(1)).join(" "); +} + +module.exports = function (eleventyConfig) { // Ignore a couple things - eleventyConfig.ignores.add('**/readme.md'); - eleventyConfig.ignores.add('_build/**'); - eleventyConfig.ignores.add('**/_template/**'); + eleventyConfig.ignores.add("**/readme.md"); + eleventyConfig.ignores.add("_build/**"); + eleventyConfig.ignores.add("**/_template/**"); // Global data eleventyConfig.addGlobalData("layout", "layout.html"); eleventyConfig.addGlobalData("outcomes", listOutcomes().outcomes); + + // Computed global data + eleventyConfig.addGlobalData("eleventyComputed", { + outcome: async ({ outcome, page }) => { + if (!outcome) return undefined; + const basePath = dirname(page.inputPath).split("/").slice(1, 3).join("/"); + return { + ...outcome, + hasMethods: await fileExists(basePath + "/methods.md"), + hasResearch: await fileExists(basePath + "/research.md"), + hasUserNeeds: await fileExists(basePath + "/user-needs.md"), + }; + } + }) // Make it easy to deploy to gh-pages eleventyConfig.addPlugin(EleventyHtmlBasePlugin); @@ -17,10 +41,40 @@ module.exports = function(eleventyConfig) { // Copy `assets/` to `_site/assets` eleventyConfig.addPassthroughCopy("assets"); + // Custom breadcrumb filter based entirely on paths + page titles + eleventyConfig.addFilter("breadcrumbs", function (collection) { + function findParent(page) { + const resolvedInputBase = dirname( + page.inputPath.replace(/\/index\.md$/, "") + ); + const possibleInputPaths = [ + `${resolvedInputBase}/index.md`, + `${resolvedInputBase}.md`, + ]; + return collection.find(({ data }) => + possibleInputPaths.includes(data.page.inputPath) + )?.data; + } + + const crumbs = []; + let current = collection.find( + ({ data }) => data.page.inputPath === this.page.inputPath + ).data; + while (current) { + crumbs.push( + `
  • ${current.title || formatSlug(current.page.fileSlug)}
  • ` + ); + current = findParent(current.page); + } + return crumbs.reverse().join("\n"); + }); + const dir = { input: "./outcomes", - includes: "../_includes" // relative to dir.input - } + includes: "../_includes", // relative to dir.input + }; - return { dir } + return { dir }; }; diff --git a/how-to/_includes/card.html b/how-to/_includes/card.html index 6a43342..11ad6e5 100644 --- a/how-to/_includes/card.html +++ b/how-to/_includes/card.html @@ -1,5 +1,5 @@
    -

    {{ title }}

    +

    {{ title }}

    {{ content }}

    See More

    diff --git a/how-to/_includes/layout.html b/how-to/_includes/layout.html index b7c9a8d..a3bc4d3 100644 --- a/how-to/_includes/layout.html +++ b/how-to/_includes/layout.html @@ -3,26 +3,20 @@ {%- include "layout/page-title.html" %} - + + - - {% include "layout/top-header.html" %} - {%- if outcome.slug %} - {%- include "layout/sub-header.html" %} - {%- endif %} -
    - {%- if subtitle %} -

    {{ subtitle }}

    - {%- endif %} - {{ content }} -
    - + + {% include "layout/header.html" %} +
    +
    + {%- if subtitle %} +

    {{ subtitle }}

    + {%- endif %} + {{ content }} +
    +
    + {% include "layout/site-footer.html" %} \ No newline at end of file diff --git a/how-to/_includes/layout/header.html b/how-to/_includes/layout/header.html new file mode 100644 index 0000000..fa6b68d --- /dev/null +++ b/how-to/_includes/layout/header.html @@ -0,0 +1,44 @@ +Skip to content +
    +

    This is an unpublished draft preview that might include content that is not yet approved. The published website is at w3.org/WAI/. +

    +
    + + + diff --git a/how-to/_includes/layout/methods.md b/how-to/_includes/layout/methods.md index 5a12dc3..6154f44 100644 --- a/how-to/_includes/layout/methods.md +++ b/how-to/_includes/layout/methods.md @@ -1,18 +1,21 @@ --- -layout: layout.html -breadcrumb: Methods +layout: outcome.html --- +{{ content }} + {% if methods.size == 0 %} {% include 'layout/no-methods.md' %} -{% endif %} +{% else %} +

    Methods

    -{%- for method in methods %} - {%- assign href = '/' | append: outcome.slug | append: '/methods/' | append: method.slug %} - {%- - include 'card.html', - title: method.title, - content: method.description, - href: href - %} -{%- endfor %} + {%- for method in methods %} + {%- assign href = '/' | append: outcome.slug | append: '/methods/' | append: method.slug %} + {%- + include 'card.html', + title: method.title, + content: method.description, + href: href + %} + {%- endfor %} +{% endif %} \ No newline at end of file diff --git a/how-to/_includes/layout/outcome-nav.html b/how-to/_includes/layout/outcome-nav.html new file mode 100644 index 0000000..5b0f2c0 --- /dev/null +++ b/how-to/_includes/layout/outcome-nav.html @@ -0,0 +1,17 @@ +
    + +
    \ No newline at end of file diff --git a/how-to/_includes/layout/site-footer.html b/how-to/_includes/layout/site-footer.html new file mode 100644 index 0000000..4d142da --- /dev/null +++ b/how-to/_includes/layout/site-footer.html @@ -0,0 +1,29 @@ + diff --git a/how-to/_includes/layout/sub-header.html b/how-to/_includes/layout/sub-header.html deleted file mode 100644 index 9cc13aa..0000000 --- a/how-to/_includes/layout/sub-header.html +++ /dev/null @@ -1,64 +0,0 @@ -
    -
    - - -

    - {%- if type == 'method' %} - Method - {{ method.title }} - {%- elsif title %} - {{ title }} - {%- elsif breadcrumb == 'Methods' %} - Methods for {{ outcome.title }} - {%- endif %} -

    - - {%- if type == "method" %} - {%- assign baseUrl = '/' - | append: outcome.slug - | append: '/methods/' - | append: method.slug - %} - - {%- elsif type == 'activity' %} - {%- assign baseUrl = '/' | append: outcome.slug | append: '/activities' %} - - {%- endif %} -
    -
    diff --git a/how-to/_includes/layout/top-header.html b/how-to/_includes/layout/top-header.html deleted file mode 100644 index 4136f12..0000000 --- a/how-to/_includes/layout/top-header.html +++ /dev/null @@ -1,28 +0,0 @@ -
    - -
    -
    -
    WCAG 3.0
    -
    {{ outcome.title }} Methods & How To's
    -
    -
    - {% include 'layout/wai-logo.html' %} -
    -
    - - {%- if outcome.slug %} - - {%- endif %} -
    diff --git a/how-to/_includes/method.html b/how-to/_includes/method.html new file mode 100644 index 0000000..d0f053c --- /dev/null +++ b/how-to/_includes/method.html @@ -0,0 +1,22 @@ + + + + + {%- include "layout/page-title.html" %} + + + + + + {% include "layout/header.html" %} +
    + {% include "layout/outcome-nav.html" %} +
    +

    {{ method.title }}

    +

    {{ method.description }}

    + {{ content }} +
    +
    + {% include "layout/site-footer.html" %} + + \ No newline at end of file diff --git a/how-to/_includes/outcome.html b/how-to/_includes/outcome.html new file mode 100644 index 0000000..a17fef0 --- /dev/null +++ b/how-to/_includes/outcome.html @@ -0,0 +1,25 @@ + + + + + {%- include "layout/page-title.html" %} + + + + + + {% include "layout/header.html" %} +
    + {% include "layout/outcome-nav.html" %} +
    + {%- if title %} +

    {{ title }}

    + {%- else %} +

    {{ outcome.title }}

    + {%- endif %} + {{ content }} +
    +
    + {% include "layout/site-footer.html" %} + + \ No newline at end of file diff --git a/how-to/assets/main.css b/how-to/assets/main.css index 53a5563..ad7349f 100644 --- a/how-to/assets/main.css +++ b/how-to/assets/main.css @@ -1,156 +1,143 @@ -@import 'top-header.css'; -@import 'sub-header.css'; -@import 'footer.css'; - -:root { - --w3c-classic: #005A9C; - --w3c-blue: #003366; - --wai-green: #005A6A; - --off-black: #1d1d1d; - --dk-grey: #3b3b3b; - --faded-red: #c0272d; - --red-subtle: #f1d0e1; - --light-blue: #196cac; - --dk-blue: #091832; - --gold: rgb(238, 208, 9); - --gold-light: rgba(238, 208, 9, .35); - --ocean: #00818d; - --cloudy: #bccbd3; - --cloudy-subtle: #d0e1f1; - --grey: #686868; - --line-grey: #ddd; - --trans-line-grey: rgba(221, 221, 221, 0.32); - --off-white: #f2f2f2; - --body-bg: #FAFAFC; - --lt-off-white: #fafafa; - --pure-white: #ffffff; - --white-transparent: rgba(255, 255, 255, 0.92);; - --visited-link: #660066; - --footer-grey: #efefef; +main { + display: block; } -*:focus-visible { - outline: solid 2px currentColor; +main, .sidenav { + margin-top: 2em; } -body { - margin: 0; - background: var(--body-bg); - font-family: 'Roboto', Verdana, Geneva, Tahoma, sans-serif; +.minimal-header { + -ms-grid-column: 2; + -ms-grid-column-span: 8; + -ms-grid-row: 1; + grid-column: 2/10; } -a { - color: var(--w3c-blue); +.minimal-header-name { + margin-right: 2em; } -main > a:visited { - color: var(--visited-link); +.minimal-header-name a { + text-decoration: none; } - -h1, h2, h3, h4, h5, h6 { - color: var(--wai-green); +.minimal-header-name a:hover, .minimal-header-name a:focus { + text-decoration: underline; } -li::marker { - color: var(--faded-red); +.main-content { + -ms-grid-column: 2; + -ms-grid-column-span: 6; + grid-column: 2/span 6; + -ms-grid-row: 2; + -ms-grid-row-span: 2; + grid-row-start: 2; } -.page-width, main { - max-width: 60em; - margin: 0 auto; - padding: 0 1em; +#site-header.minimal-header.with-subtitle { +padding: 1.75em 0 0 0; } -.nav-list ul { - display: flex; - flex-wrap: wrap; - justify-content: center; - list-style: none; - margin: 0; - padding: 0; - font-size: 1.2em; +.minimal-header-logo img { +margin: 1px 0 1px 0; } - -.nav-list li { - display: inline-block; - white-space: nowrap; +.minimal-header-logo svg { +margin: 0.75em 0 0.75em 0.5em; } -@media screen and (max-width: 35em /* xs-breakpoint */) { - .nav-list li { - flex: 1; - } +#site-header.minimal-header { +margin: 1.2em 0; +align-items: stretch; } -.nav-list a { - color: inherit; - text-decoration: none; - display: inline-block; - padding: min(1em, 4vw) 0; - margin: 0 min(1em, 4vw); - width: 100%; - text-align: center; - outline-offset: -3px; - outline-width: 2px; - outline-color: currentColor; +#site-header.minimal-header .minimal-header-name, +#site-header.minimal-header .minimal-header-subtitle, +#site-header.minimal-header .minimal-header-link +{ +display: flex; +flex-direction: column; +justify-content: center; } -.nav-list .current { - border-bottom: solid 3px currentColor; - padding-bottom: 0.5em; - margin-bottom: 0.5em; +.minimal-header-name { +flex: width 0 0; } -main li { - margin-bottom: .5em; -} -main p { - line-height: 1.5em; +.minimal-header-subtitle, +.minimal-header-link { +border-left: 1px solid var(--gold); +padding-left: 8px; +margin-left: 18px; +display: block; +font-size: 80%; +flex: 1 0 0; } -.card { - background: var(--off-white); - border: solid 1px var(--line-grey); - padding: 1.5em 1em 1em; - margin: 2em; -} -.card > :first-child { - margin: 0; +.minimal-header-subtitle { +font-style: italic; } -.flex { display: flex; } -.flex > :first-child { flex-grow: 1; } +.minimal-header-link { +text-decoration: underline !important; +font-weight: normal; +margin-right: 16px; +} -.card-button { - display: inline-block; - margin: 0 1em; - padding: .5em 2em; - text-decoration: none; - background: #111; - color: #EEE; - white-space: nowrap; +/* skip link */ +.button--skip-link { +background-color: var(--gold) !important; +border-color: var(--gold) !important; +outline-color: currentColor !important; +color: var(--off-black) !important; +font-weight: 600; +font-size: larger; +margin: 0 auto; +position: absolute; +z-index: 20; +left: 0; +right: 0; +top: 0.5em; +width: 10em; +opacity: 1; +transition: transform 0.1875s ease-out, opacity 0.1875s ease-out; } -.method-card { - background: var(--off-white); - border: solid 1px var(--line-grey); - width: 30em; - margin: 2em auto; - padding: 1.5em 5em; +.button--skip-link:not(:focus):not(:hover) { +transform: translateY(-4em); +opacity: 0; } -.method-card dt, .method-card dd { - display: inline-block; - margin: 0; +h1 span { + display: block; + font-size: .5em; + margin-bottom: 0.25em; } -.method-card dt { - font-size: 1.5em; - padding: .5em; +main h2:first-of-type { + } .normative { - border: solid 1px var(--cloudy-subtle); - margin-top: 1em; - padding: .5em 1em; - border-left-width: 1em; -} + border: solid 1px var(--cloudy-subtle); + margin-top: 1em; + padding: .5em 1em; + border-left-width: 1em; +} + +.note, .ednote { + border-color: #52E052; + background: #e9fbe9; + overflow: auto; + padding: .5em; + border-width: 0 0 0 0.5em; + border-left-style: solid; + page-break-inside: avoid; + margin: 1.5em 0 0 0; +} + +.ednote::before { + content: "Editor's Note: "; + font-weight: bold; +} +.note::before { + content: "Note: "; + font-weight: bold; +} \ No newline at end of file diff --git a/how-to/assets/sub-header.css b/how-to/assets/sub-header.css index 45310d5..c609af6 100644 --- a/how-to/assets/sub-header.css +++ b/how-to/assets/sub-header.css @@ -21,7 +21,6 @@ .sub-header .subtitle { font-size: 2.5rem; font-size: min(2.5rem, 10vh); - text-align: center; margin: 1.3em 0 .5em; } diff --git a/how-to/outcomes/.DS_Store b/how-to/outcomes/.DS_Store new file mode 100644 index 0000000..5008ddf Binary files /dev/null and b/how-to/outcomes/.DS_Store differ diff --git a/how-to/outcomes/clear-meaning/clear-meaning.11tydata.js b/how-to/outcomes/clear-meaning/clear-meaning.11tydata.js new file mode 100644 index 0000000..baddaa9 --- /dev/null +++ b/how-to/outcomes/clear-meaning/clear-meaning.11tydata.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('../../build/get-outcome')(__dirname) +} diff --git a/how-to/outcomes/clear-meaning/index.md b/how-to/outcomes/clear-meaning/index.md new file mode 100644 index 0000000..a17fbc6 --- /dev/null +++ b/how-to/outcomes/clear-meaning/index.md @@ -0,0 +1,83 @@ +--- +layout: outcome.html +--- + +## Goal + +To help people understand text: +* Use literal language, or +* Explain the implied meaning of non-literal language. + +Making non-literal or figurative language easier to understand helps people with cognitive disabilities as well as neurodivergent people, such as those who are autistic and may be so focused on the literal meaning that they may not notice the implied meaning. + +Explaining or avoiding non-literal language can also help: +* Non-native language speakers +* People of different ages or generations +* People from different cultural backgrounds + +## Normative text + +
    + +### Guideline + +

    {{ outcome.description }}

    + +
    + +### Foundational Requirements + +For each item of ambiguous text, such as non-literal text, abbreviations and acronyms, ambiguous numbers, or text missing letters or diacritics: + +1. Is the non-literal text presented in a way that is available to user agents, including assistive technology (AT)? + 1. Yes, view meets *Text is programmatically determinable*, continue. + 2. No, continue to step 3. +2. Does the *accessibility support set* meet *Explain ambiguous text or provide an unambiguous alternative*? + 1. Yes, pass. + 2. No, continue. +3. Does the publisher sufficiently explain the non-literal text or provide a literal alternative? + 1. Yes, view meets *Explain non-literal text or provide a literal alternative*, pass. + 2. No, fail. + +#### Exceptions +* If the purpose is to showcase works of art or fiction, such as a poetry journal or fictional stories, this guideline does not apply; however, if the purpose is to educate students about pieces of art, then this guideline applies. + +
    + +### Supplimental Requirements + +

    None defined at this time.

    + +### Assertions + +

    There will probably be a generic assertion based on style guides that applies to this guideline.

    + + +
    + +## What to do + +
    + +Determine if the text has words or phrases that: +* Hint at a meaning that is not directly stated, or +* Can have more than one meaning, such as working on a literal and figurative level at the same time. Example in English: “The chef cuts corners when slicing the fish.” Non-literal: The chef is preparing the fish in an easy or cheap way. Literal: The chef is cutting the fish into shapes that don’t have sharp corners. + +When checking for non-literal text, also consider how sentences are combined together, such as if a word in one sentence is critical to accurately understanding the meaning of a later sentence. + +If the text has implied meaning, explain it or provide a literal alternative using one of the techniques in the [Methods](.methods/) section. + +
    + +## Definitions + +- **Back translation** is a two-step process of translating text into another language and then back to its original language. Also called reverse translation, this process can help identify phrases that may lose their intended meaning when translated. +- **Content publisher** The creative individual or organization responsible for curating, producing, and distributing various forms of content to engage and inform audiences. Includes tools used by the publisher such as HTML and JSON and content management systems like Wix and WordPress. +- **Emoji character** An emoji character is a small digital image with Unicode for its literal meaning, such as 🌴(“Palm tree”). But emojis often have implied meaning that users may need help understanding. Common examples of emojis used in non-literal ways: + - 💯(“Hundred points”) can be used in various ways, such as to indicate a perfect score or complete agreement. + - 🙃 (“Upside-down face”) is often used to indicate sarcasm or silliness. +- **Literal text** uses the direct meaning of words to convey exactly what is written. Unlike non-literal or figurative language, literal text does not have implied meaning. +- **Non-literal text** uses words or phrases in a way that goes beyond their standard or dictionary meaning to express deeper, more complex ideas. This is also called figurative language. To understand it, users have to interpret the implied meaning behind the words, rather than just their literal or direct meaning. + - Examples: Allusions, hyperbole, idioms, irony, jokes, litotes, metaphors, metonymies, onomatopoeias, oxymorons, personification, puns, sarcasm, and similes. More detailed examples are available in the [Methods](.methods/) section. +- **User agent** W3C defines user agent as any software that retrieves, renders, and facilitates end-user interaction with Web content, or whose user interface is implemented using Web technologies. +Examples: Web browsers, media players, operating system shells, plug-ins, consumer electronics with Web-widgets, and stand-alone applications or embedded applications that help in retrieving, rendering, and interacting with Web content. \ No newline at end of file diff --git a/how-to/outcomes/clear-meaning/methods.md b/how-to/outcomes/clear-meaning/methods.md new file mode 100644 index 0000000..24f8cbc --- /dev/null +++ b/how-to/outcomes/clear-meaning/methods.md @@ -0,0 +1,20 @@ +--- +layout: layout/methods.md +--- + + +## Foundational Requirements + +
    + +- [Explain ambiguous text or provide an unambiguous alternative](explain-ambiguous-text) + +
    + +## Supplimental + +
    + +- None available + +
    \ No newline at end of file diff --git a/how-to/outcomes/clear-meaning/methods/explain-ambiguous-text/explain-ambiguous-text.json b/how-to/outcomes/clear-meaning/methods/explain-ambiguous-text/explain-ambiguous-text.json new file mode 100644 index 0000000..0706d6a --- /dev/null +++ b/how-to/outcomes/clear-meaning/methods/explain-ambiguous-text/explain-ambiguous-text.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Explain ambiguous text or provide an unambiguous alternative", + "slug": "explain-ambiguous-text", + "description": "@@@" + } +} diff --git a/how-to/outcomes/clear-meaning/methods/explain-ambiguous-text/index.md b/how-to/outcomes/clear-meaning/methods/explain-ambiguous-text/index.md new file mode 100644 index 0000000..9a3fcbe --- /dev/null +++ b/how-to/outcomes/clear-meaning/methods/explain-ambiguous-text/index.md @@ -0,0 +1,27 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level: Foundational
    +
    @@@
    +
    +
    + +Determine if the text has: +- non-literal text, +- abbreviations and acronyms, +- ambiguous numbers, or +- text missing letters or diacritics + +If the text is ambiguous, explain it or provide an alternative using one of the techniques in the techniques section. + + + +## Techniques + +* **Author technique (General):** Spell out the meaning in brackens after the first use. +* **Author technique (General):** Linking to a glossary. +* **Author technique (HTML):** Include text that explains the meaning using an abbriviation. \ No newline at end of file diff --git a/how-to/outcomes/clear-meaning/methods/methods.json b/how-to/outcomes/clear-meaning/methods/methods.json new file mode 100644 index 0000000..f25a945 --- /dev/null +++ b/how-to/outcomes/clear-meaning/methods/methods.json @@ -0,0 +1,3 @@ +{ + "type": "method" +} \ No newline at end of file diff --git a/how-to/outcomes/clear-meaning/outcome.json b/how-to/outcomes/clear-meaning/outcome.json new file mode 100644 index 0000000..7e07730 --- /dev/null +++ b/how-to/outcomes/clear-meaning/outcome.json @@ -0,0 +1,5 @@ +{ + "index": 0, + "title": "Clear Meaning", + "description": "Users can access explanations of or alternatives to ambiguous text content." +} diff --git a/how-to/outcomes/focus-appearance/activities/activities.json b/how-to/outcomes/focus-appearance/activities/activities.json new file mode 100644 index 0000000..aeadf6c --- /dev/null +++ b/how-to/outcomes/focus-appearance/activities/activities.json @@ -0,0 +1,4 @@ +{ + "type": "activity", + "title": "Activity" +} \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/activities/design.md b/how-to/outcomes/focus-appearance/activities/design.md new file mode 100644 index 0000000..b0e47c2 --- /dev/null +++ b/how-to/outcomes/focus-appearance/activities/design.md @@ -0,0 +1,5 @@ +--- +subtitle: Design +--- + +Coming soon diff --git a/how-to/outcomes/focus-appearance/activities/develop.md b/how-to/outcomes/focus-appearance/activities/develop.md new file mode 100644 index 0000000..e8a7da6 --- /dev/null +++ b/how-to/outcomes/focus-appearance/activities/develop.md @@ -0,0 +1,5 @@ +--- +subtitle: Develop +--- + +Coming soon diff --git a/how-to/outcomes/focus-appearance/activities/edit.md b/how-to/outcomes/focus-appearance/activities/edit.md new file mode 100644 index 0000000..41c567a --- /dev/null +++ b/how-to/outcomes/focus-appearance/activities/edit.md @@ -0,0 +1,5 @@ +--- +subtitle: Edit +--- + +Coming soon diff --git a/how-to/outcomes/focus-appearance/activities/plan.md b/how-to/outcomes/focus-appearance/activities/plan.md new file mode 100644 index 0000000..aa2a004 --- /dev/null +++ b/how-to/outcomes/focus-appearance/activities/plan.md @@ -0,0 +1,5 @@ +--- +subtitle: Plan +--- + +Coming soon diff --git a/how-to/outcomes/focus-appearance/activities/test.md b/how-to/outcomes/focus-appearance/activities/test.md new file mode 100644 index 0000000..bae716a --- /dev/null +++ b/how-to/outcomes/focus-appearance/activities/test.md @@ -0,0 +1,5 @@ +--- +layout: layout/test-activity.md +--- + + diff --git a/how-to/outcomes/focus-appearance/examples.md b/how-to/outcomes/focus-appearance/examples.md new file mode 100644 index 0000000..8b2264a --- /dev/null +++ b/how-to/outcomes/focus-appearance/examples.md @@ -0,0 +1,5 @@ +--- +title: Examples +--- + +Coming soon diff --git a/how-to/outcomes/focus-appearance/focus-appearance.11tydata.js b/how-to/outcomes/focus-appearance/focus-appearance.11tydata.js new file mode 100644 index 0000000..143a890 --- /dev/null +++ b/how-to/outcomes/focus-appearance/focus-appearance.11tydata.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('../../build/get-outcome')(__dirname), +}; diff --git a/how-to/outcomes/focus-appearance/index-developing.md b/how-to/outcomes/focus-appearance/index-developing.md new file mode 100644 index 0000000..9050179 --- /dev/null +++ b/how-to/outcomes/focus-appearance/index-developing.md @@ -0,0 +1,27 @@ +--- +title: Get Started +--- + +
    +

    {{ outcome.description }}

    +
    + +## Open Questions +* issues or questions that are specific to the outcome +* another issue or question + +## Summary + +Coming soon + +## Why + +Coming soon + +## Who it helps + +Coming soon + +## How + +Coming soon diff --git a/how-to/outcomes/focus-appearance/index.md b/how-to/outcomes/focus-appearance/index.md new file mode 100644 index 0000000..00f4752 --- /dev/null +++ b/how-to/outcomes/focus-appearance/index.md @@ -0,0 +1,65 @@ +--- +layout: outcome.html +--- + +## Goal + +The keyboard focus must have a sufficient visual indicator. + +## Normative Text + +
    + +### Guideline + +

    {{ outcome.description }}

    + +
    + +### Foundational Requirements + +For each focusable item: + +1. Is the user-agent default focus indicator used? (Prerequisite) + 1. Yes, the [user-agent default indicator](methods/default-focus-indicator) is used AND the *accessibility support set* incorporates [Using the default focus indicator and checking contrast](methods/default-focus-indicator-check-contrast) and checking contrast. Stop. + 2. No, continue. + + +2. Is the user-agent default focus indicator used, and meets contrast across backgrounds? (Baseline) + 1. Yes, indicator must meet [Using the default focus indicator and checking contrast](methods/default-focus-indicator-check-contrast). Stop. + 2. No, continue. + + +3. Is the focus indicator defined by the author? (Baseline) + 1. Yes, indicator must meet [Custom focus indicators](methods/custom-focus-indicator). Stop. + 2. No, fail. + +
    + +### Supplimental Requirements + +- [Supplimentary indicators](methods/supplimentary-indicators). + + +### Assertions + +- Style guide: The organization has a documented style guide which includes guidance on focus indicators, and a policy that designers and developers are required to follow the style guide. The style guide includes focus indicators that meet one of the baseline scenarios in the decision tree. + +
    + +

    We would like to conduct research once we have an initial pass/fail set of examples to see if we are making decisions that support various disabilities. Please get in touch if you could facilitate this research.

    + + +## What to do + +Ensure focusable elements include focus indicators that are visible for people using an input device that relies on the keyboard focus to navigate. + +An outline, or indicator which surrounds the focusable element is generally the most easily visible. + +All indicators for keyboard-focusable elements must be: + +* **Present**: There is a visible indicator of keyboard focus. +* **Not obscured**: The focus indicator is not obscured or partially obscured (more than 50%, TBC) +* **Persistent**: The focus indicator persists while the element has focus, but does not persist after the element loses focus. +* **Distinctive**: The keyboard focus indicator uses a style that is distinct from the style of other non-focused controls, so that the item in focus can be distinguished without reference to the non-focused state. +* **Sufficiently visible**: According to the specific method (below), the indicator must be visually discernible whilst navigating. diff --git a/how-to/outcomes/focus-appearance/methods.md b/how-to/outcomes/focus-appearance/methods.md new file mode 100644 index 0000000..50730c7 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods.md @@ -0,0 +1,19 @@ +--- +title: Methods +layout: layout/methods.md +--- + +## Foundational Requirements + +
    + +- [User-agent default indicator](default-focus-indicator) +- [Using the default focus indicator and checking contrast](default-focus-indicator-check-contrast) +- [Custom focus indicators](custom-focus-indicator) +- [Other indicators](other-indicators/) + +
    + +## Supplimental + +- [Supplimentary indicators](methods/supplimentary-indicators) diff --git a/how-to/outcomes/focus-appearance/methods/_template/_template.json b/how-to/outcomes/focus-appearance/methods/_template/_template.json new file mode 100644 index 0000000..4de32bd --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/_template/_template.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "METHOD NAME (Also, rename this file)", + "slug": "method-directory-name", + "description": "METHOD DESCRIPTION" + } +} diff --git a/how-to/outcomes/focus-appearance/methods/_template/background.md b/how-to/outcomes/focus-appearance/methods/_template/background.md new file mode 100644 index 0000000..cb7ae9c --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/_template/background.md @@ -0,0 +1,17 @@ +--- +subtitle: Background +--- + +Coming soon + +### Bibliography + +- [Coming soon](https://) + +### Assumptions + +- [Coming soon](https://) + +### Accessibility Support + +Text diff --git a/how-to/outcomes/focus-appearance/methods/_template/code-snippets.md b/how-to/outcomes/focus-appearance/methods/_template/code-snippets.md new file mode 100644 index 0000000..eb56b89 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/_template/code-snippets.md @@ -0,0 +1,33 @@ +--- +subtitle: Code Snippets +--- + +### Passed + +#### Passed Example 1 + +Coming soon + +```html +Code snippet +``` + +### Failed + +#### Failed Example 1 + +Coming soon + +```html +Code snippet +``` + +### Inapplicable + +#### Inapplicable Example 1 + +Coming soon + +```html +Code snippet +``` diff --git a/how-to/outcomes/focus-appearance/methods/_template/definitions.md b/how-to/outcomes/focus-appearance/methods/_template/definitions.md new file mode 100644 index 0000000..93ee43b --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/_template/definitions.md @@ -0,0 +1,5 @@ +--- +subtitle: Technical Definitions +--- + +Coming soon diff --git a/how-to/outcomes/focus-appearance/methods/_template/index.md b/how-to/outcomes/focus-appearance/methods/_template/index.md new file mode 100644 index 0000000..6af53a2 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/_template/index.md @@ -0,0 +1,22 @@ +--- +subtitle: Introduction +--- + +### Summary + +Coming soon + +
    +
    +
    Platform:
    +
    Any platform supporting HTML
    +
    +
    +
    Technology:
    +
    HTML
    +
    +
    + +### How it solves user need + +Coming soon \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/methods/_template/test.md b/how-to/outcomes/focus-appearance/methods/_template/test.md new file mode 100644 index 0000000..08fd19a --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/_template/test.md @@ -0,0 +1,13 @@ +--- +subtitle: Test +--- + +Coming soon + +### Applicability + +Coming soon + +### Expectation + +Coming soon diff --git a/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/background.md b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/background.md new file mode 100644 index 0000000..cb7ae9c --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/background.md @@ -0,0 +1,17 @@ +--- +subtitle: Background +--- + +Coming soon + +### Bibliography + +- [Coming soon](https://) + +### Assumptions + +- [Coming soon](https://) + +### Accessibility Support + +Text diff --git a/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/code-snippets.md b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/code-snippets.md new file mode 100644 index 0000000..eb56b89 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/code-snippets.md @@ -0,0 +1,33 @@ +--- +subtitle: Code Snippets +--- + +### Passed + +#### Passed Example 1 + +Coming soon + +```html +Code snippet +``` + +### Failed + +#### Failed Example 1 + +Coming soon + +```html +Code snippet +``` + +### Inapplicable + +#### Inapplicable Example 1 + +Coming soon + +```html +Code snippet +``` diff --git a/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/custom-focus-indicator.json b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/custom-focus-indicator.json new file mode 100644 index 0000000..da19206 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/custom-focus-indicator.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Custom focus indicator", + "slug": "custom-focus-indicator", + "description": "Providing a custom focus indicator for interactive elements." + } +} diff --git a/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/definitions.md b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/definitions.md new file mode 100644 index 0000000..93ee43b --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/definitions.md @@ -0,0 +1,5 @@ +--- +subtitle: Technical Definitions +--- + +Coming soon diff --git a/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/index.md b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/index.md new file mode 100644 index 0000000..4c105d8 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/index.md @@ -0,0 +1,133 @@ +--- +subtitle: Introduction +layout: layout/methods.md +--- + +### Summary + +There are various ways of creating a focus indicator, the following techniques provide custom ways of creating and testing each category of focus indicator. + +- [Line or bounding box indicators](#line-or-bounding-box-indicators) +- [Change of color](#change-of-color) +- [Icon or shape](#icon-or-shape) +- [Tooltip or additional content](#tooltip-or-additional-content) +- [Size change](#size-change) +- [Combination indicators](#combination-indicators) +- [Other indicators](#other-indicators) + + + +## Line or bounding box indicators + + +
    +
    +
    Technology:
    +
    HTML
    +
    +
    + +A bounding box focus indicator using outline, border or box-shadow. + +* **Sufficient Size:** The thickness/length of the focus indicator change is [a sufficient size to be noticeable]. + *

    We will use a metric of 2px of the perimeter -20% as a starting point. This metric needs usability testing, please get in touch if you could help facilitate this.

    + *

    Text within a control is not considered part of the size metric.

    + +* **Change of contrast:** The contrast change of the pixels that indicate the keyboard focus is [sufficient] in a) standard mode, b) dark mode, and c) high contrast mode. + *

    The contrast metric is to be determined, but assumed to be similar to a large-text level.

    +* **Adjacent Contrast:** The focus indicator has sufficient contrast with the adjacent colors in a) standard mode, b) dark mode, and c) high contrast mode + *

    There is a relationship between the area of the focus indicator and contrast that will need to be clarified. E.g. a higher contrast area may not need to be as large.

    + *

    If the focus indicator is adjacent to the focusable element and does not contrast with the element, it can use the Size change method.

    +* **Distinct Style:** The keyboard focus indicator uses a style that is distinct from the style of other controls, so that the item in focus can be distinguished without reference to the non-focused state. +* Multiple controls: There must be at least 3 visible controls of the same style in the view/page. + *

    In order for a change of color to be used, there needs to be a basis for comparison, otherwise another method is needed.

    +* **Adjacent:** The indicator is closer to the focused element than any other focusable element. (The center of the focused element to the center of the indicator.) + + + + +## Change of color + + +The authored focus indicator uses a change of color within the control. + +* **Sufficient Size:** The thickness/length of the focus indicator change is [a sufficient size to be noticeable]. + *

    We will use a metric of 2px of the perimeter -20% as a starting point. This metric needs usability testing, please get in touch if you could help facilitate this.

    + *

    Text within a control is not considered part of the size metric.

    +* **Change of contrast:** The contrast change of the pixels that indicate the keyboard focus is [sufficient] in a) standard mode, b) dark mode, and c) high contrast mode. + *

    The contrast metric is to be determined, but assumed to be similar to a large-text level.

    +* **Distinct Style:** The keyboard focus indicator uses a style that is distinct from the style of other controls, so that the item in focus can be distinguished without reference to the non-focused state. +* Multiple controls: There must be at least 3 visible controls of the same style in the view/page. + *

    In order for a change of color to be used, there needs to be a basis for comparison, otherwise another method is needed.

    + + + +## Icon/shape + + +The authored focus indicator uses the addition/removal of an icon or shape. + +* **Sufficient Size:** The thickness/length of the focus indicator change is [a sufficient size to be noticeable]. + *

    We will use a metric of 2px of the perimeter -20% as a starting point. This metric needs usability testing, please get in touch if you could help facilitate this.

    + *

    Text within a control is not considered part of the size metric.

    +* **Change of contrast:** The contrast change of the pixels that indicate the keyboard focus is [sufficient] in a) standard mode, b) dark mode, and c) high contrast mode. + *

    The contrast metric is to be determined, but assumed to be similar to a large-text level.

    +* **Adjacent Contrast:** The focus indicator has sufficient contrast with the adjacent colors in a) standard mode, b) dark mode, and c) high contrast mode + *

    There is a relationship between the area of the focus indicator and contrast that will need to be clarified. E.g. a higher contrast area may not need to be as large.

    + *

    If the focus indicator is adjacent to the focusable element and does not contrast with the element, it can use the Size change method.

    + + + +## Tooltip/additional content + + +Display a tooltip to indicate the user interface component with focus. + +* **Sufficient Size:** The thickness/length of the focus indicator change is [a sufficient size to be noticeable]. + *

    We will use a metric of 2px of the perimeter -20% as a starting point. This metric needs usability testing, please get in touch if you could help facilitate this.

    + *

    Text within a control is not considered part of the size metric.

    +* **Change of contrast:** The contrast change of the pixels that indicate the keyboard focus is [sufficient] in a) standard mode, b) dark mode, and c) high contrast mode. + *

    The contrast metric is to be determined, but assumed to be similar to a large-text level.

    +* **Adjacent Contrast:** The focus indicator has sufficient contrast with the adjacent colors in a) standard mode, b) dark mode, and c) high contrast mode + *

    There is a relationship between the area of the focus indicator and contrast that will need to be clarified. E.g. a higher contrast area may not need to be as large.

    + *

    If the focus indicator is adjacent to the focusable element and does not contrast with the element, it can use the Size change method.

    + + + +## Size change + + +A change of size of the focusable element to show focus. + +* **Sufficient Size:** The discernable area of the focus indicator change is [sufficient to be noticeable] + *

    We will use a metric of 10% as a starting point. This metric needs usability testing, please get in touch if you could help facilitate this.

    + *

    “discernable area” means the focused element has a discernible border or background, it cannot just be text.

    + *

    Text within a control is not considered part of the size metric.

    +* **Contrast:** The contrast change of the pixels that indicate the keyboard focus is sufficient in a) standard mode, b) dark mode, and c) high contrast mode + + + +## Combination indicators + + +If an indicator uses a combination of techniques, one of those techniques must meet the test. + + + +## Other indicators + + +Using a custom indicator that does not fit into any other method. + +* **Sufficient Size:** The thickness/length of the focus indicator change is sufficient to be noticeable (metric TBC, use 2px perimeter of the (visually apparent) control as the default, should be relative to the visual size of the control.) + *

    Add the complexity of the adjacent contrast vs size of indicator.

    +* Change of contrast: The contrast change of the pixels that indicate the keyboard focus is sufficient in a) standard mode, b) dark mode, and c) high contrast mode. +* **Adjacent Contrast:** The focus indicator has sufficient contrast with the adjacent colors in a) standard mode, b) dark mode, and c) high contrast mode + *

    There is a relationship between the area of the focus indicator and contrast that will need to be clarified.

    + *

    If the focus indicator is adjacent to the focusable element and does not contrast with the element, it may pass via “size change” below.

    +* **Distinct Style:** The keyboard focus indicator uses a style that is distinct from the style of other controls, so that the item in focus can be distinguished without reference to the non-focused state. +* **Adjacent:** The indicator is closer to the focused element than any other focusable element. (The center of the focused element to the centre of the indicator.) + +### How it solves user need + +Coming soon \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/test.md b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/test.md new file mode 100644 index 0000000..08fd19a --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/custom-focus-indicator/test.md @@ -0,0 +1,13 @@ +--- +subtitle: Test +--- + +Coming soon + +### Applicability + +Coming soon + +### Expectation + +Coming soon diff --git a/how-to/outcomes/focus-appearance/methods/default-focus-indicator-check-contrast/default-focus-indicator-check-contrast.json b/how-to/outcomes/focus-appearance/methods/default-focus-indicator-check-contrast/default-focus-indicator-check-contrast.json new file mode 100644 index 0000000..7572ada --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/default-focus-indicator-check-contrast/default-focus-indicator-check-contrast.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Using the default focus indicator and checking contrast", + "slug": "default-focus-indicator-check-contrast", + "description": "The platform’s default indicator is used, and where the backgrounds are changed, the indicator contrast is checked." + } +} diff --git a/how-to/outcomes/focus-appearance/methods/default-focus-indicator-check-contrast/index.md b/how-to/outcomes/focus-appearance/methods/default-focus-indicator-check-contrast/index.md new file mode 100644 index 0000000..58aeec3 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/default-focus-indicator-check-contrast/index.md @@ -0,0 +1,15 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    Baseline
    +
    +
    + +## Techniques + +* **Author technique (HTML, EPUB):** Don’t block the default user agent indicator and ensure that default indicator is present and contrasts with background. \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/methods/default-focus-indicator/default-focus-indicator.json b/how-to/outcomes/focus-appearance/methods/default-focus-indicator/default-focus-indicator.json new file mode 100644 index 0000000..5cc76a4 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/default-focus-indicator/default-focus-indicator.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Using the default focus indicator", + "slug": "default-focus-indicator", + "description": "The platform's default indicator is used." + } +} diff --git a/how-to/outcomes/focus-appearance/methods/default-focus-indicator/index.md b/how-to/outcomes/focus-appearance/methods/default-focus-indicator/index.md new file mode 100644 index 0000000..4d38d52 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/default-focus-indicator/index.md @@ -0,0 +1,16 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    Prerequiste
    +
    +
    + +## Techniques + +* **Platform Method:** Provide a focus indicator that meets the requirements for all focus indicators and bounding box indicators. +* **Author technique (HTML, EPUB):** Don’t block the default user agent indicator and ensure that default indicator is present. The default indicator is not edited by the author. \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/methods/methods.json b/how-to/outcomes/focus-appearance/methods/methods.json new file mode 100644 index 0000000..f25a945 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/methods.json @@ -0,0 +1,3 @@ +{ + "type": "method" +} \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/methods/other-indicators/index.md b/how-to/outcomes/focus-appearance/methods/other-indicators/index.md new file mode 100644 index 0000000..ee06487 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/other-indicators/index.md @@ -0,0 +1,11 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    Baseline
    +
    +
    \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/methods/other-indicators/other-indicators.json b/how-to/outcomes/focus-appearance/methods/other-indicators/other-indicators.json new file mode 100644 index 0000000..ea5e91a --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/other-indicators/other-indicators.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Other focus indicators", + "slug": "other-indicators", + "description": "Using a custom indicator that does not fit into any other method." + } +} diff --git a/how-to/outcomes/focus-appearance/methods/other-indicators/test.md b/how-to/outcomes/focus-appearance/methods/other-indicators/test.md new file mode 100644 index 0000000..f78b442 --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/other-indicators/test.md @@ -0,0 +1,13 @@ +--- +subtitle: Tests +--- + +* **Sufficient Size:** The thickness/length of the focus indicator change is sufficient to be noticeable (metric TBC, use 2px perimeter of the (visually apparent) control as the default, should be relative to the visual size of the control.) + * Note: Add the complexity of the adjacent contrast vs size of indicator. +* Change of contrast: The contrast change of the pixels that indicate the keyboard focus is sufficient in a) standard mode, b) dark mode, and c) high contrast mode. +* **Adjacent Contrast:** The focus indicator has sufficient contrast with the adjacent colors in a) standard mode, b) dark mode, and c) high contrast mode + * Note: There is a relationship between the area of the focus indicator and contrast that will need to be clarified + * There is a relationship between sufficient size and adjacent contrast as well when the contrast is the same between the indicator and adjacent item + * If the focus indicator is adjacent to the focusable element and does not contrast with the element, it may pass via “size change” below. +* **Distinct Style:** The keyboard focus indicator uses a style that is distinct from the style of other controls, so that the item in focus can be distinguished without reference to the non-focused state. +* **Adjacent:** The indicator is closer to the focused element than any other focusable element. (The center of the focused element to the centre of the indicator.) diff --git a/how-to/outcomes/focus-appearance/methods/supplementary-indicators/index.md b/how-to/outcomes/focus-appearance/methods/supplementary-indicators/index.md new file mode 100644 index 0000000..a86019a --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/supplementary-indicators/index.md @@ -0,0 +1,15 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    Enhanced
    +
    +
    + +## Techniques + +* **Author technique (General):** Add a supplementary change to the element with focus, such as an outline or background change. \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/methods/supplementary-indicators/supplementary-indicators.json b/how-to/outcomes/focus-appearance/methods/supplementary-indicators/supplementary-indicators.json new file mode 100644 index 0000000..cbdf83a --- /dev/null +++ b/how-to/outcomes/focus-appearance/methods/supplementary-indicators/supplementary-indicators.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Supplementary indicators", + "slug": "supplementary-indicators", + "description": "In addition to the focus indicator, there is another change to the focusable element." + } +} diff --git a/how-to/outcomes/focus-appearance/outcome.json b/how-to/outcomes/focus-appearance/outcome.json new file mode 100644 index 0000000..9c4e4d0 --- /dev/null +++ b/how-to/outcomes/focus-appearance/outcome.json @@ -0,0 +1,5 @@ +{ + "index": 0, + "title": "Keyboard Focus Appearance", + "description": "Users can see which element has keyboard focus." +} diff --git a/how-to/outcomes/focus-appearance/research.md b/how-to/outcomes/focus-appearance/research.md new file mode 100644 index 0000000..89f1eb5 --- /dev/null +++ b/how-to/outcomes/focus-appearance/research.md @@ -0,0 +1,10 @@ +--- +title: Research +layout: outcome.html +--- + +* Zhao, Dandan, and Bo Pan. 2021. “[Psychological Cognition and Thinking Needs in Visual Communication Design.](https://doi.org/10.1051/e3sconf/202123605070)” Edited by M. Anpo and F. Song. E3S Web of Conferences 236: 05070. +* Dresp-Langley, Birgitta, and Adam Reeves. 2020. "[Color for the Perceptual Organization of the Pictorial Plane: Victor Vasarely’s Legacy to Gestalt Psychology.](https://doi.org/10.1016/j.heliyon.2020.e04375)” Heliyon 6 (7): e04375. +* Rosa, Maria Eduarda Ramos Cavalcanti, and Anna Sylvia Ramos de Rangel Moreira Cavalcanti. 2023. “[The Visual Perception of People with Autism Spectrum Disorder and Its Implications: An Approach from Gestalt.](https://sevenpublicacoes.com.br/index.php/editora/article/view/924)” Seven Editora, April. +* Trujillo, James P, and Judith Holler. 2023. “[Interactionally Embedded Gestalt Principles of Multimodal Human Communication.](https://doi.org/10.1177/17456916221141422)” Perspectives on Psychological Science 18 (5): 174569162211414-174569162211414. +* Feldman, Bueno, and Chen. 2023. "[Focus States Research & Solutions](https://docs.google.com/presentation/d/1luwiP519TITHicm0g-5xnE_l47Yyw96nUJSNW8Z2wEU/edit?resourcekey=0-AHcVjjJ5TIM-9VJmxpiKlQ#slide=id.g1b8ea21c7ad_0_266)". Google research on focus indicators, presented to AGWG. \ No newline at end of file diff --git a/how-to/outcomes/focus-appearance/resources.md b/how-to/outcomes/focus-appearance/resources.md new file mode 100644 index 0000000..445ff2b --- /dev/null +++ b/how-to/outcomes/focus-appearance/resources.md @@ -0,0 +1,8 @@ +--- +title: Resources +layout: outcome.html +--- + +## W3C Resources + +Coming soon diff --git a/how-to/outcomes/focus-appearance/user-needs.md b/how-to/outcomes/focus-appearance/user-needs.md new file mode 100644 index 0000000..f003487 --- /dev/null +++ b/how-to/outcomes/focus-appearance/user-needs.md @@ -0,0 +1,21 @@ +--- +title: User Needs +layout: outcome.html +--- + +## Barriers Encountered + +* barrier +* barrier + +## Common User Needs + +* user needs that are common across different disabilities + +## Unique User Needs + +* user needs that may be in conflict with needs of other disability groups + +## Functional Needs + +* "Use with" lists from FAST (or in addition to the FAST document) diff --git a/how-to/outcomes/index.md b/how-to/outcomes/index.md index e052d99..a3e6f6b 100644 --- a/how-to/outcomes/index.md +++ b/how-to/outcomes/index.md @@ -1,7 +1,7 @@ --- -title: WCAG 3 Outcomes +title: All WCAG 3 Outcomes --- -# WCAG 3 Outcomes +# All WCAG 3 Outcomes {% include "outcomes-list.html" %} diff --git a/how-to/outcomes/text-alternatives/index.md b/how-to/outcomes/text-alternatives/index.md new file mode 100644 index 0000000..069d412 --- /dev/null +++ b/how-to/outcomes/text-alternatives/index.md @@ -0,0 +1,70 @@ +--- +layout: outcome.html +--- + +## Goal + +A user is provided an understandable description of the information or functionality contained within an image. +If there is no information conveyed by the image, the user's assistive technology should be able to ignore the image. + +## Normative text + +
    + +### Guideline + +

    {{ outcome.description }}

    + +
    + +### Foundational Requirements + +1. Would removing the image impact how people understand the page? (Prerequisite) + 1. No, [decorative images are programmatically hidden](methods/decorative-images). Stop. + 2. Yes, continue. + +2. Is the image presented in a way that is available to user agents and assistive technology? (Prerequisite) + 1. Yes, image must meet [@@@ programatic availability] image AND the [accessibility support set] incorporates [Equivalent text alternatives are available for images that convey content](methods/equivalent-alternative-text). Stop. + 2. No, continue. + +3. Is an equivalent text alternative available for the image? (Baseline) + 1. Yes, image must meet [Equivalent text alternatives are available for images that convey content](methods/equivalent-alternative-text). Stop. + 2. No, fail. + +
    + +### Supplimental Requirements + +- [The role and importance of images are programmatically indicated](methods/role-of-images) (Supporting requirement). +- [The type of image (photo, icon, etc.) is indicated](methods/type-of-image) (Supporting requirement). +- [Auto generated text descriptions are editable by content creator](methods/editable-alt-text) (Supporting requirement). + +### Assertions + +- [Text alternatives follow an organizational style guide](methods/text-alt-styleguide). + +
    + +## What to do + +
    + +The general way to determine whether an image is conveyed appropriately is to: + +1. Remove, hide, or mask the image. +2. Replace it with the text alternative. +3. Check that the meaning is substantively equivalent + 1. the purpose of the non-text content is met by the text alternative. + 2. The way the content is presented is using the most appropriate, accessibility-supported (math, code samples, etc.) +4. If the non-text content contains words that are important to understanding the content, the words are included in the text alternative. +5. If the non-text content duplicates adjacent text, the alternative may be null. + +
    + +## Definitions + +* **Image** - a visual representation of something. +* **Equivalent to the image** - text or audio which serves an equivalent purpose to what presenting the image achieves. Where text is embedded in an image that text is included in the equivalent unless it is incidental text from a photo (e.g. a street sign in a photo of a town). +* **Decorative image** - serving only an aesthetic purpose, providing no information, and having no functionality Removing the image would not affect the meaning or function of the page. +* **Complex image** - an image which requires more than one or two sentences to describe the contents. +* **Text** - a sequence of characters that can be programmatically determined, where the sequence is expressing something in human language. \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods.md b/how-to/outcomes/text-alternatives/methods.md new file mode 100644 index 0000000..cc966db --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods.md @@ -0,0 +1,27 @@ +--- +layout: layout/methods.md +--- + +## Decision tree + +The approach to a text alternative depends on the type of image and how it is used. + +The following decision tree is used to determine the appropriate method. + +For each image: + +
    + +1. Would removing the image impact how people understand the page? (Prerequisite) + 1. No, image must meet [Decorative images](decorative-images) [stop] + 2. Yes, continue + +2. Is the image presented in a way that is available to user agents and assistive technology? (Prerequisite) + 1. Yes, image must meet [@@@ programatic availability] image AND the [accessibility support set] incorporates [Equivalent alternative text](equivalent-alternative-text). [stop] + 2. No, continue + +3. Is an equivalent text alternative available for the image? (Baseline) + 1. Yes, image must meet [Equivalent alternative text](equivalent-alternative-text) [stop] + 2. No, fail + +
    \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods/complex-images/complex-images.json b/how-to/outcomes/text-alternatives/methods/complex-images/complex-images.json new file mode 100644 index 0000000..bcfc97d --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/complex-images/complex-images.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Complex images", + "slug": "complex-images", + "description": "@@@" + } +} diff --git a/how-to/outcomes/text-alternatives/methods/complex-images/index.md b/how-to/outcomes/text-alternatives/methods/complex-images/index.md new file mode 100644 index 0000000..5a51975 --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/complex-images/index.md @@ -0,0 +1,18 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    @@@
    +
    +
    + +## Techniques + +* **Author technique (General):** Include text that provides equivalent information in a show/hide element near the image. +* **Author technique (General):** Include structured text information that provides equivalent information for the image. +* **Platform:** User-agents provide descriptions of the image [future method? And requires “accessibility supported”]. +* **Author technique (General):** For artistic content (where the image conveys a aesthetic or emotional content that has no equivalent), include text that provides descriptive information near the image. \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods/control-images/control-images.json b/how-to/outcomes/text-alternatives/methods/control-images/control-images.json new file mode 100644 index 0000000..0057ab8 --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/control-images/control-images.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Control images", + "slug": "control-images", + "description": "@@@" + } +} diff --git a/how-to/outcomes/text-alternatives/methods/control-images/index.md b/how-to/outcomes/text-alternatives/methods/control-images/index.md new file mode 100644 index 0000000..d2633d5 --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/control-images/index.md @@ -0,0 +1,21 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    @@@
    +
    +
    + +## Techniques + +* **Author technique (HTML):** The author marks which images are important [future method]. +* **Author technique (General):** Include visible text that provides equivalent information to each image. +* **Platform:** Relying on user agents to describe images [future method? And requires “accessibility supported”]. +* **Author technique (HTML, EPUB, PDF):** Using ```alt``` attributes to describe images. +* **Author technique (iOS)**: Using ```accessibilityLabel``` to describe images. +* **Author technique (Android)**: Using ```contentDescription``` to describe images. +* **Author technique (VR platform X)**: Using ```X``` attribute to describe images. \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods/decorative-images/decorative-images.json b/how-to/outcomes/text-alternatives/methods/decorative-images/decorative-images.json new file mode 100644 index 0000000..6eae3df --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/decorative-images/decorative-images.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Decorative images", + "slug": "decorative-images", + "description": "@@@" + } +} \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods/decorative-images/index.md b/how-to/outcomes/text-alternatives/methods/decorative-images/index.md new file mode 100644 index 0000000..a187846 --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/decorative-images/index.md @@ -0,0 +1,18 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    @@@
    +
    +
    + +## Techniques + +* **Author technique (HTML, EPUB):** Using an empty ```alt``` attributes so the image is ignored. +* **Author technique (PDF):** Using 'artifact' elements so the image is ignored. +* **Author technique (iOS):** Using ```isAccessibilityElement``` so the image is ignored. +* **Author technique (Android):** Using ```importantForAccessibility``` so the image is ignored. \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods/equivalent-alternative-text/equivalent-alternative-text.json b/how-to/outcomes/text-alternatives/methods/equivalent-alternative-text/equivalent-alternative-text.json new file mode 100644 index 0000000..bab4e66 --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/equivalent-alternative-text/equivalent-alternative-text.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Equivalent alternative text", + "slug": "equivalent-alternative-text", + "description": "@@@" + } +} diff --git a/how-to/outcomes/text-alternatives/methods/equivalent-alternative-text/index.md b/how-to/outcomes/text-alternatives/methods/equivalent-alternative-text/index.md new file mode 100644 index 0000000..7b0dfab --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/equivalent-alternative-text/index.md @@ -0,0 +1,21 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    @@@
    +
    +
    + +## Techniques + +* **Author technique (HTML):** The author marks which images are important [future method]. +* **Author technique (General):** Include visible text that provides equivalent information to each image. +* **Platform:** Relying on user agents to describe images [future method? And requires “accessibility supported”]. +* **Author technique (HTML, EPUB, PDF):** Using ```alt``` attributes to describe images. +* **Author technique (iOS)**: Using ```accessibilityLabel``` to describe images. +* **Author technique (Android)**: Using ```contentDescription``` to describe images. +* **Author technique (VR platform X)**: Using ```X``` attribute to describe images. diff --git a/how-to/outcomes/text-alternatives/methods/methods.json b/how-to/outcomes/text-alternatives/methods/methods.json new file mode 100644 index 0000000..f25a945 --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/methods.json @@ -0,0 +1,3 @@ +{ + "type": "method" +} \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods/multiple-images/index.md b/how-to/outcomes/text-alternatives/methods/multiple-images/index.md new file mode 100644 index 0000000..d2d5485 --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/multiple-images/index.md @@ -0,0 +1,15 @@ +--- +layout: method.html +subtitle: Introduction +--- + +
    +
    +
    Level:
    +
    @@@
    +
    +
    + +## Techniques + +* TBC \ No newline at end of file diff --git a/how-to/outcomes/text-alternatives/methods/multiple-images/multiple-images.json b/how-to/outcomes/text-alternatives/methods/multiple-images/multiple-images.json new file mode 100644 index 0000000..8daa68d --- /dev/null +++ b/how-to/outcomes/text-alternatives/methods/multiple-images/multiple-images.json @@ -0,0 +1,8 @@ +{ + "method": { + "index": 1, + "title": "Multiple images", + "slug": "multiple-images", + "description": "@@@" + } +} diff --git a/how-to/outcomes/text-alternatives/outcome.json b/how-to/outcomes/text-alternatives/outcome.json new file mode 100644 index 0000000..3adc191 --- /dev/null +++ b/how-to/outcomes/text-alternatives/outcome.json @@ -0,0 +1,5 @@ +{ + "index": 0, + "title": "Text Alternatives", + "description": "Users have equivalent text alternatives for all images." +} diff --git a/how-to/outcomes/text-alternatives/text-alternatives.11tydata.js b/how-to/outcomes/text-alternatives/text-alternatives.11tydata.js new file mode 100644 index 0000000..baddaa9 --- /dev/null +++ b/how-to/outcomes/text-alternatives/text-alternatives.11tydata.js @@ -0,0 +1,3 @@ +module.exports = { + ...require('../../build/get-outcome')(__dirname) +} diff --git a/how-to/package-lock.json b/how-to/package-lock.json index c1d2f51..74d3296 100644 --- a/how-to/package-lock.json +++ b/how-to/package-lock.json @@ -1,11 +1,11 @@ { - "name": "wcag3-docs", + "name": "wcag3-how-to", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "wcag3-docs", + "name": "wcag3-how-to", "version": "1.0.0", "license": "ISC", "devDependencies": { @@ -368,10 +368,11 @@ "dev": true }, "node_modules/assert-never": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.2.1.tgz", - "integrity": "sha512-TaTivMB6pYI1kXwrFlEhLeGfOqoDNdTxjCdwRfFFkEA30Eu+k48W34nlok2EYWJfFFzqaEmichdNM7th6M5HNw==", - "dev": true + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/assert-never/-/assert-never-1.3.0.tgz", + "integrity": "sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==", + "dev": true, + "license": "MIT" }, "node_modules/async": { "version": "3.2.4", @@ -384,6 +385,7 @@ "resolved": "https://registry.npmjs.org/babel-walk/-/babel-walk-3.0.0-canary-5.tgz", "integrity": "sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==", "dev": true, + "license": "MIT", "dependencies": { "@babel/types": "^7.9.6" }, @@ -456,12 +458,13 @@ } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -631,7 +634,8 @@ "version": "1.1.0", "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz", "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/dom-serializer": { "version": "1.4.1", @@ -704,10 +708,11 @@ "dev": true }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", "dev": true, + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -850,10 +855,11 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1228,6 +1234,7 @@ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -1291,7 +1298,8 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/js-yaml": { "version": "3.14.1", @@ -1488,12 +1496,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1722,10 +1731,11 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz", - "integrity": "sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==", - "dev": true + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz", + "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==", + "dev": true, + "license": "MIT" }, "node_modules/picomatch": { "version": "2.3.1", @@ -1834,12 +1844,13 @@ "dev": true }, "node_modules/pug": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.2.tgz", - "integrity": "sha512-bp0I/hiK1D1vChHh6EfDxtndHji55XP/ZJKwsRqrz6lRia6ZC2OZbdAymlxdVFwd1L70ebrVJw4/eZ79skrIaw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug/-/pug-3.0.3.tgz", + "integrity": "sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==", "dev": true, + "license": "MIT", "dependencies": { - "pug-code-gen": "^3.0.2", + "pug-code-gen": "^3.0.3", "pug-filters": "^4.0.0", "pug-lexer": "^5.0.1", "pug-linker": "^4.0.0", @@ -1854,6 +1865,7 @@ "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-3.0.0.tgz", "integrity": "sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==", "dev": true, + "license": "MIT", "dependencies": { "constantinople": "^4.0.1", "js-stringify": "^1.0.2", @@ -1861,26 +1873,28 @@ } }, "node_modules/pug-code-gen": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.2.tgz", - "integrity": "sha512-nJMhW16MbiGRiyR4miDTQMRWDgKplnHyeLvioEJYbk1RsPI3FuA3saEP8uwnTb2nTJEKBU90NFVWJBk4OU5qyg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-3.0.3.tgz", + "integrity": "sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==", "dev": true, + "license": "MIT", "dependencies": { "constantinople": "^4.0.1", "doctypes": "^1.1.0", "js-stringify": "^1.0.2", "pug-attrs": "^3.0.0", - "pug-error": "^2.0.0", - "pug-runtime": "^3.0.0", + "pug-error": "^2.1.0", + "pug-runtime": "^3.0.1", "void-elements": "^3.1.0", "with": "^7.0.0" } }, "node_modules/pug-error": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.0.0.tgz", - "integrity": "sha512-sjiUsi9M4RAGHktC1drQfCr5C5eriu24Lfbt4s+7SykztEOwVZtbFk1RRq0tzLxcMxMYTBR+zMQaG07J/btayQ==", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-2.1.0.tgz", + "integrity": "sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==", + "dev": true, + "license": "MIT" }, "node_modules/pug-filters": { "version": "4.0.0", @@ -1940,7 +1954,8 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-3.0.1.tgz", "integrity": "sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/pug-strip-comments": { "version": "2.0.0", @@ -2224,6 +2239,7 @@ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -2270,6 +2286,7 @@ "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -2294,6 +2311,7 @@ "resolved": "https://registry.npmjs.org/with/-/with-7.0.2.tgz", "integrity": "sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==", "dev": true, + "license": "MIT", "dependencies": { "@babel/parser": "^7.9.6", "@babel/types": "^7.9.6", @@ -2317,10 +2335,11 @@ "dev": true }, "node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" },