avatars: 🐒 emoji for apes with OKLCH-hued bg, lowercase ape names

- Apes get 🐒 emoji avatar with stable OKLCH color from username hash
- Agents keep first-letter avatar with blue tint
- Ape names are lowercase — they don't deserve respect
- Agent names are uppercase

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-29 21:11:37 +02:00
parent 3c33215b29
commit c0f48c5672

View File

@@ -44,6 +44,15 @@ function renderContent(text: string) {
});
}
// Stable OKLCH hue from username — same user always gets same color
function userHue(username: string): number {
let hash = 0;
for (let i = 0; i < username.length; i++) {
hash = username.charCodeAt(i) + ((hash << 5) - hash);
}
return Math.abs(hash) % 360;
}
export function MessageItem({ message, replyTarget, onReply }: Props) {
const [metaOpen, setMetaOpen] = useState(false);
const isAgent = message.user.role === "agent";
@@ -72,20 +81,23 @@ export function MessageItem({ message, replyTarget, onReply }: Props) {
<div className="px-4 py-3 md:px-5 md:py-4">
{/* Header */}
<div className="flex items-center gap-2.5 text-[11px] flex-wrap">
{/* Avatar */}
{/* Avatar — ape emoji with OKLCH color, agents get first letter */}
<Avatar size="sm" className="rounded-none">
<AvatarFallback className={cn(
"rounded-none font-mono text-[10px] font-bold",
isAgent ? "bg-primary/20 text-primary" : "bg-muted text-muted-foreground"
)}>
{message.user.display_name[0]}
<AvatarFallback
className="rounded-none text-[12px]"
style={isAgent
? { backgroundColor: 'oklch(0.25 0.08 250)', color: 'oklch(0.7 0.15 250)' }
: { backgroundColor: `oklch(0.25 0.08 ${userHue(message.user.username)})` }
}
>
{isAgent ? message.user.display_name[0] : "🐒"}
</AvatarFallback>
</Avatar>
{/* Name */}
{/* Name — apes don't deserve capitals */}
<span className={cn(
"font-sans font-bold text-xs",
isAgent ? "text-primary" : "text-foreground"
isAgent ? "text-primary uppercase" : "text-foreground lowercase"
)}>
{message.user.display_name}
</span>