Plugins personalizados
Um plugin personalizado é uma classe PHP que implementa TailwindPHP\Plugin\PluginInterface. Ele recebe uma instância de PluginAPI e a usa para registrar utilitários estáticos e funcionais, componentes e variantes. Depois de registrado com registerPlugin(), o plugin é encontrado pelo nome em uma diretiva @plugin — o mesmo mecanismo usado pelos plugins integrados de tipografia e formulários.
PluginInterface
Implemente três métodos:
namespace TailwindPHP\Plugin;
interface PluginInterface
{
public function getName(): string;
public function __invoke(PluginAPI $api, array $options = []): void;
public function getThemeExtensions(array $options = []): array;
}
getName()retorna o identificador usado em@plugin "...".__invoke()executa o plugin, registrando tudo por meio de$api. O array$optionscontém os valores do bloco@pluginCSS.getThemeExtensions()retorna os namespaces do tema a serem mesclados antes da geração dos utilitários (retorne[]se não houver nenhum).
Exemplo
use TailwindPHP\Plugin\PluginInterface;
use TailwindPHP\Plugin\PluginAPI;
class MyCustomPlugin implements PluginInterface
{
public function getName(): string
{
return 'my-custom-plugin';
}
public function __invoke(PluginAPI $api, array $options = []): void
{
// Static utilities
$api->addUtilities([
'.btn' => [
'padding' => '0.5rem 1rem',
'border-radius' => '0.25rem',
'font-weight' => '600',
],
'.btn-primary' => [
'background-color' => 'blue',
'color' => 'white',
],
]);
// Functional utilities (generates .gutter-sm, .gutter-md, .gutter-lg)
$api->matchUtilities(
[
'gutter' => fn ($value) => ['padding-inline' => $value],
],
['values' => ['sm' => '1rem', 'md' => '2rem', 'lg' => '3rem']]
);
// Component classes (sorted into the components layer)
$api->addComponents([
'.card' => [
'background-color' => 'white',
'border-radius' => '0.5rem',
'padding' => '1rem',
],
]);
// Custom variant (see the note below the API reference)
$api->addVariant('hocus', '&:hover, &:focus');
// Read a theme value
$primary = $api->theme('colors.blue.500', '#3b82f6');
}
public function getThemeExtensions(array $options = []): array
{
return []; // Return theme additions if needed
}
}
referência de PluginAPI
O API espelha a TailwindCSS API do plugin:
| Método | Assinatura | Finalidade |
|---|---|---|
addBase |
addBase(array $css): void |
Adiciona estilos à camada base. |
addUtilities |
addUtilities(array $utilities, array $options = []): void |
Registra classes utilitárias estáticas com base no seletor. |
matchUtilities |
matchUtilities(array $utilities, array $options = []): void |
Registra utilitários funcionais; $options['values'] fornece o mapa de valores, $options['supportsNegativeValues'] habilita valores negativos. |
addComponents |
addComponents(array $components, array $options = []): void |
Registra classes de componentes (camada de componentes). |
matchComponents |
matchComponents(array $components, array $options = []): void |
Registra componentes funcionais com um mapa de valores. |
addVariant |
addVariant(string $name, string|array $variant): void |
Registra uma variante estática a partir de um seletor. |
matchVariant |
matchVariant(string $name, callable $callback, array $options = []): void |
Registra uma variante funcional; $options['values'] fornece o mapa de valores. |
theme |
theme(string $path, mixed $defaultValue = null): mixed |
Lê um valor do tema usando um caminho de pontos (e.g. colors.blue.500). |
config |
config(?string $path = null, mixed $defaultValue = null): mixed |
Lê um valor de configuração usando um caminho de pontos ou a configuração inteira quando $path é null. |
prefix |
prefix(string $className): string |
Aplica o prefixo configurado a um nome de classe. |
O callback passado para matchUtilities, matchComponents e matchVariant recebe o valor e um array como segundo argumento, contendo uma chave modifier.
Escolha nomes de utilitários que o Tailwind principal ainda não use. Quando um utilitário de plugin tem o mesmo nome de um utilitário principal (por exemplo, tab-*, usado pelo Tailwind principal para tab-size desde v4.3), ambas as declarações ficam na mesma regra e a principal vem por último, prevalecendo: um tab-4 do plugin mapeado para 7 ainda gera tab-size: 4.
Problema conhecido: variantes registradas com
addVariant()e variantes por valor registradas pormatchVariant()não são aplicadas na versão atual.hocus:flexdo exemplo acima compila para.hocus\:flex { display: flex; }sem seletor:hover/:focus(#10). Até que isso seja corrigido, defina a variante em CSS com@custom-variant, que funciona:@custom-variant hocus (&:hover, &:focus);.
Registro e uso
Registre a instância do plugin e depois faça referência a ele pelo nome de getName():
use TailwindPHP\tw;
use function TailwindPHP\registerPlugin;
registerPlugin(new MyCustomPlugin());
$css = tw::generate(
'<div class="btn btn-primary card gutter-md">…</div>',
'@plugin "my-custom-plugin"; @import "tailwindcss/utilities.css";'
);
Consulte Plugins para ver a diretiva @plugin e Tema para conhecer os valores expostos por $api->theme().