mirror of
https://github.com/jxxghp/MoviePilot-Frontend.git
synced 2026-05-12 02:21:06 +08:00
194 lines
3.8 KiB
SCSS
194 lines
3.8 KiB
SCSS
@use "sass:map";
|
||
@use "sass:list";
|
||
@use "sass:string";
|
||
|
||
// Thanks: https://css-tricks.com/snippets/sass/deep-getset-maps/
|
||
@function map-deep-get($map, $keys...) {
|
||
@each $key in $keys {
|
||
$map: map.get($map, $key);
|
||
}
|
||
|
||
@return $map;
|
||
}
|
||
|
||
@function map-deep-set($map, $keys, $value) {
|
||
$maps: ($map,);
|
||
$result: null;
|
||
|
||
// If the last key is a map already
|
||
// Warn the user we will be overriding it with $value
|
||
@if type-of(nth($keys, -1)) == "map" {
|
||
@warn "The last key you specified is a map; it will be overrided with `#{$value}`.";
|
||
}
|
||
|
||
// If $keys is a single key
|
||
// Just merge and return
|
||
@if length($keys) == 1 {
|
||
@return map-merge($map, ($keys: $value));
|
||
}
|
||
|
||
// Loop from the first to the second to last key from $keys
|
||
// Store the associated map to this key in the $maps list
|
||
// If the key doesn't exist, throw an error
|
||
@for $i from 1 through length($keys) - 1 {
|
||
$current-key: list.nth($keys, $i);
|
||
$current-map: list.nth($maps, -1);
|
||
$current-get: map.get($current-map, $current-key);
|
||
|
||
@if not $current-get {
|
||
@error "Key `#{$key}` doesn't exist at current level in map.";
|
||
}
|
||
|
||
$maps: list.append($maps, $current-get);
|
||
}
|
||
|
||
// Loop from the last map to the first one
|
||
// Merge it with the previous one
|
||
@for $i from length($maps) through 1 {
|
||
$current-map: list.nth($maps, $i);
|
||
$current-key: list.nth($keys, $i);
|
||
$current-val: if($i == list.length($maps), $value, $result);
|
||
$result: map.map-merge($current-map, ($current-key: $current-val));
|
||
}
|
||
|
||
// Return result
|
||
@return $result;
|
||
}
|
||
|
||
// font size utility classes
|
||
// font size
|
||
$font-sizes: (
|
||
"xs": 0.75rem,
|
||
"sm": 0.875rem,
|
||
"base": 1rem,
|
||
"lg": 1.125rem,
|
||
"xl": 1.25rem,
|
||
"2xl": 1.5rem,
|
||
"3xl": 1.875rem,
|
||
"4xl": 2.25rem,
|
||
"5xl": 3rem,
|
||
"6xl": 3.75rem,
|
||
"7xl": 4.5rem,
|
||
"8xl": 6rem,
|
||
"9xl": 8rem
|
||
);
|
||
|
||
// font line-height
|
||
$font-line-height: (
|
||
"xs": 1rem,
|
||
"sm": 1.25rem,
|
||
"base": 1.5rem,
|
||
"lg": 1.75rem,
|
||
"xl": 1.75rem,
|
||
"2xl": 2rem,
|
||
"3xl": 2.25rem,
|
||
"4xl": 2.5rem,
|
||
"5xl": 1,
|
||
"6xl": 1,
|
||
"7xl": 1,
|
||
"8xl": 1,
|
||
"9xl": 1
|
||
);
|
||
|
||
@each $name, $size in $font-sizes {
|
||
.text-#{$name} {
|
||
font-size: $size;
|
||
line-height: map.get($font-line-height, $name);
|
||
}
|
||
}
|
||
|
||
// truncate utility class
|
||
.truncate {
|
||
overflow: hidden;
|
||
text-overflow: ellipsis;
|
||
white-space: nowrap;
|
||
}
|
||
|
||
// gap utility class
|
||
$gap: (
|
||
"0": 0,
|
||
"1": 0.25rem,
|
||
"2": 0.5rem,
|
||
"3": 0.75rem,
|
||
"4": 1rem,
|
||
"5": 1.25rem,
|
||
"6":1.5rem,
|
||
"7": 1.75rem,
|
||
"8": 2rem,
|
||
"9": 2.25rem,
|
||
"10": 2.5rem,
|
||
"11": 2.75rem,
|
||
"12": 3rem,
|
||
"14": 3.5rem,
|
||
"16": 4rem,
|
||
"20": 5rem,
|
||
"24": 6rem,
|
||
"28": 7rem,
|
||
"32": 8rem,
|
||
"36": 9rem,
|
||
"40": 10rem,
|
||
"44": 11rem,
|
||
"48": 12rem,
|
||
"52": 13rem,
|
||
"56": 14rem,
|
||
"60": 15rem,
|
||
"64": 16rem,
|
||
"72": 18rem,
|
||
"80": 20rem,
|
||
"96": 24rem
|
||
);
|
||
|
||
@each $name, $size in $gap {
|
||
.gap-#{$name} {
|
||
gap: $size;
|
||
}
|
||
|
||
.gap-x-#{$name} {
|
||
column-gap: $size;
|
||
}
|
||
|
||
.gap-y-#{$name} {
|
||
row-gap: $size;
|
||
}
|
||
}
|
||
|
||
/*
|
||
ℹ️ This function is helpful when we have multi dimensional value
|
||
|
||
Assume we have padding variable `$nav-padding-horizontal: 10px;`
|
||
With above variable let's say we use it in some style:
|
||
```scss
|
||
.selector {
|
||
margin-left: $nav-padding-horizontal;
|
||
}
|
||
```
|
||
|
||
Now, problem is we can also have value as `$nav-padding-horizontal: 10px 15px;`
|
||
In this case above style will be invalid.
|
||
|
||
This function will extract the left most value from the variable value.
|
||
|
||
$nav-padding-horizontal: 10px; => 10px;
|
||
$nav-padding-horizontal: 10px 15px; => 10px;
|
||
|
||
This is safe:
|
||
```scss
|
||
.selector {
|
||
margin-left: get-first-value($nav-padding-horizontal);
|
||
}
|
||
```
|
||
*/
|
||
@function get-first-value($var) {
|
||
$start-at: string.index(#{$var}, " ");
|
||
|
||
@if $start-at {
|
||
@return string.slice(
|
||
#{$var},
|
||
0,
|
||
$start-at
|
||
);
|
||
} @else {
|
||
@return $var;
|
||
}
|
||
}
|