sdxc

Type to search, or start from one of these:

ColorSwatch

A static preview box rendering one color value as a filled, shaped swatch, backed by a fixed checkerboard so a translucent value always reads correctly against whatever sits behind it on the page rather than blending invisibly away.

brand
100
300
500
700
900
roles
success
warning
danger
overlay
shape and size
View code
<div mix={[vstack({ gap: 5, align: "start" })]}>
	<div mix={[vstack({ gap: 2, align: "start" })]}>
		<span mix={[text("xs"), weight("semibold"), fg("neutral.muted")]}>brand</span>
		<div mix={[hstack({ gap: 2, align: "center" })]}>
			{RAMP.map((stop) => (
				<div key={stop.step} mix={[vstack({ gap: 1, align: "center" })]}>
					<ColorSwatch value={stop.value} shape="rounded" size="lg" />
					<span mix={[font("mono"), text("xs"), fg("neutral")]}>{stop.step}</span>
				</div>
			))}
		</div>
	</div>

	<div mix={[vstack({ gap: 2, align: "start" })]}>
		<span mix={[text("xs"), weight("semibold"), fg("neutral.muted")]}>roles</span>
		<div mix={[hstack({ gap: 4, align: "center" })]}>
			{ROLES.map((role) => (
				<div key={role.name} mix={[hstack({ gap: 2, align: "center" })]}>
					<ColorSwatch value={role.value} shape="circle" size="md" />
					<span mix={[font("mono"), text("xs"), fg("neutral")]}>{role.name}</span>
				</div>
			))}
		</div>
	</div>

	<div mix={[vstack({ gap: 2, align: "start" })]}>
		<span mix={[text("xs"), weight("semibold"), fg("neutral.muted")]}>shape and size</span>
		<div mix={[hstack({ gap: 3, align: "center" })]}>
			<ColorSwatch value="#8b5cf6" shape="square" size="sm" />
			<ColorSwatch value="#8b5cf6" shape="rounded" size="md" />
			<ColorSwatch value="#8b5cf6" shape="circle" size="lg" />
		</div>
	</div>
</div>

Installation

An ordinary dependency: install it, import the theme once, and import the component where it is used.

npm add @sdxc/ui
import "@sdxc/ui/theme.css";

Usage

import { ColorSwatch } from "@sdxc/ui";

Renders a fixed-size <span> that paints value through a local --ui-color-swatch-value custom property, layered over a ::before checkerboard so any transparency in value reads correctly.

Examples

<ColorSwatch value="rgb(16 185 129 / 0.4)" shape="circle" size="lg" />

Props

Read from the component's own types, so every prop, every default and every allowed value is listed.

PropTypeDescription
valuestringThe color to preview, already resolved to a literal CSS value — a hex string, rgb()/hsl()/oklch() function, or named color. Required, since a swatch with nothing to preview has no reason to render.
shape?"circle" | "square" | "rounded"Shape variant. Defaults to DEFAULT_SHAPE.
size?"sm" | "md" | "lg"Size variant. Defaults to DEFAULT_SIZE.

Also accepts everything in TagProps<"span">.

Types

NameValuesWhat it decides
Shape"circle" | "square" | "rounded"Shape variant controlling the swatch's corner rounding: "circle" renders a fully rounded disc, "square" renders sharp corners, and "rounded" renders a softly rounded square.
Size"sm" | "md" | "lg"Size variant controlling the swatch's rendered dimensions.