initial commit

This commit is contained in:
Aidan 2025-01-05 14:33:52 -05:00
parent 60ed5888fa
commit 77990f0708
23 changed files with 483 additions and 121 deletions

157
.gitignore vendored
View File

@ -1,130 +1,47 @@
# Logs
logs
*.log
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.*
.yarn/*
!.yarn/patches
!.yarn/plugins
!.yarn/releases
!.yarn/versions
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
*.pem
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
lerna-debug.log*
.pnpm-debug.log*
# Diagnostic reports (https://nodejs.org/api/report.html)
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
# env files (can opt-in for committing if needed)
.env*
# Runtime data
pids
*.pid
*.seed
*.pid.lock
# vercel
.vercel
# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov
# Coverage directory used by tools like istanbul
coverage
*.lcov
# nyc test coverage
.nyc_output
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
.grunt
# Bower dependency directory (https://bower.io/)
bower_components
# node-waf configuration
.lock-wscript
# Compiled binary addons (https://nodejs.org/api/addons.html)
build/Release
# Dependency directories
node_modules/
jspm_packages/
# Snowpack dependency directory (https://snowpack.dev/)
web_modules/
# TypeScript cache
# typescript
*.tsbuildinfo
next-env.d.ts
# Optional npm cache directory
.npm
# bun
bun.lockb
# Optional eslint cache
.eslintcache
# Optional stylelint cache
.stylelintcache
# Microbundle cache
.rpt2_cache/
.rts2_cache_cjs/
.rts2_cache_es/
.rts2_cache_umd/
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variable files
.env
.env.development.local
.env.test.local
.env.production.local
.env.local
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# Next.js build output
.next
out
# Nuxt.js build / generate output
.nuxt
dist
# Gatsby files
.cache/
# Comment in the public line in if your project uses Gatsby and not Next.js
# https://nextjs.org/blog/next-9-1#public-directory-support
# public
# vuepress build output
.vuepress/dist
# vuepress v2.x temp and cache directory
.temp
.cache
# Docusaurus cache and generated files
.docusaurus
# Serverless directories
.serverless/
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
# yarn v2
.yarn/cache
.yarn/unplugged
.yarn/build-state.yml
.yarn/install-state.gz
.pnp.*
# misc
package-lock.json

View File

@ -1,2 +1,7 @@
# aidxnCC
My other website, aidxn.cc
aidxnCC is the third version of my personal website. It's still a work in progress and will require more work to be in tip-top shape.
# Contributing
Any and all contributions are welcome! Simply create a pull request and I should have a response to you within a day.
Please use common sense when contributing :)

15
app/about/page.tsx Normal file
View File

@ -0,0 +1,15 @@
import Header from '../components/Header'
import AboutTmp from '../components/AboutTmp'
import Footer from '../components/Footer'
export default function About() {
return (
<div className="min-h-screen flex flex-col">
<Header />
<main className="flex-grow container mx-auto px-4 py-12">
<AboutTmp />
</main>
<Footer />
</div>
)
}

View File

@ -0,0 +1,27 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faUser } from '@fortawesome/free-solid-svg-icons'
export default function About() {
return (
<div className="max-w-2xl mx-auto text-center">
<FontAwesomeIcon icon={faUser} className="text-6xl mb-6" />
<h1 className="text-4xl font-bold my-2 text-center text-gray-200" style={{ textShadow: '0 0 10px rgba(255, 255, 255, 0.5)' }}>
About Me
</h1>
<div className="p-6">
<p className="text-gray-300 mb-4">
Hey there! I'm Aidan, a web developer and student, and this is my website. I'm passionate about web development (although I'm not great with design) and I love building things with Node.js and Express.
</p>
<p className="text-gray-300 mb-4">
In terms of my academic background, I am currently persuing a degree in computer science at SNHU. I really enjoy learning, though it depends on the subject. I am mostly self-taught when it comes to programming. I prefer this style of learning, especially with programming, as it lets me learn faster and apply creativity much more.
</p>
<p className="text-gray-300 mb-4">
When I'm not programming, I can typically be found installing another Linux distro on my laptop or flashing a new ROM to my phone. I am also a passionate writer and I like to write creatively in my free time.
</p>
<p className="text-gray-300">
I am almost always active on GitHub and make daily contributions to several of my repositories. I am a big fan of open source software and public domain software (which most of my repos are licensed under). In fact, the website you're currently on is free and open source. It's even under the public domain!
</p>
</div>
</div>
)
}

36
app/components/Bio.tsx Normal file
View File

@ -0,0 +1,36 @@
import Image from 'next/image'
export default function Bio() {
return (
<div className="max-w-2xl mx-auto">
<div className="mb-12 text-center">
<Image
src="/ihatenodejs.jpg"
alt="My Profile Picture"
width={150}
height={150}
className="rounded-full mx-auto mb-6 border-4 border-gray-700"
/>
<h1 className="text-4xl font-bold mb-2">Aidan</h1>
<p className="text-gray-400 text-xl">Web Developer & Student</p>
</div>
<section id="about" className="mb-12">
<h2 className="text-2xl font-semibold mb-4 text-gray-200">Who I am</h2>
<p className="text-gray-300 leading-relaxed">
Hey there! I'm Aidan, a web developer and student from the US.<br /><br />
I am most interested in backend development and have experience with Node.js, Express, and Tailwind CSS.<br /><br />
When I'm not programming, I can be found re-flashing my phone with a new custom ROM and telling everyone I use Arch.
</p>
</section>
<section id="contact" className="text-center">
<h2 className="text-2xl font-semibold mb-4 text-gray-200">Send me a message</h2>
<p className="text-gray-300 mb-6">Feel free to reach out for collaborations or just a hello :)</p>
<a href="/contact" className="bg-gray-700 text-white px-8 py-3 rounded-full hover:bg-gray-600 transition-colors text-lg font-medium">
Contact Me
</a>
</section>
</div>
)
}

View File

@ -0,0 +1,42 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faPhone, faEnvelope } from '@fortawesome/free-solid-svg-icons'
import { faGithub, faTelegram } from '@fortawesome/free-brands-svg-icons'
export default function Contact() {
return (
<div className="max-w-2xl mx-auto text-center">
<FontAwesomeIcon icon={faPhone} className="text-6xl mb-6" />
<h1 className="text-4xl font-bold my-2 text-center text-gray-200" style={{ textShadow: '0 0 10px rgba(255, 255, 255, 0.5)' }}>
Contact
</h1>
<div className="p-6 space-y-4">
<ContactButton href="https://github.com/ihatenodejs" icon={faGithub} label="ihatenodejs" className="mr-3" />
<ContactButton href="https://t.me/p0ntu5" icon={faTelegram} label="@p0ntu5" className="mr-3" />
<ContactButton href="mailto:aidan@p0ntus.com" icon={faEnvelope} label="aidan@p0ntus.com" className="" />
</div>
<div className="p-6">
<h2 className="text-2xl font-semibold mb-4 text-gray-200">I'm a busy person</h2>
<p className="text-gray-300 mb-4">
I do a lot of things during the day and I'm not always able to respond to messages right away. Please be patient and remember not to demand things from me... Somehow this is an issue for people :(
</p>
<p className="text-gray-300 mb-4">
For the best chance of a response, please send me a message on Telegram. If you've made a pull request on one of my repos, I will most likely respond by the next day. If you've sent me an email, I will most likely respond within three days or less.
</p>
</div>
</div>
)
}
function ContactButton({ href, icon, label, className }) {
return (
<a
href={href}
target="_blank"
rel="noopener noreferrer"
className={`bg-gray-700 text-white px-4 py-2 rounded-full hover:bg-gray-600 transition-colors inline-flex items-center ${className}`}
>
<FontAwesomeIcon icon={icon} className="text-xl mr-2" />
{label}
</a>
)
}

View File

@ -0,0 +1,22 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faLink } from '@fortawesome/free-solid-svg-icons'
import domains from '../data/domains.json'
export default function About() {
return (
<div className="max-w-2xl mx-auto text-center">
<FontAwesomeIcon icon={faLink} className="text-6xl mb-6" />
<h1 className="text-4xl font-bold my-2 text-center text-gray-200" style={{ textShadow: '0 0 10px rgba(255, 255, 255, 0.5)' }}>
My Domains
</h1>
<div className="p-6">
{domains.map(domain => (
<div key={domain.id} className="mb-4">
<h2 className="text-2xl font-semibold text-gray-200">{domain.domain}</h2>
<p className="text-gray-300">{domain.usage}</p>
</div>
))}
</div>
</div>
)
}

14
app/components/Footer.tsx Normal file
View File

@ -0,0 +1,14 @@
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faGithub } from '@fortawesome/free-brands-svg-icons'
export default function Footer() {
return (
<footer className="bg-gray-800 py-6">
<div className="container mx-auto px-4 text-center">
<a href="https://github.com/ihatenodejs/aidxnCC" target="_blank" rel="noopener noreferrer" className="text-gray-400 hover:text-white transition-colors">
<FontAwesomeIcon icon={faGithub} className="text-md mr-1" /> This website is free, open source and in the public domain.
</a>
</div>
</footer>
)
}

18
app/components/Header.tsx Normal file
View File

@ -0,0 +1,18 @@
import Link from 'next/link'
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
import { faLink, faHouse, faUser, faPhone } from '@fortawesome/free-solid-svg-icons'
export default function Header() {
return (
<header className="bg-gray-800">
<nav className="container mx-auto px-4 py-6">
<ul className="flex space-x-6">
<li><Link href="/" className="text-gray-300 hover:text-white transition-colors"><FontAwesomeIcon icon={faHouse} className="text-md mr-1" /> Home</Link></li>
<li><Link href="/about" className="text-gray-300 hover:text-white transition-colors"><FontAwesomeIcon icon={faUser} className="text-md mr-1" /> About</Link></li>
<li><Link href="/contact" className="text-gray-300 hover:text-white transition-colors"><FontAwesomeIcon icon={faPhone} className="text-md mr-1" /> Contact</Link></li>
<li><Link href="/domains" className="text-gray-300 hover:text-white transition-colors"><FontAwesomeIcon icon={faLink} className="text-md mr-1" /> Domains</Link></li>
</ul>
</nav>
</header>
)
}

15
app/contact/page.tsx Normal file
View File

@ -0,0 +1,15 @@
import Header from '../components/Header'
import ContactTmp from '../components/ContactTmp'
import Footer from '../components/Footer'
export default function Contact() {
return (
<div className="min-h-screen flex flex-col">
<Header />
<main className="flex-grow container mx-auto px-4 py-12">
<ContactTmp />
</main>
<Footer />
</div>
)
}

47
app/data/domains.json Normal file
View File

@ -0,0 +1,47 @@
[
{
"id": 1,
"domain": "aidxn.cc",
"usage": "The home of my primary homepage and website (v3)"
},
{
"id": 2,
"domain": "aidxn.fun",
"usage": "My alternative homepage (v2)"
},
{
"id": 3,
"domain": "pontusmail.org",
"usage": "My personal email service, free to the public"
},
{
"id": 4,
"domain": "ihate.college",
"usage": "One of my fun domains, used for p0ntus mail"
},
{
"id": 5,
"domain": "pontus.pics",
"usage": "An unused domain for an upcoming image hosting service"
},
{
"id": 6,
"domain": "p0ntus.com",
"usage": "A website for my online persona which hosts a small archive"
},
{
"id": 7,
"domain": "androidintegrity.org",
"usage": "A collaborative project to improve Google's Play Integrity"
},
{
"id": 8,
"domain": "modules.lol",
"usage": "An 'app store' of Magisk modules and FOSS Android apps"
},
{
"id": 9,
"domain": "wikitools.cloud",
"usage": "A collection of tools made by me for Wikipedia"
}
]

15
app/domains/page.tsx Normal file
View File

@ -0,0 +1,15 @@
import Header from '../components/Header'
import DomainTmp from '../components/DomainTmp'
import Footer from '../components/Footer'
export default function Domains() {
return (
<div className="min-h-screen flex flex-col">
<Header />
<main className="flex-grow container mx-auto px-4 py-12">
<DomainTmp />
</main>
<Footer />
</div>
)
}

BIN
app/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

40
app/globals.css Normal file
View File

@ -0,0 +1,40 @@
@tailwind base;
@tailwind components;
@tailwind utilities;
:root {
--foreground-rgb: 255, 255, 255;
--background-start-rgb: 0, 0, 0;
--background-end-rgb: 0, 0, 0;
}
body {
color: rgb(var(--foreground-rgb));
background: linear-gradient(
to bottom,
transparent,
rgb(var(--background-end-rgb))
)
rgb(var(--background-start-rgb));
}
@layer utilities {
.text-balance {
text-wrap: balance;
}
}
.rounded-full {
border-radius: 9999px;
}
.transition-colors {
transition-property: background-color, border-color, color, fill, stroke;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
html {
scroll-behavior: smooth;
}

27
app/layout.tsx Normal file
View File

@ -0,0 +1,27 @@
import './globals.css'
import type { Metadata } from 'next'
import { Inter } from 'next/font/google'
import '@fortawesome/fontawesome-svg-core/styles.css'
import { config } from '@fortawesome/fontawesome-svg-core'
config.autoAddCss = false
const inter = Inter({ subsets: ['latin'] })
export const metadata: Metadata = {
title: 'Aidan',
description: 'Web Developer & Student',
}
export default function RootLayout({
children,
}: {
children: React.ReactNode
}) {
return (
<html lang="en" className="dark">
<body className={`${inter.className} bg-gray-900 text-gray-100`}>{children}</body>
</html>
)
}

15
app/page.tsx Normal file
View File

@ -0,0 +1,15 @@
import Header from './components/Header'
import Bio from './components/Bio'
import Footer from './components/Footer'
export default function Home() {
return (
<div className="min-h-screen flex flex-col">
<Header />
<main className="flex-grow container mx-auto px-4 py-12">
<Bio />
</main>
<Footer />
</div>
)
}

16
eslint.config.mjs Normal file
View File

@ -0,0 +1,16 @@
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
});
const eslintConfig = [
...compat.extends("next/core-web-vitals", "next/typescript"),
];
export default eslintConfig;

7
next.config.ts Normal file
View File

@ -0,0 +1,7 @@
import type { NextConfig } from "next";
const nextConfig: NextConfig = {
/* config options here */
};
export default nextConfig;

