+ {/* Header - Fixed */}
+
+
{assetName} - Yearly Performance
+
-
-
-
-
-
- `${value.toFixed(2)}%`}
- />
- `€${value.toFixed(2)}`}
- />
- {
- if (name === 'Performance') return [`${value.toFixed(2)}%`, name];
- return [`€${value.toFixed(2)}`, name];
- }}
- labelFormatter={(year) => `Year ${year}`}
- />
- }
- strokeWidth={2}
- yAxisId="left"
- />
-
-
-
-
-
-
-
-
-
-
-
- {sortedPerformances.map(({ year, percentage, price }) => (
-
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30'
- }`}
- >
-
{year}
-
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'
- }`}>
- {percentage.toFixed(2)}%
-
- {price && (
-
- €{price.toFixed(2)}
+
+ {/* Content - Scrollable */}
+
+ {/* Chart */}
+
+
+
+
+
+ `${value.toFixed(2)}%`}
+ />
+ `€${value.toFixed(2)}`}
+ />
+ {
+ if (name === 'Performance') return [`${value.toFixed(2)}%`, name];
+ return [`€${value.toFixed(2)}`, name];
+ }}
+ labelFormatter={(year) => `Year ${year}`}
+ />
+ }
+ strokeWidth={2}
+ yAxisId="left"
+ />
+
+
+
+
+
+
+
+
+
+
+
+ {/* Performance Cards */}
+
+ {sortedPerformances.map(({ year, percentage, price }) => (
+
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30'
+ }`}
+ >
+
{year}
+
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'
+ }`}>
+ {percentage.toFixed(2)}%
- )}
-
- ))}
+ {price && (
+
+ €{price.toFixed(2)}
+
+ )}
+
+ ))}
+
diff --git a/src/components/Chart/PortfolioPerformanceModal.tsx b/src/components/Chart/PortfolioPerformanceModal.tsx
index f696da1..1cabfeb 100644
--- a/src/components/Chart/PortfolioPerformanceModal.tsx
+++ b/src/components/Chart/PortfolioPerformanceModal.tsx
@@ -1,5 +1,5 @@
import { X } from "lucide-react";
-import { memo } from "react";
+import { memo, useEffect } from "react";
import {
CartesianGrid, Line, LineChart, ResponsiveContainer, Tooltip, XAxis, YAxis
} from "recharts";
@@ -11,6 +11,15 @@ interface PortfolioPerformanceModalProps {
export const PortfolioPerformanceModal = memo(({ performances, onClose }: PortfolioPerformanceModalProps) => {
const sortedPerformances = [...performances].sort((a, b) => a.year - b.year);
+
+ // Prevent body scroll when modal is open
+ useEffect(() => {
+ document.body.style.overflow = 'hidden';
+ return () => {
+ document.body.style.overflow = 'unset';
+ };
+ }, []);
+
const CustomizedDot = (props: any) => {
const { cx, cy, payload } = props;
return (
@@ -24,69 +33,80 @@ export const PortfolioPerformanceModal = memo(({ performances, onClose }: Portfo
};
return (
-
-
-
+
+
+ {/* Header - Fixed */}
+
Portfolio Performance History
-
-
-
-
-
-
- `${value.toFixed(2)}%`}
- />
- `€${value.toLocaleString()}`}
- />
- {
- if (name === 'Performance') return [`${value.toFixed(2)}%`, name];
- return [`€${value.toLocaleString()}`, 'Portfolio Value'];
- }}
- labelFormatter={(year) => `Year ${year}`}
- />
- }
- strokeWidth={2}
- yAxisId="left"
- />
-
-
-
-
-
-
-
-
-
-
- {sortedPerformances.map(({ year, percentage }) => (
-
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30'
- }`}
- >
-
{year}
-
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'
- }`}>
- {percentage.toFixed(2)}%
+
+ {/* Content - Scrollable */}
+
+ {/* Chart */}
+
+
+
+
+
+ `${value.toFixed(2)}%`}
+ />
+ `€${value.toLocaleString()}`}
+ />
+ {
+ if (name === 'Performance') return [`${value.toFixed(2)}%`, name];
+ return [`€${value.toLocaleString()}`, 'Portfolio Value'];
+ }}
+ labelFormatter={(year) => `Year ${year}`}
+ />
+ }
+ strokeWidth={2}
+ yAxisId="left"
+ />
+
+
+
+
+
+
+
+
+
+
+ {/* Performance Cards */}
+
+ {sortedPerformances.map(({ year, percentage }) => (
+
= 0 ? 'bg-green-100 dark:bg-green-900/30' : 'bg-red-100 dark:bg-red-900/30'
+ }`}
+ >
+
{year}
+
= 0 ? 'text-green-600 dark:text-green-400' : 'text-red-600 dark:text-red-400'
+ }`}>
+ {percentage.toFixed(2)}%
+
-
- ))}
+ ))}
+