From 77990f07082b981d70608b178234e29261a9766a Mon Sep 17 00:00:00 2001 From: Aidan Date: Sun, 5 Jan 2025 14:33:52 -0500 Subject: [PATCH] initial commit --- .gitignore | 157 ++++++++-------------------------- README.md | 7 +- app/about/page.tsx | 15 ++++ app/components/AboutTmp.tsx | 27 ++++++ app/components/Bio.tsx | 36 ++++++++ app/components/ContactTmp.tsx | 42 +++++++++ app/components/DomainTmp.tsx | 22 +++++ app/components/Footer.tsx | 14 +++ app/components/Header.tsx | 18 ++++ app/contact/page.tsx | 15 ++++ app/data/domains.json | 47 ++++++++++ app/domains/page.tsx | 15 ++++ app/favicon.ico | Bin 0 -> 25931 bytes app/globals.css | 40 +++++++++ app/layout.tsx | 27 ++++++ app/page.tsx | 15 ++++ eslint.config.mjs | 16 ++++ next.config.ts | 7 ++ package.json | 31 +++++++ postcss.config.mjs | 8 ++ public/ihatenodejs.jpg | Bin 0 -> 20015 bytes tailwind.config.ts | 18 ++++ tsconfig.json | 27 ++++++ 23 files changed, 483 insertions(+), 121 deletions(-) create mode 100644 app/about/page.tsx create mode 100644 app/components/AboutTmp.tsx create mode 100644 app/components/Bio.tsx create mode 100644 app/components/ContactTmp.tsx create mode 100644 app/components/DomainTmp.tsx create mode 100644 app/components/Footer.tsx create mode 100644 app/components/Header.tsx create mode 100644 app/contact/page.tsx create mode 100644 app/data/domains.json create mode 100644 app/domains/page.tsx create mode 100644 app/favicon.ico create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 eslint.config.mjs create mode 100644 next.config.ts create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/ihatenodejs.jpg create mode 100644 tailwind.config.ts create mode 100644 tsconfig.json diff --git a/.gitignore b/.gitignore index c6bba59..a813645 100644 --- a/.gitignore +++ b/.gitignore @@ -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 \ No newline at end of file diff --git a/README.md b/README.md index 6c9e960..34f3913 100644 --- a/README.md +++ b/README.md @@ -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 :) \ No newline at end of file diff --git a/app/about/page.tsx b/app/about/page.tsx new file mode 100644 index 0000000..9991a93 --- /dev/null +++ b/app/about/page.tsx @@ -0,0 +1,15 @@ +import Header from '../components/Header' +import AboutTmp from '../components/AboutTmp' +import Footer from '../components/Footer' + +export default function About() { + return ( +
+
+
+ +
+
+
+ ) +} diff --git a/app/components/AboutTmp.tsx b/app/components/AboutTmp.tsx new file mode 100644 index 0000000..bfcf45e --- /dev/null +++ b/app/components/AboutTmp.tsx @@ -0,0 +1,27 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faUser } from '@fortawesome/free-solid-svg-icons' + +export default function About() { + return ( +
+ +

+ About Me +

+
+

+ 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. +

+

+ 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. +

+

+ 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. +

+

+ 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! +

+
+
+ ) +} \ No newline at end of file diff --git a/app/components/Bio.tsx b/app/components/Bio.tsx new file mode 100644 index 0000000..74ba4e4 --- /dev/null +++ b/app/components/Bio.tsx @@ -0,0 +1,36 @@ +import Image from 'next/image' + +export default function Bio() { + return ( +
+
+ My Profile Picture +

Aidan

+

Web Developer & Student

+
+ +
+

Who I am

+

+ Hey there! I'm Aidan, a web developer and student from the US.

+ I am most interested in backend development and have experience with Node.js, Express, and Tailwind CSS.

+ When I'm not programming, I can be found re-flashing my phone with a new custom ROM and telling everyone I use Arch. +

+
+ +
+

Send me a message

+

Feel free to reach out for collaborations or just a hello :)

+ + Contact Me + +
+
+ ) +} diff --git a/app/components/ContactTmp.tsx b/app/components/ContactTmp.tsx new file mode 100644 index 0000000..f9b8601 --- /dev/null +++ b/app/components/ContactTmp.tsx @@ -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 ( +
+ +

+ Contact +

+
+ + + +
+
+

I'm a busy person

+

+ 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 :( +

+

+ 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. +

+
+
+ ) +} + +function ContactButton({ href, icon, label, className }) { + return ( + + + {label} + + ) +} \ No newline at end of file diff --git a/app/components/DomainTmp.tsx b/app/components/DomainTmp.tsx new file mode 100644 index 0000000..bf60157 --- /dev/null +++ b/app/components/DomainTmp.tsx @@ -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 ( +
+ +

+ My Domains +

+
+ {domains.map(domain => ( +
+

{domain.domain}

+

{domain.usage}

+
+ ))} +
+
+ ) +} \ No newline at end of file diff --git a/app/components/Footer.tsx b/app/components/Footer.tsx new file mode 100644 index 0000000..43be013 --- /dev/null +++ b/app/components/Footer.tsx @@ -0,0 +1,14 @@ +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faGithub } from '@fortawesome/free-brands-svg-icons' + +export default function Footer() { + return ( + + ) +} diff --git a/app/components/Header.tsx b/app/components/Header.tsx new file mode 100644 index 0000000..76e74e7 --- /dev/null +++ b/app/components/Header.tsx @@ -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 ( +
+ +
+ ) +} diff --git a/app/contact/page.tsx b/app/contact/page.tsx new file mode 100644 index 0000000..d423bb3 --- /dev/null +++ b/app/contact/page.tsx @@ -0,0 +1,15 @@ +import Header from '../components/Header' +import ContactTmp from '../components/ContactTmp' +import Footer from '../components/Footer' + +export default function Contact() { + return ( +
+
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/app/data/domains.json b/app/data/domains.json new file mode 100644 index 0000000..53e9a73 --- /dev/null +++ b/app/data/domains.json @@ -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" + } +] diff --git a/app/domains/page.tsx b/app/domains/page.tsx new file mode 100644 index 0000000..782eab7 --- /dev/null +++ b/app/domains/page.tsx @@ -0,0 +1,15 @@ +import Header from '../components/Header' +import DomainTmp from '../components/DomainTmp' +import Footer from '../components/Footer' + +export default function Domains() { + return ( +
+
+
+ +
+
+
+ ) +} diff --git a/app/favicon.ico b/app/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..718d6fea4835ec2d246af9800eddb7ffb276240c GIT binary patch literal 25931 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 LrJugUA?W`A8`#=m literal 0 HcmV?d00001 diff --git a/app/globals.css b/app/globals.css new file mode 100644 index 0000000..6aa4658 --- /dev/null +++ b/app/globals.css @@ -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; +} + diff --git a/app/layout.tsx b/app/layout.tsx new file mode 100644 index 0000000..a53c056 --- /dev/null +++ b/app/layout.tsx @@ -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 ( + + {children} + + ) +} + diff --git a/app/page.tsx b/app/page.tsx new file mode 100644 index 0000000..33b71ae --- /dev/null +++ b/app/page.tsx @@ -0,0 +1,15 @@ +import Header from './components/Header' +import Bio from './components/Bio' +import Footer from './components/Footer' + +export default function Home() { + return ( +
+
+
+ +
+
+
+ ) +} diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000..c85fb67 --- /dev/null +++ b/eslint.config.mjs @@ -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; diff --git a/next.config.ts b/next.config.ts new file mode 100644 index 0000000..e9ffa30 --- /dev/null +++ b/next.config.ts @@ -0,0 +1,7 @@ +import type { NextConfig } from "next"; + +const nextConfig: NextConfig = { + /* config options here */ +}; + +export default nextConfig; diff --git a/package.json b/package.json new file mode 100644 index 0000000..a9615ed --- /dev/null +++ b/package.json @@ -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" + } +} diff --git a/postcss.config.mjs b/postcss.config.mjs new file mode 100644 index 0000000..1a69fd2 --- /dev/null +++ b/postcss.config.mjs @@ -0,0 +1,8 @@ +/** @type {import('postcss-load-config').Config} */ +const config = { + plugins: { + tailwindcss: {}, + }, +}; + +export default config; diff --git a/public/ihatenodejs.jpg b/public/ihatenodejs.jpg new file mode 100644 index 0000000000000000000000000000000000000000..048835acadf2ea25aca4c658510a42197c569730 GIT binary patch literal 20015 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