--- /dev/null
+@import "../../functions";
+@import "../../variables";
+@import "../../variables-dark";
+@import "../../maps";
+@import "../../mixins";
+@import "../../utilities";
+@import "../../utilities/api";
+
+@include describe("utility mixin") {
+ @include it("generate property-value pairs for given utility") {
+
+ @include assert() {
+ @include output() {
+ .test {
+ @include util(d-block);
+ @include util(p-3);
+ }
+ .test2 {
+ @include util(d-block, p-3);
+ }
+ }
+
+ @include expect() {
+ .test {
+ display: block;
+ padding: 1rem;
+ }
+ .test2 {
+ display: block;
+ padding: 1rem;
+ }
+ }
+ }
+ }
+}
$utilities-map: build-utilities-map(); // stylelint-disable-line scss/dollar-variable-default
-@mixin util($class) {
- @if map-has-key($utilities-map, $class) {
- $definition: map-get($utilities-map, $class);
- $breakpoint: map-get($definition, breakpoint);
- @if $breakpoint != null {
- @include media-breakpoint-up($breakpoint) {
+// Sometimes it’s useful for a mixin to be able to take any number of arguments. If the last argument in a @mixin declaration ends in ..., then all extra arguments to that mixin are passed to that argument as a list. This argument is known as an argument list.
+
+@mixin util($classes...) {
+ @each $class in $classes {
+ @if map-has-key($utilities-map, $class) {
+ $definition: map-get($utilities-map, $class);
+ $breakpoint: map-get($definition, breakpoint);
+ @if $breakpoint != null {
+ @include media-breakpoint-up($breakpoint) {
+ @each $property in map-get($definition, properties) {
+ #{$property}: map-get($definition, value);
+ }
+ }
+ }
+ @else {
@each $property in map-get($definition, properties) {
#{$property}: map-get($definition, value);
}
}
}
@else {
- @each $property in map-get($definition, properties) {
- #{$property}: map-get($definition, value);
- }
+ @debug "Unknown utility class " + $class;
}
}
- @else {
- @debug "Unknown utility class " + $class;
- }
}
```scss
// Using the utility mixin in your custom Sass
.test {
+ // Individual utilities
@include util(d-inline-flex);
@include util(p-4);
@include util(mb-md-3);
+
+ // Multiple utilities
+ @include util(d-inline-flex, p-4, mb-md-3);
}
```
This way, you only output one media query in your compiled CSS and no further optimization or action is needed to clean up the output.
+## Multiple utilities
+
+Include multiple utilities in a single `util()` mixin call with a comma separated list. Once again, for multiple responsive utilities, use a media query to group them under a single compiled media query.
+
+```scss
+.test {
+ @include util(d-inline-flex, p-4, mb-3);
+ color: purple;
+
+ @include media-breakpoint-up(md) {
+ @include util(p-5, mb-5);
+ }
+}
+```
## Custom setup
// Write your own styles
.test {
- @include util(d-inline-flex);
- @include util(p-4);
- @include util(mb-md-3);
+ @include util(d-inline-flex, p-4, mb-md-3);
color: purple;
}
```