Tucano v0.37.2

Para agentes de IA

Uma IA que não conhece a biblioteca escreve um date picker do zero, inventa uma classe vermelha para erro e ordena a tabela no cliente. Dois arquivos resolvem isso sem você explicar de novo a cada conversa: a referência completa em texto puro e três linhas no AGENTS.md do seu projeto.

llms.txt

A API inteira num arquivo de texto, feito para ser lido por modelo e não por gente. Aponte a IA para ele:

https://juniorcarlini.github.io/tucano/llms.txt

Primeiro vem uma seção por componente, com o caminho declarativo por data-*, que é o normal num projeto Django. Depois, a referência completa: seletor, atributos, todas as opções com o comentário que as explica, métodos, eventos, classes CSS e tokens. Essa parte é gerada do código a cada build — se uma opção não está lá, ela não existe. No fim ficam as regras do que não fazer.

Toda página deste site anuncia o arquivo no <head>, para ferramenta que procura por ele:

<link rel="alternate" type="text/plain" href="https://juniorcarlini.github.io/tucano/llms.txt">

Por que texto puro, e não esta documentação

Uma página de docs traz menu, demonstração e script junto com a informação, e a IA gasta contexto lendo o que não serve. O llms.txt é só a API, na ordem em que se usa, e cabe inteiro numa conversa.

AGENTS.md no seu projeto

Cole isto no AGENTS.md da raiz do projeto que usa a Tucano — ou no CLAUDE.md, no .cursorrules, onde a sua ferramenta procurar. É o que faz a IA escolher a biblioteca em vez de escrever um componente do zero.

## Interface
Este projeto usa a Tucano. Não escreva do zero date picker, select com busca, color picker, upload, máscara, toast, tooltip, modal, gaveta, acordeão, abas, menu suspenso, tabela, paginação nem editor de texto.
Referência completa: https://juniorcarlini.github.io/tucano/llms.txt

A lista nomeia os componentes com JavaScript, que são os que uma IA mais reescreve. As peças que são só classe — botão, aviso, etiqueta, carregando, linha do tempo, caixa, opção e chave, menu lateral, rótulo e campo de formulário — estão no mesmo llms.txt, e a regra "não desenhe um segundo botão" cobre o resto.

Três linhas bastam porque o trabalho está no link. Se quiser que a IA acerte já na primeira resposta, sem abrir a referência, acrescente os exemplos que o seu projeto mais usa:

## Interface
Este projeto usa a Tucano. Não escreva do zero date picker, select com busca, color picker, upload, máscara, toast, tooltip, modal, gaveta, acordeão, abas, menu suspenso, tabela, paginação nem editor de texto.
Referência completa: https://juniorcarlini.github.io/tucano/llms.txt

<input data-tuc-datepicker data-mode="range">
<select data-tuc-select multiple>
<input data-tuc-mask="cpf-cnpj">
<input type="file" data-tuc-upload>
<button data-tuc-tip="..." class="tuc-btn is-primary">

Tucano.toast.success('Salvo');
await Tucano.confirm({ title: 'Excluir?' });
Tucano.drawer({ title: 'Filtros', side: 'right' });

O elemento nativo continua dono do valor: name, required e getlist() do Django seguem funcionando. Não substitua por estado só em JS.

E o AGENTS.md da Tucano

O AGENTS.md do repositório é para quem vai mexer no código da própria biblioteca: como rodar, a estrutura e as decisões que não devem ser revertidas sem motivo, cada uma com o defeito que a motivou. Para usar a Tucano num projeto, ele não é necessário — o llms.txt é.

O que a IA não deve fazer

São as regras que fecham o llms.txt. Cada uma existe porque é o erro que um modelo comete quando deduz em vez de ler.

