]> git.ipfire.org Git - thirdparty/bootstrap.git/commitdiff
Add thorough implementation of utilities functions and mixins
authorRomaric Pascal <hello@romaricpascal.is>
Sun, 13 Mar 2022 16:41:41 +0000 (16:41 +0000)
committerRomaric Pascal <hello@romaricpascal.is>
Fri, 17 Feb 2023 09:36:14 +0000 (09:36 +0000)
scss/mixins/_utilities.scss

index 8311e1321a21b21b0625d02e896c60c929815902..7f977a236b0151fce32bd7bce8ad81a882b3a9d4 100644 (file)
 
 // Gets the value of a specific option for a given utility
 @function utilities-get-option($utility-name, $option-name) {
-  @return map-get(
-    utilities-get-options($utility-name),
-    $option-name
-  );
+
+  $options: utilities-get-options($utility-name);
+
+  @if ($options) {
+    @return map-get(
+      $options,
+      $option-name
+    );
+  }
+
+  @return null;
+}
+
+// Returns a map of the values for the utility
+@function utilities-get-values($utility-name) {
+  $values: utilities-get-option($utility-name, values);
+
+  @if (type-of($values) != map) {
+    @return map-from($values);
+  }
+
+  @return $values;
+}
+
+@function map-from($list-or-string) {
+  $map: ();
+
+  @each $item in $list-or-string {
+    $map: map-merge(
+      $map,
+      ($item: $item)
+    );
+  }
+
+  @return $map;
 }
 
 // Gets a specific value for the given utility
 @function utilities-get-value($utility-name, $value-name) {
+
+  $values: utilities-get-values($utility-name);
+
   @return map-get(
-    utility-get-option($utility-name, values),
+    $values,
     $value-name
   );
 }
 // To completely replace the existing options, set the 3rd `$merge` parameter to false
 @mixin utilities-set-options($utility-name, $options, $merge: true) {
 
-  @if($merge) {
-    $options: map-merge(
-      utilities-get-options($utility-name),
+  @if ($merge) {
+
+    $existing-options: utilities-get-options($utility-name);
+
+    // Allow the mixin to create a new utility
+    // when setting an unknown utility name
+    $options: if(
+      $existing-options,
+      map-merge(
+        utilities-get-options($utility-name),
+        $options
+      ),
       $options
-    )
+    );
   }
 
-  $utilities: map-merge($utilities,
-    $utility-name: $options
-  )
+  $utilities: map-merge(
+    $utilities,
+    ($utility-name: $options)
+  ) !global; // !global ensures we modify the global $utilities map
 }
 
 // Set a specific option to a new value for the given utility
 
 // Add new values to a given utility.
 // If you want to completely reconfigure the values
-// use `utility-set-option` to provide a new map
+// use `utilities-set-option` to provide a new map
 // for the `values` option
 @mixin utilities-add-values($utility-name, $values) {
+
+  $existing-values: utilities-get-values($utility-name);
+
   @include utilities-set-option(
     $utility-name,
     values,
     map-merge(
-      utility-get-option($utility-name, values),
+      $existing-values,
       $values
     )
-  )
+  );
 }
 
 // Remove specific values from a given utility
 @mixin utilities-remove-values($utility-name, $value-names...) {
 
-  $values: utility-get-option($utility-name, values);
+  $values: utilities-get-values($utility-name);
 
-  $updated-values: map-remove($values, $value-names);
+  $updated-values: map-remove($values, $value-names...);
 
-  @include utility-set-option($utility-name, values, $updated-values);
+  @include utilities-set-option($utility-name, values, $updated-values);
 }
 
 // Add a new utility to the utilities map
 @mixin utilities-add($utility-name, $utility) {
-  $utilities: map-merge($utilities,
+  $utilities: map-merge(
+    $utilities,
     ($utility-name: $utility)
-  );
+  ) !global;
 }
 
 // Remove a utility from the utilities map
 @mixin utilities-remove($utility-names...) {
-  $utilities: map-remove($utility, $utility-names);
+  $utilities: map-remove($utilities, $utility-names...) !global;
 }