LicenseBadge
ui licensebadge
Plan-Badge (Gratis/Pro) im Profil-Trigger. `plan` wird injiziert statt aus einem Store gelesen. Steht links schon ein Name, unterdrückt „Pro" das Badge, um die Dopplung zu vermeiden. Der Tooltip ist überschreibbar — der Default nennt den Beamer-Wasserzeichen-Kontext, der nicht in jeder App gilt.
Keine interaktive Live-Demo — siehe Code & Beispiele unten.
Abhängigkeiten
Barrierefreiheit
- Der Zustand steht als Text im Badge, nicht nur in der Farbe.
Beispiele
Im Konto-Trigger
<LicenseBadge plan={plan} hasName={Boolean(name)} /> Genutzte Tokens · 2
--font-mono--muted
Quelldateien
components/ui/LicenseBadge.tsx tsx
import styles from './LicenseBadge.module.css';
/**
* Stufen-Badge im Profil-Trigger. `plan` wird injiziert statt aus einem Store
* gelesen (Softkey-Vertrag).
*
* Zwei Stufen, mehr gibt es nicht (ADR-37): Basis ist voll benutzbar und
* zeichnet die Ausgabe, Pro entfernt das Wasserzeichen. Ein Gerät ohne
* Schlüssel zeigt deshalb ebenfalls „Basis" — es kann dasselbe. Damit ein
* gesperrter Schlüssel trotzdem nicht wie ein normales Konto aussieht, nimmt
* das Badge einen `grund` entgegen (aus `basisGrund()`) und stellt ihn daneben.
*/
export interface LicenseBadgeProps {
/** Deckungsgleich mit `LicensePlan` aus @repo/licensing — als Literal
* wiederholt, damit das Primitiv-Paket domänenfrei bleibt. */
plan: 'basis' | 'pro';
/** Steht links schon ein Name? Dann unterdrückt „Pro" das Badge (Dopplung). */
hasName?: boolean;
/** Kurzer Grund, warum nur Basis — `null`/weggelassen = unauffällig. */
grund?: string | null;
/** Tooltip-Override (Default: Text je Stufe). */
title?: string;
}
const BASIS_TITLE =
'Basis-Version – voller Funktionsumfang, die Ausgabe trägt ein Wasserzeichen. Pro entfernt es.';
const PRO_TITLE = 'Pro-Version – aktiv, kein Wasserzeichen.';
export function LicenseBadge({ plan, hasName = false, grund = null, title }: LicenseBadgeProps) {
if (plan === 'pro') {
if (hasName) return null;
return (
<span className={styles.badge} title={title ?? PRO_TITLE}>
Pro
</span>
);
}
return (
<span
className={styles.badge}
title={title ?? (grund ? `${BASIS_TITLE} Aktuell: ${grund}.` : BASIS_TITLE)}
>
Basis{grund ? ` · ${grund}` : ''}
</span>
);
}
components/ui/LicenseBadge.module.css css
/* Rahmenloses Label im Profil-Trigger (der Button liefert schon die Pillen-
Kontur). Liest sich als kleine Status-Caption neben dem Avatar. */
.badge {
font-family: var(--font-mono);
font-size: 10px;
letter-spacing: 0.06em;
text-transform: uppercase;
color: var(--muted);
white-space: nowrap;
flex: 0 0 auto;
}
Holen
# MCP (Claude Code / Cursor)
get_component({ name: "license-badge" })
# Registry direkt
https://www.ekklesi.tools/design/registry/components/license-badge.json