Não façaFaçaPor quê
Escrever date picker, select com busca ou color picker do zeroMarcar o campo com data-tuc-datepicker, data-tuc-select, data-tuc-colorÉ o que a biblioteca existe para evitar
Usar a API em JavaScript por hábitoPreferir os data-*; JS só para opção que não existe como atributo — disabledDates, presets próprios, onChangeAtributo funciona no template, sobrevive ao HTMX e dispensa script
Remover o <select> nativo ou o name do inputDeixar o elemento nativo no formulárioÉ nele que o valor vive: required e getlist() dependem dele
Estilizar as classes internas .tuc-*__*Sobrescrever as variáveis --tuc-* em :rootAs classes internas são montadas pelo script e o desenho sai dos tokens
Escrever abrir(), tamanho, 'direita'open/close/toggle, size, tone, side, items, actions; valores 'left', 'right', 'danger', 'success'A API é toda em inglês, e opção desconhecida é ignorada em silêncio
Ordenar no cliente uma lista paginadaDeixar o cabeçalho ser o <a> para ?sort= e ?dir=, com a ordem no order_by() antes do PaginatorOrdenar a página da tela produz uma ordem falsa. data-sort-mode="client" só para tabela pequena e sem paginação
Inventar classe vermelha para campo com erroaria-invalid="true" no campo e a mensagem em .tuc-errorÉ o atributo que o leitor de tela anuncia, e o Django 5 já o escreve
Abrir painel quando o campo recebe focoDeixar abrir por ↓, Espaço, clique; Enter também no selectÉ a regra do <select> nativo e do ARIA APG
Esquecer o hidden no painel do dropdown escrito no template<div class="tuc-dropdown" id="..." hidden>Sem ele o menu aparece no meio da página até o script rodar. O <dialog> do modal e da gaveta não precisa
Desenhar um segundo botão.tuc-btn com is-outline, is-ghost, is-icon, is-sm — inclusive dentro de tabelaClasse própria só para posicionar
Escrever o placeholder de campo com máscaraDeixar vazioEle sai do formato: data-tuc-mask="cpf" já nasce com 000.000.000-00, e data-tuc-mask="brl" com R$ 0,00
Carregar do CDN com @latestPrender a versão: tucano@v0.37.2O jsDelivr guarda @latest em cache por muito tempo e serve build antigo sem avisar
Importar de tucano pelo npm e esperar que os campos se montemTucano.init(document), ou importar tucano/autoPelo npm o auto-init não vem junto, para o empacotador levar só o que foi importado; o tucano/auto inicializa e escuta o HTMX como o script do CDN
Ler e.target.name no tucano:change do date pickere.detail.iso, ou o <input type="hidden"> ao ladoO date picker move o name para o hidden com o valor ISO; o campo visível fica sem nome. No select, na máscara e no upload o name continua no alvo
Escrever validação de CPF, formatação de moeda ou de data à mãoTucano.mask, Tucano.dates e Tucano.colorSão os mesmos módulos que os componentes usam, expostos como API: validateCpfCnpj, applyCurrency, format, parseUserInput, isDark
Montar um aviso flutuante próprio para o retorno do servidorAs messages do Django em <div data-tuc-toast>, ou o cabeçalho HX-Trigger com tucano:toastO toast já cuida de pilha, pausa no foco e das regiões que o leitor de tela anuncia; o evento do HTMX é escutado sozinho
Publicar o que veio do editor com |safe diretoSanitizar no servidor antesA peneira do editor protege o editor, não a publicação
Esperar que HTML inserido por fetch ou innerHTML se inicialize sozinhoChamar Tucano.init(node) no trecho novoO automático cobre o load e cada htmx:afterSwap; outro caminho de inserção a biblioteca não vê
Remover data-tuc-readyDeixar o atributoÉ ele que impede o autoInit de montar o mesmo campo duas vezes

Na dúvida, a referência gerada manda

Se um exemplo em prosa e a "Referência completa" do llms.txt discordarem, vale a referência: ela é extraída do código a cada build. Peça à IA para copiar o exemplo de cada seção em vez de deduzir, e para conferir cada opção nessa lista.