Skip to content

Spacing

Spacing

WEC Design System uses a 4px base unit for spacing, following the Tailwind CSS default scale. This creates consistent, harmonious layouts throughout all components and pages.

Based on multiples of 4px for consistency and predictability.

TokenValuePixelsUsage
000pxNone, reset
px1px1pxHairline borders, dividers
0.52px2pxMicro spacing, tight gaps
14px4pxTiny spacing, icon gaps
1.56px6pxSmall spacing
28px8pxBase small spacing
312px12pxDefault spacing, compact padding
416px16pxComfortable spacing, mobile padding
520px20pxSpacious elements
624px24pxSection spacing, desktop padding
832px32pxLarge section spacing
1040px40pxXL spacing between sections
1248px48pxXXL section spacing
1664px64pxHero section spacing
2080px80pxExtra hero spacing
2496px96pxUltra spacing, landing sections
SizePaddingUsage
Small8px 16px (spacing-2 spacing-4)Compact buttons
Medium12px 24px (spacing-3 spacing-6)Default buttons
Large16px 32px (spacing-4 spacing-8)Prominent CTAs
.button-small {
padding: var(--spacing-2) var(--spacing-4);
}
.button-medium {
padding: var(--spacing-3) var(--spacing-6);
}
.button-large {
padding: var(--spacing-4) var(--spacing-8);
}
DevicePaddingToken
Mobile16pxspacing-4
Desktop24pxspacing-6
.card {
padding: var(--spacing-4); /* Mobile */
}
@media (min-width: 768px) {
.card {
padding: var(--spacing-6); /* Desktop */
}
}
ContextMarginToken
Mobile sections24px 0spacing-6 vertical
Desktop sections40px 0spacing-10 vertical
Hero sections64px 0spacing-16 vertical
.section {
margin-top: var(--spacing-6);
margin-bottom: var(--spacing-6);
}
@media (min-width: 768px) {
.section {
margin-top: var(--spacing-10);
margin-bottom: var(--spacing-10);
}
}
ContextGapToken
Icon + text8pxspacing-2
Form fields16pxspacing-4
Cards in grid24pxspacing-6
.icon-with-text {
display: flex;
align-items: center;
gap: var(--spacing-2);
}
.form-group {
display: flex;
flex-direction: column;
gap: var(--spacing-4);
}
.card-grid {
display: grid;
gap: var(--spacing-6);
}
.package-card {
/* Internal padding */
padding: var(--spacing-6);
/* Element spacing */
gap: var(--spacing-4);
}
.package-card-header {
margin-bottom: var(--spacing-3);
}
.package-card-body {
margin-bottom: var(--spacing-6);
}
.package-card-footer {
padding-top: var(--spacing-4);
border-top: 1px solid var(--color-grey-20);
}
.form {
max-width: 500px;
}
.form-group {
margin-bottom: var(--spacing-4);
}
.form-label {
margin-bottom: var(--spacing-2);
display: block;
}
.form-input {
padding: var(--spacing-3) var(--spacing-4);
}
.form-hint {
margin-top: var(--spacing-2);
font-size: var(--text-mobile-body-small);
}
.form-error {
margin-top: var(--spacing-2);
padding: var(--spacing-2) var(--spacing-3);
}
.navbar {
padding: var(--spacing-4) var(--spacing-6);
}
.nav-links {
gap: var(--spacing-8);
}
.nav-item {
padding: var(--spacing-2) var(--spacing-4);
}
.modal {
padding: var(--spacing-6);
}
.modal-header {
margin-bottom: var(--spacing-4);
}
.modal-body {
margin-bottom: var(--spacing-6);
}
.modal-footer {
display: flex;
gap: var(--spacing-3);
justify-content: flex-end;
}

Spacing adjusts based on breakpoint:

/* Mobile-first approach */
.container {
padding: var(--spacing-4); /* 16px on mobile */
}
@media (min-width: 768px) {
.container {
padding: var(--spacing-10); /* 40px on tablet+ */
}
}
@media (min-width: 1024px) {
.container {
padding: var(--spacing-16); /* 64px on desktop */
}
}
BreakpointHorizontal PaddingUsage
Mobile (< 768px)24pxStandard mobile padding
Tablet (768px - 1024px)40pxComfortable tablet padding
Desktop (1024px+)100pxSpacious desktop padding
.content-wrapper {
padding-left: var(--spacing-6); /* 24px mobile */
padding-right: var(--spacing-6);
}
@media (min-width: 768px) {
.content-wrapper {
padding-left: var(--spacing-10); /* 40px tablet */
padding-right: var(--spacing-10);
}
}
@media (min-width: 1024px) {
.content-wrapper {
padding-left: 100px; /* 100px desktop */
padding-right: 100px;
}
}

