import React, { useMemo } from 'react'; // --- Data Generation Logic (Keeps the component clean) --- const generateData = () => { const dates = ['20 June', '21 June', '22 June', '23 June', '24 June', '25 June']; return dates.map(date => { // Generate 1 to 10 messages per day (replicating Pug "Math.random() * 10") const msgCount = Math.floor(Math.random() * 10) + 1; const messages = Array.from({ length: msgCount }).map((_, i) => ({ id: `${date}-${i}`, // Random height between 50px and 250px height: Math.floor(Math.random() * 200) + 50 })); return { date, messages }; }); }; const TestMessages = () => { // Memoize data so it doesn't regenerate on re-renders const groups = useMemo(() => generateData(), []); return (
{/* Scroll Animation Styles We use a scoped style block for the advanced 'view()' timeline logic because Tailwind doesn't support this native CSS feature by default yet. */} {/* Viewport Container */}
{groups.map((group) => (
{/* Sticky Date Header */}
{group.date}
{/* Messages Group */}
{group.messages.map((msg) => (
{/* Avatar (Sticky relative to the message group context) */} {/* Size minimized from 60px to 36px (h-9 w-9) */}
{/* Message Bubble */}
))}
))}

Scroll to see focus effect

); }; export default TestMessages;