https://framer.com/m/Button-xyMR.js

Io / UI Basics / Button

Button

A button triggers an action or navigates somewhere. Every example below is a live instance of the design system’s Button — appearance, type and radius all resolve from the project theme tokens, so the whole page follows light and dark mode.

Interactive5 appearances3 colours3 sizes5 radii

Examples

Live specimens for every control the component exposes.

Default

The Button ships with a solid appearance at medium size. Only the label is required — everything else is opt-in.

Appearance

Five appearances share one geometry. Solid carries the primary action, Soft and Surface sit on layered panels, Outline needs a visible edge, and Ghost disappears into dense toolbars.

Solid

Soft

Outline

Ghost

Surface

Color

color picks which ramp a button is drawn from — the theme’s primary accent, the neutral secondary, or the semantic warning ramp. It composes with every appearance, so emphasis and hue stay independent.

color · primary

color · secondary

color · warning

Size

Size moves padding, glyph scale and the type step together. Keep one size per surface.

small

medium

large

Radius

Radius is a separate shape token, layered on top of the theme radius scale — from square to fully rounded.

none

small

medium

large

full

Icon placement

Set iconName to any Phosphor glyph in PascalCase. iconPosition puts it before or after the label.

iconPosition left

iconPosition right

on a soft button

Icon only

iconButton drops the label and renders the glyph in a square hit area. Reserve it for actions whose glyph is unambiguous.

search

add

delete

more

Glyph weight

Six Phosphor weights let a glyph match the density of the surface it sits on.

thin

light

regular

bold

fill

duotone

States

loading swaps the label for a spinner and blocks input. disabled drops the button to the disabled token. Hover and pressed come from the token layer, not from props.

default

loading

disabled

Tooltip

Every button can carry a tooltip. The object control holds the copy, the side it opens on, the delay, and an optional glyph — hover any button below to see it.

side top

side bottom

side right

Link button

Give a Button a link and it renders as an anchor instead of a button. newTab is for external destinations, smoothScroll for in-page targets.

internal page

external · new tab

in-page anchor

Alignment and width

align positions content inside a button that is wider than its label. Stretch a button to its container only when it is the single action in a narrow column.

align left

align center

align right

width stretched to the container

Props

The controls exposed on the instance panel, in the order you will reach for them.

PropTypeBehaviour
showChildrenbooleanSwaps the label and icon for your own layer.
textstringThe label. Ignored when iconButton is on.
childrenslotThe layer used as that content. Only shown when Custom Content is on.
iconNamestringPhosphor glyph name in PascalCase, for example ArrowRight. Falls back to Heart when empty.
iconWeightenumthin · light · regular · bold · fill · duotone.
variantenumSolid · Soft · Outline · Ghost · Surface. Sets the visual emphasis of the action.
colorenumprimary, secondary or warning. Picks the theme ramp the appearance is drawn from.
iconButtonbooleanRenders the glyph alone in a square hit area and hides the label.
iconPositionenumleft or right of the label.
alignenumleft · center · right, for a button wider than its label.
sizeenumsmall · medium · large. Moves padding, glyph scale and type step together.
FontSizeenumTheme type step for the label, from H1 down to Tiny.
FontWeightenumlight · regular · medium · semibold · bold for the label.
radiusenumnone · small · medium · large · full, scaled by the theme radius scale.
loadingbooleanShows a spinner in place of the label and blocks interaction.
disabledbooleanBlocks interaction and drops the button to the disabled token.
linklinkRenders the button as an anchor. Pair with newTab or smoothScroll.
openInNewTabbooleanOpens the link in a new tab. Only shown once a link is set.
trackingIDstringAttaches an analytics id to the click.
smoothScrollbooleanScrolls smoothly to an in-page anchor instead of jumping.
tooltipsobjectTooltip copy, side, offset, delay and an optional glyph. Set it from the property panel.
onClickeventEvent fired on tap, for wiring up canvas interactions.
PropTypeBehaviour
showChildrenbooleanSwaps the label and icon for your own layer.
textstringThe label. Ignored when iconButton is on.
childrenslotThe layer used as that content. Only shown when Custom Content is on.
iconNamestringPhosphor glyph name in PascalCase, for example ArrowRight. Falls back to Heart when empty.
iconWeightenumthin · light · regular · bold · fill · duotone.
variantenumSolid · Soft · Outline · Ghost · Surface. Sets the visual emphasis of the action.
colorenumprimary, secondary or warning. Picks the theme ramp the appearance is drawn from.
iconButtonbooleanRenders the glyph alone in a square hit area and hides the label.
iconPositionenumleft or right of the label.
alignenumleft · center · right, for a button wider than its label.
sizeenumsmall · medium · large. Moves padding, glyph scale and type step together.
FontSizeenumTheme type step for the label, from H1 down to Tiny.
FontWeightenumlight · regular · medium · semibold · bold for the label.
radiusenumnone · small · medium · large · full, scaled by the theme radius scale.
loadingbooleanShows a spinner in place of the label and blocks interaction.
disabledbooleanBlocks interaction and drops the button to the disabled token.
linklinkRenders the button as an anchor. Pair with newTab or smoothScroll.
openInNewTabbooleanOpens the link in a new tab. Only shown once a link is set.
trackingIDstringAttaches an analytics id to the click.
smoothScrollbooleanScrolls smoothly to an in-page anchor instead of jumping.
tooltipsobjectTooltip copy, side, offset, delay and an optional glyph. Set it from the property panel.
onClickeventEvent fired on tap, for wiring up canvas interactions.

Usage

Guidance carried over from the component definition.

Reach for Button

The control should read as a button, whether or not it navigates.

A glyph belongs beside the label, or in place of it.

An async action needs a visible loading state.

Clicks need a tracking id for analytics.

Reach for something else

Inline text links inside a paragraph.

Form submission handling — use a form submit button.

Menus and pickers — use DropdownMenuX or SelectX.

Multi-select chips — use TagPicker.

Io — UI Basics

Every specimen above is a live component instance. Colour, type and radius resolve from the project theme tokens.

io

An experiment in what a design system becomes when AI can consume it.

© 2026 io

Contact me

Create a free website with Framer, the website builder loved by startups, designers and agencies.