Spacing
Margin and padding utilities are generated from the $sizes scale. Both support per-side and axis shorthands across all breakpoints. Margin additionally includes negative values and auto.
Scale
// src/core/_config.scss:27
$sizes: 0,1,2,3,4,6,8,12,14,16,24,32,40,48,56,64,80,96,128,256;
Margin
Prefix: m. Property: margin.
// src/core/layout/_margin.scss:14
@include generators.utility-class-generator((
prefix: 'm',
property: 'margin',
values: $margin-sizes,
unit: 'px',
orientations: config.$orientations
));
All sides
.m-{size} โ margin: {size} in rem (.m-16 โ 1rem)
.m-auto โ margin: auto
Per side / axis
| Class pattern | CSS property |
|---|---|
.mt-{size} |
margin-top |
.mr-{size} |
margin-right |
.mb-{size} |
margin-bottom |
.ml-{size} |
margin-left |
.mx-{size} |
margin-left + margin-right |
.my-{size} |
margin-top + margin-bottom |
Per-side variants also accept auto: .mt-auto, .mx-auto, etc.
Negatives
// src/core/_config.scss:28
$negative-sizes: -1,-2,-3,-4,-8,-12,-14,-16,-24,-32,-40,-48,-56,-64;
The leading - in the key becomes a second dash in the class name.
.m--32 โ margin: -2rem
.mt--16 โ margin-top: -1rem
.mx--8 โ margin-left: -0.5rem; margin-right: -0.5rem
Padding
Prefix: p. Property: padding. Same $sizes scale. No negatives, no auto.
All sides
.p-{size} โ padding: {size} in rem (.p-16 โ 1rem)
Per side / axis
| Class pattern | CSS property |
|---|---|
.pt-{size} |
padding-top |
.pr-{size} |
padding-right |
.pb-{size} |
padding-bottom |
.pl-{size} |
padding-left |
.px-{size} |
padding-left + padding-right |
.py-{size} |
padding-top + padding-bottom |
Gap
Prefix: gap. Generated from the $sizes scale. Responsive.
| Class pattern | CSS property |
|---|---|
.gap-{size} |
gap |
.gap-x-{size} |
column-gap |
.gap-y-{size} |
row-gap |
.gap-16 โ gap: 1rem
.gap-x-8 โ column-gap: 0.5rem
.gap-y-24 โ row-gap: 1.5rem
.gap-md-16 โ gap: 1rem (min-width: 48rem)
Size aliases โ opt-in
T-shirt names for steps of $sizes, added to margin, padding and gap only. An
alias is a second name for a step that already exists, so .pt-sm and .pt-8
are the same rule and the px names keep working. Responsive like the rest.
Off by default. Name the steps you want with $size-aliases:
@forward 'sulphuris/core/config' with (
$size-aliases: ('xs': 4, 'sm': 8, 'md': 16, 'lg': 32, 'xl': 64, 'xxl': 96)
);
.p-md โ padding: 1rem (same rule as .p-16)
.mx-lg โ margin-left: 2rem; margin-right: 2rem
.gap-sm โ gap: 0.5rem
.p-md-lg โ padding: 2rem (min-width: 48rem)
The alias names overlap the breakpoint names, which is why the last one reads the way it does: breakpoint first, value second, as everywhere else.
Note
There are no numeric aliases. .pt-2 is padding-top: 2px here and 8px in
Bootstrap and Tailwind โ one class name meaning three paddings is exactly what
the px names avoid.
Logical spacing (RTL-aware) โ opt-in
The x/y axis shorthands above map to physical sides (left/right, top/bottom). The logical variants below map to writing-direction-aware sides, so they flip automatically under RTL. Same scales as margin/padding. Responsive.
Off by default. Turn them on with $logical-properties:
@forward 'sulphuris/core/config' with ($logical-properties: true);
| Class pattern | CSS property |
|---|---|
.m-inline-{size} |
margin-inline |
.m-block-{size} |
margin-block |
.p-inline-{size} |
padding-inline |
.p-block-{size} |
padding-block |
.m-inline-16 โ margin-inline: 1rem
.p-block-24 โ padding-block: 1.5rem
.m-inline-md-16 โ margin-inline: 1rem (min-width: 48rem)
Positioning has the same pair โ .inset-inline-{size} / .inset-block-{size}, documented under Position.
Quick reference
.pt-16 โ padding-top: 1rem
.pb-0 โ padding-bottom: 0
.px-24 โ padding-left: 1.5rem; padding-right: 1.5rem
.py-8 โ padding-top: 0.5rem; padding-bottom: 0.5rem
.m-32 โ margin: 2rem
.mt--32 โ margin-top: -2rem
.mx-auto โ margin-left: auto; margin-right: auto
Responsive
Insert a breakpoint name between the prefix+orientation and the size value.
.p-md-24 โ padding: 1.5rem (min-width: 48rem)
.mt-lg-48 โ margin-top: 3rem (min-width: 64rem)
.mx-xl-auto โ margin-left/right: auto (min-width: 85.375rem)
Breakpoints (all min-width):
| Name | Min-width |
|---|---|
sm |
26.25rem (420px) |
md |
48rem (768px) |
lg |
64rem (1024px) |
xl |
85.375rem (1366px) |
xxl |
105rem (1680px) |
Note
Classes without a breakpoint segment apply at all viewport widths. Responsive variants layer on top via min-width media queries, so the base class is the mobile-first default.