Botones
Estado: BetaBotón que se hunde
Un botón con canto: la cara descansa sobre su base y al presionarla baja hasta casi tocarla; al soltar regresa con un rebote pequeño de resorte. Se siente igual con el dedo, el mouse o el teclado. Para la acción que se tiene que sentir: reservar, pagar, hacer check-in.
- Resorte
- Tecla 3D
- Teclado
app/views/… (la demo de arriba)
<div class="flex flex-wrap items-center justify-center gap-2.5">
<%= render Ui::PressButtonComponent.new do %>Reservar clase<% end %>
<%= render Ui::PressButtonComponent.new(variant: :secondary) do %>Ver horario<% end %>
</div>Qué hace
- La cara baja con un resorte rápido y sube con uno subamortiguado: si sueltas a medio camino, regresa desde donde iba.
- El canto se calcula de la luz del estudio (más oscuro, o más claro si la tecla es casi negra).
- Al pasar el cursor la tecla se alza 1px, sin rebote; en táctil no.
- Sin JS sigue hundiéndose con :active.
Props
| Nombre | Tipo | Default | Descripción |
|---|---|---|---|
| variant | :primary | :secondary | :primary | Cara con la luz del estudio, o superficie con borde de 1px. |
| size | :sm | :md | :lg | :md | Alto (sigue el dial de densidad) y profundidad del canto (3px en :sm, 4px en :md y :lg). |
| href | String | nil | Lo vuelve un enlace <a> con el mismo gesto. |
| type | String | "button" | Tipo del <button>; "submit" para enviar su formulario. |
| disabled | Boolean | false | Deshabilita el botón; en un enlace quita el href y marca aria-disabled. |
| full_width | Boolean | false | Ocupa todo el ancho de su contenedor. |
| data | Hash | {} | Atributos data; el controlador y las acciones se combinan con los tuyos. |
Accesibilidad
- Es un <button> o <a> nativo; Espacio y Enter lo hunden mientras la tecla sigue abajo.
- Anillo de foco visible solo con teclado, alrededor de toda la tecla.
- El canto es decorativo (aria-hidden) y no cambia el nombre accesible.
- Con movimiento reducido la cara salta en lugar de rebotar.