diff --git a/src/Twig/Functions/IconExtension.php b/src/Twig/Functions/IconExtension.php index 1c4c03d..5ab97dc 100644 --- a/src/Twig/Functions/IconExtension.php +++ b/src/Twig/Functions/IconExtension.php @@ -16,7 +16,8 @@ final class IconExtension extends AbstractExtension 'icon' => null, 'title' => null, 'size' => self::DEFAULT_SIZE, - 'colour' => 'primary' + 'colour' => 'primary', + 'hover' => null ]; public function __construct(private array $directories, private array $palletes) @@ -66,6 +67,7 @@ final class IconExtension extends AbstractExtension * 'title' => (?string) Text to appear on mouse hover * 'size' => (int) Height and width in px * 'colour' => (string) Main colour pallete + * 'hover' => (?string) Hover colour pallete * ] * ``` */ @@ -81,8 +83,16 @@ final class IconExtension extends AbstractExtension $xml = new \SimpleXMLElement($cleanSvgMarkup); $xml = $this->addAttributeToXmlElement($xml, 'class', $mainPallete['stroke'] . ' ' . $mainPallete['fill']); - $markup = $this->removeXMLDeclaration($xml->saveXML()); + $cleanSvgMarkup = $this->removeXMLDeclaration($xml->saveXML()); + if (null !== $options['hover']) { + $hoverPallete = $this->getPallete($options['hover']); + $xml = new \SimpleXMLElement($cleanSvgMarkup); + $xml = $this->addAttributeToXmlElement($xml, 'class', 'hover:' . $hoverPallete['stroke'] . ' ' . 'hover:' . $hoverPallete['fill']); + $cleanSvgMarkup = $this->removeXMLDeclaration($xml->saveXML()); + } + + $markup = $cleanSvgMarkup; if ($this->isNonEmptyString($options['title'])) $markup = $this->addTitleToMarkup($markup, $options['title']); diff --git a/tests/Twig/Functions/IconExtensionTest.php b/tests/Twig/Functions/IconExtensionTest.php index 92dea2d..6a9482d 100644 --- a/tests/Twig/Functions/IconExtensionTest.php +++ b/tests/Twig/Functions/IconExtensionTest.php @@ -227,7 +227,7 @@ class IconExtensionTest extends TestCase $this->assertDoesNotMatchRegularExpression('/fill:\s*rgb\(0,\s*0,\s*0\)\s*/', $content); } - public function testThrowsIfPalleteIsNotFound(): void + public function testThrowsIfColourPalleteIsNotFound(): void { $this->expectException(PalleteNotFound::class); $this->icon->renderIcon(['icon' => self::ICON, 'colour' => 'red']); @@ -240,5 +240,18 @@ class IconExtensionTest extends TestCase $this->assertMatchesRegularExpression('//', $contents); } + public function testThrowsIfHoverPalleteIsNotFound(): void + { + $this->expectException(PalleteNotFound::class); + $this->icon->renderIcon(['icon' => self::ICON, 'hover' => 'red']); + } + + public function testSvgClassContainsHoverPalleteClasses(): void + { + $contents = $this->icon->renderIcon(['icon' => self::ICON, 'hover' => 'white']); + $this->assertMatchesRegularExpression('//', $contents); + $this->assertMatchesRegularExpression('//', $contents); + } + }