From 9e7cf414fb087f45e3745a7dba25f848526176a9 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Thu, 2 Nov 2023 16:07:56 -0500 Subject: [PATCH 01/14] initial rule creation #1675 --- .../en-US/element_draggable_alternative.html | 97 ++++++++++++++ .../v4/rules/element_draggable_alternative.ts | 123 ++++++++++++++++++ .../v4/rules/element_tabbable_unobscured.ts | 1 - .../src/v4/rulesets.ts | 1 + .../src/v4/sc-urls.json | 12 ++ 5 files changed, 233 insertions(+), 1 deletion(-) create mode 100644 accessibility-checker-engine/help-v4/en-US/element_draggable_alternative.html create mode 100644 accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts diff --git a/accessibility-checker-engine/help-v4/en-US/element_draggable_alternative.html b/accessibility-checker-engine/help-v4/en-US/element_draggable_alternative.html new file mode 100644 index 000000000..fa9d44e73 --- /dev/null +++ b/accessibility-checker-engine/help-v4/en-US/element_draggable_alternative.html @@ -0,0 +1,97 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts b/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts new file mode 100644 index 000000000..565d923a3 --- /dev/null +++ b/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts @@ -0,0 +1,123 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ + +import { RPTUtil } from "../../v2/checker/accessibility/util/legacy"; +import { Rule, RuleResult, RuleContext, RulePass, RuleContextHierarchy, RulePotential } from "../api/IRule"; +import { eRulePolicy, eToolkitLevel } from "../api/IRule"; +import { VisUtil } from "../../v2/dom/VisUtil"; +import { DOMMapper } from "../../v2/dom/DOMMapper"; + +export let element_draggable_alternative: Rule = { + id: "element_draggable_alternative", + context: "dom:*", + dependencies: [], + help: { + "en-US": { + "group": "element_draggable_alternative.html", + "pass": "element_draggable_alternative.html", + "potential_obscured": "element_draggable_alternative.html" + } + }, + messages: { + "en-US": { + "group": "When an element receives focus, it is not entirely covered by other content", + "pass": "The element is not entirely covered by other content", + "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + } + }, + rulesets: [{ + id: ["WCAG_2_2"], + num: ["2.5.7"], + level: eRulePolicy.VIOLATION, + toolkitLevel: eToolkitLevel.LEVEL_THREE + }], + act: [], + run: (context: RuleContext, options?: {}, contextHierarchies?: RuleContextHierarchy): RuleResult | RuleResult[] => { + const ruleContext = context["dom"].node as HTMLElement; + if (!VisUtil.isNodeVisible(ruleContext) || !RPTUtil.isTabbable(ruleContext)) + return null; + + const nodeName = ruleContext.nodeName.toLocaleLowerCase(); + + //ignore certain elements + if (RPTUtil.getAncestor(ruleContext, ["pre", "code", "script", "meta"]) !== null + || nodeName === "body" || nodeName === "html" ) + return null; + + const bounds = context["dom"].bounds; + + //in case the bounds not available + if (!bounds) return null; + + //ignore if offscreen + if (bounds['height'] === 0 || bounds['width'] === 0 ) + return null; + + const doc = ruleContext.ownerDocument; + if (!doc) { + return null; + } + const win = doc.defaultView; + if (!win) { + return null; + } + + const cStyle = win.getComputedStyle(ruleContext); + if (cStyle === null) + return null; + + let zindex = cStyle.zIndex; + if (!zindex || zindex === 'auto') + zindex = "0"; + + const elems = doc.querySelectorAll('body *:not(script)'); + if (!elems || elems.length == 0) + return; + + const mapper : DOMMapper = new DOMMapper(); + let violations = []; + let before = true; + elems.forEach(elem => { + /** + * the nodes returned from querySelectorAll is in document order + * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later + */ + if (ruleContext.contains(elem)) { + //the next node in elems will be after the target node (ruleContext). + before = false; + } else if (VisUtil.isNodeVisible(elem) && !elem.contains(ruleContext)) { + const bnds = mapper.getBounds(elem); + const zStyle = win.getComputedStyle(elem); + let z_index = '0'; + if (zStyle) { + z_index = zStyle.zIndex; + if (!z_index || isNaN(Number(z_index))) + z_index = "0"; + } + if (bnds.height !== 0 && bnds.width !== 0 + && bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height + && bnds.left + bnds.height >= bounds.left + bounds.width + && (before ? parseInt(zindex) < parseInt(z_index): parseInt(zindex) <= parseInt(z_index))) + { + violations.push(elem); + } + } + }); + + if (violations.length > 0) { + return RulePotential("potential_obscured", []); + } + + return RulePass("pass"); + } +} diff --git a/accessibility-checker-engine/src/v4/rules/element_tabbable_unobscured.ts b/accessibility-checker-engine/src/v4/rules/element_tabbable_unobscured.ts index 7d6057c6b..d84272253 100644 --- a/accessibility-checker-engine/src/v4/rules/element_tabbable_unobscured.ts +++ b/accessibility-checker-engine/src/v4/rules/element_tabbable_unobscured.ts @@ -16,7 +16,6 @@ import { Rule, RuleResult, RuleContext, RulePass, RuleContextHierarchy, RulePote import { eRulePolicy, eToolkitLevel } from "../api/IRule"; import { VisUtil } from "../../v2/dom/VisUtil"; import { DOMMapper } from "../../v2/dom/DOMMapper"; -import { DOMUtil } from "../../v2/dom/DOMUtil"; export let element_tabbable_unobscured: Rule = { id: "element_tabbable_unobscured", diff --git a/accessibility-checker-engine/src/v4/rulesets.ts b/accessibility-checker-engine/src/v4/rulesets.ts index f5a4eea58..b46ec0a5c 100644 --- a/accessibility-checker-engine/src/v4/rulesets.ts +++ b/accessibility-checker-engine/src/v4/rulesets.ts @@ -61,6 +61,7 @@ const summaries = { "2.5.2": "For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.", "2.5.3": "For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.", "2.5.4": "Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.", + "2.5.7": "All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.", "3.1.1": "The default human language of Web pages, non-Web documents, or software can be programmatically determined.", "3.1.2": "The human language of each passage or phrase in the content can be programmatically determined.", "3.2.1": "When any component receives focus, it does not initiate a change of context.", diff --git a/accessibility-checker-engine/src/v4/sc-urls.json b/accessibility-checker-engine/src/v4/sc-urls.json index a84f4603c..93183bb16 100644 --- a/accessibility-checker-engine/src/v4/sc-urls.json +++ b/accessibility-checker-engine/src/v4/sc-urls.json @@ -707,6 +707,18 @@ "level": "AAA", "wcagType": "2.1" }, + "2.5.7": { + "num": "2.5.7", + "url": "https://www.w3.org/TR/WCAG22/#dragging-movements", + "scId": "WCAG2:dragging-movement", + "scAltId": ["dragging-movement"], + "test": "WCAG2:WCAG2:dragging-movement", + "howToMeetUrl": "https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html", + "understandingUrl": "https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html", + "handle": "Dragging Movement", + "level": "AA", + "wcagType": "2.2" + }, "3.1.1": { "num": "3.1.1", "url": "https://www.w3.org/TR/WCAG21/#language-of-page", From 1f76df60759999f9e7e7fb3b97f6492db61e73e2 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Thu, 2 Nov 2023 16:35:23 -0500 Subject: [PATCH 02/14] update the context #1675 --- .../src/v4/rules/element_draggable_alternative.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts b/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts index 565d923a3..5629340c0 100644 --- a/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts +++ b/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts @@ -19,7 +19,7 @@ import { DOMMapper } from "../../v2/dom/DOMMapper"; export let element_draggable_alternative: Rule = { id: "element_draggable_alternative", - context: "dom:*", + context: "dom:*[draggable]", dependencies: [], help: { "en-US": { From aedb7c2204d4e747f39bbfda96734c6d750671a5 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Fri, 3 Nov 2023 10:26:22 -0500 Subject: [PATCH 03/14] initial rule #1675 --- .../v4/rules/element_draggable_alternative.ts | 72 +++---------------- 1 file changed, 10 insertions(+), 62 deletions(-) diff --git a/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts b/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts index 5629340c0..96200dbe6 100644 --- a/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts +++ b/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts @@ -15,7 +15,6 @@ import { RPTUtil } from "../../v2/checker/accessibility/util/legacy"; import { Rule, RuleResult, RuleContext, RulePass, RuleContextHierarchy, RulePotential } from "../api/IRule"; import { eRulePolicy, eToolkitLevel } from "../api/IRule"; import { VisUtil } from "../../v2/dom/VisUtil"; -import { DOMMapper } from "../../v2/dom/DOMMapper"; export let element_draggable_alternative: Rule = { id: "element_draggable_alternative", @@ -44,7 +43,7 @@ export let element_draggable_alternative: Rule = { act: [], run: (context: RuleContext, options?: {}, contextHierarchies?: RuleContextHierarchy): RuleResult | RuleResult[] => { const ruleContext = context["dom"].node as HTMLElement; - if (!VisUtil.isNodeVisible(ruleContext) || !RPTUtil.isTabbable(ruleContext)) + if (!VisUtil.isNodeVisible(ruleContext)) return null; const nodeName = ruleContext.nodeName.toLocaleLowerCase(); @@ -57,67 +56,16 @@ export let element_draggable_alternative: Rule = { const bounds = context["dom"].bounds; //in case the bounds not available - if (!bounds) return null; - - //ignore if offscreen - if (bounds['height'] === 0 || bounds['width'] === 0 ) - return null; + if (ruleContext.getAttribute("draggable") === 'true') + if (ruleContext.hasAttribute("ondragstart")) + return RulePotential("potential_alternative", [nodeName]); + else + return RulePotential("potential_draggable", [nodeName]); - const doc = ruleContext.ownerDocument; - if (!doc) { - return null; - } - const win = doc.defaultView; - if (!win) { - return null; - } - - const cStyle = win.getComputedStyle(ruleContext); - if (cStyle === null) + else if (ruleContext.getAttribute("draggable") === 'false') + return RulePass("pass_undraggable", [nodeName]); + + else return null; - - let zindex = cStyle.zIndex; - if (!zindex || zindex === 'auto') - zindex = "0"; - - const elems = doc.querySelectorAll('body *:not(script)'); - if (!elems || elems.length == 0) - return; - - const mapper : DOMMapper = new DOMMapper(); - let violations = []; - let before = true; - elems.forEach(elem => { - /** - * the nodes returned from querySelectorAll is in document order - * if two elements overlap and z-index are not defined, then the node rendered earlier will be overlaid by the node rendered later - */ - if (ruleContext.contains(elem)) { - //the next node in elems will be after the target node (ruleContext). - before = false; - } else if (VisUtil.isNodeVisible(elem) && !elem.contains(ruleContext)) { - const bnds = mapper.getBounds(elem); - const zStyle = win.getComputedStyle(elem); - let z_index = '0'; - if (zStyle) { - z_index = zStyle.zIndex; - if (!z_index || isNaN(Number(z_index))) - z_index = "0"; - } - if (bnds.height !== 0 && bnds.width !== 0 - && bnds.top <= bounds.top && bnds.left <= bounds.left && bnds.top + bnds.height >= bounds.top + bounds.height - && bnds.left + bnds.height >= bounds.left + bounds.width - && (before ? parseInt(zindex) < parseInt(z_index): parseInt(zindex) <= parseInt(z_index))) - { - violations.push(elem); - } - } - }); - - if (violations.length > 0) { - return RulePotential("potential_obscured", []); - } - - return RulePass("pass"); } } From c4cfab95ad5903db8218f664d44f030c4736246c Mon Sep 17 00:00:00 2001 From: Shunguo Date: Fri, 3 Nov 2023 12:02:09 -0500 Subject: [PATCH 04/14] change rule id #1675 --- ...html => draggable_alternative_exists.html} | 0 ...ive.ts => draggable_alternative_exists.ts} | 10 +- .../element_draggable.html | 79 ++++++ .../element_overlaid_hidden_zindex.html | 101 ++++++++ .../element_overlaid_visible_default.html | 99 +++++++ .../element_overlaid_visible_zindex.html | 101 ++++++++ .../element_unobscured.html | 242 ++++++++++++++++++ 7 files changed, 627 insertions(+), 5 deletions(-) rename accessibility-checker-engine/help-v4/en-US/{element_draggable_alternative.html => draggable_alternative_exists.html} (100%) rename accessibility-checker-engine/src/v4/rules/{element_draggable_alternative.ts => draggable_alternative_exists.ts} (91%) create mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html create mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html create mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html create mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html create mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html diff --git a/accessibility-checker-engine/help-v4/en-US/element_draggable_alternative.html b/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html similarity index 100% rename from accessibility-checker-engine/help-v4/en-US/element_draggable_alternative.html rename to accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html diff --git a/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts similarity index 91% rename from accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts rename to accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts index 96200dbe6..7565db2e7 100644 --- a/accessibility-checker-engine/src/v4/rules/element_draggable_alternative.ts +++ b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts @@ -16,15 +16,15 @@ import { Rule, RuleResult, RuleContext, RulePass, RuleContextHierarchy, RulePote import { eRulePolicy, eToolkitLevel } from "../api/IRule"; import { VisUtil } from "../../v2/dom/VisUtil"; -export let element_draggable_alternative: Rule = { - id: "element_draggable_alternative", +export let draggable_alternative_exists: Rule = { + id: "draggable_alternative_exists", context: "dom:*[draggable]", dependencies: [], help: { "en-US": { - "group": "element_draggable_alternative.html", - "pass": "element_draggable_alternative.html", - "potential_obscured": "element_draggable_alternative.html" + "group": "draggable_alternative_exists.html", + "pass": "draggable_alternative_exists.html", + "potential_obscured": "draggable_alternative_exists.html" } }, messages: { diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html new file mode 100755 index 000000000..c41aeee20 --- /dev/null +++ b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html @@ -0,0 +1,79 @@ + + + + + + + + RPT Test Suite + + + + + +

This text may be dragged.

+ + + + + diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html new file mode 100755 index 000000000..ac5812e05 --- /dev/null +++ b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html @@ -0,0 +1,101 @@ + + + + + + + + RPT Test Suite + + + + + +
1
+
2
+ + + + + diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html new file mode 100755 index 000000000..4bec86731 --- /dev/null +++ b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html @@ -0,0 +1,99 @@ + + + + + + + + RPT Test Suite + + + + + +
1
+
2
+ + + + + diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html new file mode 100755 index 000000000..f8dce5098 --- /dev/null +++ b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html @@ -0,0 +1,101 @@ + + + + + + + + RPT Test Suite + + + + + +
1
+
2
+ + + + + diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html new file mode 100755 index 000000000..4e626f5ae --- /dev/null +++ b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html @@ -0,0 +1,242 @@ + + + + + + Using CSS margin and scroll-margin to un-obscure content + + + +
+

Fixed-Position Banner

+ +
+ +
+
+

Main Content

+
+

+ +

+ +

+ +

+ +

+ +

+

+ +

+ +
+ + +
+ + + + + From 92bcaffebac58bd3ef3de63076f6d891217f7962 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Fri, 3 Nov 2023 14:23:15 -0500 Subject: [PATCH 05/14] add test cases #1675 --- .../v4/rules/draggable_alternative_exists.ts | 14 +-- .../src/v4/rules/index.ts | 1 + .../element_draggable.html | 42 ++++--- .../element_dropstop.html | 105 ++++++++++++++++++ .../element_overlaid_hidden_zindex.html | 101 ----------------- 5 files changed, 138 insertions(+), 125 deletions(-) create mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_dropstop.html delete mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html diff --git a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts index 7565db2e7..a91ee918e 100644 --- a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts +++ b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts @@ -29,9 +29,10 @@ export let draggable_alternative_exists: Rule = { }, messages: { "en-US": { - "group": "When an element receives focus, it is not entirely covered by other content", - "pass": "The element is not entirely covered by other content", - "potential_obscured": "Confirm that when the element receives focus, it is not covered or, if covered by user action, can be uncovered without moving focus" + "group": "A draggable element must have a \"single pointer\" alternative", + "pass_alternative": "The draggable element \"{0}\" has a \"single pointer\" alternative", + "pass_undraggable": "The element \"{0}\" is not draggable", + "potential_alternative": "Ensure the draggable element \"{0}\" has a \"single pointer\" alternative" } }, rulesets: [{ @@ -57,14 +58,9 @@ export let draggable_alternative_exists: Rule = { //in case the bounds not available if (ruleContext.getAttribute("draggable") === 'true') - if (ruleContext.hasAttribute("ondragstart")) - return RulePotential("potential_alternative", [nodeName]); - else - return RulePotential("potential_draggable", [nodeName]); - + return RulePotential("potential_alternative", [nodeName]); else if (ruleContext.getAttribute("draggable") === 'false') return RulePass("pass_undraggable", [nodeName]); - else return null; } diff --git a/accessibility-checker-engine/src/v4/rules/index.ts b/accessibility-checker-engine/src/v4/rules/index.ts index f9430b5e7..2bb42749f 100644 --- a/accessibility-checker-engine/src/v4/rules/index.ts +++ b/accessibility-checker-engine/src/v4/rules/index.ts @@ -80,6 +80,7 @@ export * from "./debug_paths" export * from "./detector_tabbable" export * from "./dir_attribute_valid" export * from "./download_keyboard_controllable" +export * from "./draggable_alternative_exists" export * from "./element_accesskey_labelled" export * from "./element_accesskey_unique" export * from "./element_attribute_deprecated" diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html index c41aeee20..d1651bc4c 100755 --- a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html +++ b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_draggable.html @@ -33,41 +33,53 @@ -

This text may be dragged.

+

no draggable defined: This text may be dragged by selection.

+ +

draggable false: This text may be selected and dragged.

+ +

draggable undefined:This text may be selected and dragged.

+ +

draggable true: This text may be dragged.

+ + + + + + +

Drag or move the image into the rectangle:

+ +
+
+ +
+
+ + + + + diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html deleted file mode 100755 index ac5812e05..000000000 --- a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_hidden_zindex.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - RPT Test Suite - - - - - -
1
-
2
- - - - - From 17499890a50297b2607fa5df4277563f5437c6ac Mon Sep 17 00:00:00 2001 From: Phill Jenkins Date: Mon, 6 Nov 2023 10:26:03 -0600 Subject: [PATCH 06/14] Update Help Initial commit for Help content --- .../en-US/draggable_alternative_exists.html | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html b/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html index fa9d44e73..98f688510 100644 --- a/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html +++ b/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html @@ -45,22 +45,26 @@

### Why is this important? -When users cannot see the item with focus because it is covered (hidden) by another element, they may not know how to proceed, or may even think the system has become unresponsive. -The objective is to ensure that the element receiving focus is always partially visible to the user unless it is covered by the user’s action. -Knowing the current element with focus is critical for sighted people who rely on a keyboard (or technology that operates through the keyboard interface, such as a switch or voice input). -The element with focus signals the interaction point on the page. +Some people cannot use a mouse, pen, or touch to drag items. The design should not rely on dragging as the only means for the user’s actions. -However, content opened or controlled by the _user’s action_ may obscure the element receiving focus. -If the _user_ can uncover (re-reveal) the focused element without advancing the keyboard focus, such as by scrolling or closing the content that the _user_ opened, then the focused element is not considered obscured (covered) due to author-created content. -Where content can be repositioned by the _user’s action_, then only the initial positions of user-movable content are considered for testing and conformance. +- **_Draggable_**: an operation where the pointer (mouse, pen, or touch) engages with an element on the [down-event](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#dfn-down-event) and the element (or a representation of its position) follows the pointer until an [up-event](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#dfn-up-event). Examples of draggable elements include list items, text, and images. +- **_Single-pointer_**: pointer input with _one point of contact with the screen_, including single taps and clicks, double-taps and double-clicks, long presses, and non _path-based gestures_. +- **_Path-based gesture_**: involves a pointer interaction where not just the endpoints matter. +- Exceptions and additional terms are defined at [Understanding Dragging Movements](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#key-terms) + +**Note**: This requirement is separate from keyboard accessibility. +However, providing a text input can be an acceptable _single-pointer_ alternative to dragging. +For example, a text input beside a slider could allow any user to enter a precise value for the slider. +In such a situation, the on-screen keyboard for touch users offers a _single-pointer_ means of entering an alphanumeric value.
### What to do -- Confirm that the element that had been originally covered by the _author_, but that now has focus, is now visible, otherwise adjust the design to allow elements with focus to be visible -- **Or**, if the element was originally visible, but is now covered due to the _user’s action_, confirm that the _user_ can uncover (re-reveal) the element with focus without moving the focus away from the element such as by scrolling or escaping to close the content that is covering the element with focus +For any action that involves dragging with a mouse, pen, or touch: +- Provide a _single-pointer_ alternative, such as including single taps and clicks, double-taps and double-clicks, and long presses as alternatives to the dragging +- **Or**, provide a text input alternative @@ -73,19 +77,15 @@

### About this requirement -- [WCAG 2.4.11 Focus Not Obscured (Minimum)](https://www.w3.org/WAI/WCAG22/Understanding/focus-not-obscured-minimum) -- [WCAG technique C43: Using CSS margin and scroll-margin to un-obscure content](https://www.w3.org/WAI/WCAG22/Techniques/css/C43) -- [Common failure F110: Obscured due to a sticky footer or header completely hiding focused elements](https://www.w3.org/WAI/WCAG22/Techniques/failures/F110) +- [WCAG 2.5.7 Dragging Movements](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html) +- [WCAG technique G219: Ensuring that an alternative is available for dragging movements that operate on content](https://www.w3.org/WAI/WCAG22/Techniques/general/G219) +- [WCAG Failure F108: Failure due to not providing a _single-pointer_ method for the user to operate a function that uses a dragging movement](https://www.w3.org/WAI/WCAG22/Techniques/failures/F108) ### Who does this affect? -- People with low vision who use screen magnification -- People who physically cannot use a pointing device -- People using a keyboard and alternate keyboards or input devices that act as keyboard emulators like speech input software and on-screen keyboards -- People with dexterity impairment using a keyboard-like switch device -- People with dexterity impairment using voice control -- People with tremors or other movement disorders using a keyboard-like device -- People with memory limitations in executive processes benefit by being able to discover where the focus is located +- People who struggle with performing dragging movements +- People with tremors or other movement disorders using a mouse, stylus, or touch input +- People using a device in environments where they are exposed to shaking such as public transportation - Many older adults From 281ed9d8b28af8d7dbb17849402166f7a1e9dd36 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Tue, 7 Nov 2023 13:35:45 -0600 Subject: [PATCH 07/14] remove wrong test cases #1675 --- .../element_overlaid_visible_default.html | 99 ------- .../element_overlaid_visible_zindex.html | 101 -------- .../element_unobscured.html | 242 ------------------ 3 files changed, 442 deletions(-) delete mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html delete mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html delete mode 100755 accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html deleted file mode 100755 index 4bec86731..000000000 --- a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_default.html +++ /dev/null @@ -1,99 +0,0 @@ - - - - - - - - RPT Test Suite - - - - - -
1
-
2
- - - - - diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html deleted file mode 100755 index f8dce5098..000000000 --- a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_overlaid_visible_zindex.html +++ /dev/null @@ -1,101 +0,0 @@ - - - - - - - - RPT Test Suite - - - - - -
1
-
2
- - - - - diff --git a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html b/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html deleted file mode 100755 index 4e626f5ae..000000000 --- a/accessibility-checker-engine/test/v2/checker/accessibility/rules/draggable_alternative_exists_ruleunit/element_unobscured.html +++ /dev/null @@ -1,242 +0,0 @@ - - - - - - Using CSS margin and scroll-margin to un-obscure content - - - -
-

Fixed-Position Banner

- -
- -
-
-

Main Content

-
-

- -

- -

- -

- -

- -

-

- -

- -
- - -
- - - - - From bf07d5d279ac00e3d9de25070e8bc3f6afbf6b04 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Tue, 7 Nov 2023 13:47:45 -0600 Subject: [PATCH 08/14] update the hep references #1675 --- .../src/v4/rules/draggable_alternative_exists.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts index a91ee918e..547871a12 100644 --- a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts +++ b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts @@ -23,8 +23,9 @@ export let draggable_alternative_exists: Rule = { help: { "en-US": { "group": "draggable_alternative_exists.html", - "pass": "draggable_alternative_exists.html", - "potential_obscured": "draggable_alternative_exists.html" + "pass_alternative": "draggable_alternative_exists.html", + "pass_undraggable": "draggable_alternative_exists.html", + "potential_alternative": "draggable_alternative_exists.html" } }, messages: { From a60f9d4432f521117387f09620a62f4b30ca845a Mon Sep 17 00:00:00 2001 From: Shunguo Date: Tue, 7 Nov 2023 13:59:56 -0600 Subject: [PATCH 09/14] cleanup the code #1675 --- .../src/v4/rules/draggable_alternative_exists.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts index 547871a12..490c8d20d 100644 --- a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts +++ b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts @@ -55,8 +55,6 @@ export let draggable_alternative_exists: Rule = { || nodeName === "body" || nodeName === "html" ) return null; - const bounds = context["dom"].bounds; - //in case the bounds not available if (ruleContext.getAttribute("draggable") === 'true') return RulePotential("potential_alternative", [nodeName]); From 37432486e9f6379b505e9d4cc9756df3a69a8581 Mon Sep 17 00:00:00 2001 From: Phill Jenkins Date: Tue, 7 Nov 2023 20:28:56 -0600 Subject: [PATCH 10/14] Single pointer definition --- .../help-v4/en-US/draggable_alternative_exists.html | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html b/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html index 98f688510..46e09059d 100644 --- a/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html +++ b/accessibility-checker-engine/help-v4/en-US/draggable_alternative_exists.html @@ -45,12 +45,14 @@

