187 lines
3.8 KiB
SCSS
187 lines
3.8 KiB
SCSS
@use 'sass:math';
|
|
|
|
/* Breakpoints */
|
|
$mobile-breakpoint: get('breakpoints.mobile');
|
|
|
|
// Viewport Sizes
|
|
$desktop-width: get('viewports.desktop.width');
|
|
$desktop-height: get('viewports.desktop.height');
|
|
|
|
$mobile-width: get('viewports.mobile.width');
|
|
$mobile-height: get('viewports.mobile.height');
|
|
|
|
// Breakpoint
|
|
@mixin mobile {
|
|
@media (max-width: #{$mobile-breakpoint * 1px - 1px}) {
|
|
@content;
|
|
}
|
|
}
|
|
|
|
@mixin desktop {
|
|
@media (min-width: #{$mobile-breakpoint * 1px}) {
|
|
@content;
|
|
}
|
|
}
|
|
|
|
@function mobile-vw($pixels, $base-vw: $mobile-width) {
|
|
$px: math.div($pixels, $base-vw);
|
|
$perc: math.div($px, 1px);
|
|
@return calc($perc * 100vw);
|
|
}
|
|
|
|
@function mobile-vh($pixels, $base-vh: $mobile-height) {
|
|
$px: math.div($pixels, $base-vh);
|
|
$perc: math.div($px, 1px);
|
|
@return calc($perc * 100vh);
|
|
}
|
|
|
|
@function desktop-vw($pixels, $base-vw: $desktop-width) {
|
|
$px: math.div($pixels, $base-vw);
|
|
$perc: math.div($px, 1px);
|
|
@return calc($perc * 100vw);
|
|
}
|
|
|
|
@function desktop-vh($pixels, $base-vh: $desktop-height) {
|
|
$px: math.div($pixels, $base-vh);
|
|
$perc: math.div($px, 1px);
|
|
@return calc($perc * 100vh);
|
|
}
|
|
|
|
@function columns($columns) {
|
|
@return calc(
|
|
(#{$columns} * var(--layout-column-width)) +
|
|
((#{$columns} - 1) * var(--layout-column-gap))
|
|
);
|
|
}
|
|
|
|
@mixin child-grid($columns) {
|
|
grid-template-columns: repeat($columns, minmax(0, 1fr));
|
|
column-gap: var(--layout-columns-gap);
|
|
display: grid;
|
|
}
|
|
|
|
@mixin reduced-motion {
|
|
@media (prefers-reduced-motion: reduce) {
|
|
@content;
|
|
}
|
|
}
|
|
|
|
@mixin fill($position: absolute) {
|
|
position: #{$position};
|
|
bottom: 0;
|
|
right: 0;
|
|
left: 0;
|
|
top: 0;
|
|
}
|
|
|
|
@mixin fade-on-ready($class: 'ready', $duration: 400ms) {
|
|
opacity: 0;
|
|
transition: opacity $duration ease;
|
|
|
|
&.#{$class} {
|
|
opacity: 1;
|
|
}
|
|
}
|
|
|
|
// Clamp text block to number of lines
|
|
@mixin line-clamp($lines: 3, $mobile-lines: $lines) {
|
|
display: -webkit-box;
|
|
overflow: hidden;
|
|
text-overflow: ellipsis;
|
|
-webkit-box-orient: vertical;
|
|
-webkit-line-clamp: $lines;
|
|
|
|
@include mobile {
|
|
-webkit-line-clamp: $mobile-lines;
|
|
}
|
|
}
|
|
|
|
// Flip animations
|
|
@keyframes flip-r {
|
|
50% {
|
|
transform: translateX(100%);
|
|
opacity: 0;
|
|
}
|
|
51% {
|
|
transform: translateX(-100%);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
@keyframes flip-l {
|
|
50% {
|
|
transform: translateX(-100%);
|
|
opacity: 0;
|
|
}
|
|
51% {
|
|
transform: translateX(100%);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
@keyframes flip-d {
|
|
50% {
|
|
transform: translateY(100%);
|
|
opacity: 0;
|
|
}
|
|
51% {
|
|
transform: translateY(-100%);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
@keyframes flip-u {
|
|
50% {
|
|
transform: translateY(-100%);
|
|
opacity: 0;
|
|
}
|
|
51% {
|
|
transform: translateY(100%);
|
|
opacity: 0;
|
|
}
|
|
}
|
|
|
|
@mixin flip-animation(
|
|
$direction: 'r',
|
|
$duration: 600ms,
|
|
$easing: var(--ease-out-expo),
|
|
$iteration-count: 1
|
|
) {
|
|
overflow: hidden;
|
|
animation: flip-#{$direction} $duration $easing $iteration-count forwards;
|
|
}
|
|
|
|
@mixin link-hover {
|
|
position: relative;
|
|
|
|
&::before {
|
|
content: '';
|
|
position: absolute;
|
|
bottom: 0;
|
|
left: 0;
|
|
right: 0;
|
|
height: 1px;
|
|
background: var(--theme-fg);
|
|
transform-origin: left;
|
|
transform: scaleX(0);
|
|
transition: transform 300ms var(--ease-out-quad);
|
|
}
|
|
@include desktop {
|
|
&:hover::before {
|
|
transform: scaleX(1);
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin stagger-animate($stagger: 100, $num-children: 10, $base-delay: 0) {
|
|
@for $i from 0 through $num-children {
|
|
&:nth-child(#{$i + 1}) {
|
|
transition-delay: #{$stagger * $i + $base-delay}ms;
|
|
}
|
|
}
|
|
}
|
|
|
|
@mixin hover {
|
|
@include desktop {
|
|
&:hover {
|
|
@content;
|
|
}
|
|
}
|
|
}
|