diff --git a/kayle/builder/build-rules.ts b/kayle/builder/build-rules.ts
index fbee8db..58b4591 100644
--- a/kayle/builder/build-rules.ts
+++ b/kayle/builder/build-rules.ts
@@ -12,9 +12,10 @@ import type { Rule } from "./build-types";
const paramList = await processParams();
const browser = await chromium.launch({ headless: true });
+ // default config
const pConfig = {
- singleQuote: true,
- semi: false,
+ singleQuote: false,
+ semi: true,
parser: "babel",
};
@@ -46,8 +47,8 @@ import type { Rule } from "./build-types";
content: `window.htmlcsRuleMap = ${htmlcsRuleMap.toString()};`,
});
- await page.exposeFunction("pushHtmlcsRule", (t: Rule) =>
- fast_htmlcs_rules.push(t),
+ await page.exposeFunction("pushHtmlcsRule", (t: Rule[]) =>
+ fast_htmlcs_rules.push(...t),
);
await page.exposeFunction("pushAxeRule", (t: Rule) =>
@@ -76,7 +77,9 @@ import type { Rule } from "./build-types";
Buffer.from(
await format(
`/* ${DNE} */\nexport const htmlcsRules = ${JSON.stringify(
- fast_htmlcs_rules.filter((r) => r.description).sort((a, b) => a.ruleId.localeCompare(b.ruleId)),
+ fast_htmlcs_rules
+ .filter((r) => r.description)
+ .sort((a, b) => a.ruleId.localeCompare(b.ruleId)),
)};`,
pConfig,
),
diff --git a/kayle/builder/build-types.ts b/kayle/builder/build-types.ts
index 06f1ca2..5ed8a25 100644
--- a/kayle/builder/build-types.ts
+++ b/kayle/builder/build-types.ts
@@ -14,9 +14,9 @@ declare global {
interface Window {
HTMLCS: any;
axe: any;
- pushHtmlcsRule: (r: Rule) => void;
+ pushHtmlcsRule: (r: Rule[]) => void;
pushAxeRule: (r: Rule) => void;
- htmlcsRuleMap: (t: ParamList) => Rule;
+ htmlcsRuleMap: (t: ParamList) => Rule[];
paramList: ParamList[];
}
}
diff --git a/kayle/builder/htmlcs-rule-map.ts b/kayle/builder/htmlcs-rule-map.ts
index 7f4fbde..4ba7fe9 100644
--- a/kayle/builder/htmlcs-rule-map.ts
+++ b/kayle/builder/htmlcs-rule-map.ts
@@ -1,4 +1,4 @@
-import type { ParamList } from "./build-types";
+import type { ParamList, Rule } from "./build-types";
// Hand stich the rules to map from htmlcs.
// We need to map the ruleId to the translation file key.
@@ -6,6 +6,8 @@ import type { ParamList } from "./build-types";
// map the rules to a detailed object
// the descriptions handling is not perfect and needs to handle split cases.
export const htmlcsRuleMap = (rule: ParamList) => {
+ const rules: Rule[] = [];
+
const concatWcagLink = (l: string) =>
`https://www.w3.org/TR/WCAG20-TECHS/${l}`;
@@ -36,6 +38,10 @@ export const htmlcsRuleMap = (rule: ParamList) => {
"";
} catch (_e) {}
+ if (description.startsWith("HTMLCS.getTranslation(")) {
+ description = eval(description);
+ }
+
const baseRule = `${rule[4]}${
directRuleAssignments.includes(rule[3]) ? "." : "_"
}${rule[3]}`;
@@ -46,18 +52,36 @@ export const htmlcsRuleMap = (rule: ParamList) => {
? rule[2].replace("HTMLCS.getTranslation(", "").replace(")", "")
: "";
- const ruleId = inlineTranslation
+ const _ruleId = inlineTranslation
? inlineRule.substring(1, inlineRule.length - 1)
: baseRuleId;
- return {
- ruleId: rule[5]
- ? `${rule[5].replace("_Guideline", ".Guideline")}.${ruleId}`
- : ruleId,
+ const ruleId = rule[5]
+ ? `${rule[5].replace("_Guideline", ".Guideline")}.${_ruleId}`
+ : _ruleId;
+
+ const pattern = /(.{3})_or_(.{3})/;
+
+ const [, leftPart, rightPart] = ruleId.match(pattern) || [];
+
+ const ruleObj = {
+ ruleId,
description,
helpUrl: section508
? []
: helpLinks.map((r) => concatWcagLink(r.split(".")[0])),
- ruleType: rule[0],
+ ruleType: rule[0] as "error" | "warning" | "notice",
};
+
+ // Check if both parts were found
+ if (leftPart && rightPart) {
+ ruleObj.ruleId = ruleId.replace(pattern, leftPart);
+ rules.push(ruleObj);
+ ruleObj.ruleId = ruleId.replace(pattern, rightPart);
+ rules.push(ruleObj);
+ } else {
+ rules.push(ruleObj);
+ }
+
+ return rules;
};
diff --git a/kayle/lib/rules/ar/axe-rules.ts b/kayle/lib/rules/ar/axe-rules.ts
index 6a08a2e..70fcfcc 100644
--- a/kayle/lib/rules/ar/axe-rules.ts
+++ b/kayle/lib/rules/ar/axe-rules.ts
@@ -1,978 +1,978 @@
/* THIS FILE WAS CREATED DYNAMICALLY - DO NOT EDIT */
export const axeRules = [
{
- ruleId: 'accesskeys',
- description: 'يضمن أن قيمة خاصية الوصول لكل مفتاح فريدة',
- help: 'يجب أن تكون قيمة خاصية الوصول فريدة',
+ ruleId: "accesskeys",
+ description: "يضمن أن قيمة خاصية الوصول لكل مفتاح فريدة",
+ help: "يجب أن تكون قيمة خاصية الوصول فريدة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/accesskeys?application=axeAPI&lang=ar',
- tags: ['cat.keyboard', 'best-practice'],
+ "https://dequeuniversity.com/rules/axe/4.6/accesskeys?application=axeAPI&lang=ar",
+ tags: ["cat.keyboard", "best-practice"],
},
{
- ruleId: 'area-alt',
- description: 'يضمن أن عناصر لخرائط الصور لها نص بديل',
- help: 'يجب أن تحتوي عناصر الفعالة على نص بديل',
+ ruleId: "area-alt",
+ description: "يضمن أن عناصر لخرائط الصور لها نص بديل",
+ help: "يجب أن تحتوي عناصر الفعالة على نص بديل",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/area-alt?application=axeAPI&lang=ar',
+ "https://dequeuniversity.com/rules/axe/4.6/area-alt?application=axeAPI&lang=ar",
tags: [
- 'cat.text-alternatives',
- 'wcag2a',
- 'wcag244',
- 'wcag412',
- 'section508',
- 'section508.22.a',
- 'ACT',
+ "cat.text-alternatives",
+ "wcag2a",
+ "wcag244",
+ "wcag412",
+ "section508",
+ "section508.22.a",
+ "ACT",
],
- actIds: ['c487ae'],
+ actIds: ["c487ae"],
},
{
- ruleId: 'aria-allowed-attr',
- description: 'يضمن أن خصائص ARIA مسموحة لدور عنصر معين',
- help: 'يجب أن تستخدم العناصر خصائص ARIA المسموحة فقط',
+ ruleId: "aria-allowed-attr",
+ description: "يضمن أن خصائص ARIA مسموحة لدور عنصر معين",
+ help: "يجب أن تستخدم العناصر خصائص ARIA المسموحة فقط",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-allowed-attr?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
- actIds: ['5c01ea'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-allowed-attr?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
+ actIds: ["5c01ea"],
},
{
- ruleId: 'aria-allowed-role',
- description: 'يضمن أن خاصية الدور لها قيمة مناسبة للعنصر',
- help: 'يجب أن يكون دور ARIA مناسباً للعنصر',
+ ruleId: "aria-allowed-role",
+ description: "يضمن أن خاصية الدور لها قيمة مناسبة للعنصر",
+ help: "يجب أن يكون دور ARIA مناسباً للعنصر",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-allowed-role?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'best-practice'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-allowed-role?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "best-practice"],
},
{
- ruleId: 'aria-command-name',
- description: 'يضمن أن كل أمر ARIA ورابط وعنصر قائمة له اسم متاح',
- help: 'يجب أن تحتوي أوامر ARIA على اسم متاح',
+ ruleId: "aria-command-name",
+ description: "يضمن أن كل أمر ARIA ورابط وعنصر قائمة له اسم متاح",
+ help: "يجب أن تحتوي أوامر ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-command-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412', 'ACT'],
- actIds: ['97a4e1'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-command-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412", "ACT"],
+ actIds: ["97a4e1"],
},
{
- ruleId: 'aria-dialog-name',
- description: 'يضمن أن كل عقدة حوار وتنبيه حوار في ARIA لها اسم متاح',
- help: 'يجب أن تحتوي عقد الحوار وتنبيه الحوار في ARIA على اسم متاح',
+ ruleId: "aria-dialog-name",
+ description: "يضمن أن كل عقدة حوار وتنبيه حوار في ARIA لها اسم متاح",
+ help: "يجب أن تحتوي عقد الحوار وتنبيه الحوار في ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-dialog-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'best-practice'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-dialog-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "best-practice"],
},
{
- ruleId: 'aria-hidden-body',
- description: 'يضمن عدم وجود \'aria-hidden="true"\' على جسم الوثيقة',
- help: 'يجب ألا يتواجد \'aria-hidden="true"\' على جسم الوثيقة',
+ ruleId: "aria-hidden-body",
+ description: "يضمن عدم وجود 'aria-hidden=\"true\"' على جسم الوثيقة",
+ help: "يجب ألا يتواجد 'aria-hidden=\"true\"' على جسم الوثيقة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-hidden-body?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-hidden-body?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
},
{
- ruleId: 'aria-hidden-focus',
+ ruleId: "aria-hidden-focus",
description:
- 'يضمن أن العناصر المخفية بـ aria-hidden ليست قابلة للتركيز ولا تحتوي على عناصر قابلة للتركيز',
- help: 'يجب ألا يكون العنصر المخفي بـ ARIA قابل للتركيز أو يحتوي على عناصر قابلة للتركيز',
+ "يضمن أن العناصر المخفية بـ aria-hidden ليست قابلة للتركيز ولا تحتوي على عناصر قابلة للتركيز",
+ help: "يجب ألا يكون العنصر المخفي بـ ARIA قابل للتركيز أو يحتوي على عناصر قابلة للتركيز",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-hidden-focus?application=axeAPI&lang=ar',
- tags: ['cat.name-role-value', 'wcag2a', 'wcag412'],
- actIds: ['6cfa84'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-hidden-focus?application=axeAPI&lang=ar",
+ tags: ["cat.name-role-value", "wcag2a", "wcag412"],
+ actIds: ["6cfa84"],
},
{
- ruleId: 'aria-input-field-name',
- description: 'يضمن أن كل حقل إدخال ARIA له اسم متاح',
- help: 'يجب أن تحتوي حقول إدخال ARIA على اسم متاح',
+ ruleId: "aria-input-field-name",
+ description: "يضمن أن كل حقل إدخال ARIA له اسم متاح",
+ help: "يجب أن تحتوي حقول إدخال ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-input-field-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412', 'ACT'],
- actIds: ['e086e5'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-input-field-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412", "ACT"],
+ actIds: ["e086e5"],
},
{
- ruleId: 'aria-meter-name',
- description: 'يضمن أن كل عقدة قياس في ARIA لها اسم متاح',
- help: 'يجب أن تحتوي عقد القياس في ARIA على اسم متاح',
+ ruleId: "aria-meter-name",
+ description: "يضمن أن كل عقدة قياس في ARIA لها اسم متاح",
+ help: "يجب أن تحتوي عقد القياس في ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-meter-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag111'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-meter-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag111"],
},
{
- ruleId: 'aria-progressbar-name',
- description: 'يضمن أن كل عقدة شريط تقدم في ARIA لها اسم متاح',
- help: 'يجب أن تحتوي عقد شريط التقدم في ARIA على اسم متاح',
+ ruleId: "aria-progressbar-name",
+ description: "يضمن أن كل عقدة شريط تقدم في ARIA لها اسم متاح",
+ help: "يجب أن تحتوي عقد شريط التقدم في ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-progressbar-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag111'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-progressbar-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag111"],
},
{
- ruleId: 'aria-required-attr',
- description: 'يضمن أن العناصر بأدوار ARIA تحتوي على كل خصائص ARIA المطلوبة',
- help: 'يجب توفير خصائص ARIA المطلوبة',
+ ruleId: "aria-required-attr",
+ description: "يضمن أن العناصر بأدوار ARIA تحتوي على كل خصائص ARIA المطلوبة",
+ help: "يجب توفير خصائص ARIA المطلوبة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-required-attr?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
- actIds: ['4e8ab6'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-required-attr?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
+ actIds: ["4e8ab6"],
},
{
- ruleId: 'aria-required-children',
- description: 'يضمن أن العناصر بدور ARIA يحتوي على الأدوار الفرعية المطلوبة',
- help: 'يجب أن تحتوي بعض الأدوار في ARIA على أدوار فرعية محددة',
+ ruleId: "aria-required-children",
+ description: "يضمن أن العناصر بدور ARIA يحتوي على الأدوار الفرعية المطلوبة",
+ help: "يجب أن تحتوي بعض الأدوار في ARIA على أدوار فرعية محددة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-required-children?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag131'],
- actIds: ['bc4a75', 'ff89c9'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-required-children?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag131"],
+ actIds: ["bc4a75", "ff89c9"],
},
{
- ruleId: 'aria-required-parent',
- description: 'يضمن أن العناصر بدور ARIA تحتوي على الأدوار الأصلية المطلوبة',
- help: 'يجب أن تحتوي بعض الأدوار في ARIA على أدوار أصلية محددة',
+ ruleId: "aria-required-parent",
+ description: "يضمن أن العناصر بدور ARIA تحتوي على الأدوار الأصلية المطلوبة",
+ help: "يجب أن تحتوي بعض الأدوار في ARIA على أدوار أصلية محددة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-required-parent?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag131'],
- actIds: ['ff89c9'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-required-parent?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag131"],
+ actIds: ["ff89c9"],
},
{
- ruleId: 'aria-roledescription',
+ ruleId: "aria-roledescription",
description:
- 'يضمن استخدام aria-roledescription فقط على العناصر بدور ضمني أو صريح',
- help: 'يجب استخدام aria-roledescription على العناصر بدور دلالي',
+ "يضمن استخدام aria-roledescription فقط على العناصر بدور ضمني أو صريح",
+ help: "يجب استخدام aria-roledescription على العناصر بدور دلالي",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-roledescription?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-roledescription?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
},
{
- ruleId: 'aria-roles',
- description: 'يضمن أن كل العناصر بخاصية دور تستخدم قيمة صالحة',
- help: 'يجب أن تتوافق الأدوار في ARIA مع قيم صالحة',
+ ruleId: "aria-roles",
+ description: "يضمن أن كل العناصر بخاصية دور تستخدم قيمة صالحة",
+ help: "يجب أن تتوافق الأدوار في ARIA مع قيم صالحة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-roles?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
- actIds: ['674b10'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-roles?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
+ actIds: ["674b10"],
},
{
- ruleId: 'aria-text',
+ ruleId: "aria-text",
description:
'يضمن استخدام "role=text" على العناصر بدون أحفاد قابلين للتركيز',
help: '"role=text" يجب ألا يحتوي على أحفاد قابلين للتركيز',
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-text?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'best-practice'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-text?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "best-practice"],
},
{
- ruleId: 'aria-toggle-field-name',
- description: 'يضمن أن كل حقل تبديل في ARIA له اسم متاح',
- help: 'يجب أن تحتوي حقول التبديل في ARIA على اسم متاح',
+ ruleId: "aria-toggle-field-name",
+ description: "يضمن أن كل حقل تبديل في ARIA له اسم متاح",
+ help: "يجب أن تحتوي حقول التبديل في ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-toggle-field-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412', 'ACT'],
- actIds: ['e086e5'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-toggle-field-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412", "ACT"],
+ actIds: ["e086e5"],
},
{
- ruleId: 'aria-tooltip-name',
- description: 'يضمن أن كل عقدة تلميح في ARIA لها اسم متاح',
- help: 'يجب أن تحتوي عقد التلميح في ARIA على اسم متاح',
+ ruleId: "aria-tooltip-name",
+ description: "يضمن أن كل عقدة تلميح في ARIA لها اسم متاح",
+ help: "يجب أن تحتوي عقد التلميح في ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-tooltip-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-tooltip-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
},
{
- ruleId: 'aria-treeitem-name',
- description: 'يضمن أن كل عقدة عنصر شجرة في ARIA لها اسم متاح',
- help: 'يجب أن تحتوي عقد عناصر الشجرة في ARIA على اسم متاح',
+ ruleId: "aria-treeitem-name",
+ description: "يضمن أن كل عقدة عنصر شجرة في ARIA لها اسم متاح",
+ help: "يجب أن تحتوي عقد عناصر الشجرة في ARIA على اسم متاح",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-treeitem-name?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'best-practice'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-treeitem-name?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "best-practice"],
},
{
- ruleId: 'aria-valid-attr',
- description: 'يضمن أن الخصائص التي تبدأ بـ aria- هي خصائص ARIA صالحة',
- help: 'يجب أن تتوافق خصائص ARIA مع أسماء صالحة',
+ ruleId: "aria-valid-attr",
+ description: "يضمن أن الخصائص التي تبدأ بـ aria- هي خصائص ARIA صالحة",
+ help: "يجب أن تتوافق خصائص ARIA مع أسماء صالحة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
- actIds: ['5f99a7'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
+ actIds: ["5f99a7"],
},
{
- ruleId: 'aria-valid-attr-value',
- description: 'يضمن أن كل خصائص ARIA لها قيم صالحة',
- help: 'يجب أن تتوافق خصائص ARIA مع قيم صالحة',
+ ruleId: "aria-valid-attr-value",
+ description: "يضمن أن كل خصائص ARIA لها قيم صالحة",
+ help: "يجب أن تتوافق خصائص ARIA مع قيم صالحة",
helpUrl:
- 'https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr-value?application=axeAPI&lang=ar',
- tags: ['cat.aria', 'wcag2a', 'wcag412'],
- actIds: ['6a7281'],
+ "https://dequeuniversity.com/rules/axe/4.6/aria-valid-attr-value?application=axeAPI&lang=ar",
+ tags: ["cat.aria", "wcag2a", "wcag412"],
+ actIds: ["6a7281"],
},
{
- ruleId: 'audio-caption',
- description: 'يضمن أن عناصر