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