# Polymorphism Many Vesper components are **polymorphic**: they accept an `as` prop that changes the element they render, while keeping their own styles and behavior. For example, you can render `TextButton` as a link instead of the button element it normally renders as: ```tsx demo import { ArrowRight } from "@tenstorrent/vesper/icons"; import { TextButton } from "@tenstorrent/vesper/text-button"; export default function TextButtonLink() { return ( }> Read the mental model ); } ``` This page describes how polymorphic components work, how to compose them with each other, and which pitfalls to avoid. ## The mental model Every polymorphic component is made of three parts: | Part | Description | | --- | --- | | Its own props | The props a component owns. For example, the `variant`, `size`, and `iconRight` props of a `TextButton`. | | The rendered element | Which element to render, driven by the `as` prop. For example, a `TextButton` renders a ` // ✅ renders a single