diff --git a/apps/enji.dev/next.config.mjs b/apps/enji.dev/next.config.mjs index f28cfbca..6d5b111a 100644 --- a/apps/enji.dev/next.config.mjs +++ b/apps/enji.dev/next.config.mjs @@ -11,6 +11,11 @@ const nextConfig = { destination: '/work/skills-and-tools', permanent: false, }, + { + source: '/docs', + destination: '/docs/tailwindcss-accent', + permanent: false, + }, ], pageExtensions: ['ts', 'tsx', 'js', 'jsx', 'md', 'mdx'], reactStrictMode: true, diff --git a/apps/enji.dev/src/components/Footer.tsx b/apps/enji.dev/src/components/Footer.tsx index 489d809e..3147c91c 100644 --- a/apps/enji.dev/src/components/Footer.tsx +++ b/apps/enji.dev/src/components/Footer.tsx @@ -1,5 +1,13 @@ import clsx from 'clsx'; import { m } from 'framer-motion'; +import Link from 'next/link'; + +import { + ExternalLink, + FigmaIcon, + GitHubIcon, + TwitterIcon, +} from '@/components/Icons'; import useLastUpdate from '@/hooks/useLastUpdate'; @@ -36,43 +44,211 @@ function LastUpdate() { ); } +interface FooterLinkProps { + title: string; + href: string; + label?: 'new' | 'soon'; + isInternal?: boolean; +} + +function FooterLink({ + title, + href, + label = undefined, + isInternal = true, +}: FooterLinkProps) { + if (label === 'soon') { + return ( + + {title} + {label} + + ); + } + + if (isInternal) { + return ( + + {title} + {label && {label}} + + ); + } + + return ( + + {title} + + {label && {label}} + + ); +} + +interface FooterGroupProps { + title: string; + links: Array; +} + +function FooterGroup({ title, links }: FooterGroupProps) { + return ( + + + {title} + + + {links.map(({ title: linkTitle, href, label, isInternal }) => ( + + + + ))} + + + ); +} + +function FooterDescription() { + return ( + + + About Me + + + I'm Enji, a front-end developer who loves + intuitive, clean and modern UI design. + + + + + + + + + + + + + + + + + + + + ); +} + function Footer() { return (
+ I'm Enji, a front-end developer who loves + intuitive, clean and modern UI design. +