Circular Text
textPath, so it stays crisp at any size and the words are real text — screen readers get them once, from an sr-only copy, rather than letter by letter around the ring.Video badge
A phrase on the ring and a play button in the middle, both in the theme colour. The ring turns once every 20 seconds and holds still under prefers-reduced-motion.
text- is the phrase on the ring;
separatorgoes between repeats, andrepeatpins how many times it goes round instead of filling by length. children- sit in the middle, centred. Anything goes — a button, a mark, a number.
color- is
var(--primary)by default, so the ring follows your theme preset and the colour picker above with no prop. Pass any CSS colour to pin it.
Installation
New project? Follow the installation guide to set up Tailwind CSS, shadcn, the cn helper and lucide-react, register the @algorize-ui registry once, then copy your styles from the Themes page.
Install Circular Text
components/ is written into your project. Copy any snippet from a Usage tab above and it runs.
Install dependencies
Nothing beyond the shared setup — Circular Text needs only the cn helper and lucide-react, which the installation guide already put in place.
Examples
Stamps
Two marks with their own separators, one with the inner ring — the first puts the theme colour on the ring, the second on the centre dot.
innerRing- draws a hairline circle just inside the text, the way a rubber stamp has an edge.
fontSize- and
trackingsize the ring text in units of a 100-wide circle — near enough percent ofsize— so the same values look the same at any size.
As a link
Wrapped in an anchor, with the centre reacting to hover through a Tailwind group.
- Set
color"currentColor" - and the ring takes the text colour of its parent —
text-primaryon the anchor here — so it follows the theme, a link's hover and dark-mode ink together. direction"counterclockwise"- turns the other way;
speed={0}stops it.
Props Reference
| Prop | Type | Default | Description |
|---|---|---|---|
text | string | Required | The words on the ring. |
separator | string | " · " | Placed between repeats of text. |
repeat | number | fill | How many times the text goes round. Unset, enough repeats to fill the circumference. |
size | number | 128 | Outer size in pixels. |
speed | number | 22 | Seconds per full turn; 0 holds still. |
direction | "clockwise" | "counterclockwise" | "clockwise" | Which way it turns. |
fontSize, tracking | number | 9.5, 0.18 | Ring text size (units of a 100-wide circle) and letter spacing (em). |
color | string | var(--primary) | Ring text colour. "currentColor" follows the parent's text. |
radius | number | 38 | Radius of the text path, out of 50. |
innerRing | boolean | false | A hairline circle just inside the text. |
children | ReactNode | — | What sits in the middle. |