fix: align public dashboard UI with branding guidelines
This commit is contained in:
@@ -5,7 +5,6 @@ import { useParams, useSearchParams, useRouter } from 'next/navigation'
|
|||||||
import { getPublicDashboard, type DashboardData } from '@/lib/api/stats'
|
import { getPublicDashboard, type DashboardData } from '@/lib/api/stats'
|
||||||
import { toast } from 'sonner'
|
import { toast } from 'sonner'
|
||||||
import LoadingOverlay from '@/components/LoadingOverlay'
|
import LoadingOverlay from '@/components/LoadingOverlay'
|
||||||
import StatsCard from '@/components/dashboard/StatsCard'
|
|
||||||
import Chart from '@/components/dashboard/Chart'
|
import Chart from '@/components/dashboard/Chart'
|
||||||
import TopPages from '@/components/dashboard/ContentStats'
|
import TopPages from '@/components/dashboard/ContentStats'
|
||||||
import TopReferrers from '@/components/dashboard/TopReferrers'
|
import TopReferrers from '@/components/dashboard/TopReferrers'
|
||||||
@@ -156,9 +155,12 @@ export default function PublicDashboardPage() {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="min-h-screen bg-neutral-50 dark:bg-black">
|
<div className="min-h-screen bg-neutral-50 dark:bg-black">
|
||||||
<div className="container mx-auto px-4 py-8">
|
<div className="w-full max-w-6xl mx-auto px-4 sm:px-6 py-8">
|
||||||
{/* Header */}
|
{/* Header */}
|
||||||
<div className="flex flex-col md:flex-row md:items-center justify-between gap-4 mb-8">
|
<div className="mb-8">
|
||||||
|
<div className="flex flex-col md:flex-row md:items-center justify-between gap-4">
|
||||||
|
<div>
|
||||||
|
<div className="flex items-center gap-4 mb-2">
|
||||||
<div>
|
<div>
|
||||||
<div className="flex items-center gap-2 mb-1">
|
<div className="flex items-center gap-2 mb-1">
|
||||||
<div className="w-2 h-2 rounded-full bg-brand-orange animate-pulse" />
|
<div className="w-2 h-2 rounded-full bg-brand-orange animate-pulse" />
|
||||||
@@ -177,6 +179,19 @@ export default function PublicDashboardPage() {
|
|||||||
</h1>
|
</h1>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
{/* Realtime Indicator - Desktop */}
|
||||||
|
<div className="hidden md:flex items-center gap-2 px-3 py-1 bg-green-500/10 rounded-full border border-green-500/20 self-end mb-1">
|
||||||
|
<span className="relative flex h-2 w-2">
|
||||||
|
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-500 opacity-75"></span>
|
||||||
|
<span className="relative inline-flex rounded-full h-2 w-2 bg-green-500"></span>
|
||||||
|
</span>
|
||||||
|
<span className="text-sm font-medium text-green-700 dark:text-green-400">
|
||||||
|
{realtime_visitors} current visitors
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div className="flex gap-2">
|
<div className="flex gap-2">
|
||||||
<Select
|
<Select
|
||||||
value={
|
value={
|
||||||
@@ -219,44 +234,24 @@ export default function PublicDashboardPage() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Realtime & Key Stats */}
|
{/* Realtime Indicator - Mobile */}
|
||||||
<div className="grid grid-cols-2 lg:grid-cols-4 gap-4 mb-8">
|
<div className="md:hidden flex items-center gap-2 px-3 py-1 bg-green-500/10 rounded-full border border-green-500/20 w-fit mt-4">
|
||||||
<div className="col-span-2 lg:col-span-4 bg-gradient-to-r from-brand-orange/10 to-transparent border border-brand-orange/20 rounded-xl p-4 flex items-center justify-between">
|
<span className="relative flex h-2 w-2">
|
||||||
<div className="flex items-center gap-3">
|
<span className="animate-ping absolute inline-flex h-full w-full rounded-full bg-green-500 opacity-75"></span>
|
||||||
<div className="relative">
|
<span className="relative inline-flex rounded-full h-2 w-2 bg-green-500"></span>
|
||||||
<div className="w-3 h-3 bg-brand-orange rounded-full animate-ping absolute top-0 left-0 opacity-75"></div>
|
</span>
|
||||||
<div className="w-3 h-3 bg-brand-orange rounded-full relative z-10"></div>
|
<span className="text-sm font-medium text-green-700 dark:text-green-400">
|
||||||
|
{realtime_visitors} current visitors
|
||||||
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<span className="text-brand-orange font-medium">Current Visitors</span>
|
|
||||||
</div>
|
|
||||||
<span className="text-2xl font-bold text-brand-orange">{realtime_visitors}</span>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<StatsCard
|
|
||||||
title="Total Visitors"
|
|
||||||
value={safeStats.visitors.toLocaleString()}
|
|
||||||
/>
|
|
||||||
<StatsCard
|
|
||||||
title="Total Pageviews"
|
|
||||||
value={safeStats.pageviews.toLocaleString()}
|
|
||||||
/>
|
|
||||||
<StatsCard
|
|
||||||
title="Bounce Rate"
|
|
||||||
value={`${Math.round(safeStats.bounce_rate)}%`}
|
|
||||||
/>
|
|
||||||
<StatsCard
|
|
||||||
title="Avg Duration"
|
|
||||||
value={`${Math.round(safeStats.avg_duration)}s`}
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Chart */}
|
{/* Chart */}
|
||||||
<div className="mb-8">
|
<div className="mb-8">
|
||||||
<Chart
|
<Chart
|
||||||
data={safeDailyStats}
|
data={safeDailyStats}
|
||||||
prevData={[]} // No comparison for public view yet
|
prevData={[]}
|
||||||
stats={safeStats}
|
stats={safeStats}
|
||||||
prevStats={{ pageviews: 0, visitors: 0, bounce_rate: 0, avg_duration: 0 }}
|
|
||||||
interval={dateRange.start === dateRange.end ? 'hour' : 'day'}
|
interval={dateRange.start === dateRange.end ? 'hour' : 'day'}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user