// components/ui/Skeleton.tsx 'use client'; import * as React from 'react'; function classNames(...classes: Array) { return classes.filter(Boolean).join(' '); } type SkeletonProps = { /** Zusätzliche Klassen für den Wrapper */ className?: string; /** Beschriftung für Screenreader – z.B. "Benutzer" */ primaryLabel?: string; /** Zweite Zeile für Screenreader – z.B. "Profildaten werden geladen" */ secondaryLabel?: string; }; /** * Hilfsfunktion: wähle eine Tailwind-Breite basierend auf der Textlänge. * Wenn kein Text -> keine Breitenklasse (keine Simulation). */ function getWidthClass(label?: string) { const len = (label ?? '').length; if (len === 0) return ''; // keine Breite, wenn kein Text if (len <= 6) return 'w-16'; // kurz if (len <= 12) return 'w-24'; // mittel if (len <= 20) return 'w-32'; // länger return 'w-40'; // sehr lang } /** * Skeleton-Placeholder für das User-Menü (Avatar + Text). * Es werden nur Balken gerendert, wenn auch Labels übergeben wurden. */ export function Skeleton({ className, primaryLabel, secondaryLabel, }: SkeletonProps) { const primaryWidthClass = getWidthClass(primaryLabel); const secondaryWidthClass = getWidthClass(secondaryLabel); const srText = [primaryLabel, secondaryLabel].filter(Boolean).join(' – '); return (
{/* Nur für Screenreader, wenn überhaupt Text vorhanden */} {srText && {srText}}
{/* erste Zeile – nur wenn primaryLabel gesetzt ist */} {primaryLabel && (
)}
); }