/** * @copyright nhcarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import Image from "next/image"; import React, { type JSX } from "react"; import { NavItems } from "../config/NavItems"; const generateRandomColor = (): string => { return `#${Math.floor(Math.random() * 16_777_215).toString(16). padStart(6, "0")}`; }; const getLuminance = (hexColor: string): number => { const r = Number.parseInt(hexColor.slice(1, 3), 16); const g = Number.parseInt(hexColor.slice(3, 5), 16); const b = Number.parseInt(hexColor.slice(5, 7), 16); // eslint-disable-next-line @typescript-eslint/consistent-type-assertions const a: [number, number, number] = [ r, g, b ].map((v) => { const w = v / 255; return w <= 0.039_28 ? w / 12.92 : Math.pow((w + 0.055) / 1.055, 2.4); }) as [number, number, number]; const rl = a[0] * 0.2126; const gl = a[1] * 0.7152; const bl = a[2] * 0.0722; return rl + gl + bl; }; const adjustColorLuminosity = (hexColor: string, luminosityChange: number): string => { let r = Number.parseInt(hexColor.slice(1, 3), 16); let g = Number.parseInt(hexColor.slice(3, 5), 16); let b = Number.parseInt(hexColor.slice(5, 7), 16); r = Math.round(r * luminosityChange); g = Math.round(g * luminosityChange); b = Math.round(b * luminosityChange); r = Math.min(255, Math.max(0, r)); g = Math.min(255, Math.max(0, g)); b = Math.min(255, Math.max(0, b)); return `#${ r.toString(16).padStart(2, "0") }${g.toString(16).padStart(2, "0") }${b.toString(16).padStart(2, "0")}`; }; const generateColorPair = (): { background: string; color: string } => { const backgroundColor = generateRandomColor(); const backgroundLuminance = getLuminance(backgroundColor); const textColor = backgroundLuminance > 0.5 ? adjustColorLuminosity(backgroundColor, 0) : adjustColorLuminosity(backgroundColor, 5); return { background: backgroundColor, color: textColor, }; }; /** * Renders the main React component. * @returns A JSX element. */ const Home = (): JSX.Element => { return (

{`Naomi Carrigan`}

Naomi Carrigan

{`Software Engineer | Community Manager | VTuber`}

{NavItems.map((item, index) => { const { background, color } = generateColorPair(); return ( {index % 2 === 1 ? "🩷" : "🩵"} {item.text} ); })}
); }; export default Home;