← All proposals

Badge

A copy of the PDS v2 Badge (pds-badge, same class names, props and CSS) with one addition: color='agentic-filled', the AI gradient as the fill, for denoting an agentic category.

Extends a PDS componentOpen in Storybook

proposals/Badge/badge.css238 lines · View on GitHub
.pds-badge {
	--badge-bg: var(--pds-color-badge-brand-muted-background);
	--badge-fg: var(--pds-color-badge-brand-muted-foreground);
	/* Default size, equivalent to .pds-badge--s — a fallback for markup built
	   without the React component (e.g. static HTML) that omits a size class. */
	--badge-font-size: var(--pds-typography-size-xs);
	--badge-height: var(--pds-spacing-xl);
	--badge-icon-gap: var(--pds-spacing-3xs);
	--badge-padding-inline: var(--pds-spacing-2xs);

	align-items: center;
	background-color: var(--badge-bg);
	border-radius: var(--pds-border-radius-default);
	color: var(--badge-fg);
	display: inline-flex;
	flex-shrink: 0;
	font-size: var(--badge-font-size);
	font-weight: var(--pds-typography-fw-medium);
	/* Only takes effect when there's an icon alongside the label */
	gap: var(--badge-icon-gap);
	height: var(--badge-height);
	inline-size: fit-content;
	line-height: 1;
	padding-inline: var(--badge-padding-inline);
	white-space: nowrap;
}

.pds-badge__icon {
	flex-shrink: 0;
}

/* Sizes */
.pds-badge--xs {
	--badge-font-size: var(--pds-typography-size-2xs);
	--badge-height: var(--pds-spacing-l);
	--badge-padding-inline: var(--pds-spacing-3xs);
}

.pds-badge--s {
	--badge-font-size: var(--pds-typography-size-xs);
	--badge-height: var(--pds-spacing-xl);
	--badge-padding-inline: var(--pds-spacing-2xs);
}

.pds-badge--m {
	--badge-font-size: var(--pds-typography-size-s);
	--badge-height: 1.875rem;
	--badge-icon-gap: var(--pds-spacing-2xs);
	--badge-padding-inline: var(--pds-spacing-s);
}

/* Color variants — solid */
.pds-badge--brand {
	--badge-bg: var(--pds-color-badge-brand-background);
	--badge-fg: var(--pds-color-badge-brand-foreground);
}

.pds-badge--critical {
	--badge-bg: var(--pds-color-badge-critical-background);
	--badge-fg: var(--pds-color-badge-critical-foreground);
}

.pds-badge--discovery {
	--badge-bg: var(--pds-color-badge-discovery-background);
	--badge-fg: var(--pds-color-badge-discovery-foreground);
}

.pds-badge--gold {
	--badge-bg: var(--pds-color-badge-gold-background);
	--badge-fg: var(--pds-color-badge-gold-foreground);
}

.pds-badge--indigo {
	--badge-bg: var(--pds-color-badge-indigo-background);
	--badge-fg: var(--pds-color-badge-indigo-foreground);
}

.pds-badge--info {
	--badge-bg: var(--pds-color-badge-info-background);
	--badge-fg: var(--pds-color-badge-info-foreground);
}

.pds-badge--ink {
	--badge-bg: var(--pds-color-badge-ink-background);
	--badge-fg: var(--pds-color-badge-ink-foreground);
}

.pds-badge--lime {
	--badge-bg: var(--pds-color-badge-lime-background);
	--badge-fg: var(--pds-color-badge-lime-foreground);
}

.pds-badge--orange {
	--badge-bg: var(--pds-color-badge-orange-background);
	--badge-fg: var(--pds-color-badge-orange-foreground);
}

.pds-badge--rose {
	--badge-bg: var(--pds-color-badge-rose-background);
	--badge-fg: var(--pds-color-badge-rose-foreground);
}

.pds-badge--silver {
	--badge-bg: var(--pds-color-badge-silver-background);
	--badge-fg: var(--pds-color-badge-silver-foreground);
}

.pds-badge--sky {
	--badge-bg: var(--pds-color-badge-sky-background);
	--badge-fg: var(--pds-color-badge-sky-foreground);
}

.pds-badge--slate {
	--badge-bg: var(--pds-color-badge-slate-background);
	--badge-fg: var(--pds-color-badge-slate-foreground);
}

