Block 8 complete: streaks, notifications, referrals, premium identity, gamification

This commit is contained in:
root
2026-06-15 10:32:10 +02:00
parent 6423430275
commit 5e73d1d7ad
24 changed files with 1565 additions and 38 deletions
+7 -7
View File
@@ -17,6 +17,7 @@ import {
CheckCircle2,
MessageSquare,
} from "lucide-react";
import PremiumBadge from "@/components/PremiumBadge";
/* ── Types ── */
interface ChatMessage {
@@ -319,7 +320,7 @@ function NurChat() {
)}
{messages.map((msg, idx) => (
<MessageBubble key={msg.id || idx} message={msg} />
<MessageBubble key={msg.id || idx} message={msg} isPremium={isPremium} isPro={isPro} />
))}
{isTyping && (
@@ -451,11 +452,9 @@ function PersonaSelector({
{persona.description}
</span>
{!accessible && (
<div className="flex items-center gap-1 bg-amber-900/30 border border-amber-700/30 rounded-full px-2 py-0.5 mt-1">
<div className="flex items-center gap-1 mt-1">
<Lock size={8} className="text-amber-400" />
<span className="text-[8px] font-medium text-amber-400">
Premium
</span>
<PremiumBadge tier="premium" size="sm" />
</div>
)}
{isActive && (
@@ -470,8 +469,9 @@ function PersonaSelector({
}
/* ── Message Bubble ── */
function MessageBubble({ message }: { message: ChatMessage }) {
function MessageBubble({ message, isPremium, isPro }: { message: ChatMessage; isPremium?: boolean; isPro?: boolean }) {
const isUser = message.role === "user";
const premiumGlow = !isUser && (isPremium || isPro) && "shadow-[0_0_12px_rgba(212,175,55,0.15)] border-[#D4AF37]/20";
return (
<div
@@ -488,7 +488,7 @@ function MessageBubble({ message }: { message: ChatMessage }) {
className={`max-w-[85%] rounded-2xl px-4 py-3 text-sm leading-relaxed whitespace-pre-wrap ${
isUser
? "bg-[#D4AF37] text-[#0a0a0f] rounded-tr-sm"
: "bg-[#1a1a24] border border-gray-700/40 text-gray-200 rounded-tl-sm"
: `bg-[#1a1a24] border border-gray-700/40 text-gray-200 rounded-tl-sm ${premiumGlow || ""}`
}`}
>
{message.content}