### Why is this important? -Some people cannot use a mouse, pen, or touch to drag items. The design should not rely on dragging as the only means for the user’s actions. +Some people cannot use a mouse, pen, or touch to drag items. +Examples of draggable elements include list items, text, and images. +The design should not rely on dragging as the only means for the user’s actions. -- **_Draggable_**: an operation where the pointer (mouse, pen, or touch) engages with an element on the [down-event](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#dfn-down-event) and the element (or a representation of its position) follows the pointer until an [up-event](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#dfn-up-event). Examples of draggable elements include list items, text, and images. -- **_Single-pointer_**: pointer input with _one point of contact with the screen_, including single taps and clicks, double-taps and double-clicks, long presses, and non _path-based gestures_. +- **_Draggable_**: an operation where the pointer (mouse, pen, or touch) engages with an element on the [down-event](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#dfn-down-event) and the element (or a representation of its position) follows the pointer until an [up-event](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#dfn-up-event). +- **_Single-pointer_**: one or several pointer inputs that operate with _one point of contact with the screen_, including single taps and clicks, double-taps and double-clicks, and long presses. - **_Path-based gesture_**: involves a pointer interaction where not just the endpoints matter. -- Exceptions and additional terms are defined at [Understanding Dragging Movements](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#key-terms) +- **_Exceptions and additional terms_**: are defined at [Understanding Dragging Movements](https://www.w3.org/WAI/WCAG22/Understanding/dragging-movements.html#key-terms). **Note**: This requirement is separate from keyboard accessibility. However, providing a text input can be an acceptable _single-pointer_ alternative to dragging. From a3e9e36a3c106e46d6a414e1c01edf1867a0c7d4 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Wed, 8 Nov 2023 10:31:44 -0600 Subject: [PATCH 11/14] cleanup the code #1675 --- .../src/v4/rules/draggable_alternative_exists.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts index 490c8d20d..b209b5bf8 100644 --- a/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts +++ b/accessibility-checker-engine/src/v4/rules/draggable_alternative_exists.ts @@ -55,7 +55,6 @@ export let draggable_alternative_exists: Rule = { || nodeName === "body" || nodeName === "html" ) return null; - //in case the bounds not available if (ruleContext.getAttribute("draggable") === 'true') return RulePotential("potential_alternative", [nodeName]); else if (ruleContext.getAttribute("draggable") === 'false') From c75a76594d0386f1b112ababc41a1d36fa18f787 Mon Sep 17 00:00:00 2001 From: Shunguo Date: Thu, 9 Nov 2023 09:34:22 -0600 Subject: [PATCH 12/14] update the rule definition #1674 --- .../src/v4/sc-urls.json | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/accessibility-checker-engine/src/v4/sc-urls.json b/accessibility-checker-engine/src/v4/sc-urls.json index 688c90ff4..1916ab358 100644 --- a/accessibility-checker-engine/src/v4/sc-urls.json +++ b/accessibility-checker-engine/src/v4/sc-urls.json @@ -707,15 +707,6 @@ "level": "AAA", "wcagType": "2.1" }, - "2.5.8": { - "num": "2.5.8", - "url": "https://www.w3.org/TR/WCAG22/#target-size-minimum", - "scId": "WCAG2:minimum-target-size", - "scAltId": ["minimum-target-size"], - "test": "WCAG2:WCAG2:minimum-target-size", - "howToMeetUrl": "https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum", - "understandingUrl": "https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html", - "handle": "Minimum Target Size", "2.5.7": { "num": "2.5.7", "url": "https://www.w3.org/TR/WCAG22/#dragging-movements", @@ -728,6 +719,18 @@ "level": "AA", "wcagType": "2.2" }, + "2.5.8": { + "num": "2.5.8", + "url": "https://www.w3.org/TR/WCAG22/#target-size-minimum", + "scId": "WCAG2:minimum-target-size", + "scAltId": ["minimum-target-size"], + "test": "WCAG2:WCAG2:minimum-target-size", + "howToMeetUrl": "https://www.w3.org/WAI/WCAG22/quickref/#target-size-minimum", + "understandingUrl": "https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html", + "handle": "Minimum Target Size", + "level": "AA", + "wcagType": "2.2" + }, "3.1.1": { "num": "3.1.1", "url": "https://www.w3.org/TR/WCAG21/#language-of-page", From 8b6c478f2096b0431f0e51c8393680e691cdca3f Mon Sep 17 00:00:00 2001 From: Erick Renteria Date: Thu, 9 Nov 2023 21:23:00 -0600 Subject: [PATCH 13/14] Updating rule server for 11-10 --- rule-server/src/static/archives.json | 6 + .../2023.11.10/doc/assets/NeedsReview16.svg | 25 + .../doc/assets/Recommendation16.svg | 15 + .../2023.11.10/doc/assets/Violation16.svg | 13 + .../archives/2023.11.10/doc/common/help.css | 268 + .../archives/2023.11.10/doc/common/help.js | 223 + .../archives/2023.11.10/doc/common/rules.css | 29 + .../en-US/IBMA_Color_Contrast_WCAG2AA_PV.html | 88 + .../Rpt_Aria_ArticleRoleLabel_Implicit.html | 93 + .../Rpt_Aria_GroupRoleLabel_Implicit.html | 105 + .../doc/en-US/a_target_warning.html | 90 + .../2023.11.10/doc/en-US/a_text_purpose.html | 106 + .../doc/en-US/applet_alt_exists.html | 102 + .../en-US/application_content_accessible.html | 92 + .../2023.11.10/doc/en-US/area_alt_exists.html | 101 + .../doc/en-US/aria_accessiblename_exists.html | 112 + .../aria_activedescendant_tabindex_valid.html | 107 + .../en-US/aria_activedescendant_valid.html | 102 + .../en-US/aria_application_label_unique.html | 102 + .../doc/en-US/aria_application_labelled.html | 98 + .../doc/en-US/aria_article_label_unique.html | 102 + .../doc/en-US/aria_attribute_allowed.html | 94 + .../doc/en-US/aria_attribute_conflict.html | 109 + .../doc/en-US/aria_attribute_deprecated.html | 103 + .../doc/en-US/aria_attribute_exists.html | 93 + .../doc/en-US/aria_attribute_redundant.html | 98 + .../doc/en-US/aria_attribute_required.html | 103 + .../doc/en-US/aria_attribute_valid.html | 98 + .../doc/en-US/aria_attribute_value_valid.html | 94 + .../doc/en-US/aria_banner_label_unique.html | 102 + .../doc/en-US/aria_banner_single.html | 97 + .../doc/en-US/aria_child_tabbable.html | 96 + .../doc/en-US/aria_child_valid.html | 120 + .../aria_complementary_label_unique.html | 102 + .../aria_complementary_label_visible.html | 98 + .../en-US/aria_complementary_labelled.html | 99 + .../doc/en-US/aria_content_in_landmark.html | 91 + .../en-US/aria_contentinfo_label_unique.html | 100 + .../doc/en-US/aria_contentinfo_misuse.html | 102 + .../doc/en-US/aria_contentinfo_single.html | 98 + .../doc/en-US/aria_descendant_valid.html | 102 + .../doc/en-US/aria_document_label_unique.html | 89 + .../en-US/aria_eventhandler_role_valid.html | 90 + .../doc/en-US/aria_form_label_unique.html | 110 + .../doc/en-US/aria_graphic_labelled.html | 97 + .../doc/en-US/aria_hidden_nontabbable.html | 113 + .../2023.11.10/doc/en-US/aria_id_unique.html | 97 + .../doc/en-US/aria_img_labelled.html | 98 + .../en-US/aria_keyboard_handler_exists.html | 102 + .../doc/en-US/aria_landmark_name_unique.html | 109 + .../doc/en-US/aria_main_label_unique.html | 107 + .../doc/en-US/aria_main_label_visible.html | 101 + .../en-US/aria_navigation_label_unique.html | 104 + .../doc/en-US/aria_parent_required.html | 95 + .../doc/en-US/aria_region_label_unique.html | 101 + .../doc/en-US/aria_region_labelled.html | 101 + .../doc/en-US/aria_role_allowed.html | 102 + .../doc/en-US/aria_role_redundant.html | 106 + .../2023.11.10/doc/en-US/aria_role_valid.html | 90 + .../doc/en-US/aria_search_label_unique.html | 99 + .../doc/en-US/aria_toolbar_label_unique.html | 101 + .../doc/en-US/aria_widget_labelled.html | 99 + .../doc/en-US/asciiart_alt_exists.html | 89 + .../doc/en-US/blink_css_review.html | 93 + .../doc/en-US/blink_elem_deprecated.html | 92 + .../doc/en-US/blockquote_cite_exists.html | 89 + .../doc/en-US/canvas_content_described.html | 112 + .../doc/en-US/caption_track_exists.html | 97 + .../doc/en-US/combobox_active_descendant.html | 108 + .../en-US/combobox_autocomplete_valid.html | 136 + .../doc/en-US/combobox_design_valid.html | 93 + .../en-US/combobox_focusable_elements.html | 92 + .../doc/en-US/combobox_haspopup_valid.html | 107 + .../doc/en-US/combobox_popup_reference.html | 113 + .../doc/en-US/dir_attribute_valid.html | 88 + .../en-US/download_keyboard_controllable.html | 89 + .../en-US/draggable_alternative_exists.html | 105 + .../doc/en-US/element_accesskey_labelled.html | 93 + .../doc/en-US/element_accesskey_unique.html | 99 + .../en-US/element_attribute_deprecated.html | 103 + .../doc/en-US/element_id_unique.html | 102 + .../doc/en-US/element_lang_valid.html | 109 + .../en-US/element_mouseevent_keyboard.html | 102 + .../en-US/element_orientation_unlocked.html | 112 + .../en-US/element_scrollable_tabbable.html | 115 + .../en-US/element_tabbable_role_valid.html | 136 + .../en-US/element_tabbable_unobscured.html | 103 + .../doc/en-US/element_tabbable_visible.html | 124 + .../doc/en-US/embed_alt_exists.html | 95 + .../doc/en-US/embed_noembed_exists.html | 102 + .../doc/en-US/emoticons_alt_exists.html | 89 + .../doc/en-US/error_message_exists.html | 105 + .../doc/en-US/fieldset_label_valid.html | 106 + .../doc/en-US/fieldset_legend_valid.html | 99 + .../doc/en-US/figure_label_exists.html | 102 + .../2023.11.10/doc/en-US/form_font_color.html | 90 + .../doc/en-US/form_interaction_review.html | 91 + .../doc/en-US/form_label_unique.html | 89 + .../doc/en-US/form_submit_button_exists.html | 91 + .../doc/en-US/form_submit_review.html | 92 + .../2023.11.10/doc/en-US/frame_src_valid.html | 91 + .../doc/en-US/frame_title_exists.html | 97 + .../doc/en-US/heading_content_exists.html | 88 + .../doc/en-US/heading_markup_misuse.html | 91 + .../doc/en-US/html_lang_exists.html | 90 + .../2023.11.10/doc/en-US/html_lang_valid.html | 111 + .../doc/en-US/html_skipnav_exists.html | 91 + .../en-US/iframe_interactive_tabbable.html | 105 + .../doc/en-US/imagebutton_alt_exists.html | 84 + .../doc/en-US/imagemap_alt_exists.html | 100 + .../doc/en-US/img_alt_background.html | 89 + .../doc/en-US/img_alt_decorative.html | 92 + .../2023.11.10/doc/en-US/img_alt_misuse.html | 91 + .../2023.11.10/doc/en-US/img_alt_null.html | 93 + .../doc/en-US/img_alt_redundant.html | 93 + .../2023.11.10/doc/en-US/img_alt_valid.html | 94 + .../doc/en-US/img_ismap_misuse.html | 86 + .../doc/en-US/img_longdesc_misuse.html | 97 + .../doc/en-US/input_autocomplete_valid.html | 118 + .../doc/en-US/input_checkboxes_grouped.html | 90 + .../doc/en-US/input_fields_grouped.html | 103 + .../doc/en-US/input_haspopup_conflict.html | 103 + .../doc/en-US/input_label_after.html | 96 + .../doc/en-US/input_label_before.html | 94 + .../doc/en-US/input_label_exists.html | 93 + .../doc/en-US/input_label_visible.html | 98 + .../doc/en-US/input_onchange_review.html | 92 + .../input_placeholder_label_visible.html | 109 + .../doc/en-US/label_content_exists.html | 89 + .../doc/en-US/label_name_visible.html | 95 + .../2023.11.10/doc/en-US/label_ref_valid.html | 95 + .../doc/en-US/list_children_valid.html | 110 + .../doc/en-US/list_markup_review.html | 90 + .../doc/en-US/list_structure_proper.html | 89 + .../doc/en-US/marquee_elem_avoid.html | 90 + .../2023.11.10/doc/en-US/media_alt_brief.html | 101 + .../doc/en-US/media_alt_exists.html | 89 + .../doc/en-US/media_audio_transcribed.html | 95 + .../en-US/media_autostart_controllable.html | 89 + .../en-US/media_keyboard_controllable.html | 101 + .../doc/en-US/media_live_captioned.html | 91 + .../doc/en-US/media_track_available.html | 87 + .../doc/en-US/meta_redirect_optional.html | 93 + .../doc/en-US/meta_refresh_delay.html | 94 + .../doc/en-US/meta_viewport_zoomable.html | 101 + .../doc/en-US/noembed_content_exists.html | 99 + .../doc/en-US/object_text_exists.html | 99 + .../doc/en-US/page_title_exists.html | 100 + .../doc/en-US/page_title_valid.html | 98 + .../doc/en-US/script_focus_blur_review.html | 92 + .../doc/en-US/script_onclick_avoid.html | 89 + .../doc/en-US/script_onclick_misuse.html | 90 + .../doc/en-US/script_select_review.html | 92 + .../doc/en-US/select_options_grouped.html | 88 + .../doc/en-US/skip_main_described.html | 96 + .../doc/en-US/skip_main_exists.html | 102 + .../en-US/style_background_decorative.html | 91 + .../doc/en-US/style_before_after_review.html | 93 + .../doc/en-US/style_color_misuse.html | 89 + .../doc/en-US/style_focus_visible.html | 94 + .../doc/en-US/style_highcontrast_visible.html | 94 + .../doc/en-US/style_hover_persistent.html | 115 + .../doc/en-US/style_viewport_resizable.html | 88 + .../doc/en-US/table_aria_descendants.html | 109 + .../doc/en-US/table_caption_empty.html | 100 + .../doc/en-US/table_caption_nested.html | 95 + .../doc/en-US/table_headers_exists.html | 93 + .../doc/en-US/table_headers_ref_valid.html | 88 + .../doc/en-US/table_headers_related.html | 91 + .../doc/en-US/table_layout_linearized.html | 90 + .../doc/en-US/table_scope_valid.html | 93 + .../doc/en-US/table_structure_misuse.html | 90 + .../doc/en-US/table_summary_redundant.html | 101 + .../doc/en-US/target_spacing_sufficient.html | 104 + .../doc/en-US/text_block_heading.html | 90 + .../doc/en-US/text_contrast_sufficient.html | 91 + .../doc/en-US/text_quoted_correctly.html | 103 + .../doc/en-US/text_sensory_misuse.html | 91 + .../doc/en-US/text_spacing_valid.html | 103 + .../doc/en-US/text_whitespace_valid.html | 92 + .../doc/en-US/widget_tabbable_exists.html | 96 + .../doc/en-US/widget_tabbable_single.html | 90 + .../static/archives/2023.11.10/doc/rules.html | 15432 ++++++++ .../archives/2023.11.10/js/ace-debug.js | 29948 ++++++++++++++++ .../archives/2023.11.10/js/ace-node-debug.js | 29349 +++++++++++++++ .../static/archives/2023.11.10/js/ace-node.js | 2 + .../2023.11.10/js/ace-node.js.LICENSE.txt | 15 + .../src/static/archives/2023.11.10/js/ace.js | 2 + .../archives/2023.11.10/js/ace.js.LICENSE.txt | 15 + 189 files changed, 92501 insertions(+) create mode 100644 rule-server/src/static/archives/2023.11.10/doc/assets/NeedsReview16.svg create mode 100644 rule-server/src/static/archives/2023.11.10/doc/assets/Recommendation16.svg create mode 100644 rule-server/src/static/archives/2023.11.10/doc/assets/Violation16.svg create mode 100644 rule-server/src/static/archives/2023.11.10/doc/common/help.css create mode 100644 rule-server/src/static/archives/2023.11.10/doc/common/help.js create mode 100644 rule-server/src/static/archives/2023.11.10/doc/common/rules.css create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/a_target_warning.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/a_text_purpose.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/applet_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/application_content_accessible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/area_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_accessiblename_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_tabindex_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_labelled.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_article_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_allowed.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_conflict.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_deprecated.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_redundant.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_required.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_value_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_single.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_tabbable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_labelled.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_content_in_landmark.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_single.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_descendant_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_document_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_eventhandler_role_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_form_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_graphic_labelled.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_hidden_nontabbable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_id_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_img_labelled.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_keyboard_handler_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_landmark_name_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_navigation_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_parent_required.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_labelled.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_allowed.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_redundant.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_search_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_toolbar_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/aria_widget_labelled.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/asciiart_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/blink_css_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/blink_elem_deprecated.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/blockquote_cite_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/canvas_content_described.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/caption_track_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_active_descendant.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_autocomplete_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_design_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_focusable_elements.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_haspopup_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_popup_reference.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/dir_attribute_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/download_keyboard_controllable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/draggable_alternative_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_labelled.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_attribute_deprecated.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_id_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_lang_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_mouseevent_keyboard.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_orientation_unlocked.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_scrollable_tabbable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_role_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_unobscured.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/embed_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/embed_noembed_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/emoticons_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/error_message_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_label_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_legend_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/figure_label_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/form_font_color.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/form_interaction_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/form_label_unique.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_button_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/frame_src_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/frame_title_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/heading_content_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/heading_markup_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/html_skipnav_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/iframe_interactive_tabbable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/imagebutton_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/imagemap_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_background.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_decorative.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_null.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_redundant.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_ismap_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/img_longdesc_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_autocomplete_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_checkboxes_grouped.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_fields_grouped.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_haspopup_conflict.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_after.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_before.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_onchange_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/input_placeholder_label_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/label_content_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/label_name_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/label_ref_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/list_children_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/list_markup_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/list_structure_proper.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/marquee_elem_avoid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_brief.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/media_audio_transcribed.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/media_autostart_controllable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/media_keyboard_controllable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/media_live_captioned.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/media_track_available.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/meta_redirect_optional.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/meta_refresh_delay.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/meta_viewport_zoomable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/noembed_content_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/object_text_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/script_focus_blur_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_avoid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/script_select_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/select_options_grouped.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_described.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/style_background_decorative.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/style_before_after_review.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/style_color_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/style_focus_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/style_highcontrast_visible.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/style_hover_persistent.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/style_viewport_resizable.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_aria_descendants.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_empty.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_nested.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_ref_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_related.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_layout_linearized.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_scope_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_structure_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/table_summary_redundant.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/target_spacing_sufficient.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/text_block_heading.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/text_contrast_sufficient.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/text_quoted_correctly.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/text_sensory_misuse.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/text_spacing_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/text_whitespace_valid.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_exists.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_single.html create mode 100644 rule-server/src/static/archives/2023.11.10/doc/rules.html create mode 100644 rule-server/src/static/archives/2023.11.10/js/ace-debug.js create mode 100644 rule-server/src/static/archives/2023.11.10/js/ace-node-debug.js create mode 100644 rule-server/src/static/archives/2023.11.10/js/ace-node.js create mode 100644 rule-server/src/static/archives/2023.11.10/js/ace-node.js.LICENSE.txt create mode 100644 rule-server/src/static/archives/2023.11.10/js/ace.js create mode 100644 rule-server/src/static/archives/2023.11.10/js/ace.js.LICENSE.txt diff --git a/rule-server/src/static/archives.json b/rule-server/src/static/archives.json index 760b5b2b3..58edc6186 100644 --- a/rule-server/src/static/archives.json +++ b/rule-server/src/static/archives.json @@ -4,6 +4,12 @@ "name": "Latest Deployment", "path": "/archives/latest" }, + { + "id": "10November2023", + "name": "10 November 2023 Deployment", + "version": "3.1.64", + "path": "/archives/2023.11.10" + }, { "id": "12October2023", "name": "12 October 2023 Deployment", diff --git a/rule-server/src/static/archives/2023.11.10/doc/assets/NeedsReview16.svg b/rule-server/src/static/archives/2023.11.10/doc/assets/NeedsReview16.svg new file mode 100644 index 000000000..917834a38 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/assets/NeedsReview16.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + diff --git a/rule-server/src/static/archives/2023.11.10/doc/assets/Recommendation16.svg b/rule-server/src/static/archives/2023.11.10/doc/assets/Recommendation16.svg new file mode 100644 index 000000000..b57dc73d5 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/assets/Recommendation16.svg @@ -0,0 +1,15 @@ + + + + + + +i + diff --git a/rule-server/src/static/archives/2023.11.10/doc/assets/Violation16.svg b/rule-server/src/static/archives/2023.11.10/doc/assets/Violation16.svg new file mode 100644 index 000000000..5f8c9c710 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/assets/Violation16.svg @@ -0,0 +1,13 @@ + + + + + + + + diff --git a/rule-server/src/static/archives/2023.11.10/doc/common/help.css b/rule-server/src/static/archives/2023.11.10/doc/common/help.css new file mode 100644 index 000000000..0db9f74b4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/common/help.css @@ -0,0 +1,268 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/plex.css"); +@import url('https://unpkg.com/carbon-components/css/carbon-components.min.css'); +@import url("https://1.www.s81c.com/common/carbon-for-ibm-dotcom/tag/v1/latest/themes.css"); + +bx-list-item>code, p>code, td>code { + background-color: var(--cds-layer); + border-radius: 4px; + bottom: 0.0625em; + color: var(--cds-text-primary); + display: inline; + font-size: .75rem; + font-size: .875em; + font-weight: 400; + letter-spacing: .32px; + line-height: 1.33333; + padding: 0 0.5em; + position: relative; +} + +.toolHelp a { + color: var(--cds-link-primary) +} + +.toolHelp .toolMain p ~ p { + margin-top: .5rem; +} + +.toolHelp .toolHead h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolHead .issueLevel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +.toolHelp .toolHead #ruleMessage { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; + margin-top: .5rem; + margin-bottom: .5rem; +} + +.toolHelp .toolHead #groupLabel { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 400; + font-size: 12px; + line-height: 16px; +} + +/* productive-heading-03 */ +.toolHelp .toolMain h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +.toolHelp .toolSide .bx--list__item { + color: black; + font-size: 0.875rem; + line-height: 18px; +} + +/* productive-heading-03 */ +.toolHelp .toolSide h3 { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + font-style: normal; + font-weight: 600; + font-size: 16px; + line-height: 24px; +} + +@media (min-width: 42rem) { + html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; + } +} +body { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; + color: var(--cds-text-primary); + background-color: var(--cds-ui-background); +} + +.toolHelp { + padding: 0px; + margin: 0px; + max-width: 100%; + background-color: #e8daff; +} + +.toolHelp p { + font-family: 'IBM Plex Sans','Helvetica Neue',Arial,sans-serif; +font-style: normal; +font-weight: 400; +font-size: 14px; +line-height: 20px; +/* or 143% */ + +letter-spacing: 0.16px; +} + +.dds-theme-zone-g90 .toolHelp { + background-color: #31135E; +} + +.toolHelp .bx--row { + margin: 0px; +} + +.toolHelp .toolHead { + margin-bottom: 1rem; + padding-top: 1rem; +} +.toolHelp .toolMain { + background-color: var(--cds-ui-background); + padding-top: 1rem; + padding-bottom: 1rem; + border-top: solid var(--cds-text-primary) 1px; +} +.toolHelp .toolMain h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolMain p { + margin-top: 0px; +} + +.toolHelp .toolSide { + padding: 16px 16px 16px 32px; + background-color: var(--cds-ui-background); + color: var(--cds-text-primary); + border-top: solid var(--cds-text-primary) 1px; +} +@media (min-width: 42rem) { + .toolHelp .toolSide { + border-left: solid var(--cds-text-primary) 1px; + } +} + +.toolHelp .toolSide h2 { + margin-top: 32px; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide h3 { + margin-top: 1.5rem; + margin-bottom: 0.5rem; +} +.toolHelp .toolSide p { + margin-top: 0px; +} +@media (min-width: 66rem) { + .toolHelp .toolMain p, bx-list-item { + max-width: 66.66%; + } +} +bx-code-snippet[type="multi"]::after { + height: 0px; +} + +#ruleInfo { + margin-top: 1rem; +} + +#ruleInfo p { + font-size: 14px; +} + +mark-down table tbody tr:hover { + background: var(--cds-layer-hover); +} +mark-down table tbody tr:hover td, mark-down table tbody tr:hover th { + background: var(--cds-layer-hover); + -webkit-border-after: 1px solid var(--cds-layer-hover); + border-block-end: 1px solid var(--cds-layer-hover); + -webkit-border-before: 1px solid var(--cds-layer-hover); + border-block-start: 1px solid var(--cds-layer-hover); + color: var(--cds-text-primary,#161616); +} + +mark-down table { + margin-top: 1rem; + width: 100%; +} + +@media (min-width: 66rem) { + mark-down table { + max-width: 66.66%; + } +} + +mark-down table thead { + font-size: var(--cds-heading-compact-01-font-size,0.875rem); + font-weight: var(--cds-heading-compact-01-font-weight,600); + line-height: var(--cds-heading-compact-01-line-height,1.28572); + letter-spacing: var(--cds-heading-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer-accent); +} + +mark-down table tr { + border: none; + block-size: 3rem; + inline-size: 100%; +} + +mark-down table th { + background-color: var(--cds-layer-accent); + color: var(--cds-text-primary,#161616); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} + +mark-down table td, mark-down table th { + text-align: start; + vertical-align: middle; +} + +mark-down table tbody { + font-size: var(--cds-body-compact-01-font-size,0.875rem); + font-weight: var(--cds-body-compact-01-font-weight,400); + line-height: var(--cds-body-compact-01-line-height,1.28572); + letter-spacing: var(--cds-body-compact-01-letter-spacing,0.16px); + background-color: var(--cds-layer); + inline-size: 100%; +} + +mark-down table td, mark-down table tbody th { + background: var(--cds-layer); + -webkit-border-after: 1px solid var(--cds-border-subtle); + border-block-end: 1px solid var(--cds-border-subtle); + -webkit-border-before: 1px solid var(--cds-layer); + border-block-start: 1px solid var(--cds-layer); + color: var(--cds-text-secondary,#525252); + -webkit-padding-end: 1rem; + padding-inline-end: 1rem; + -webkit-padding-start: 1rem; + padding-inline-start: 1rem; +} \ No newline at end of file diff --git a/rule-server/src/static/archives/2023.11.10/doc/common/help.js b/rule-server/src/static/archives/2023.11.10/doc/common/help.js new file mode 100644 index 000000000..793ee267d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/common/help.js @@ -0,0 +1,223 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ + +class HTMLBaseElement extends HTMLElement { + constructor(...args) { + const self = super(...args); + self.parsed = false; // guard to make it easy to do certain stuff only once + self.parentNodes = []; + return self; + } + + connectedCallback() { + // collect the parentNodes + let el = this; + while (el.parentNode) { + el = el.parentNode; + this.parentNodes.push(el); + } + // check if the parser has already passed the end tag of the component + // in which case this element, or one of its parents, should have a nextSibling + // if not (no whitespace at all between tags and no nextElementSiblings either) + // resort to DOMContentLoaded or load having triggered + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + this.childrenAvailableCallback(); + this.parsed = true; + } else { + this.mutationObserver = new MutationObserver(() => { + if ([this, ...this.parentNodes].some((el) => el.nextSibling) || document.readyState !== "loading") { + this.childrenAvailableCallback(); + this.parsed = true; + this.mutationObserver.disconnect(); + } + }); + + this.mutationObserver.observe(this, { + childList: true, + }); + } + } +} + +function isDarkMode() { + return (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches); +} + +customElements.define( + "mark-down", + class extends HTMLBaseElement { + constructor() { + super(); + setTimeout(() => { + let converted = marked.parse(this.textContent); + this.innerHTML = converted + .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + .replace(/<(\/?)li>/g, "<$1bx-list-item>") + .replace(/[ \r\n]*/g, "") + .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + }, 0) + } + // childrenAvailableCallback() { + // let converted = marked.parse(this.innerHTML); + // this.innerHTML = converted + // .replace(/<(\/?)ul>/g, "<$1bx-unordered-list>") + // .replace(/<(\/?)li>/g, "<$1bx-list-item>") + // .replace(/[ \r\n]*/g, "") + // .replace(/<\/code>[ \r\n]*<\/pre>/g, ""); + // } + } +); + +customElements.define( + "code-snippet", + class extends HTMLBaseElement { + childrenAvailableCallback() { + let oldCode = this.innerHTML; + this.innerHTML = ""; + // const shadowRoot = this.attachShadow({mode: 'open'}); + const shadowRoot = this; + let snip = document.createElement("bx-code-snippet"); + snip.setAttribute("type", "multi"); + snip.innerHTML = oldCode.replace(/ ruleInfo.msgArgs[matchedNum]); + document.querySelector("#ruleMessage").innerHTML = ruleMessage.replace(/&/g, "&").replace(//g, ">") + } + setTimeout(() => { + if (ruleInfo.snippet) { + let snip = ruleInfo.snippet; + snip = snip.replace(/( [a-zA-Z-]+="[^"]*")/g, "\n $1"); + let snipElem = document.createElement("code-snippet"); + for (let line of snip.split("\n")) { + snipElem.appendChild(document.createTextNode(line+"\n")); + } + let locSnippet = document.querySelector("#locSnippet"); + locSnippet.innerHTML = `

Element location

`; + locSnippet.appendChild(snipElem); + } + }, 0); + if (ruleInfo.value) { + let value = ruleInfo.value; + const val = valueMap[value[0]][value[1]]; + let icon = ""; + if (val === "Violation") icon = ``; + if (val === "Needs review") icon = ``; + if (val === "Recommendation") icon = ``; + let level = document.querySelector("#locLevel"); + let parent = level.parentElement; + level = parent.removeChild(level); + parent.insertBefore(level, parent.firstElementChild); + document.querySelector("#locLevel").innerHTML = `
${val}
`; + } + if (RULE_ID) { + document.querySelector("#ruleInfo").innerHTML = `

