Throughline

Integration Logo Paths for React

Glass tiles that ride dotted lines through your headline. Each tile slides out from under a small station, grows as it travels, turns a little on the way, and dives into the far station, and a tile passing over a colored letter picks up its color through the glass. Rest the pointer on one and its whole line comes to a stop, like a cable car line, while the tile turns upright and shows its label. Lines can run behind the content as well as over it.

  • Hero
  • Interaction
  • Motion

Uses clsx, tailwind-merge

Inspired by Cloudflare for Startups

Open in ChatGPTOpen in Claude
duration26s
brakeDuration0.30s
releaseDuration0.60s
stationstrue
<Throughline />

The demo follows as you drag.

Okto integrations

Everything
  • Tally · Billing
  • Halfmoon · Support inbox
  • Wavelet · Product analytics
  • Gridline · Spreadsheets
  • Roundup · CRM
  • Relay Mail · Email
  • Stint · Time tracking
  • Bolt Forms · Surveys

Okto keeps billing, support and analytics in sync both ways. Edit a record in one, and the rest have it within a second.

Browse 40 integrations
Take this demo to your coding agent.
Add this moment from KeyframeUI to our project and adapt it to our content.

Throughline: Glass tiles that ride dotted lines through your headline. Each tile slides out from under a small station, grows as it travels, turns a little on the way, and dives into the far station, and a tile passing over a colored letter picks up its color through the glass. Rest the pointer on one and its whole line comes to a stop, like a cable car line, while the tile turns upright and shows its label. Lines can run behind the content as well as over it.
This demo, Integrations: A sync tool's integrations, riding three lines through one giant word. One line runs behind the letters, and the glass turns red where a tile crosses one.

