From 58b1618d960417ccde5260c47621bee35f6d1db4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Enes=20Yak=C4=B1=C5=9Ft=C4=B1r?= Date: Thu, 30 Jul 2026 20:34:41 +0300 Subject: [PATCH] feat: add 15 new WCAG rules, dynamic ARIA checks and bump version to v3.1.4 --- composer.json | 2 +- src/Rules/AnchorMissingHref.php | 38 +++++++++++++ src/Rules/AppletBanned.php | 30 ++++++++++ src/Rules/AriaExpandedState.php | 54 ++++++++++++++++++ src/Rules/AriaHiddenBody.php | 35 ++++++++++++ src/Rules/AriaLiveStatus.php | 55 ++++++++++++++++++ src/Rules/AriaPressedToggle.php | 49 ++++++++++++++++ src/Rules/ButtonLoadingState.php | 58 +++++++++++++++++++ src/Rules/FigureCaptionStructure.php | 35 ++++++++++++ src/Rules/FocusableWithoutRole.php | 42 ++++++++++++++ src/Rules/InputMissingAutocomplete.php | 55 ++++++++++++++++++ src/Rules/ListItemParent.php | 46 +++++++++++++++ src/Rules/OptgroupLabel.php | 34 +++++++++++ src/Rules/RadioGroupFieldset.php | 59 ++++++++++++++++++++ src/Rules/SummaryParent.php | 35 ++++++++++++ src/Rules/TableMultiCaption.php | 41 ++++++++++++++ tests/Rules/AnchorMissingHrefTest.php | 38 +++++++++++++ tests/Rules/AppletBannedTest.php | 29 ++++++++++ tests/Rules/AriaExpandedStateTest.php | 29 ++++++++++ tests/Rules/AriaHiddenBodyTest.php | 29 ++++++++++ tests/Rules/AriaLiveStatusTest.php | 38 +++++++++++++ tests/Rules/AriaPressedToggleTest.php | 29 ++++++++++ tests/Rules/ButtonLoadingStateTest.php | 29 ++++++++++ tests/Rules/FigureCaptionStructureTest.php | 29 ++++++++++ tests/Rules/FocusableWithoutRoleTest.php | 38 +++++++++++++ tests/Rules/InputMissingAutocompleteTest.php | 29 ++++++++++ tests/Rules/ListItemParentTest.php | 29 ++++++++++ tests/Rules/OptgroupLabelTest.php | 29 ++++++++++ tests/Rules/RadioGroupFieldsetTest.php | 38 +++++++++++++ tests/Rules/SummaryParentTest.php | 29 ++++++++++ tests/Rules/TableMultiCaptionTest.php | 29 ++++++++++ 31 files changed, 1138 insertions(+), 1 deletion(-) create mode 100644 src/Rules/AnchorMissingHref.php create mode 100644 src/Rules/AppletBanned.php create mode 100644 src/Rules/AriaExpandedState.php create mode 100644 src/Rules/AriaHiddenBody.php create mode 100644 src/Rules/AriaLiveStatus.php create mode 100644 src/Rules/AriaPressedToggle.php create mode 100644 src/Rules/ButtonLoadingState.php create mode 100644 src/Rules/FigureCaptionStructure.php create mode 100644 src/Rules/FocusableWithoutRole.php create mode 100644 src/Rules/InputMissingAutocomplete.php create mode 100644 src/Rules/ListItemParent.php create mode 100644 src/Rules/OptgroupLabel.php create mode 100644 src/Rules/RadioGroupFieldset.php create mode 100644 src/Rules/SummaryParent.php create mode 100644 src/Rules/TableMultiCaption.php create mode 100644 tests/Rules/AnchorMissingHrefTest.php create mode 100644 tests/Rules/AppletBannedTest.php create mode 100644 tests/Rules/AriaExpandedStateTest.php create mode 100644 tests/Rules/AriaHiddenBodyTest.php create mode 100644 tests/Rules/AriaLiveStatusTest.php create mode 100644 tests/Rules/AriaPressedToggleTest.php create mode 100644 tests/Rules/ButtonLoadingStateTest.php create mode 100644 tests/Rules/FigureCaptionStructureTest.php create mode 100644 tests/Rules/FocusableWithoutRoleTest.php create mode 100644 tests/Rules/InputMissingAutocompleteTest.php create mode 100644 tests/Rules/ListItemParentTest.php create mode 100644 tests/Rules/OptgroupLabelTest.php create mode 100644 tests/Rules/RadioGroupFieldsetTest.php create mode 100644 tests/Rules/SummaryParentTest.php create mode 100644 tests/Rules/TableMultiCaptionTest.php diff --git a/composer.json b/composer.json index 500f7eb..f64bf70 100644 --- a/composer.json +++ b/composer.json @@ -12,7 +12,7 @@ "yaknet" ], "homepage": "https://forum.yak.net.tr", - "version": "3.1.3", + "version": "3.1.4", "type": "library", "license": "MIT", "authors": [ diff --git a/src/Rules/AnchorMissingHref.php b/src/Rules/AnchorMissingHref.php new file mode 100644 index 0000000..474bc79 --- /dev/null +++ b/src/Rules/AnchorMissingHref.php @@ -0,0 +1,38 @@ +) acting as links must have a valid href attribute.'; } + public function getStandard(): WCAGStandard { return WCAGStandard::A; } + public function getSeverity(): Severity { return Severity::WARNING; } + public function getLevel(): int { return 2; } + + public function check(DOMElement $element): ?Violation + { + if (strtolower($element->tagName) !== 'a') { + return null; + } + + if ($element->hasAttribute('name') || $element->hasAttribute('role')) { + return null; + } + + if (!$element->hasAttribute('href') || trim($element->getAttribute('href')) === '') { + return $this->createViolation( + $element, + $this->getDescription(), + 'Add a valid href attribute to the element, or use a