@nuvoui/core 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +19 -0
- package/dist/dark.css +1 -0
- package/dist/index.css +1 -0
- package/dist/index.css.map +1 -0
- package/dist/index.html +15 -0
- package/dist/light.css +1 -0
- package/dist/main.css +1 -0
- package/dist/main.js +1 -0
- package/package.json +43 -0
- package/src/js/main.js +1 -0
- package/src/styles/_global.scss +3 -0
- package/src/styles/base/_base.scss +75 -0
- package/src/styles/base/_reset.scss +92 -0
- package/src/styles/components/_alert.scss +0 -0
- package/src/styles/components/_avatar.scss +0 -0
- package/src/styles/components/_badge.scss +0 -0
- package/src/styles/components/_breadcrumb.scss +0 -0
- package/src/styles/components/_button.scss +247 -0
- package/src/styles/components/_calendar.scss +0 -0
- package/src/styles/components/_card.scss +0 -0
- package/src/styles/components/_checkbox.scss +23 -0
- package/src/styles/components/_dropdown.scss +0 -0
- package/src/styles/components/_form.scss +157 -0
- package/src/styles/components/_modal.scss +0 -0
- package/src/styles/components/_navbar.scss +125 -0
- package/src/styles/components/_pagination.scss +0 -0
- package/src/styles/components/_progress.scss +0 -0
- package/src/styles/components/_radio.scss +0 -0
- package/src/styles/components/_sidebar.scss +0 -0
- package/src/styles/components/_table.scss +0 -0
- package/src/styles/components/_tabs.scss +0 -0
- package/src/styles/components/_tooltip.scss +0 -0
- package/src/styles/index.scss +34 -0
- package/src/styles/layouts/_container.scss +49 -0
- package/src/styles/layouts/_flex.scss +138 -0
- package/src/styles/layouts/_grid.scss +147 -0
- package/src/styles/themes/_dark.scss +26 -0
- package/src/styles/themes/_light.scss +23 -0
- package/src/styles/themes/_theme.scss +136 -0
- package/src/styles/utilities/_animations.scss +135 -0
- package/src/styles/utilities/_colors.scss +158 -0
- package/src/styles/utilities/_functions.scss +59 -0
- package/src/styles/utilities/_position.scss +97 -0
- package/src/styles/utilities/_shadows.scss +107 -0
- package/src/styles/utilities/_spacing.scss +109 -0
- package/src/styles/utilities/_tooltips.scss +213 -0
- package/src/styles/utilities/_typography.scss +108 -0
- package/src/styles/utilities/_variables.scss +70 -0
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
@use 'sass:list';
|
|
2
|
+
|
|
3
|
+
@use 'sass:map';
|
|
4
|
+
@use './functions' as *;
|
|
5
|
+
|
|
6
|
+
$generated-keyframes: ();
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@mixin generateBounceKeyframes($keyframeName, $x, $y) {
|
|
10
|
+
@if not list.index($generated-keyframes, $keyframeName) {
|
|
11
|
+
$generated-keyframes: list.append($generated-keyframes, $keyframeName) !global;
|
|
12
|
+
|
|
13
|
+
@keyframes #{$keyframeName} {
|
|
14
|
+
0% {
|
|
15
|
+
transform: translateX(-#{$x}) translateY(-#{$y});
|
|
16
|
+
}
|
|
17
|
+
50% {
|
|
18
|
+
transform: translateX(#{$x}) translateY(#{$y});
|
|
19
|
+
}
|
|
20
|
+
100% {
|
|
21
|
+
transform: translateX(-#{$x}) translateY(-#{$y});
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
@mixin animate-move($props) {
|
|
29
|
+
$defaults: (
|
|
30
|
+
vertical: 0%,
|
|
31
|
+
horizontal: 0%,
|
|
32
|
+
duration: 5s,
|
|
33
|
+
timing: ease-in-out,
|
|
34
|
+
iteration: infinite
|
|
35
|
+
);
|
|
36
|
+
// Merge with defaults
|
|
37
|
+
$props: map.merge($defaults, $props);
|
|
38
|
+
|
|
39
|
+
$x: map.get($props, 'vertical');
|
|
40
|
+
$y: map.get($props, 'horizontal');
|
|
41
|
+
$duration: map.get($props, 'duration');
|
|
42
|
+
$easing: map.get($props, 'timing');
|
|
43
|
+
$iteration: map.get($props, 'iteration');
|
|
44
|
+
|
|
45
|
+
// Handle units
|
|
46
|
+
$x-unit: if($x, safe-unit-name(get-unit($x)), '-');
|
|
47
|
+
$y-unit: if($y, safe-unit-name(get-unit($y)), '-');
|
|
48
|
+
|
|
49
|
+
// Clean values (remove units)
|
|
50
|
+
$cleanX: if($x, strip-unit($x), 0);
|
|
51
|
+
$cleanY: if($y, strip-unit($y), 0);
|
|
52
|
+
|
|
53
|
+
$animationName: anim-bounce-#{$cleanX}#{$x-unit}-#{$cleanY}#{$y-unit};
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
& {
|
|
57
|
+
animation: #{$animationName} $duration $easing $iteration;
|
|
58
|
+
}
|
|
59
|
+
@include generateBounceKeyframes($animationName, $x, $y);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
@keyframes fade-in-reveal {
|
|
64
|
+
to {
|
|
65
|
+
scale: 1;
|
|
66
|
+
opacity: 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
72
|
+
.anim__fade-in-reveal {
|
|
73
|
+
scale: .2;
|
|
74
|
+
opacity: 0.7;
|
|
75
|
+
|
|
76
|
+
animation: fade-in-reveal linear forwards;
|
|
77
|
+
animation-timeline: view();
|
|
78
|
+
|
|
79
|
+
animation-range-start: cover;
|
|
80
|
+
animation-range-end: 550px;
|
|
81
|
+
|
|
82
|
+
// animation-range: enter;
|
|
83
|
+
// animation-range: exit;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
@keyframes fadeOutAndCollapse {
|
|
88
|
+
0% {
|
|
89
|
+
opacity: 1;
|
|
90
|
+
bottom: 0px;
|
|
91
|
+
height: auto;
|
|
92
|
+
}
|
|
93
|
+
50% {
|
|
94
|
+
bottom: -500px;
|
|
95
|
+
opacity: 0;
|
|
96
|
+
}
|
|
97
|
+
100% {
|
|
98
|
+
bottom: 100%;
|
|
99
|
+
opacity: 0;
|
|
100
|
+
height: 0;
|
|
101
|
+
overflow: hidden;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
// @keyframes moveVertical {
|
|
109
|
+
// 0% {
|
|
110
|
+
// transform: translateY(-5%);
|
|
111
|
+
// }
|
|
112
|
+
|
|
113
|
+
// 50% {
|
|
114
|
+
// transform: translateY(5%);
|
|
115
|
+
// }
|
|
116
|
+
|
|
117
|
+
// 100% {
|
|
118
|
+
// transform: translateY(-5%);
|
|
119
|
+
// }
|
|
120
|
+
// }
|
|
121
|
+
|
|
122
|
+
// @keyframes moveHorizontal {
|
|
123
|
+
// 0% {
|
|
124
|
+
// transform: translateX(-50%) translateY(-10%);
|
|
125
|
+
// }
|
|
126
|
+
|
|
127
|
+
// 50% {
|
|
128
|
+
// transform: translateX(50%) translateY(10%);
|
|
129
|
+
// }
|
|
130
|
+
|
|
131
|
+
// 100% {
|
|
132
|
+
// transform: translateX(-50%) translateY(-10%);
|
|
133
|
+
// }
|
|
134
|
+
// }
|
|
135
|
+
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
@use "sass:math";
|
|
2
|
+
@use 'sass:color';
|
|
3
|
+
@use 'sass:map';
|
|
4
|
+
|
|
5
|
+
@use './variables' as *;
|
|
6
|
+
|
|
7
|
+
@each $color-name, $color-value in $colors {
|
|
8
|
+
.text-#{$color-name} { color: $color-value; }
|
|
9
|
+
.bg-#{$color-name} { background-color: $color-value; }
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
// Modern Color System
|
|
13
|
+
// _colors.scss
|
|
14
|
+
|
|
15
|
+
// Color Validation
|
|
16
|
+
@function is-valid-color($color) {
|
|
17
|
+
@return type-of($color) == 'color';
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Modern Color Spaces
|
|
21
|
+
@function to-lch($color) {
|
|
22
|
+
@if not is-valid-color($color) {
|
|
23
|
+
@error "Invalid color provided to to-lch";
|
|
24
|
+
}
|
|
25
|
+
@return color.adjust($color, $space: lch);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
@function adaptive-color($color, $lightness-shift) {
|
|
29
|
+
@return color.adjust($color, $space: lch, $lightness: $lightness-shift);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Semantic Color System
|
|
33
|
+
@function get-surface-color($color, $elevation) {
|
|
34
|
+
$lch-color: to-lch($color);
|
|
35
|
+
@return color.adjust($lch-color,
|
|
36
|
+
$lightness: if($elevation > 0, 5 * $elevation, 0)
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Color Harmony Generation
|
|
41
|
+
@function complementary($color) {
|
|
42
|
+
@return adjust-hue($color, 180);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
@function triadic($color) {
|
|
46
|
+
@return (
|
|
47
|
+
$color,
|
|
48
|
+
adjust-hue($color, 120),
|
|
49
|
+
adjust-hue($color, 240)
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@function split-complementary($color) {
|
|
54
|
+
@return (
|
|
55
|
+
$color,
|
|
56
|
+
adjust-hue($color, 150),
|
|
57
|
+
adjust-hue($color, 210)
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@function get-accent-palette($primary, $accent-angle: 45deg) {
|
|
62
|
+
$lch: to-lch($primary);
|
|
63
|
+
@return (
|
|
64
|
+
subtle: color.adjust($lch, $lightness: 15%, $hue: $accent-angle),
|
|
65
|
+
vibrant: color.adjust($lch, $saturation: 20%, $hue: $accent-angle * 2)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Color Scale Generation
|
|
70
|
+
@function create-scale($color, $steps: 9) {
|
|
71
|
+
$scale: ();
|
|
72
|
+
$lch-color: to-lch($color);
|
|
73
|
+
|
|
74
|
+
@for $i from 0 through $steps {
|
|
75
|
+
$lightness: 95 - ($i * (90 / $steps));
|
|
76
|
+
$new-color: color.adjust($lch-color, $lightness: $lightness);
|
|
77
|
+
$scale: append($scale, $new-color);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@return $scale;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Color Relationship Functions
|
|
84
|
+
@function find-text-color($background) {
|
|
85
|
+
$luminance: luminance($background);
|
|
86
|
+
@return if($luminance > 0.55, #000, #fff);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Luminance Calculation
|
|
90
|
+
@function luminance($color) {
|
|
91
|
+
$r: red($color) / 255;
|
|
92
|
+
$g: green($color) / 255;
|
|
93
|
+
$b: blue($color) / 255;
|
|
94
|
+
|
|
95
|
+
$r: if($r <= 0.03928, $r / 12.92, pow(($r + 0.055) / 1.055, 2.4));
|
|
96
|
+
$g: if($g <= 0.03928, $g / 12.92, pow(($g + 0.055) / 1.055, 2.4));
|
|
97
|
+
$b: if($b <= 0.03928, $b / 12.92, pow(($b + 0.055) / 1.055, 2.4));
|
|
98
|
+
|
|
99
|
+
@return $r * 0.2126 + $g * 0.7152 + $b * 0.0722;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Contrast Calculations
|
|
103
|
+
@function get-contrast-ratio($foreground, $background) {
|
|
104
|
+
$l1: luminance($foreground) + 0.05;
|
|
105
|
+
$l2: luminance($background) + 0.05;
|
|
106
|
+
@return if($l1 > $l2, $l1 / $l2, $l2 / $l1);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// Color Validation
|
|
110
|
+
@function has-sufficient-contrast($text, $background) {
|
|
111
|
+
$contrast: get-contrast-ratio($text, $background);
|
|
112
|
+
@return $contrast >= 4.5;
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Context-Aware Colors
|
|
116
|
+
@mixin adaptive-contrast($background) {
|
|
117
|
+
background: $background;
|
|
118
|
+
color: find-text-color($background);
|
|
119
|
+
|
|
120
|
+
@media (prefers-contrast: more) {
|
|
121
|
+
$high-contrast: adjust-contrast($background, 20%);
|
|
122
|
+
background: $high-contrast;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Filter Mixins
|
|
127
|
+
@mixin backdrop-filter($value) {
|
|
128
|
+
-webkit-backdrop-filter: $value;
|
|
129
|
+
backdrop-filter: $value;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
@mixin filter($value) {
|
|
133
|
+
-webkit-filter: $value;
|
|
134
|
+
filter: $value;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Glass Effect Utilities
|
|
138
|
+
.glass-effect {
|
|
139
|
+
@include backdrop-filter(blur(10px));
|
|
140
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
.frosted-glass {
|
|
144
|
+
@include backdrop-filter(blur(5px) saturate(180%));
|
|
145
|
+
background-color: rgba(255, 255, 255, 0.8);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// <div class="bg-primary-0">Lightest shade</div>
|
|
149
|
+
// <div class="bg-primary-4">Middle shade</div>
|
|
150
|
+
// <div class="bg-primary-8">Darkest shade</div>
|
|
151
|
+
|
|
152
|
+
// <div class="brand-complementary">Complementary colors</div>
|
|
153
|
+
|
|
154
|
+
// <div class="text-on-background">Accessible text</div>
|
|
155
|
+
|
|
156
|
+
// <div class="glass-effect">
|
|
157
|
+
// Blurred backdrop
|
|
158
|
+
// </div>
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
@use 'sass:string';
|
|
2
|
+
@use 'sass:math';
|
|
3
|
+
|
|
4
|
+
@function strip-unit($value) {
|
|
5
|
+
@return math.div($value, ($value * 0 + 1));
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
@function safe-unit-name($unit) {
|
|
9
|
+
|
|
10
|
+
@if $unit == '%' {
|
|
11
|
+
@return 'per';
|
|
12
|
+
} @else if $unit == '.' {
|
|
13
|
+
@return 'dot';
|
|
14
|
+
} @else {
|
|
15
|
+
@return $unit;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@function get-unit($value) {
|
|
20
|
+
$value-str: #{$value};
|
|
21
|
+
|
|
22
|
+
// Relative length units
|
|
23
|
+
@if string.index($value-str, 'em') {
|
|
24
|
+
@return 'em';
|
|
25
|
+
} @else if string.index($value-str, 'rem') {
|
|
26
|
+
@return 'rem';
|
|
27
|
+
} @else if string.index($value-str, '%') {
|
|
28
|
+
@return '%';
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Viewport units
|
|
32
|
+
@else if string.index($value-str, 'vw') {
|
|
33
|
+
@return 'vw';
|
|
34
|
+
} @else if string.index($value-str, 'vh') {
|
|
35
|
+
@return 'vh';
|
|
36
|
+
} @else if string.index($value-str, 'vmin') {
|
|
37
|
+
@return 'vmin';
|
|
38
|
+
} @else if string.index($value-str, 'vmax') {
|
|
39
|
+
@return 'vmax';
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Absolute length units
|
|
43
|
+
@else if string.index($value-str, 'px') {
|
|
44
|
+
@return 'px';
|
|
45
|
+
} @else if string.index($value-str, 'cm') {
|
|
46
|
+
@return 'cm';
|
|
47
|
+
} @else if string.index($value-str, 'mm') {
|
|
48
|
+
@return 'mm';
|
|
49
|
+
} @else if string.index($value-str, 'in') {
|
|
50
|
+
@return 'in';
|
|
51
|
+
} @else if string.index($value-str, 'pt') {
|
|
52
|
+
@return 'pt';
|
|
53
|
+
} @else if string.index($value-str, 'pc') {
|
|
54
|
+
@return 'pc';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Return empty string if no unit found
|
|
58
|
+
@return '';
|
|
59
|
+
}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
@use './variables' as *;
|
|
2
|
+
// Position Mixins
|
|
3
|
+
@mixin p-static {
|
|
4
|
+
position: static;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
@mixin p-relative {
|
|
8
|
+
position: relative;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
@mixin p-absolute {
|
|
12
|
+
position: absolute;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@mixin p-fixed {
|
|
16
|
+
position: fixed;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@mixin p-sticky {
|
|
20
|
+
position: sticky;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Position Classes
|
|
24
|
+
.p-static {
|
|
25
|
+
@include p-static;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
.p-relative {
|
|
29
|
+
@include p-relative;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
.p-absolute {
|
|
33
|
+
@include p-absolute;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
.p-fixed {
|
|
37
|
+
@include p-fixed;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
.p-sticky {
|
|
41
|
+
@include p-sticky;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Responsive Position Classes
|
|
45
|
+
@each $breakpoint, $width in $breakpoints {
|
|
46
|
+
@media (min-width: $width) {
|
|
47
|
+
.#{$breakpoint}\:p-static {
|
|
48
|
+
@include p-static;
|
|
49
|
+
}
|
|
50
|
+
.#{$breakpoint}\:p-relative {
|
|
51
|
+
@include p-relative;
|
|
52
|
+
}
|
|
53
|
+
.#{$breakpoint}\:p-absolute {
|
|
54
|
+
@include p-absolute;
|
|
55
|
+
}
|
|
56
|
+
.#{$breakpoint}\:p-fixed {
|
|
57
|
+
@include p-fixed;
|
|
58
|
+
}
|
|
59
|
+
.#{$breakpoint}\:p-sticky {
|
|
60
|
+
@include p-sticky;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
// Top, Right, Bottom, Left Mixins
|
|
67
|
+
@mixin top($value) {
|
|
68
|
+
top: if($value == 0, $value, $value + px);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@mixin right($value) {
|
|
72
|
+
right: if($value == 0, $value, $value + px);
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
@mixin bottom($value) {
|
|
76
|
+
bottom: if($value == 0, $value, $value + px);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@mixin left($value) {
|
|
80
|
+
left: if($value == 0, $value, $value + px);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Top, Right, Bottom, Left Classes
|
|
84
|
+
@for $i from 0 through 100{
|
|
85
|
+
.top-#{$i} {
|
|
86
|
+
@include top($i);
|
|
87
|
+
}
|
|
88
|
+
.right-#{$i} {
|
|
89
|
+
@include right($i);
|
|
90
|
+
}
|
|
91
|
+
.bottom-#{$i} {
|
|
92
|
+
@include bottom($i);
|
|
93
|
+
}
|
|
94
|
+
.left-#{$i} {
|
|
95
|
+
@include left($i);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
// _shadows.scss
|
|
2
|
+
@use 'sass:map';
|
|
3
|
+
@use 'sass:math';
|
|
4
|
+
@use 'sass:string';
|
|
5
|
+
@use './variables' as *;
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// Shadow Variables
|
|
9
|
+
$shadow-colors: (
|
|
10
|
+
'default': rgba(0, 0, 0, 0.1),
|
|
11
|
+
'dark': rgba(0, 0, 0, 0.2),
|
|
12
|
+
'darker': rgba(0, 0, 0, 0.35),
|
|
13
|
+
'darkest': rgba(0, 0, 0, 0.5),
|
|
14
|
+
);
|
|
15
|
+
|
|
16
|
+
$shadow-sizes: (
|
|
17
|
+
'sm': (
|
|
18
|
+
'x': 0,
|
|
19
|
+
'y': 1px,
|
|
20
|
+
'blur': 2px,
|
|
21
|
+
'spread': 0
|
|
22
|
+
),
|
|
23
|
+
'md': (
|
|
24
|
+
'x': 0,
|
|
25
|
+
'y': 4px,
|
|
26
|
+
'blur': 6px,
|
|
27
|
+
'spread': -1px
|
|
28
|
+
),
|
|
29
|
+
'lg': (
|
|
30
|
+
'x': 0,
|
|
31
|
+
'y': 10px,
|
|
32
|
+
'blur': 15px,
|
|
33
|
+
'spread': -3px
|
|
34
|
+
),
|
|
35
|
+
'xl': (
|
|
36
|
+
'x': 0,
|
|
37
|
+
'y': 20px,
|
|
38
|
+
'blur': 25px,
|
|
39
|
+
'spread': -5px
|
|
40
|
+
),
|
|
41
|
+
'hero': (
|
|
42
|
+
'x': 0,
|
|
43
|
+
'y': 20px,
|
|
44
|
+
'blur': 25px,
|
|
45
|
+
'spread': 5px
|
|
46
|
+
),
|
|
47
|
+
'monster': (
|
|
48
|
+
'x': 0,
|
|
49
|
+
'y': 20px,
|
|
50
|
+
'blur': 55px,
|
|
51
|
+
'spread': 20px
|
|
52
|
+
)
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
// Shadow Mixins
|
|
56
|
+
@mixin shadow-base($x, $y, $blur, $spread, $color) {
|
|
57
|
+
transition: box-shadow 0.2s ease-in-out;
|
|
58
|
+
box-shadow: $x $y $blur $spread $color;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@mixin shadow($size: 'md', $color: 'default') {
|
|
62
|
+
$shadow: map.get($shadow-sizes, $size);
|
|
63
|
+
|
|
64
|
+
$shadow-color: map.get($shadow-colors, $color);
|
|
65
|
+
@include shadow-base(
|
|
66
|
+
map.get($shadow, 'x'),
|
|
67
|
+
map.get($shadow, 'y'),
|
|
68
|
+
map.get($shadow, 'blur'),
|
|
69
|
+
map.get($shadow, 'spread'),
|
|
70
|
+
$shadow-color
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
@mixin shadow-inset($size: 'md', $color: 'default') {
|
|
75
|
+
$shadow: map.get($shadow-sizes, $size);
|
|
76
|
+
$shadow-color: map.get($shadow-colors, $color);
|
|
77
|
+
|
|
78
|
+
box-shadow: inset map.get($shadow, 'x') map.get($shadow, 'y')
|
|
79
|
+
map.get($shadow, 'blur') map.get($shadow, 'spread')
|
|
80
|
+
$shadow-color;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Utility Classes
|
|
84
|
+
.shadow-none {
|
|
85
|
+
box-shadow: none;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
@each $size, $values in $shadow-sizes {
|
|
89
|
+
.shadow-#{$size} {
|
|
90
|
+
@include shadow($size);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.shadow-#{$size}-dark {
|
|
94
|
+
@include shadow($size, 'dark');
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
.shadow-inset-#{$size} {
|
|
98
|
+
@include shadow-inset($size);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Hover variants
|
|
103
|
+
.shadow-hover {
|
|
104
|
+
&:hover {
|
|
105
|
+
@include shadow('lg');
|
|
106
|
+
}
|
|
107
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// _spacing.scss
|
|
2
|
+
|
|
3
|
+
@use 'sass:math';
|
|
4
|
+
@use './variables' as *;
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
// Padding mixins
|
|
8
|
+
@mixin p($val) { $val: if($val==0, $val, $val + px); padding: $val !important; }
|
|
9
|
+
@mixin px($val) { $val: if($val==0, $val, $val + px); padding-left: $val !important; padding-right: $val !important; }
|
|
10
|
+
@mixin py($val) { $val: if($val==0, $val, $val + px); padding-top: $val !important; padding-bottom: $val !important; }
|
|
11
|
+
@mixin pt($val) { $val: if($val==0, $val, $val + px); padding-top: $val !important; }
|
|
12
|
+
@mixin pr($val) { $val: if($val==0, $val, $val + px); padding-right: $val !important; }
|
|
13
|
+
@mixin pb($val) { $val: if($val==0, $val, $val + px); padding-bottom: $val !important; }
|
|
14
|
+
@mixin pl($val) { $val: if($val==0, $val, $val + px); padding-left: $val !important; }
|
|
15
|
+
|
|
16
|
+
// Margin mixins
|
|
17
|
+
@mixin m($val) { $val: if($val==0, $val, $val + px); margin: $val !important; }
|
|
18
|
+
@mixin mx($val) { $val: if($val==0, $val, $val + px); margin-left: $val !important; margin-right: $val !important; }
|
|
19
|
+
@mixin my($val) { $val: if($val==0, $val, $val + px); margin-top: $val !important; margin-bottom: $val !important; }
|
|
20
|
+
@mixin mt($val) { $val: if($val==0, $val, $val + px); margin-top: $val !important; }
|
|
21
|
+
@mixin mr($val) { $val: if($val==0, $val, $val + px); margin-right: $val !important; }
|
|
22
|
+
@mixin mb($val) { $val: if($val==0, $val, $val + px); margin-bottom: $val !important; }
|
|
23
|
+
@mixin ml($val) { $val: if($val==0, $val, $val + px); margin-left: $val !important; }
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
// Generate utilities from spacing map
|
|
27
|
+
@each $i in $spacings {
|
|
28
|
+
// Padding classes
|
|
29
|
+
.p-#{$i} { @include p($i); }
|
|
30
|
+
.px-#{$i} { @include px($i); }
|
|
31
|
+
.py-#{$i} { @include py($i); }
|
|
32
|
+
.pt-#{$i} { @include pt($i); }
|
|
33
|
+
.pr-#{$i} { @include pr($i); }
|
|
34
|
+
.pb-#{$i} { @include pb($i); }
|
|
35
|
+
.pl-#{$i} { @include pl($i); }
|
|
36
|
+
|
|
37
|
+
// Margin classes
|
|
38
|
+
.m-#{$i} { @include m($i); }
|
|
39
|
+
.mx-#{$i} { @include mx($i); }
|
|
40
|
+
.my-#{$i} { @include my($i); }
|
|
41
|
+
.mt-#{$i} { @include mt($i); }
|
|
42
|
+
.mr-#{$i} { @include mr($i); }
|
|
43
|
+
.mb-#{$i} { @include mb($i); }
|
|
44
|
+
.ml-#{$i} { @include ml($i); }
|
|
45
|
+
// .gap-#{$key} { gap: $value; }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
// Responsive Position Classes
|
|
50
|
+
@each $breakpoint, $width in $breakpoints {
|
|
51
|
+
@media (min-width: $width) {
|
|
52
|
+
// Generate utilities from spacing map
|
|
53
|
+
@each $i in $spacings {
|
|
54
|
+
// Padding classes
|
|
55
|
+
.#{$breakpoint}\:p-#{$i} { @include p($i); }
|
|
56
|
+
.#{$breakpoint}\:px-#{$i} { @include px($i); }
|
|
57
|
+
.#{$breakpoint}\:py-#{$i} { @include py($i); }
|
|
58
|
+
.#{$breakpoint}\:pt-#{$i} { @include pt($i); }
|
|
59
|
+
.#{$breakpoint}\:pr-#{$i} { @include pr($i); }
|
|
60
|
+
.#{$breakpoint}\:pb-#{$i} { @include pb($i); }
|
|
61
|
+
.#{$breakpoint}\:pl-#{$i} { @include pl($i); }
|
|
62
|
+
|
|
63
|
+
// Margin classes
|
|
64
|
+
.#{$breakpoint}\:m-#{$i} { @include m($i); }
|
|
65
|
+
.#{$breakpoint}\:mx-#{$i} { @include mx($i); }
|
|
66
|
+
.#{$breakpoint}\:my-#{$i} { @include my($i); }
|
|
67
|
+
.#{$breakpoint}\:mt-#{$i} { @include mt($i); }
|
|
68
|
+
.#{$breakpoint}\:mr-#{$i} { @include mr($i); }
|
|
69
|
+
.#{$breakpoint}\:mb-#{$i} { @include mb($i); }
|
|
70
|
+
.#{$breakpoint}\:ml-#{$i} { @include ml($i); }
|
|
71
|
+
// .gap-#{$key} { gap: $value; }
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// Auto margin utilities
|
|
77
|
+
@mixin ml-auto { margin-left: auto; }
|
|
78
|
+
@mixin mr-auto { margin-right: auto; }
|
|
79
|
+
@mixin mx-auto { @include ml-auto; @include mr-auto; }
|
|
80
|
+
|
|
81
|
+
.mx-auto { @include mx-auto; }
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
.ml-auto { @include ml-auto; }
|
|
85
|
+
.mr-auto { @include mr-auto; }
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
// Gap Mixins
|
|
90
|
+
@mixin gap($value) {
|
|
91
|
+
gap: if($value == 0, $value, $value + px);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
@mixin gap-x($value) {
|
|
95
|
+
column-gap: if($value == 0, $value, $value + px);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
@mixin gap-y($value) {
|
|
99
|
+
row-gap: if($value == 0, $value, $value + px);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// Gap Classes
|
|
103
|
+
.gap-auto { gap: auto; }
|
|
104
|
+
|
|
105
|
+
@each $i in $spacings {
|
|
106
|
+
.gap-#{$i} { @include gap($i); }
|
|
107
|
+
.gap-x-#{$i} { @include gap-x($i); }
|
|
108
|
+
.gap-y-#{$i} { @include gap-y($i); }
|
|
109
|
+
}
|