Utilities

Single-purpose classes, all !important. Spacing / border / float utilities use logical axes (i = inline, b = block; s = start, e = end). The old physical names (.ml, .text-right…) still work as deprecated aliases — they may be dropped in later versions.

Spacing & border

Spacing and border reset utilities
ClassSetsOld name
.mbemargin-block-end: var(--jf-flow).mb
.mbs / .mie / .misthe same, on that edge.mt / .mr / .ml
.m-0margin: 0
.mbs-0 / .mbe-0 / .mis-0 / .mie-0margin-<edge>: 0.mt-0 / .mb-0 / .ml-0 / .mr-0
.p-0padding: 0
.pbs-0 / .pbe-0 / .pis-0 / .pie-0padding-<edge>: 0.pt-0 / .pb-0 / .pl-0 / .pr-0
.b-0border: none
.bbs-0 / .bbe-0 / .bis-0 / .bie-0border-<edge>: none.bt-0 / .bb-0 / .bl-0 / .br-0

Text-weight, style and size utilities are on Typography.

Floats & text alignment

Float and text-alignment utilities
ClassEffect
.align-start / .align-endFloat to the inline start / end (.align-left / -right deprecated).
.align-none / .align-centerNo float; block, centred (images).
.text-start / .text-end / .text-center / .text-justifytext-align (.text-left / -right deprecated).

A block that directly contains a floated .align-* child contains the float itself (display: flow-root via :has()) — no .clearfix. The rule is wrapped in :where() on purpose, giving it zero specificity: any other display declaration on that same element wins, no matter how it got there — a plugin's, an explicit flex / grid of your own, Jellyfish's own .grid / .row, or even .boxed itself (display: inherit). Put .boxed only on the floated children, not the containing box, or its display: inherit silently cancels the auto-containment and you're back to setting flow-root by hand. Prefer flex / grid over floats.

float end
float start
Text wraps around both; this box has no competing display of its own, so the auto flow-root actually applies — nothing spills out below.

Display

Display and visibility utilities
ClassEffect
.hidedisplay: none at every width.
.invisiblevisibility: hidden — hidden but still takes space.
.hide-xsHidden below 600px — the xs band, the same name the grid gives its base columns. The band has no lower bound, so this is an alias of .hide-below-sm; they compile to one rule.
.hide-sm / .hide-md / .hide-lgHidden only within that breakpoint's band — 600–899px, 900–1199px, 1200–1799px.
.hide-xlHidden from 1800px up. The top band has no upper bound, so this is an alias of .hide-above-xl — they compile to one rule.
.hide-above-{bp} / .hide-below-{bp}Hidden at and above / below the breakpoint. Generated for all four keys.
.hide-above-nav / .hide-below-navSame, keyed to $nav-expands (for navbar items).

Two families, two mental models. .hide-{bp} hides within one band only and lets everything either side through — five bands, xs through xl, covering the whole range with no gaps. .hide-above-{bp} / .hide-below-{bp} are open-ended and stack, so combine them for a custom span: .hide-below-md .hide-above-lg hides everywhere except 900–1199px.

Flex & grid alignment

On a .row or .grid unless noted. Values are writing-mode-relative, so they work on both engines.

Alignment utilities
ClassEffect
.flex / .flex-columnMake any element a flex container (optionally column).
.equal-heightOn a .row: make child .cols equal height (.grid does this already).
.subgrid-rowsOn a .grid / .auto-grid: align each item's internal rows via subgrid (set --jf-subgrid-rows). See Grid.
.align-top / -middle / -bottom / -baseline / -stretchalign-items on the container.
.align-self-top / -middle / -bottomalign-self on one item.
.justify-start / -center / -end / -around / -between / -evenlyjustify-content on the container.

align-items (on the container), one row per value, with a taller item in each to make the effect visible:

align-top
taller
align-self-bottom
align-middle
taller
align-middle
align-bottom
taller
align-self-top
align-stretch (default)
taller
stretches to match

justify-content (on the container):

justify-start
justify-start
justify-center
justify-center
justify-between
justify-between
justify-around
justify-around
justify-evenly
justify-evenly

.flex / .flex-column on a plain element (not a .row):

.flexrow(default direction)
.flex-columnstacksinstead

Object fit

Object-fit utilities
ClassEffect
.object-coverobject-fit: cover — crops to fill the box.
.object-containobject-fit: contain — letterboxes so the whole image shows.

Both need the image to have been given a size — a width and height, an aspect-ratio, or a .ratio-* class. Both also zero the image's trailing --jf-flow margin. A .ratio-* already applies cover, so pair it with .object-contain to letterbox within that ratio. See Images and media.

Width

.full-widthwidth: 100%.

Icons

.icon paints an SVG in the current text colour, sized to the font. Point --jf-icon at a url() — a data: URI or a path — per instance or in your own rule:

Three inline data-URI SVGs, so no external file is needed for this demo — they inherit color from their surrounding text, and scale with font-size:

In your own CSS the class isn't needed — @include icon() emits the same rules on any selector, a pseudo-element included. Set --jf-icon in the same rule, and pass a size if you want something other than 1em. An arrow after external links:


    a[target="_blank"]::after {
      @include icon(0.8em);
      content: "";
      --jf-icon: url("data:image/svg+xml,…");
    }