Skip to main content

Theme config

Theme mode

Color palette

Grays

Border radii/radiuses/radiopedes/you know
Border radius
Field border radius
Button border radius
All
Components
Guides
API
Recent

Components

Chip

Chips are compact elements that represent an input, attribute, or action.

Full support Supported since v125. Full support Supported since v128. Full support Supported since v18.

Variants

The Chip has two variants: tonal (default) and outlined.

Tonal
Outlined
---
import { Chip } from "@opui/astro"
---
<Chip variant="tonal" label="Tonal" />
<Chip variant="outlined" label="Outlined" />
<div class="chip tonal"><span class="text">Tonal</span></div>
<div class="chip outlined"><span class="text">Outlined</span></div>

Icon

The icon can be placed before or after the text using the start and end slots.

Tonal
Outlined
---
import { Chip } from "@opui/astro"
---
<Chip variant="tonal">
<svg
slot="start"
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
>
<path
fill="currentColor"
d="M16.25 3A3.75 3.75 0 0 1 20 6.75v9a3.75 3.75 0 0 1-2.89 3.651l2.462 1.172a.75.75 0 0 1-.55 1.392l-.095-.038L13.83 19.5h-3.661l-5.097 2.427a.75.75 0 1 1-.645-1.354L6.89 19.4A3.75 3.75 0 0 1 4 15.75v-9A3.75 3.75 0 0 1 7.75 3zM8 15a1 1 0 1 0 0 2a1 1 0 0 0 0-2m8 0a1 1 0 1 0 0 2a1 1 0 0 0 0-2m.25-10.5h-8.5A2.25 2.25 0 0 0 5.5 6.75v5.75h13V6.75a2.25 2.25 0 0 0-2.25-2.25m-3 1.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1 0-1.5z"
></path>
</svg>
<span class="text">Tonal</span>
</Chip>
<Chip variant="outlined">
<span class="text">Outlined</span>
<svg
slot="end"
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
>
<path
fill="currentColor"
d="M16.25 3A3.75 3.75 0 0 1 20 6.75v9a3.75 3.75 0 0 1-2.89 3.651l2.462 1.172a.75.75 0 0 1-.55 1.392l-.095-.038L13.83 19.5h-3.661l-5.097 2.427a.75.75 0 1 1-.645-1.354L6.89 19.4A3.75 3.75 0 0 1 4 15.75v-9A3.75 3.75 0 0 1 7.75 3zM8 15a1 1 0 1 0 0 2a1 1 0 0 0 0-2m8 0a1 1 0 1 0 0 2a1 1 0 0 0 0-2m.25-10.5h-8.5A2.25 2.25 0 0 0 5.5 6.75v5.75h13V6.75a2.25 2.25 0 0 0-2.25-2.25m-3 1.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1 0-1.5z"
></path>
</svg>
</Chip>
<div class="chip tonal">
<svg
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
>
<path
fill="currentColor"
d="M16.25 3A3.75 3.75 0 0 1 20 6.75v9a3.75 3.75 0 0 1-2.89 3.651l2.462 1.172a.75.75 0 0 1-.55 1.392l-.095-.038L13.83 19.5h-3.661l-5.097 2.427a.75.75 0 1 1-.645-1.354L6.89 19.4A3.75 3.75 0 0 1 4 15.75v-9A3.75 3.75 0 0 1 7.75 3zM8 15a1 1 0 1 0 0 2a1 1 0 0 0 0-2m8 0a1 1 0 1 0 0 2a1 1 0 0 0 0-2m.25-10.5h-8.5A2.25 2.25 0 0 0 5.5 6.75v5.75h13V6.75a2.25 2.25 0 0 0-2.25-2.25m-3 1.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1 0-1.5z"
></path>
</svg>
<span class="text">Tonal</span>
</div>
<div class="chip outlined">
<span class="text">Outlined</span>
<svg
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 24 24"
>
<path
fill="currentColor"
d="M16.25 3A3.75 3.75 0 0 1 20 6.75v9a3.75 3.75 0 0 1-2.89 3.651l2.462 1.172a.75.75 0 0 1-.55 1.392l-.095-.038L13.83 19.5h-3.661l-5.097 2.427a.75.75 0 1 1-.645-1.354L6.89 19.4A3.75 3.75 0 0 1 4 15.75v-9A3.75 3.75 0 0 1 7.75 3zM8 15a1 1 0 1 0 0 2a1 1 0 0 0 0-2m8 0a1 1 0 1 0 0 2a1 1 0 0 0 0-2m.25-10.5h-8.5A2.25 2.25 0 0 0 5.5 6.75v5.75h13V6.75a2.25 2.25 0 0 0-2.25-2.25m-3 1.5a.75.75 0 0 1 0 1.5h-2.5a.75.75 0 0 1 0-1.5z"
></path>
</svg>
</div>

