--- name: gerillass description: Use the Gerillass Sass mixin library — loading it, the mixin catalogue, and the argument forms that are easy to get wrong. Use when writing SCSS in a project that has gerillass installed. --- # Gerillass A Sass mixin library: 55 mixins and 24 functions that emit CSS from semantic declarations. It is Sass source only — there is no runtime and no utility classes, so styles live in your stylesheet and your markup stays clean. Full documentation: https://docs.gerillass.com Machine-readable API: `gerillass.json` in this package. ## Loading it Through a bundler (Vite, webpack and most others resolve the package by name): ```scss @use "gerillass" as *; ``` Calling Dart Sass yourself, with its package importer (`new NodePackageImporter()` or `sass --pkg-importer=node`): ```scss @use "pkg:gerillass" as *; ``` Anything else, by pointing a load path at `node_modules/gerillass/scss`: ```scss @use "gerillass" as *; ``` In a Ruby project, from the `gerillass` gem. Rails with `dartsass-rails` or `dartsass-sprockets`, and Jekyll with the gem in its `:jekyll_plugins` group, need no configuration. Plain Ruby passes the folder to `sass-embedded` with `load_paths: [Gerillass.load_path]`. Then: ```scss @use "gerillass" as *; // the gerillass gem: Rails and Jekyll need no setup; plain Ruby passes Gerillass.load_path ``` Dart Sass only. LibSass and node-sass are not supported, which rules out `sass-rails` and `sassc-rails` in Ruby. ## Two names for every mixin Every mixin exists twice: bare (`circle`) and prefixed (`gls-circle`). They are the same mixin. The prefix exists to avoid collisions with other libraries. Pick one and stay with it; do not mix them in a file. With the module system you can namespace instead, which is usually cleaner: ```scss @use "gerillass" as gls; .avatar { @include gls.circle(50px); } ``` ## Getting arguments right The conventions are not uniform across the library, so check before guessing. A mixin that wants a string will not take a bare value: ```scss .a { @include after(42) { color: red; } } // wrong — errors .a { @include after("→") { color: red; } } // right ``` Mixins that reject bad input do so with a message naming what they accept. If you get one, read it: it lists the valid values. Mixins not in the table below mostly pass their arguments through to CSS, so a wrong value there shows up as a dropped declaration rather than an error. | Mixin | Rejects, for example | |---|---| | `adaptive` | `.wrap { @include adaptive(auto); }` | | `after` | `.a { @include after(42) { color: red; } }` | | `all-buttons` | `@include all-buttons(nonsense) { color: red; }` | | `all-text-inputs` | `@include all-text-inputs(nonsense) { color: red; }` | | `antialias` | `@include antialias(only);` | | `aspect-ratio` | `.thumb { @include aspect-ratio("16:9", nonsense); }` | | `background-dots` | `.a { @include background-dots(red, 1em, 5em, maybe); }` | | `background-image` | `.a { @include background-image("/img/a.png", (red, blue), sideways); }` | | `background-stripes` | `.a { @include background-stripes(red, 2em, nonsense); }` | | `before` | `.a { @include before(42) { color: red; } }` | | `border-box` | `@include border-box(only);` | | `border-radius` | `.a { @include border-radius(1px, 2px, 3px); }` | | `brand-logo` | `.logo { @include brand-logo(120px, 40px, "/img/a.svg" "/img/b.svg"); }` | | `breakpoint` | `.a { @include breakpoint("between", "medium", "large") { color: red; } }` | | `breakpointer` | `.a { @include breakpointer(42); }` | | `center` | `.modal { @include center(diagonal); }` | | `circle` | `.dot { @include circle(huge); }` | | `columnizer` | `.grid { @include columnizer(3, 20px, true, 9); }` | | `container-query` | `.title { @include container-query("min", 400px, 800px) { color: red; } }` | | `container` | `.card { @include container("card", sideways); }` | | `ellipsis` | `.a { @include ellipsis(100%, huge); }` | | `escape-to-parent` | `.a { @include escape-to-parent(42) { color: red; } }` | | `except` | `.a { @include except(#ff0000) { margin: 0; } }` | | `focus-ring` | `@include focus-ring;` | | `font-face` | `.a { @include font-face("Inter", "/fonts/inter"); }` | | `gradient` | `.a { @include gradient((red, blue), sideways); }` | | `hide` | `.a { @include hide(nonsense); }` | | `line-clamp` | `.a { @include line-clamp(0); }` | | `loadify` | `@include loadify(nonsense);` | | `motion-safe` | `.card { @include motion-safe; }` | | `only` | `.a { @include only(#ff0000) { margin: 0; } }` | | `position` | `.badge { @include position(absolute, 0, $logical: yes); }` | | `remove` | `.a { @include remove(a, b, c); }` | | `reset-css` | `.a { @include reset-css; }` | | `resizable` | `.a { @include resizable(huge); }` | | `scissors` | `.a { @include scissors(5px 10px); }` | | `screen-agent` | `.a { @include screen-agent(var(--density)) { color: red; } }` | | `sizer` | `.a { @include sizer(huge); }` | | `smartphone` | `.a { @include smartphone(Nokia3310) { display: none; } }` | | `sprite` | `.icon { @include sprite("/img/sprite.txt"); }` | | `stretched-link` | `.card a { @include stretched-link(middle); }` | | `tablet` | `.a { @include tablet(Surface) { display: none; } }` | | `text-gradient` | `.a { @include text-gradient("top", (red, blue)); }` | | `text-image` | `.a { @include text-image(16 9); }` | | `text-selection` | `.a { @include text-selection(bogus) { background: yellow; } }` | | `text-shadow` | `.a { @include text-shadow(42); }` | | `text-stroke` | `.a { @include text-stroke(huge); }` | | `tokens` | `:root { @include tokens(#fff); }` | | `triangle` | `.caret { @include triangle(sideways); }` | ## Traps a signature does not show **`after`** - With no argument no `content` is emitted, so the pseudo-element does not render unless the block sets `content`. Pass `""` for an empty one. **`aspect-ratio`** - On an element with a `height` attribute, such as `` or an embed code's `