31
package.json Normal file
View File

@ -0,0 +1,31 @@
{
"name": "aidxncc",
"version": "0.1.0",
"private": true,
"scripts": {
"dev": "next dev --turbopack",
"build": "next build",
"start": "next start",
"lint": "next lint"
},
"dependencies": {
"@fortawesome/fontawesome-svg-core": "^6.7.2",
"@fortawesome/free-brands-svg-icons": "^6.7.2",
"@fortawesome/free-solid-svg-icons": "^6.7.2",
"@fortawesome/react-fontawesome": "^0.2.2",
"next": "15.1.3",
"react": "^19.0.0",
"react-dom": "^19.0.0"
},
"devDependencies": {
"typescript": "^5",
"@types/node": "^20",
"@types/react": "^19",
"@types/react-dom": "^19",
"postcss": "^8",
"tailwindcss": "^3.4.1",
"eslint": "^9",
"eslint-config-next": "15.1.3",
"@eslint/eslintrc": "^3"
}
}

8
postcss.config.mjs Normal file
View File

@ -0,0 +1,8 @@
/** @type {import('postcss-load-config').Config} */
const config = {
plugins: {
tailwindcss: {},
},
};
export default config;

BIN
public/ihatenodejs.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

18
tailwind.config.ts Normal file
View File

@ -0,0 +1,18 @@
import type { Config } from "tailwindcss";
export default {
content: [
"./pages/**/*.{js,ts,jsx,tsx,mdx}",
"./components/**/*.{js,ts,jsx,tsx,mdx}",
"./app/**/*.{js,ts,jsx,tsx,mdx}",
],
theme: {
extend: {
colors: {
background: "var(--background)",
foreground: "var(--foreground)",
},
},
},
plugins: [],
} satisfies Config;

27
tsconfig.json Normal file
View File

@ -0,0 +1,27 @@
{
"compilerOptions": {
"target": "ES2017",
"lib": ["dom", "dom.iterable", "esnext"],
"allowJs": true,
"skipLibCheck": true,
"strict": true,
"noEmit": true,
"esModuleInterop": true,
"module": "esnext",
"moduleResolution": "bundler",
"resolveJsonModule": true,
"isolatedModules": true,
"jsx": "preserve",
"incremental": true,
"plugins": [
{
"name": "next"
}
],
"paths": {
"@/*": ["./*"]
}
},
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
"exclude": ["node_modules"]
}