npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

@loopmode/scss-variate

v1.0.2

Published

A SCSS mixin to generate helper classes with variations of a given style.

Downloads

95

Readme

@loopmode/scss-variate

A SCSS mixin to generate helper classes with variations of a given style.

@mixin variate($style, $sizes, $variations, $withUnits);

| Argument | Description | | ----------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | $style | The name of a css style property to variateRequired. No default value | | $sizes | Optional. A list of size values for variations. May include units or percents (stripped for zero-values)Default value: (0px, 5px, 10px, 20px, 40px, 80px, auto) | | $variations | Optional. A list of variation names that will be appended to $style with a dashDefault value: ('', 'top', 'left', 'bottom', 'right') | | $withUnits | Optional. Whether to additionally generate class names with concrete unitsDefault value: false |

Usage

@import "~@loopmode/scss-variate";
variate(margin);
variate(padding);

See the output

Arguments

You can use the available arguments to customize the output.

  • Use null for the default argument value
  • Use "" for an empty argument value

Example of mixed explicit, default and empty arguments:

@include variate(margin, null, "", true);

See the output

The $style argument

Required

The base name of the style property you want to variate, e.g. margin or padding.

The $sizes argument

Default value: (0px, 5px, 10px, 20px, 40px, 80px, auto)

A list of values for which to generate class names and variations.

You can specify a custom list of sizes/values that do fit your project's needs:

$sizes: (0, 0.6rem, 1.2rem, 2.4rem, 50%, auto);
@include variate(margin, $sizes);
@include variate(padding, $sizes);

The $variations argument

Default value: ('', 'top', 'left', 'bottom', 'right')

A list of names for variations to generate. Each will be appended to the base $style name with a hyphen.

The default list contains an empty string plus all available sides, which generates typical side variations, e.g. margin, margin-top, margin-bottom, margin-left and margin-right.

However, you can also specify your own list of variations:

@include variate(margin, (0, 10px), (top));
.mt-0 { margin-top: 0; }
.mt-1 { margin-top: 10px; }
@include variate(margin, (0, 10px), (bottom, top));
.mb-0 { margin-bottom: 0; }
.mt-0 { margin-top: 0; }
.mb-1 { margin-bottom: 10px; }
.mt-1 { margin-top: 10px; }

You can also pass just an empty string to only use the base $style property and skip variations:

@include variate(margin, (0, 25px, 50px), "");
.m-0 { margin: 0; }
.m-1 { margin: 25px; }
.m-2 { margin: 50px; }

The $withUnits argument

Default value: false

Produce additional classnames that contain concrete values instead of step numbers.

@include variate(margin, null, null, true);

The default behaviour creates "step-based" class names. For example, if you create paddings for a list of values (0px, 5px, 10px), the created classnames would be .p-0, p-1, .p-2.

@include variate(margin, (0px, 5px), "");
.m-0 { margin: 0; }
.m-1 { margin: 5px; }

However, if you specify true for the last argument $withUnits, unit-based classnames will be generated additionally:

@include variate(margin, (0px, 5px), "", true);
.m-0, .m-0px { margin: 0; }
.m-1, .m-5px { margin: 5px; }

Note that if you use percentages, the % is replaced by p:

@include variate(margin, (0, 50%), "", true);
.m-0 { margin: 0; }
.m-1, .m-50p { margin: 50%; }

This is a workaround to avoid invalid syntax, as % is not allowed in class names.

Non-numerical values

If you use non-numerical $sizes like auto or none, put them to the end of your list, or you will have jumps in your steps.

Bad - the list contains auto in the middle, the step .m-1 is missing:

@include variate(margin, (0, auto, 10px), "");
.m-0 { margin: 0; }
.m-auto { margin: auto; }
.m-2 { margin: 10px; }

Good - the list contains auto at the end, the steps are correct:

@include variate(margin, (0, 10px, auto), "");
.m-0 { margin: 0; }
.m-1 { margin: 10px; }
.m-auto { margin: auto; }

Example output

The generated output for some examples.

Default

The default behavior, without any additional arguments.

