shed.css allows you nearly full control of it's output, if you so choose. These docs will come if I get enough requests, but to give you an idea:
@import "css-modularscale";
@import "shed-css/src/lib/font-size.css";
@import "shed-css/src/lib/z-index.css";
@import "shed-css/src/lib/font-weight.css";
@import "shed-css/src/lib/font-family.css";
@import "shed-css/src/lib/font-style.css";
@import "shed-css/src/lib/text-align.css";
@import "shed-css/src/lib/space.css";
@import "shed-css/src/lib/display.css";
@import "shed-css/src/lib/float.css";
@import "shed-css/src/lib/vertical-align.css";
@import "shed-css/src/lib/sides.css";
@import "shed-css/src/lib/flex.css";
@import "shed-css/src/lib/size.css";
@import "shed-css/src/lib/line-height.css";
@import "shed-css/src/lib/letter-spacing.css";
@import "shed-css/src/lib/text-decoration.css";
@import "shed-css/src/lib/overflow.css";
@import "shed-css/src/lib/radius.css";
@import "shed-css/src/lib/position.css";
@import "shed-css/src/lib/max-width.css";
@import "shed-css/src/lib/text-transform.css";
@import "shed-css/src/lib/cursor.css";
:root {
--mqs: n, xs, sm ,md, lg, xl;
--ms: -dot1, -dot2, -dot3, -dot4, -dot5, -dot6, -dot7, -dot8, -dot9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
--z: \.1, \.2, \.3, \.4, \.5, \.6, \.7, \.8, \.9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10;
--f-f-styles: (sans, serif, mono), (f-f-sans, f-f-serif, f-f-mono);
--f-f-sans: sans-serif;
--f-f-serif: serif;
--f-f-mono: monospace;
--f-s-styles: (normal, italic, oblique), (n, i, o);
--f-w-min: 100;
--f-w-max: 900;
--l-h--default: 1;
--l-h--tight: var(--z2);
--l-h--normal: var(--z1);
--l-h--loose: var(--z4);
--l-h: (d, t, n, l), (var(--l-h--default), var(--l-h--tight), var(--l-h--normal), var(--l-h--loose));
--l-s--default: normal;
--l-s--tight: -.08em;
--l-s--normal: .16em;
--l-s--loose: .32em;
--dirs: all, top, bottom, left, right, x, y;
--dirs-short: a, t, b, l, r, x, y;
--display-props: block, inline-block, inline, flex, table, table-cell, none;
--display-shorthands: b, i-b, i, f, t, t-c, n;
--pos-options: (absolute, relative, static, fixed, cover), (a, r, s, f, c);
--sides-options: (top, bottom, left, right);
--z-dot9: var(--ms-1);
--z-dot8: var(--ms-2);
--z-dot7: var(--ms-3);
--z-dot6: var(--ms-4);
--z-dot5: var(--ms-5);
--z-dot4: var(--ms-6);
--z-dot3: var(--ms-7);
--z-dot2: var(--ms-8);
--z-dot1: var(--ms-9);
--z0: 0;
--z1: var(--ms0);
--z2: var(--ms1);
--z3: var(--ms2);
--z4: var(--ms3);
--z5: var(--ms4);
--z6: var(--ms5);
--z7: var(--ms6);
--z8: var(--ms7);
--z9: var(--ms8);
--z10: var(--ms9);
}
@custom-media --mq-xs (min-width: 20em);
@custom-media --mq-sm (min-width: 30em);
@custom-media --mq-md (min-width: 37em);
@custom-media --mq-lg (min-width: 50em);
@custom-media --mq-xl (min-width: 75em);
As you can see, shed makes heavy use of maps and variables, and loops over them in order to generate its classes.