simple-links/src/app/page.tsx

162 lines
5.0 KiB
TypeScript
Raw Normal View History

import { library } from "@fortawesome/fontawesome-svg-core";
import { fab } from "@fortawesome/free-brands-svg-icons";
import { far } from "@fortawesome/free-regular-svg-icons";
import { fas } from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
2023-07-02 11:02:11 +00:00
import Image from "next/image";
import Config from "../../config.json";
2023-07-01 21:08:39 +00:00
library.add(fab, far, fas); // Loading in the icons from FontAwesome
2023-07-01 20:43:53 +00:00
export default function Home() {
2023-07-10 04:06:28 +00:00
const {
background,
infoCard,
avatar,
name,
links,
2023-07-12 08:40:24 +00:00
socialLinks,
2023-07-10 04:06:28 +00:00
options,
description,
2023-07-12 08:40:24 +00:00
theme,
2023-07-10 04:06:28 +00:00
} = Config; // All of the settings pulled from the config file
2023-07-10 02:54:12 +00:00
2023-07-10 04:06:28 +00:00
// Theme colors to use when using the selected theme
// all used colors are from TailwindCSS
const themeColors: {
[key: string]: {
backgroundColor: string;
2023-07-12 10:04:55 +00:00
infoCardColor: string;
2023-07-10 04:06:28 +00:00
textColor: string;
buttonTextColor: string;
2023-07-12 10:04:55 +00:00
footerTextColor: string;
2023-07-10 04:06:28 +00:00
};
} = {
dark: {
2023-07-12 10:04:55 +00:00
backgroundColor: "bg-neutral-800",
infoCardColor: "bg-neutral-900",
2023-07-10 04:06:28 +00:00
textColor: "text-white",
buttonTextColor: "text-white",
2023-07-12 10:04:55 +00:00
footerTextColor: "text-blue-300",
2023-07-10 04:06:28 +00:00
},
light: {
2023-07-12 10:04:55 +00:00
backgroundColor: "bg-gray-300",
infoCardColor: "bg-white",
2023-07-10 04:06:28 +00:00
textColor: "text-black",
buttonTextColor: "text-white",
2023-07-12 10:04:55 +00:00
footerTextColor: "text-black",
2023-07-10 04:06:28 +00:00
},
};
2023-07-10 04:15:39 +00:00
const selectedTheme = themeColors[theme] || themeColors.dark; // The theme to use (fallback of dark)
2023-07-09 06:19:08 +00:00
2023-07-10 04:06:28 +00:00
return (
<>
<main
2023-07-12 10:04:55 +00:00
className={`flex flex-col items-center justify-center w-screen h-screen ${selectedTheme.backgroundColor} ${selectedTheme.textColor}`}
2023-07-10 04:06:28 +00:00
>
{/* Background Image */}
{background.showBackground && background.backgroundImage && (
<Image
alt="Background image"
src={background.backgroundImage}
fill={true}
style={{
zIndex: 0,
filter: `${background.blur && "blur(4px)"} brightness(${
background.darken.enabled && background.darken.amount / 2
})`,
}}
/>
)}
2023-07-10 04:06:28 +00:00
<div
2023-07-12 10:04:55 +00:00
className={`${selectedTheme.infoCardColor} rounded-lg text-center shadow-lg`}
2023-07-10 04:06:28 +00:00
style={{
zIndex: 1,
opacity: infoCard.transparency,
}}
>
<div className="m-5">
<div className="flex flex-col items-center justify-center">
<Image
src={avatar}
alt="Avatar"
width={120}
height={120}
className="rounded-full"
/>
<div className="mb-3"></div>
<h1 className="text-4xl font-bold">{name}</h1>
</div>
2023-07-01 21:08:39 +00:00
2023-07-12 08:40:24 +00:00
{/* Description of user */}
2023-07-10 04:06:28 +00:00
<p className="mt-4 text-lg max-w-lg">{description}</p>
2023-07-01 20:43:53 +00:00
2023-07-12 08:40:24 +00:00
{/* Links (Buttons) */}
2023-07-10 04:06:28 +00:00
<div className="flex flex-col items-center">
2023-07-12 08:41:04 +00:00
{links &&
links.map((link, index) => {
const icons: any = link.icon?.split(" ") ?? [];
2023-07-12 08:41:04 +00:00
return (
<a
key={index}
href={link.url}
target="_blank"
rel="noopener noreferrer"
className={`flex flex-row items-center justify-center mt-4 px-4 w-60 py-2 rounded
2023-07-12 08:40:24 +00:00
${selectedTheme.buttonTextColor} ${link.color.normal} hover:brightness-75 transition gap-2`}
2023-07-12 08:41:04 +00:00
>
{link.icon && <FontAwesomeIcon icon={icons} />}
<p>{link.title}</p>
</a>
);
})}
2023-07-10 04:06:28 +00:00
</div>
2023-07-12 08:40:24 +00:00
{/* Social Links */}
<div className="flex items-center justify-center gap-3 mt-4">
{socialLinks &&
socialLinks.map((link, index) => {
const icons: any = link.icon?.split(" ") ?? [];
return (
<a
key={index}
href={link.url}
target="_blank"
rel="noopener noreferrer"
2023-07-12 09:02:26 +00:00
className="hover:brightness-75 transition"
2023-07-12 08:40:24 +00:00
>
2023-07-12 09:02:26 +00:00
{link.icon && (
<FontAwesomeIcon
color={link.color && link.color}
size="2xl"
icon={icons}
/>
)}
2023-07-12 08:40:24 +00:00
</a>
);
})}
</div>
2023-07-10 04:06:28 +00:00
</div>
</div>
2023-07-12 08:40:24 +00:00
{/* Footer */}
2023-07-12 10:04:55 +00:00
<div
className={`absolute bottom-0 right-0 mb-5 mr-5 ${selectedTheme.footerTextColor}`}
>
2023-07-10 04:06:28 +00:00
{options.showSourceLink && (
<a
href="https://git.fascinated.cc/Fascinated/simple-links"
target="_blank"
2023-07-12 10:04:55 +00:00
className="mt-5"
2023-07-10 04:06:28 +00:00
>
Website Source
</a>
)}
</div>
</main>
</>
);
2023-07-01 20:43:53 +00:00
}