@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.
Files changed (48) hide show
  1. package/README.md +19 -0
  2. package/dist/dark.css +1 -0
  3. package/dist/index.css +1 -0
  4. package/dist/index.css.map +1 -0
  5. package/dist/index.html +15 -0
  6. package/dist/light.css +1 -0
  7. package/dist/main.css +1 -0
  8. package/dist/main.js +1 -0
  9. package/package.json +43 -0
  10. package/src/js/main.js +1 -0
  11. package/src/styles/_global.scss +3 -0
  12. package/src/styles/base/_base.scss +75 -0
  13. package/src/styles/base/_reset.scss +92 -0
  14. package/src/styles/components/_alert.scss +0 -0
  15. package/src/styles/components/_avatar.scss +0 -0
  16. package/src/styles/components/_badge.scss +0 -0
  17. package/src/styles/components/_breadcrumb.scss +0 -0
  18. package/src/styles/components/_button.scss +247 -0
  19. package/src/styles/components/_calendar.scss +0 -0
  20. package/src/styles/components/_card.scss +0 -0
  21. package/src/styles/components/_checkbox.scss +23 -0
  22. package/src/styles/components/_dropdown.scss +0 -0
  23. package/src/styles/components/_form.scss +157 -0
  24. package/src/styles/components/_modal.scss +0 -0
  25. package/src/styles/components/_navbar.scss +125 -0
  26. package/src/styles/components/_pagination.scss +0 -0
  27. package/src/styles/components/_progress.scss +0 -0
  28. package/src/styles/components/_radio.scss +0 -0
  29. package/src/styles/components/_sidebar.scss +0 -0
  30. package/src/styles/components/_table.scss +0 -0
  31. package/src/styles/components/_tabs.scss +0 -0
  32. package/src/styles/components/_tooltip.scss +0 -0
  33. package/src/styles/index.scss +34 -0
  34. package/src/styles/layouts/_container.scss +49 -0
  35. package/src/styles/layouts/_flex.scss +138 -0
  36. package/src/styles/layouts/_grid.scss +147 -0
  37. package/src/styles/themes/_dark.scss +26 -0
  38. package/src/styles/themes/_light.scss +23 -0
  39. package/src/styles/themes/_theme.scss +136 -0
  40. package/src/styles/utilities/_animations.scss +135 -0
  41. package/src/styles/utilities/_colors.scss +158 -0
  42. package/src/styles/utilities/_functions.scss +59 -0
  43. package/src/styles/utilities/_position.scss +97 -0
  44. package/src/styles/utilities/_shadows.scss +107 -0
  45. package/src/styles/utilities/_spacing.scss +109 -0
  46. package/src/styles/utilities/_tooltips.scss +213 -0
  47. package/src/styles/utilities/_typography.scss +108 -0
  48. 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
+ }