)
}
export function CopyButton({ text }: { text: string }) {
const [copied, setCopied] = useState(false)
return (
)
}
export function Busy() {
return
}
/** One entry in a settings list: leading mark, stacked text, trailing actions. */
export function SettingRow({
lead,
title,
meta,
actions,
}: {
lead?: ReactNode
title: ReactNode
meta?: ReactNode
actions?: ReactNode
}) {
return (
{lead}
{title}
{meta ?
{meta}
: null}
{actions ?
{actions}
: null}
)
}
export function EmptyNote({ children }: { children: ReactNode }) {
return
{children}
}
/** Circular initials mark; used wherever a member or role needs a glyph. */
export function InitialAvatar({ name, url, size = 30 }: { name: string; url?: string | null; size?: number }) {
if (url) {
return (
)
}
return (
{(name.trim()[0] ?? '?').toUpperCase()}
)
}
/** A short run of inline chips (roles, permissions, states). */
export function Chip({ children }: { children: ReactNode }) {
return (
{children}
)
}