From 9a53686dd099abbbd68b7315a1176483f8ce013a Mon Sep 17 00:00:00 2001 From: Chris Morrell Date: Wed, 8 Jul 2026 12:05:50 -0400 Subject: [PATCH 1/2] Add implicit variants --- src/Elements/Attributes/ClassNames.php | 13 +++++ tests/Unit/VariantTest.php | 72 ++++++++++++++++++++++++++ 2 files changed, 85 insertions(+) diff --git a/src/Elements/Attributes/ClassNames.php b/src/Elements/Attributes/ClassNames.php index 9c33c10..d80fd0c 100644 --- a/src/Elements/Attributes/ClassNames.php +++ b/src/Elements/Attributes/ClassNames.php @@ -238,6 +238,19 @@ protected function variantClassNames(): array $variants = $variants->merge((array) $variant); } + // Apply implicit variants + $implicit = [ + 'disabled', + 'readonly', + 'required', + ]; + + foreach ($implicit as $attribute) { + if ($this->element->attributes->get($attribute, false)) { + $variants->push($attribute); + } + } + $element_name = $this->element_name; if ('textarea' === $element_name && !isset(static::$validation_classes[$element_name])) { diff --git a/tests/Unit/VariantTest.php b/tests/Unit/VariantTest.php index fad5da9..1b6504f 100644 --- a/tests/Unit/VariantTest.php +++ b/tests/Unit/VariantTest.php @@ -153,4 +153,76 @@ public function test_variants_can_be_combined_and_partially_merged(): void 'input-not-nested-variant', ]); } + + public function test_disabled_variant_is_applied_dynamically(): void + { + $this->app['config']->set('aire.variant_classes', [ + 'input' => [ + 'default' => [ + 'base' => 'input-default', + ], + 'disabled' => [ + 'base' => 'input-disabled', + 'color' => 'input-disabled-color', + ], + ], + ]); + + $disabled = $this->aire()->input()->disabled(); + $enabled = $this->aire()->input()->disabled()->disabled(false); // set then unset + + $this->assertSelectorClassNames($disabled, 'input', ['input', 'input-disabled', 'input-disabled-color']); + $this->assertSelectorMissingClassNames($disabled, 'input', ['input-default']); + + $this->assertSelectorClassNames($enabled, 'input', ['input', 'input-default']); + $this->assertSelectorMissingClassNames($enabled, 'input', ['input-disabled', 'input-disabled-color']); + } + + public function test_readonly_variant_is_applied_dynamically(): void + { + $this->app['config']->set('aire.variant_classes', [ + 'input' => [ + 'default' => [ + 'base' => 'input-default', + ], + 'readonly' => [ + 'base' => 'input-readonly', + 'color' => 'input-readonly-color', + ], + ], + ]); + + $read_only = $this->aire()->input()->readOnly(); + $read_write = $this->aire()->input()->readOnly()->readOnly(false); // set then unset + + $this->assertSelectorClassNames($read_only, 'input', ['input', 'input-readonly', 'input-readonly-color']); + $this->assertSelectorMissingClassNames($read_only, 'input', ['input-default']); + + $this->assertSelectorClassNames($read_write, 'input', ['input', 'input-default']); + $this->assertSelectorMissingClassNames($read_write, 'input', ['input-readonly', 'input-readonly-color']); + } + + public function test_required_variant_is_applied_dynamically(): void + { + $this->app['config']->set('aire.variant_classes', [ + 'input' => [ + 'default' => [ + 'base' => 'input-default', + ], + 'required' => [ + 'base' => 'input-required', + 'color' => 'input-required-color', + ], + ], + ]); + + $required = $this->aire()->input()->required(); + $optional = $this->aire()->input()->required()->required(false); // set then unset + + $this->assertSelectorClassNames($required, 'input', ['input', 'input-required', 'input-required-color']); + $this->assertSelectorMissingClassNames($required, 'input', ['input-default']); + + $this->assertSelectorClassNames($optional, 'input', ['input', 'input-default']); + $this->assertSelectorMissingClassNames($optional, 'input', ['input-required', 'input-required-color']); + } } From f0f1bbf866486ea565a9cd8fd96229e297fbb09e Mon Sep 17 00:00:00 2001 From: Chris Morrell Date: Wed, 8 Jul 2026 12:15:49 -0400 Subject: [PATCH 2/2] Apply implicit variants before explicit ones --- src/Elements/Attributes/ClassNames.php | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/src/Elements/Attributes/ClassNames.php b/src/Elements/Attributes/ClassNames.php index d80fd0c..672fa30 100644 --- a/src/Elements/Attributes/ClassNames.php +++ b/src/Elements/Attributes/ClassNames.php @@ -233,24 +233,19 @@ protected function variantClassNames(): array // Start with default always $variants = new BaseCollection('default'); - // Merge in other variants if they're set - if ($variant = $this->element->getViewData('variant')) { - $variants = $variants->merge((array) $variant); - } - // Apply implicit variants - $implicit = [ - 'disabled', - 'readonly', - 'required', - ]; - + $implicit = ['disabled', 'readonly', 'required']; foreach ($implicit as $attribute) { if ($this->element->attributes->get($attribute, false)) { $variants->push($attribute); } } + // Merge in other variants if they're set (last, so that they take precedence) + if ($variant = $this->element->getViewData('variant')) { + $variants = $variants->merge((array) $variant); + } + $element_name = $this->element_name; if ('textarea' === $element_name && !isset(static::$validation_classes[$element_name])) {