@include '~@loopmode/scss-variate';
variate(margin);
variate(padding);
.m-0 { margin: 0; }
.mt-0 { margin-top: 0; }
.ml-0 { margin-left: 0; }
.mb-0 { margin-bottom: 0; }
.mr-0 { margin-right: 0; }
.m-1 { margin: 5px; }
.mt-1 { margin-top: 5px; }
.ml-1 { margin-left: 5px; }
.mb-1 { margin-bottom: 5px; }
.mr-1 { margin-right: 5px; }
.m-2 { margin: 10px; }
.mt-2 { margin-top: 10px; }
.ml-2 { margin-left: 10px; }
.mb-2 { margin-bottom: 10px; }
.mr-2 { margin-right: 10px; }
.m-3 { margin: 20px; }
.mt-3 { margin-top: 20px; }
.ml-3 { margin-left: 20px; }
.mb-3 { margin-bottom: 20px; }
.mr-3 { margin-right: 20px; }
.m-4 { margin: 40px; }
.mt-4 { margin-top: 40px; }
.ml-4 { margin-left: 40px; }
.mb-4 { margin-bottom: 40px; }
.mr-4 { margin-right: 40px; }
.m-5 { margin: 80px; }
.mt-5 { margin-top: 80px; }
.ml-5 { margin-left: 80px; }
.mb-5 { margin-bottom: 80px; }
.mr-5 { margin-right: 80px; }
.m-auto { margin: auto; }
.mt-auto { margin-top: auto; }
.ml-auto { margin-left: auto; }
.mb-auto { margin-bottom: auto; }
.mr-auto { margin-right: auto; }
.p-0 { padding: 0; }
.pt-0 { padding-top: 0; }
.pl-0 { padding-left: 0; }
.pb-0 { padding-bottom: 0; }
.pr-0 { padding-right: 0; }
.p-1 { padding: 5px; }
.pt-1 { padding-top: 5px; }
.pl-1 { padding-left: 5px; }
.pb-1 { padding-bottom: 5px; }
.pr-1 { padding-right: 5px; }
.p-2 { padding: 10px; }
.pt-2 { padding-top: 10px; }
.pl-2 { padding-left: 10px; }
.pb-2 { padding-bottom: 10px; }
.pr-2 { padding-right: 10px; }
.p-3 { padding: 20px; }
.pt-3 { padding-top: 20px; }
.pl-3 { padding-left: 20px; }
.pb-3 { padding-bottom: 20px; }
.pr-3 { padding-right: 20px; }
.p-4 { padding: 40px; }
.pt-4 { padding-top: 40px; }
.pl-4 { padding-left: 40px; }
.pb-4 { padding-bottom: 40px; }
.pr-4 { padding-right: 40px; }
.p-5 { padding: 80px; }
.pt-5 { padding-top: 80px; }
.pl-5 { padding-left: 80px; }
.pb-5 { padding-bottom: 80px; }
.pr-5 { padding-right: 80px; }
.p-auto { padding: auto; }
.pt-auto { padding-top: auto; }
.pl-auto { padding-left: auto; }
.pb-auto { padding-bottom: auto; }
.pr-auto { padding-right: auto; }

Default and empty arguments

The contrived example from above uses all default $sizes, creates no $variations and adds unit-based class names:

@include variate(margin, null, "", true);
.m-0, .m-0px { margin: 0; }
.m-1, .m-5px { margin: 5px; }
.m-2, .m-10px { margin: 10px; }
.m-3, .m-20px { margin: 20px; }
.m-4, .m-40px { margin: 40px; }
.m-5, .m-80px { margin: 80px; }
.m-auto { margin: auto; }

Bells and whistles

Notice that you could be generating a lot of CSS output, depending on your usage:

html,
body { include variate(margin, null, null, true);
  @include variate(padding, null, null, true); }
html .m-0,
html .m-0px,
body .m-0,
body .m-0px { margin: 0; }

html .mt-0,
html .mt-0px,
body .mt-0,
body .mt-0px { margin-top: 0; }

html .ml-0,
html .ml-0px,
body .ml-0,
body .ml-0px { margin-left: 0; }

html .mb-0,
html .mb-0px,
body .mb-0,
body .mb-0px { margin-bottom: 0; }

html .mr-0,
html .mr-0px,
body .mr-0,
body .mr-0px { margin-right: 0; }

html .m-1,
html .m-5px,
body .m-1,
body .m-5px { margin: 5px; }

html .mt-1,
html .mt-5px,
body .mt-1,
body .mt-5px { margin-top: 5px; }

html .ml-1,
html .ml-5px,
body .ml-1,
body .ml-5px { margin-left: 5px; }

html .mb-1,
html .mb-5px,
body .mb-1,
body .mb-5px { margin-bottom: 5px; }

html .mr-1,
html .mr-5px,
body .mr-1,
body .mr-5px { margin-right: 5px; }

html .m-2,
html .m-10px,
body .m-2,
body .m-10px { margin: 10px; }

html .mt-2,
html .mt-10px,
body .mt-2,
body .mt-10px { margin-top: 10px; }

html .ml-2,
html .ml-10px,
body .ml-2,
body .ml-10px { margin-left: 10px; }

html .mb-2,
html .mb-10px,
body .mb-2,
body .mb-10px { margin-bottom: 10px; }

html .mr-2,
html .mr-10px,
body .mr-2,
body .mr-10px { margin-right: 10px; }

html .m-3,
html .m-20px,
body .m-3,
body .m-20px { margin: 20px; }

html .mt-3,
html .mt-20px,
body .mt-3,
body .mt-20px { margin-top: 20px; }

html .ml-3,
html .ml-20px,
body .ml-3,
body .ml-20px { margin-left: 20px; }

html .mb-3,
html .mb-20px,
body .mb-3,
body .mb-20px { margin-bottom: 20px; }

html .mr-3,
html .mr-20px,
body .mr-3,
body .mr-20px { margin-right: 20px; }