.pds-badge--stone {
	--badge-bg: var(--pds-color-badge-stone-background);
	--badge-fg: var(--pds-color-badge-stone-foreground);
}

.pds-badge--success {
	--badge-bg: var(--pds-color-badge-success-background);
	--badge-fg: var(--pds-color-badge-success-foreground);
}

.pds-badge--warning {
	--badge-bg: var(--pds-color-badge-warning-background);
	--badge-fg: var(--pds-color-badge-warning-foreground);
}

/* Color variants — muted */

.pds-badge--brand-muted {
	--badge-bg: var(--pds-color-badge-brand-muted-background);
	--badge-fg: var(--pds-color-badge-brand-muted-foreground);
}

.pds-badge--critical-muted {
	--badge-bg: var(--pds-color-badge-critical-muted-background);
	--badge-fg: var(--pds-color-badge-critical-muted-foreground);
}

.pds-badge--discovery-muted {
	--badge-bg: var(--pds-color-badge-discovery-muted-background);
	--badge-fg: var(--pds-color-badge-discovery-muted-foreground);
}

.pds-badge--gold-muted {
	--badge-bg: var(--pds-color-badge-gold-muted-background);
	--badge-fg: var(--pds-color-badge-gold-muted-foreground);
}

.pds-badge--indigo-muted {
	--badge-bg: var(--pds-color-badge-indigo-muted-background);
	--badge-fg: var(--pds-color-badge-indigo-muted-foreground);
}

.pds-badge--info-muted {
	--badge-bg: var(--pds-color-badge-info-muted-background);
	--badge-fg: var(--pds-color-badge-info-muted-foreground);
}

.pds-badge--ink-muted {
	--badge-bg: var(--pds-color-badge-ink-muted-background);
	--badge-fg: var(--pds-color-badge-ink-muted-foreground);
}

.pds-badge--lime-muted {
	--badge-bg: var(--pds-color-badge-lime-muted-background);
	--badge-fg: var(--pds-color-badge-lime-muted-foreground);
}

.pds-badge--orange-muted {
	--badge-bg: var(--pds-color-badge-orange-muted-background);
	--badge-fg: var(--pds-color-badge-orange-muted-foreground);
}

.pds-badge--rose-muted {
	--badge-bg: var(--pds-color-badge-rose-muted-background);
	--badge-fg: var(--pds-color-badge-rose-muted-foreground);
}

.pds-badge--silver-muted {
	--badge-bg: var(--pds-color-badge-silver-muted-background);
	--badge-fg: var(--pds-color-badge-silver-muted-foreground);
}

.pds-badge--sky-muted {
	--badge-bg: var(--pds-color-badge-sky-muted-background);
	--badge-fg: var(--pds-color-badge-sky-muted-foreground);
}

.pds-badge--slate-muted {
	--badge-bg: var(--pds-color-badge-slate-muted-background);
	--badge-fg: var(--pds-color-badge-slate-muted-foreground);
}

.pds-badge--stone-muted {
	--badge-bg: var(--pds-color-badge-stone-muted-background);
	--badge-fg: var(--pds-color-badge-stone-muted-foreground);
}

.pds-badge--success-muted {
	--badge-bg: var(--pds-color-badge-success-muted-background);
	--badge-fg: var(--pds-color-badge-success-muted-foreground);
}

.pds-badge--warning-muted {
	--badge-bg: var(--pds-color-badge-warning-muted-background);
	--badge-fg: var(--pds-color-badge-warning-muted-foreground);
}

/* Animated gradient fill signaling AI activity. See core.css for the
   shared temporary tokens. */
.pds-badge--ai-active {
	--badge-fg: #fff;

	background: var(--pds-gradient-ai-active-badge);
	background-size: 300% 300%;
}

@media (prefers-reduced-motion: no-preference) {
	.pds-badge--ai-active {
		animation: pds-ai-gradient-shift
			var(--pds-animation-duration-ai-active-badge) linear infinite;
	}
}

/* Agentic filled: the AI gradient as the fill. The text takes the reverse
   foreground (white in light mode, dark in dark mode). */
.pds-badge--agentic-filled {
	--badge-fg: var(--pds-color-foreground-reverse);

	background: var(--pds-gradient-ai-active);
}