Rule ID: ${RULE_ID}${ruleInfo.reasonId ? `
Reason ID: ${ruleInfo.reasonId}

` : ""}`; + } + } +} + +if ("onhashchange" in window) {// does the browser support the hashchange event? + window.onhashchange = function () { + let ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + updateWithRuleInfo(ruleInfo); + } +} + +window.addEventListener("DOMContentLoaded", (evt) => { + let groupMsg = typeof RULE_MESSAGES !== "undefined" && (RULE_MESSAGES["en-US"].group || RULE_MESSAGES["en-US"][0]) || ""; + groupMsg = groupMsg.replace(/&/g, "&").replace(//g, ">"); + document.querySelector("#groupLabel").innerHTML = groupMsg; + let ruleInfo; + if (window.location.search && window.location.search.length > 0) { + const searchParams = new URLSearchParams(window.location.search); + ruleInfo = JSON.parse(decodeURIComponent(searchParams.get("issue"))); + } else if (window.location.hash && window.location.hash.length > 0) { + ruleInfo = JSON.parse(decodeURIComponent(window.location.hash.substring(1))); + } + updateWithRuleInfo(ruleInfo); + + if (isDarkMode()) { + document.body.setAttribute("class", "dds-theme-zone-g90"); + } else { + document.body.setAttribute("class", "dds-theme-zone-g10"); + } + +}) + diff --git a/rule-server/src/static/archives/2023.11.10/doc/common/rules.css b/rule-server/src/static/archives/2023.11.10/doc/common/rules.css new file mode 100644 index 000000000..515c8a230 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/common/rules.css @@ -0,0 +1,29 @@ +/****************************************************************************** + Copyright:: 2022- IBM, Inc + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0 + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +@import url('https://unpkg.com/carbon-components/css/carbon-components.min.css'); + +html, body, .toolHelp .bx--row:nth-child(2) { + height: 100%; +} + +body { + font-family: 'IBM Plex Sans', sans-serif; + padding: 1rem; +} + +h2 { + margin-top: 1rem; + font-size: 16px; + line-height: 24px; + font-weight: 600; +} diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html new file mode 100644 index 000000000..0f53f21ce --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/IBMA_Color_Contrast_WCAG2AA_PV.html @@ -0,0 +1,88 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html new file mode 100644 index 000000000..c7443179e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_ArticleRoleLabel_Implicit.html @@ -0,0 +1,93 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html new file mode 100644 index 000000000..1c6cc6d3d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/Rpt_Aria_GroupRoleLabel_Implicit.html @@ -0,0 +1,105 @@ + + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/a_target_warning.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/a_target_warning.html new file mode 100644 index 000000000..66a9bf798 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/a_target_warning.html @@ -0,0 +1,90 @@ + + + + a_target_warning - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/a_text_purpose.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/a_text_purpose.html new file mode 100644 index 000000000..153aebbb6 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/a_text_purpose.html @@ -0,0 +1,106 @@ + + + + a_text_purpose - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/applet_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/applet_alt_exists.html new file mode 100644 index 000000000..933d4df1d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/applet_alt_exists.html @@ -0,0 +1,102 @@ + + + + applet_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/application_content_accessible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/application_content_accessible.html new file mode 100644 index 000000000..3c1f52a7f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/application_content_accessible.html @@ -0,0 +1,92 @@ + + + + application_content_accessible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/area_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/area_alt_exists.html new file mode 100644 index 000000000..c81fa120d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/area_alt_exists.html @@ -0,0 +1,101 @@ + + + + area_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_accessiblename_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_accessiblename_exists.html new file mode 100644 index 000000000..9206cd832 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_accessiblename_exists.html @@ -0,0 +1,112 @@ + + + + aria_accessiblename_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_tabindex_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_tabindex_valid.html new file mode 100644 index 000000000..9764a2547 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_tabindex_valid.html @@ -0,0 +1,107 @@ + + + + aria_activedescendant_tabindex_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_valid.html new file mode 100644 index 000000000..5d9289a97 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_activedescendant_valid.html @@ -0,0 +1,102 @@ + + + + aria_activedescendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_label_unique.html new file mode 100644 index 000000000..efbcb6ce8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_application_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_labelled.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_labelled.html new file mode 100644 index 000000000..031475cb2 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_application_labelled.html @@ -0,0 +1,98 @@ + + + + aria_application_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_article_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_article_label_unique.html new file mode 100644 index 000000000..908639d92 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_article_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_article_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_allowed.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_allowed.html new file mode 100644 index 000000000..887349704 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_allowed.html @@ -0,0 +1,94 @@ + + + + aria_attribute_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_conflict.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_conflict.html new file mode 100644 index 000000000..3377c6e1e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_conflict.html @@ -0,0 +1,109 @@ + + + + aria_attribute_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_deprecated.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_deprecated.html new file mode 100644 index 000000000..6db15d1d9 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + aria_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_exists.html new file mode 100644 index 000000000..b4dbda494 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_exists.html @@ -0,0 +1,93 @@ + + + + aria_attribute_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_redundant.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_redundant.html new file mode 100644 index 000000000..d10ce09c3 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_redundant.html @@ -0,0 +1,98 @@ + + + + aria_attribute_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_required.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_required.html new file mode 100644 index 000000000..37926996e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_required.html @@ -0,0 +1,103 @@ + + + + aria_attribute_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_valid.html new file mode 100644 index 000000000..bb6219f90 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_valid.html @@ -0,0 +1,98 @@ + + + + aria_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_value_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_value_valid.html new file mode 100644 index 000000000..5d8a7387b --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_attribute_value_valid.html @@ -0,0 +1,94 @@ + + + + aria_attribute_value_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_label_unique.html new file mode 100644 index 000000000..31e5897f4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_banner_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_single.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_single.html new file mode 100644 index 000000000..692e01bd1 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_banner_single.html @@ -0,0 +1,97 @@ + + + + aria_banner_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_tabbable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_tabbable.html new file mode 100644 index 000000000..4de793fb9 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_tabbable.html @@ -0,0 +1,96 @@ + + + + aria_child_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_valid.html new file mode 100644 index 000000000..d77276e8e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_child_valid.html @@ -0,0 +1,120 @@ + + + + aria_child_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_unique.html new file mode 100644 index 000000000..7b1c255d6 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_unique.html @@ -0,0 +1,102 @@ + + + + aria_complementary_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_visible.html new file mode 100644 index 000000000..12990a9cc --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_label_visible.html @@ -0,0 +1,98 @@ + + + + aria_complementary_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_labelled.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_labelled.html new file mode 100644 index 000000000..7ed5c1134 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_complementary_labelled.html @@ -0,0 +1,99 @@ + + + + aria_complementary_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_content_in_landmark.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_content_in_landmark.html new file mode 100644 index 000000000..2596adfb4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_content_in_landmark.html @@ -0,0 +1,91 @@ + + + + aria_content_in_landmark - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_label_unique.html new file mode 100644 index 000000000..b88611fdf --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_label_unique.html @@ -0,0 +1,100 @@ + + + + aria_contentinfo_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_misuse.html new file mode 100644 index 000000000..48baff999 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_misuse.html @@ -0,0 +1,102 @@ + + + + aria_contentinfo_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_single.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_single.html new file mode 100644 index 000000000..d652d78bf --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_contentinfo_single.html @@ -0,0 +1,98 @@ + + + + aria_contentinfo_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_descendant_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_descendant_valid.html new file mode 100644 index 000000000..be26f5d8a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_descendant_valid.html @@ -0,0 +1,102 @@ + + + + aria_descendant_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_document_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_document_label_unique.html new file mode 100644 index 000000000..3e6bcee8f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_document_label_unique.html @@ -0,0 +1,89 @@ + + + + aria_document_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_eventhandler_role_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_eventhandler_role_valid.html new file mode 100644 index 000000000..706dd752d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_eventhandler_role_valid.html @@ -0,0 +1,90 @@ + + + + aria_eventhandler_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_form_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_form_label_unique.html new file mode 100644 index 000000000..2944e44d8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_form_label_unique.html @@ -0,0 +1,110 @@ + + + + aria_form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_graphic_labelled.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_graphic_labelled.html new file mode 100644 index 000000000..ccf6d5ec8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_graphic_labelled.html @@ -0,0 +1,97 @@ + + + + aria_graphic_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_hidden_nontabbable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_hidden_nontabbable.html new file mode 100644 index 000000000..73e8e620d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_hidden_nontabbable.html @@ -0,0 +1,113 @@ + + + + aria_hidden_nontabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_id_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_id_unique.html new file mode 100644 index 000000000..f502b27fc --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_id_unique.html @@ -0,0 +1,97 @@ + + + + aria_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_img_labelled.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_img_labelled.html new file mode 100644 index 000000000..e3e8159e4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_img_labelled.html @@ -0,0 +1,98 @@ + + + + aria_img_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_keyboard_handler_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_keyboard_handler_exists.html new file mode 100644 index 000000000..505a67d20 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_keyboard_handler_exists.html @@ -0,0 +1,102 @@ + + + + aria_keyboard_handler_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_landmark_name_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_landmark_name_unique.html new file mode 100644 index 000000000..cdbf48162 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_landmark_name_unique.html @@ -0,0 +1,109 @@ + + + + aria_landmark_name_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_unique.html new file mode 100644 index 000000000..75bb16897 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_unique.html @@ -0,0 +1,107 @@ + + + + aria_main_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_visible.html new file mode 100644 index 000000000..e0447d16b --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_main_label_visible.html @@ -0,0 +1,101 @@ + + + + aria_main_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_navigation_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_navigation_label_unique.html new file mode 100644 index 000000000..135d74a53 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_navigation_label_unique.html @@ -0,0 +1,104 @@ + + + + aria_navigation_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_parent_required.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_parent_required.html new file mode 100644 index 000000000..dd5edb41a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_parent_required.html @@ -0,0 +1,95 @@ + + + + aria_parent_required - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_label_unique.html new file mode 100644 index 000000000..a94d036f4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_label_unique.html @@ -0,0 +1,101 @@ + + + + aria_region_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_labelled.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_labelled.html new file mode 100644 index 000000000..59862db7f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_region_labelled.html @@ -0,0 +1,101 @@ + + + + aria_region_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_allowed.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_allowed.html new file mode 100644 index 000000000..bc3ed0096 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_allowed.html @@ -0,0 +1,102 @@ + + + + aria_role_allowed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_redundant.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_redundant.html new file mode 100644 index 000000000..c7ab891a2 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_redundant.html @@ -0,0 +1,106 @@ + + + + aria_role_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_valid.html new file mode 100644 index 000000000..169fd682d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_role_valid.html @@ -0,0 +1,90 @@ + + + + aria_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_search_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_search_label_unique.html new file mode 100644 index 000000000..8b35964d8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_search_label_unique.html @@ -0,0 +1,99 @@ + + + + aria_search_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_toolbar_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_toolbar_label_unique.html new file mode 100644 index 000000000..bc1bad2f0 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_toolbar_label_unique.html @@ -0,0 +1,101 @@ + + + + aria_toolbar_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_widget_labelled.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_widget_labelled.html new file mode 100644 index 000000000..15daaa91e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/aria_widget_labelled.html @@ -0,0 +1,99 @@ + + + + aria_widget_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/asciiart_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/asciiart_alt_exists.html new file mode 100644 index 000000000..978806cc7 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/asciiart_alt_exists.html @@ -0,0 +1,89 @@ + + + + asciiart_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/blink_css_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/blink_css_review.html new file mode 100644 index 000000000..872c1d02b --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/blink_css_review.html @@ -0,0 +1,93 @@ + + + + blink_css_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/blink_elem_deprecated.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/blink_elem_deprecated.html new file mode 100644 index 000000000..f05cd172d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/blink_elem_deprecated.html @@ -0,0 +1,92 @@ + + + + blink_elem_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/blockquote_cite_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/blockquote_cite_exists.html new file mode 100644 index 000000000..5a3b7fcad --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/blockquote_cite_exists.html @@ -0,0 +1,89 @@ + + + + blockquote_cite_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/canvas_content_described.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/canvas_content_described.html new file mode 100644 index 000000000..70153bd30 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/canvas_content_described.html @@ -0,0 +1,112 @@ + + + + canvas_content_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/caption_track_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/caption_track_exists.html new file mode 100644 index 000000000..0c64627db --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/caption_track_exists.html @@ -0,0 +1,97 @@ + + + + caption_track_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_active_descendant.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_active_descendant.html new file mode 100644 index 000000000..69c4648f4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_active_descendant.html @@ -0,0 +1,108 @@ + + + + combobox_active_descendant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_autocomplete_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_autocomplete_valid.html new file mode 100644 index 000000000..b52699118 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_autocomplete_valid.html @@ -0,0 +1,136 @@ + + + + combobox_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_design_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_design_valid.html new file mode 100644 index 000000000..560d48176 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_design_valid.html @@ -0,0 +1,93 @@ + + + + combobox_design_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_focusable_elements.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_focusable_elements.html new file mode 100644 index 000000000..d14158c52 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_focusable_elements.html @@ -0,0 +1,92 @@ + + + + combobox_focusable_elements - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_haspopup_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_haspopup_valid.html new file mode 100644 index 000000000..f8491125f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_haspopup_valid.html @@ -0,0 +1,107 @@ + + + + combobox_haspopup_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_popup_reference.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_popup_reference.html new file mode 100644 index 000000000..076dc4b98 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/combobox_popup_reference.html @@ -0,0 +1,113 @@ + + + + combobox_popup_reference - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/dir_attribute_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/dir_attribute_valid.html new file mode 100644 index 000000000..cbea3873f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/dir_attribute_valid.html @@ -0,0 +1,88 @@ + + + + dir_attribute_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/download_keyboard_controllable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/download_keyboard_controllable.html new file mode 100644 index 000000000..4585133a6 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/download_keyboard_controllable.html @@ -0,0 +1,89 @@ + + + + download_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/draggable_alternative_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/draggable_alternative_exists.html new file mode 100644 index 000000000..723ceaa87 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/draggable_alternative_exists.html @@ -0,0 +1,105 @@ + + + + draggable_alternative_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_labelled.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_labelled.html new file mode 100644 index 000000000..0636e442c --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_labelled.html @@ -0,0 +1,93 @@ + + + + element_accesskey_labelled - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_unique.html new file mode 100644 index 000000000..4e18c87a8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_accesskey_unique.html @@ -0,0 +1,99 @@ + + + + element_accesskey_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_attribute_deprecated.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_attribute_deprecated.html new file mode 100644 index 000000000..b482e2090 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_attribute_deprecated.html @@ -0,0 +1,103 @@ + + + + element_attribute_deprecated - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_id_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_id_unique.html new file mode 100644 index 000000000..1a0b558f4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_id_unique.html @@ -0,0 +1,102 @@ + + + + element_id_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_lang_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_lang_valid.html new file mode 100644 index 000000000..c9f8566d0 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_lang_valid.html @@ -0,0 +1,109 @@ + + + + element_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_mouseevent_keyboard.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_mouseevent_keyboard.html new file mode 100644 index 000000000..8460c7184 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_mouseevent_keyboard.html @@ -0,0 +1,102 @@ + + + + element_mouseevent_keyboard - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_orientation_unlocked.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_orientation_unlocked.html new file mode 100644 index 000000000..30796e523 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_orientation_unlocked.html @@ -0,0 +1,112 @@ + + + + element_orientation_unlocked - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_scrollable_tabbable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_scrollable_tabbable.html new file mode 100644 index 000000000..437a86521 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_scrollable_tabbable.html @@ -0,0 +1,115 @@ + + + + element_scrollable_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_role_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_role_valid.html new file mode 100644 index 000000000..96462744a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_role_valid.html @@ -0,0 +1,136 @@ + + + + element_tabbable_role_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_unobscured.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_unobscured.html new file mode 100644 index 000000000..0025e0d14 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_unobscured.html @@ -0,0 +1,103 @@ + + + + element_tabbable_unobscured - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_visible.html new file mode 100644 index 000000000..0e15baecb --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/element_tabbable_visible.html @@ -0,0 +1,124 @@ + + + + element_tabbable_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/embed_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/embed_alt_exists.html new file mode 100644 index 000000000..7f93ffb9d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/embed_alt_exists.html @@ -0,0 +1,95 @@ + + + + embed_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/embed_noembed_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/embed_noembed_exists.html new file mode 100644 index 000000000..bda1fea18 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/embed_noembed_exists.html @@ -0,0 +1,102 @@ + + + + embed_noembed_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/emoticons_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/emoticons_alt_exists.html new file mode 100644 index 000000000..c96e81a1b --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/emoticons_alt_exists.html @@ -0,0 +1,89 @@ + + + + emoticons_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/error_message_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/error_message_exists.html new file mode 100644 index 000000000..acb11c882 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/error_message_exists.html @@ -0,0 +1,105 @@ + + + + error_message_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_label_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_label_valid.html new file mode 100644 index 000000000..34fb38e88 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_label_valid.html @@ -0,0 +1,106 @@ + + + + fieldset_label_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_legend_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_legend_valid.html new file mode 100644 index 000000000..369bb2451 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/fieldset_legend_valid.html @@ -0,0 +1,99 @@ + + + + fieldset_legend_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/figure_label_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/figure_label_exists.html new file mode 100644 index 000000000..605887cfe --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/figure_label_exists.html @@ -0,0 +1,102 @@ + + + + figure_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/form_font_color.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_font_color.html new file mode 100644 index 000000000..210f3655e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_font_color.html @@ -0,0 +1,90 @@ + + + + form_font_color - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/form_interaction_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_interaction_review.html new file mode 100644 index 000000000..d6f8ae03c --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_interaction_review.html @@ -0,0 +1,91 @@ + + + + form_interaction_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/form_label_unique.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_label_unique.html new file mode 100644 index 000000000..daa3e9c49 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_label_unique.html @@ -0,0 +1,89 @@ + + + + form_label_unique - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_button_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_button_exists.html new file mode 100644 index 000000000..862fad572 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_button_exists.html @@ -0,0 +1,91 @@ + + + + form_submit_button_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_review.html new file mode 100644 index 000000000..689ac33e5 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/form_submit_review.html @@ -0,0 +1,92 @@ + + + + form_submit_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/frame_src_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/frame_src_valid.html new file mode 100644 index 000000000..e28a2a236 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/frame_src_valid.html @@ -0,0 +1,91 @@ + + + + frame_src_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/frame_title_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/frame_title_exists.html new file mode 100644 index 000000000..0a8df1680 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/frame_title_exists.html @@ -0,0 +1,97 @@ + + + + frame_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/heading_content_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/heading_content_exists.html new file mode 100644 index 000000000..c9267af48 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/heading_content_exists.html @@ -0,0 +1,88 @@ + + + + heading_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/heading_markup_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/heading_markup_misuse.html new file mode 100644 index 000000000..8495c73cf --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/heading_markup_misuse.html @@ -0,0 +1,91 @@ + + + + heading_markup_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_exists.html new file mode 100644 index 000000000..6cb8bdd45 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_exists.html @@ -0,0 +1,90 @@ + + + + html_lang_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_valid.html new file mode 100644 index 000000000..e5d814de2 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/html_lang_valid.html @@ -0,0 +1,111 @@ + + + + html_lang_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/html_skipnav_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/html_skipnav_exists.html new file mode 100644 index 000000000..322799760 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/html_skipnav_exists.html @@ -0,0 +1,91 @@ + + + + html_skipnav_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/iframe_interactive_tabbable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/iframe_interactive_tabbable.html new file mode 100644 index 000000000..51f0318b2 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/iframe_interactive_tabbable.html @@ -0,0 +1,105 @@ + + + + iframe_interactive_tabbable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/imagebutton_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/imagebutton_alt_exists.html new file mode 100644 index 000000000..d8ddca64d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/imagebutton_alt_exists.html @@ -0,0 +1,84 @@ + + + + imagebutton_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/imagemap_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/imagemap_alt_exists.html new file mode 100644 index 000000000..bb83c1748 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/imagemap_alt_exists.html @@ -0,0 +1,100 @@ + + + + imagemap_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_background.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_background.html new file mode 100644 index 000000000..463f0b76f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_background.html @@ -0,0 +1,89 @@ + + + + img_alt_background - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_decorative.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_decorative.html new file mode 100644 index 000000000..f02cfe942 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_decorative.html @@ -0,0 +1,92 @@ + + + + img_alt_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_misuse.html new file mode 100644 index 000000000..e78d0127a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_misuse.html @@ -0,0 +1,91 @@ + + + + img_alt_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_null.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_null.html new file mode 100644 index 000000000..863b054cb --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_null.html @@ -0,0 +1,93 @@ + + + + img_alt_null - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_redundant.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_redundant.html new file mode 100644 index 000000000..45a436ad8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_redundant.html @@ -0,0 +1,93 @@ + + + + img_alt_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_valid.html new file mode 100644 index 000000000..6ce0f53c0 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_alt_valid.html @@ -0,0 +1,94 @@ + + + + img_alt_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_ismap_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_ismap_misuse.html new file mode 100644 index 000000000..0ea9c9bd5 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_ismap_misuse.html @@ -0,0 +1,86 @@ + + + + img_ismap_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/img_longdesc_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_longdesc_misuse.html new file mode 100644 index 000000000..f9b513a19 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/img_longdesc_misuse.html @@ -0,0 +1,97 @@ + + + + img_longdesc_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_autocomplete_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_autocomplete_valid.html new file mode 100644 index 000000000..c192340a4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_autocomplete_valid.html @@ -0,0 +1,118 @@ + + + + input_autocomplete_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_checkboxes_grouped.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_checkboxes_grouped.html new file mode 100644 index 000000000..16a00d04a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_checkboxes_grouped.html @@ -0,0 +1,90 @@ + + + + input_checkboxes_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_fields_grouped.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_fields_grouped.html new file mode 100644 index 000000000..1f1e0efe8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_fields_grouped.html @@ -0,0 +1,103 @@ + + + + input_fields_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_haspopup_conflict.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_haspopup_conflict.html new file mode 100644 index 000000000..4f024f72a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_haspopup_conflict.html @@ -0,0 +1,103 @@ + + + + input_haspopup_conflict - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_after.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_after.html new file mode 100644 index 000000000..915d99039 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_after.html @@ -0,0 +1,96 @@ + + + + input_label_after - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_before.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_before.html new file mode 100644 index 000000000..1dbef3a45 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_before.html @@ -0,0 +1,94 @@ + + + + input_label_before - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_exists.html new file mode 100644 index 000000000..2ecf22e62 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_exists.html @@ -0,0 +1,93 @@ + + + + input_label_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_visible.html new file mode 100644 index 000000000..c32ca03ac --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_label_visible.html @@ -0,0 +1,98 @@ + + + + input_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_onchange_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_onchange_review.html new file mode 100644 index 000000000..579ae79dc --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_onchange_review.html @@ -0,0 +1,92 @@ + + + + input_onchange_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/input_placeholder_label_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_placeholder_label_visible.html new file mode 100644 index 000000000..2dc38754f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/input_placeholder_label_visible.html @@ -0,0 +1,109 @@ + + + + input_placeholder_label_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/label_content_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/label_content_exists.html new file mode 100644 index 000000000..248e4a9c0 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/label_content_exists.html @@ -0,0 +1,89 @@ + + + + label_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/label_name_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/label_name_visible.html new file mode 100644 index 000000000..f65151a0a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/label_name_visible.html @@ -0,0 +1,95 @@ + + + + label_name_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/label_ref_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/label_ref_valid.html new file mode 100644 index 000000000..163e58344 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/label_ref_valid.html @@ -0,0 +1,95 @@ + + + + label_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/list_children_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/list_children_valid.html new file mode 100644 index 000000000..3ce7c4226 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/list_children_valid.html @@ -0,0 +1,110 @@ + + + + list_children_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/list_markup_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/list_markup_review.html new file mode 100644 index 000000000..05e12acc2 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/list_markup_review.html @@ -0,0 +1,90 @@ + + + + list_markup_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/list_structure_proper.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/list_structure_proper.html new file mode 100644 index 000000000..7d776bfa8 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/list_structure_proper.html @@ -0,0 +1,89 @@ + + + + list_structure_proper - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/marquee_elem_avoid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/marquee_elem_avoid.html new file mode 100644 index 000000000..0ed194e2d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/marquee_elem_avoid.html @@ -0,0 +1,90 @@ + + + + marquee_elem_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_brief.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_brief.html new file mode 100644 index 000000000..f81965390 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_brief.html @@ -0,0 +1,101 @@ + + + + media_alt_brief - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_exists.html new file mode 100644 index 000000000..0788e728a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_alt_exists.html @@ -0,0 +1,89 @@ + + + + media_alt_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/media_audio_transcribed.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_audio_transcribed.html new file mode 100644 index 000000000..b186fb98f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_audio_transcribed.html @@ -0,0 +1,95 @@ + + + + media_audio_transcribed - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/media_autostart_controllable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_autostart_controllable.html new file mode 100644 index 000000000..ab8e610f0 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_autostart_controllable.html @@ -0,0 +1,89 @@ + + + + media_autostart_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/media_keyboard_controllable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_keyboard_controllable.html new file mode 100644 index 000000000..b2b900bb5 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_keyboard_controllable.html @@ -0,0 +1,101 @@ + + + + media_keyboard_controllable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/media_live_captioned.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_live_captioned.html new file mode 100644 index 000000000..72c574b6c --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_live_captioned.html @@ -0,0 +1,91 @@ + + + + media_live_captioned - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/media_track_available.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_track_available.html new file mode 100644 index 000000000..da4b8c590 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/media_track_available.html @@ -0,0 +1,87 @@ + + + + media_track_available - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_redirect_optional.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_redirect_optional.html new file mode 100644 index 000000000..269467c04 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_redirect_optional.html @@ -0,0 +1,93 @@ + + + + meta_redirect_optional - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_refresh_delay.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_refresh_delay.html new file mode 100644 index 000000000..39acaad63 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_refresh_delay.html @@ -0,0 +1,94 @@ + + + + meta_refresh_delay - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_viewport_zoomable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_viewport_zoomable.html new file mode 100644 index 000000000..5cd187b19 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/meta_viewport_zoomable.html @@ -0,0 +1,101 @@ + + + + meta_viewport_zoomable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/noembed_content_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/noembed_content_exists.html new file mode 100644 index 000000000..42ca8905e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/noembed_content_exists.html @@ -0,0 +1,99 @@ + + + + noembed_content_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/object_text_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/object_text_exists.html new file mode 100644 index 000000000..021e81f8e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/object_text_exists.html @@ -0,0 +1,99 @@ + + + + object_text_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_exists.html new file mode 100644 index 000000000..4ff55ea0d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_exists.html @@ -0,0 +1,100 @@ + + + + page_title_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_valid.html new file mode 100644 index 000000000..0d4413f34 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/page_title_valid.html @@ -0,0 +1,98 @@ + + + + page_title_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/script_focus_blur_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_focus_blur_review.html new file mode 100644 index 000000000..6a30ae444 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_focus_blur_review.html @@ -0,0 +1,92 @@ + + + + script_focus_blur_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_avoid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_avoid.html new file mode 100644 index 000000000..2a3612c9b --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_avoid.html @@ -0,0 +1,89 @@ + + + + script_onclick_avoid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_misuse.html new file mode 100644 index 000000000..f22c748cd --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_onclick_misuse.html @@ -0,0 +1,90 @@ + + + + script_onclick_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/script_select_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_select_review.html new file mode 100644 index 000000000..c36ec5d72 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/script_select_review.html @@ -0,0 +1,92 @@ + + + + script_select_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/select_options_grouped.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/select_options_grouped.html new file mode 100644 index 000000000..b92d29d75 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/select_options_grouped.html @@ -0,0 +1,88 @@ + + + + select_options_grouped - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_described.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_described.html new file mode 100644 index 000000000..770603eac --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_described.html @@ -0,0 +1,96 @@ + + + + skip_main_described - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_exists.html new file mode 100644 index 000000000..47ed2158b --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/skip_main_exists.html @@ -0,0 +1,102 @@ + + + + skip_main_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/style_background_decorative.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_background_decorative.html new file mode 100644 index 000000000..8f6859a69 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_background_decorative.html @@ -0,0 +1,91 @@ + + + + style_background_decorative - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/style_before_after_review.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_before_after_review.html new file mode 100644 index 000000000..495fcbe72 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_before_after_review.html @@ -0,0 +1,93 @@ + + + + style_before_after_review - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/style_color_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_color_misuse.html new file mode 100644 index 000000000..c613c4c22 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_color_misuse.html @@ -0,0 +1,89 @@ + + + + style_color_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/style_focus_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_focus_visible.html new file mode 100644 index 000000000..ed107b9ab --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_focus_visible.html @@ -0,0 +1,94 @@ + + + + style_focus_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/style_highcontrast_visible.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_highcontrast_visible.html new file mode 100644 index 000000000..f878eb87d --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_highcontrast_visible.html @@ -0,0 +1,94 @@ + + + + style_highcontrast_visible - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/style_hover_persistent.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_hover_persistent.html new file mode 100644 index 000000000..181fae6f0 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_hover_persistent.html @@ -0,0 +1,115 @@ + + + + style_hover_persistent - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/style_viewport_resizable.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_viewport_resizable.html new file mode 100644 index 000000000..be9978210 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/style_viewport_resizable.html @@ -0,0 +1,88 @@ + + + + style_viewport_resizable - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_aria_descendants.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_aria_descendants.html new file mode 100644 index 000000000..c62dba400 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_aria_descendants.html @@ -0,0 +1,109 @@ + + + + table_aria_descendants - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_empty.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_empty.html new file mode 100644 index 000000000..1e1b8b07e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_empty.html @@ -0,0 +1,100 @@ + + + + table_caption_empty - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_nested.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_nested.html new file mode 100644 index 000000000..898ad9d29 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_caption_nested.html @@ -0,0 +1,95 @@ + + + + table_caption_nested - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_exists.html new file mode 100644 index 000000000..a5afc9b9a --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_exists.html @@ -0,0 +1,93 @@ + + + + table_headers_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_ref_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_ref_valid.html new file mode 100644 index 000000000..be61ea0d1 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_ref_valid.html @@ -0,0 +1,88 @@ + + + + table_headers_ref_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_related.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_related.html new file mode 100644 index 000000000..5808b4d93 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_headers_related.html @@ -0,0 +1,91 @@ + + + + table_headers_related - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_layout_linearized.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_layout_linearized.html new file mode 100644 index 000000000..e93151c39 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_layout_linearized.html @@ -0,0 +1,90 @@ + + + + table_layout_linearized - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_scope_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_scope_valid.html new file mode 100644 index 000000000..ffd1a0181 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_scope_valid.html @@ -0,0 +1,93 @@ + + + + table_scope_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_structure_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_structure_misuse.html new file mode 100644 index 000000000..dfb3c8e87 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_structure_misuse.html @@ -0,0 +1,90 @@ + + + + table_structure_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/table_summary_redundant.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_summary_redundant.html new file mode 100644 index 000000000..66153770f --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/table_summary_redundant.html @@ -0,0 +1,101 @@ + + + + table_summary_redundant - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/target_spacing_sufficient.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/target_spacing_sufficient.html new file mode 100644 index 000000000..d08b0d838 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/target_spacing_sufficient.html @@ -0,0 +1,104 @@ + + + + target_spacing_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/text_block_heading.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_block_heading.html new file mode 100644 index 000000000..843669d69 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_block_heading.html @@ -0,0 +1,90 @@ + + + + text_block_heading - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/text_contrast_sufficient.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_contrast_sufficient.html new file mode 100644 index 000000000..efc97430e --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_contrast_sufficient.html @@ -0,0 +1,91 @@ + + + + text_contrast_sufficient - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/text_quoted_correctly.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_quoted_correctly.html new file mode 100644 index 000000000..f775b7b5c --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_quoted_correctly.html @@ -0,0 +1,103 @@ + + + + text_quoted_correctly - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/text_sensory_misuse.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_sensory_misuse.html new file mode 100644 index 000000000..d3980d2b4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_sensory_misuse.html @@ -0,0 +1,91 @@ + + + + text_sensory_misuse - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/text_spacing_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_spacing_valid.html new file mode 100644 index 000000000..929c7aff9 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_spacing_valid.html @@ -0,0 +1,103 @@ + + + + text_spacing_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/text_whitespace_valid.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_whitespace_valid.html new file mode 100644 index 000000000..dfb5ec8c4 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/text_whitespace_valid.html @@ -0,0 +1,92 @@ + + + + text_whitespace_valid - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_exists.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_exists.html new file mode 100644 index 000000000..77e989e21 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_exists.html @@ -0,0 +1,96 @@ + + + + widget_tabbable_exists - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_single.html b/rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_single.html new file mode 100644 index 000000000..21769b54c --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/en-US/widget_tabbable_single.html @@ -0,0 +1,90 @@ + + + + widget_tabbable_single - Accessibility Checker Help + + + + + + + + + + + + +
+
+
+ +

+ +
+ +

+
+
+
+
+ + + + +
+
+
+ + + +
+
+
+ + diff --git a/rule-server/src/static/archives/2023.11.10/doc/rules.html b/rule-server/src/static/archives/2023.11.10/doc/rules.html new file mode 100644 index 000000000..b08aba2bb --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/doc/rules.html @@ -0,0 +1,15432 @@ + + + Accessibility Checker Rules + + + + + + + + +
+ + IBM Accessibility 7.2WCAG 2.2 (A, AA)WCAG 2.1 (A, AA)WCAG 2.0 (A, AA) + +
+
+

1.1.1 Non-text Content [A]

+
All non-text content that is presented to the user has a text alternative that serves the equivalent purpose.
+ applet_alt_exists: <applet> elements must provide an 'alt' attribute and an alternative description + +  Violation — +
An <applet> element does not have an 'alt' attribute that provides a short text alternative Violation — + The 'alt' attribute value for an <applet> element duplicates the 'code' attribute Violation — + An <applet> element provides alternative text, but does not provide inner content + + img_alt_redundant: The text alternative for an image within a link should not repeat the link text or adjacent link text + +  Violation — + Link text is repeated in an image 'alt' value within the same link Violation — + Link text of previous link is repeated in image 'alt' value of a link Violation — + Image 'alt' value within a link is repeated in link text of the link after + + img_alt_valid: Images require an 'alt' attribute with a short text alternative if they convey meaning, or 'alt="" if decorative + +  Violation — + Image 'alt' attribute value consists only of blank space(s) Violation — + The image has neither an alt atttribute nor an ARIA label or title Violation — + The image does not have an alt attribute or ARIA label and 'title' attribute value consists only of blank space(s) + + area_alt_exists: <area> elements in an image map must have a text alternative + +  Violation — + <area> element in an image map has no text alternative + + aria_graphic_labelled: An element with a graphics role must have a non-empty label + +  Violation — + Element with "{0}" graphics role has no label or an empty label + + aria_img_labelled: An element with "img" role must have a non-empty label + +  Violation — + Element with "img" role has no label or an empty label + + imagebutton_alt_exists: The <input> element of type "image" should have a text alternative + +  Violation — + The <input> element of type "image" has no text alternative + + imagemap_alt_exists: An image map and each <area> element in an image map must have text alternative(s) + +  Violation — + Image map or child <area> has no text alternative + + img_alt_decorative: Image designated as decorative must have 'alt="" + +  Violation — + Image designated as decorative has non-null 'alt' attribute + + img_alt_null: When the image 'alt' attribute is empty, the 'title' attribute must also be empty + +  Violation — + The image 'alt' attribute is empty, but the 'title' attribute is not empty + + object_text_exists: <object> element must have a text alternative for the content rendered by the object + +  Violation — + An <object> element does not have a text alternative + + img_alt_misuse: 'alt' attribute value must be a good inline replacement for the image + +  Needs review — + Verify that the file name serves as a good inline replacement for the image + + img_ismap_misuse: Server-side image map hot-spots must have duplicate text links + +  Needs review — + Server-side image map hot-spots do not have duplicate text links + + img_longdesc_misuse: The 'longdesc' attribute must reference HTML content + +  Needs review — + Verify that the file designated by the 'longdesc' attribute contains valid HTML content (file extension not recognized) + + media_alt_exists: Audio or video on the page must have a short text alternative that describes the media content + +  Needs review — + Filename used as label for embedded audio or video + + style_background_decorative: Images included by using CSS alone must not convey important information + +  Needs review — + Verify the CSS background image does not convey important information + + style_highcontrast_visible: Windows high contrast mode must be supported when using CSS to include, position or alter non-decorative content + +  Needs review — + Confirm Windows high contrast mode is supported when using CSS to include, position or alter non-decorative content + + figure_label_exists: A <figure> element must have an associated label + +  Recommendation — + The <figure> element does not have an associated label + + embed_alt_exists: Provide alternative content for <embed> elements + +  Recommendation — + Verify that the <embed> element has alternative content + + embed_noembed_exists: <embed> elements should be immediately followed by a non-embedded element + +  Recommendation — + Verify that the <embed> element is immediately followed by a non-embedded element + + media_alt_brief: Alternative text in 'alt' attribute should be brief (<150 characters) + +  Recommendation — + Text alternative is more than 150 characters + + noembed_content_exists: <noembed> elements should contain descriptive text + +  Recommendation — + Add descriptive text to the <noembed> element + + canvas_content_described: The <canvas> element may not be accessible + +  Recommendation — + Verify accessibility of the <canvas> element + + img_alt_background: Background images that convey important information must have a text alternative that describes the image + +  Recommendation — + Verify important background image information has a text alternative in system high contrast mode + + +
+

1.2.1 Audio-only and Video-only (Prerecorded) [A]

+
For prerecorded audio-only or video-only media, an alternative provides equivalent information.
+ caption_track_exists: A <video> element must have a text alternative for any meaningful audio content + +  Needs review — + Verify that captions are available for any meaningful audio or provide a caption track for the <video> element + + media_audio_transcribed: Audio information should also be available in text form + +  Recommendation — + Provide transcripts for audio files + + +
+

1.2.2 Captions (Prerecorded) [A]

+
Captions are provided for all prerecorded audio content in synchronized media.
+ caption_track_exists: A <video> element must have a text alternative for any meaningful audio content + +  Needs review — + Verify that captions are available for any meaningful audio or provide a caption track for the <video> element + + +
+

1.2.3 Audio Description or Media Alternative (Prerecorded) [A]

+
An alternative for time-based media or audio description of the prerecorded video content is provided for synchronized media.
+ media_track_available: Pre-recorded media should have an audio track that describes visual information + +  Recommendation — + Verify availability of a user-selectable audio track with description of visual content + + +
+

1.2.4 Captions (Live) [AA]

+
Captions are provided for all live audio content in synchronized media.
+ caption_track_exists: A <video> element must have a text alternative for any meaningful audio content + +  Needs review — + Verify that captions are available for any meaningful audio or provide a caption track for the <video> element + + media_live_captioned: Live media (streaming video with audio) should have captions for audio content + +  Recommendation — + Verify captions are provided for live media (streaming video with audio) + + +
+

1.2.5 Audio Description (Prerecorded) [AA]

+
Audio description is provided for all prerecorded video content in synchronized media.
+ media_track_available: Pre-recorded media should have an audio track that describes visual information + +  Recommendation — + Verify availability of a user-selectable audio track with description of visual content + + +
+

1.3.1 Info and Relationships [A]

+
Information, structure, and relationships conveyed through presentation can be programmatically determined or are available in text.
+ input_checkboxes_grouped: Related sets of radio buttons or checkboxes should be programmatically grouped + +  Violation — + {0} input found that has the same name, "{2}" as a {1} input Violation — + {0} input is not in the group with another {0} with the name "{1}" Violation — + {0} input and others with the name "{1}" are not grouped together Violation — + {0} input is in a different group than another {0} with the name "{1}" Needs review — + Verify that this ungrouped checkbox input is not related to other checkboxes Needs review — + Verify that this un-named, ungrouped checkbox input is not related to other checkboxes + + table_headers_ref_valid: The 'headers' attribute should refer to a valid cell in the same table + +  Violation — + The 'headers' attribute value "{0}" does not reference a valid 'id' in this document Violation — + The 'headers' attribute value "{0}" refers to itself Violation — + The 'headers' attribute value "{0}" does not refer to a cell in the same table Violation — + The 'headers' attribute value "{0}" does not refer to a cell indicated with <th> or a role of "columnheader" or "rowheader" + + fieldset_label_valid: Groups with nested inputs must have unique accessible name + +  Violation — + Group/Fieldset does not have an accessible name Violation — + Group/Fieldset "{0}" has a duplicate name to another group + + table_scope_valid: Value for 'scope' attribute must be "row", "col", "rowgroup", or "colgroup" + +  Violation — + Value provided is invalid for the 'scope' attribute Violation — + The 'scope' attribute should only be used on a <th> element + + aria_hidden_nontabbable: A hidden element should not contain any tabbable elements + +  Violation — + Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true' + + aria_landmark_name_unique: Multiple landmarks should have a unique 'aria-labelledby' or 'aria-label' or be nested in a different parent regions + +  Violation — + Multiple "{0}" landmarks with the same parent region are not distinguished from one another because they have the same "{1}" label + + form_label_unique: Form controls should have exactly one label + +  Violation — + Form control has more than one label + + label_ref_valid: The 'for' attribute must reference a non-empty, unique 'id' attribute of an <input> element + +  Violation — + The value "{0}" of the 'for' attribute is not the 'id' of a valid <input> element + + table_caption_empty: A <caption> element for a <table> element must contain descriptive text + +  Violation — + The <table> element has an empty <caption> element + + table_caption_nested: The <caption> element must be nested inside the associated <table> element + +  Violation — + <caption> element is not nested inside a <table> element + + table_headers_exists: Data table must identify headers + +  Violation — + Table has no headers identified + + table_headers_related: For a complex data table, all <th> and <td> elements must be related via 'header' or 'scope' attributes + +  Violation — + Complex table does not have headers for each cell properly defined with 'header' or 'scope' + + table_structure_misuse: Table elements with 'role="presentation" or 'role="none" should not have structural elements or attributes + +  Violation — + The <{0}> element with "presentation" role or "none" role has structural element(s) and/or attribute(s) '{1}' + + table_summary_redundant: The table summary must not duplicate the caption + +  Violation — + The table summary duplicates the caption + + blockquote_cite_exists: Use <blockquote> only for quotations, not indentation + +  Needs review — + Verify that <blockquote> should not be used only for quotations, not indentation + + heading_markup_misuse: Heading elements must not be used for presentation + +  Needs review — + Verify that the heading element is a genuine heading + + list_markup_review: Use proper HTML list elements to create lists + +  Needs review — + Verify whether this is a list that should use HTML list elements + + script_onclick_misuse: Scripts should not be used to emulate links + +  Needs review — + Possible use of a script to emulate a link + + style_before_after_review: Do not use CSS '::before' and '::after' pseudo-elements to insert non-decorative content + +  Needs review — + Verify the '::before' and '::after' pseudo-elements do not insert non-decorative content + + text_block_heading: Heading text must use a heading element + +  Needs review — + Check if this text should be marked up as a heading: {0} + + text_quoted_correctly: Quotations should be marked with <q> or <blockquote> elements + +  Needs review — + If the following text is a quotation, mark it as a <q> or <blockquote> element: {0} + + fieldset_legend_valid: <fieldset> elements should have a single, non-empty <legend> as a label + +  Recommendation — + <fieldset> element does not have a <legend> Recommendation — + <fieldset> element has more than one <legend> Recommendation — + <fieldset> element <legend> is empty + + aria_accessiblename_exists: Elements with certain roles should have accessible names + +  Recommendation — + Element <{0}> with "{1}" role has no accessible name + + input_fields_grouped: Groups of logically related input elements should be contained within a <fieldset> element + +  Recommendation — + Use the <fieldset> element to group logically related input elements + + list_structure_proper: List elements should only be used for lists of related items + +  Recommendation — + List element is missing or improperly structured + + script_onclick_avoid: Scripts should not be used to emulate links + +  Recommendation — + Verify that 'onclick' events are not used in script to emulate a link + + select_options_grouped: Groups of related options within a selection list should be grouped with <optgroup> + +  Recommendation — + Group of related options may need <optgroup> + + table_layout_linearized: Avoid using tables to format text documents in columns unless the table can be linearized + +  Recommendation — + Verify table is not being used to format text content in columns unless the table can be linearized + + +
+

1.3.2 Meaningful Sequence [A]

+
When the sequence in which content is presented affects its meaning, a correct reading sequence can be programmatically determined.
+ dir_attribute_valid: 'dir' attribute value must be "ltr", "rtl", or "auto" + +  Violation — + Invalid value used for the 'dir' attribute + + text_whitespace_valid: Space characters should not be used to control spacing within a word + +  Needs review — + Space characters should not be used to create space between the letters of a word + + +
+

1.3.3 Sensory Characteristics [A]

+
Instructions provided for understanding and operating content do not rely solely on sensory characteristics of components such as shape, size, visual location, orientation, or sound.
+ text_sensory_misuse: Instructions must be meaningful without shape or location words + +  Needs review — + If the word(s) '{0}' is part of instructions for using page content, check it is still understandable without this location or shape information + + +
+

1.3.4 Orientation [AA]

+
Content does not restrict its view and operation to a single display orientation, such as portrait or landscape.
+ element_orientation_unlocked: Elements should not be restricted to either landscape or portrait orientation using CSS transform property + +  Violation — + The element <{0}> is restricted to either landscape or portrait orientation using CSS transform property + + +
+

1.3.5 Identify Input Purpose [AA]

+
The purpose of each input field that collects information about the user can be programmatically determined when the field serves a common purpose.
+ input_autocomplete_valid: The 'autocomplete' attribute's token(s) must be appropriate for the input form field + +  Violation — + The 'autocomplete' attribute's token(s) are not appropriate for the input form field Violation — + The 'autocomplete' attribute's token(s) are not appropriate for an input form field of any type Violation — + The 'autocomplete' attribute has an incorrect value + + +
+

1.4.1 Use of Color [A]

+
Color is not used as the only visual means of conveying information, indicating an action, prompting a response, or distinguishing a visual element.
+ form_font_color: Combine color and descriptive markup to indicate required form fields + +  Needs review — + Check color is not used as the only visual means to convey which fields are required + + style_color_misuse: Combine color and descriptive markup to convey information + +  Needs review — + Verify color is not used as the only visual means of conveying information + + +
+

1.4.2 Audio Control [A]

+
If any audio plays automatically for more than 3 seconds, either a mechanism is available to pause or stop the audio, or a mechanism is available to control audio volume independently from the overall system volume level.
+ media_autostart_controllable: Mechanism must be available to pause or stop and control the volume of the audio that plays automatically + +  Needs review — + Verify there is a mechanism to pause or stop and control the volume for the audio that plays automatically + + +
+

1.4.3 Contrast (Minimum) [AA]

+
The visual presentation of text and images of text has a contrast ratio of at least 4.5:1, with a 3:1 ratio for large-scale text.
+ text_contrast_sufficient: The contrast ratio of text with its background must meet WCAG 2.1 AA requirements + +  Violation — + Text contrast of {0} with its background is less than the WCAG AA minimum requirements for text of size {1}px and weight of {2} Needs review — + The foreground text and its background color are both detected as {3}. Verify the text meets the WCAG 2.1 AA requirements for minimum contrast Needs review — + Verify the contrast ratio of the text against the lightest and the darkest colors of the background meets the WCAG 2.1 AA minimum requirements for text of size {1}px and weight of {2} Needs review — + Verify the contrast ratio of the text with shadow meets the WCAG 2.1 AA minimum requirements for text of size {1}px and weight of {2} + + +
+

1.4.4 Resize text [AA]

+
Text can be resized without assistive technology up to 200 percent without loss of content or functionality.
+ style_viewport_resizable: Text must scale up to 200% without loss of content or functionality + +  Needs review — + Verify that text sized using viewport units can be resized up to 200% + + meta_viewport_zoomable: The 'meta[name=viewport]' should not prevent the browser zooming the content + +  Recommendation — + Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user + + +
+

1.4.5 Images of Text [AA]

+
If the technologies being used can achieve the visual presentation, text should not be used to convey information rather than images of text.
+ +
+

1.4.10 Reflow [AA]

+
Content can reflow without loss of information or functionality, and without requiring scrolling in two dimensions.
+ meta_viewport_zoomable: The 'meta[name=viewport]' should not prevent the browser zooming the content + +  Recommendation — + Confirm the 'meta[name=viewport]' with "{0}" can be zoomed by user + + +
+

1.4.11 Non-text Contrast [AA]

+
The parts of graphical objects required to understand the content, and the visual information required to identify UI components and states, have a contrast ratio of at least 3:1 against adjacent colors.
+ +
+

1.4.12 Text Spacing [AA]

+
No loss of content or functionality occurs when users change letter, word and paragraph spacing, as well as line height.
+ text_spacing_valid: CSS !important should not be used in inline style to control letter or word spacing or line height + +  Violation — + CSS !important should not be used in inline ‘letter-spacing’ style Violation — + CSS !important should not be used in inline ‘word-spacing’ style Violation — + CSS !important should not be used in inline ‘line-height’ style + + +
+

1.4.13 Content on Hover or Focus [AA]

+
Where hover or focus actions cause additional content to become visible and hidden, the additional content is dismissable, hoverable and persistent.
+ style_hover_persistent: The pointer should be able to move over content displayed on hover + +  Needs review — + Confirm the pointer can be positioned over the displayed element, not just the trigger Needs review — + Confirm the pointer can be positioned over all the information displayed on hover Needs review — + Confirm the margin style attribute has not prevented the pointer from hovering over the displayed element, not just the trigger + + +
+

2.1.1 Keyboard [A]

+
All functionality of the content is operable through a keyboard interface without requiring specific timings for individual keystrokes.
+ aria_activedescendant_tabindex_valid: Element using 'aria-activedescendant' property should be tabbable + +  Violation — + The <{0}> element using 'aria-activedescendant' set to "{1}" is not tabbable + + aria_child_tabbable: UI component must have at least one tabbable descendant for keyboard access + +  Violation — + None of the descendent elements with "{1}" role is tabbable + + element_scrollable_tabbable: Scrollable elements should be tabbable or contain tabbable content + +  Violation — + The scrollable element <{0}> with non-interactive content is not tabbable + + iframe_interactive_tabbable: Iframe with interactive content should not be excluded from tab order using tabindex + +  Violation — + The <iframe> with interactive content is excluded from tab order using tabindex + + application_content_accessible: Non-decorative static text and image content within an element with "application" role must be accessible + +  Needs review — + Verify that the non-decorative static text and image content within an element with "application" role are accessible + + aria_keyboard_handler_exists: Interactive WAI_ARIA UI components must provide keyboard access + +  Needs review — + Verify the <{0}> element with "{1}" role has keyboard access + + media_keyboard_controllable: Media using <audio> and/or <video> elements must have keyboard accessible controls + +  Needs review — + Verify media using <audio> and/or <video> elements have keyboard accessible controls + + element_mouseevent_keyboard: All interactive content with mouse event handlers must have equivalent keyboard access + +  Recommendation — + Confirm the <{0}> element with mouse event handler(s) '{1}' has a corresponding keyboard handler(s) + + +
+

2.1.2 No Keyboard Trap [A]

+
If keyboard focus can be moved to a component using a keyboard interface, then focus can be moved away from that component using only a keyboard interface, and, if it requires more than unmodified arrow or tab keys or other standard exit methods, the user is advised of the method for moving focus away.
+ download_keyboard_controllable: File download mechanisms should be keyboard-operable and preserve page focus location + +  Recommendation — + Verify that the file download mechanism does not cause a keyboard trap + + +
+

2.1.4 Character Key Shortcuts [A]

+
If a keyboard shortcut is implemented using only letter, punctuation, number or symbol characters, then the shortcut can be turned off, remapped or activated only on focus.
+ +
+

2.2.1 Timing Adjustable [A]

+
For each time limit that is set by the content, the user can turn off, adjust, or extend the limit.
+ meta_redirect_optional: Page should not automatically refresh without warning or option to turn it off or adjust the time limit + +  Violation — + Check page does not automatically refresh without warning or options Violation — + Check page does not automatically refresh without warning or options + + meta_refresh_delay: Pages should not refresh automatically + +  Needs review — + Verify page is not being caused to refresh automatically + + +
+

2.2.2 Pause, Stop, Hide [A]

+
For moving, blinking, scrolling, or auto-updating information, the user can pause, stop, hide or adjust the information.
+ blink_elem_deprecated: Content that blinks persistently must not be used + +  Violation — + Content found that blinks persistently + + marquee_elem_avoid: The <marquee> element is obsolete and should not be used + +  Violation — + Scrolling content found that uses the obsolete <marquee> element + + blink_css_review: Do not use the "blink" value of the 'text-decoration' property for longer than five seconds + +  Needs review — + Check the "blink" value of the CSS 'text-decoration' property is not used for more than than five seconds + + +
+

2.3.1 Three Flashes or Below Threshold [A]

+
Content does not contain anything that flashes more than three times in any one second period, or the flash is below the general flash and red flash thresholds.
+ +
+

2.4.1 Bypass Blocks [A]

+
A mechanism is available to bypass blocks of content that are repeated on multiple Web pages.
+ aria_application_label_unique: Each element with "application" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "application" role do not have unique labels + + aria_application_labelled: An element with "application" role must have an accessible name that describes its purpose + +  Violation — + Element with "application" role does not have an accessible name + + aria_article_label_unique: Each element with "article" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "article" role do not have unique labels + + aria_banner_label_unique: Each element with "banner" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "banner" role do not have unique labels + + aria_banner_single: There must be only one element with "banner" role on the page + +  Violation — + There is more than one element with "banner" role on the page + + aria_complementary_label_unique: Each element with "complementary" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "complementary" role do not have unique labels + + aria_complementary_labelled: An element with "complementary" role must have an accessible name + +  Violation — + The element with "complementary" role does not have an accessible name + + aria_content_in_landmark: All content must reside within an element with a landmark role + +  Violation — + Content is not within a landmark element + + aria_contentinfo_label_unique: Each element with "contentinfo" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "contentinfo" role do not have unique labels + + aria_contentinfo_single: A page, document or application should only have one element with "contentinfo" role + +  Violation — + Multiple elements with "contentinfo" role found on a page + + aria_document_label_unique: All elements with a "document" role must have unique labels + +  Violation — + Multiple elements with a "document" role do not have unique labels + + aria_form_label_unique: Each element with "form" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "form" role do not have unique labels + + aria_main_label_unique: Elements with "main" role must have unique labels + +  Violation — + Multiple elements with "main" role do not have unique labels + + aria_navigation_label_unique: Each element with "navigation" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "navigation" role do not have unique labels + + aria_region_label_unique: Each element with a "region" role must have a unique label + +  Violation — + Multiple elements with "region" role do not have unique labels + + aria_region_labelled: Each element with "region" role must have an accessible name that describes its purpose + +  Violation — + Element with a "region" role does not have an accessible name + + aria_search_label_unique: Each element with "search" role must have a unique label that describes its purpose + +  Violation — + Multiple elements with "search" role do not have unique labels + + skip_main_exists: Pages must provide a way to skip directly to the main content + +  Violation — + The page does not provide a way to quickly navigate to the main content (ARIA "main" landmark or a skip link) + + frame_src_valid: A <frame> containing non-HTML content must be made accessible + +  Needs review — + Verify <frame> content is accessible + + html_skipnav_exists: Provide a way to bypass blocks of content that are repeated on multiple Web pages + +  Needs review — + Verify there is a way to bypass blocks of content that are repeated on multiple Web pages + + skip_main_described: The description of a hyperlink used to skip content must communicate where it links to + +  Needs review — + Verify that if this hyperlink skips content, the description communicates where it links to + + aria_complementary_label_visible: Each element with "complementary" role should have a visible label that describes its purpose + +  Recommendation — + The element with "complementary" role does not have a visible label + + aria_contentinfo_misuse: An element with "contentinfo" role is only permitted with an element with "main" role + +  Recommendation — + The element with "contentinfo" role is present without an element with "main" role + + aria_main_label_visible: Each element with "main" role should have a unique visible label that describes its purpose + +  Recommendation — + Multiple elements with "main" role do not have unique visible labels + + +
+

2.4.2 Page Titled [A]

+
Web pages, non-web documents, and software have titles that describe topic or purpose.
+ page_title_exists: The page should have a title that correctly identifies the subject of the page + +  Violation — + Missing <head> element so there can be no <title> element present Violation — + Missing <title> element in <head> element Violation — + The <title> element is empty (no innerHTML) + + page_title_valid: Page <title> should be a descriptive title, rather than a filename + +  Needs review — + Verify that using the filename as the page <title> value is descriptive + + +
+

2.4.3 Focus Order [A]

+
If content can be navigated sequentially and the navigation sequences affect meaning or operation, focusable components receive focus in an order that preserves meaning and operability.
+ widget_tabbable_exists: Component must have at least one tabbable element + +  Needs review — + Component with "{0}" role does not have a tabbable element + + widget_tabbable_single: Certain components must have no more than one tabbable element + +  Needs review — + Component with "{0}" role has more than one tabbable element + + +
+

2.4.4 Link Purpose (In Context) [A]

+
The purpose of each link can be determined from the link text alone or from the link text together with its programmatically determined link content.
+ a_text_purpose: Hyperlinks must have a text description of their purpose + +  Violation — + Hyperlink has no link text, label or image with a text alternative + + +
+

2.4.5 Multiple Ways [AA]

+
More than one way is available to locate a Web page within a set of Web pages, except where the Web Page is the result of, or a step in, a process.
+ +
+

2.4.6 Headings and Labels [AA]

+
Headings and labels describe topic or purpose.
+ heading_content_exists: Heading elements must provide descriptive text + +  Recommendation — + Heading element has no descriptive content + + +
+

2.4.7 Focus Visible [AA]

+
Any keyboard operable user interface has a mode of operation where the keyboard focus indicator is visible.
+ element_tabbable_visible: A tabbable element should be visible on the screen when it has keyboard focus + +  Needs review — + Confirm the element should be tabbable, and is visible on the screen when it has keyboard focus + + script_focus_blur_review: Scripting must not remove focus from content that normally receives focus + +  Needs review — + Verify script does not remove focus from content that normally receives focus + + style_focus_visible: The keyboard focus indicator must be highly visible when default border or outline is modified by CSS + +  Needs review — + Check the keyboard focus indicator is highly visible when using CSS declaration for 'border' or 'outline' + + +
+

2.4.11 Focus Not Obscured (Minimum) [AA]

+
When an element receives focus, it is not entirely covered by other content.
+ +
+

2.5.1 Pointer Gestures [A]

+
All functionality that uses multipoint or path-based gestures for operation can be operated with a single pointer without a path-based gesture.
+ +
+

2.5.2 Pointer Cancellation [A]

+
For functionality that can be operated using a single pointer, completion of the function is on the up-event with an ability to abort, undo or reverse the outcome.
+ +
+

2.5.3 Label in Name [A]

+
For user interface components with labels that include text or images of text, the accessible name contains the text that is presented visually.
+ label_name_visible: Accessible name must match or contain the visible label text + +  Violation — + Accessible name does not match or contain the visible label text + + +
+

2.5.4 Motion Actuation [A]

+
Functionality that can be operated by motion can also be operated by user interface components, and the motion trigger can be disabled.
+ +
+

2.5.7 Dragging Movement [AA]

+
All functionality that uses a dragging movement for operation can be achieved by a single pointer without dragging.
+ +
+

2.5.8 Minimum Target Size [AA]

+
The size of the target for pointer inputs is at least 24 by 24 CSS pixels.
+ +
+

3.1.1 Language of Page [A]

+
The default human language of Web pages, non-Web documents, or software can be programmatically determined.
+ html_lang_exists: Page must identify the default language of the document with a 'lang' attribute + +  Violation — + Page detected as XHTML 1.0, but has neither 'lang' nor 'xml:lang' attributes Violation — + Page detected as XHTML, but does not have an 'xml:lang' attribute Violation — + Page detected as HTML, but does not have a 'lang' attribute Violation — + Page detected with 'lang' and 'xml:lang' attributes and primary languages do not match: "{0}", "{1}" Violation — + Page detected with 'lang' and 'xml:lang' attributes that do not match: "{0}", "{1}" Needs review — + Page detected as XHTML 1.0 with only a 'lang' attribute. Confirm that page is only delivered via text/html mime type Needs review — + Page detected as XHTML 1.0 with only an 'xml:lang' attribute. Confirm that page is only delivered via xml mime type + + html_lang_valid: The default human language of the page must be valid and specified in accordance with BCP 47 + +  Violation — + Specified 'lang' attribute does not include a valid primary language Violation — + Specified 'lang' attribute does not conform to BCP 47 Violation — + Specified 'xml:lang' attribute does not include a valid primary language Violation — + Specified 'xml:lang' attribute does not conform to BCP 47 + + +
+

3.1.2 Language of Parts [AA]

+
The human language of each passage or phrase in the content can be programmatically determined.
+ element_lang_valid: The change in language of specific content must be valid and specified in accordance with BCP 47 + +  Violation — + Specified 'lang' attribute does not include a valid primary language Violation — + Specified 'lang' attribute does not conform to BCP 47 Violation — + Specified 'xml:lang' attribute does not include a valid primary language Violation — + Specified 'xml:lang' attribute does not conform to BCP 47 + + +
+

3.2.1 On Focus [A]

+
When any component receives focus, it does not initiate a change of context.
+ script_focus_blur_review: Scripting must not remove focus from content that normally receives focus + +  Needs review — + Verify script does not remove focus from content that normally receives focus + + script_select_review: No changes of context should occur when a selection value receives focus + +  Needs review — + Verify that no change of context or action occurs when selection options in this component receive focus + + +
+

3.2.2 On Input [A]

+
Changing the setting of any user interface component does not automatically cause a change of context unless the user has been advised of the behavior before using the component.
+ form_interaction_review: User should be informed in advance when interacting with content causes a change of context + +  Needs review — + Verify that interacting with content will not open pop-up windows or change the active window without informing the user + + form_submit_button_exists: A <form> element should have a submit button or an image button + +  Needs review — + Verify the <form> element has a submit button or an image button + + form_submit_review: A form should not be submitted automatically without warning the user + +  Needs review — + Confirm the form does not submit automatically without warning + + input_onchange_review: Verify that any changes of context are explained in advance to the user + +  Needs review — + Verify that any changes of context are explained in advance to the user + + a_target_warning: Users should be warned in advance if their input action will open a new window or otherwise change their context + +  Recommendation — + Inform the user when their input action will open a new window or otherwise change their context + + +
+

3.2.3 Consistent Navigation [AA]

+
Navigational mechanisms that are repeated on multiple Web pages within a set of Web pages occur in the same relative order each time they are repeated, unless a change is initiated by the user.
+ +
+

3.2.4 Consistent Identification [AA]

+
Components that have the same functionality within a set of Web pages are identified consistently.
+ +
+

3.3.1 Error Identification [A]

+
If an input error is automatically detected, the item that is in error is identified and the error is described to the user in text.
+ error_message_exists: A custom error message must reference a valid 'id' value and when triggered the message must be appropriately exposed + +  Violation — + Custom error message has invalid reference 'id' value Violation — + Custom error message is not visible + + +
+

3.3.2 Labels or Instructions [A]

+
Labels or instructions are provided when content requires user input.
+ fieldset_label_valid: Groups with nested inputs must have unique accessible name + +  Violation — + Group/Fieldset does not have an accessible name Violation — + Group/Fieldset "{0}" has a duplicate name to another group + + input_label_after: Checkboxes and radio buttons must have a label after the input control + +  Violation — + Checkbox or radio button is nested in label, so label is not after the input control Violation — + Label text is located before its associated checkbox or radio button element + + input_label_before: Text inputs and <select> elements must have a label before the input control + +  Violation — + Text input is nested in label such that input precedes the label text Violation — + Label text is located after its associated text input or <select> element + + input_placeholder_label_visible: HTML5 'placeholder' attribute must not be used as a visible label replacement + +  Needs review — + HTML5 placeholder is the only visible label Needs review — + Additional visible label referenced by 'aria-labelledby' is not valid + + input_label_visible: An input element must have an associated visible label + +  Needs review — + The input element does not have an associated visible label + + element_accesskey_labelled: An HTML element with an assigned 'accesskey' attribute must have an associated label + +  Recommendation — + The HTML element with an assigned 'accesskey' attribute does not have an associated label + + +
+

3.3.3 Error Suggestion [AA]

+
If an input error is automatically detected and suggestions for correction are known, then the suggestions are provided to the user, unless it would jeopardize the security or purpose of the content.
+ +
+

3.3.4 Error Prevention (Legal, Financial, Data) [AA]

+
For content that cause legal commitments or financial transactions for the user to occur, that modify or delete user-controllable data in data storage systems, or that submit user test responses, the user can reverse, correct, or confirm the action.
+ +
+

4.1.1 Parsing [A]

+
(Obsolete and removed) This requirement was originally adopted to address problems that assistive technology (AT) had directly parsing HTML. AT no longer has any need to directly parse HTML. Consequently, these problems either no longer exist or are addressed by other requirements.
+ +
+

4.1.2 Name, Role, Value [A]

+
For all user interface components (including, but not limited to: form elements, links and components generated by scripts), the name and role can be programmatically determined; states, properties, and values that can be set by the user can be programmatically set; and notification of changes to these items is available to user agents, including assistive technologies.
+ combobox_popup_reference: The 'aria-controls' (for ARIA 1.2) or the 'aria-owns' (for ARIA 1.0) attribute of the expanded combobox must reference a valid popup 'id' value + +  Violation — + The 'aria-owns' attribute of the expanded combobox is missing Violation — + The 'aria-controls' attribute of the expanded combobox is missing Violation — + The 'aria-owns' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value Violation — + The 'aria-controls' attribute "{0}" of the expanded combobox does not reference a valid popup 'id' value Violation — + The combobox 'aria-expanded' attribute is true, but the combobox popup is not visible Violation — + The combobox 'aria-expanded' attribute is false, but the combobox popup is visible + + aria_activedescendant_valid: The 'aria-activedescendant' property must reference the 'id' of a non-empty, non-hidden active child element + +  Violation — + The 'aria-activedescendant' property is empty Violation — + The 'aria-activedescendant' property references a hidden node Violation — + Element is not a combobox, and the referenced active-descendant element is not a valid descendant + + combobox_active_descendant: 'aria-activedescendant' must be used to define focus within the combobox popup, except when using a dialog popup + +  Violation — + The element referenced by 'aria-activedescendant' "{0}" does not exist Violation — + The 'aria-activedescendant' "{0}" references an element with the roles "{1}", which does not have a valid ARIA role of 'option', 'gridcell', 'row', or 'treeitem' Violation — + The 'aria-activedescendant' "{0}" references an element that does not have 'aria-selected' set to true + + aria_role_valid: ARIA roles must be valid for the element to which they are assigned + +  Violation — + The ARIA role '{0}' is not valid for the element <{1}> Violation — + The ARIA role '{0}' is not valid for the element <{1}> and may be ignored by the browser since the element is focusable + + aria_attribute_valid: ARIA attributes must be valid for the element and ARIA role to which they are assigned + +  Violation — + The ARIA attributes "{0}" are not valid for the element <{1}> with ARIA role "{2}" Violation — + The ARIA attributes "{0}" are not valid for the element <{1}> with implicit ARIA role "{2}" + + combobox_autocomplete_valid: A combobox that supports autocompletion behavior must have the 'aria-autocomplete' attribute only on its text input element with a valid value; a value of '"inline"' is not supported + +  Violation — + The combobox has the 'aria-autocomplete' attribute incorrectly set on an element within the popup referenced by "{0}" Violation — + The combobox does not support an 'aria-autocomplete' attribute value set to '"inline"' + + combobox_focusable_elements: Tabbable focus for the combobox must be allowed only on the text input, except when using a dialog popup + +  Violation — + The combobox element does not allow DOM focus as required Violation — + The popup of the combobox has DOM focus or has 'aria-activedescendant' defined, which is not allowed + + combobox_haspopup_valid: The combobox attribute 'aria-haspopup' value must be appropriate for the role of the element referenced by 'aria-controls' (ARIA 1.2) or 'aria-owns' (ARIA 1.0) + +  Violation — + The 'role' value "{0}" of the popup element "{1}" should be one of "listbox", "grid", "tree" or "dialog" Violation — + The value of the combobox 'aria-haspopup' attribute "{0}" does not match the 'role' value of the popup element "{1}" + + input_label_exists: Each form control must have an associated label + +  Violation — + Form control element <{0}> has no associated label Violation — + Form control with "{0}" role has no associated label + + aria_descendant_valid: Browsers ignore the explicit and implicit ARIA roles of the descendants of certain elements + +  Needs review — + The element with role "{0}" contains descendants with implicit roles "{1}" which are ignored by browsers Violation — + The element with role "{0}" contains descendants with roles "{1}" which are ignored by browsers + + aria_role_allowed: Elements must have a valid 'role' per ARIA specification + +  Violation — + The role '{0}' defined on the element is not valid per ARIA specification Needs review — + Some of the roles, '{0}', defined on the element are not valid per ARIA specification + + aria_attribute_allowed: ARIA attributes must be valid for the element's role + +  Violation — + The attribute(s) '{0}' referenced by the element <{1}> is not a valid ARIA state or property + + aria_attribute_conflict: An ARIA attribute must not conflict with the corresponding HTML attribute + +  Violation — + The ARIA attribute "{0}" is in conflict with the corresponding HTML attribute "{1}" + + aria_attribute_exists: When specifying a required ARIA attribute, the value must not be empty + +  Violation — + The element attribute(s): '{0}' value is empty + + aria_attribute_required: When using a ARIA role on an element, the required attributes for that role must be defined + +  Violation — + An element with ARIA role '{0}' does not have the required ARIA attribute(s): '{1}' + + aria_attribute_value_valid: ARIA property values must be valid + +  Violation — + The value "{0}" specified for attribute '{1}' on element <{2}> is not valid + + aria_eventhandler_role_valid: Elements with event handlers must have a valid ARIA role + +  Violation — + The <{0}> element with '{1}' does not have a valid ARIA role specified + + aria_hidden_nontabbable: A hidden element should not contain any tabbable elements + +  Violation — + Element "{0}" should not be focusable within the subtree of an element with an 'aria-hidden' attribute with value 'true' + + aria_id_unique: The ARIA property must reference a non-empty unique id of an existing element that is visible + +  Violation — + The 'id' "{0}" specified for the ARIA property '{1}' value is not valid + + aria_parent_required: An element with an implicit or explicit role must be contained within a valid element + +  Violation — + The element with role "{0}" is not contained in or owned by an element with one of the following roles: "{1}" + + aria_toolbar_label_unique: All toolbar components on a page must have unique labels specified + +  Violation — + Multiple toolbar components do not have unique labels + + aria_widget_labelled: Interactive component must have a programmatically associated name + +  Violation — + Interactive component with ARIA role '{0}' does not have a programmatically associated name + + combobox_design_valid: The combobox design pattern must be valid for ARIA 1.2 + +  Violation — + The combobox design pattern is detected as ARIA 1.1, which is not allowed by ARIA 1.2 + + element_tabbable_role_valid: A tabbable element must have a valid widget role + +  Violation — + The tabbable element's role '{0}' is not a widget role + + frame_title_exists: Inline frames must have a unique, non-empty 'title' attribute + +  Violation — + Inline frame does not have a 'title' attribute + + label_content_exists: A <label> element must have non-empty descriptive text that identifies the purpose of the interactive component + +  Violation — + The <label> element does not have descriptive text that identifies the expected input + + list_children_valid: List component with "group" role must limit children to <listitem> elements + +  Violation — + List component with "group" role has children that are not <listitem> elements + + table_aria_descendants: Table structure elements cannot specify an explicit 'role' within table containers + +  Violation — + An explicit ARIA 'role' is not valid for <{0}> element within a ARIA role '{1}' per the ARIA in HTML specification + + input_haspopup_conflict: <input> element with 'list' attribute should not also use 'aria-haspopup' attribute + +  Needs review — + <input> element with 'list' attribute also uses 'aria-haspopup' attribute with type="{0}" Needs review — + <input> element with 'list' attribute also uses 'aria-haspopup' attribute with missing or invalid input type + + aria_child_valid: An element with a ARIA role must own a required child + +  Recommendation — + The element with role "{0}" does not own any child element with any of the following role(s): "{1}" Recommendation — + The element with role "{0}" owns the child element with the role "{1}" that is not one of the allowed role(s): "{2}" + + aria_attribute_redundant: An ARIA attribute should not be used when there is a corresponding HTML attribute + +  Recommendation — + The ARIA attribute "{0}" is redundant with the HTML attribute "{1}" + + canvas_content_described: The <canvas> element may not be accessible + +  Recommendation — + Verify accessibility of the <canvas> element + + +
+

4.1.3 Status Messages [AA]

+
In content implemented using markup languages, status messages can be programmatically determined through role or properties such that they can be presented to the user by assistive technologies without receiving focus.
+ +
+

HTML specification [NA]

+
The HTML specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming HTML specification issues are still reported.
+ element_id_unique: Element 'id' attribute values must be unique within a document + +  Violation — + The <{0}> element has the id "{1}" that is empty Violation — + The <{0}> element has the id "{1}" that is already in use + + element_accesskey_unique: 'accesskey' attribute values on each element must be unique for the page + +  Violation — + 'accesskey' attribute value on the element is not unique + + element_attribute_deprecated: Avoid use of obsolete features if possible + +  Recommendation — + The <{0}> element is deprecated in HTML 5 Recommendation — + The HTML attribute(s) "{0}" is deprecated in HTML 5 Recommendation — + The HTML attribute(s) "{0}" is deprecated for the <{1}> element in HTML 5 + + +
+

ARIA specification [NA]

+
The ARIA specification issues that cause accessibility issues may be covered by other rules and will be reported under those accessibility requirements. However, some non-conforming ARIA specification issues are still reported.
+ aria_attribute_deprecated: No deprecated ARIA role or attribute should be used + +  Recommendation — + The ARIA role "{0}" is deprecated in the ARIA specification Recommendation — + The ARIA attributes "{0}" are deprecated in the ARIA specification Recommendation — + The ARIA attributes "{0}" are deprecated for the role "{1}" in the ARIA specification + + aria_role_redundant: An explicitly-assigned ARIA role should not be redundant with the implicit role of the element + +  Recommendation — + The explicitly-assigned ARIA role "{0}" is redundant with the implicit role of the element <{1}> + + +
+
+
+ + \ No newline at end of file diff --git a/rule-server/src/static/archives/2023.11.10/js/ace-debug.js b/rule-server/src/static/archives/2023.11.10/js/ace-debug.js new file mode 100644 index 000000000..41b3d5d87 --- /dev/null +++ b/rule-server/src/static/archives/2023.11.10/js/ace-debug.js @@ -0,0 +1,29948 @@ +/*! + * Copyright:: 2016,2017,2019,2020- IBM, Inc + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +var ace; +/******/ (() => { // webpackBootstrap +/******/ "use strict"; +/******/ var __webpack_modules__ = ({ + +/***/ "./src/v2/aria/ARIADefinitions.ts": +/*!****************************************!*\ + !*** ./src/v2/aria/ARIADefinitions.ts ***! + \****************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIADefinitions = void 0; +var ARIADefinitions = /** @class */ (function () { + function ARIADefinitions() { + } + ARIADefinitions.nameFromContent = function (role) { + return (role in ARIADefinitions.designPatterns) + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents"); + }; + /* + * array of WAI-ARIA global states and properties + * @see https://www.w3.org/TR/wai-aria-1.2/#global_states + */ + ARIADefinitions.globalProperties = ["aria-atomic", "aria-busy", "aria-controls", "aria-current", "aria-describedby", + "aria-details", "aria-flowto", "aria-hidden", "aria-keyshortcuts", + "aria-label", "aria-labelledby", "aria-live", "aria-owns", "aria-relevant", "aria-roledescription" + // the following are deprecated in ARIA 1.2, will indicate deprecation in individual role + , + 'aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid' + ]; + //properties contains id(s) that refer to other element(s) + ARIADefinitions.referenceProperties = ["aria-owns", "aria-controls", "aria-describedby", "aria-labelledby", "aria-flowto", "aria-activedescendant"]; + // deprecated roles + ARIADefinitions.globalDeprecatedRoles = [ + 'directory', 'doc-biblioentry', 'doc-endnote' + ]; + // the following are deprecated in ARIA 1.1 for all the roles + ARIADefinitions.globalDeprecatedProperties = [ + 'aria-grabbed', 'aria-dropeffect' + ]; + /* + * XSD data types for all WAI-ARIA properties + * along with valid values when the data type is NMTOKEN + * WAI-ARIA properties data types explaned: + * type: Used to identify the type of values allowed for the WAI-ARIA property + * values: Used to identify specific values of an WAI-ARIA property when type is nmtoken + * hiddenIDRefSupported: Used to identify if the WAI-ARIA property supports referencing hidden ID + * true: refers to WAI-ARIA property supports hidden ID references + * false: refers to WAI-ARIA property does not support hidden ID references + * Default value will be set to false, if not specified. + */ + ARIADefinitions.propertyDataTypes = { + "aria-activedescendant": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-atomic": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-autocomplete": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["inline", "list", "both", "none", "undefined"] //add undefined to handle value empty + }, + "aria-busy": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-checked": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-colcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-colspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-controls": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-current": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["page", "step", "location", "date", "time", "true", "false", "undefined"] //add undefined for empty value + }, + "aria-describedby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-details": { + type: "http://www.w3.org/2001/XMLSchema#idrefs" + }, + "aria-disabled": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-dropeffect": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["copy", "move", "link", "execute", "popup", "none"] + }, + "aria-errormessage": { + type: "http://www.w3.org/2001/XMLSchema#idref", + hiddenIDRefSupported: true + }, + "aria-expanded": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-flowto": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: false + }, + "aria-grabbed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-haspopup": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "menu", "listbox", "tree", "grid", "dialog"] + }, + "aria-hidden": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-invalid": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "spelling", "grammar", "undefined"] //add undefined for empty value + }, + "aria-keyshortcuts": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-label": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-labelledby": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-level": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-live": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["off", "polite", "assertive"] + }, + "aria-modal": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiline": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-multiselectable": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-orientation": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["horizontal", "vertical", "undefined"] + }, + "aria-owns": { + type: "http://www.w3.org/2001/XMLSchema#idrefs", + hiddenIDRefSupported: true + }, + "aria-placeholder": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-posinset": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-pressed": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "mixed", "undefined"] + }, + "aria-readonly": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-relevant": { + type: "http://www.w3.org/2001/XMLSchema#nmtokens", + values: ["additions", "removals", "text", "all"] + }, + "aria-required": { + type: "http://www.w3.org/2001/XMLSchema#boolean" + }, + "aria-roledescription": { + type: "http://www.w3.org/2001/XMLSchema#string" + }, + "aria-rowcount": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowindex": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-rowspan": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-selected": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["true", "false", "undefined"] + }, + "aria-setsize": { + type: "http://www.w3.org/2001/XMLSchema#int" + }, + "aria-sort": { + type: "http://www.w3.org/2001/XMLSchema#nmtoken", + values: ["ascending", "descending", "other", "none"] + }, + "aria-valuemax": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuemin": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuenow": { + type: "http://www.w3.org/2001/XMLSchema#decimal" + }, + "aria-valuetext": { + type: "http://www.w3.org/2001/XMLSchema#string" + } + }; + /* + * design patterns for concrete WAI-ARIA roles + * legitimate keys for each role include: + * + * - container: appropriate container(s) for that role + * - props: states and properties that may be associated with this role (in addition to the global states and properties listed above) + * - reqProps: required states or properties for this role + * - reqChildren: required children for this role + * - htmlEquiv: HTML equivalent for this role + * - roleType: one of widget, structure, landmark, liveRegion, window (as seen in https://www.w3.org/TR/wai-aria-1.2/#roles_categorization) + * - nameRequired: determines whether an accessible name is required for a widget (see ARIA spec.) + * - nameFrom: determines how an accessible name is supplied (author or content - see ARIA spec.) + * - deprecated: if present, indicates that the role is deprecated, and provides a list of alternative role(s) + */ + ARIADefinitions.designPatterns = { + "alert": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "alertdialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "application": { + container: null, + props: ["aria-activedescendant", "aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "article": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "banner": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "blockquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "button": { + container: null, + props: ["aria-expanded", "aria-pressed"], + reqProps: null, + reqChildren: null, + htmlEquiv: "button | input[@type='button']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "caption": { + container: ["figure", "grid", "table", "treegrid"], + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "cell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-rowindex", "aria-rowspan"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "checkbox": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='checkbox']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "code": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "columnheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='col']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "combobox": { + container: null, + props: ["aria-controls", "aria-activedescendant", "aria-autocomplete", "aria-readonly", "aria-required"], + reqProps: ["aria-expanded"], + reqChildren: [], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "complementary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "comment": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "contentinfo": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "definition": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "deletion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "dialog": { + container: null, + props: ["aria-modal"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "window", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "directory": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecated: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "doc-abstract": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-acknowledgments": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-afterword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-appendix": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-backlink": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-biblioentry": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-bibliography": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-biblioref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-chapter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-colophon": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-conclusion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-cover": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true + }, + "doc-credit": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-credits": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-dedication": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnote": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-endnotes": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"] + }, + "doc-epigraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-epilogue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-errata": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-example": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-footnote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-foreword": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossary": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-glossref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-index": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-introduction": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-noteref": { + container: null, + props: ["aria-disabled", "aria-expanded", "aria-haspopup"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "doc-notice": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagebreak": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true + }, + "doc-pagelist": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pagefooter": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-pageheader": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + }, + "doc-part": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-preface": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-prologue": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-pullquote": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-qna": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-subtitle": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"] + }, + "doc-tip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"] + }, + "doc-toc": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: false, + nameFrom: ["author"] + }, + "document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "emphasis": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "feed": { + container: null, + props: null, + reqProps: null, + reqChildren: ["article"], + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "figure": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "form": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "form", + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "generic": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "div | span", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby", "aria-roledescription"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "graphics-document": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"] + }, + "graphics-object": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: false, + nameFrom: ["author"] + }, + "graphics-symbol": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "grid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-readonly", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: "table", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "gridcell": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-disabled", "aria-errormessage", "aria-expanded", "aria-haspopup", "aria-invalid", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected"], + reqProps: null, + reqChildren: null, + htmlEquiv: "td", + roleType: "widget", + nameFrom: ["author", "contents"] + }, + "group": { + container: null, + props: ["aria-activedescendant"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "heading": { + container: null, + props: null, + reqProps: ["aria-level"], + reqChildren: null, + htmlEquiv: "h1 | h2 | h3 | h4 | h5 | h6", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "img": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "img", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "insertion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "link": { + container: null, + props: ["aria-expanded"], + reqProps: null, + reqChildren: null, + htmlEquiv: "a | link", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "list": { + container: null, + props: null, + reqProps: null, + reqChildren: ["listitem"], + htmlEquiv: "ol | ul", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "listbox": { + container: null, + props: ["aria-activedescendant", "aria-expanded", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["group", "option"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "listitem": { + container: ["list"], + props: ["aria-level", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "li", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "log": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "main": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "mark": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "mark", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "marquee": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "math": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: false, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menu": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menubar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: ["group", "menuitem", "menuitemcheckbox", "menuitemradio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "menuitem": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemcheckbox": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "menuitemradio": { + container: ["group", "menu", "menubar"], + props: ["aria-expanded", "aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "meter": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "navigation": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "none": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "note": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "option": { + container: ["group", "listbox"], + props: ["aria-selected", "aria-checked", "aria-posinset", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: "option", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "paragraph": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "presentation": { + container: null, + props: [], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "progressbar": { + container: null, + props: ["aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radio": { + container: null, + props: ["aria-posinset", "aria-setsize"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: "input[@type='radio']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "radiogroup": { + container: null, + props: ["aria-activedescendant", "aria-orientation", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: ["radio"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "region": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "row": { + container: ["grid", "rowgroup", "table", "treegrid"], + props: ["aria-activedescendant", "aria-colindex", "aria-expanded", "aria-level", "aria-posinset", "aria-rowindex", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: ["cell", "columnheader", "gridcell", "rowheader"], + htmlEquiv: "tr", + roleType: "structure", + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowgroup": { + container: ["grid", "table", "treegrid"], + props: [], + reqProps: null, + reqChildren: ["row"], + htmlEquiv: "tbody | tfoot | thead", + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "rowheader": { + container: ["row"], + props: ["aria-colindex", "aria-colspan", "aria-expanded", "aria-readonly", "aria-required", "aria-rowindex", "aria-rowspan", "aria-selected", "aria-sort"], + reqProps: null, + reqChildren: null, + htmlEquiv: "th[@scope='row']", + roleType: "structure", + nameRequired: true, + nameFrom: ["author", "contents"] + }, + "scrollbar": { + container: null, + props: ["aria-orientation", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-controls", "aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "search": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "landmark", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "searchbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='search']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "separator": { + container: null, + props: ["aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "slider": { + container: null, + props: ["aria-orientation", "aria-readonly", "aria-valuemax", "aria-valuemin", "aria-valuetext"], + reqProps: ["aria-valuenow"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + presentationalChildren: true + }, + "spinbutton": { + container: null, + props: ["aria-activedescendant", "aria-readonly", "aria-required", "aria-valuemax", "aria-valuemin", "aria-valuenow", "aria-valuetext"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "status": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "strong": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "subscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "suggestion": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "superscript": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "switch": { + container: null, + props: ["aria-expanded", "aria-readonly", "aria-required"], + reqProps: ["aria-checked"], + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-haspopup'] + }, + "tab": { + container: ["tablist"], + props: ["aria-expanded", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + presentationalChildren: true, + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + "table": { + container: null, + props: ["aria-colcount", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup", "caption"], + htmlEquiv: "table", + roleType: "structure", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tablist": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation"], + reqProps: null, + reqChildren: ["tab"], + htmlEquiv: null, + roleType: "widget", + nameRequired: false, + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tabpanel": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "term": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: "dfn", + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "textbox": { + container: null, + props: ["aria-activedescendant", "aria-autocomplete", "aria-multiline", "aria-placeholder", "aria-readonly", "aria-required"], + reqProps: null, + reqChildren: null, + htmlEquiv: "input[@type='text']", + roleType: "widget", + nameRequired: true, + nameFrom: ["author"] + }, + "time": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["prohibited"], + prohibitedProps: ["aria-label", "aria-labelledby"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "timer": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "liveRegion", + nameFrom: ["author"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "toolbar": { + container: null, + props: ["aria-activedescendant", "aria-orientation"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameFrom: ["author"], + deprecatedProps: ['aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tooltip": { + container: null, + props: null, + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "structure", + nameRequired: false, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-disabled', 'aria-errormessage', 'aria-haspopup', 'aria-invalid'] + }, + "tree": { + container: null, + props: ["aria-activedescendant", "aria-multiselectable", "aria-orientation", "aria-required"], + reqProps: null, + reqChildren: ["group", "treeitem"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treegrid": { + container: null, + props: ["aria-activedescendant", "aria-colcount", "aria-multiselectable", "aria-orientation", "aria-readonly", "aria-required", "aria-rowcount"], + reqProps: null, + reqChildren: ["row", "rowgroup"], + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author"], + deprecatedProps: ['aria-haspopup'] + }, + "treeitem": { + container: ["group", "tree"], + props: ["aria-checked", "aria-expanded", "aria-level", "aria-posinset", "aria-selected", "aria-setsize"], + reqProps: null, + reqChildren: null, + htmlEquiv: null, + roleType: "widget", + nameRequired: true, + nameFrom: ["author", "contents"], + deprecatedProps: ['aria-errormessage', 'aria-invalid'] + }, + }; // end designPatterns + // copied from https://html.spec.whatwg.org/multipage/semantics-other.html#disabled-elements + // https://html.spec.whatwg.org/multipage/input.html#input-type-attr-summary + ARIADefinitions.elementsAllowedDisabled = ["button", "input", "select", "textarea", "optgroup", "option", "fieldset"]; // also form-associated custom element + ARIADefinitions.elementsAllowedRequired = ["select", "textarea"]; // remove 'input' and add to the individual element, becuase required is not supported on input@type="range", "color", "hidden" or any button types + ARIADefinitions.elementsAllowedReadOnly = ["textarea"]; // remove 'input' and add to the individual element, because readonly is not supported on input@type="checkbox", "radio", "range", "color", "file", hidden" or any button types + /* https://www.w3.org/TR/html-aria/#docconformance + * documentConformanceRequirement contains properties of the tags related to role without any additional attribute value + * documentConformanceRequirementSpecialTags contains those tags that require special considerations + */ + ARIADefinitions.documentConformanceRequirement = { + "abbr": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "address": { + implicitRole: ["group"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "article": { + implicitRole: ["article"], + validRoles: ["application", "document", "feed", "main", "none", "presentation", "region"], + globalAriaAttributesValid: true + }, + "aside": { + implicitRole: ["complementary"], + validRoles: ["doc-dedication", "doc-example", "doc-footnote", "doc-pullquote", "doc-tip", "feed", "none", "note", "presentation", "region", "search"], + globalAriaAttributesValid: true + }, + "audio": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "b": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "base": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "bdi": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "bdo": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "blockquote": { + implicitRole: ["blockquote"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "body": { + implicitRole: ["generic"], + validRoles: null, + otherDisallowedAriaAttributes: ['aria-hidden'], + globalAriaAttributesValid: true + }, + "br": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "canvas": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "caption": { + implicitRole: ['caption'], + validRoles: null, + globalAriaAttributesValid: true, + allowAttributesFromImplicitRole: false + }, + "cite": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "code": { + implicitRole: ["code"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "col": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "colgroup": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "data": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "datalist": { + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "dd": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "del": { + implicitRole: ["deletion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "details": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "dfn": { + implicitRole: ["term"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "dialog": { + implicitRole: ["dialog"], + validRoles: ["alertdialog"], + globalAriaAttributesValid: true + }, + "dl": { + implicitRole: null, + validRoles: ["group", "list", "none", "presentation"], + globalAriaAttributesValid: true + }, + "dt": { + implicitRole: ["term"], + validRoles: ["listitem"], + globalAriaAttributesValid: true + }, + "em": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "embed": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "fieldset": { + implicitRole: ["group"], + validRoles: ["none", "presentation", "radiogroup"], + globalAriaAttributesValid: true + }, + "figcaption": { + implicitRole: null, + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "form": { + implicitRole: ["form"], + validRoles: ["none", "presentation", "search"], + globalAriaAttributesValid: true + }, + "head": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "hgroup": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "h1": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h2": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h3": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h4": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h5": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "h6": { + implicitRole: ["heading"], + validRoles: ["doc-subtitle", "none", "presentation", "tab"], + globalAriaAttributesValid: true + }, + "hr": { + implicitRole: ["separator"], + validRoles: ["doc-pagebreak", "none", "presentation"], + globalAriaAttributesValid: true + }, + "html": { + implicitRole: ["document"], + validRoles: null, + globalAriaAttributesValid: false, + allowAttributesFromImplicitRole: false + }, + "i": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "iframe": { + implicitRole: null, + validRoles: ["application", "document", "img", "none", "presentation"], + globalAriaAttributesValid: true + }, + "ins": { + implicitRole: ["insertion"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "kbd": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "label": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "legend": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "link": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "main": { + implicitRole: ["main"], + validRoles: null, + globalAriaAttributesValid: true + }, + "map": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "mark": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "math": { + implicitRole: ["math"], + validRoles: null, + globalAriaAttributesValid: true + }, + "menu": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "meta": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "meter": { + implicitRole: ["meter"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ['aria-valuemax', 'aria-valuemin'], + allowAttributesFromImplicitRole: false + }, + "nav": { + implicitRole: ["navigation"], + validRoles: ["doc-index", "doc-pagelist", "doc-toc", "menu", "menubar", "tablist", "none", "presentation"], + globalAriaAttributesValid: true + }, + "noscript": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "object": { + implicitRole: null, + validRoles: ["application", "document", "img"], + globalAriaAttributesValid: true + }, + "ol": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "optgroup": { + implicitRole: ["group"], + validRoles: null, + globalAriaAttributesValid: true + }, + "option": { + implicitRole: ["option"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-selected"] + }, + "output": { + implicitRole: ["status"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "p": { + implicitRole: ["paragraph"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "param": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "picture": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + }, + "pre": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "progress": { + implicitRole: ["progressbar"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax"] + }, + "q": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rp": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "rt": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "ruby": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "s": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "samp": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "script": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "search": { + implicitRole: ['search'], + validRoles: ['search', 'form', 'group', 'none', 'presentation', 'region'], + globalAriaAttributesValid: true + }, + "slot": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "small": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "source": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "span": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "strong": { + implicitRole: ["strong"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "style": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "sub": { + implicitRole: ["subscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "sup": { + implicitRole: ["superscript"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "svg": { + implicitRole: ["graphics-document"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "table": { + implicitRole: ["table"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "template": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "textarea": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "tfoot": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "thead": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "time": { + implicitRole: ["time"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "title": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "track": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "u": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "ul": { + implicitRole: ["list"], + validRoles: ["group", "listbox", "menu", "menubar", "none", "presentation", "radiogroup", "tablist", "toolbar", "tree"], + globalAriaAttributesValid: true + }, + "var": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true, + prohibitedAriaAttributesWhenNoImplicitRole: ["aria-label", "aria-labelledby"] + }, + "video": { + implicitRole: null, + validRoles: ["application"], + globalAriaAttributesValid: true + }, + "wbr": { + implicitRole: null, + validRoles: ["none", "presentation"], + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden"] + } + }; // end documentConformanceRequirement + ARIADefinitions.documentConformanceRequirementSpecialTags = { + "a": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: ["button", "checkbox", "doc-backlink", "doc-biblioref", "doc-glossref", "doc-noteref", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-disabled=true"] + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "area": { + "with-href": { + implicitRole: ["link"], + //roleCondition: " when non-empty href attribute is present", + validRoles: null, + globalAriaAttributesValid: true + }, + "without-href": { + implicitRole: ["generic"], + //roleCondition: " when href attribute is not present", + validRoles: ["button", "link"], + globalAriaAttributesValid: true + } + }, + // TODO + // "autonomous custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise no corresponding role."], + // validRoles: ["If role defined by ElementInternals", "any role", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "div": { + "child-dl": { + implicitRole: ["generic"], + validRoles: ["presentation", "none"], + globalAriaAttributesValid: true + }, + "no-child-dl": { + implicitRole: ["generic"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "figure": { + "child-figcaption": { + implicitRole: ["figure"], + validRoles: ['doc-example'], + globalAriaAttributesValid: true + }, + "no-child-figcaption": { + implicitRole: ["figure"], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "footer": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["contentinfo"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["doc-footnote", "group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + // TODO + // "form-associated custom element": { + // implicitRole: ["Role exposed from author defined ElementInternals. Otherwise 'generic'."], + // validRoles: ["If role defined by ElementInternals", "form-related roles: button", "checkbox", "combobox", "group", "listbox", "progressbar", "radio", "radiogroup", "searchbox", "slider", "spinbutton", "switch", "textbox", "no role Otherwise"], + // globalAriaAttributesValid: true + // }, + "header": { + "des-section-article-aside-main-nav": { + implicitRole: ["generic"], + //roleCondition: " when descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + }, + "other": { + implicitRole: ["banner"], + //roleCondition: " when not a descendant of an article, aside, main, nav or section element", + validRoles: ["group", "none", "presentation"], + globalAriaAttributesValid: true + } + }, + "img": { + "img-with-alt-text": { + implicitRole: ["img"], + //roleCondition: " when alt attribute has text (is not empty)", + validRoles: ["button", "checkbox", "doc-cover", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "progressbar", "radio", "scrollbar", "separator", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "img-with-empty-alt": { + implicitRole: ["presentation"], + //roleCondition: " when alt attribute is empty", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + }, + "img-without-alt": { + implicitRole: ["img"], + //roleCondition: " when alt attribute, aria-label, or aria-labelledby are not present", + validRoles: null, + globalAriaAttributesValid: false, + otherAllowedAriaAttributes: ["aria-hidden=true"] + } + }, + "input": { + "button": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "checkbox-with-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is present", + validRoles: ["button"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "checkbox-without-aria-pressed": { + implicitRole: ["checkbox"], + //roleCondition: " with type=checkbox and aria-pressed attribute is not present", + validRoles: ["menuitemcheckbox", "option", "switch"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "color": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true + }, + "date": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "datetime-local": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-no-list": { + implicitRole: ["textbox"], + //roleCondition: " with type=email and no list attribute is present", + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "email-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "file": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + }, + "hidden": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: false + }, + "image": { + implicitRole: ["button"], + validRoles: ["checkbox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "month": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "number": { + implicitRole: ["spinbutton"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + }, + "password": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "radio": { + implicitRole: ["radio"], + validRoles: ["menuitemradio"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-required"], + otherDisallowedAriaAttributes: ["aria-checked"] + }, + "range": { + implicitRole: ["slider"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-valuemax", "aria-valuemin"] + }, + "reset": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "search-no-list": { + implicitRole: ["searchbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "search-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "submit": { + implicitRole: ["button"], + validRoles: ["checkbox", "combobox", "gridcell", "link", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "slider", "switch", "tab", "treeitem"], + globalAriaAttributesValid: true + }, + "tel-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "tel-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "text-no-list": { + implicitRole: ["textbox"], + validRoles: ["combobox", "searchbox", "spinbutton"], + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "text-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + // otherDisallowedAriaAttributes: ["aria-haspopup"] // covered in a different rule + }, + "time": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "url-no-list": { + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-placeholder", "aria-required", "aria-readonly"] + }, + "url-with-list": { + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "week": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-readonly"], + otherRolesForAttributes: ["textbox"] + }, + "default-with-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["combobox"], + validRoles: null, + globalAriaAttributesValid: true + }, + "default-no-list": { + // input with a missing or invalid type, with a list attribute + implicitRole: ["textbox"], + validRoles: null, + globalAriaAttributesValid: true + } + }, + "li": { + "child-of-list-role": { + implicitRole: ['listitem'], + validRoles: null, + globalAriaAttributesValid: true + }, + "no-child-of-list-role": { + implicitRole: ['generic'], + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "section": { + "with-name": { + implicitRole: ["region"], + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + }, + "without-name": { + implicitRole: null, + validRoles: ["alert", "alertdialog", "application", "banner", "complementary", "contentinfo", "dialog", "doc-abstract", "doc-acknowledgments", "doc-afterword", "doc-appendix", "doc-bibliography", "doc-chapter", "doc-colophon", "doc-conclusion", "doc-credit", "doc-credits", "doc-dedication", "doc-endnotes", "doc-epigraph", "doc-epilogue", "doc-errata", "doc-example", "doc-foreword", "doc-glossary", "doc-index", "doc-introduction", "doc-notice", "doc-pagelist", "doc-part", "doc-preface", "doc-prologue", "doc-pullquote", "doc-qna", "doc-toc", "document", "feed", "group", "log", "main", "marquee", "navigation", "none", "note", "presentation", "search", "status", "tabpanel"], + globalAriaAttributesValid: true + } + }, + "select": { + "no-multiple-attr-size-gt1": { + //roleCondition: " with a multiple attribute or a size attribute having value greater than 1" + implicitRole: ["combobox"], + validRoles: ["menu"], + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + }, + "multiple-attr-size-gt1": { + //roleCondition: " with no multiple attribute and no size attribute having value greater than 1" + implicitRole: ["listbox"], + validRoles: null, + globalAriaAttributesValid: true, + otherDisallowedAriaAttributes: ["aria-multiselectable"] + } + }, + "summary": { + "first-summary-of-detail": { + implicitRole: null, + validRoles: null, + globalAriaAttributesValid: true, + otherAllowedAriaAttributes: ["aria-disabled", "aria-haspopup"] + }, + "no-first-summary-of-detail": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tbody": { + "des-table": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["rowgroup"], + validRoles: ["any"], + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "td": { + "des-table": { + implicitRole: ["cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["gridcell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "th": { + "des-table-grid-treegrid-row-scope": { + implicitRole: ["rowheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-table-grid-treegrid-column-scope": { + implicitRole: ["columnheader", "cell"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "tr": { + "des-table": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-grid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-treegrid": { + implicitRole: ["row"], + validRoles: null, + globalAriaAttributesValid: true + }, + "des-other": { + implicitRole: null, + validRoles: ["any"], + globalAriaAttributesValid: true + } + }, + "default": { + implicitRole: null, + //roleCondition: "", + validRoles: ["any"], + globalAriaAttributesValid: true + } + }; // end of documentConformanceRequirementSpecialTags + // map aria attribute to the corresponding native attribute, apply to any element applicable + // note this mapping is for the related attributes in the same element without checking the parent tree. + // refer to https://w3c.github.io/html-aria/ + ARIADefinitions.relatedAriaHtmlAttributes = { + "aria-checked": { + conflict: { + ariaAttributeValue: "false", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + }, + overlapping: { + ariaAttributeValue: "true", + htmlAttributeNames: ["checked"], + htmlAttributeValues: null + } + }, + "aria-disabled": { + conflict: { + ariaAttributeValue: "false", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + }, + overlapping: { + ariaAttributeValue: "true", + htmlAttributeNames: ["disabled"], + htmlAttributeValues: null + } + }, + "aria-hidden": { + conflict: { + ariaAttributeValue: "false", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: null + }, + overlapping: { + ariaAttributeValue: "true", + htmlAttributeNames: ["hidden"], + htmlAttributeValues: null + } + }, + "aria-placeholder": { + conflict: { + ariaAttributeValue: null, + htmlAttributeNames: ["placeholder"], + htmlAttributeValues: null + } + }, + "aria-valuemax": { + conflict: { + ariaAttributeValue: null, + htmlAttributeNames: ["max"], + htmlAttributeValues: null + } + //overlap case covered in the role definition: Authors SHOULD NOT use aria-valuemax on any element which allows the max attribute. Use the max attribute instead. + }, + "aria-valuemin": { + conflict: { + ariaAttributeValue: null, + htmlAttributeNames: ["min"], + htmlAttributeValues: null + } + ////overlap case covered in the role definition:Authors SHOULD NOT use aria-valuemin on any element which allows the min attribute. Use the min attribute instead. + }, + "aria-readonly": { + conflict: { + ariaAttributeValue: "false", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "false", "false"] + }, + overlapping: { + ariaAttributeValue: "true", + htmlAttributeNames: ["readonly", "contenteditable", "iscontenteditable"], + htmlAttributeValues: [null, "true", "true"] + } + }, + "aria-required": { + conflict: { + ariaAttributeValue: "false", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + }, + overlapping: { + ariaAttributeValue: "true", + htmlAttributeNames: ["required"], + htmlAttributeValues: null + } + }, + "aria-colspan": { + conflict: { + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["colspan"], + htmlAttributeValues: ["VALUE"] + }, + overlapping: { + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["colspan"], + htmlAttributeValues: null + } + }, + "aria-rowspan": { + conflict: { + // conflict occurs if both values are different + ariaAttributeValue: "VALUE", + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: ["VALUE"] + }, + overlapping: { + // overlap occurs if both exists + ariaAttributeValue: null, + htmlAttributeNames: ["rowspan"], + htmlAttributeValues: null + } + }, + "aria-autocomplete": { + conflict: { + // conflict occurs if both values are conflict + ariaAttributeValue: "none", + htmlAttributeNames: ["autocomplete"], + htmlAttributeValues: ["on"] + } + } + }; + ARIADefinitions.containers = []; + return ARIADefinitions; +}()); +exports.ARIADefinitions = ARIADefinitions; +; +var containerArray = []; +for (var roleDesign in ARIADefinitions.designPatterns) { + var containers = ARIADefinitions.designPatterns[roleDesign].container; + if (containers !== null) { + for (var _i = 0, containers_1 = containers; _i < containers_1.length; _i++) { + var container = containers_1[_i]; + if (containerArray.indexOf(container) == -1) { + containerArray.push(container); + } + } + } +} +ARIADefinitions.containers = containerArray; + + +/***/ }), + +/***/ "./src/v2/aria/ARIAMapper.ts": +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAMapper.ts ***! + \***********************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __extends = (this && this.__extends) || (function () { + var extendStatics = function (d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + return function (d, b) { + if (typeof b !== "function" && b !== null) + throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAMapper = void 0; +var ARIADefinitions_1 = __webpack_require__(/*! ./ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var CommonMapper_1 = __webpack_require__(/*! ../common/CommonMapper */ "./src/v2/common/CommonMapper.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var legacy_1 = __webpack_require__(/*! ../checker/accessibility/util/legacy */ "./src/v2/checker/accessibility/util/legacy.ts"); +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var ARIAWalker_1 = __webpack_require__(/*! ./ARIAWalker */ "./src/v2/aria/ARIAWalker.ts"); +var CacheUtil_1 = __webpack_require__(/*! ../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ARIAMapper = /** @class */ (function (_super) { + __extends(ARIAMapper, _super); + function ARIAMapper() { + return _super !== null && _super.apply(this, arguments) || this; + } + ARIAMapper.prototype.childrenCanHaveRole = function (node, role) { + // if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + // const elem = node as Element; + // if (elem.getAttribute("aria-hidden") === "true") { + // return false; + // } + // } + return !(role in ARIADefinitions_1.ARIADefinitions.designPatterns && ARIADefinitions_1.ARIADefinitions.designPatterns[role].presentationalChildren); + }; + ARIAMapper.prototype.getRole = function (node) { + var role = ARIAMapper.nodeToRole(node); + return role; + }; + ARIAMapper.prototype.getNamespace = function () { + return "aria"; + }; + ARIAMapper.prototype.getAttributes = function (node) { + var retVal = {}; + if (node.nodeType === 1 /* Node.ELEMENT_NODE */) { + var elem_1 = node; + for (var idx = 0; idx < elem_1.attributes.length; ++idx) { + var attrInfo = elem_1.attributes[idx]; + var name_1 = attrInfo.name.toLowerCase(); + if (name_1.startsWith("aria-")) { + retVal[name_1.substring(5)] = attrInfo.nodeValue; + } + } + var applyAttrRole = function (nodeName) { + if (!(nodeName in ARIAMapper.elemAttrValueCalculators)) + return; + for (var attr in ARIAMapper.elemAttrValueCalculators[nodeName]) { + if (!(attr in retVal)) { + var value = ARIAMapper.elemAttrValueCalculators[nodeName][attr]; + if (typeof value != "undefined" && value !== null) { + if (typeof value !== typeof "") { + value = value(elem_1); + } + retVal[attr] = value; + } + } + } + }; + applyAttrRole("global"); + applyAttrRole(node.nodeName.toLowerCase()); + } + else if (node.nodeType === 3 /* Node.TEXT_NODE */) { + for (var attr in ARIAMapper.textAttrValueCalculators) { + var val = ARIAMapper.textAttrValueCalculators[attr](node); + if (typeof val != "undefined" && val !== null) { + retVal[attr] = val; + } + } + } + return retVal; + }; + ARIAMapper.getAriaOwnedBy = function (elem) { + var doc = fragment_1.FragmentUtil.getOwnerFragment(elem); + if (!(0, CacheUtil_1.getCache)(doc, "ARIAMapper::precalcOwned", false)) { + var owners = doc.querySelectorAll("[aria-owns]"); + for (var iOwner = 0; iOwner < owners.length; ++iOwner) { + var owner = owners[iOwner]; + var ownIds = owner.getAttribute("aria-owns").split(/ +/g); + for (var iId = 0; iId < ownIds.length; ++iId) { + var owned = doc.getElementById(ownIds[iId]); + //ignore if the aria-owns point to the element itself + if (owned && !DOMUtil_1.DOMUtil.sameNode(owner, owned)) { + (0, CacheUtil_1.setCache)(owned, "aria-owned", owner); + } + } + } + (0, CacheUtil_1.setCache)(doc, "ARIAMapper::precalcOwned", true); + } + return (0, CacheUtil_1.getCache)(elem, "aria-owned", null); + }; + ARIAMapper.prototype.getNodeHierarchy = function (node) { + if (!node) + return []; + if (node.nodeType !== 1) { + var parentHierarchy = this.getNodeHierarchy(DOMWalker_1.DOMWalker.parentElement(node)); + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + var nodeHierarchy = []; + // Set hierarchy + for (var _i = 0, parentHierarchy_1 = parentHierarchy; _i < parentHierarchy_1.length; _i++) { + var item = parentHierarchy_1[_i]; + nodeHierarchy.push(item); + } + nodeHierarchy.push({ + attributes: {}, + bounds: this.getBounds(node), + namespace: this.getNamespace(), + node: node, + role: this.getRole(node) || "none", + rolePath: parentInfo.rolePath + "/" + (this.getRole(node) || "none"), + roleCount: {}, + childrenCanHaveRole: parentInfo.childrenCanHaveRole + }); + return nodeHierarchy; + } + else { + var elem = node; + var nodeHierarchy = (0, CacheUtil_1.getCache)(elem, "ARIAMapper::getNodeHierarchy", null); + if (!nodeHierarchy) { + // This element hasn't been processed yet - but ::reset processes them all in the right order + // Get details about the correct parent first + var parent_1 = ARIAMapper.getAriaOwnedBy(elem); + if (!parent_1) { + parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + } + while (parent_1 && parent_1.nodeType !== 1) { + parent_1 = DOMWalker_1.DOMWalker.parentElement(elem); + } + var parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : []; + var parentInfo = parentHierarchy.length > 0 ? parentHierarchy[parentHierarchy.length - 1] : { + role: "", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + while (parentInfo.role === "none" || parentInfo.role === "/none") { + parent_1 = ARIAMapper.getAriaOwnedBy(parent_1) || DOMWalker_1.DOMWalker.parentElement(parent_1); + parentHierarchy = parent_1 ? this.getNodeHierarchy(parent_1) : []; + parentInfo = parentHierarchy[parentHierarchy.length - 1]; + } + // Set initial node info + var nodeInfo = { + attributes: elem.nodeType === 1 ? this.getAttributes(elem) : {}, + bounds: this.getBounds(elem), + namespace: this.getNamespace(), + node: elem, + role: this.getRole(elem) || "none", + rolePath: "", + roleCount: {}, + childrenCanHaveRole: true + }; + // Adjust role if we're within a presentational container + var presentationalContainer = !parentInfo.childrenCanHaveRole; + if (presentationalContainer) { + nodeInfo.role = "none"; + } + else { + nodeInfo.childrenCanHaveRole = parentInfo.childrenCanHaveRole + && this.childrenCanHaveRole(elem, nodeInfo.role); + } + // Set the paths + if (nodeInfo.role !== "none") { + parentInfo.roleCount[nodeInfo.role] = (parentInfo.roleCount[nodeInfo.role] || 0) + 1; + nodeInfo.rolePath = parentInfo.rolePath + "/" + nodeInfo.role + "[" + parentInfo.roleCount[nodeInfo.role] + "]"; + } + else { + nodeInfo.rolePath = parentInfo.rolePath; + } + // Set hierarchy + nodeHierarchy = []; + for (var _a = 0, parentHierarchy_2 = parentHierarchy; _a < parentHierarchy_2.length; _a++) { + var item = parentHierarchy_2[_a]; + nodeHierarchy.push(item); + } + nodeHierarchy.push(nodeInfo); + (0, CacheUtil_1.setCache)(elem, "ARIAMapper::getNodeHierarchy", nodeHierarchy); + } + return nodeHierarchy; + } + }; + ARIAMapper.prototype.reset = function (node) { + ARIAMapper.nameComputationId = 0; + this.hierarchyRole = []; + this.hierarchyResults = []; + this.hierarchyPath = [{ + rolePath: "", + roleCount: {} + }]; + // Get to the topmost node + var goodNode = node; + var next; + while (next = DOMWalker_1.DOMWalker.parentNode(goodNode)) { + goodNode = next; + } + ; + // Walk the tree and set the hierarchies in the right order + var ariaWalker = new ARIAWalker_1.ARIAWalker(goodNode, false, goodNode); + do { + if (ariaWalker.node.nodeType === 1) { + this.getNodeHierarchy(ariaWalker.node); + } + } while (ariaWalker.nextNode()); + }; + ARIAMapper.prototype.openScope = function (node) { + if (this.hierarchyRole === null) { + this.reset(node); + } + this.pushHierarchy(node); + for (var idx = 0; idx < this.hierarchyResults.length; ++idx) { + if (this.hierarchyResults[idx].role[0] === "/") { + this.hierarchyResults[idx].role = this.hierarchyResults[idx].role.substring(1); + } + } + return this.hierarchyResults; + }; + ARIAMapper.prototype.pushHierarchy = function (node) { + // If we're not an element, no special handling + var nodeHierarchy = []; + // Determine our node info + nodeHierarchy = this.getNodeHierarchy(node); + var nodeInfo = nodeHierarchy[nodeHierarchy.length - 1]; + this.hierarchyRole.push(nodeInfo.role); + if (nodeInfo.role !== "none") { + this.hierarchyPath.push(nodeInfo); + } + this.hierarchyResults = nodeHierarchy; + }; + ARIAMapper.prototype.closeScope = function (node) { + var retVal = []; + for (var _i = 0, _a = this.hierarchyResults; _i < _a.length; _i++) { + var res = _a[_i]; + // const temp = res.node; + // res.node = null; + // let cloned = JSON.parse(JSON.stringify(res)); + // cloned.node = res.node = temp; + // retVal.push(cloned); + retVal.push(res); + } + if (retVal.length > 0) { + retVal[retVal.length - 1].role = "/" + retVal[retVal.length - 1].role; + var parent_2 = DOMWalker_1.DOMWalker.parentElement(node); + this.hierarchyResults = parent_2 ? (0, CacheUtil_1.getCache)(parent_2, "ARIAMapper::getNodeInfo", []) : []; + } + return retVal; + }; + ARIAMapper.computeName = function (cur) { + ++ARIAMapper.nameComputationId; + return ARIAMapper.computeNameHelp(ARIAMapper.nameComputationId, cur, false, false); + }; + ARIAMapper.computeNameHelp = function (walkId, cur, labelledbyTraverse, walkTraverse) { + // 2g. None of the other content applies to text nodes, so just do this first + if (cur.nodeType === 3 /* Node.TEXT_NODE */) + return cur.nodeValue; + if (cur.nodeType === 11) + return ""; + if (cur.nodeType !== 1 /* Node.ELEMENT_NODE */) { + if (walkTraverse || labelledbyTraverse) + return ""; + throw new Error("Can only compute name on Element and Text " + cur.nodeType); + } + var elem = cur; + // We've been here before - prevent recursion + if ((0, CacheUtil_1.getCache)(elem, "data-namewalk", null) === "" + walkId) + return ""; + (0, CacheUtil_1.setCache)(elem, "data-namewalk", "" + walkId); + // See https://www.w3.org/TR/html-aam-1.0/#input-type-text-input-type-password-input-type-search-input-type-tel-input-type-url-and-textarea-element + // 2a. Only show hidden content if it's referenced by a labelledby + if (!labelledbyTraverse && !DOMWalker_1.DOMWalker.isNodeVisible(cur)) { + return ""; + } + // 2b. collect valid id references + if (!labelledbyTraverse && elem.hasAttribute("aria-labelledby")) { + var labelledby = elem.getAttribute("aria-labelledby").split(" "); + var validElems = []; + for (var _i = 0, labelledby_1 = labelledby; _i < labelledby_1.length; _i++) { + var ref = labelledby_1[_i]; + var refElem = fragment_1.FragmentUtil.getById(cur, ref); + if (refElem && !DOMUtil_1.DOMUtil.sameNode(elem, refElem)) { + validElems.push(refElem); + } + } + if (validElems.length > 0) { + var accumulated = ""; + for (var _a = 0, validElems_1 = validElems; _a < validElems_1.length; _a++) { + var elem_2 = validElems_1[_a]; + accumulated += " " + this.computeNameHelp(walkId, elem_2, true, false); + } + return accumulated.trim(); + } + } + // Since nodeToRole calls back here for form and section, we need special casing here to handle those two cases + if (["section", "form"].includes(cur.nodeName.toLowerCase())) { + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse) { + return elem.getAttribute("aria-label").trim(); + } + } + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + return ""; + } + // 2c. If label or walk, and this is a control, skip to the value, otherwise provide the label + var role = ARIAMapper.nodeToRole(cur); + var isEmbeddedControl = [ + "textbox", "button", "combobox", "listbox", + "progressbar", "scrollbar", "slider", "spinbutton" + ].includes(role); + if (elem.hasAttribute("aria-label") && elem.getAttribute("aria-label").trim().length > 0) { + // If I'm not an embedded control or I'm not recursing, return the aria-label + if (!labelledbyTraverse && !walkTraverse || !isEmbeddedControl) { + return elem.getAttribute("aria-label").trim(); + } + } + // 2d. + if (role !== "presentation" && role !== "none") { + if ((cur.nodeName.toLowerCase() === "img" || cur.nodeName.toLowerCase() === "area") && elem.hasAttribute("alt")) { + return DOMUtil_1.DOMUtil.cleanWhitespace(elem.getAttribute("alt")).trim(); + } + if (cur.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").length > 0) { + var label = elem.ownerDocument.querySelector("label[for='" + elem.getAttribute("id") + "']"); + if (label) { + if (label.hasAttribute("aria-label") || (label.hasAttribute("aria-labelledby") && !legacy_1.RPTUtil.isIdReferToSelf(cur, label.getAttribute("aria-labelledby")))) { + return this.computeNameHelp(walkId, label, false, false); + } + else { + return label.textContent; + } + } + } + if (cur.nodeName.toLowerCase() === "fieldset") { + if (cur.querySelector("legend")) { + var legend = cur.querySelector("legend"); + return legend.innerText; + } + else { + return this.computeNameHelp(walkId, cur, false, false); + } + } + } + // 2e. + if ((walkTraverse || labelledbyTraverse) && isEmbeddedControl) { + // If the embedded control has role textbox, return its value. + if (role === "textbox") { + if (elem.nodeName.toLowerCase() === "input") { + if (elem.hasAttribute("value")) + return elem.getAttribute("value"); + } + else { + walkTraverse = false; + } + } + // If the embedded control has role button, return the text alternative of the button. + if (role === "button") { + if (elem.nodeName.toLowerCase() === "input") { + var type = elem.getAttribute("type").toLowerCase(); + if (["button", "submit", "reset"].includes(type)) { + if (elem.hasAttribute("value")) + return elem.getAttribute("value"); + if (type === "submit") + return "Submit"; + if (type === "reset") + return "Reset"; + } + } + else { + walkTraverse = false; + } + } + // TODO: If the embedded control has role combobox or listbox, return the text alternative of the chosen option. + if (role === "combobox") { + if (elem.hasAttribute("aria-activedescendant")) { + var selected = fragment_1.FragmentUtil.getById(elem, "aria-activedescendant"); + if (selected && !DOMUtil_1.DOMUtil.sameNode(elem, selected)) { + return ARIAMapper.computeNameHelp(walkId, selected, false, false); + } + } + } + // If the embedded control has role range (e.g., a spinbutton or slider): + if (["progressbar", "scrollbar", "slider", "spinbutton"].includes(role)) { + // If the aria-valuetext property is present, return its value, + if (elem.hasAttribute("aria-valuetext")) + return elem.getAttribute("aria-valuetext"); + // Otherwise, if the aria-valuenow property is present, return its value, + if (elem.hasAttribute("aria-valuenow")) + return elem.getAttribute("aria-valuenow"); + // TODO: Otherwise, use the value as specified by a host language attribute. + } + } + // 2f. 2h. + if (walkTraverse || ARIADefinitions_1.ARIADefinitions.nameFromContent(role) || labelledbyTraverse) { + // 2fi. Set the accumulated text to the empty string. + var accumulated = ""; + // 2fii. Check for CSS generated textual content associated with the current node and + // include it in the accumulated text. The CSS :before and :after pseudo elements [CSS2] + // can provide textual content for elements that have a content model. + // For :before pseudo elements, User agents MUST prepend CSS textual content, without + // a space, to the textual content of the current node. + // For :after pseudo elements, User agents MUST append CSS textual content, without a + // space, to the textual content of the current node. + var before = null; + before = elem.ownerDocument.defaultView.getComputedStyle(elem, "before").content; + if (before && before !== "none") { + before = before.replace(/^"/, "").replace(/"$/, ""); + accumulated += before; + } + // 2fiii. For each child node of the current node: + // Set the current node to the child node. + // Compute the text alternative of the current node beginning with step 2. Set the result + // to that text alternative. + // Append the result to the accumulated text. + if (elem.nodeName.toUpperCase() === "SLOT") { + //if no assignedNode, check its own text + if (!elem.assignedNodes() || elem.assignedNodes().length === 0) { + var innerText = legacy_1.RPTUtil.getInnerText(elem); + if (innerText && innerText !== null && innerText.trim().length > 0) + accumulated += " " + innerText; + } + else { + // check text from all assigned nodes + for (var _b = 0, _c = elem.assignedNodes(); _b < _c.length; _b++) { + var slotChild = _c[_b]; + var nextChildContent = ARIAMapper.computeNameHelp(walkId, slotChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + } + } + } + else { + var walkChild = elem.firstChild; + while (walkChild) { + var nextChildContent = ARIAMapper.computeNameHelp(walkId, walkChild, labelledbyTraverse, true); + accumulated += " " + nextChildContent; + walkChild = walkChild.nextSibling; + } + } + var after = null; + try { + after = elem.ownerDocument.defaultView.getComputedStyle(elem, "after").content; + } + catch (e) { } + if (after && after !== "none") { + after = after.replace(/^"/, "").replace(/"$/, ""); + accumulated += after; + } + // 2fiv. Return the accumulated text. + accumulated = accumulated.replace(/\s+/g, " ").trim(); + if (accumulated.trim().length > 0) { + return accumulated; + } + } + // 2i. Otherwise, if the current node has a Tooltip attribute, return its value. + if (elem.hasAttribute("title")) { + return elem.getAttribute("title"); + } + if (elem.tagName.toLowerCase() === "svg") { + var title = elem.querySelector("title"); + if (title) { + return title.textContent || title.innerText; + } + } + return ""; + }; + /* if (role in ARIADefinitions.designPatterns + && ARIADefinitions.designPatterns[role].nameFrom + && ARIADefinitions.designPatterns[role].nameFrom.includes("contents")) + { + name = elem.textContent; + } + if (elem.nodeName.toLowerCase() === "input" && elem.hasAttribute("id") && elem.getAttribute("id").trim().length > 0) { + name = elem.ownerDocument.querySelector("label[for='"+elem.getAttribute("id").trim()+"']").textContent; + } + if (elem.hasAttribute("aria-label")) { + name = elem.getAttribute("aria-label"); + } + if (elem.hasAttribute("aria-labelledby")) { + name = ""; + const ids = elem.getAttribute("aria-labelledby").split(" "); + for (const id of ids) { + name += FragmentUtil.getById(elem, id).textContent + " "; + } + name = name.trim(); + } + return name; + }*/ + ARIAMapper.nodeToRole = function (node) { + if (node.nodeType === 3 /* Node.TEXT_NODE */) { + return "text"; + } + else if (node.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + var elem = node; + if (!elem || elem.nodeType !== 1 /* Node.ELEMENT_NODE */) { + return null; + } + if (elem.hasAttribute("role") && elem.getAttribute("role").trim().length > 0) { + var roleStr = elem.getAttribute("role").trim(); + var roles_2 = roleStr.split(" "); + for (var _i = 0, roles_1 = roles_2; _i < roles_1.length; _i++) { + var role = roles_1[_i]; + if (role === "presentation" || role === "none") { + // If element is focusable, then presentation roles are to be ignored + if (!legacy_1.RPTUtil.isFocusable(elem)) { + return null; + } + } + else if (role in ARIADefinitions_1.ARIADefinitions.designPatterns) { + return role; + } + } + } + //return this.elemToImplicitRole(elem); + var roles = legacy_1.RPTUtil.getImplicitRole(elem); + return !roles || roles.length === 0 ? null : roles[0]; + }; + //////////////////////////////////////////////////////////////////////////// + // Helper functions + //// + // https://www.w3.org/TR/html-aam-1.0/#mapping-html-to-accessibility-apis + ARIAMapper.elemAttrValueCalculators = { + "global": { + "name": ARIAMapper.computeName + }, + "datalist": { + // set to "true" if the datalist's selection model allows multiple option elements to be + // selected at a time, and "false" otherwise + "multiselectable": function (elem) { + var id = elem.getAttribute("id"); + if (id && id.length > 0) { + var input = elem.ownerDocument.querySelector("input[list='" + id + "']"); + return "" + (elem.getAttribute("multiple") + && (elem.getAttribute("multiple") == "true" || elem.getAttribute("multiple") == "")); + } + return null; + } + }, + "h1": { + "level": "1" + }, + "h2": { + "level": "2" + }, + "h3": { + "level": "3" + }, + "h4": { + "level": "4" + }, + "h5": { + "level": "5" + }, + "h6": { + "level": "6" + }, + "input": { + // - type="checkbox" state set to "mixed" if the element's indeterminate IDL attribute + // is true, or "true" if the element's checkedness is true, or "false" otherwise + // - type="radio" state set to "true" if the element's checkedness is true, or "false" + // otherwise. + "checked": function (elem) { + if (elem.getAttribute("type") === "checkbox" || elem.getAttribute("type") === "radio") { + return "" + elem.checked; + } + return null; + } + // - type="radio" and not in menu reflecting number of type=radio input elements + // within the radio button group + , + "setsize": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // - type="radio" and not in menu value reflecting the elements position + // within the radio button group." + , + "posinset": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + // input (type attribute in the Text, Search, Telephone, URL, or E-mail states with a + // suggestions source element) combobox role, with the aria-owns property set to the same + // value as the list attribute + , + "owns": function (elem) { return null; throw new Error("NOT IMPLEMENTED"); } + }, + "keygen": { + "multiselectable": "false" + }, + "li": { + // Number of li elements within the ol, ul, menu + "setsize": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var otherlis = parent.querySelectorAll("ol li, ul li, menu li"); + return "" + (lis.length - otherlis.length); + } + // Position of li element within the ol, ul, menu + , + "posinset": function (elem) { + var parent = DOMUtil_1.DOMUtil.getAncestor(elem, ["ol", "ul", "menu"]); + if (!parent) + return null; + var lis = parent.querySelectorAll("li"); + var num = 0; + for (var idx = 0; idx < lis.length; ++idx) { + var li = lis[idx]; + if (DOMUtil_1.DOMUtil.sameNode(parent, DOMUtil_1.DOMUtil.getAncestor(li, ["ol", "ul", "menu"]))) { + return "" + num; + } + ++num; + } + return null; + } + }, + "menuitem": { + // type = checkbox or radio, set to "true" if the checked attribute + // is present, and "false" otherwise + "checked": function (elem) { return "" + !!(elem.getAttribute("checked") + && (elem.getAttribute("checked") == "true" || elem.getAttribute("checked") == "")); } + }, + "option": { + // set to "true" if the element's selectedness is true, or "false" otherwise. + "selected": function (elem) { return "" + !!(elem.getAttribute("selected") + && (elem.getAttribute("selected") == "true" || elem.getAttribute("selected") == "")); } + }, + "progress": { + "valuemax": function (elem) { return elem.getAttribute("max") || "1"; }, + "valuemin": function (elem) { return "0"; }, + "valuenow": function (elem) { return elem.getAttribute("value"); } + } + }; + ARIAMapper.textAttrValueCalculators = { + "name": function (node) { return node.nodeValue; } + }; + ARIAMapper.nameComputationId = 0; + return ARIAMapper; +}(CommonMapper_1.CommonMapper)); +exports.ARIAMapper = ARIAMapper; + + +/***/ }), + +/***/ "./src/v2/aria/ARIAWalker.ts": +/*!***********************************!*\ + !*** ./src/v2/aria/ARIAWalker.ts ***! + \***********************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ARIAWalker = void 0; +var fragment_1 = __webpack_require__(/*! ../checker/accessibility/util/fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ./ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +/** + * Walks in an ARIA order + * + * See also ../dom/DOMWalker + */ +var ARIAWalker = /** @class */ (function () { + function ARIAWalker(element, bEnd, root) { + this.root = root || element; + this.node = element; + this.bEndTag = (bEnd == undefined ? false : bEnd == true); + } + ARIAWalker.prototype.atRoot = function () { + if (this.ownerElement) + return false; + if (this.root === this.node) { + return true; + } + else if (this.root.isSameNode) { + return this.root.isSameNode(this.node); + } + else if (this.root.compareDocumentPosition) { + return this.root.compareDocumentPosition(this.node) === 0; + } + else { + // Not supported in this environment - try our best + return this.node.parentNode === null; + } + }; + ARIAWalker.prototype.nextNode = function () { + var skipOwned = false; + do { + skipOwned = false; + // console.log(this.node.nodeName, this.bEndTag?"END":"START", this.node.nodeType === 1 && (this.node as any).getAttribute("id")); + if (!this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + var slotElement = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && DOMWalker_1.DOMWalker.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && DOMWalker_1.DOMWalker.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.firstChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 + && elementNode.nodeName.toLowerCase() === "slot" + && slotElement.assignedNodes().length > 0) { + //TODO: need to conside its own content, a slot may have its own content or assigned content + var slotOwner = this.node; + this.node = slotElement.assignedNodes()[0]; + this.node.slotOwner = slotOwner; + this.node.slotIndex = 0; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) /* Node.ELEMENT_NODE */ && this.node.firstChild) { + this.node = this.node.firstChild; + } + else { + this.bEndTag = true; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.slotOwner) { + var slotOwner = this.node.slotOwner; + var nextSlotIndex = this.node.slotIndex + 1; + delete this.node.slotOwner; + delete this.node.slotIndex; + if (nextSlotIndex < slotOwner.assignedNodes().length) { + this.node = slotOwner.assignedNodes()[nextSlotIndex]; + this.node.slotOwner = slotOwner; + this.node.slotIndex = nextSlotIndex; + this.bEndTag = false; + } + else { + this.node = slotOwner; + this.bEndTag = true; + } + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = true; + } + else if (this.node.nextSibling) { + this.node = this.node.nextSibling; + this.bEndTag = false; + skipOwned = true; + } + else if (this.node.parentNode) { + if (this.node.parentNode.nodeType === 1 && this.node.parentNode.hasAttribute("aria-owns")) { + var ownIds = this.node.parentNode.getAttribute("aria-owns").split(/ +/g); + if (this.node.nodeType !== 1 || !this.node.hasAttribute("id")) { + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[0]); + this.bEndTag = false; + } + else { + var idx = ownIds.indexOf(this.node.getAttribute("id")); + if (idx === ownIds.length - 1) { + // last one + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + // grab next + this.node = fragment_1.FragmentUtil.getOwnerFragment(this.node).getElementById(ownIds[idx + 1]); + this.bEndTag = false; + } + } + } + this.node = this.node.parentNode; + this.bEndTag = true; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11 && this.node.nodeType !== 3 /* Node.TEXT_NODE */) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE") + || (skipOwned && this.node.nodeType === 1 && !!ARIAMapper_1.ARIAMapper.getAriaOwnedBy(this.node))); + return true; + }; + ARIAWalker.prototype.prevNode = function () { + do { + if (this.bEndTag) { + var iframeNode = this.node; + var elementNode = this.node; + if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && this.node.nodeName.toUpperCase() === "IFRAME" + && DOMWalker_1.DOMWalker.isNodeVisible(iframeNode) + && iframeNode.contentDocument + && iframeNode.contentDocument.documentElement) { + var ownerElement = this.node; + this.node = iframeNode.contentDocument.documentElement; + this.node.ownerElement = ownerElement; + } + else if (this.node.nodeType === 1 /* Node.ELEMENT_NODE */ + && DOMWalker_1.DOMWalker.isNodeVisible(elementNode) + && elementNode.shadowRoot + && elementNode.shadowRoot.lastChild) { + var ownerElement = this.node; + this.node = elementNode.shadowRoot; + this.node.ownerElement = ownerElement; + } + else if ((this.node.nodeType === 1 /* Node.ELEMENT_NODE */ || this.node.nodeType === 11) && this.node.lastChild) { + this.node = this.node.lastChild; + } + else { + this.bEndTag = false; + } + } + else { + if (this.atRoot()) { + return false; + } + else if (this.node.previousSibling) { + this.node = this.node.previousSibling; + this.bEndTag = true; + } + else if (this.node.ownerElement) { + this.node = this.node.ownerElement; + this.bEndTag = false; + } + else if (this.node.parentNode) { + this.node = this.node.parentNode; + this.bEndTag = false; + } + else { + return false; + } + } + } while ((this.node.nodeType !== 1 /* Node.ELEMENT_NODE */ && this.node.nodeType !== 11) + || (this.node.nodeType === 1 && this.node.getAttribute("aChecker") === "ACE")); + return true; + }; + return ARIAWalker; +}()); +exports.ARIAWalker = ARIAWalker; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/ancestor.ts": +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/ancestor.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AncestorUtil = void 0; +var AncestorUtil = /** @class */ (function () { + function AncestorUtil() { + } + AncestorUtil.isPresentationFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 + && elem.nodeName.toLowerCase() === "iframe" + && (elem.getAttribute("role") === "presentation" || elem.getAttribute("aria-hidden") === "true")) { + return true; + } + } + } + return false; + }; + AncestorUtil.isFrame = function (contextHierarchy) { + if (contextHierarchy && contextHierarchy.dom) { + // Skip current node because we want ancestry + for (var idx = contextHierarchy.dom.length - 2; idx >= 0; --idx) { + var elem = contextHierarchy.dom[idx].node; + if (elem.nodeType === 1 && elem.nodeName.toLowerCase() === "iframe") { + return true; + } + } + } + return false; + }; + return AncestorUtil; +}()); +exports.AncestorUtil = AncestorUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/fragment.ts": +/*!*******************************************************!*\ + !*** ./src/v2/checker/accessibility/util/fragment.ts ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FragmentUtil = void 0; +var FragmentUtil = /** @class */ (function () { + function FragmentUtil() { + } + FragmentUtil.getOwnerFragment = function (node) { + var n = node; + while (n.parentNode && (n = n.parentNode)) { + if (n.nodeType === 11) { + return n; + } + } + return node.ownerDocument; + }; + FragmentUtil.getById = function (node, id) { + return this.getOwnerFragment(node).getElementById(id); + }; + FragmentUtil.getAncestor = function (hierarchies, elemName) { + var matches = hierarchies["dom"].filter(function (info) { return info.role === elemName; }); + return matches.length > 0 && matches[0].node || null; + }; + FragmentUtil.getAncestorWithRole = function (hierarchies, role) { + var matches = hierarchies["aria"].filter(function (info) { return info.role === role; }); + return matches.length > 0 && matches[0].node || null; + }; + return FragmentUtil; +}()); +exports.FragmentUtil = FragmentUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/lang.ts": +/*!***************************************************!*\ + !*** ./src/v2/checker/accessibility/util/lang.ts ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports) => { + + +/****************************************************************************** + Copyright:: 2021- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LangUtil = void 0; +// From https://www.iana.org/assignments/language-subtag-registry/language-subtag-registry +var validPrimaryLangs = [ + ["aa", "ab", "ae", "af", "ak", "am", "an", "ar", "as", "av", "ay", "az", "aaa", "aab", "aac", "aad", "aae", "aaf", "aag", "aah", "aai", "aak", "aal", "aam", "aan", "aao", "aap", "aaq", "aas", "aat", "aau", "aav", "aaw", "aax", "aaz", "aba", "abb", "abc", "abd", "abe", "abf", "abg", "abh", "abi", "abj", "abl", "abm", "abn", "abo", "abp", "abq", "abr", "abs", "abt", "abu", "abv", "abw", "abx", "aby", "abz", "aca", "acb", "acd", "ace", "acf", "ach", "aci", "ack", "acl", "acm", "acn", "acp", "acq", "acr", "acs", "act", "acu", "acv", "acw", "acx", "acy", "acz", "ada", "adb", "add", "ade", "adf", "adg", "adh", "adi", "adj", "adl", "adn", "ado", "adp", "adq", "adr", "ads", "adt", "adu", "adw", "adx", "ady", "adz", "aea", "aeb", "aec", "aed", "aee", "aek", "ael", "aem", "aen", "aeq", "aer", "aes", "aeu", "aew", "aey", "aez", "afa", "afb", "afd", "afe", "afg", "afh", "afi", "afk", "afn", "afo", "afp", "afs", "aft", "afu", "afz", "aga", "agb", "agc", "agd", "age", "agf", "agg", "agh", "agi", "agj", "agk", "agl", "agm", "agn", "ago", "agp", "agq", "agr", "ags", "agt", "agu", "agv", "agw", "agx", "agy", "agz", "aha", "ahb", "ahg", "ahh", "ahi", "ahk", "ahl", "ahm", "ahn", "aho", "ahp", "ahr", "ahs", "aht", "aia", "aib", "aic", "aid", "aie", "aif", "aig", "aih", "aii", "aij", "aik", "ail", "aim", "ain", "aio", "aip", "aiq", "air", "ais", "ait", "aiw", "aix", "aiy", "aja", "ajg", "aji", "ajn", "ajp", "ajt", "aju", "ajw", "ajz", "akb", "akc", "akd", "ake", "akf", "akg", "akh", "aki", "akj", "akk", "akl", "akm", "ako", "akp", "akq", "akr", "aks", "akt", "aku", "akv", "akw", "akx", "aky", "akz", "ala", "alc", "ald", "ale", "alf", "alg", "alh", "ali", "alj", "alk", "all", "alm", "aln", "alo", "alp", "alq", "alr", "als", "alt", "alu", "alv", "alw", "alx", "aly", "alz", "ama", "amb", "amc", "ame", "amf", "amg", "ami", "amj", "amk", "aml", "amm", "amn", "amo", "amp", "amq", "amr", "ams", "amt", "amu", "amv", "amw", "amx", "amy", "amz", "ana", "anb", "anc", "and", "ane", "anf", "ang", "anh", "ani", "anj", "ank", "anl", "anm", "ann", "ano", "anp", "anq", "anr", "ans", "ant", "anu", "anv", "anw", "anx", "any", "anz", "aoa", "aob", "aoc", "aod", "aoe", "aof", "aog", "aoh", "aoi", "aoj", "aok", "aol", "aom", "aon", "aor", "aos", "aot", "aou", "aox", "aoz", "apa", "apb", "apc", "apd", "ape", "apf", "apg", "aph", "api", "apj", "apk", "apl", "apm", "apn", "apo", "app", "apq", "apr", "aps", "apt", "apu", "apv", "apw", "apx", "apy", "apz", "aqa", "aqc", "aqd", "aqg", "aqk", "aql", "aqm", "aqn", "aqp", "aqr", "aqt", "aqz", "arb", "arc", "ard", "are", "arh", "ari", "arj", "ark", "arl", "arn", "aro", "arp", "arq", "arr", "ars", "art", "aru", "arv", "arw", "arx", "ary", "arz", "asa", "asb", "asc", "asd", "ase", "asf", "asg", "ash", "asi", "asj", "ask", "asl", "asn", "aso", "asp", "asq", "asr", "ass", "ast", "asu", "asv", "asw", "asx", "asy", "asz", "ata", "atb", "atc", "atd", "ate", "atg", "ath", "ati", "atj", "atk", "atl", "atm", "atn", "ato", "atp", "atq", "atr", "ats", "att", "atu", "atv", "atw", "atx", "aty", "atz", "aua", "aub", "auc", "aud", "aue", "auf", "aug", "auh", "aui", "auj", "auk", "aul", "aum", "aun", "auo", "aup", "auq", "aur", "aus", "aut", "auu", "auw", "aux", "auy", "auz", "avb", "avd", "avi", "avk", "avl", "avm", "avn", "avo", "avs", "avt", "avu", "avv", "awa", "awb", "awc", "awd", "awe", "awg", "awh", "awi", "awk", "awm", "awn", "awo", "awr", "aws", "awt", "awu", "awv", "aww", "awx", "awy", "axb", "axe", "axg", "axk", "axl", "axm", "axx", "aya", "ayb", "ayc", "ayd", "aye", "ayg", "ayh", "ayi", "ayk", "ayl", "ayn", "ayo", "ayp", "ayq", "ayr", "ays", "ayt", "ayu", "ayx", "ayy", "ayz", "aza", "azb", "azc", "azd", "azg", "azj", "azm", "azn", "azo", "azt", "azz"], + ["ba", "be", "bg", "bh", "bi", "bm", "bn", "bo", "br", "bs", "baa", "bab", "bac", "bad", "bae", "baf", "bag", "bah", "bai", "baj", "bal", "ban", "bao", "bap", "bar", "bas", "bat", "bau", "bav", "baw", "bax", "bay", "baz", "bba", "bbb", "bbc", "bbd", "bbe", "bbf", "bbg", "bbh", "bbi", "bbj", "bbk", "bbl", "bbm", "bbn", "bbo", "bbp", "bbq", "bbr", "bbs", "bbt", "bbu", "bbv", "bbw", "bbx", "bby", "bbz", "bca", "bcb", "bcc", "bcd", "bce", "bcf", "bcg", "bch", "bci", "bcj", "bck", "bcl", "bcm", "bcn", "bco", "bcp", "bcq", "bcr", "bcs", "bct", "bcu", "bcv", "bcw", "bcy", "bcz", "bda", "bdb", "bdc", "bdd", "bde", "bdf", "bdg", "bdh", "bdi", "bdj", "bdk", "bdl", "bdm", "bdn", "bdo", "bdp", "bdq", "bdr", "bds", "bdt", "bdu", "bdv", "bdw", "bdx", "bdy", "bdz", "bea", "beb", "bec", "bed", "bee", "bef", "beg", "beh", "bei", "bej", "bek", "bem", "beo", "bep", "beq", "ber", "bes", "bet", "beu", "bev", "bew", "bex", "bey", "bez", "bfa", "bfb", "bfc", "bfd", "bfe", "bff", "bfg", "bfh", "bfi", "bfj", "bfk", "bfl", "bfm", "bfn", "bfo", "bfp", "bfq", "bfr", "bfs", "bft", "bfu", "bfw", "bfx", "bfy", "bfz", "bga", "bgb", "bgc", "bgd", "bge", "bgf", "bgg", "bgi", "bgj", "bgk", "bgl", "bgm", "bgn", "bgo", "bgp", "bgq", "bgr", "bgs", "bgt", "bgu", "bgv", "bgw", "bgx", "bgy", "bgz", "bha", "bhb", "bhc", "bhd", "bhe", "bhf", "bhg", "bhh", "bhi", "bhj", "bhk", "bhl", "bhm", "bhn", "bho", "bhp", "bhq", "bhr", "bhs", "bht", "bhu", "bhv", "bhw", "bhx", "bhy", "bhz", "bia", "bib", "bic", "bid", "bie", "bif", "big", "bij", "bik", "bil", "bim", "bin", "bio", "bip", "biq", "bir", "bit", "biu", "biv", "biw", "bix", "biy", "biz", "bja", "bjb", "bjc", "bjd", "bje", "bjf", "bjg", "bjh", "bji", "bjj", "bjk", "bjl", "bjm", "bjn", "bjo", "bjp", "bjq", "bjr", "bjs", "bjt", "bju", "bjv", "bjw", "bjx", "bjy", "bjz", "bka", "bkb", "bkc", "bkd", "bkf", "bkg", "bkh", "bki", "bkj", "bkk", "bkl", "bkm", "bkn", "bko", "bkp", "bkq", "bkr", "bks", "bkt", "bku", "bkv", "bkw", "bkx", "bky", "bkz", "bla", "blb", "blc", "bld", "ble", "blf", "blg", "blh", "bli", "blj", "blk", "bll", "blm", "bln", "blo", "blp", "blq", "blr", "bls", "blt", "blv", "blw", "blx", "bly", "blz", "bma", "bmb", "bmc", "bmd", "bme", "bmf", "bmg", "bmh", "bmi", "bmj", "bmk", "bml", "bmm", "bmn", "bmo", "bmp", "bmq", "bmr", "bms", "bmt", "bmu", "bmv", "bmw", "bmx", "bmy", "bmz", "bna", "bnb", "bnc", "bnd", "bne", "bnf", "bng", "bni", "bnj", "bnk", "bnl", "bnm", "bnn", "bno", "bnp", "bnq", "bnr", "bns", "bnt", "bnu", "bnv", "bnw", "bnx", "bny", "bnz", "boa", "bob", "boe", "bof", "bog", "boh", "boi", "boj", "bok", "bol", "bom", "bon", "boo", "bop", "boq", "bor", "bot", "bou", "bov", "bow", "box", "boy", "boz", "bpa", "bpb", "bpd", "bpe", "bpg", "bph", "bpi", "bpj", "bpk", "bpl", "bpm", "bpn", "bpo", "bpp", "bpq", "bpr", "bps", "bpt", "bpu", "bpv", "bpw", "bpx", "bpy", "bpz", "bqa", "bqb", "bqc", "bqd", "bqf", "bqg", "bqh", "bqi", "bqj", "bqk", "bql", "bqm", "bqn", "bqo", "bqp", "bqq", "bqr", "bqs", "bqt", "bqu", "bqv", "bqw", "bqx", "bqy", "bqz", "bra", "brb", "brc", "brd", "brf", "brg", "brh", "bri", "brj", "brk", "brl", "brm", "brn", "bro", "brp", "brq", "brr", "brs", "brt", "bru", "brv", "brw", "brx", "bry", "brz", "bsa", "bsb", "bsc", "bse", "bsf", "bsg", "bsh", "bsi", "bsj", "bsk", "bsl", "bsm", "bsn", "bso", "bsp", "bsq", "bsr", "bss", "bst", "bsu", "bsv", "bsw", "bsx", "bsy", "bta", "btb", "btc", "btd", "bte", "btf", "btg", "bth", "bti", "btj", "btk", "btl", "btm", "btn", "bto", "btp", "btq", "btr", "bts", "btt", "btu", "btv", "btw", "btx", "bty", "btz", "bua", "bub", "buc", "bud", "bue", "buf", "bug", "buh", "bui", "buj", "buk", "bum", "bun", "buo", "bup", "buq", "bus", "but", "buu", "buv", "buw", "bux", "buy", "buz", "bva", "bvb", "bvc", "bvd", "bve", "bvf", "bvg", "bvh", "bvi", "bvj", "bvk", "bvl", "bvm", "bvn", "bvo", "bvp", "bvq", "bvr", "bvt", "bvu", "bvv", "bvw", "bvx", "bvy", "bvz", "bwa", "bwb", "bwc", "bwd", "bwe", "bwf", "bwg", "bwh", "bwi", "bwj", "bwk", "bwl", "bwm", "bwn", "bwo", "bwp", "bwq", "bwr", "bws", "bwt", "bwu", "bww", "bwx", "bwy", "bwz", "bxa", "bxb", "bxc", "bxd", "bxe", "bxf", "bxg", "bxh", "bxi", "bxj", "bxk", "bxl", "bxm", "bxn", "bxo", "bxp", "bxq", "bxr", "bxs", "bxu", "bxv", "bxw", "bxx", "bxz", "bya", "byb", "byc", "byd", "bye", "byf", "byg", "byh", "byi", "byj", "byk", "byl", "bym", "byn", "byo", "byp", "byq", "byr", "bys", "byt", "byv", "byw", "byx", "byy", "byz", "bza", "bzb", "bzc", "bzd", "bze", "bzf", "bzg", "bzh", "bzi", "bzj", "bzk", "bzl", "bzm", "bzn", "bzo", "bzp", "bzq", "bzr", "bzs", "bzt", "bzu", "bzv", "bzw", "bzx", "bzy", "bzz"], + ["ca", "ce", "ch", "co", "cr", "cs", "cu", "cv", "cy", "caa", "cab", "cac", "cad", "cae", "caf", "cag", "cah", "cai", "caj", "cak", "cal", "cam", "can", "cao", "cap", "caq", "car", "cas", "cau", "cav", "caw", "cax", "cay", "caz", "cba", "cbb", "cbc", "cbd", "cbe", "cbg", "cbh", "cbi", "cbj", "cbk", "cbl", "cbn", "cbo", "cbq", "cbr", "cbs", "cbt", "cbu", "cbv", "cbw", "cby", "cca", "ccc", "ccd", "cce", "ccg", "cch", "ccj", "ccl", "ccm", "ccn", "cco", "ccp", "ccq", "ccr", "ccs", "cda", "cdc", "cdd", "cde", "cdf", "cdg", "cdh", "cdi", "cdj", "cdm", "cdn", "cdo", "cdr", "cds", "cdy", "cdz", "cea", "ceb", "ceg", "cek", "cel", "cen", "cet", "cey", "cfa", "cfd", "cfg", "cfm", "cga", "cgc", "cgg", "cgk", "chb", "chc", "chd", "chf", "chg", "chh", "chj", "chk", "chl", "chm", "chn", "cho", "chp", "chq", "chr", "cht", "chw", "chx", "chy", "chz", "cia", "cib", "cic", "cid", "cie", "cih", "cik", "cim", "cin", "cip", "cir", "ciw", "ciy", "cja", "cje", "cjh", "cji", "cjk", "cjm", "cjn", "cjo", "cjp", "cjr", "cjs", "cjv", "cjy", "cka", "ckb", "ckh", "ckl", "ckm", "ckn", "cko", "ckq", "ckr", "cks", "ckt", "cku", "ckv", "ckx", "cky", "ckz", "cla", "clc", "cld", "cle", "clh", "cli", "clj", "clk", "cll", "clm", "clo", "clt", "clu", "clw", "cly", "cma", "cmc", "cme", "cmg", "cmi", "cmk", "cml", "cmm", "cmn", "cmo", "cmr", "cms", "cmt", "cna", "cnb", "cnc", "cng", "cnh", "cni", "cnk", "cnl", "cno", "cnp", "cnr", "cns", "cnt", "cnu", "cnw", "cnx", "coa", "cob", "coc", "cod", "coe", "cof", "cog", "coh", "coj", "cok", "col", "com", "con", "coo", "cop", "coq", "cot", "cou", "cov", "cow", "cox", "coy", "coz", "cpa", "cpb", "cpc", "cpe", "cpf", "cpg", "cpi", "cpn", "cpo", "cpp", "cps", "cpu", "cpx", "cpy", "cqd", "cqu", "cra", "crb", "crc", "crd", "crf", "crg", "crh", "cri", "crj", "crk", "crl", "crm", "crn", "cro", "crp", "crq", "crr", "crs", "crt", "crv", "crw", "crx", "cry", "crz", "csa", "csb", "csc", "csd", "cse", "csf", "csg", "csh", "csi", "csj", "csk", "csl", "csm", "csn", "cso", "csp", "csq", "csr", "css", "cst", "csu", "csv", "csw", "csx", "csy", "csz", "cta", "ctc", "ctd", "cte", "ctg", "cth", "ctl", "ctm", "ctn", "cto", "ctp", "cts", "ctt", "ctu", "cty", "ctz", "cua", "cub", "cuc", "cug", "cuh", "cui", "cuj", "cuk", "cul", "cum", "cuo", "cup", "cuq", "cur", "cus", "cut", "cuu", "cuv", "cuw", "cux", "cuy", "cvg", "cvn", "cwa", "cwb", "cwd", "cwe", "cwg", "cwt", "cya", "cyb", "cyo", "czh", "czk", "czn", "czo", "czt"], + ["da", "de", "dv", "dz", "daa", "dac", "dad", "dae", "daf", "dag", "dah", "dai", "daj", "dak", "dal", "dam", "dao", "dap", "daq", "dar", "das", "dau", "dav", "daw", "dax", "day", "daz", "dba", "dbb", "dbd", "dbe", "dbf", "dbg", "dbi", "dbj", "dbl", "dbm", "dbn", "dbo", "dbp", "dbq", "dbr", "dbt", "dbu", "dbv", "dbw", "dby", "dcc", "dcr", "dda", "ddd", "dde", "ddg", "ddi", "ddj", "ddn", "ddo", "ddr", "dds", "ddw", "dec", "ded", "dee", "def", "deg", "deh", "dei", "dek", "del", "dem", "den", "dep", "deq", "der", "des", "dev", "dez", "dga", "dgb", "dgc", "dgd", "dge", "dgg", "dgh", "dgi", "dgk", "dgl", "dgn", "dgo", "dgr", "dgs", "dgt", "dgu", "dgw", "dgx", "dgz", "dha", "dhd", "dhg", "dhi", "dhl", "dhm", "dhn", "dho", "dhr", "dhs", "dhu", "dhv", "dhw", "dhx", "dia", "dib", "dic", "did", "dif", "dig", "dih", "dii", "dij", "dik", "dil", "dim", "din", "dio", "dip", "diq", "dir", "dis", "dit", "diu", "diw", "dix", "diy", "diz", "dja", "djb", "djc", "djd", "dje", "djf", "dji", "djj", "djk", "djl", "djm", "djn", "djo", "djr", "dju", "djw", "dka", "dkg", "dkk", "dkl", "dkr", "dks", "dkx", "dlg", "dlk", "dlm", "dln", "dma", "dmb", "dmc", "dmd", "dme", "dmf", "dmg", "dmk", "dml", "dmm", "dmn", "dmo", "dmr", "dms", "dmu", "dmv", "dmw", "dmx", "dmy", "dna", "dnd", "dne", "dng", "dni", "dnj", "dnk", "dnn", "dno", "dnr", "dnt", "dnu", "dnv", "dnw", "dny", "doa", "dob", "doc", "doe", "dof", "doh", "doi", "dok", "dol", "don", "doo", "dop", "doq", "dor", "dos", "dot", "dov", "dow", "dox", "doy", "doz", "dpp", "dra", "drb", "drc", "drd", "dre", "drg", "drh", "dri", "drl", "drn", "dro", "drq", "drr", "drs", "drt", "dru", "drw", "dry", "dsb", "dse", "dsh", "dsi", "dsl", "dsn", "dso", "dsq", "dta", "dtb", "dtd", "dth", "dti", "dtk", "dtm", "dtn", "dto", "dtp", "dtr", "dts", "dtt", "dtu", "dty", "dua", "dub", "duc", "dud", "due", "duf", "dug", "duh", "dui", "duj", "duk", "dul", "dum", "dun", "duo", "dup", "duq", "dur", "dus", "duu", "duv", "duw", "dux", "duy", "duz", "dva", "dwa", "dwk", "dwl", "dwr", "dws", "dwu", "dww", "dwy", "dwz", "dya", "dyb", "dyd", "dyg", "dyi", "dym", "dyn", "dyo", "dyu", "dyy", "dza", "dzd", "dze", "dzg", "dzl", "dzn"], + ["ee", "el", "en", "eo", "es", "et", "eu", "eaa", "ebc", "ebg", "ebk", "ebo", "ebr", "ebu", "ecr", "ecs", "ecy", "eee", "efa", "efe", "efi", "ega", "egl", "ego", "egx", "egy", "ehs", "ehu", "eip", "eit", "eiv", "eja", "eka", "ekc", "eke", "ekg", "eki", "ekk", "ekl", "ekm", "eko", "ekp", "ekr", "eky", "ele", "elh", "eli", "elk", "elm", "elo", "elp", "elu", "elx", "ema", "emb", "eme", "emg", "emi", "emk", "emm", "emn", "emo", "emp", "emq", "ems", "emu", "emw", "emx", "emy", "emz", "ena", "enb", "enc", "end", "enf", "enh", "enl", "enm", "enn", "eno", "enq", "enr", "enu", "env", "enw", "enx", "eot", "epi", "era", "erg", "erh", "eri", "erk", "ero", "err", "ers", "ert", "erw", "ese", "esg", "esh", "esi", "esk", "esl", "esm", "esn", "eso", "esq", "ess", "esu", "esx", "esy", "etb", "etc", "eth", "etn", "eto", "etr", "ets", "ett", "etu", "etx", "etz", "euq", "eve", "evh", "evn", "ewo", "ext", "eya", "eyo", "eza", "eze"], + ["fa", "ff", "fi", "fj", "fo", "fr", "fy", "faa", "fab", "fad", "faf", "fag", "fah", "fai", "faj", "fak", "fal", "fam", "fan", "fap", "far", "fat", "fau", "fax", "fay", "faz", "fbl", "fcs", "fer", "ffi", "ffm", "fgr", "fia", "fie", "fif", "fil", "fip", "fir", "fit", "fiu", "fiw", "fkk", "fkv", "fla", "flh", "fli", "fll", "fln", "flr", "fly", "fmp", "fmu", "fnb", "fng", "fni", "fod", "foi", "fom", "fon", "for", "fos", "fox", "fpe", "fqs", "frc", "frd", "frk", "frm", "fro", "frp", "frq", "frr", "frs", "frt", "fse", "fsl", "fss", "fub", "fuc", "fud", "fue", "fuf", "fuh", "fui", "fuj", "fum", "fun", "fuq", "fur", "fut", "fuu", "fuv", "fuy", "fvr", "fwa", "fwe"], + ["ga", "gd", "gl", "gn", "gu", "gv", "gaa", "gab", "gac", "gad", "gae", "gaf", "gag", "gah", "gai", "gaj", "gak", "gal", "gam", "gan", "gao", "gap", "gaq", "gar", "gas", "gat", "gau", "gav", "gaw", "gax", "gay", "gaz", "gba", "gbb", "gbc", "gbd", "gbe", "gbf", "gbg", "gbh", "gbi", "gbj", "gbk", "gbl", "gbm", "gbn", "gbo", "gbp", "gbq", "gbr", "gbs", "gbu", "gbv", "gbw", "gbx", "gby", "gbz", "gcc", "gcd", "gce", "gcf", "gcl", "gcn", "gcr", "gct", "gda", "gdb", "gdc", "gdd", "gde", "gdf", "gdg", "gdh", "gdi", "gdj", "gdk", "gdl", "gdm", "gdn", "gdo", "gdq", "gdr", "gds", "gdt", "gdu", "gdx", "gea", "geb", "gec", "ged", "gef", "geg", "geh", "gei", "gej", "gek", "gel", "gem", "geq", "ges", "gev", "gew", "gex", "gey", "gez", "gfk", "gft", "gfx", "gga", "ggb", "ggd", "gge", "ggg", "ggk", "ggl", "ggn", "ggo", "ggr", "ggt", "ggu", "ggw", "gha", "ghc", "ghe", "ghh", "ghk", "ghl", "ghn", "gho", "ghr", "ghs", "ght", "gia", "gib", "gic", "gid", "gie", "gig", "gih", "gii", "gil", "gim", "gin", "gio", "gip", "giq", "gir", "gis", "git", "giu", "giw", "gix", "giy", "giz", "gji", "gjk", "gjm", "gjn", "gjr", "gju", "gka", "gkd", "gke", "gkn", "gko", "gkp", "gku", "glb", "glc", "gld", "glh", "gli", "glj", "glk", "gll", "glo", "glr", "glu", "glw", "gly", "gma", "gmb", "gmd", "gme", "gmg", "gmh", "gml", "gmm", "gmn", "gmq", "gmr", "gmu", "gmv", "gmw", "gmx", "gmy", "gmz", "gna", "gnb", "gnc", "gnd", "gne", "gng", "gnh", "gni", "gnj", "gnk", "gnl", "gnm", "gnn", "gno", "gnq", "gnr", "gnt", "gnu", "gnw", "gnz", "goa", "gob", "goc", "god", "goe", "gof", "gog", "goh", "goi", "goj", "gok", "gol", "gom", "gon", "goo", "gop", "goq", "gor", "gos", "got", "gou", "gow", "gox", "goy", "goz", "gpa", "gpe", "gpn", "gqa", "gqi", "gqn", "gqr", "gqu", "gra", "grb", "grc", "grd", "grg", "grh", "gri", "grj", "grk", "grm", "gro", "grq", "grr", "grs", "grt", "gru", "grv", "grw", "grx", "gry", "grz", "gse", "gsg", "gsl", "gsm", "gsn", "gso", "gsp", "gss", "gsw", "gta", "gti", "gtu", "gua", "gub", "guc", "gud", "gue", "guf", "gug", "guh", "gui", "guk", "gul", "gum", "gun", "guo", "gup", "guq", "gur", "gus", "gut", "guu", "guv", "guw", "gux", "guz", "gva", "gvc", "gve", "gvf", "gvj", "gvl", "gvm", "gvn", "gvo", "gvp", "gvr", "gvs", "gvy", "gwa", "gwb", "gwc", "gwd", "gwe", "gwf", "gwg", "gwi", "gwj", "gwm", "gwn", "gwr", "gwt", "gwu", "gww", "gwx", "gxx", "gya", "gyb", "gyd", "gye", "gyf", "gyg", "gyi", "gyl", "gym", "gyn", "gyo", "gyr", "gyy", "gyz", "gza", "gzi", "gzn"], + ["ha", "he", "hi", "ho", "hr", "ht", "hu", "hy", "hz", "haa", "hab", "hac", "had", "hae", "haf", "hag", "hah", "hai", "haj", "hak", "hal", "ham", "han", "hao", "hap", "haq", "har", "has", "hav", "haw", "hax", "hay", "haz", "hba", "hbb", "hbn", "hbo", "hbu", "hca", "hch", "hdn", "hds", "hdy", "hea", "hed", "heg", "heh", "hei", "hem", "hgm", "hgw", "hhi", "hhr", "hhy", "hia", "hib", "hid", "hif", "hig", "hih", "hii", "hij", "hik", "hil", "him", "hio", "hir", "hit", "hiw", "hix", "hji", "hka", "hke", "hkh", "hkk", "hkn", "hks", "hla", "hlb", "hld", "hle", "hlt", "hlu", "hma", "hmb", "hmc", "hmd", "hme", "hmf", "hmg", "hmh", "hmi", "hmj", "hmk", "hml", "hmm", "hmn", "hmp", "hmq", "hmr", "hms", "hmt", "hmu", "hmv", "hmw", "hmx", "hmy", "hmz", "hna", "hnd", "hne", "hng", "hnh", "hni", "hnj", "hnn", "hno", "hns", "hnu", "hoa", "hob", "hoc", "hod", "hoe", "hoh", "hoi", "hoj", "hok", "hol", "hom", "hoo", "hop", "hor", "hos", "hot", "hov", "how", "hoy", "hoz", "hpo", "hps", "hra", "hrc", "hre", "hrk", "hrm", "hro", "hrp", "hrr", "hrt", "hru", "hrw", "hrx", "hrz", "hsb", "hsh", "hsl", "hsn", "hss", "hti", "hto", "hts", "htu", "htx", "hub", "huc", "hud", "hue", "huf", "hug", "huh", "hui", "huj", "huk", "hul", "hum", "huo", "hup", "huq", "hur", "hus", "hut", "huu", "huv", "huw", "hux", "huy", "huz", "hvc", "hve", "hvk", "hvn", "hvv", "hwa", "hwc", "hwo", "hya", "hyw", "hyx"], + ["ia", "id", "ie", "ig", "ii", "ik", "in", "io", "is", "it", "iu", "iw", "iai", "ian", "iap", "iar", "iba", "ibb", "ibd", "ibe", "ibg", "ibh", "ibi", "ibl", "ibm", "ibn", "ibr", "ibu", "iby", "ica", "ich", "icl", "icr", "ida", "idb", "idc", "idd", "ide", "idi", "idr", "ids", "idt", "idu", "ifa", "ifb", "ife", "iff", "ifk", "ifm", "ifu", "ify", "igb", "ige", "igg", "igl", "igm", "ign", "igo", "igs", "igw", "ihb", "ihi", "ihp", "ihw", "iin", "iir", "ijc", "ije", "ijj", "ijn", "ijo", "ijs", "ike", "iki", "ikk", "ikl", "iko", "ikp", "ikr", "iks", "ikt", "ikv", "ikw", "ikx", "ikz", "ila", "ilb", "ilg", "ili", "ilk", "ill", "ilm", "ilo", "ilp", "ils", "ilu", "ilv", "ilw", "ima", "ime", "imi", "iml", "imn", "imo", "imr", "ims", "imy", "inb", "inc", "ine", "ing", "inh", "inj", "inl", "inm", "inn", "ino", "inp", "ins", "int", "inz", "ior", "iou", "iow", "ipi", "ipo", "iqu", "iqw", "ira", "ire", "irh", "iri", "irk", "irn", "iro", "irr", "iru", "irx", "iry", "isa", "isc", "isd", "ise", "isg", "ish", "isi", "isk", "ism", "isn", "iso", "isr", "ist", "isu", "itb", "itc", "itd", "ite", "iti", "itk", "itl", "itm", "ito", "itr", "its", "itt", "itv", "itw", "itx", "ity", "itz", "ium", "ivb", "ivv", "iwk", "iwm", "iwo", "iws", "ixc", "ixl", "iya", "iyo", "iyx", "izh", "izi", "izr", "izz"], + ["ja", "ji", "jv", "jw", "jaa", "jab", "jac", "jad", "jae", "jaf", "jah", "jaj", "jak", "jal", "jam", "jan", "jao", "jaq", "jar", "jas", "jat", "jau", "jax", "jay", "jaz", "jbe", "jbi", "jbj", "jbk", "jbm", "jbn", "jbo", "jbr", "jbt", "jbu", "jbw", "jcs", "jct", "jda", "jdg", "jdt", "jeb", "jee", "jeg", "jeh", "jei", "jek", "jel", "jen", "jer", "jet", "jeu", "jgb", "jge", "jgk", "jgo", "jhi", "jhs", "jia", "jib", "jic", "jid", "jie", "jig", "jih", "jii", "jil", "jim", "jio", "jiq", "jit", "jiu", "jiv", "jiy", "jje", "jjr", "jka", "jkm", "jko", "jkp", "jkr", "jks", "jku", "jle", "jls", "jma", "jmb", "jmc", "jmd", "jmi", "jml", "jmn", "jmr", "jms", "jmw", "jmx", "jna", "jnd", "jng", "jni", "jnj", "jnl", "jns", "job", "jod", "jog", "jor", "jos", "jow", "jpa", "jpr", "jpx", "jqr", "jra", "jrb", "jrr", "jrt", "jru", "jsl", "jua", "jub", "juc", "jud", "juh", "jui", "juk", "jul", "jum", "jun", "juo", "jup", "jur", "jus", "jut", "juu", "juw", "juy", "jvd", "jvn", "jwi", "jya", "jye", "jyy"], + ["ka", "kg", "ki", "kj", "kk", "kl", "km", "kn", "ko", "kr", "ks", "ku", "kv", "kw", "ky", "kaa", "kab", "kac", "kad", "kae", "kaf", "kag", "kah", "kai", "kaj", "kak", "kam", "kao", "kap", "kaq", "kar", "kav", "kaw", "kax", "kay", "kba", "kbb", "kbc", "kbd", "kbe", "kbf", "kbg", "kbh", "kbi", "kbj", "kbk", "kbl", "kbm", "kbn", "kbo", "kbp", "kbq", "kbr", "kbs", "kbt", "kbu", "kbv", "kbw", "kbx", "kby", "kbz", "kca", "kcb", "kcc", "kcd", "kce", "kcf", "kcg", "kch", "kci", "kcj", "kck", "kcl", "kcm", "kcn", "kco", "kcp", "kcq", "kcr", "kcs", "kct", "kcu", "kcv", "kcw", "kcx", "kcy", "kcz", "kda", "kdc", "kdd", "kde", "kdf", "kdg", "kdh", "kdi", "kdj", "kdk", "kdl", "kdm", "kdn", "kdo", "kdp", "kdq", "kdr", "kdt", "kdu", "kdv", "kdw", "kdx", "kdy", "kdz", "kea", "keb", "kec", "ked", "kee", "kef", "keg", "keh", "kei", "kej", "kek", "kel", "kem", "ken", "keo", "kep", "keq", "ker", "kes", "ket", "keu", "kev", "kew", "kex", "key", "kez", "kfa", "kfb", "kfc", "kfd", "kfe", "kff", "kfg", "kfh", "kfi", "kfj", "kfk", "kfl", "kfm", "kfn", "kfo", "kfp", "kfq", "kfr", "kfs", "kft", "kfu", "kfv", "kfw", "kfx", "kfy", "kfz", "kga", "kgb", "kgc", "kgd", "kge", "kgf", "kgg", "kgh", "kgi", "kgj", "kgk", "kgl", "kgm", "kgn", "kgo", "kgp", "kgq", "kgr", "kgs", "kgt", "kgu", "kgv", "kgw", "kgx", "kgy", "kha", "lyg", "khb", "khc", "khd", "khe", "khf", "khg", "khh", "khi", "khj", "khk", "khl", "khn", "kho", "khp", "khq", "khr", "khs", "kht", "khu", "khv", "khw", "khx", "khy", "khz", "kia", "kib", "kic", "kid", "kie", "kif", "kig", "kih", "kii", "kij", "kil", "kim", "kio", "kip", "kiq", "kis", "kit", "kiu", "kiv", "kiw", "kix", "kiy", "kiz", "kja", "kjb", "kjc", "kjd", "kje", "kjf", "kjg", "kjh", "kji", "kjj", "kjk", "kjl", "kjm", "kjn", "kjo", "kjp", "kjq", "kjr", "kjs", "kjt", "kju", "kjv", "kjx", "kjy", "kjz", "kka", "kkb", "kkc", "kkd", "kke", "kkf", "kkg", "kkh", "kki", "kkj", "kkk", "kkl", "kkm", "kkn", "kko", "kkp", "kkq", "kkr", "kks", "kkt", "kku", "kkv", "kkw", "kkx", "kky", "kkz", "kla", "klb", "klc", "kld", "kle", "klf", "klg", "klh", "kli", "klj", "klk", "kll", "klm", "kln", "klo", "klp", "klq", "klr", "kls", "klt", "klu", "klv", "klw", "klx", "kly", "klz", "kma", "kmb", "kmc", "kmd", "kme", "kmf", "kmg", "kmh", "kmi", "kmj", "kmk", "kml", "kmm", "kmn", "kmo", "kmp", "kmq", "kmr", "kms", "kmt", "kmu", "kmv", "kmw", "kmx", "kmy", "kmz", "kna", "knb", "knc", "knd", "kne", "knf", "kng", "kni", "knj", "knk", "knl", "knm", "knn", "kno", "knp", "knq", "knr", "kns", "knt", "knu", "knv", "knw", "knx", "kny", "knz", "koa", "koc", "kod", "koe", "kof", "kog", "koh", "koi", "koj", "kok", "kol", "koo", "kop", "koq", "kos", "kot", "kou", "kov", "kow", "kox", "koy", "koz", "kpa", "kpb", "kpc", "kpd", "kpe", "kpf", "kpg", "kph", "kpi", "kpj", "kpk", "kpl", "kpm", "kpn", "kpo", "kpp", "kpq", "kpr", "kps", "kpt", "kpu", "kpv", "kpw", "kpx", "kpy", "kpz", "kqa", "kqb", "kqc", "kqd", "kqe", "kqf", "kqg", "kqh", "kqi", "kqj", "kqk", "kql", "kqm", "kqn", "kqo", "kqp", "kqq", "kqr", "kqs", "kqt", "kqu", "kqv", "kqw", "kqx", "kqy", "kqz", "kra", "krb", "krc", "krd", "kre", "krf", "krh", "kri", "krj", "krk", "krl", "krm", "krn", "kro", "krp", "krr", "krs", "krt", "kru", "krv", "krw", "krx", "kry", "krz", "ksa", "ksb", "ksc", "ksd", "kse", "ksf", "ksg", "ksh", "ksi", "ksj", "ksk", "ksl", "ksm", "ksn", "kso", "ksp", "ksq", "ksr", "kss", "kst", "ksu", "ksv", "ksw", "ksx", "ksy", "ksz", "kta", "ktb", "ktc", "ktd", "kte", "ktf", "ktg", "kth", "kti", "ktj", "ktk", "ktl", "ktm", "ktn", "kto", "ktp", "ktq", "ktr", "kts", "ktt", "ktu", "ktv", "ktw", "ktx", "kty", "ktz", "kub", "kuc", "kud", "kue", "kuf", "kug", "kuh", "kui", "kuj", "kuk", "kul", "kum", "kun", "kuo", "kup", "kuq", "kus", "kut", "kuu", "kuv", "kuw", "kux", "kuy", "kuz", "kva", "kvb", "kvc", "kvd", "kve", "kvf", "kvg", "kvh", "kvi", "kvj", "kvk", "kvl", "kvm", "kvn", "kvo", "kvp", "kvq", "kvr", "kvs", "kvt", "kvu", "kvv", "kvw", "kvx", "kvy", "kvz", "kwa", "kwb", "kwc", "kwd", "kwe", "kwf", "kwg", "kwh", "kwi", "kwj", "kwk", "kwl", "kwm", "kwn", "kwo", "kwp", "kwq", "kwr", "kws", "kwt", "kwu", "kwv", "kww", "kwx", "kwy", "kwz", "kxa", "kxb", "kxc", "kxd", "kxe", "kxf", "kxh", "kxi", "kxj", "kxk", "kxl", "kxm", "kxn", "kxo", "kxp", "kxq", "kxr", "kxs", "kxt", "kxu", "kxv", "kxw", "kxx", "kxy", "kxz", "kya", "kyb", "kyc", "kyd", "kye", "kyf", "kyg", "kyh", "kyi", "kyj", "kyk", "kyl", "kym", "kyn", "kyo", "kyp", "kyq", "kyr", "kys", "kyt", "kyu", "kyv", "kyw", "kyx", "kyy", "kyz", "kza", "kzb", "kzc", "kzd", "kze", "kzf", "kzg", "kzh", "kzi", "kzj", "kzk", "kzl", "kzm", "kzn", "kzo", "kzp", "kzq", "kzr", "kzs", "kzt", "kzu", "kzv", "kzw", "kzx", "kzy", "kzz"], + ["la", "lb", "lg", "li", "ln", "lo", "lt", "lu", "lv", "laa", "lab", "lac", "lad", "lae", "laf", "lag", "lah", "lai", "laj", "lak", "lal", "lam", "lan", "lap", "laq", "lar", "las", "lau", "law", "lax", "lay", "laz", "lba", "lbb", "lbc", "lbe", "lbf", "lbg", "lbi", "lbj", "lbk", "lbl", "lbm", "lbn", "lbo", "lbq", "lbr", "lbs", "lbt", "lbu", "lbv", "lbw", "lbx", "lby", "lbz", "lcc", "lcd", "lce", "lcf", "lch", "lcl", "lcm", "lcp", "lcq", "lcs", "lda", "ldb", "ldd", "ldg", "ldh", "ldi", "ldj", "ldk", "ldl", "ldm", "ldn", "ldo", "ldp", "ldq", "lea", "leb", "lec", "led", "lee", "lef", "leg", "leh", "lei", "lej", "lek", "lel", "lem", "len", "leo", "lep", "leq", "ler", "les", "let", "leu", "lev", "lew", "lex", "ley", "lez", "lfa", "lfn", "lga", "lgb", "lgg", "lgh", "lgi", "lgk", "lgl", "lgm", "lgn", "lgq", "lgr", "lgt", "lgu", "lgz", "lha", "lhh", "lhi", "lhl", "lhm", "lhn", "lhp", "lhs", "lht", "lhu", "lia", "lib", "lic", "lid", "lie", "lif", "lig", "lih", "lii", "lij", "lik", "lil", "lio", "lip", "liq", "lir", "lis", "liu", "liv", "liw", "lix", "liy", "liz", "lja", "lje", "lji", "ljl", "ljp", "ljw", "ljx", "lka", "lkb", "lkc", "lkd", "lke", "lkh", "lki", "lkj", "lkl", "lkm", "lkn", "lko", "lkr", "lks", "lkt", "lku", "lky", "lla", "llb", "llc", "lld", "lle", "llf", "llg", "llh", "lli", "llj", "llk", "lll", "llm", "lln", "llo", "llp", "llq", "lls", "llu", "llx", "lma", "lmb", "lmc", "lmd", "lme", "lmf", "lmg", "lmh", "lmi", "lmj", "lmk", "lml", "lmm", "lmn", "lmo", "lmp", "lmq", "lmr", "lmu", "lmv", "lmw", "lmx", "lmy", "lmz", "lna", "lnb", "lnd", "lng", "lnh", "lni", "lnj", "lnl", "lnm", "lnn", "lno", "lns", "lnu", "lnw", "lnz", "loa", "lob", "loc", "loe", "lof", "log", "loh", "loi", "loj", "lok", "lol", "lom", "lon", "loo", "lop", "loq", "lor", "los", "lot", "lou", "lov", "low", "lox", "loy", "loz", "lpa", "lpe", "lpn", "lpo", "lpx", "lra", "lrc", "lre", "lrg", "lri", "lrk", "lrl", "lrm", "lrn", "lro", "lrr", "lrt", "lrv", "lrz", "lsa", "lsb", "lsd", "lse", "lsg", "lsh", "lsi", "lsl", "lsm", "lsn", "lso", "lsp", "lsr", "lss", "lst", "lsv", "lsy", "ltc", "ltg", "lth", "lti", "ltn", "lto", "lts", "ltu", "lua", "luc", "lud", "lue", "luf", "lui", "luj", "luk", "lul", "lum", "lun", "luo", "lup", "luq", "lur", "lus", "lut", "luu", "luv", "luw", "luy", "luz", "lva", "lvi", "lvk", "lvs", "lvu", "lwa", "lwe", "lwg", "lwh", "lwl", "lwm", "lwo", "lws", "lwt", "lwu", "lww", "lxm", "lya", "lyg", "lyn", "lzh", "lzl", "lzn", "lzz"], + ["mg", "mh", "mi", "mk", "ml", "mn", "mo", "mr", "ms", "mt", "my", "maa", "mab", "mad", "mae", "maf", "mag", "mai", "maj", "mak", "mam", "man", "map", "maq", "mas", "mat", "mau", "mav", "maw", "max", "maz", "mba", "mbb", "mbc", "mbd", "mbe", "mbf", "mbh", "mbi", "mbj", "mbk", "mbl", "mbm", "mbn", "mbo", "mbp", "mbq", "mbr", "mbs", "mbt", "mbu", "mbv", "mbw", "mbx", "mby", "mbz", "mca", "mcb", "mcc", "mcd", "mce", "mcf", "mcg", "mch", "mci", "mcj", "mck", "mcl", "mcm", "mcn", "mco", "mcp", "mcq", "mcr", "mcs", "mct", "mcu", "mcv", "mcw", "mcx", "mcy", "mcz", "mda", "mdb", "mdc", "mdd", "mde", "mdf", "mdg", "mdh", "mdi", "mdj", "mdk", "mdl", "mdm", "mdn", "mdp", "mdq", "mdr", "mds", "mdt", "mdu", "mdv", "mdw", "mdx", "mdy", "mdz", "mea", "meb", "mec", "med", "mee", "mef", "meg", "meh", "mei", "mej", "mek", "mel", "mem", "men", "meo", "mep", "meq", "mer", "mes", "met", "meu", "mev", "mew", "mey", "mez", "mfa", "mfb", "mfc", "mfd", "mfe", "mff", "mfg", "mfh", "mfi", "mfj", "mfk", "mfl", "mfm", "mfn", "mfo", "mfp", "mfq", "mfr", "mfs", "mft", "mfu", "mfv", "mfw", "mfx", "mfy", "mfz", "mga", "mgb", "mgc", "mgd", "mge", "mgf", "mgg", "mgh", "mgi", "mgj", "mgk", "mgl", "mgm", "mgn", "mgo", "mgp", "mgq", "mgr", "mgs", "mgt", "mgu", "mgv", "mgw", "mgx", "mgy", "mgz", "mha", "mhb", "mhc", "mhd", "mhe", "mhf", "mhg", "mhh", "mhi", "mhj", "mhk", "mhl", "mhm", "mhn", "mho", "mhp", "mhq", "mhr", "mhs", "mht", "mhu", "mhw", "mhx", "mhy", "mhz", "mia", "mib", "mic", "mid", "mie", "mif", "mig", "mih", "mii", "mij", "mik", "mil", "mim", "min", "mio", "mip", "miq", "mir", "mis", "mit", "miu", "miw", "mix", "miy", "miz", "mja", "mjb", "mjc", "mjd", "mje", "mjg", "mjh", "mji", "mjj", "mjk", "mjl", "mjm", "mjn", "mjo", "mjp", "mjq", "mjr", "mjs", "mjt", "mju", "mjv", "mjw", "mjx", "mjy", "mjz", "mka", "mkb", "mkc", "mke", "mkf", "mkg", "mkh", "mki", "mkj", "mkk", "mkl", "mkm", "mkn", "mko", "mkp", "mkq", "mkr", "mks", "mkt", "mku", "mkv", "mkw", "mkx", "mky", "mkz", "mla", "mlb", "mlc", "mld", "mle", "mlf", "mlh", "mli", "mlj", "mlk", "mll", "mlm", "mln", "mlo", "mlp", "mlq", "mlr", "mls", "mlu", "mlv", "mlw", "mlx", "mlz", "mma", "mmb", "mmc", "mmd", "mme", "mmf", "mmg", "mmh", "mmi", "mmj", "mmk", "mml", "mmm", "mmn", "mmo", "mmp", "mmq", "mmr", "mmt", "mmu", "mmv", "mmw", "mmx", "mmy", "mmz", "mna", "mnb", "mnc", "mnd", "mne", "mnf", "mng", "mnh", "mni", "mnj", "mnk", "mnl", "mnm", "mnn", "mno", "mnp", "mnq", "mnr", "mns", "mnt", "mnu", "mnv", "mnw", "mnx", "mny", "mnz", "moa", "moc", "mod", "moe", "mof", "mog", "moh", "moi", "moj", "mok", "mom", "moo", "mop", "moq", "mor", "mos", "mot", "mou", "mov", "mow", "mox", "moy", "moz", "mpa", "mpb", "mpc", "mpd", "mpe", "mpg", "mph", "mpi", "mpj", "mpk", "mpl", "mpm", "mpn", "mpo", "mpp", "mpq", "mpr", "mps", "mpt", "mpu", "mpv", "mpw", "mpx", "mpy", "mpz", "mqa", "mqb", "mqc", "mqe", "mqf", "mqg", "mqh", "mqi", "mqj", "mqk", "mql", "mqm", "mqn", "mqo", "mqp", "mqq", "mqr", "mqs", "mqt", "mqu", "mqv", "mqw", "mqx", "mqy", "mqz", "mra", "mrb", "mrc", "mrd", "mre", "mrf", "mrg", "mrh", "mrj", "mrk", "mrl", "mrm", "mrn", "mro", "mrp", "mrq", "mrr", "mrs", "mrt", "mru", "mrv", "mrw", "mrx", "mry", "mrz", "msb", "msc", "msd", "mse", "msf", "msg", "msh", "msi", "msj", "msk", "msl", "msm", "msn", "mso", "msp", "msq", "msr", "mss", "mst", "msu", "msv", "msw", "msx", "msy", "msz", "mta", "mtb", "mtc", "mtd", "mte", "mtf", "mtg", "mth", "mti", "mtj", "mtk", "mtl", "mtm", "mtn", "mto", "mtp", "mtq", "mtr", "mts", "mtt", "mtu", "mtv", "mtw", "mtx", "mty", "mua", "mub", "muc", "mud", "mue", "mug", "muh", "mui", "muj", "muk", "mul", "mum", "mun", "muo", "mup", "muq", "mur", "mus", "mut", "muu", "muv", "mux", "muy", "muz", "mva", "mvb", "mvd", "mve", "mvf", "mvg", "mvh", "mvi", "mvk", "mvl", "mvm", "mvn", "mvo", "mvp", "mvq", "mvr", "mvs", "mvt", "mvu", "mvv", "mvw", "mvx", "mvy", "mvz", "mwa", "mwb", "mwc", "mwd", "mwe", "mwf", "mwg", "mwh", "mwi", "mwj", "mwk", "mwl", "mwm", "mwn", "mwo", "mwp", "mwq", "mwr", "mws", "mwt", "mwu", "mwv", "mww", "mwx", "mwy", "mwz", "mxa", "mxb", "mxc", "mxd", "mxe", "mxf", "mxg", "mxh", "mxi", "mxj", "mxk", "mxl", "mxm", "mxn", "mxo", "mxp", "mxq", "mxr", "mxs", "mxt", "mxu", "mxv", "mxw", "mxx", "mxy", "mxz", "myb", "myc", "myd", "mye", "myf", "myg", "myh", "myi", "myj", "myk", "myl", "mym", "myn", "myo", "myp", "myq", "myr", "mys", "myt", "myu", "myv", "myw", "myx", "myy", "myz", "mza", "mzb", "mzc", "mzd", "mze", "mzg", "mzh", "mzi", "mzj", "mzk", "mzl", "mzm", "mzn", "mzo", "mzp", "mzq", "mzr", "mzs", "mzt", "mzu", "mzv", "mzw", "mzx", "mzy", "mzz"], + ["na", "nb", "nd", "ne", "ng", "nl", "nn", "no", "nr", "nv", "ny", "naa", "nab", "nac", "nad", "nae", "naf", "nag", "nah", "nai", "naj", "nak", "nal", "nam", "nan", "nao", "nap", "naq", "nar", "nas", "nat", "naw", "nax", "nay", "naz", "nba", "nbb", "nbc", "nbd", "nbe", "nbf", "nbg", "nbh", "nbi", "nbj", "nbk", "nbm", "nbn", "nbo", "nbp", "nbq", "nbr", "nbs", "nbt", "nbu", "nbv", "nbw", "nbx", "nby", "nca", "ncb", "ncc", "ncd", "nce", "ncf", "ncg", "nch", "nci", "ncj", "nck", "ncl", "ncm", "ncn", "nco", "ncp", "ncq", "ncr", "ncs", "nct", "ncu", "ncx", "ncz", "nda", "ndb", "ndc", "ndd", "ndf", "ndg", "ndh", "ndi", "ndj", "ndk", "ndl", "ndm", "ndn", "ndp", "ndq", "ndr", "nds", "ndt", "ndu", "ndv", "ndw", "ndx", "ndy", "ndz", "nea", "neb", "nec", "ned", "nee", "nef", "neg", "neh", "nei", "nej", "nek", "nem", "nen", "neo", "neq", "ner", "nes", "net", "neu", "nev", "new", "nex", "ney", "nez", "nfa", "nfd", "nfl", "nfr", "nfu", "nga", "ngb", "ngc", "ngd", "nge", "ngf", "ngg", "ngh", "ngi", "ngj", "ngk", "ngl", "ngm", "ngn", "ngo", "ngp", "ngq", "ngr", "ngs", "ngt", "ngu", "ngv", "ngw", "ngx", "ngy", "ngz", "nha", "nhb", "nhc", "nhd", "nhe", "nhf", "nhg", "nhh", "nhi", "nhk", "nhm", "nhn", "nho", "nhp", "nhq", "nhr", "nht", "nhu", "nhv", "nhw", "nhx", "nhy", "nhz", "nia", "nib", "nic", "nid", "nie", "nif", "nig", "nih", "nii", "nij", "nik", "nil", "nim", "nin", "nio", "niq", "nir", "nis", "nit", "niu", "niv", "niw", "nix", "niy", "niz", "nja", "njb", "njd", "njh", "nji", "njj", "njl", "njm", "njn", "njo", "njr", "njs", "njt", "nju", "njx", "njy", "njz", "nka", "nkb", "nkc", "nkd", "nke", "nkf", "nkg", "nkh", "nki", "nkj", "nkk", "nkm", "nkn", "nko", "nkp", "nkq", "nkr", "nks", "nkt", "nku", "nkv", "nkw", "nkx", "nkz", "nla", "nlc", "nle", "nlg", "nli", "nlj", "nlk", "nll", "nlm", "nln", "nlo", "nlq", "nlr", "nlu", "nlv", "nlw", "nlx", "nly", "nlz", "nma", "nmb", "nmc", "nmd", "nme", "nmf", "nmg", "nmh", "nmi", "nmj", "nmk", "nml", "nmm", "nmn", "nmo", "nmp", "nmq", "nmr", "nms", "nmt", "nmu", "nmv", "nmw", "nmx", "nmy", "nmz", "nna", "nnb", "nnc", "nnd", "nne", "nnf", "nng", "nnh", "nni", "nnj", "nnk", "nnl", "nnm", "nnn", "nnp", "nnq", "nnr", "nns", "nnt", "nnu", "nnv", "nnw", "nnx", "nny", "nnz", "noa", "noc", "nod", "noe", "nof", "nog", "noh", "noi", "noj", "nok", "nol", "nom", "non", "noo", "nop", "noq", "nos", "not", "nou", "nov", "now", "noy", "noz", "npa", "npb", "npg", "nph", "npi", "npl", "npn", "npo", "nps", "npu", "npx", "npy", "nqg", "nqk", "nql", "nqm", "nqn", "nqo", "nqq", "nqt", "nqy", "nra", "nrb", "nrc", "nre", "nrf", "nrg", "nri", "nrk", "nrl", "nrm", "nrn", "nrp", "nrr", "nrt", "nru", "nrx", "nrz", "nsa", "nsb", "nsc", "nsd", "nse", "nsf", "nsg", "nsh", "nsi", "nsk", "nsl", "nsm", "nsn", "nso", "nsp", "nsq", "nsr", "nss", "nst", "nsu", "nsv", "nsw", "nsx", "nsy", "nsz", "ntd", "nte", "ntg", "nti", "ntj", "ntk", "ntm", "nto", "ntp", "ntr", "nts", "ntu", "ntw", "ntx", "nty", "ntz", "nua", "nub", "nuc", "nud", "nue", "nuf", "nug", "nuh", "nui", "nuj", "nuk", "nul", "num", "nun", "nuo", "nup", "nuq", "nur", "nus", "nut", "nuu", "nuv", "nuw", "nux", "nuy", "nuz", "nvh", "nvm", "nvo", "nwa", "nwb", "nwc", "nwe", "nwg", "nwi", "nwm", "nwo", "nwr", "nwx", "nwy", "nxa", "nxd", "nxe", "nxg", "nxi", "nxk", "nxl", "nxm", "nxn", "nxo", "nxq", "nxr", "nxu", "nxx", "nyb", "nyc", "nyd", "nye", "nyf", "nyg", "nyh", "nyi", "nyj", "nyk", "nyl", "nym", "nyn", "nyo", "nyp", "nyq", "nyr", "nys", "nyt", "nyu", "nyv", "nyw", "nyx", "nyy", "nza", "nzb", "nzd", "nzi", "nzk", "nzm", "nzs", "nzu", "nzy", "nzz"], + ["oc", "oj", "om", "or", "os", "oaa", "oac", "oar", "oav", "obi", "obk", "obl", "obm", "obo", "obr", "obt", "obu", "oca", "och", "ocm", "oco", "ocu", "oda", "odk", "odt", "odu", "ofo", "ofs", "ofu", "ogb", "ogc", "oge", "ogg", "ogo", "ogu", "oht", "ohu", "oia", "oin", "ojb", "ojc", "ojg", "ojp", "ojs", "ojv", "ojw", "oka", "okb", "okc", "okd", "oke", "okg", "okh", "oki", "okj", "okk", "okl", "okm", "okn", "oko", "okr", "oks", "oku", "okv", "okx", "okz", "ola", "old", "ole", "olk", "olm", "olo", "olr", "olt", "olu", "oma", "omb", "omc", "ome", "omg", "omi", "omk", "oml", "omn", "omo", "omp", "omq", "omr", "omt", "omu", "omv", "omw", "omx", "omy", "ona", "onb", "one", "ong", "oni", "onj", "onk", "onn", "ono", "onp", "onr", "ons", "ont", "onu", "onw", "onx", "ood", "oog", "oon", "oor", "oos", "opa", "opk", "opm", "opo", "opt", "opy", "ora", "orc", "ore", "org", "orh", "orn", "oro", "orr", "ors", "ort", "oru", "orv", "orw", "orx", "ory", "orz", "osa", "osc", "osi", "osn", "oso", "osp", "ost", "osu", "osx", "ota", "otb", "otd", "ote", "oti", "otk", "otl", "otm", "otn", "oto", "otq", "otr", "ots", "ott", "otu", "otw", "otx", "oty", "otz", "oua", "oub", "oue", "oui", "oum", "oun", "ovd", "owi", "owl", "oyb", "oyd", "oym", "oyy", "ozm"], + ["pa", "pi", "pl", "ps", "pt", "paa", "pab", "pac", "pad", "pae", "paf", "pag", "pah", "pai", "pak", "pal", "pam", "pao", "pap", "paq", "par", "pas", "pat", "pau", "pav", "paw", "pax", "pay", "paz", "pbb", "pbc", "pbe", "pbf", "pbg", "pbh", "pbi", "pbl", "pbm", "pbn", "pbo", "pbp", "pbr", "pbs", "pbt", "pbu", "pbv", "pby", "pbz", "pca", "pcb", "pcc", "pcd", "pce", "pcf", "pcg", "pch", "pci", "pcj", "pck", "pcl", "pcm", "pcn", "pcp", "pcr", "pcw", "pda", "pdc", "pdi", "pdn", "pdo", "pdt", "pdu", "pea", "peb", "ped", "pee", "pef", "peg", "peh", "pei", "pej", "pek", "pel", "pem", "peo", "pep", "peq", "pes", "pev", "pex", "pey", "pez", "pfa", "pfe", "pfl", "pga", "pgd", "pgg", "pgi", "pgk", "pgl", "pgn", "pgs", "pgu", "pgy", "pgz", "pha", "phd", "phg", "phh", "phi", "phk", "phl", "phm", "phn", "pho", "phq", "phr", "pht", "phu", "phv", "phw", "pia", "pib", "pic", "pid", "pie", "pif", "pig", "pih", "pii", "pij", "pil", "pim", "pin", "pio", "pip", "pir", "pis", "pit", "piu", "piv", "piw", "pix", "piy", "piz", "pjt", "pka", "pkb", "pkc", "pkg", "pkh", "pkn", "pko", "pkp", "pkr", "pks", "pkt", "pku", "pla", "plb", "plc", "pld", "ple", "plf", "plg", "plh", "plj", "plk", "pll", "pln", "plo", "plp", "plq", "plr", "pls", "plt", "plu", "plv", "plw", "ply", "plz", "pma", "pmb", "pmc", "pmd", "pme", "pmf", "pmh", "pmi", "pmj", "pmk", "pml", "pmm", "pmn", "pmo", "pmq", "pmr", "pms", "pmt", "pmu", "pmw", "pmx", "pmy", "pmz", "pna", "pnb", "pnc", "pnd", "pne", "png", "pnh", "pni", "pnj", "pnk", "pnl", "pnm", "pnn", "pno", "pnp", "pnq", "pnr", "pns", "pnt", "pnu", "pnv", "pnw", "pnx", "pny", "pnz", "poc", "pod", "poe", "pof", "pog", "poh", "poi", "pok", "pom", "pon", "poo", "pop", "poq", "pos", "pot", "pov", "pow", "pox", "poy", "poz", "ppa", "ppe", "ppi", "ppk", "ppl", "ppm", "ppn", "ppo", "ppp", "ppq", "ppr", "pps", "ppt", "ppu", "pqa", "pqe", "pqm", "pqw", "pra", "prb", "prc", "prd", "pre", "prf", "prg", "prh", "pri", "prk", "prl", "prm", "prn", "pro", "prp", "prq", "prr", "prs", "prt", "pru", "prw", "prx", "pry", "prz", "psa", "psc", "psd", "pse", "psg", "psh", "psi", "psl", "psm", "psn", "pso", "psp", "psq", "psr", "pss", "pst", "psu", "psw", "psy", "pta", "pth", "pti", "ptn", "pto", "ptp", "ptq", "ptr", "ptt", "ptu", "ptv", "ptw", "pty", "pua", "pub", "puc", "pud", "pue", "puf", "pug", "pui", "puj", "puk", "pum", "puo", "pup", "puq", "pur", "put", "puu", "puw", "pux", "puy", "puz", "pwa", "pwb", "pwg", "pwi", "pwm", "pwn", "pwo", "pwr", "pww", "pxm", "pye", "pym", "pyn", "pys", "pyu", "pyx", "pyy", "pzn"], + ["qu", "qua", "qub", "quc", "qud", "quf", "qug", "quh", "qui", "quk", "qul", "qum", "qun", "qup", "quq", "qur", "qus", "quv", "quw", "qux", "quy", "quz", "qva", "qvc", "qve", "qvh", "qvi", "qvj", "qvl", "qvm", "qvn", "qvo", "qvp", "qvs", "qvw", "qvy", "qvz", "qwa", "qwc", "qwe", "qwh", "qwm", "qws", "qwt", "qxa", "qxc", "qxh", "qxl", "qxn", "qxo", "qxp", "qxq", "qxr", "qxs", "qxt", "qxu", "qxw", "qya", "qyp"], + ["rm", "rn", "ro", "ru", "rw", "raa", "rab", "rac", "rad", "raf", "rag", "rah", "rai", "raj", "rak", "ral", "ram", "ran", "rao", "rap", "raq", "rar", "ras", "rat", "rau", "rav", "raw", "rax", "ray", "raz", "rbb", "rbk", "rbl", "rbp", "rcf", "rdb", "rea", "reb", "ree", "reg", "rei", "rej", "rel", "rem", "ren", "rer", "res", "ret", "rey", "rga", "rge", "rgk", "rgn", "rgr", "rgs", "rgu", "rhg", "rhp", "ria", "rie", "rif", "ril", "rim", "rin", "rir", "rit", "riu", "rjg", "rji", "rjs", "rka", "rkb", "rkh", "rki", "rkm", "rkt", "rkw", "rma", "rmb", "rmc", "rmd", "rme", "rmf", "rmg", "rmh", "rmi", "rmk", "rml", "rmm", "rmn", "rmo", "rmp", "rmq", "rmr", "rms", "rmt", "rmu", "rmv", "rmw", "rmx", "rmy", "rmz", "rna", "rnd", "rng", "rnl", "rnn", "rnp", "rnr", "rnw", "roa", "rob", "roc", "rod", "roe", "rof", "rog", "rol", "rom", "roo", "rop", "ror", "rou", "row", "rpn", "rpt", "rri", "rro", "rrt", "rsb", "rsi", "rsl", "rsm", "rtc", "rth", "rtm", "rts", "rtw", "rub", "ruc", "rue", "ruf", "rug", "ruh", "rui", "ruk", "ruo", "rup", "ruq", "rut", "ruu", "ruy", "ruz", "rwa", "rwk", "rwl", "rwm", "rwo", "rwr", "rxd", "rxw", "ryn", "rys", "ryu", "rzh"], + ["sa", "sc", "sd", "se", "sg", "sh", "si", "sk", "sl", "sm", "sn", "so", "sq", "sr", "ss", "st", "su", "sv", "sw", "saa", "sab", "sac", "sad", "sae", "saf", "sah", "sai", "saj", "sak", "sal", "sam", "sao", "sap", "saq", "sar", "sas", "sat", "sau", "sav", "saw", "sax", "say", "saz", "sba", "sbb", "sbc", "sbd", "sbe", "sbf", "sbg", "sbh", "sbi", "sbj", "sbk", "sbl", "sbm", "sbn", "sbo", "sbp", "sbq", "sbr", "sbs", "sbt", "sbu", "sbv", "sbw", "sbx", "sby", "sbz", "sca", "scb", "sce", "scf", "scg", "sch", "sci", "sck", "scl", "scn", "sco", "scp", "scq", "scs", "sct", "scu", "scv", "scw", "scx", "sda", "sdb", "sdc", "sde", "sdf", "sdg", "sdh", "sdj", "sdk", "sdl", "sdm", "sdn", "sdo", "sdp", "sdq", "sdr", "sds", "sdt", "sdu", "sdv", "sdx", "sdz", "sea", "seb", "sec", "sed", "see", "sef", "seg", "seh", "sei", "sej", "sek", "sel", "sem", "sen", "seo", "sep", "seq", "ser", "ses", "set", "seu", "sev", "sew", "sey", "sez", "sfb", "sfe", "sfm", "sfs", "sfw", "sga", "sgb", "sgc", "sgd", "sge", "sgg", "sgh", "sgi", "sgj", "sgk", "sgl", "sgm", "sgn", "sgo", "sgp", "sgr", "sgs", "sgt", "sgu", "sgw", "sgx", "sgy", "sgz", "sha", "shb", "shc", "shd", "she", "shg", "shh", "shi", "shj", "shk", "shl", "shm", "shn", "sho", "shp", "shq", "shr", "shs", "sht", "shu", "shv", "shw", "shx", "shy", "shz", "sia", "sib", "sid", "sie", "sif", "sig", "sih", "sii", "sij", "sik", "sil", "sim", "sio", "sip", "siq", "sir", "sis", "sit", "siu", "siv", "siw", "six", "siy", "siz", "sja", "sjb", "sjd", "sje", "sjg", "sjk", "sjl", "sjm", "sjn", "sjo", "sjp", "sjr", "sjs", "sjt", "sju", "sjw", "ska", "skb", "skc", "skd", "ske", "skf", "skg", "skh", "ski", "skj", "skk", "skm", "skn", "sko", "skp", "skq", "skr", "sks", "skt", "sku", "skv", "skw", "skx", "sky", "skz", "sla", "slc", "sld", "sle", "slf", "slg", "slh", "sli", "slj", "sll", "slm", "sln", "slp", "slq", "slr", "sls", "slt", "slu", "slw", "slx", "sly", "slz", "sma", "smb", "smc", "smd", "smf", "smg", "smh", "smi", "smj", "smk", "sml", "smm", "smn", "smp", "smq", "smr", "sms", "smt", "smu", "smv", "smw", "smx", "smy", "smz", "snb", "snc", "sne", "snf", "sng", "snh", "sni", "snj", "snk", "snl", "snm", "snn", "sno", "snp", "snq", "snr", "sns", "snu", "snv", "snw", "snx", "sny", "snz", "soa", "sob", "soc", "sod", "soe", "sog", "soh", "soi", "soj", "sok", "sol", "son", "soo", "sop", "soq", "sor", "sos", "sou", "sov", "sow", "sox", "soy", "soz", "spb", "spc", "spd", "spe", "spg", "spi", "spk", "spl", "spm", "spn", "spo", "spp", "spq", "spr", "sps", "spt", "spu", "spv", "spx", "spy", "sqa", "sqh", "sqj", "sqk", "sqm", "sqn", "sqo", "sqq", "sqr", "sqs", "sqt", "squ", "sqx", "sra", "srb", "src", "sre", "srf", "srg", "srh", "sri", "srk", "srl", "srm", "srn", "sro", "srq", "srr", "srs", "srt", "sru", "srv", "srw", "srx", "sry", "srz", "ssa", "ssb", "ssc", "ssd", "sse", "ssf", "ssg", "ssh", "ssi", "ssj", "ssk", "ssl", "ssm", "ssn", "sso", "ssp", "ssq", "ssr", "sss", "sst", "ssu", "ssv", "ssx", "ssy", "ssz", "sta", "stb", "std", "ste", "stf", "stg", "sth", "sti", "stj", "stk", "stl", "stm", "stn", "sto", "stp", "stq", "str", "sts", "stt", "stu", "stv", "stw", "sty", "sua", "sub", "suc", "sue", "sug", "sui", "suj", "suk", "sul", "sum", "suo", "suq", "sur", "sus", "sut", "suv", "suw", "sux", "suy", "suz", "sva", "svb", "svc", "sve", "svk", "svm", "svr", "svs", "svx", "swb", "swc", "swf", "swg", "swh", "swi", "swj", "swk", "swl", "swm", "swn", "swo", "swp", "swq", "swr", "sws", "swt", "swu", "swv", "sww", "swx", "swy", "sxb", "sxc", "sxe", "sxg", "sxk", "sxl", "sxm", "sxn", "sxo", "sxr", "sxs", "sxu", "sxw", "sya", "syb", "syc", "syd", "syi", "syk", "syl", "sym", "syn", "syo", "syr", "sys", "syw", "syx", "syy", "sza", "szb", "szc", "szd", "sze", "szg", "szl", "szn", "szp", "szs", "szv", "szw", "szy"], + ["ta", "te", "tg", "th", "ti", "tk", "tl", "tn", "to", "tr", "ts", "tt", "tw", "ty", "taa", "tab", "tac", "tad", "tae", "taf", "tag", "tai", "taj", "tak", "tal", "tan", "tao", "tap", "taq", "tar", "tas", "tau", "tav", "taw", "tax", "tay", "taz", "tba", "tbb", "tbc", "tbd", "tbe", "tbf", "tbg", "tbh", "tbi", "tbj", "tbk", "tbl", "tbm", "tbn", "tbo", "tbp", "tbq", "tbr", "tbs", "tbt", "tbu", "tbv", "tbw", "tbx", "tby", "tbz", "tca", "tcb", "tcc", "tcd", "tce", "tcf", "tcg", "tch", "tci", "tck", "tcl", "tcm", "tcn", "tco", "tcp", "tcq", "tcs", "tct", "tcu", "tcw", "tcx", "tcy", "tcz", "tda", "tdb", "tdc", "tdd", "tde", "tdf", "tdg", "tdh", "tdi", "tdj", "tdk", "tdl", "tdm", "tdn", "tdo", "tdq", "tdr", "tds", "tdt", "tdu", "tdv", "tdx", "tdy", "tea", "teb", "tec", "ted", "tee", "tef", "teg", "teh", "tei", "tek", "tem", "ten", "teo", "tep", "teq", "ter", "tes", "tet", "teu", "tev", "tew", "tex", "tey", "tez", "tfi", "tfn", "tfo", "tfr", "tft", "tga", "tgb", "tgc", "tgd", "tge", "tgf", "tgg", "tgh", "tgi", "tgj", "tgn", "tgo", "tgp", "tgq", "tgr", "tgs", "tgt", "tgu", "tgv", "tgw", "tgx", "tgy", "tgz", "thc", "thd", "the", "thf", "thh", "thi", "thk", "thl", "thm", "thn", "thp", "thq", "thr", "ths", "tht", "thu", "thv", "thw", "thx", "thy", "thz", "tia", "tic", "tid", "tie", "tif", "tig", "tih", "tii", "tij", "tik", "til", "tim", "tin", "tio", "tip", "tiq", "tis", "tit", "tiu", "tiv", "tiw", "tix", "tiy", "tiz", "tja", "tjg", "tji", "tjj", "tjl", "tjm", "tjn", "tjo", "tjp", "tjs", "tju", "tjw", "tka", "tkb", "tkd", "tke", "tkf", "tkg", "tkk", "tkl", "tkm", "tkn", "tkp", "tkq", "tkr", "tks", "tkt", "tku", "tkv", "tkw", "tkx", "tkz", "tla", "tlb", "tlc", "tld", "tlf", "tlg", "tlh", "tli", "tlj", "tlk", "tll", "tlm", "tln", "tlo", "tlp", "tlq", "tlr", "tls", "tlt", "tlu", "tlv", "tlw", "tlx", "tly", "tma", "tmb", "tmc", "tmd", "tme", "tmf", "tmg", "tmh", "tmi", "tmj", "tmk", "tml", "tmm", "tmn", "tmo", "tmp", "tmq", "tmr", "tms", "tmt", "tmu", "tmv", "tmw", "tmy", "tmz", "tna", "tnb", "tnc", "tnd", "tne", "tnf", "tng", "tnh", "tni", "tnk", "tnl", "tnm", "tnn", "tno", "tnp", "tnq", "tnr", "tns", "tnt", "tnu", "tnv", "tnw", "tnx", "tny", "tnz", "tob", "toc", "tod", "toe", "tof", "tog", "toh", "toi", "toj", "tol", "tom", "too", "top", "toq", "tor", "tos", "tou", "tov", "tow", "tox", "toy", "toz", "tpa", "tpc", "tpe", "tpf", "tpg", "tpi", "tpj", "tpk", "tpl", "tpm", "tpn", "tpo", "tpp", "tpq", "tpr", "tpt", "tpu", "tpv", "tpw", "tpx", "tpy", "tpz", "tqb", "tql", "tqm", "tqn", "tqo", "tqp", "tqq", "tqr", "tqt", "tqu", "tqw", "tra", "trb", "trc", "trd", "tre", "trf", "trg", "trh", "tri", "trj", "trk", "trl", "trm", "trn", "tro", "trp", "trq", "trr", "trs", "trt", "tru", "trv", "trw", "trx", "try", "trz", "tsa", "tsb", "tsc", "tsd", "tse", "tsf", "tsg", "tsh", "tsi", "tsj", "tsk", "tsl", "tsm", "tsp", "tsq", "tsr", "tss", "tst", "tsu", "tsv", "tsw", "tsx", "tsy", "tsz", "tta", "ttb", "ttc", "ttd", "tte", "ttf", "ttg", "tth", "tti", "ttj", "ttk", "ttl", "ttm", "ttn", "tto", "ttp", "ttq", "ttr", "tts", "ttt", "ttu", "ttv", "ttw", "tty", "ttz", "tua", "tub", "tuc", "tud", "tue", "tuf", "tug", "tuh", "tui", "tuj", "tul", "tum", "tun", "tuo", "tup", "tuq", "tus", "tut", "tuu", "tuv", "tuw", "tux", "tuy", "tuz", "tva", "tvd", "tve", "tvk", "tvl", "tvm", "tvn", "tvo", "tvs", "tvt", "tvu", "tvw", "tvx", "tvy", "twa", "twb", "twc", "twd", "twe", "twf", "twg", "twh", "twl", "twm", "twn", "two", "twp", "twq", "twr", "twt", "twu", "tww", "twx", "twy", "txa", "txb", "txc", "txe", "txg", "txh", "txi", "txj", "txm", "txn", "txo", "txq", "txr", "txs", "txt", "txu", "txx", "txy", "tya", "tye", "tyh", "tyi", "tyj", "tyl", "tyn", "typ", "tyr", "tys", "tyt", "tyu", "tyv", "tyx", "tyy", "tyz", "tza", "tzh", "tzj", "tzl", "tzm", "tzn", "tzo", "tzx"], + ["ug", "uk", "ur", "uz", "uam", "uan", "uar", "uba", "ubi", "ubl", "ubr", "ubu", "uby", "uda", "ude", "udg", "udi", "udj", "udl", "udm", "udu", "ues", "ufi", "uga", "ugb", "uge", "ugn", "ugo", "ugy", "uha", "uhn", "uis", "uiv", "uji", "uka", "ukg", "ukh", "uki", "ukk", "ukl", "ukp", "ukq", "uks", "uku", "ukv", "ukw", "uky", "ula", "ulb", "ulc", "ule", "ulf", "uli", "ulk", "ull", "ulm", "uln", "ulu", "ulw", "uma", "umb", "umc", "umd", "umg", "umi", "umm", "umn", "umo", "ump", "umr", "ums", "umu", "una", "und", "une", "ung", "uni", "unk", "unm", "unn", "unp", "unr", "unu", "unx", "unz", "uok", "upi", "upv", "ura", "urb", "urc", "ure", "urf", "urg", "urh", "uri", "urj", "urk", "url", "urm", "urn", "uro", "urp", "urr", "urt", "uru", "urv", "urw", "urx", "ury", "urz", "usa", "ush", "usi", "usk", "usp", "uss", "usu", "uta", "ute", "uth", "utp", "utr", "utu", "uum", "uun", "uur", "uuu", "uve", "uvh", "uvl", "uwa", "uya", "uzn", "uzs"], + ["ve", "vi", "vo", "vaa", "vae", "vaf", "vag", "vah", "vai", "vaj", "val", "vam", "van", "vao", "vap", "var", "vas", "vau", "vav", "vay", "vbb", "vbk", "vec", "ved", "vel", "vem", "veo", "vep", "ver", "vgr", "vgt", "vic", "vid", "vif", "vig", "vil", "vin", "vis", "vit", "viv", "vka", "vki", "vkj", "vkk", "vkl", "vkm", "vkn", "vko", "vkp", "vkt", "vku", "vkz", "vlp", "vls", "vma", "vmb", "vmc", "vmd", "vme", "vmf", "vmg", "vmh", "vmi", "vmj", "vmk", "vml", "vmm", "vmp", "vmq", "vmr", "vms", "vmu", "vmv", "vmw", "vmx", "vmy", "vmz", "vnk", "vnm", "vnp", "vor", "vot", "vra", "vro", "vrs", "vrt", "vsi", "vsl", "vsv", "vto", "vum", "vun", "vut", "vwa"], + ["wa", "wo", "waa", "wab", "wac", "wad", "wae", "waf", "wag", "wah", "wai", "waj", "wak", "wal", "wam", "wan", "wao", "wap", "waq", "war", "was", "wat", "wau", "wav", "waw", "wax", "way", "waz", "wba", "wbb", "wbe", "wbf", "wbh", "wbi", "wbj", "wbk", "wbl", "wbm", "wbp", "wbq", "wbr", "wbs", "wbt", "wbv", "wbw", "wca", "wci", "wdd", "wdg", "wdj", "wdk", "wdu", "wdy", "wea", "wec", "wed", "weg", "weh", "wei", "wem", "wen", "weo", "wep", "wer", "wes", "wet", "weu", "wew", "wfg", "wga", "wgb", "wgg", "wgi", "wgo", "wgu", "wgw", "wgy", "wha", "whg", "whk", "whu", "wib", "wic", "wie", "wif", "wig", "wih", "wii", "wij", "wik", "wil", "wim", "win", "wir", "wit", "wiu", "wiv", "wiw", "wiy", "wja", "wji", "wka", "wkb", "wkd", "wkl", "wkr", "wku", "wkw", "wky", "wla", "wlc", "wle", "wlg", "wlh", "wli", "wlk", "wll", "wlm", "wlo", "wlr", "wls", "wlu", "wlv", "wlw", "wlx", "wly", "wma", "wmb", "wmc", "wmd", "wme", "wmg", "wmh", "wmi", "wmm", "wmn", "wmo", "wms", "wmt", "wmw", "wmx", "wnb", "wnc", "wnd", "wne", "wng", "wni", "wnk", "wnm", "wnn", "wno", "wnp", "wnu", "wnw", "wny", "woa", "wob", "woc", "wod", "woe", "wof", "wog", "woi", "wok", "wom", "won", "woo", "wor", "wos", "wow", "woy", "wpc", "wra", "wrb", "wrd", "wrg", "wrh", "wri", "wrk", "wrl", "wrm", "wrn", "wro", "wrp", "wrr", "wrs", "wru", "wrv", "wrw", "wrx", "wry", "wrz", "wsa", "wsg", "wsi", "wsk", "wsr", "wss", "wsu", "wsv", "wtf", "wth", "wti", "wtk", "wtm", "wtw", "wua", "wub", "wud", "wuh", "wul", "wum", "wun", "wur", "wut", "wuu", "wuv", "wux", "wuy", "wwa", "wwb", "wwo", "wwr", "www", "wxa", "wxw", "wya", "wyb", "wyi", "wym", "wyr", "wyy"], + ["xh", "xaa", "xab", "xac", "xad", "xae", "xag", "xai", "xaj", "xak", "xal", "xam", "xan", "xao", "xap", "xaq", "xar", "xas", "xat", "xau", "xav", "xaw", "xay", "xba", "xbb", "xbc", "xbd", "xbe", "xbg", "xbi", "xbj", "xbm", "xbn", "xbo", "xbp", "xbr", "xbw", "xbx", "xby", "xcb", "xcc", "xce", "xcg", "xch", "xcl", "xcm", "xcn", "xco", "xcr", "xct", "xcu", "xcv", "xcw", "xcy", "xda", "xdc", "xdk", "xdm", "xdo", "xdy", "xeb", "xed", "xeg", "xel", "xem", "xep", "xer", "xes", "xet", "xeu", "xfa", "xga", "xgb", "xgd", "xgf", "xgg", "xgi", "xgl", "xgm", "xgn", "xgr", "xgu", "xgw", "xha", "xhc", "xhd", "xhe", "xhr", "xht", "xhu", "xhv", "xia", "xib", "xii", "xil", "xin", "xip", "xir", "xis", "xiv", "xiy", "xjb", "xjt", "xka", "xkb", "xkc", "xkd", "xke", "xkf", "xkg", "xkh", "xki", "xkj", "xkk", "xkl", "xkn", "xko", "xkp", "xkq", "xkr", "xks", "xkt", "xku", "xkv", "xkw", "xkx", "xky", "xkz", "xla", "xlb", "xlc", "xld", "xle", "xlg", "xli", "xln", "xlo", "xlp", "xls", "xlu", "xly", "xma", "xmb", "xmc", "xmd", "xme", "xmf", "xmg", "xmh", "xmj", "xmk", "xml", "xmm", "xmn", "xmo", "xmp", "xmq", "xmr", "xms", "xmt", "xmu", "xmv", "xmw", "xmx", "xmy", "xmz", "xna", "xnb", "xnd", "xng", "xnh", "xni", "xnj", "xnk", "xnm", "xnn", "xno", "xnq", "xnr", "xns", "xnt", "xnu", "xny", "xnz", "xoc", "xod", "xog", "xoi", "xok", "xom", "xon", "xoo", "xop", "xor", "xow", "xpa", "xpb", "xpc", "xpd", "xpe", "xpf", "xpg", "xph", "xpi", "xpj", "xpk", "xpl", "xpm", "xpn", "xpo", "xpp", "xpq", "xpr", "xps", "xpt", "xpu", "xpv", "xpw", "xpx", "xpy", "xpz", "xqa", "xqt", "xra", "xrb", "xrd", "xre", "xrg", "xri", "xrm", "xrn", "xrq", "xrr", "xrt", "xru", "xrw", "xsa", "xsb", "xsc", "xsd", "xse", "xsh", "xsi", "xsj", "xsl", "xsm", "xsn", "xso", "xsp", "xsq", "xsr", "xss", "xsu", "xsv", "xsy", "xta", "xtb", "xtc", "xtd", "xte", "xtg", "xth", "xti", "xtj", "xtl", "xtm", "xtn", "xto", "xtp", "xtq", "xtr", "xts", "xtt", "xtu", "xtv", "xtw", "xty", "xtz", "xua", "xub", "xud", "xug", "xuj", "xul", "xum", "xun", "xuo", "xup", "xur", "xut", "xuu", "xve", "xvi", "xvn", "xvo", "xvs", "xwa", "xwc", "xwd", "xwe", "xwg", "xwj", "xwk", "xwl", "xwo", "xwr", "xwt", "xww", "xxb", "xxk", "xxm", "xxr", "xxt", "xya", "xyb", "xyj", "xyk", "xyl", "xyt", "xyy", "xzh", "xzm", "xzp"], + ["yi", "yo", "yaa", "yab", "yac", "yad", "yae", "yaf", "yag", "yah", "yai", "yaj", "yak", "yal", "yam", "yan", "yao", "yap", "yaq", "yar", "yas", "yat", "yau", "yav", "yaw", "yax", "yay", "yaz", "yba", "ybb", "ybd", "ybe", "ybh", "ybi", "ybj", "ybk", "ybl", "ybm", "ybn", "ybo", "ybx", "yby", "ych", "ycl", "ycn", "ycp", "yda", "ydd", "yde", "ydg", "ydk", "yds", "yea", "yec", "yee", "yei", "yej", "yel", "yen", "yer", "yes", "yet", "yeu", "yev", "yey", "yga", "ygi", "ygl", "ygm", "ygp", "ygr", "ygs", "ygu", "ygw", "yha", "yhd", "yhl", "yhs", "yia", "yif", "yig", "yih", "yii", "yij", "yik", "yil", "yim", "yin", "yip", "yiq", "yir", "yis", "yit", "yiu", "yiv", "yix", "yiy", "yiz", "yka", "ykg", "yki", "ykk", "ykl", "ykm", "ykn", "yko", "ykr", "ykt", "yku", "yky", "yla", "ylb", "yle", "ylg", "yli", "yll", "ylm", "yln", "ylo", "ylr", "ylu", "yly", "yma", "ymb", "ymc", "ymd", "yme", "ymg", "ymh", "ymi", "ymk", "yml", "ymm", "ymn", "ymo", "ymp", "ymq", "ymr", "yms", "ymt", "ymx", "ymz", "yna", "ynd", "yne", "yng", "ynh", "ynk", "ynl", "ynn", "yno", "ynq", "yns", "ynu", "yob", "yog", "yoi", "yok", "yol", "yom", "yon", "yos", "yot", "yox", "yoy", "ypa", "ypb", "ypg", "yph", "ypk", "ypm", "ypn", "ypo", "ypp", "ypz", "yra", "yrb", "yre", "yri", "yrk", "yrl", "yrm", "yrn", "yro", "yrs", "yrw", "yry", "ysc", "ysd", "ysg", "ysl", "ysm", "ysn", "yso", "ysp", "ysr", "yss", "ysy", "yta", "ytl", "ytp", "ytw", "yty", "yua", "yub", "yuc", "yud", "yue", "yuf", "yug", "yui", "yuj", "yuk", "yul", "yum", "yun", "yup", "yuq", "yur", "yut", "yuu", "yuw", "yux", "yuy", "yuz", "yva", "yvt", "ywa", "ywg", "ywl", "ywn", "ywq", "ywr", "ywt", "ywu", "yww", "yxa", "yxg", "yxl", "yxm", "yxu", "yxy", "yyr", "yyu", "yyz", "yzg", "yzk"], + ["za", "zh", "zu", "zaa", "zab", "zac", "zad", "zae", "zaf", "zag", "zah", "zai", "zaj", "zak", "zal", "zam", "zao", "zap", "zaq", "zar", "zas", "zat", "zau", "zav", "zaw", "zax", "zay", "zaz", "zba", "zbc", "zbe", "zbl", "zbt", "zbu", "zbw", "zca", "zch", "zdj", "zea", "zeg", "zeh", "zen", "zga", "zgb", "zgh", "zgm", "zgn", "zgr", "zhb", "zhd", "zhi", "zhn", "zhw", "zhx", "zia", "zib", "zik", "zil", "zim", "zin", "zir", "ziw", "ziz", "zka", "zkb", "zkd", "zkg", "zkh", "zkk", "zkn", "zko", "zkp", "zkr", "zkt", "zku", "zkv", "zkz", "zla", "zle", "zlj", "zlm", "zln", "zlq", "zls", "zlw", "zma", "zmb", "zmc", "zmd", "zme", "zmf", "zmg", "zmh", "zmi", "zmj", "zmk", "zml", "zmm", "zmn", "zmo", "zmp", "zmq", "zmr", "zms", "zmt", "zmu", "zmv", "zmw", "zmx", "zmy", "zmz", "zna", "znd", "zne", "zng", "znk", "zns", "zoc", "zoh", "zom", "zoo", "zoq", "zor", "zos", "zpa", "zpb", "zpc", "zpd", "zpe", "zpf", "zpg", "zph", "zpi", "zpj", "zpk", "zpl", "zpm", "zpn", "zpo", "zpp", "zpq", "zpr", "zps", "zpt", "zpu", "zpv", "zpw", "zpx", "zpy", "zpz", "zqe", "zra", "zrg", "zrn", "zro", "zrp", "zrs", "zsa", "zsk", "zsl", "zsm", "zsr", "zsu", "zte", "ztg", "ztl", "ztm", "ztn", "ztp", "ztq", "zts", "ztt", "ztu", "ztx", "zty", "zua", "zuh", "zum", "zun", "zuy", "zwa", "zxx", "zyb", "zyg", "zyj", "zyn", "zyp", "zza", "zzj"] +]; +var LangUtil = /** @class */ (function () { + function LangUtil() { + } + /* Determine if given string is a valid BCP 47 string */ + LangUtil.isBcp47 = function (langStr) { + return /^(([a-zA-Z]{2,3}(-[a-zA-Z](-[a-zA-Z]{3}){0,2})?|[a-zA-Z]{4}|[a-zA-Z]{5,8})(-[a-zA-Z]{4})?(-([a-zA-Z]{2}|[0-9]{3}))?(-([0-9a-zA-Z]{5,8}|[0-9][a-zA-Z]{3}))*(-[0-9a-wy-zA-WY-Z](-[a-zA-Z0-9]{2,8})+)*(-x(-[a-zA-Z0-9]{1,8})+)?|x(-[a-zA-Z0-9]{1,8})+|(en-GB-oed|i-ami|i-bnn|i-default|i-enochian|i-hak|i-klingon|i-lux|i-mingo|i-navajo|i-pwn|i-tao|i-tay|i-tsu|sgn-BE-FR|sgn-BE-NL|sgn-CH-DE|art-lojban|cel-gaulish|no-bok|no-nyn|zh-guoyu|zh-hakka|zh-min|zh-min-nan|zh-xiang))$/.test(langStr); + }; + LangUtil.validPrimaryLang = function (langStr) { + var primary = langStr.toLowerCase(); + if (primary.includes("-")) { + primary = primary.split("-")[0]; + } + if (!primary.match(/[a-z]{2,3}/)) + return false; + // qaa..qtz + if (primary.length === 3 + && primary.charAt(0) === "q" + && primary.charCodeAt(1) >= 97 && primary.charCodeAt(1) <= 116 + && primary.charCodeAt(2) >= 97 && primary.charCodeAt(2) <= 122) { + } + return validPrimaryLangs[primary.charCodeAt(0) - 97].includes(primary); + }; + LangUtil.matchPrimaryLang = function (lang1, lang2) { + var primary1 = lang1; + if (primary1.includes("-")) { + primary1 = primary1.split("-")[0]; + } + var primary2 = lang2; + if (primary2.includes("-")) { + primary2 = primary2.split("-")[0]; + } + return primary1.toLowerCase() === primary2.toLowerCase(); + }; + return LangUtil; +}()); +exports.LangUtil = LangUtil; + + +/***/ }), + +/***/ "./src/v2/checker/accessibility/util/legacy.ts": +/*!*****************************************************!*\ + !*** ./src/v2/checker/accessibility/util/legacy.ts ***! + \*****************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + + +/****************************************************************************** + Copyright:: 2020- IBM, Inc + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + *****************************************************************************/ +var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) { + if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } + } + return to.concat(ar || Array.prototype.slice.call(from)); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NodeWalker = exports.RPTUtil = void 0; +var CacheUtil_1 = __webpack_require__(/*! ../../../../v4/util/CacheUtil */ "./src/v4/util/CacheUtil.ts"); +var ARIADefinitions_1 = __webpack_require__(/*! ../../../aria/ARIADefinitions */ "./src/v2/aria/ARIADefinitions.ts"); +var ARIAMapper_1 = __webpack_require__(/*! ../../../aria/ARIAMapper */ "./src/v2/aria/ARIAMapper.ts"); +var DOMWalker_1 = __webpack_require__(/*! ../../../dom/DOMWalker */ "./src/v2/dom/DOMWalker.ts"); +var VisUtil_1 = __webpack_require__(/*! ../../../dom/VisUtil */ "./src/v2/dom/VisUtil.ts"); +var fragment_1 = __webpack_require__(/*! ./fragment */ "./src/v2/checker/accessibility/util/fragment.ts"); +var CSSUtil_1 = __webpack_require__(/*! ../../../../v4/util/CSSUtil */ "./src/v4/util/CSSUtil.ts"); +var DOMUtil_1 = __webpack_require__(/*! ../../../dom/DOMUtil */ "./src/v2/dom/DOMUtil.ts"); +var DOMMapper_1 = __webpack_require__(/*! ../../../dom/DOMMapper */ "./src/v2/dom/DOMMapper.ts"); +var RPTUtil = /** @class */ (function () { + function RPTUtil() { + } + RPTUtil.isDefinedAriaAttributeAtIndex = function (ele, index) { + var attrName = ele.attributes[index].name; + return RPTUtil.isDefinedAriaAttribute(ele, attrName); + }; + /** + * this method returns user-defined aria attribute name from dom + * @param ele element + * @returns user defined aria attributes + */ + RPTUtil.getUserDefinedAriaAttributes = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push(attrName); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name from dom + * @param ele element + * @returns user defined html attributes + */ + RPTUtil.getUserDefinedHtmlAttributes = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push(attrName); + } + } + return htmlAttributes; + }; + /** + * this method returns user-defined aria attribute name-value pair from dom + * @param ele element + * @returns user defined aria attributes + */ + RPTUtil.getUserDefinedAriaAttributeNameValuePairs = function (elem) { + var ariaAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (isAria) + ariaAttributes.push({ name: attrName, value: attrValue }); + } + } + return ariaAttributes; + }; + /** + * this method returns user-defined html attribute name-value pair from dom + * @param ele element + * @returns user defined html attributes + */ + RPTUtil.getUserDefinedHtmlAttributeNameValuePairs = function (elem) { + var htmlAttributes = []; + var domAttributes = elem.attributes; + if (domAttributes) { + for (var i = 0; i < domAttributes.length; i++) { + var attrName = domAttributes[i].name.trim().toLowerCase(); + var attrValue = elem.getAttribute(attrName); + if (attrValue === '') + attrValue = null; + var isAria = attrName.substring(0, 5) === 'aria-'; + if (!isAria) + htmlAttributes.push({ name: attrName, value: attrValue }); + } + } + return htmlAttributes; + }; + /** + * This method handles implicit aria definitions, for example, an input with checked is equivalent to aria-checked="true" + */ + RPTUtil.getAriaAttribute = function (ele, attributeName) { + // If the attribute is defined, it takes precedence + var retVal = ele.getAttribute(attributeName); + if (ele.hasAttribute(attributeName) && retVal.trim() === "") { //"" is treated as false, so we need return it before the below check + return retVal; + } + // Then determine implicit values from other attributes + if (!retVal) { + var tag = ele.nodeName.toLowerCase(); + if (attributeName in RPTUtil.ariaAttributeImplicitMappings) { + if (tag in RPTUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName][tag]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + else if ("*" in RPTUtil.ariaAttributeImplicitMappings[attributeName]) { + retVal = RPTUtil.ariaAttributeImplicitMappings[attributeName]["*"]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + } + // Check role-based defaults + if (!retVal) { + var role = ARIAMapper_1.ARIAMapper.nodeToRole(ele); + if (role in RPTUtil.ariaAttributeRoleDefaults && attributeName in RPTUtil.ariaAttributeRoleDefaults[role]) { + retVal = RPTUtil.ariaAttributeRoleDefaults[role][attributeName]; + if (typeof (retVal) === "function") { + retVal = retVal(ele); + } + } + } + // Still not defined? Check global defaults + if (!retVal && attributeName in RPTUtil.ariaAttributeGlobalDefaults) { + retVal = RPTUtil.ariaAttributeGlobalDefaults[attributeName]; + } + return retVal; + }; + RPTUtil.wordCount = function (str) { + str = str.trim(); + if (str.length === 0) + return 0; + return str.split(/\s+/g).length; + }; + /** + * Note that this only detects if the element itself is in the tab order. + * However, this element may delegate focus to another element via aria-activedescendant + * Also, focus varies by browser... sticking to things that are focusable on chrome and firefox + */ + RPTUtil.isTabbable = function (element) { + // Using https://allyjs.io/data-tables/focusable.html + // Handle the explicit cases first + if (!VisUtil_1.VisUtil.isNodeVisible(element)) + return false; + if (element.hasAttribute("tabindex")) { + return parseInt(element.getAttribute("tabindex")) >= 0; + } + // Explicit cases handled - now the implicit + var nodeName = element.nodeName.toLowerCase(); + if (nodeName in RPTUtil.tabTagMap) { + var retVal = RPTUtil.tabTagMap[nodeName]; + if (typeof (retVal) === "function") { + retVal = retVal(element); + } + return retVal; + } + else { + return false; + } + }; + /** + * a target is en element that accept a pointer action (click or touch) + * + */ + RPTUtil.isTarget = function (element) { + if (!element) + return false; + if (element.hasAttribute("tabindex") || RPTUtil.isTabbable(element)) + return true; + var roles = RPTUtil.getRoles(element, true); + if (!roles && roles.length === 0) + return false; + var tagProperty = RPTUtil.getElementAriaProperty(element); + var allowedRoles = RPTUtil.getAllowedAriaRoles(element, tagProperty); + if (!allowedRoles || allowedRoles.length === 0) + return false; + var parent = element.parentElement; + // datalist, fieldset, optgroup, etc. may be just used for grouping purpose, so go up to the parent + while (parent && roles.some(function (role) { return role === 'group'; })) + parent = parent.parentElement; + if (parent && (parent.hasAttribute("tabindex") || RPTUtil.isTabbable(parent))) { + var target_roles_1 = ["listitem", "menuitem", "menuitemcheckbox", "menuitemradio", "option", "radio", "switch", "treeitem"]; + if (allowedRoles.includes('any') || roles.some(function (role) { return target_roles_1.includes(role); })) + return true; + } + return false; + }; + /** + * a target is en element that accept a pointer action (click or touch) + * a target is a browser default if it's a native widget (no user defined role) without user style + */ + RPTUtil.isTargetBrowserDefault = function (element) { + if (!element) + return false; + // user defained widget + var roles = RPTUtil.getRoles(element, false); + if (roles && roles.length > 0) + return false; + // no user style to space control size, including use of font + var styles = (0, CSSUtil_1.getDefinedStyles)(element); + if (styles['line-height'] || styles['height'] || styles['width'] || styles['min-height'] || styles['min-width'] + || styles['font-size'] || styles['margin-top'] || styles['margin-bottom'] || styles['margin-left'] || styles['margin-right']) + return false; + return true; + }; + /** + * an "inline" CSS display property tells the element to fit itself on the same line. An 'inline' element's width and height are ignored. + * some element has default inline property, such as , + * most formatting elements inherent inline property, such as , , , + * other inline elements: