) : hasData ? (
<>
- {displayedData.map((page) => (
-
onFilter?.({ dimension: 'page', operator: 'is', values: [page.path] })}
- className={`flex items-center justify-between h-9 group hover:bg-neutral-50 dark:hover:bg-neutral-800 rounded-lg px-2 -mx-2 transition-colors${onFilter ? ' cursor-pointer' : ''}`}
- >
-
-
{page.path}
-
e.stopPropagation()}
- className="ml-2 flex-shrink-0"
- >
-
-
+ {displayedData.map((page, idx) => {
+ const maxPv = displayedData[0]?.pageviews ?? 0
+ const barWidth = maxPv > 0 ? (page.pageviews / maxPv) * 100 : 0
+ return (
+
onFilter?.({ dimension: 'page', operator: 'is', values: [page.path] })}
+ className={`relative flex items-center justify-between h-9 group hover:bg-neutral-50/50 dark:hover:bg-neutral-800/50 rounded-lg px-2 -mx-2 transition-colors${onFilter ? ' cursor-pointer' : ''}`}
+ >
+
+
+
+
+ {totalPageviews > 0 ? `${Math.round((page.pageviews / totalPageviews) * 100)}%` : ''}
+
+
+ {formatNumber(page.pageviews)}
+
+
-
-
- {totalPageviews > 0 ? `${Math.round((page.pageviews / totalPageviews) * 100)}%` : ''}
-
-
- {formatNumber(page.pageviews)}
-
-
-
- ))}
+ )
+ })}
{Array.from({ length: emptySlots }).map((_, i) => (
))}
diff --git a/components/dashboard/Locations.tsx b/components/dashboard/Locations.tsx
index ce256bc..0fd83ac 100644
--- a/components/dashboard/Locations.tsx
+++ b/components/dashboard/Locations.tsx
@@ -289,13 +289,19 @@ export default function Locations({ countries, cities, regions, geoDataLevel = '
const dim = TAB_TO_DIMENSION[activeTab]
const filterValue = activeTab === 'countries' ? item.country : activeTab === 'regions' ? item.region : item.city
const canFilter = onFilter && dim && filterValue
+ const maxPv = displayedData[0]?.pageviews ?? 0
+ const barWidth = maxPv > 0 ? (item.pageviews / maxPv) * 100 : 0
return (
canFilter && onFilter({ dimension: dim, operator: 'is', values: [filterValue!] })}
- className={`flex items-center justify-between h-9 group hover:bg-neutral-50 dark:hover:bg-neutral-800 rounded-lg px-2 -mx-2 transition-colors${canFilter ? ' cursor-pointer' : ''}`}
+ className={`relative flex items-center justify-between h-9 group hover:bg-neutral-50/50 dark:hover:bg-neutral-800/50 rounded-lg px-2 -mx-2 transition-colors${canFilter ? ' cursor-pointer' : ''}`}
>
-
+
+
{getFlagComponent(item.country ?? '')}
{activeTab === 'countries' ? getCountryName(item.country ?? '') :
@@ -303,7 +309,7 @@ export default function Locations({ countries, cities, regions, geoDataLevel = '
getCityName(item.city ?? '')}
-
+
{totalPageviews > 0 ? `${Math.round((item.pageviews / totalPageviews) * 100)}%` : ''}
diff --git a/components/dashboard/TechSpecs.tsx b/components/dashboard/TechSpecs.tsx
index c86a059..2fa2b62 100644
--- a/components/dashboard/TechSpecs.tsx
+++ b/components/dashboard/TechSpecs.tsx
@@ -181,17 +181,23 @@ export default function TechSpecs({ browsers, os, devices, screenResolutions, co
{displayedData.map((item) => {
const dim = TAB_TO_DIMENSION[activeTab]
const canFilter = onFilter && dim
+ const maxPv = displayedData[0]?.pageviews ?? 0
+ const barWidth = maxPv > 0 ? (item.pageviews / maxPv) * 100 : 0
return (
canFilter && onFilter({ dimension: dim, operator: 'is', values: [item.name] })}
- className={`flex items-center justify-between h-9 group hover:bg-neutral-50 dark:hover:bg-neutral-800 rounded-lg px-2 -mx-2 transition-colors${canFilter ? ' cursor-pointer' : ''}`}
+ className={`relative flex items-center justify-between h-9 group hover:bg-neutral-50/50 dark:hover:bg-neutral-800/50 rounded-lg px-2 -mx-2 transition-colors${canFilter ? ' cursor-pointer' : ''}`}
>
-
+
+
{item.icon && {item.icon}}
{capitalize(item.name)}
-
+
{totalPageviews > 0 ? `${Math.round((item.pageviews / totalPageviews) * 100)}%` : ''}
diff --git a/components/dashboard/TopReferrers.tsx b/components/dashboard/TopReferrers.tsx
index b415142..434efca 100644
--- a/components/dashboard/TopReferrers.tsx
+++ b/components/dashboard/TopReferrers.tsx
@@ -112,26 +112,34 @@ export default function TopReferrers({ referrers, collectReferrers = true, siteI
) : hasData ? (
<>
- {displayedReferrers.map((ref) => (
-
onFilter?.({ dimension: 'referrer', operator: 'is', values: [ref.referrer] })}
- className={`flex items-center justify-between h-9 group hover:bg-neutral-50 dark:hover:bg-neutral-800 rounded-lg px-2 -mx-2 transition-colors${onFilter ? ' cursor-pointer' : ''}`}
- >
-
- {renderReferrerIcon(ref.referrer)}
-
{getReferrerDisplayName(ref.referrer)}
+ {displayedReferrers.map((ref) => {
+ const maxPv = displayedReferrers[0]?.pageviews ?? 0
+ const barWidth = maxPv > 0 ? (ref.pageviews / maxPv) * 100 : 0
+ return (
+
onFilter?.({ dimension: 'referrer', operator: 'is', values: [ref.referrer] })}
+ className={`relative flex items-center justify-between h-9 group hover:bg-neutral-50/50 dark:hover:bg-neutral-800/50 rounded-lg px-2 -mx-2 transition-colors${onFilter ? ' cursor-pointer' : ''}`}
+ >
+
+
+ {renderReferrerIcon(ref.referrer)}
+ {getReferrerDisplayName(ref.referrer)}
+
+
+
+ {totalPageviews > 0 ? `${Math.round((ref.pageviews / totalPageviews) * 100)}%` : ''}
+
+
+ {formatNumber(ref.pageviews)}
+
+
-
-
- {totalPageviews > 0 ? `${Math.round((ref.pageviews / totalPageviews) * 100)}%` : ''}
-
-
- {formatNumber(ref.pageviews)}
-
-
-
- ))}
+ )
+ })}
{Array.from({ length: emptySlots }).map((_, i) => (
))}