Tucano v0.37.2

Grupo de botones

Dos papeles en la misma caja. Unido, junta en un solo bloque las acciones que van juntas, en vez de tres botones sueltos en la línea. Con is-segmented, viste el <input> de botón — la elección de una opción entre pocas, con la cara de las pestañas segmentadas. Solo clases: nada de JavaScript, y el valor sigue siendo del <input> nativo.

Periodo: day

Ejemplos

El mismo .tuc-btn-group por fuera; por dentro, o botones, o rótulos con un <input> dentro.

Una opción entre pocas

Es type="radio": el navegador desmarca la anterior, y las flechas recorren el grupo.

Varias a la vez

Cambiando a type="checkbox", cada botón se enciende y se apaga por su cuenta.

Acciones unidas

Sin is-segmented, los botones comparten el borde y solo se redondean en las puntas. Vale cualquier variante.

Pequeño, al lado de un campo

is-sm en los botones acierta la altura de un is-sm; la esquina acompaña.

Línea entera

is-block ocupa todo el ancho y lo reparte en partes iguales — el camino en el móvil.

Con rótulo y ayuda

Dentro del formulario es un campo como los demás: .tuc-label arriba, .tuc-hint abajo.

Régimen

Cambia el cálculo de los impuestos en la factura.

Cómo se usa

En la elección, el <input> va dentro del <label class="tuc-btn">, y como hijo directo: es lo que el CSS lee para saber cuál está marcado.

&lt;div class="tuc-btn-group is-segmented" role="group" aria-label="Periodo"&gt;
  &lt;label class="tuc-btn"&gt;
    &lt;input type="radio" class="tuc-btn__input" name="period" value="day" checked&gt; Día
  &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="Acciones del 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;

El role="group" con aria-label (o aria-labelledby apuntando al rótulo) es lo que hace que el lector de pantalla anuncie de qué va la fila. En un formulario, el <fieldset> con <legend> también sirve — solo que no pongas la leyenda dentro del grupo, que es una fila de botones.

En el formulario de Django

Nada de widget nuevo: es el RadioSelect de siempre, con la clase en attrs y recorrido en la plantilla.

period = forms.ChoiceField(
    choices=[('day', 'Día'), ('week', 'Semana'), ('month', 'Mes')],
    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 una pestaña, pero no lo es

La pestaña segmentada cambia lo que se ve en la pantalla y no llega al servidor. El grupo de botones es un campo: tiene name, tiene value, entra en el POST y acepta required. Si la elección viaja con el formulario, es aquí; si solo muestra otro panel, es allí.

Hasta unas cuatro opciones, y cortas

Todas quedan a la vista al mismo tiempo, una al lado de la otra: con muchas, o con textos largos, la fila revienta la línea en el móvil. De ahí en adelante, usa el select o las opciones en lista — que también son lo correcto cuando cada opción necesita una explicación debajo.

Teclado y accesibilidad

Todo nativo. En la elección, quien recibe el foco es el <input> — invisible, pero presente: se queda con opacidad cero, y no escondido, justamente para seguir siendo enfocable y anunciado. El anillo de foco aparece en el botón que lo rodea.

TeclaDóndeAcción
TabGrupo de radiosEntra en la opción marcada y sale del grupo — el grupo entero es una sola parada
← → ↑ ↓Radio con focoRecorre las opciones y marca la de llegada
TabCasillas y botonesCada uno es una parada, porque cada uno actúa por su cuenta
EspacioCasilla con focoLa enciende y la apaga
Enter EspacioBotón de acciónLo acciona

Clases

Solo CSS. La caja es la misma de la pestaña segmentada, a propósito: las dos tienen que alinear con los campos de la fila, y por eso el borde más el respiro suman exactamente --tuc-control-height.

ClasePara qué
tuc-btn-groupLa fila. Sola, une los botones en un solo bloque
is-segmentedLa caja rebajada de las pestañas segmentadas, para la elección en botón
is-blockOcupa la línea entera, repartida en partes iguales
tuc-btn__inputEl <input> dentro del rótulo: invisible, enfocable y todavía dueño del valor
tuc-btn y sus variantesCada elemento del grupo — is-outline, is-primary, is-sm, is-icon