Position
Position
Prefix: position. Property: position.
| Class | CSS |
|---|---|
.position-static |
position: static |
.position-relative |
position: relative |
.position-absolute |
position: absolute |
.position-fixed |
position: fixed |
.position-sticky |
position: sticky |
Offset (px)
Each side has its own single-letter prefix. Px-named values, emitted in rem โ see $rem-units.
| Prefix | Property |
|---|---|
t |
top |
r |
right |
b |
bottom |
l |
left |
Positive scale โ $sizes: 0, 1, 2, 3, 4, 6, 8, 12, 14, 16, 24, 32, 40, 48, 56, 64, 80, 96, 128, 256
.t-0 โ top: 0
.t-16 โ top: 1rem
.r-32 โ right: 2rem
.b-8 โ bottom: 0.5rem
.l-24 โ left: 1.5rem
Negative scale โ $negative-sizes: -1, -2, -3, -4, -8, -12, -14, -16, -24, -32, -40, -48, -56, -64
The key includes the minus sign, producing a double-dash in the class name.
.t--16 โ top: -1rem
.r--8 โ right: -0.5rem
.b--32 โ bottom: -2rem
.l--4 โ left: -0.25rem
Offset (%)
Same four prefixes. Unit: %. A p suffix marks percentage classes.
Positive % โ $percent-sizes: 5, 10, 15, 20, 25, 50, 75, 100
.t-50p โ top: 50%
.l-100p โ left: 100%
.r-25p โ right: 25%
Negative % โ $negative-percent-sizes: -25, -50, -75, -100
Coarser than the positive list on purpose: negative percentage offsets are a
centering trick (-50) and a full-bleed pull (-100), not a scale. Add the
finer steps back in the config if a layout needs them.
.t--50p โ top: -50%
.l--100p โ left: -100%
Inset
Prefix: inset. Property: inset. Sets all four offsets at once โ a shorthand that complements the single-side t/r/b/l utilities.
Uses the standard $sizes scale, plus $negative-sizes, positive percentages from $percent-sizes (p suffix), and auto. Responsive variants exist. Unlike the single-side t/r/b/l utilities, inset is not fed $negative-percent-sizes โ there is no .inset--50p.
.inset-16 โ inset: 1rem
.inset--16 โ inset: -1rem
.inset-50p โ inset: 50%
.inset-auto โ inset: auto
.inset-md-16 โ inset: 1rem (min-width: 48rem)
Logical inset (RTL-aware) โ opt-in
Prefixes: inset-inline, inset-block. The physical inset above sets all four sides; these two set a writing-direction-aware pair, so they flip automatically under RTL โ the positioning counterpart to the logical .m-inline-* / .p-block-* spacing utilities.
Off by default. They cost ~700 rules for a need most LTR projects never have, so they ship behind $logical-properties:
@forward 'sulphuris/core/config' with ($logical-properties: true);
| Class pattern | CSS property |
|---|---|
.inset-inline-{size} |
inset-inline (left + right in LTR) |
.inset-block-{size} |
inset-block (top + bottom) |
Same scales as inset: $sizes, $negative-sizes, $percent-sizes (p suffix), and auto. Responsive.
.inset-inline-0 โ inset-inline: 0
.inset-block-16 โ inset-block: 1rem
.inset-inline--8 โ inset-inline: -0.5rem
.inset-block-50p โ inset-block: 50%
.inset-inline-auto โ inset-inline: auto
.inset-block-md-16 โ inset-block: 1rem (min-width: 48rem)
Z-index
Prefix: z. Property: z-index.
Scale: -1, 0, 1, 2, 3, 4, 5, 10, 15, 20, 25, 50, 100
.z-0 โ z-index: 0
.z-1 โ z-index: 1
.z-10 โ z-index: 10
.z--1 โ z-index: -1
.z-100 โ z-index: 100
Helpers (_misc.scss)
Static single-purpose classes, no responsive variants.
Absolute cover
.absolute-cover โ position: absolute; top: 0; left: 0; width: 100%; height: 100%
Absolute centering
.absolute-center โ position: absolute; top: 50%; left: 50%; transform: translate3d(-50%, -50%, 0)
.absolute-center-vertical โ position: absolute; top: 50%; transform: translateY(-50%)
.absolute-center-horizontal โ position: absolute; left: 50%; transform: translateX(-50%)
Background sizing
.bg-cover โ background-size: cover; background-position: center; background-repeat: no-repeat
.bg-contain โ background-size: contain; background-position: center; background-repeat: no-repeat
Object fit
.object-fill โ object-fit: fill
.object-contain โ object-fit: contain
.object-cover โ object-fit: cover
Pointer events
.events-none โ pointer-events: none
.events-all โ pointer-events: all
.events-auto โ pointer-events: auto
Scrollbar
.hide-native-scrollbar โ hides scrollbar (scrollbar-width: none + ::-webkit-scrollbar)
Misc
.appearance-none โ -webkit-appearance: none; appearance: none
.no-select โ user-select: none (plus -webkit- for older Safari)
.sr-only โ screen-reader-only accessible hide (clip + clip-path + 1px)
.content-box โ box-sizing: content-box (overrides global border-box reset)
Note
[hidden] receives display: none !important and * { box-sizing: border-box } is set globally via the misc reset โ these are not utility classes.
Responsive
All offset, position and z-index classes generate responsive variants. Insert a breakpoint name between the prefix and the size key.
Pattern: .{prefix}-{bp}-{key}
.position-md-absolute โ position: absolute (min-width: 48rem)
.t-lg-32 โ top: 2rem (min-width: 64rem)
.t-md--16 โ top: -1rem (min-width: 48rem)
.l-xl-50p โ left: 50% (min-width: 85.375rem)
.z-md-10 โ z-index: 10 (min-width: 48rem)
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.