Tema
Botones y controles
Los botones son el componente que más se repite en cualquier sitio. Aquí tienes una colección lista para copiar: variantes de estilo, botones con icono y estado de carga, interruptores (toggle), el cambio de modo oscuro y el clásico botón "volver arriba".
Cada demo usa variables CSS en :root: cambia dos o tres valores y el componente adopta los colores de tu marca.
¿Botón o enlace?
Usa <button> cuando la acción ocurre en la misma página (abrir un modal, enviar un formulario). Usa <a href> cuando llevas al usuario a otra URL. Puedes darles el mismo estilo, pero su significado para teclado y lectores de pantalla es distinto.
Colección de botones
Cuándo usarlo: como base del sistema de botones de cualquier proyecto: llamadas a la acción (CTA), formularios, barras de herramientas y acciones destructivas.
Cómo personalizarlo
- Cambia
--primario,--primario-oscuroy--acentopara adaptar todas las variantes a tu marca. --radiocontrola el redondeo:0para un look serio,999pxpara botones tipo píldora.- Combina clases:
btn btn-outline btn-lg btn-redondo. Los modificadores de tamaño (btn-sm,btn-lg,btn-bloque) funcionan con cualquier variante. - Para deshabilitar un
<button>usa el atributodisabled; en un enlace usaaria-disabled="true"ytabindex="-1".
Error común
Quitar el contorno de foco con outline: none sin poner nada a cambio. Quien navega con teclado deja de saber dónde está. Usa :focus-visible como en la demo.
Botones con icono y estado de carga
Cuándo usarlo: acciones que se entienden mejor con un icono (descargar, compartir, me gusta) y botones que lanzan una petición al servidor, donde hay que mostrar que algo está pasando.
Cómo personalizarlo
- Los iconos son SVG en línea con
stroke="currentColor": toman el color del texto del botón automáticamente. - Un botón solo de icono siempre necesita
aria-label(por ejemploaria-label="Compartir"); el SVG llevaaria-hidden="true". - El estado de carga se activa con
aria-busy="true". El CSS muestra el spinner y oculta el icono. En tu código real, quita el atributo cuando termine elfetch. - Cambia
--primariopara el color del botón relleno.
Toggle switch
Cuándo usarlo: para opciones de encendido/apagado que se aplican al instante, como en pantallas de ajustes (notificaciones, privacidad, preferencias).
Cómo personalizarlo
--activoe--inactivoson los colores de la pista;--perillael círculo.- Cambia
--anchoy--altopara hacerlo más grande o más pequeño: el desplazamiento se calcula solo concalc(). - Es un
<input type="checkbox" role="switch">real, así que funciona con teclado (barra espaciadora), se envía en formularios y se puede leer coninput.checked.
Buena práctica
Si el cambio necesita un botón "Guardar" para aplicarse, usa una casilla (checkbox) normal. El switch comunica que el efecto es inmediato.
Interruptor de modo oscuro
Cuándo usarlo: en blogs, documentación, paneles y cualquier sitio donde los usuarios pasan mucho tiempo leyendo.
Cómo personalizarlo
- Todo el tema vive en variables: define los colores claros en
:rooty los oscuros en[data-tema="oscuro"]. Cualquier componente que use esas variables cambia solo. - El orden de prioridad es: 1) lo que eligió el usuario (guardado en
localStorage), 2) la preferencia del sistema (prefers-color-scheme). color-scheme: darkhace que las barras de scroll y los controles nativos también se oscurezcan.- El acceso a
localStorageva dentro detry/catchporque puede fallar en modo incógnito o dentro de iframes.
Error común
Aplicar el tema guardado al final de la página provoca un "destello" blanco al cargar. En un sitio real, pon el pequeño script que lee la preferencia dentro del <head>, antes del CSS.
Botón "volver arriba"
Cuándo usarlo: en páginas largas (artículos, landing pages, catálogos) para que el usuario regrese al inicio sin hacer scroll eterno, sobre todo en móvil.
Cómo personalizarlo
--color,--tamanoy--separacioncontrolan su aspecto y posición. Para ponerlo a la izquierda, cambiarightporleft.- La constante
UMBRALen el JS define cuántos píxeles hay que bajar para que aparezca. - El scroll suave viene de
scroll-behavior: smoothy se desactiva si el usuario pidió menos movimiento (prefers-reduced-motion). - Al hacer clic se mueve el foco al título para que la navegación con teclado también "vuelva arriba".
Resumen
- Una clase base
.btn+ modificadores evita repetir CSS. - Botones solo con icono: siempre
aria-label. - Switch = checkbox real con
role="switch"; el estado de carga conaria-busy. - Modo oscuro = redefinir variables CSS y recordar la elección con
localStorageprotegido portry/catch.