From ec96fa8a0dc1bc7b0810577e88b0abb02c8d3160 Mon Sep 17 00:00:00 2001 From: Usman Baig Date: Fri, 6 Mar 2026 22:25:15 +0100 Subject: [PATCH] feat: add hover percentage indicator on dashboard panel rows Shows percentage of total pageviews on hover with a slide-in animation from right to left across all panels (Content, Locations, Technology, Top Referrers). --- components/dashboard/ContentStats.tsx | 10 ++++++++-- components/dashboard/Locations.tsx | 10 ++++++++-- components/dashboard/TechSpecs.tsx | 10 ++++++++-- components/dashboard/TopReferrers.tsx | 10 ++++++++-- 4 files changed, 32 insertions(+), 8 deletions(-) diff --git a/components/dashboard/ContentStats.tsx b/components/dashboard/ContentStats.tsx index ad159bf..cb84514 100644 --- a/components/dashboard/ContentStats.tsx +++ b/components/dashboard/ContentStats.tsx @@ -78,6 +78,7 @@ export default function ContentStats({ topPages, entryPages, exitPages, domain, } const data = getData() + const totalPageviews = data.reduce((sum, p) => sum + p.pageviews, 0) const hasData = data && data.length > 0 const displayedData = hasData ? data.slice(0, LIMIT) : [] const emptySlots = Math.max(0, LIMIT - displayedData.length) @@ -152,8 +153,13 @@ export default function ContentStats({ topPages, entryPages, exitPages, domain, -
- {formatNumber(page.pageviews)} +
+ + {totalPageviews > 0 ? `${Math.round((page.pageviews / totalPageviews) * 100)}%` : ''} + + + {formatNumber(page.pageviews)} +
))} diff --git a/components/dashboard/Locations.tsx b/components/dashboard/Locations.tsx index f6c24df..5a7e27b 100644 --- a/components/dashboard/Locations.tsx +++ b/components/dashboard/Locations.tsx @@ -176,6 +176,7 @@ export default function Locations({ countries, cities, regions, geoDataLevel = ' const rawData = activeTab === 'map' ? [] : getData() const data = filterUnknown(rawData) + const totalPageviews = data.reduce((sum, item) => sum + item.pageviews, 0) const hasData = activeTab === 'map' ? (countries && filterUnknown(countries).length > 0) : (data && data.length > 0) @@ -269,8 +270,13 @@ export default function Locations({ countries, cities, regions, geoDataLevel = ' getCityName(item.city ?? '')} -
- {formatNumber(item.pageviews)} +
+ + {totalPageviews > 0 ? `${Math.round((item.pageviews / totalPageviews) * 100)}%` : ''} + + + {formatNumber(item.pageviews)} +
) diff --git a/components/dashboard/TechSpecs.tsx b/components/dashboard/TechSpecs.tsx index 4664aa1..5f9240e 100644 --- a/components/dashboard/TechSpecs.tsx +++ b/components/dashboard/TechSpecs.tsx @@ -112,6 +112,7 @@ export default function TechSpecs({ browsers, os, devices, screenResolutions, co const rawData = getRawData() const data = filterUnknown(rawData) + const totalPageviews = data.reduce((sum, item) => sum + item.pageviews, 0) const hasData = data && data.length > 0 const displayedData = hasData ? data.slice(0, LIMIT) : [] const emptySlots = Math.max(0, LIMIT - displayedData.length) @@ -173,8 +174,13 @@ export default function TechSpecs({ browsers, os, devices, screenResolutions, co {item.icon && {item.icon}} {item.name} -
- {formatNumber(item.pageviews)} +
+ + {totalPageviews > 0 ? `${Math.round((item.pageviews / totalPageviews) * 100)}%` : ''} + + + {formatNumber(item.pageviews)} +
) diff --git a/components/dashboard/TopReferrers.tsx b/components/dashboard/TopReferrers.tsx index e6a38be..fed4cd6 100644 --- a/components/dashboard/TopReferrers.tsx +++ b/components/dashboard/TopReferrers.tsx @@ -33,6 +33,7 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI const mergedReferrers = mergeReferrersByDisplayName(filteredReferrers) + const totalPageviews = mergedReferrers.reduce((sum, r) => sum + r.pageviews, 0) const hasData = mergedReferrers.length > 0 const displayedReferrers = hasData ? mergedReferrers.slice(0, LIMIT) : [] const emptySlots = Math.max(0, LIMIT - displayedReferrers.length) @@ -114,8 +115,13 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI {renderReferrerIcon(ref.referrer)} {getReferrerDisplayName(ref.referrer)} -
- {formatNumber(ref.pageviews)} +
+ + {totalPageviews > 0 ? `${Math.round((ref.pageviews / totalPageviews) * 100)}%` : ''} + + + {formatNumber(ref.pageviews)} +
))}