Button

---
import { Chip } from "@opui/astro"
---
<div class="example-row">
<Chip as="button" variant="tonal" label="Tonal button" />
<Chip as="button" variant="outlined" label="Outlined button" />
</div>
<div class="example-row">
<Chip as="button" variant="tonal">
<svg
slot="start"
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 32 32"
>
<path
fill="currentColor"
d="M29.907 5.14a1.25 1.25 0 0 1-.047 1.767l-19 18a1.25 1.25 0 0 1-1.775-.055l-6.75-7.25a1.25 1.25 0 0 1 1.83-1.704l5.89 6.327L28.14 5.093a1.25 1.25 0 0 1 1.767.047"
></path>
</svg>
<span class="text">Open now</span>
</Chip>
<Chip as="button" variant="outlined">
<span class="text">Sort by</span>
<svg
slot="end"
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 32 32"
>
<path
fill="currentColor"
d="M5.366 11.116a1.25 1.25 0 0 1 1.768 0L16 19.982l8.866-8.866a1.25 1.25 0 0 1 1.768 1.768l-9.75 9.75a1.25 1.25 0 0 1-1.768 0l-9.75-9.75a1.25 1.25 0 0 1 0-1.768"
></path>
</svg>
</Chip>
</div>
<div class="example-row">
<button class="chip tonal"><span class="text">Tonal button</span></button
><button class="chip outlined">
<span class="text">Outlined button</span>
</button>
</div>
<div class="example-row">
<button class="chip tonal">
<svg
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 32 32"
>
<path
fill="currentColor"
d="M29.907 5.14a1.25 1.25 0 0 1-.047 1.767l-19 18a1.25 1.25 0 0 1-1.775-.055l-6.75-7.25a1.25 1.25 0 0 1 1.83-1.704l5.89 6.327L28.14 5.093a1.25 1.25 0 0 1 1.767.047"
></path>
</svg>
<span class="text">Open now</span></button
><button class="chip outlined">
<span class="text">Sort by</span>
<svg
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 32 32"
>
<path
fill="currentColor"
d="M5.366 11.116a1.25 1.25 0 0 1 1.768 0L16 19.982l8.866-8.866a1.25 1.25 0 0 1 1.768 1.768l-9.75 9.75a1.25 1.25 0 0 1-1.768 0l-9.75-9.75a1.25 1.25 0 0 1 0-1.768"
></path>
</svg>
</button>
</div>
---
import { Chip } from "@opui/astro"
---
<Chip as="a" href="#" variant="tonal" label="Tonal link" />
<Chip as="a" href="#" variant="outlined">
<span class="text">Outlined link</span>
<svg
slot="end"
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 32 32"
>
<path
fill="currentColor"
d="M7.75 5.5A2.25 2.25 0 0 0 5.5 7.75v16.5a2.25 2.25 0 0 0 2.25 2.25h16.5a2.25 2.25 0 0 0 2.25-2.25v-5a1.25 1.25 0 1 1 2.5 0v5A4.75 4.75 0 0 1 24.25 29H7.75A4.75 4.75 0 0 1 3 24.25V7.75A4.75 4.75 0 0 1 7.75 3h5a1.25 1.25 0 1 1 0 2.5zM18 4.25c0-.69.56-1.25 1.25-1.25h8.5c.69 0 1.25.56 1.25 1.25v8.5a1.25 1.25 0 1 1-2.5 0V7.268l-6.366 6.366a1.25 1.25 0 1 1-1.768-1.768L24.732 5.5H19.25c-.69 0-1.25-.56-1.25-1.25"
></path>
</svg>
</Chip>
<a href="#" class="chip tonal"><span class="text">Tonal link</span></a
><a href="#" class="chip outlined">
<span class="text">Outlined link</span>
<svg
xmlns="http://www.w3.org/2000/svg"
width="32"
height="32"
viewBox="0 0 32 32"
>
<path
fill="currentColor"
d="M7.75 5.5A2.25 2.25 0 0 0 5.5 7.75v16.5a2.25 2.25 0 0 0 2.25 2.25h16.5a2.25 2.25 0 0 0 2.25-2.25v-5a1.25 1.25 0 1 1 2.5 0v5A4.75 4.75 0 0 1 24.25 29H7.75A4.75 4.75 0 0 1 3 24.25V7.75A4.75 4.75 0 0 1 7.75 3h5a1.25 1.25 0 1 1 0 2.5zM18 4.25c0-.69.56-1.25 1.25-1.25h8.5c.69 0 1.25.56 1.25 1.25v8.5a1.25 1.25 0 1 1-2.5 0V7.268l-6.366 6.366a1.25 1.25 0 1 1-1.768-1.768L24.732 5.5H19.25c-.69 0-1.25-.56-1.25-1.25"
></path></svg
></a>

