Spacing
Spacing utilities set padding, margin, gap and the space between children. Every class and mixin reads the same spacing scale, and every value on the scale is a CSS custom property, so a layout written with NuvoUI stays consistent and can be retuned in one place.
How spacing works
Section titled “How spacing works”- One scale. Keys such as
2,4and8name steps on the$spacingsmap.p-4,p(4)andtoken(space-4)all mean the same value. - Tokens. Each key is emitted as
--nu-space-{key}. Classes and mixins outputvar(--nu-space-{key}), never a hard-coded length. - Readable names. The first letter is the property (
ppadding,mmargin), the next letter is the side or axis, and the number is the scale key.
| Part | Meaning | Examples |
|---|---|---|
p, m |
Padding, margin on all sides | p-4, m-2 |
x, y |
Inline axis, block axis (logical) | px-4, my-2 |
s, e |
Inline start, inline end (logical) | ps-4, me-2 |
t, r, b, l |
Top, right, bottom, left (physical) | pt-4, ml-2 |
gap, gap-x, gap-y |
Gap between flex or grid children | gap-4, gap-x-2 |
space-x, space-y |
Margin between direct children | space-y-3 |
The table below is generated from the core source when the site is built: core is compiled with Sass and the --nu-space-* tokens are read from the output. It always matches the current release of @nuvoui/core.
| Key | Token | Value | Pixels |
|---|---|---|---|
0 | --nu-space-0 | 0 | 0px |
1 | --nu-space-1 | 0.25rem | 4px |
2 | --nu-space-2 | 0.5rem | 8px |
3 | --nu-space-3 | 0.75rem | 12px |
4 | --nu-space-4 | 1rem | 16px |
5 | --nu-space-5 | 1.25rem | 20px |
6 | --nu-space-6 | 1.5rem | 24px |
8 | --nu-space-8 | 2rem | 32px |
10 | --nu-space-10 | 2.5rem | 40px |
12 | --nu-space-12 | 3rem | 48px |
16 | --nu-space-16 | 4rem | 64px |
20 | --nu-space-20 | 5rem | 80px |
24 | --nu-space-24 | 6rem | 96px |
32 | --nu-space-32 | 8rem | 128px |
40 | --nu-space-40 | 10rem | 160px |
48 | --nu-space-48 | 12rem | 192px |
56 | --nu-space-56 | 14rem | 224px |
64 | --nu-space-64 | 16rem | 256px |
A key that is not on the scale has no class and raises a compile error in mixins. To add a step, change the configuration (see Configuration).
Padding
Section titled “Padding”Padding adds space inside an element, between its border and its content. In the examples, the tinted area is the padding.
<div class="flex wrap gap-4"> <div class="p-4 bg-brand-subtle rounded"><div class="p-2 bg-surface rounded">p-4</div></div> <div class="px-6 py-2 bg-brand-subtle rounded"><div class="p-2 bg-surface rounded">px-6 py-2</div></div> <div class="pt-8 bg-brand-subtle rounded"><div class="p-2 bg-surface rounded">pt-8</div></div></div>.card { @include apply(p(4));}.chip { @include apply(px(6), py(2));}.banner { @include apply(pt(8));}Margin
Section titled “Margin”Margin adds space outside an element, between it and its neighbours.
<div class="bg-alternate rounded p-2"> <div class="mb-4 p-3 bg-surface border rounded">mb-4: space below</div> <div class="mx-8 p-3 bg-surface border rounded">mx-8: space on both inline sides</div> <div class="mt-2 p-3 bg-surface border rounded">mt-2: space above</div></div>Logical and physical sides
Section titled “Logical and physical sides”Logical utilities follow the text direction. In a left-to-right language such as English, the start side is the left; in a right-to-left language such as Arabic, the start side is the right. Physical utilities always mean the same screen side.
| Logical class | Property | Physical class | Property |
|---|---|---|---|
ps-* |
padding-inline-start |
pl-* |
padding-left |
pe-* |
padding-inline-end |
pr-* |
padding-right |
ms-* |
margin-inline-start |
ml-* |
margin-left |
me-* |
margin-inline-end |
mr-* |
margin-right |
px-*, mx-* |
padding-inline, margin-inline |
||
py-*, my-* |
padding-block, margin-block |
pt-*, pb-*, mt-*, mb-* |
top and bottom |
px, py, mx, my and space-x are logical: in NuvoUI, x means the inline axis.
The same markup is rendered twice below, once left to right and once right to left. The logical padding moves to the start side; the physical padding stays on the left.
<div class="space-y-2"> <div class="ps-8 py-2 bg-brand-subtle rounded"><div class="p-2 bg-surface rounded">ps-8 (start side)</div></div> <div class="pl-8 py-2 bg-alternate rounded"><div class="p-2 bg-surface rounded">pl-8 (always left)</div></div></div>When to use which
Section titled “When to use which”- Use logical utilities for layout that should mirror in right-to-left languages: indentation, icon spacing, the gap between a label and its control, a sidebar edge.
- Use physical utilities for content that must stay on the left in both Arabic and English, where mirroring would change its meaning.
<div class="pl-4 border-l-4 text-left p-3 bg-surface rounded"> Left-anchored content: pl-4 border-l-4 text-left</div>Auto margins
Section titled “Auto margins”Auto margins take up the free space on a side. mx-auto centres a block that has a width or maximum width (margin-inline: auto). ms-auto pushes an item to the end of a flex row in either direction.
<div class="bg-alternate rounded p-2"> <div class="mx-auto max-w-xs p-3 bg-surface border rounded text-center">mx-auto max-w-xs</div></div><div class="flex x-center gap-2 p-3 bg-surface border rounded"> <strong>Invoices</strong> <button class="ms-auto" type="button">New invoice</button></div>.toolbar { @include apply(flex, x-center, gap(2), p(3));}.toolbar__action { @include apply(ms-auto);}Available auto classes: mx-auto, ms-auto, me-auto, ml-auto, mr-auto.
Negative margins
Section titled “Negative margins”There are no negative margin classes. Use a negative key in a mixin: margin, space and inset mixins accept it and output calc(-1 * var(--nu-space-{key})).
.bleed { @include apply(mx(-4), mt(-2));}.bleed { margin-inline: calc(-1 * var(--nu-space-4)); margin-top: calc(-1 * var(--nu-space-2));}gap-* sets the space between the children of a flex or grid container. Unlike margins, gap never adds space before the first child or after the last one, and it works across wrapped rows.
<div class="flex wrap gap-4"> <div class="p-3 bg-brand-subtle rounded">One</div> <div class="p-3 bg-brand-subtle rounded">Two</div> <div class="p-3 bg-brand-subtle rounded">Three</div></div>gap-x-* sets the column gap and gap-y-* the row gap.
<div class="grid cols-3 gap-x-8 gap-y-2"> <div class="p-3 bg-brand-subtle rounded">1</div> <div class="p-3 bg-brand-subtle rounded">2</div> <div class="p-3 bg-brand-subtle rounded">3</div> <div class="p-3 bg-brand-subtle rounded">4</div> <div class="p-3 bg-brand-subtle rounded">5</div> <div class="p-3 bg-brand-subtle rounded">6</div></div>.gallery { @include apply(grid, cols(3), gap-x(8), gap-y(2));}gap-* and gap-x-* also set the internal custom property --nu-flex-gap on direct children, which the flex fill() width calculation reads. It is registered with inherits: false, so a nested flex container does not pick up its parent’s gap. It is not a token and token() does not accept it.
Space between children
Section titled “Space between children”space-y-* adds a top margin to every direct child except the first. space-x-* adds margin-inline-start, so it follows the text direction. Prefer gap-* for flex and grid containers; use space-* for plain block flow, such as a stack of paragraphs.
<div class="space-y-3"> <div class="p-3 bg-surface border rounded">First</div> <div class="p-3 bg-surface border rounded">Second</div> <div class="p-3 bg-surface border rounded">Third</div></div><div class="space-x-4"> <span class="inline-block p-2 bg-brand-subtle rounded">One</span><span class="inline-block p-2 bg-brand-subtle rounded">Two</span><span class="inline-block p-2 bg-brand-subtle rounded">Three</span></div>Responsive variants
Section titled “Responsive variants”Every spacing class has a responsive variant written with an @{breakpoint} suffix. A variant applies from its breakpoint upwards (mobile first), so list the base class first and larger screens after it.
<div class="p-2 p-4@md p-8@lg bg-brand-subtle rounded"> <div class="p-2 bg-surface rounded">p-2 p-4@md p-8@lg: resize the window</div></div>.panel { @include apply(p(2), p(4) md, p(8) lg);}| Suffix | Media query |
|---|---|
@xs | @media (min-width: 480px) |
@sm | @media (min-width: 640px) |
@md | @media (min-width: 768px) |
@lg | @media (min-width: 1024px) |
@xl | @media (min-width: 1280px) |
@2xl | @media (min-width: 1536px) |
Spacing has no state variants: there is no hover:p-4 class. Change spacing on hover in your own SCSS when it is really needed, and keep in mind that it moves surrounding content.
Every class has a mixin of the same name. Use them inside apply(), with a breakpoint after the mixin when needed.
@use "@nuvoui/core" as *;
.card { @include apply(p(4), mx(auto), ms(2) md);}.card { padding: var(--nu-space-4); margin-inline: auto;}@media (min-width: 768px) { .card { margin-inline-start: var(--nu-space-2); }}Keys and custom values
Section titled “Keys and custom values”A unitless number is a scale key: p(4) is var(--nu-space-4), the same as .p-4. A value with a unit is used as written, for one-off values that are not on the scale.
.hero { @include apply(p(1.5rem), gap(normal));}Margin and padding mixins also accept calc(), var() and the CSS-wide keywords (inherit, initial, unset, revert, revert-layer). Margin accepts auto; gap accepts normal.
Tokens in your own CSS
Section titled “Tokens in your own CSS”token() returns the custom property for a token name and raises an error for a name that does not exist.
.note { padding-inline: token(space-4); margin-block-end: token(space-2);}The Sass map stays available for compile-time maths: map.get($spacings, 4) returns 1rem.
Configuration
Section titled “Configuration”Pass your own $spacings map when loading core. The map replaces the default map; it is not merged, so include every key you use. Base element styles read keys 1, 2 and 4; without them those declarations are dropped, so keep these keys.
@use "@nuvoui/core" with ( $generate-utility-classes: true, $spacings: (0: 0, 0.5: 0.125rem, 1: 0.25rem, 2: 0.5rem, 3: 0.75rem, 4: 1rem, 6: 1.5rem, 8: 2rem, 12: 3rem, 16: 4rem));Decimal keys are escaped in class names and use _ in token names: key 0.5 gives .p-0\.5 (written p-0.5 in HTML) and --nu-space-0_5.
Errors
Section titled “Errors”Spacing mixins fail at compile time instead of emitting broken CSS.
| Input | Error |
|---|---|
p(7) |
p: 7 is not a configured key. Valid keys: 0, 1, 2, 3, 4, 5, 6, 8, 10, 12, 16, 20, 24, 32, 40, 48, 56, 64. Write a unit for a custom value (7px, 7rem). |
p(-4) |
p: negative key -4 is not allowed here. Negative keys work for margin, inset, offsets, translate and space only. |
p(auto) |
p: auto is not a valid padding value. |
token(space-7) |
token(space-7): unknown token. Close matches: space-0, space-1, ... |
Negative keys are rejected for padding and gap. 0 is always accepted.
CSS variables
Section titled “CSS variables”| Variable | Description |
|---|---|
--nu-space-{key} |
One token per key of $spacings. Fixed across themes. See Scale. |
--nu-flex-gap is an internal property set by the gap utilities, not a token.
Class reference
Section titled “Class reference”Generated from the compiled core build. Each class also has the responsive variants listed in Responsive variants.
Padding (162 rules)
| Selector | Declarations | Default value |
|---|---|---|
.p-0 | padding: var(--nu-space-0) | 0 |
.px-0 | padding-inline: var(--nu-space-0) | 0 |
.py-0 | padding-block: var(--nu-space-0) | 0 |
.pt-0 | padding-top: var(--nu-space-0) | 0 |
.pr-0 | padding-right: var(--nu-space-0) | 0 |
.pb-0 | padding-bottom: var(--nu-space-0) | 0 |
.pl-0 | padding-left: var(--nu-space-0) | 0 |
.ps-0 | padding-inline-start: var(--nu-space-0) | 0 |
.pe-0 | padding-inline-end: var(--nu-space-0) | 0 |
.p-1 | padding: var(--nu-space-1) | 0.25rem |
.px-1 | padding-inline: var(--nu-space-1) | 0.25rem |
.py-1 | padding-block: var(--nu-space-1) | 0.25rem |
.pt-1 | padding-top: var(--nu-space-1) | 0.25rem |
.pr-1 | padding-right: var(--nu-space-1) | 0.25rem |
.pb-1 | padding-bottom: var(--nu-space-1) | 0.25rem |
.pl-1 | padding-left: var(--nu-space-1) | 0.25rem |
.ps-1 | padding-inline-start: var(--nu-space-1) | 0.25rem |
.pe-1 | padding-inline-end: var(--nu-space-1) | 0.25rem |
.p-2 | padding: var(--nu-space-2) | 0.5rem |
.px-2 | padding-inline: var(--nu-space-2) | 0.5rem |
.py-2 | padding-block: var(--nu-space-2) | 0.5rem |
.pt-2 | padding-top: var(--nu-space-2) | 0.5rem |
.pr-2 | padding-right: var(--nu-space-2) | 0.5rem |
.pb-2 | padding-bottom: var(--nu-space-2) | 0.5rem |
.pl-2 | padding-left: var(--nu-space-2) | 0.5rem |
.ps-2 | padding-inline-start: var(--nu-space-2) | 0.5rem |
.pe-2 | padding-inline-end: var(--nu-space-2) | 0.5rem |
.p-3 | padding: var(--nu-space-3) | 0.75rem |
.px-3 | padding-inline: var(--nu-space-3) | 0.75rem |
.py-3 | padding-block: var(--nu-space-3) | 0.75rem |
.pt-3 | padding-top: var(--nu-space-3) | 0.75rem |
.pr-3 | padding-right: var(--nu-space-3) | 0.75rem |
.pb-3 | padding-bottom: var(--nu-space-3) | 0.75rem |
.pl-3 | padding-left: var(--nu-space-3) | 0.75rem |
.ps-3 | padding-inline-start: var(--nu-space-3) | 0.75rem |
.pe-3 | padding-inline-end: var(--nu-space-3) | 0.75rem |
.p-4 | padding: var(--nu-space-4) | 1rem |
.px-4 | padding-inline: var(--nu-space-4) | 1rem |
.py-4 | padding-block: var(--nu-space-4) | 1rem |
.pt-4 | padding-top: var(--nu-space-4) | 1rem |
.pr-4 | padding-right: var(--nu-space-4) | 1rem |
.pb-4 | padding-bottom: var(--nu-space-4) | 1rem |
.pl-4 | padding-left: var(--nu-space-4) | 1rem |
.ps-4 | padding-inline-start: var(--nu-space-4) | 1rem |
.pe-4 | padding-inline-end: var(--nu-space-4) | 1rem |
.p-5 | padding: var(--nu-space-5) | 1.25rem |
.px-5 | padding-inline: var(--nu-space-5) | 1.25rem |
.py-5 | padding-block: var(--nu-space-5) | 1.25rem |
.pt-5 | padding-top: var(--nu-space-5) | 1.25rem |
.pr-5 | padding-right: var(--nu-space-5) | 1.25rem |
.pb-5 | padding-bottom: var(--nu-space-5) | 1.25rem |
.pl-5 | padding-left: var(--nu-space-5) | 1.25rem |
.ps-5 | padding-inline-start: var(--nu-space-5) | 1.25rem |
.pe-5 | padding-inline-end: var(--nu-space-5) | 1.25rem |
.p-6 | padding: var(--nu-space-6) | 1.5rem |
.px-6 | padding-inline: var(--nu-space-6) | 1.5rem |
.py-6 | padding-block: var(--nu-space-6) | 1.5rem |
.pt-6 | padding-top: var(--nu-space-6) | 1.5rem |
.pr-6 | padding-right: var(--nu-space-6) | 1.5rem |
.pb-6 | padding-bottom: var(--nu-space-6) | 1.5rem |
.pl-6 | padding-left: var(--nu-space-6) | 1.5rem |
.ps-6 | padding-inline-start: var(--nu-space-6) | 1.5rem |
.pe-6 | padding-inline-end: var(--nu-space-6) | 1.5rem |
.p-8 | padding: var(--nu-space-8) | 2rem |
.px-8 | padding-inline: var(--nu-space-8) | 2rem |
.py-8 | padding-block: var(--nu-space-8) | 2rem |
.pt-8 | padding-top: var(--nu-space-8) | 2rem |
.pr-8 | padding-right: var(--nu-space-8) | 2rem |
.pb-8 | padding-bottom: var(--nu-space-8) | 2rem |
.pl-8 | padding-left: var(--nu-space-8) | 2rem |
.ps-8 | padding-inline-start: var(--nu-space-8) | 2rem |
.pe-8 | padding-inline-end: var(--nu-space-8) | 2rem |
.p-10 | padding: var(--nu-space-10) | 2.5rem |
.px-10 | padding-inline: var(--nu-space-10) | 2.5rem |
.py-10 | padding-block: var(--nu-space-10) | 2.5rem |
.pt-10 | padding-top: var(--nu-space-10) | 2.5rem |
.pr-10 | padding-right: var(--nu-space-10) | 2.5rem |
.pb-10 | padding-bottom: var(--nu-space-10) | 2.5rem |
.pl-10 | padding-left: var(--nu-space-10) | 2.5rem |
.ps-10 | padding-inline-start: var(--nu-space-10) | 2.5rem |
.pe-10 | padding-inline-end: var(--nu-space-10) | 2.5rem |
.p-12 | padding: var(--nu-space-12) | 3rem |
.px-12 | padding-inline: var(--nu-space-12) | 3rem |
.py-12 | padding-block: var(--nu-space-12) | 3rem |
.pt-12 | padding-top: var(--nu-space-12) | 3rem |
.pr-12 | padding-right: var(--nu-space-12) | 3rem |
.pb-12 | padding-bottom: var(--nu-space-12) | 3rem |
.pl-12 | padding-left: var(--nu-space-12) | 3rem |
.ps-12 | padding-inline-start: var(--nu-space-12) | 3rem |
.pe-12 | padding-inline-end: var(--nu-space-12) | 3rem |
.p-16 | padding: var(--nu-space-16) | 4rem |
.px-16 | padding-inline: var(--nu-space-16) | 4rem |
.py-16 | padding-block: var(--nu-space-16) | 4rem |
.pt-16 | padding-top: var(--nu-space-16) | 4rem |
.pr-16 | padding-right: var(--nu-space-16) | 4rem |
.pb-16 | padding-bottom: var(--nu-space-16) | 4rem |
.pl-16 | padding-left: var(--nu-space-16) | 4rem |
.ps-16 | padding-inline-start: var(--nu-space-16) | 4rem |
.pe-16 | padding-inline-end: var(--nu-space-16) | 4rem |
.p-20 | padding: var(--nu-space-20) | 5rem |
.px-20 | padding-inline: var(--nu-space-20) | 5rem |
.py-20 | padding-block: var(--nu-space-20) | 5rem |
.pt-20 | padding-top: var(--nu-space-20) | 5rem |
.pr-20 | padding-right: var(--nu-space-20) | 5rem |
.pb-20 | padding-bottom: var(--nu-space-20) | 5rem |
.pl-20 | padding-left: var(--nu-space-20) | 5rem |
.ps-20 | padding-inline-start: var(--nu-space-20) | 5rem |
.pe-20 | padding-inline-end: var(--nu-space-20) | 5rem |
.p-24 | padding: var(--nu-space-24) | 6rem |
.px-24 | padding-inline: var(--nu-space-24) | 6rem |
.py-24 | padding-block: var(--nu-space-24) | 6rem |
.pt-24 | padding-top: var(--nu-space-24) | 6rem |
.pr-24 | padding-right: var(--nu-space-24) | 6rem |
.pb-24 | padding-bottom: var(--nu-space-24) | 6rem |
.pl-24 | padding-left: var(--nu-space-24) | 6rem |
.ps-24 | padding-inline-start: var(--nu-space-24) | 6rem |
.pe-24 | padding-inline-end: var(--nu-space-24) | 6rem |
.p-32 | padding: var(--nu-space-32) | 8rem |
.px-32 | padding-inline: var(--nu-space-32) | 8rem |
.py-32 | padding-block: var(--nu-space-32) | 8rem |
.pt-32 | padding-top: var(--nu-space-32) | 8rem |
.pr-32 | padding-right: var(--nu-space-32) | 8rem |
.pb-32 | padding-bottom: var(--nu-space-32) | 8rem |
.pl-32 | padding-left: var(--nu-space-32) | 8rem |
.ps-32 | padding-inline-start: var(--nu-space-32) | 8rem |
.pe-32 | padding-inline-end: var(--nu-space-32) | 8rem |
.p-40 | padding: var(--nu-space-40) | 10rem |
.px-40 | padding-inline: var(--nu-space-40) | 10rem |
.py-40 | padding-block: var(--nu-space-40) | 10rem |
.pt-40 | padding-top: var(--nu-space-40) | 10rem |
.pr-40 | padding-right: var(--nu-space-40) | 10rem |
.pb-40 | padding-bottom: var(--nu-space-40) | 10rem |
.pl-40 | padding-left: var(--nu-space-40) | 10rem |
.ps-40 | padding-inline-start: var(--nu-space-40) | 10rem |
.pe-40 | padding-inline-end: var(--nu-space-40) | 10rem |
.p-48 | padding: var(--nu-space-48) | 12rem |
.px-48 | padding-inline: var(--nu-space-48) | 12rem |
.py-48 | padding-block: var(--nu-space-48) | 12rem |
.pt-48 | padding-top: var(--nu-space-48) | 12rem |
.pr-48 | padding-right: var(--nu-space-48) | 12rem |
.pb-48 | padding-bottom: var(--nu-space-48) | 12rem |
.pl-48 | padding-left: var(--nu-space-48) | 12rem |
.ps-48 | padding-inline-start: var(--nu-space-48) | 12rem |
.pe-48 | padding-inline-end: var(--nu-space-48) | 12rem |
.p-56 | padding: var(--nu-space-56) | 14rem |
.px-56 | padding-inline: var(--nu-space-56) | 14rem |
.py-56 | padding-block: var(--nu-space-56) | 14rem |
.pt-56 | padding-top: var(--nu-space-56) | 14rem |
.pr-56 | padding-right: var(--nu-space-56) | 14rem |
.pb-56 | padding-bottom: var(--nu-space-56) | 14rem |
.pl-56 | padding-left: var(--nu-space-56) | 14rem |
.ps-56 | padding-inline-start: var(--nu-space-56) | 14rem |
.pe-56 | padding-inline-end: var(--nu-space-56) | 14rem |
.p-64 | padding: var(--nu-space-64) | 16rem |
.px-64 | padding-inline: var(--nu-space-64) | 16rem |
.py-64 | padding-block: var(--nu-space-64) | 16rem |
.pt-64 | padding-top: var(--nu-space-64) | 16rem |
.pr-64 | padding-right: var(--nu-space-64) | 16rem |
.pb-64 | padding-bottom: var(--nu-space-64) | 16rem |
.pl-64 | padding-left: var(--nu-space-64) | 16rem |
.ps-64 | padding-inline-start: var(--nu-space-64) | 16rem |
.pe-64 | padding-inline-end: var(--nu-space-64) | 16rem |
Margin (167 rules)
| Selector | Declarations | Default value |
|---|---|---|
.m-0 | margin: var(--nu-space-0) | 0 |
.mx-0 | margin-inline: var(--nu-space-0) | 0 |
.my-0 | margin-block: var(--nu-space-0) | 0 |
.mt-0 | margin-top: var(--nu-space-0) | 0 |
.mr-0 | margin-right: var(--nu-space-0) | 0 |
.mb-0 | margin-bottom: var(--nu-space-0) | 0 |
.ml-0 | margin-left: var(--nu-space-0) | 0 |
.ms-0 | margin-inline-start: var(--nu-space-0) | 0 |
.me-0 | margin-inline-end: var(--nu-space-0) | 0 |
.m-1 | margin: var(--nu-space-1) | 0.25rem |
.mx-1 | margin-inline: var(--nu-space-1) | 0.25rem |
.my-1 | margin-block: var(--nu-space-1) | 0.25rem |
.mt-1 | margin-top: var(--nu-space-1) | 0.25rem |
.mr-1 | margin-right: var(--nu-space-1) | 0.25rem |
.mb-1 | margin-bottom: var(--nu-space-1) | 0.25rem |
.ml-1 | margin-left: var(--nu-space-1) | 0.25rem |
.ms-1 | margin-inline-start: var(--nu-space-1) | 0.25rem |
.me-1 | margin-inline-end: var(--nu-space-1) | 0.25rem |
.m-2 | margin: var(--nu-space-2) | 0.5rem |
.mx-2 | margin-inline: var(--nu-space-2) | 0.5rem |
.my-2 | margin-block: var(--nu-space-2) | 0.5rem |
.mt-2 | margin-top: var(--nu-space-2) | 0.5rem |
.mr-2 | margin-right: var(--nu-space-2) | 0.5rem |
.mb-2 | margin-bottom: var(--nu-space-2) | 0.5rem |
.ml-2 | margin-left: var(--nu-space-2) | 0.5rem |
.ms-2 | margin-inline-start: var(--nu-space-2) | 0.5rem |
.me-2 | margin-inline-end: var(--nu-space-2) | 0.5rem |
.m-3 | margin: var(--nu-space-3) | 0.75rem |
.mx-3 | margin-inline: var(--nu-space-3) | 0.75rem |
.my-3 | margin-block: var(--nu-space-3) | 0.75rem |
.mt-3 | margin-top: var(--nu-space-3) | 0.75rem |
.mr-3 | margin-right: var(--nu-space-3) | 0.75rem |
.mb-3 | margin-bottom: var(--nu-space-3) | 0.75rem |
.ml-3 | margin-left: var(--nu-space-3) | 0.75rem |
.ms-3 | margin-inline-start: var(--nu-space-3) | 0.75rem |
.me-3 | margin-inline-end: var(--nu-space-3) | 0.75rem |
.m-4 | margin: var(--nu-space-4) | 1rem |
.mx-4 | margin-inline: var(--nu-space-4) | 1rem |
.my-4 | margin-block: var(--nu-space-4) | 1rem |
.mt-4 | margin-top: var(--nu-space-4) | 1rem |
.mr-4 | margin-right: var(--nu-space-4) | 1rem |
.mb-4 | margin-bottom: var(--nu-space-4) | 1rem |
.ml-4 | margin-left: var(--nu-space-4) | 1rem |
.ms-4 | margin-inline-start: var(--nu-space-4) | 1rem |
.me-4 | margin-inline-end: var(--nu-space-4) | 1rem |
.m-5 | margin: var(--nu-space-5) | 1.25rem |
.mx-5 | margin-inline: var(--nu-space-5) | 1.25rem |
.my-5 | margin-block: var(--nu-space-5) | 1.25rem |
.mt-5 | margin-top: var(--nu-space-5) | 1.25rem |
.mr-5 | margin-right: var(--nu-space-5) | 1.25rem |
.mb-5 | margin-bottom: var(--nu-space-5) | 1.25rem |
.ml-5 | margin-left: var(--nu-space-5) | 1.25rem |
.ms-5 | margin-inline-start: var(--nu-space-5) | 1.25rem |
.me-5 | margin-inline-end: var(--nu-space-5) | 1.25rem |
.m-6 | margin: var(--nu-space-6) | 1.5rem |
.mx-6 | margin-inline: var(--nu-space-6) | 1.5rem |
.my-6 | margin-block: var(--nu-space-6) | 1.5rem |
.mt-6 | margin-top: var(--nu-space-6) | 1.5rem |
.mr-6 | margin-right: var(--nu-space-6) | 1.5rem |
.mb-6 | margin-bottom: var(--nu-space-6) | 1.5rem |
.ml-6 | margin-left: var(--nu-space-6) | 1.5rem |
.ms-6 | margin-inline-start: var(--nu-space-6) | 1.5rem |
.me-6 | margin-inline-end: var(--nu-space-6) | 1.5rem |
.m-8 | margin: var(--nu-space-8) | 2rem |
.mx-8 | margin-inline: var(--nu-space-8) | 2rem |
.my-8 | margin-block: var(--nu-space-8) | 2rem |
.mt-8 | margin-top: var(--nu-space-8) | 2rem |
.mr-8 | margin-right: var(--nu-space-8) | 2rem |
.mb-8 | margin-bottom: var(--nu-space-8) | 2rem |
.ml-8 | margin-left: var(--nu-space-8) | 2rem |
.ms-8 | margin-inline-start: var(--nu-space-8) | 2rem |
.me-8 | margin-inline-end: var(--nu-space-8) | 2rem |
.m-10 | margin: var(--nu-space-10) | 2.5rem |
.mx-10 | margin-inline: var(--nu-space-10) | 2.5rem |
.my-10 | margin-block: var(--nu-space-10) | 2.5rem |
.mt-10 | margin-top: var(--nu-space-10) | 2.5rem |
.mr-10 | margin-right: var(--nu-space-10) | 2.5rem |
.mb-10 | margin-bottom: var(--nu-space-10) | 2.5rem |
.ml-10 | margin-left: var(--nu-space-10) | 2.5rem |
.ms-10 | margin-inline-start: var(--nu-space-10) | 2.5rem |
.me-10 | margin-inline-end: var(--nu-space-10) | 2.5rem |
.m-12 | margin: var(--nu-space-12) | 3rem |
.mx-12 | margin-inline: var(--nu-space-12) | 3rem |
.my-12 | margin-block: var(--nu-space-12) | 3rem |
.mt-12 | margin-top: var(--nu-space-12) | 3rem |
.mr-12 | margin-right: var(--nu-space-12) | 3rem |
.mb-12 | margin-bottom: var(--nu-space-12) | 3rem |
.ml-12 | margin-left: var(--nu-space-12) | 3rem |
.ms-12 | margin-inline-start: var(--nu-space-12) | 3rem |
.me-12 | margin-inline-end: var(--nu-space-12) | 3rem |
.m-16 | margin: var(--nu-space-16) | 4rem |
.mx-16 | margin-inline: var(--nu-space-16) | 4rem |
.my-16 | margin-block: var(--nu-space-16) | 4rem |
.mt-16 | margin-top: var(--nu-space-16) | 4rem |
.mr-16 | margin-right: var(--nu-space-16) | 4rem |
.mb-16 | margin-bottom: var(--nu-space-16) | 4rem |
.ml-16 | margin-left: var(--nu-space-16) | 4rem |
.ms-16 | margin-inline-start: var(--nu-space-16) | 4rem |
.me-16 | margin-inline-end: var(--nu-space-16) | 4rem |
.m-20 | margin: var(--nu-space-20) | 5rem |
.mx-20 | margin-inline: var(--nu-space-20) | 5rem |
.my-20 | margin-block: var(--nu-space-20) | 5rem |
.mt-20 | margin-top: var(--nu-space-20) | 5rem |
.mr-20 | margin-right: var(--nu-space-20) | 5rem |
.mb-20 | margin-bottom: var(--nu-space-20) | 5rem |
.ml-20 | margin-left: var(--nu-space-20) | 5rem |
.ms-20 | margin-inline-start: var(--nu-space-20) | 5rem |
.me-20 | margin-inline-end: var(--nu-space-20) | 5rem |
.m-24 | margin: var(--nu-space-24) | 6rem |
.mx-24 | margin-inline: var(--nu-space-24) | 6rem |
.my-24 | margin-block: var(--nu-space-24) | 6rem |
.mt-24 | margin-top: var(--nu-space-24) | 6rem |
.mr-24 | margin-right: var(--nu-space-24) | 6rem |
.mb-24 | margin-bottom: var(--nu-space-24) | 6rem |
.ml-24 | margin-left: var(--nu-space-24) | 6rem |
.ms-24 | margin-inline-start: var(--nu-space-24) | 6rem |
.me-24 | margin-inline-end: var(--nu-space-24) | 6rem |
.m-32 | margin: var(--nu-space-32) | 8rem |
.mx-32 | margin-inline: var(--nu-space-32) | 8rem |
.my-32 | margin-block: var(--nu-space-32) | 8rem |
.mt-32 | margin-top: var(--nu-space-32) | 8rem |
.mr-32 | margin-right: var(--nu-space-32) | 8rem |
.mb-32 | margin-bottom: var(--nu-space-32) | 8rem |
.ml-32 | margin-left: var(--nu-space-32) | 8rem |
.ms-32 | margin-inline-start: var(--nu-space-32) | 8rem |
.me-32 | margin-inline-end: var(--nu-space-32) | 8rem |
.m-40 | margin: var(--nu-space-40) | 10rem |
.mx-40 | margin-inline: var(--nu-space-40) | 10rem |
.my-40 | margin-block: var(--nu-space-40) | 10rem |
.mt-40 | margin-top: var(--nu-space-40) | 10rem |
.mr-40 | margin-right: var(--nu-space-40) | 10rem |
.mb-40 | margin-bottom: var(--nu-space-40) | 10rem |
.ml-40 | margin-left: var(--nu-space-40) | 10rem |
.ms-40 | margin-inline-start: var(--nu-space-40) | 10rem |
.me-40 | margin-inline-end: var(--nu-space-40) | 10rem |
.m-48 | margin: var(--nu-space-48) | 12rem |
.mx-48 | margin-inline: var(--nu-space-48) | 12rem |
.my-48 | margin-block: var(--nu-space-48) | 12rem |
.mt-48 | margin-top: var(--nu-space-48) | 12rem |
.mr-48 | margin-right: var(--nu-space-48) | 12rem |
.mb-48 | margin-bottom: var(--nu-space-48) | 12rem |
.ml-48 | margin-left: var(--nu-space-48) | 12rem |
.ms-48 | margin-inline-start: var(--nu-space-48) | 12rem |
.me-48 | margin-inline-end: var(--nu-space-48) | 12rem |
.m-56 | margin: var(--nu-space-56) | 14rem |
.mx-56 | margin-inline: var(--nu-space-56) | 14rem |
.my-56 | margin-block: var(--nu-space-56) | 14rem |
.mt-56 | margin-top: var(--nu-space-56) | 14rem |
.mr-56 | margin-right: var(--nu-space-56) | 14rem |
.mb-56 | margin-bottom: var(--nu-space-56) | 14rem |
.ml-56 | margin-left: var(--nu-space-56) | 14rem |
.ms-56 | margin-inline-start: var(--nu-space-56) | 14rem |
.me-56 | margin-inline-end: var(--nu-space-56) | 14rem |
.m-64 | margin: var(--nu-space-64) | 16rem |
.mx-64 | margin-inline: var(--nu-space-64) | 16rem |
.my-64 | margin-block: var(--nu-space-64) | 16rem |
.mt-64 | margin-top: var(--nu-space-64) | 16rem |
.mr-64 | margin-right: var(--nu-space-64) | 16rem |
.mb-64 | margin-bottom: var(--nu-space-64) | 16rem |
.ml-64 | margin-left: var(--nu-space-64) | 16rem |
.ms-64 | margin-inline-start: var(--nu-space-64) | 16rem |
.me-64 | margin-inline-end: var(--nu-space-64) | 16rem |
.mx-auto | margin-inline: auto | auto |
.ml-auto | margin-left: auto | auto |
.mr-auto | margin-right: auto | auto |
.ms-auto | margin-inline-start: auto | auto |
.me-auto | margin-inline-end: auto | auto |
Gap (90 rules)
| Selector | Declarations | Default value |
|---|---|---|
.gap-0 | gap: var(--nu-space-0) | 0 |
.gap-0 > * | --nu-flex-gap: var(--nu-space-0) | 0 |
.gap-x-0 | column-gap: var(--nu-space-0) | 0 |
.gap-x-0 > * | --nu-flex-gap: var(--nu-space-0) | 0 |
.gap-y-0 | row-gap: var(--nu-space-0) | 0 |
.gap-1 | gap: var(--nu-space-1) | 0.25rem |
.gap-1 > * | --nu-flex-gap: var(--nu-space-1) | 0.25rem |
.gap-x-1 | column-gap: var(--nu-space-1) | 0.25rem |
.gap-x-1 > * | --nu-flex-gap: var(--nu-space-1) | 0.25rem |
.gap-y-1 | row-gap: var(--nu-space-1) | 0.25rem |
.gap-2 | gap: var(--nu-space-2) | 0.5rem |
.gap-2 > * | --nu-flex-gap: var(--nu-space-2) | 0.5rem |
.gap-x-2 | column-gap: var(--nu-space-2) | 0.5rem |
.gap-x-2 > * | --nu-flex-gap: var(--nu-space-2) | 0.5rem |
.gap-y-2 | row-gap: var(--nu-space-2) | 0.5rem |
.gap-3 | gap: var(--nu-space-3) | 0.75rem |
.gap-3 > * | --nu-flex-gap: var(--nu-space-3) | 0.75rem |
.gap-x-3 | column-gap: var(--nu-space-3) | 0.75rem |
.gap-x-3 > * | --nu-flex-gap: var(--nu-space-3) | 0.75rem |
.gap-y-3 | row-gap: var(--nu-space-3) | 0.75rem |
.gap-4 | gap: var(--nu-space-4) | 1rem |
.gap-4 > * | --nu-flex-gap: var(--nu-space-4) | 1rem |
.gap-x-4 | column-gap: var(--nu-space-4) | 1rem |
.gap-x-4 > * | --nu-flex-gap: var(--nu-space-4) | 1rem |
.gap-y-4 | row-gap: var(--nu-space-4) | 1rem |
.gap-5 | gap: var(--nu-space-5) | 1.25rem |
.gap-5 > * | --nu-flex-gap: var(--nu-space-5) | 1.25rem |
.gap-x-5 | column-gap: var(--nu-space-5) | 1.25rem |
.gap-x-5 > * | --nu-flex-gap: var(--nu-space-5) | 1.25rem |
.gap-y-5 | row-gap: var(--nu-space-5) | 1.25rem |
.gap-6 | gap: var(--nu-space-6) | 1.5rem |
.gap-6 > * | --nu-flex-gap: var(--nu-space-6) | 1.5rem |
.gap-x-6 | column-gap: var(--nu-space-6) | 1.5rem |
.gap-x-6 > * | --nu-flex-gap: var(--nu-space-6) | 1.5rem |
.gap-y-6 | row-gap: var(--nu-space-6) | 1.5rem |
.gap-8 | gap: var(--nu-space-8) | 2rem |
.gap-8 > * | --nu-flex-gap: var(--nu-space-8) | 2rem |
.gap-x-8 | column-gap: var(--nu-space-8) | 2rem |
.gap-x-8 > * | --nu-flex-gap: var(--nu-space-8) | 2rem |
.gap-y-8 | row-gap: var(--nu-space-8) | 2rem |
.gap-10 | gap: var(--nu-space-10) | 2.5rem |
.gap-10 > * | --nu-flex-gap: var(--nu-space-10) | 2.5rem |
.gap-x-10 | column-gap: var(--nu-space-10) | 2.5rem |
.gap-x-10 > * | --nu-flex-gap: var(--nu-space-10) | 2.5rem |
.gap-y-10 | row-gap: var(--nu-space-10) | 2.5rem |
.gap-12 | gap: var(--nu-space-12) | 3rem |
.gap-12 > * | --nu-flex-gap: var(--nu-space-12) | 3rem |
.gap-x-12 | column-gap: var(--nu-space-12) | 3rem |
.gap-x-12 > * | --nu-flex-gap: var(--nu-space-12) | 3rem |
.gap-y-12 | row-gap: var(--nu-space-12) | 3rem |
.gap-16 | gap: var(--nu-space-16) | 4rem |
.gap-16 > * | --nu-flex-gap: var(--nu-space-16) | 4rem |
.gap-x-16 | column-gap: var(--nu-space-16) | 4rem |
.gap-x-16 > * | --nu-flex-gap: var(--nu-space-16) | 4rem |
.gap-y-16 | row-gap: var(--nu-space-16) | 4rem |
.gap-20 | gap: var(--nu-space-20) | 5rem |
.gap-20 > * | --nu-flex-gap: var(--nu-space-20) | 5rem |
.gap-x-20 | column-gap: var(--nu-space-20) | 5rem |
.gap-x-20 > * | --nu-flex-gap: var(--nu-space-20) | 5rem |
.gap-y-20 | row-gap: var(--nu-space-20) | 5rem |
.gap-24 | gap: var(--nu-space-24) | 6rem |
.gap-24 > * | --nu-flex-gap: var(--nu-space-24) | 6rem |
.gap-x-24 | column-gap: var(--nu-space-24) | 6rem |
.gap-x-24 > * | --nu-flex-gap: var(--nu-space-24) | 6rem |
.gap-y-24 | row-gap: var(--nu-space-24) | 6rem |
.gap-32 | gap: var(--nu-space-32) | 8rem |
.gap-32 > * | --nu-flex-gap: var(--nu-space-32) | 8rem |
.gap-x-32 | column-gap: var(--nu-space-32) | 8rem |
.gap-x-32 > * | --nu-flex-gap: var(--nu-space-32) | 8rem |
.gap-y-32 | row-gap: var(--nu-space-32) | 8rem |
.gap-40 | gap: var(--nu-space-40) | 10rem |
.gap-40 > * | --nu-flex-gap: var(--nu-space-40) | 10rem |
.gap-x-40 | column-gap: var(--nu-space-40) | 10rem |
.gap-x-40 > * | --nu-flex-gap: var(--nu-space-40) | 10rem |
.gap-y-40 | row-gap: var(--nu-space-40) | 10rem |
.gap-48 | gap: var(--nu-space-48) | 12rem |
.gap-48 > * | --nu-flex-gap: var(--nu-space-48) | 12rem |
.gap-x-48 | column-gap: var(--nu-space-48) | 12rem |
.gap-x-48 > * | --nu-flex-gap: var(--nu-space-48) | 12rem |
.gap-y-48 | row-gap: var(--nu-space-48) | 12rem |
.gap-56 | gap: var(--nu-space-56) | 14rem |
.gap-56 > * | --nu-flex-gap: var(--nu-space-56) | 14rem |
.gap-x-56 | column-gap: var(--nu-space-56) | 14rem |
.gap-x-56 > * | --nu-flex-gap: var(--nu-space-56) | 14rem |
.gap-y-56 | row-gap: var(--nu-space-56) | 14rem |
.gap-64 | gap: var(--nu-space-64) | 16rem |
.gap-64 > * | --nu-flex-gap: var(--nu-space-64) | 16rem |
.gap-x-64 | column-gap: var(--nu-space-64) | 16rem |
.gap-x-64 > * | --nu-flex-gap: var(--nu-space-64) | 16rem |
.gap-y-64 | row-gap: var(--nu-space-64) | 16rem |
Space between children (36 rules)
| Selector | Declarations | Default value |
|---|---|---|
.space-x-0 > * + * | margin-inline-start: var(--nu-space-0) | 0 |
.space-y-0 > * + * | margin-block-start: var(--nu-space-0) | 0 |
.space-x-1 > * + * | margin-inline-start: var(--nu-space-1) | 0.25rem |
.space-y-1 > * + * | margin-block-start: var(--nu-space-1) | 0.25rem |
.space-x-2 > * + * | margin-inline-start: var(--nu-space-2) | 0.5rem |
.space-y-2 > * + * | margin-block-start: var(--nu-space-2) | 0.5rem |
.space-x-3 > * + * | margin-inline-start: var(--nu-space-3) | 0.75rem |
.space-y-3 > * + * | margin-block-start: var(--nu-space-3) | 0.75rem |
.space-x-4 > * + * | margin-inline-start: var(--nu-space-4) | 1rem |
.space-y-4 > * + * | margin-block-start: var(--nu-space-4) | 1rem |
.space-x-5 > * + * | margin-inline-start: var(--nu-space-5) | 1.25rem |
.space-y-5 > * + * | margin-block-start: var(--nu-space-5) | 1.25rem |
.space-x-6 > * + * | margin-inline-start: var(--nu-space-6) | 1.5rem |
.space-y-6 > * + * | margin-block-start: var(--nu-space-6) | 1.5rem |
.space-x-8 > * + * | margin-inline-start: var(--nu-space-8) | 2rem |
.space-y-8 > * + * | margin-block-start: var(--nu-space-8) | 2rem |
.space-x-10 > * + * | margin-inline-start: var(--nu-space-10) | 2.5rem |
.space-y-10 > * + * | margin-block-start: var(--nu-space-10) | 2.5rem |
.space-x-12 > * + * | margin-inline-start: var(--nu-space-12) | 3rem |
.space-y-12 > * + * | margin-block-start: var(--nu-space-12) | 3rem |
.space-x-16 > * + * | margin-inline-start: var(--nu-space-16) | 4rem |
.space-y-16 > * + * | margin-block-start: var(--nu-space-16) | 4rem |
.space-x-20 > * + * | margin-inline-start: var(--nu-space-20) | 5rem |
.space-y-20 > * + * | margin-block-start: var(--nu-space-20) | 5rem |
.space-x-24 > * + * | margin-inline-start: var(--nu-space-24) | 6rem |
.space-y-24 > * + * | margin-block-start: var(--nu-space-24) | 6rem |
.space-x-32 > * + * | margin-inline-start: var(--nu-space-32) | 8rem |
.space-y-32 > * + * | margin-block-start: var(--nu-space-32) | 8rem |
.space-x-40 > * + * | margin-inline-start: var(--nu-space-40) | 10rem |
.space-y-40 > * + * | margin-block-start: var(--nu-space-40) | 10rem |
.space-x-48 > * + * | margin-inline-start: var(--nu-space-48) | 12rem |
.space-y-48 > * + * | margin-block-start: var(--nu-space-48) | 12rem |
.space-x-56 > * + * | margin-inline-start: var(--nu-space-56) | 14rem |
.space-y-56 > * + * | margin-block-start: var(--nu-space-56) | 14rem |
.space-x-64 > * + * | margin-inline-start: var(--nu-space-64) | 16rem |
.space-y-64 > * + * | margin-block-start: var(--nu-space-64) | 16rem |
Accessibility and RTL
Section titled “Accessibility and RTL”- Mirror with logical utilities. Use
ps,pe,ms,me,px,mxandspace-xfor anything that should follow the reading direction. A right-to-left page then needs onlydir="rtl", not a second set of classes. - Keep physical utilities deliberate. Reserve
pl,pr,ml,mrfor content that must stay on the same side in every language. - Spacing is not structure. Do not use margins or empty elements to express grouping that a screen reader needs; use headings, lists and landmarks, and let spacing reflect that structure visually.
- Targets and text zoom. The scale is in
rem, so spacing grows with the user’s font size. Padding on interactive elements helps them reach a comfortable target size (WCAG 2.2, 2.5.8 Target Size, at least 24 by 24 CSS pixels). - Reflow. Prefer
gap-*with wrapping flex or grid layouts over fixed margins, so content reflows at narrow widths and 400% zoom (WCAG 1.4.10).