diff --git a/src/app/components/BackgroundPattern.tsx b/src/app/components/BackgroundPattern.tsx new file mode 100644 index 0000000..1f55f99 --- /dev/null +++ b/src/app/components/BackgroundPattern.tsx @@ -0,0 +1,157 @@ +"use client"; +import { useState, useEffect } from "react"; +import { + type LucideIcon, + HandCoins, + Bitcoin, + Coins, + DollarSign, + Euro, + IndianRupee, + JapaneseYen, + PiggyBank, + PoundSterling, + Wallet, + Banknote, + ChartCandlestick, + CirclePercent, + CreditCard, + Gem, + Receipt, + ShoppingBasket, + Rocket, + RockingChair, + Sparkles, + ChartPie, + ChartBar, + BarChart3, + ChartLine, + TrendingDown, + TrendingUp, + Vault, + Landmark, + Briefcase, + Handshake, + Shield, + Lock, + CalendarRange, + Hourglass, + Sprout, + Target, +} from "lucide-react"; + +export default function MultiIconPattern({ opacity = 0.2, spacing = 160 }) { + const [width, setWidth] = useState(0); + const [height, setHeight] = useState(0); + const [rows, setRows] = useState(0); + const [columns, setColumns] = useState(0); + + useEffect(() => { + const updateDimensions = () => { + if (window.innerWidth > width + spacing * 2) { + setWidth(window.innerWidth); + } + if (window.innerHeight > height + spacing * 2) { + setHeight(window.innerHeight); + } + }; + + updateDimensions(); + window.addEventListener("resize", updateDimensions); + + return () => { + window.removeEventListener("resize", updateDimensions); + }; + }, [height, width, spacing]); + + useEffect(() => { + setColumns(Math.ceil(width / spacing) + 3); + }, [width, spacing]); + + useEffect(() => { + setRows(Math.ceil(height / spacing) + 3); + }, [height, spacing]); + + // Explicitly type the array as LucideIcon[] + const iconComponents: LucideIcon[] = [ + HandCoins, + Bitcoin, + Coins, + DollarSign, + Euro, + IndianRupee, + JapaneseYen, + PiggyBank, + PoundSterling, + Wallet, + Banknote, + ChartCandlestick, + CirclePercent, + CreditCard, + Gem, + Receipt, + ShoppingBasket, + Rocket, + RockingChair, + Sparkles, + ChartPie, + ChartBar, + BarChart3, + ChartLine, + TrendingDown, + TrendingUp, + Vault, + Landmark, + Briefcase, + Handshake, + Shield, + Lock, + CalendarRange, + Hourglass, + Sprout, + Target, + ]; + + const renderIcons = ({ + rows, + columns, + }: { + rows: number; + columns: number; + }) => { + const icons = []; + for (let y = 0; y < rows; y++) { + for (let x = 0; x < columns; x++) { + // Pick a random icon component from the array + const randomIndex = Math.floor(Math.random() * iconComponents.length); + const IconComponent = iconComponents[randomIndex]!; + + // Slightly randomize size and position for more organic feel + const size = 28 + Math.floor(Math.random() * 8); + const xOffset = Math.floor(Math.random() * (spacing / 1.618)); + const yOffset = Math.floor(Math.random() * (spacing / 1.618)); + + icons.push( + , + ); + } + } + return icons; + }; + + return ( +
+ {width > 0 && renderIcons({ rows, columns })} +
+ ); +} diff --git a/src/app/page.tsx b/src/app/page.tsx index 7f56ec5..3cc73c9 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -7,11 +7,13 @@ import { AccordionTrigger, } from "@/components/ui/accordion"; import Footer from "./components/footer"; +import BackgroundPattern from "./components/BackgroundPattern"; export default function HomePage() { return (
-
+ +
{/* Added SEO Content Sections */} -
+

What Is FIRE? Understanding Financial Independence and Early @@ -247,7 +249,7 @@ export default function HomePage() { financial independence and smart investing.

-
+

Getting Started with FIRE: