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
| Class | Sets | Old name |
|---|---|---|
| .mbe | margin-block-end: var(--jf-flow) | .mb |
| .mbs / .mie / .mis | the same, on that edge | .mt / .mr / .ml |
| .m-0 | margin: 0 | — |
| .mbs-0 / .mbe-0 / .mis-0 / .mie-0 | margin-<edge>: 0 | .mt-0 / .mb-0 / .ml-0 / .mr-0 |
| .p-0 | padding: 0 | — |
| .pbs-0 / .pbe-0 / .pis-0 / .pie-0 | padding-<edge>: 0 | .pt-0 / .pb-0 / .pl-0 / .pr-0 |
| .b-0 | border: none | — |
| .bbs-0 / .bbe-0 / .bis-0 / .bie-0 | border-<edge>: none | .bt-0 / .bb-0 / .bl-0 / .br-0 |
Text-weight, style and size utilities are on Typography.
Floats & text alignment
| Class | Effect |
|---|---|
| .align-start / .align-end | Float to the inline start / end (.align-left / -right deprecated). |
| .align-none / .align-center | No float; block, centred (images). |
| .text-start / .text-end / .text-center / .text-justify | text-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.
Display
| Class | Effect |
|---|---|
| .hide | display: none at every width. |
| .invisible | visibility: hidden — hidden but still takes space. |
| .hide-xs | Hidden 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-lg | Hidden only within that breakpoint's band — 600–899px, 900–1199px, 1200–1799px. |
| .hide-xl | Hidden 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-nav | Same, 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.
| Class | Effect |
|---|---|
| .flex / .flex-column | Make any element a flex container (optionally column). |
| .equal-height | On a .row: make child .cols equal height (.grid does this already). |
| .subgrid-rows | On a .grid / .auto-grid: align each item's internal rows via subgrid (set --jf-subgrid-rows). See Grid. |
| .align-top / -middle / -bottom / -baseline / -stretch | align-items on the container. |
| .align-self-top / -middle / -bottom | align-self on one item. |
| .justify-start / -center / -end / -around / -between / -evenly | justify-content on the container. |
align-items (on the container), one row per value, with a taller item in each to make the effect visible:
justify-content (on the container):
.flex / .flex-column on a plain element (not a .row):
Object fit
| Class | Effect |
|---|---|
| .object-cover | object-fit: cover — crops to fill the box. |
| .object-contain | object-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-width → width: 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,…");
}