Link

The one way to render an anchor. Five variants carry the intent of the link, and external hrefs get their rel and target handled for you.

import from ~/components/ui/link

Variants

The token contract lives in the color foundation, and every component reads from it.

inline (default)

Links inside running prose. Always underlined, because the sentence gives no other clue.

action

A link doing the work of a quiet call to action. Medium weight, underline on hover.

Filed under typography

subtle

Metadata links: authors, timestamps, sources. Muted, still underlined, brightens on hover.

nav

Navigation chrome. No underline, because the position already says it is a link.

inverse

For brand and dark surfaces, where the primary ink would disappear.

Internal and external

href decides

An href with a protocol (https:, mailto:, tel:) is treated as external. A new-tab link gets rel="noopener noreferrer" from the component, so a call site never has to remember it.

In context

a footer on brand

Inverse plus a nav row is the standard footer composition.

Twelve endeavorsView all endeavors

a card footer

One action link per card, pushed to the end of the row with a layout class.

Rules

Do

Pick the variant by where the link sits: prose is inline, chrome is nav, brand surfaces are inverse.
Write link text that names its destination and still makes sense read on its own.
Let the component add rel="noopener noreferrer" to target="_blank" links. Do not hand-write it.
Use a Link to go somewhere and a Button to do something. The tag is the semantics.

Don't

Never write "click here", "read more" on its own, or "this link". Out of context they name nothing.
Do not use a raw anchor with color and underline classes. That is the drift this component exists to stop.
Do not open a new tab by default. Reserve target="_blank" for genuinely leaving the task.
Do not put inverse on a light surface, or nav inside body copy where the underline is the only affordance.