Tucano v0.37.2

Grupo de botões

Dois papéis na mesma caixa. Emendado, ele junta ações que andam juntas num bloco só, em vez de três botões soltos na linha. Com is-segmented, ele veste o <input> de botão — a escolha de uma opção entre poucas, com a cara das abas segmentadas. É só classe: nenhum JavaScript, e o valor continua sendo do <input> nativo.

Período: day

Exemplos

O mesmo .tuc-btn-group por fora; por dentro, ou botões, ou rótulos com um <input> dentro.

Uma opção entre poucas

É type="radio": o navegador desmarca a anterior, e as setas andam pelo grupo.

Várias ao mesmo tempo

Trocando para type="checkbox", cada botão liga e desliga por conta própria.

Ações emendadas

Sem is-segmented, os botões dividem a borda e arredondam só nas pontas. Vale qualquer variante.

Pequeno, ao lado de um campo

is-sm nos botões acerta a altura de um is-sm; o canto acompanha.

Linha inteira

is-block ocupa a largura toda e reparte em partes iguais — o caminho no celular.

Com rótulo e ajuda

Dentro do formulário ele é um campo como os outros: .tuc-label em cima, .tuc-hint embaixo.

Regime

Muda o cálculo dos impostos na nota.

Como usar

Na escolha, o <input> fica dentro do <label class="tuc-btn">, e como filho direto: é ele que o CSS lê para saber quem está marcado.

&lt;div class="tuc-btn-group is-segmented" role="group" aria-label="Período"&gt;
  &lt;label class="tuc-btn"&gt;
    &lt;input type="radio" class="tuc-btn__input" name="period" value="day" checked&gt; Dia
  &lt;/label&gt;
  &lt;label class="tuc-btn"&gt;
    &lt;input type="radio" class="tuc-btn__input" name="period" value="week"&gt; Semana
  &lt;/label&gt;
&lt;/div&gt;

&lt;div class="tuc-btn-group" role="group" aria-label="Ações do contrato"&gt;
  &lt;button type="button" class="tuc-btn is-outline"&gt;Editar&lt;/button&gt;
  &lt;button type="button" class="tuc-btn is-outline"&gt;Duplicar&lt;/button&gt;
&lt;/div&gt;

O role="group" com aria-label (ou aria-labelledby apontando para o rótulo) é o que faz o leitor de tela anunciar do que se trata a fileira. Num formulário, o <fieldset> com <legend> também serve — só não ponha a legenda dentro do grupo, que é uma linha de botões.

No formulário do Django

Nada de widget novo: é o RadioSelect de sempre, com a classe no attrs e percorrido no template.

period = forms.ChoiceField(
    choices=[('day', 'Dia'), ('week', 'Semana'), ('month', 'Mês')],
    widget=forms.RadioSelect(attrs={'class': 'tuc-btn__input'}),
)
&lt;div class="tuc-btn-group is-segmented" role="group" aria-label="{{ form.period.label }}"&gt;
  {% for radio in form.period %}
    &lt;label class="tuc-btn"&gt;{{ radio.tag }} {{ radio.choice_label }}&lt;/label&gt;
  {% endfor %}
&lt;/div&gt;

Parece uma aba, mas não é

A aba segmentada troca o que se vê na tela e não vai para o servidor. O grupo de botões é campo: tem name, tem value, entra no POST e aceita required. Se a escolha vai junto com o formulário, é aqui; se ela só mostra outro painel, é lá.

Até umas quatro opções, e curtas

Todas ficam à vista ao mesmo tempo, lado a lado: com muitas, ou com textos longos, a fileira estoura a linha no celular. Passando disso, use o select ou as opções em lista — que também são o certo quando cada opção precisa de uma explicação embaixo.

Teclado e acessibilidade

Tudo nativo. Na escolha, quem recebe o foco é o <input> — invisível, mas presente: ele fica com opacidade zero, e não escondido, justamente para continuar focável e anunciado. O anel de foco aparece no botão em volta dele.

TeclaOndeAção
TabGrupo de rádiosEntra na opção marcada e sai do grupo — o grupo inteiro é uma parada só
← → ↑ ↓Rádio com focoAnda pelas opções e já marca a de chegada
TabCaixas e botõesCada um é uma parada, porque cada um age por conta própria
EspaçoCaixa com focoLiga e desliga
Enter EspaçoBotão de açãoAciona

Classes

Só CSS. A caixa é a mesma da aba segmentada, de propósito: as duas precisam alinhar com os campos da linha, e por isso a borda mais o respiro somam exatamente --tuc-control-height.

ClassePara quê
tuc-btn-groupA fileira. Sozinha, emenda os botões num bloco só
is-segmentedA caixa rebaixada das abas segmentadas, para a escolha em botão
is-blockOcupa a linha toda, repartida em partes iguais
tuc-btn__inputO <input> dentro do rótulo: invisível, focável e ainda dono do valor
tuc-btn e suas variantesCada item do grupo — is-outline, is-primary, is-sm, is-icon