1. Install it:
   npx shadcn@latest add @keyframeui/throughline-demo
   (If the CLI can't find @keyframeui, use https://keyframeui.com/r/throughline-demo.json instead.)
   It adds the demo, components/throughline-demo.tsx, and the component, components/ui/throughline.tsx.

2. Make it ours: our copy, data, images and colors. Keep the structure the motion depends on. If we only need the effect, use <Throughline> on its own.

3. These props set its feel. Change them before you change the file:
   - duration (default 26): Seconds a tile takes to ride a line as long as the box is wide. Longer lines take longer, so every tile keeps one pace.
   - brakeDuration (default 0.3): How long a line takes to slow to a stop when one of its tiles is held, in seconds. Longer and the tile glides on past the pointer before it stops.
   - releaseDuration (default 0.6): How long a line takes to get back up to speed once it's let go, in seconds.
   - stations (default true): Draws the small square stations at each end of a line.

4. Don't change, in components/ui/throughline.tsx:
   - Each ride is a Web Animation on the tile's transform, plus one on its glass's opacity, run linearly through `RIDE.samples` poses so tiles keep one pace off the main thread.
   - Braking and releasing step a line's animations by hand through `currentTime`, one rAF per line with speed as u²; a line goes back to running on its own only at full speed.
   - A hold starts from `pointermove` after the hover intent and lets go after the linger, so a sweep across, or a tile drifting under a still pointer, never stops a line.
   - Off screen every line pauses where it is, and a rebuild (a resize, a new `duration`) puts each tile back at the place saved in `fracs`, so nothing jumps to a start.
   - Reduced motion builds no rides: tiles sit full size at their `restingPoints`, and hover, focus and tap still show labels.
   Its timing is all in the TIMING block at the top of that file.

Docs: https://keyframeui.com/components/throughline.md

Installation

Add the component on its own with the CLI, or copy the file in by hand.

The CLI writes components/ui/throughline.tsx and installs clsx and tailwind-merge. It needs the @keyframeui registry in components.json; add it once per project.

npx shadcn@latest add @keyframeui/throughline

Examples

Finished sections built with Throughline. Each one installs whole, with the component included.

Pipeline

An AI inbox in the middle of six lines: raw messages ride in and dive under the card, sorted tickets, replies and leads ride out the other side.

How Sift works

Everything comes in. Only sorted work goes out.
Sift
Live

1,284

messages triaged today, 3.1s each

  • Billing412
  • Product bugs197
  • Sales88
  • Email · “Refund for order 4471?”
  • Chat · “Can I add three seats?”
  • Voicemail · 4 min, Spanish
  • Form · Enterprise demo request
  • Review · 2★, “checkout froze”
  • Slack thread · 14 replies
  • Ticket · Billing, P2
  • Reply drafted · ready to send
  • Lead · sent to Ada in Sales
  • Bug filed · CHK-212, with repro
  • Refund queued · $64.00
  • Alert · outage mentioned twice
Take this demo to your coding agent.
Add this moment from KeyframeUI to our project and adapt it to our content.

Throughline: Glass tiles that ride dotted lines through your headline. Each tile slides out from under a small station, grows as it travels, turns a little on the way, and dives into the far station, and a tile passing over a colored letter picks up its color through the glass. Rest the pointer on one and its whole line comes to a stop, like a cable car line, while the tile turns upright and shows its label. Lines can run behind the content as well as over it.
This demo, Pipeline: An AI inbox in the middle of six lines: raw messages ride in and dive under the card, sorted tickets, replies and leads ride out the other side.

1. Install it:
   npx shadcn@latest add @keyframeui/throughline-pipeline-demo
   (If the CLI can't find @keyframeui, use https://keyframeui.com/r/throughline-pipeline-demo.json instead.)
   It adds the demo, components/throughline-pipeline-demo.tsx, and the component, components/ui/throughline.tsx.

2. Make it ours: our copy, data, images and colors. Keep the structure the motion depends on. If we only need the effect, use <Throughline> on its own.

3. These props set its feel. Change them before you change the file:
   - duration (default 26): Seconds a tile takes to ride a line as long as the box is wide. Longer lines take longer, so every tile keeps one pace.
   - brakeDuration (default 0.3): How long a line takes to slow to a stop when one of its tiles is held, in seconds. Longer and the tile glides on past the pointer before it stops.
   - releaseDuration (default 0.6): How long a line takes to get back up to speed once it's let go, in seconds.
   - stations (default true): Draws the small square stations at each end of a line.

4. Don't change, in components/ui/throughline.tsx:
   - Each ride is a Web Animation on the tile's transform, plus one on its glass's opacity, run linearly through `RIDE.samples` poses so tiles keep one pace off the main thread.
   - Braking and releasing step a line's animations by hand through `currentTime`, one rAF per line with speed as u²; a line goes back to running on its own only at full speed.
   - A hold starts from `pointermove` after the hover intent and lets go after the linger, so a sweep across, or a tile drifting under a still pointer, never stops a line.
   - Off screen every line pauses where it is, and a rebuild (a resize, a new `duration`) puts each tile back at the place saved in `fracs`, so nothing jumps to a start.
   - Reduced motion builds no rides: tiles sit full size at their `restingPoints`, and hover, focus and tap still show labels.
   Its timing is all in the TIMING block at the top of that file.

Docs: https://keyframeui.com/components/throughline.md

Community

Members' faces on two arcs around a critique circle's sign-up, at night. Hold one to see who and where.

Kiln · a critique circle for product designers

Post one shot a week. Get three honest notes back.

2,431 designers in 64 cities. No likes, no followers, just notes by Sunday.

  • Inés Duarte · Porto
  • Rafa Ortiz · Mexico City
  • Mei Lin · Taipei
  • Luca Ferri · Turin
  • Adaeze Obi · Lagos
  • Jonas Berg · Oslo
  • Sofia Marin · Bucharest
  • Tom Hale · Leeds
Take this demo to your coding agent.
Add this moment from KeyframeUI to our project and adapt it to our content.

Throughline: Glass tiles that ride dotted lines through your headline. Each tile slides out from under a small station, grows as it travels, turns a little on the way, and dives into the far station, and a tile passing over a colored letter picks up its color through the glass. Rest the pointer on one and its whole line comes to a stop, like a cable car line, while the tile turns upright and shows its label. Lines can run behind the content as well as over it.
This demo, Community: Members' faces on two arcs around a critique circle's sign-up, at night. Hold one to see who and where.

1. Install it:
   npx shadcn@latest add @keyframeui/throughline-community-demo
   (If the CLI can't find @keyframeui, use https://keyframeui.com/r/throughline-community-demo.json instead.)
   It adds the demo, components/throughline-community-demo.tsx, and the component, components/ui/throughline.tsx.

2. Make it ours: our copy, data, images and colors. Keep the structure the motion depends on. If we only need the effect, use <Throughline> on its own.

3. These props set its feel. Change them before you change the file:
   - duration (default 26): Seconds a tile takes to ride a line as long as the box is wide. Longer lines take longer, so every tile keeps one pace.
   - brakeDuration (default 0.3): How long a line takes to slow to a stop when one of its tiles is held, in seconds. Longer and the tile glides on past the pointer before it stops.
   - releaseDuration (default 0.6): How long a line takes to get back up to speed once it's let go, in seconds.
   - stations (default true): Draws the small square stations at each end of a line.

4. Don't change, in components/ui/throughline.tsx:
   - Each ride is a Web Animation on the tile's transform, plus one on its glass's opacity, run linearly through `RIDE.samples` poses so tiles keep one pace off the main thread.
   - Braking and releasing step a line's animations by hand through `currentTime`, one rAF per line with speed as u²; a line goes back to running on its own only at full speed.
   - A hold starts from `pointermove` after the hover intent and lets go after the linger, so a sweep across, or a tile drifting under a still pointer, never stops a line.
   - Off screen every line pauses where it is, and a rebuild (a resize, a new `duration`) puts each tile back at the place saved in `fracs`, so nothing jumps to a start.
   - Reduced motion builds no rides: tiles sit full size at their `restingPoints`, and hover, focus and tap still show labels.
   Its timing is all in the TIMING block at the top of that file.

Docs: https://keyframeui.com/components/throughline.md

Props

lines Required

TypeThroughlineLine[]

The dotted lines, in % of the box: { from: [x, y], to: [x, y], bend?, behind? }. Tiles ride from from to to. bend bows the line by that share of its length, positive to the right of its direction (down, for a line running left to right). behind runs the line and its tiles under the content.

items Required

TypeThroughlineItem[]

The tiles: { label, icon, line?, href?, className? }. icon is what sits in the tile (an svg, a logo, an avatar) and label is shown under it when it's held and read by screen readers. Items without a line are dealt round the lines in order, and each line spaces its own tiles evenly. href makes a tile a link you can Tab to; className restyles one tile.

duration

TypenumberDefault26

Seconds a tile takes to ride a line as long as the box is wide. Longer lines take longer, so every tile keeps one pace.

paused

TypebooleanDefaultfalse

Brings every line to a stop, and back up to speed when it turns false. Wire it to a pause button for pages that need one.

brakeDuration

TypenumberDefault0.3

How long a line takes to slow to a stop when one of its tiles is held, in seconds. Longer and the tile glides on past the pointer before it stops.

releaseDuration

TypenumberDefault0.6

How long a line takes to get back up to speed once it's let go, in seconds.

stations

TypebooleanDefaulttrue

Draws the small square stations at each end of a line.

children

TypeReact.ReactNode

What the lines thread through: a headline, a card, a whole section. It sets the size of the box the lines are drawn in.

className

Typestring

Extra classes for the box. Its text color draws the lines (at 42%) and the stations, so give the content its own color. Knobs: --throughline-tile (tile size, clamp(2rem, 6.5cqi, 4.5rem)), --throughline-icon (how much of the tile the icon fills, 56%), --throughline-line and --throughline-station.