sdxc

[ @sdxc/u/typography ]

lineClamp

Truncates text via the -webkit-line-clamp trick.

import { lineClamp } from "@sdxc/u/typography";

Quick reference

Every documented call, beside the CSS it emits.

CallCSS
u.lineClamp(3)css({ display: "-webkit-box", WebkitBoxOrient: "vertical", WebkitLineClamp: "3", overflow: "hidden" })

Examples

Basic example

Use lineClamp(n) to cut text off after a number of lines, ending the last one in an ellipsis:

Mar 10, 2026 · Marketing

What we learned testing forty pricing pages

Most visitors leave a pricing page within ten seconds. We tested forty variations of ours over six months, and the changes that moved the number were not the ones we expected: fewer plans, a plainer headline, and a single button that said exactly what would happen next.

<article mix={[maxIs(80), ...]}>
	<p mix={[text("sm"), fg("neutral.muted")]}>Mar 10, 2026 · Marketing</p>
	<h3 mix={[text("lg"), weight("semibold")]}>What we learned testing forty pricing pages</h3>
	<p mix={[lineClamp(3), fg("neutral.muted")]}>
		Most visitors leave a pricing page within ten seconds. We tested forty variations of ours
		over six months, and the changes that moved the number were not the ones we expected: fewer
		plans, a plainer headline, and a single button that said exactly what would happen next.
	</p>
</article>

Changing the line count

Pass a smaller number for a tighter preview, like lineClamp(1) in a list of messages:

lineClamp(1)

The pasta was perfect and the tiramisu even better, but we waited forty minutes for a table we had booked a week ahead, and nobody apologised.

lineClamp(2)

The pasta was perfect and the tiramisu even better, but we waited forty minutes for a table we had booked a week ahead, and nobody apologised.

<div mix={[maxIs(80), ...]}>
	<div>
		<p mix={[...]}>lineClamp(1)</p>
		<p mix={[lineClamp(1)]}>
			The pasta was perfect and the tiramisu even better, but we waited forty minutes for a
			table we had booked a week ahead, and nobody apologised.
		</p>
	</div>
	<div>
		<p mix={[...]}>lineClamp(2)</p>
		<p mix={[lineClamp(2)]}>
			The pasta was perfect and the tiramisu even better, but we waited forty minutes for a
			table we had booked a week ahead, and nobody apologised.
		</p>
	</div>
</div>

Using a custom value

Every scale argument also takes a raw CSS value, which passes through untouched.

u.lineClamp("2.75rem")

Applying on a state

Wrap the call in a state utility to scope it to one selector.

u.hover(u.lineClamp(3))

Responsive design

Wrap the call in a container query to scope it to one width.

u.at("md", u.lineClamp(3))

Signature

u.lineClamp(lines: number)

Written by Sergio Xalambrí. Follow @sergiodxa for new packages, or sponsor the work.