html .m-4,
html .m-40px,
body .m-4,
body .m-40px { margin: 40px; }

html .mt-4,
html .mt-40px,
body .mt-4,
body .mt-40px { margin-top: 40px; }

html .ml-4,
html .ml-40px,
body .ml-4,
body .ml-40px { margin-left: 40px; }

html .mb-4,
html .mb-40px,
body .mb-4,
body .mb-40px { margin-bottom: 40px; }

html .mr-4,
html .mr-40px,
body .mr-4,
body .mr-40px { margin-right: 40px; }

html .m-5,
html .m-80px,
body .m-5,
body .m-80px { margin: 80px; }

html .mt-5,
html .mt-80px,
body .mt-5,
body .mt-80px { margin-top: 80px; }

html .ml-5,
html .ml-80px,
body .ml-5,
body .ml-80px { margin-left: 80px; }

html .mb-5,
html .mb-80px,
body .mb-5,
body .mb-80px { margin-bottom: 80px; }

html .mr-5,
html .mr-80px,
body .mr-5,
body .mr-80px { margin-right: 80px; }

html .m-auto,
body .m-auto { margin: auto; }

html .mt-auto,
body .mt-auto { margin-top: auto; }

html .ml-auto,
body .ml-auto { margin-left: auto; }

html .mb-auto,
body .mb-auto { margin-bottom: auto; }

html .mr-auto,
body .mr-auto { margin-right: auto; }

html .p-0,
html .p-0px,
body .p-0,
body .p-0px { padding: 0; }

html .pt-0,
html .pt-0px,
body .pt-0,
body .pt-0px { padding-top: 0; }

html .pl-0,
html .pl-0px,
body .pl-0,
body .pl-0px { padding-left: 0; }

html .pb-0,
html .pb-0px,
body .pb-0,
body .pb-0px { padding-bottom: 0; }

html .pr-0,
html .pr-0px,
body .pr-0,
body .pr-0px { padding-right: 0; }

html .p-1,
html .p-5px,
body .p-1,
body .p-5px { padding: 5px; }

html .pt-1,
html .pt-5px,
body .pt-1,
body .pt-5px { padding-top: 5px; }

html .pl-1,
html .pl-5px,
body .pl-1,
body .pl-5px { padding-left: 5px; }

html .pb-1,
html .pb-5px,
body .pb-1,
body .pb-5px { padding-bottom: 5px; }

html .pr-1,
html .pr-5px,
body .pr-1,
body .pr-5px { padding-right: 5px; }

html .p-2,
html .p-10px,
body .p-2,
body .p-10px { padding: 10px; }

html .pt-2,
html .pt-10px,
body .pt-2,
body .pt-10px { padding-top: 10px; }

html .pl-2,
html .pl-10px,
body .pl-2,
body .pl-10px { padding-left: 10px; }

html .pb-2,
html .pb-10px,
body .pb-2,
body .pb-10px { padding-bottom: 10px; }

html .pr-2,
html .pr-10px,
body .pr-2,
body .pr-10px { padding-right: 10px; }

html .p-3,
html .p-20px,
body .p-3,
body .p-20px { padding: 20px; }

html .pt-3,
html .pt-20px,
body .pt-3,
body .pt-20px { padding-top: 20px; }

html .pl-3,
html .pl-20px,
body .pl-3,
body .pl-20px { padding-left: 20px; }

html .pb-3,
html .pb-20px,
body .pb-3,
body .pb-20px { padding-bottom: 20px; }

html .pr-3,
html .pr-20px,
body .pr-3,
body .pr-20px { padding-right: 20px; }

html .p-4,
html .p-40px,
body .p-4,
body .p-40px { padding: 40px; }

html .pt-4,
html .pt-40px,
body .pt-4,
body .pt-40px { padding-top: 40px; }

html .pl-4,
html .pl-40px,
body .pl-4,
body .pl-40px { padding-left: 40px; }

html .pb-4,
html .pb-40px,
body .pb-4,
body .pb-40px { padding-bottom: 40px; }

html .pr-4,
html .pr-40px,
body .pr-4,
body .pr-40px { padding-right: 40px; }

html .p-5,
html .p-80px,
body .p-5,
body .p-80px { padding: 80px; }

html .pt-5,
html .pt-80px,
body .pt-5,
body .pt-80px { padding-top: 80px; }

html .pl-5,
html .pl-80px,
body .pl-5,
body .pl-80px { padding-left: 80px; }

html .pb-5,
html .pb-80px,
body .pb-5,
body .pb-80px { padding-bottom: 80px; }

html .pr-5,
html .pr-80px,
body .pr-5,
body .pr-80px { padding-right: 80px; }

html .p-auto,
body .p-auto { padding: auto; }

html .pt-auto,
body .pt-auto { padding-top: auto; }

html .pl-auto,
body .pl-auto { padding-left: auto; }

html .pb-auto,
body .pb-auto { padding-bottom: auto; }

html .pr-auto,
body .pr-auto { padding-right: auto; }