Sizes

Small
Default
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sodales.
---
import { Chip } from "@opui/astro"
---
<Chip size="small" label="Small" />
<Chip label="Default" />
<Chip
multiline
style="max-width: 30ch;"
label="Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus sodales."
/>
<div class="chip small tonal"><span class="text">Small</span></div>
<div class="chip tonal"><span class="text">Default</span></div>
<div style="max-width: 30ch" class="chip multiline tonal">
<span class="text"
>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vivamus
sodales.</span
>
</div>

Anatomy

1. Container: <Chip> (renders as div, a or button)
2. Text: label prop or default slot
3. Icon (optional): <svg> element in the start or end slot

Chip example

API

Prop Type Default Description
as "div" | "a" | "button" "div" (or "a" if href present) The underlying HTML element.
label string - The text label to display.
multiline boolean false Allows multiline text.
size "small" - The size of the chip.
variant "tonal" | "outlined" "tonal" The visual variant.

Browser support

Full support Supported since v125. Full support Supported since v128. Full support Supported since v18.

See also the full browser support guide.

Installation

@layer components.root {
:where(.chip) {
--_bg-color: var(--surface-tonal);
--_border-color: var(--border-color);
--_color: var(--text-primary);
align-items: center;
background: var(--_bg-color) var(--ripple, none);
block-size: var(--size-7, 2rem);
border-radius: var(--radius-2, 0.5rem);
border: 1px solid var(--_border-color);
color: var(--_color);
display: inline-flex;
font-size: var(--font-size-0, 0.75rem);
gap: var(--size-1);
padding-inline: var(--size-2);
text-decoration: none;
/* Variants */
&.tonal {
--_bg-color: var(--surface-tonal);
--_color: var(--text-primary);
}
&.outlined {
--_bg-color: var(--surface-default);
--_color: var(--text-primary);
}
&:where(button, a):where(:not([disabled])) {
&:where(:not(:active)):hover {
--_bg-color: light-dark(oklch(from var(--surface-tonal) calc(l * 0.98) c h),
oklch(from var(--surface-tonal) calc(l * 1.1) c h));
}
}
/* Icon */
&:has(svg:first-child) {
padding-inline: var(--size-1) var(--size-2);
}
&:has(svg:last-child) {
padding-inline: var(--size-2) var(--size-1);
}
&:has(svg) {
svg {
flex-shrink: 0;
inline-size: var(--size-3);
}
}
/* Sizes */
&.small {
block-size: var(--size-5);
}
&.multiline {
block-size: auto;
}
/* Ripple effect */
background-position: center;
&:where(:not([disabled])) {
&:where(:not(:active):hover) {
--ripple: radial-gradient(circle, transparent 1%, var(--_bg-color) 1%) center/15000%;
transition: background var(--button-ripple-duration);
}
&:where(:hover:active) {
background-size: var(--button-ripple-size);
transition: background 0s;
}
}
/* Disabled */
&:where([disabled]) {
opacity: 0.64;
--_color: color-mix(in oklch,
var(--text-muted) 50%,
var(--surface-default));
cursor: not-allowed;
}
}
}