Our spacing follows an 8pt visual grid (multiples of 8px):

8px = spacing-2
16px = spacing-4
24px = spacing-6
32px = spacing-8
40px = spacing-10
48px = spacing-12
64px = spacing-16

Benefits:

  • Creates visual rhythm
  • Aligns elements across components
  • Easier decision-making (fewer options)
  • Consistent vertical rhythm
.flex-container {
display: flex;
gap: var(--spacing-4); /* Works for flex and grid */
}
.flex-item:not(:last-child) {
margin-right: var(--spacing-4);
}
/* Vertical spacing */
.flex-column > * + * {
margin-top: var(--spacing-4);
}
.grid {
display: grid;
gap: var(--spacing-6); /* Row and column gap */
}
/* Different row/column gaps */
.grid-mixed {
display: grid;
row-gap: var(--spacing-6);
column-gap: var(--spacing-4);
}

Use for breaking out of containers:

.full-width-bleed {
margin-left: calc(-1 * var(--spacing-6));
margin-right: calc(-1 * var(--spacing-6));
width: calc(100% + var(--spacing-6) * 2);
}
@media (min-width: 768px) {
.full-width-bleed {
margin-left: calc(-1 * var(--spacing-10));
margin-right: calc(-1 * var(--spacing-10));
width: calc(100% + var(--spacing-10) * 2);
}
}
:root {
/* Spacing Scale (4px base unit) */
--spacing-0: 0;
--spacing-px: 1px;
--spacing-0-5: 2px;
--spacing-1: 4px;
--spacing-1-5: 6px;
--spacing-2: 8px;
--spacing-3: 12px;
--spacing-4: 16px;
--spacing-5: 20px;
--spacing-6: 24px;
--spacing-8: 32px;
--spacing-10: 40px;
--spacing-12: 48px;
--spacing-16: 64px;
--spacing-20: 80px;
--spacing-24: 96px;
/* Common Patterns */
--space-button-sm: var(--spacing-2) var(--spacing-4);
--space-button-md: var(--spacing-3) var(--spacing-6);
--space-button-lg: var(--spacing-4) var(--spacing-8);
--space-card-mobile: var(--spacing-4);
--space-card-desktop: var(--spacing-6);
--space-section-mobile: var(--spacing-6);
--space-section-desktop: var(--spacing-10);
}

If using Tailwind CSS, these map to default utilities:

<div className="p-4"> {/* padding: 16px */}
<div className="px-6 py-4"> {/* padding: 24px 16px */}
<div className="gap-2"> {/* gap: 8px */}
<div className="space-y-4"> {/* children: margin-top: 16px */}
✅ Do❌ Don’t
Use spacing scale consistentlyUse arbitrary values (e.g., 17px)
Stick to 4px multiplesUse pixel values that don’t align
Scale spacing with viewportUse fixed spacing on all screens
Use larger spacing between sectionsUse equal spacing everywhere
Consider 8pt grid alignmentBreak the visual grid

When designing or building:

  • Am I using a token from the spacing scale?
  • Does spacing follow the 8pt grid?
  • Is spacing responsive (mobile vs desktop)?
  • Do similar elements use consistent spacing?
  • Is there enough breathing room between sections?
  • Does touch target spacing meet minimums (44px)?
/* Compact - for dense interfaces */
.compact-list {
padding: var(--spacing-3) var(--spacing-4);
gap: var(--spacing-2);
}
/* Comfortable - for general use */
.comfortable-list {
padding: var(--spacing-4) var(--spacing-6);
gap: var(--spacing-4);
}
/* Spacious - for emphasis */
.spacious-list {
padding: var(--spacing-6) var(--spacing-8);
gap: var(--spacing-6);
}
/* Tightly packed sections */
.tight-sections > * + * {
margin-top: var(--spacing-6); /* 24px */
}
/* Standard section spacing */
.standard-sections > * + * {
margin-top: var(--spacing-10); /* 40px */
}
/* Generous section spacing */
.generous-sections > * + * {
margin-top: var(--spacing-16); /* 64px */
}