////
/// @group Utilidades
////
/// Direcciones posibles
$directions: (top, right, bottom, left);
/// Crea una propiedad con prefijos de navegador, cuando no es
/// soportada por estándares, por ejemplo el guionado de texto.
@mixin vendor-prefix($property, $definition...) {
@each $prefix in $vendor-prefixes {
#{$prefix}$property: $definition;
}
}
/// Los recursos que cargan a demanda muestran el espacio que ocupan.
[loading="lazy"] {
background: linear-gradient(215deg, #{$white} 0%, #{$primary} 100%);
}
@each $breakpoint in map-keys($grid-breakpoints) {
@include media-breakpoint-up($breakpoint) {
/// Obtiene el sufijo para cada clase responsive usando mixins de
/// Bootstrap. Valores posibles:
/// `""` (nada, aplica a todas las resoluciones), `-xs`, `-sm`,
/// `-md`, `-lg`, `-xl`.
$infix: breakpoint-infix($breakpoint, $grid-breakpoints);
/// Grilla en CSS, soporta armar una cantidad de columnas, indicar las
/// columnas que ocupan los elementos descendientes e incluso
/// solapamiento.
///
/// @example html
///
///
///
///
.d#{$infix}-grid {
display: grid !important;
@each $spacer, $_ in $spacers {
&.grid-cols#{$infix}-#{$spacer} {
grid-template-columns: repeat($spacer, 1fr) !important;
}
& > .grid-row#{$infix}-#{$spacer} {
grid-row: $spacer !important;
}
& > .grid-col#{$infix}-#{$spacer} {
grid-column: $spacer !important;
}
@each $spacer_to, $_ in $spacers {
& > .grid-col#{$infix}-#{$spacer}-to-#{$spacer_to} {
grid-column: #{$spacer} / #{$spacer_to} !important;
}
}
}
}
/// Ocultar la barra de scroll, útil para sliders horizontales.
///
/// @example html
///
.no-scrollbar#{$infix} {
scrollbar-width: none;
-webkit-overflow-scrolling: touch;
&::-webkit-scrollbar { display: none; }
}
:enabled {
.show-when-disabled#{$infix} {
display: none !important;
}
}
:disabled {
.hide-when-disabled#{$infix} {
display: none !important;
}
}
/// Un elemento cuadrado
///
/// @example html
///
.square#{$infix} {
position: relative !important;
padding-bottom: 100%;
& > * {
position: absolute !important;
top: 0 !important;
left: 0 !important;
height: 100% !important;
}
}
/// Cursores
$cursors: (pointer, none);
@each $cursor in $cursors {
/// El elemento va a tener un cursor
///
/// @example html
///
.cursor#{$infix}-#{$cursor} {
cursor: $cursor;
}
}
/// Eventos del cursor
$events: (none, auto);
@each $event in $events {
/// Habilita o deshabilita recibir eventos al tocar o clickear.
///
/// @example html
///
.pointer-event#{$infix}-#{$event} {
pointer-events: $event;
}
}
/// Agrega una transición a cualquier modificación de atributos
.transition#{$infix} {
@include transition($transition-base);
}
/// Valores posibles para la propiedad `object-fit`
$objects: (contain, cover, fill, none, scale-down);
@each $object in $objects {
/// Ajustes de imagen y video con respecto al contenedor
///
/// @example html
///
.fit#{$infix}-#{$object} {
object-fit: #{$object};
}
}
/// _Overflow_, qué hacer cuando el contenido sobrepasa los límites del
/// contenedor.
$overflows: (auto, hidden, scroll);
/// También puede ser solo dentro de un eje
$overflow-axis: (x, y);
@each $overflow in $overflows {
/// Manejar el contenido sobre cualquier eje
///
/// @example html
///
.overflow#{$infix}-#{$overflow} {
overflow: $overflow !important;
}
@each $axis in $overflow-axis {
/// Manejar el contenido sobre un eje particular
///
/// @example html
///
.overflow-#{$axis}#{$infix}-#{$overflow} {
overflow-#{$axis}: $overflow !important;
}
}
}
@each $spacer, $length in $spacers {
/// Poder aumentar o disminuir el alto de la tipografía. Los
/// `spacers` están definidos en Bootstrap y pueden ser extendidos
/// desde styles.scss
///
/// @link assets/css/styles.scss
/// @example html
///
.f#{$infix}-#{$spacer} {
font-size: $length !important;
}
/// Columnas de texto
///
/// @example html
///
.text-column#{$infix}-#{$spacer} {
column-count: $spacer;
}
/// Limitar la cantidad de líneas de un bloque de texto,
/// reemplazando el sobrante por puntos suspensivos. Es útil cuando
/// el diseño solo pide una cantidad de líneas pero no sabemos cuál
/// va a ser el largo.
///
/// @example html
///
.line-clamp#{$infix}-#{$spacer} {
overflow: hidden;
display: -webkit-box;
-webkit-line-clamp: $spacer;
-webkit-box-orient: vertical;
}
@each $direction in $directions {
/// Ubicación absoluta, usar con position-*
///
/// @example html
///
.#{$direction}#{$infix}-#{$spacer} {
#{$direction}: $length
}
}
}
/// Anchos y altos en base a `$sizes` definido por Bootstrap. Para
/// personalizar los tamaños, modificarlos o agregarlos en `styles.scss`
///
/// @link assets/css/styles.scss
@each $prop, $abbrev in (width: w, height: h) {
@each $size, $length in $sizes {
.#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }
.#{$abbrev}#{$infix}-#{$size} { #{$prop}: $length !important; }
.min-#{$abbrev}#{$infix}-#{$size} { min-#{$prop}: $length !important; }
.max-#{$abbrev}#{$infix}-#{$size} { max-#{$prop}: $length !important; }
}
}
/// Tipos de _scroll_ posible
$scrolls: (auto, smooth);
@each $scroll in $scrolls {
/// Poder modificar el tipo de _scroll_ de forma _responsive_
///
/// @example html
///
.scroll#{$infix}-#{$scroll} {
scroll-behavior: #{$scroll};
}
}
/// Bordes. Bootstrap no define bordes _responsive_
///
/// @link node_modules/bootstrap/scss/utilities/_borders.scss
/// @example html
///
.border#{$infix} { border: $border-width solid $border-color !important; }
.border#{$infix}-0 { border: 0 !important; }
@each $direction in $directions {
.border#{$infix}-#{$direction} { border-#{$direction}: $border-width solid $border-color !important; }
.border#{$infix}-#{$direction}-0 { border-#{$direction}: 0 !important; }
}
$aligns: (left,center,right);
@each $align in $aligns {
/// Alineación _responsive_
///
/// @example html
///
.text#{$infix}-#{$align} { text-align: $align !important; }
}
@each $position in $positions {
/// Posicionamiento
///
/// @example html
///
.position#{$infix}-#{$position} { position: $position !important; }
}
@each $color, $rgb in $colors {
/// Colores de fondo. Es raro que usemos versiones _responsive_, pero
/// no está de más tenerlas.
///
/// @link assets/css/styles.scss
/// @example html
///
.background#{$infix}-#{$color} {
background-color: var(--#{$color});
&:focus {
background-color: var(--#{$color});
}
}
@each $opacity, $degree in $opacities {
/// Color de fondo con transparencia (opacidad)
///
/// @example html
///
.background#{$infix}-#{$color}-t#{$opacity} {
background-color: scale-color($rgb, $alpha: $degree);
}
}
/// Atributos de SVG
$svg-attributes: (stroke, fill);
@each $attr in $svg-attributes {
/// Poder cambiar el relleno o la línea de un SVG
///
/// @example html
///
///
///
.#{$attr}#{$infix}-#{$color} {
svg {
* {
#{$attr}: var(--#{$color});
}
}
}
}
/// Barras de _scroll_ de colores
///
/// @example html
///
.scrollbar#{$infix}-#{$color} {
scrollbar-color: var(--#{$color}) transparent;
scrollbar-width: thin;
&::-webkit-scrollbar {
width: 5px;
height: 8px;
background-color: transparent;
}
&::-webkit-scrollbar-thumb {
background: var(--#{$color});
}
}
/// Bordes de color
///
/// @example html
///
.border#{$infix}-#{$color} {
border-color: var(--#{$color}) !important;
}
/// Cambiar el fondo al pasar por encima o hacer foco
///
/// @example html
///
.background-hover#{$infix}-#{$color} {
&:hover,
&:focus-within {
background-color: var(--#{$color});
}
}
/// Cambiar el color al pasar por encima o hacer foco
///
/// @example html
///
.hover-#{$color} {
&:hover,
&:focus-within {
color: var(--#{$color}) !important;
}
}
/// Cambiar el color, también aplica a la selección de texto.
///
/// @example html
///
.#{$color}#{$infix} {
color: var(--#{$color});
&:focus {
color: var(--#{$color});
}
/// Invertir el color en la selección, con el mismo color de fondo y
/// texto en blanco.
::-moz-selection,
::selection {
background: var(--#{$color});
color: white;
}
/// Si el contenedor tiene un color, también aplica a los bordes de los
/// elementos de un formulario.
///
/// @todo Evaluar si es realmente necesario hacerlo así, porque no
/// aplica a las sombras.
.form-control {
border-color: var(--#{$color});
color: var(--#{$color});
}
/// Los `` también cambian de color.
///
/// @example html
///