47 lines
1.4 KiB
PHP
47 lines
1.4 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Pcm\BadgeBundle\Twig\Component;
|
|
|
|
use Pcm\BadgeBundle\Enum\Badge as EnumBadge;
|
|
use Pcm\BadgeBundle\Interface\BadgeableInterface;
|
|
use Symfony\UX\TwigComponent\Attribute\AsTwigComponent;
|
|
use TailwindMerge\TailwindMerge;
|
|
|
|
#[AsTwigComponent(name: 'Pcm:Badge', template: "@PcmBadge/Badge.html.twig")]
|
|
final class Badge
|
|
{
|
|
public string $finalClasses;
|
|
|
|
private ?string $colour;
|
|
|
|
public function __construct(private string $baseClasses)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* @param BadgeableInterface $object The object to be converted into a badge
|
|
* @param string $class Extra classes you want to add to the badge template
|
|
*/
|
|
public function mount(BadgeableInterface $object, string $class = '', string $colour = null): void
|
|
{
|
|
if (null !== $colour) {
|
|
|
|
$cases = array_map(fn(EnumBadge $b) => $b->name, EnumBadge::cases());
|
|
|
|
if (!in_array($colour, $cases)) {
|
|
throw new \RuntimeException(sprintf('"%s" is not a valid Badge colour. Available options are: %s', $colour, implode(", ", $cases)));
|
|
}
|
|
|
|
} else {
|
|
$palette = $object->getBadgeColour()->getPalette();
|
|
}
|
|
|
|
$merger = TailwindMerge::instance();
|
|
|
|
$this->finalClasses = $merger->merge(sprintf('text-white %s %s %s %s', $palette->borderColourClass, $palette->backgroundColourClass, $this->baseClasses, $class));
|
|
}
|
|
}
|
|
|