LinkArrow

Inline arrow for links

stable v1.1.0

Preview

Manifesto

signal.3lastic.com

Props

PropTypeDefaultMeaning
externalbooleanfalsefalse = right arrow (internal). true = up-right arrow (external).

Why it exists

The Unicode characters → (U+2192) and ↗ (U+2197) render as color emoji on macOS and iOS: they ignore currentColor, break the typographic tone and shift the baseline. LinkArrow replaces them with an SVG using stroke="currentColor", which matches the color and weight of the text on any platform. That is its whole reason to exist: if it goes back to Unicode, the bug comes back.

Tokens

PropertyValueNote
SizeFixed 12×12pxA UI glyph, not typography: outside the scale
ColorcurrentColorInherits the text color; never hardcoded
Stroke1.2px, roundMatches the visual weight of the body
Margin-left0.2emScales with the font size

Constraints

  • A single prop: external. No size or state variants.
  • Color always currentColor.
  • Decorative: aria-hidden, focusable="false".
  • Fixed at 12px, deliberately outside the Major Third scale.
  • Never Unicode in markup or in CSS content: Safari paints it as emoji.

Prose

External links in Markdown can't use the component. In prose.css, .prose a[target="_blank"]::after duplicates the external arrow with an SVG mask. If you change the external path here, update the mask in prose.css too.

Decisions

DecisionWhy
SVG instead of UnicodeU+2192 and U+2197 are color emoji on macOS/iOS and ignore currentColor
external propDirection is semantic (internal vs external destination), not arbitrary decoration
Default = internal (→)Most links are internal; external is marked explicitly
currentColor, never a fixed fillIt must always match the text it accompanies, in light and dark
Fixed 12px, outside the scaleA UI glyph sized to the body, not a typographic step
Prose uses a CSS maskSame Safari bug; the mask replicates the component's external path