diff --git a/app/about/page.tsx b/app/about/page.tsx index 152572a..f0b4fed 100644 --- a/app/about/page.tsx +++ b/app/about/page.tsx @@ -33,12 +33,12 @@ export default function About() {
-
+
-

- {t('about.title')} -

+

+ {t('about.title')} +

{mainStrings.map((section, index) => { @@ -60,15 +60,15 @@ export default function About() {

{mainSections[index]}

{section.map((text, index) => (

- {text.split(/(ihatenodejs|p0ntus git|aidan)/).map((part, i) => { + {text.split(/(ihatenodejs|LibreCloud Git|aidan)/).map((part, i) => { if (part === 'ihatenodejs') { - return ihatenodejs + return GitHub } - if (part === 'p0ntus git') { - return p0ntus git + if (part === 'LibreCloud Git') { + return LibreCloud Git } if (part === 'aidan') { - return aidan + return aidan } return part })} @@ -76,17 +76,17 @@ export default function About() { ))} {!imageError && (

- ihatenodejs's Stats setImageError(true)} loading="eager" priority unoptimized /> - ihatenodejs's Top Languages{mainSections[index]} {Object.entries(section).map(([key, value], index) => (
-

{key}

+

{key}

{(value as unknown as string[]).map((text: string, index: number) => (

- {text.split(/(KernelSU-Next|LineageOS 22.2|Android 16|NixOS|Xubuntu)/).map((part, i) => { + {text.split(/(KernelSU-Next|LineageOS microG)/).map((part, i) => { if (part === 'KernelSU-Next') { return KernelSU-Next } - if (part === 'LineageOS 22.2') { - return LineageOS 22.2 - } - if (part === 'Android 16') { - return Android 16 - } - if (part === 'NixOS') { - return NixOS - } - if (part === 'Xubuntu') { - return Xubuntu + if (part === 'LineageOS microG') { + return LineageOS microG } return part })}

))} - {key === "Mobile Devices" && ( -
-
+ {key === "Phone" && ( +
))} @@ -153,18 +138,12 @@ export default function About() {

{mainSections[index]}

{section.map((text, index) => (

- {text.split(/(my Forgejo server|my phone|AfC|OnlyNano)/).map((part, i) => { - if (part === 'my Forgejo server') { - return my Forgejo server + {text.split(/(my Gitea instance|my phone)/).map((part, i) => { + if (part === 'my Gitea instance') { + return my Gitea instance } if (part === 'my phone') { - return my phone - } - if (part === 'AfC') { - return AfC - } - if (part === 'OnlyNano') { - return OnlyNano + return my phone } return part })} @@ -178,21 +157,9 @@ export default function About() {

{mainSections[index]}

{section.map((text, index) => (

- {text.split(/(p0ntus|PontusHub|ABOCN|Kowalski|@KowalskiNodeBot)/).map((part, i) => { - if (part === 'p0ntus') { - return p0ntus - } - if (part === 'PontusHub') { - return PontusHub - } - if (part === 'ABOCN') { - return ABOCN - } - if (part === 'Kowalski') { - return Kowalski - } - if (part === '@KowalskiNodeBot') { - return @KowalskiNodeBot + {text.split(/(LibreCloud)/).map((part, i) => { + if (part === 'LibreCloud') { + return LibreCloud } return part })} diff --git a/app/device/bonito/page.tsx b/app/device/bonito/page.tsx deleted file mode 100644 index cf95b1c..0000000 --- a/app/device/bonito/page.tsx +++ /dev/null @@ -1,200 +0,0 @@ -import Header from "@/components/Header" -import Footer from "@/components/Footer" -import { - Cpu, - MemoryStick, - HardDrive, - Hash, - Hammer, - Music, - Folder, - Layers, -} from "lucide-react" -import { FaGoogle, FaYoutube } from "react-icons/fa" -import { VscTerminalLinux } from "react-icons/vsc" -import { MdOutlineAndroid } from "react-icons/md" -import { LuPackageOpen } from "react-icons/lu" -import { RiTelegram2Fill } from "react-icons/ri" -import Image from "next/image" -import Link from "@/components/objects/Link" - -export default function Bonito() { - return ( -

-
-
-
-
-
- Google Pixel 3a XL (bonito) -
-
-
-

- - Pixel 3a XL -

-

bonito

-
-
-
-
-

- - Specs -

-
-

- - Chipset: Qualcomm Snapdragon 670 -

-

- - Storage: 64GB -

-

- - RAM: 4GB -

-
-
-
-

- - Modifications -

-
-

- - Kernel Version: - 4.9.337 -

-

- - ROM: - - LineageOS 22.2 - -

-

- - Root: - - Magisk - -

-
-
-
-
-
-

- - Apps -

-
-

- - Music: - - Poweramp - -

-

- - Files: - - MiXplorer Beta - -

-

- - Telegram Client: - - Nekogram - -

-

- - YouTube: - - Tubular - -

-
-
-
-

- - Modules -

-
    -
  • - - bindhosts - -
  • -
  • - - Magisk iOS Emoji - -
  • -
-
-
-
-
-
-
-
-
-
- ) -} - diff --git a/app/device/cheetah/page.tsx b/app/device/cheetah/page.tsx deleted file mode 100644 index f6d21e6..0000000 --- a/app/device/cheetah/page.tsx +++ /dev/null @@ -1,259 +0,0 @@ -import Header from "@/components/Header" -import Footer from "@/components/Footer" -import { - Cpu, - MemoryStick, - HardDrive, - Hash, - Hammer, - Music, - Folder, - Layers, - SquarePen -} from "lucide-react" -import { FaGoogle, FaYoutube } from "react-icons/fa" -import { VscTerminalLinux } from "react-icons/vsc" -import { MdOutlineAndroid } from "react-icons/md" -import { LuPackageOpen } from "react-icons/lu" -import { RiTelegram2Fill } from "react-icons/ri" -import Image from "next/image" -import Link from "@/components/objects/Link" -import { FaStarHalfStroke, FaStar } from "react-icons/fa6" - -export default function Cheetah() { - return ( -
-
-
-
-
-
- Google Pixel 7 Pro (cheetah) -
-
-
-

- - Pixel 7 Pro -

-

cheetah

-
-
-
-
-

- - Specs -

-
-

- - CPU: Google Tensor G2 -

-

- - Storage: 128GB -

-

- - RAM: 12GB -

-
-
-
-

- - Modifications -

-
-

- - Kernel: - 6.1.129-android14 -

-

- - ROM: - - Android 16 QPR1 - -

-

- - Root: - - KernelSU-Next - -

-
-
-
-
-
-

- - Apps -

-
-

- - Music: - - Qobuz - -

-

- - Files: - - MiXplorer Beta - -

-

- - TG Client: - - AyuGram - -

-

- - YouTube: - - ReVanced Extended - -

-
-
-
-

- - Modules -

-
    -
  • - - Tricky Store - -
  • -
  • - - Yurikey Manager - -
  • -
  • - - Shamiko - -
  • -
  • - - LSPosed JingMatrix - -
  • -
  • - - Zygisk Next - -
  • -
-
-
-
-
-

- - Review -

-
-

- Rating: - - - -

-
-

- Coming from a Galaxy A32 5G, the Pixel 7 Pro is a massive upgrade. The Tensor chip is highly performant, and with 12GB of RAM, the device is extremely snappy. -

-

- I have had some issues with battery, although this may be due to Play Integrity Fix, which is known to consume battery. However, the camera has been a massive improvement, and the photos it is capable of taking are amazing. -

-

- While the volume buttons did fall off, I do not discredit them for this, as Android makes it easy to have customizable on-screen volume buttons, something iPhones do not have. -

-
-
-
-
-
-
-
-
-
-
-
- ) -} - diff --git a/app/docs/page.tsx b/app/docs/page.tsx new file mode 100644 index 0000000..a607a4d --- /dev/null +++ b/app/docs/page.tsx @@ -0,0 +1,71 @@ +"use client" + +import Header from '@/components/Header' +import Footer from '@/components/Footer' +import { IoDocumentTextOutline } from "react-icons/io5" +import { Docs, Doc } from '@/components/docs/Docs' +import { useState, useEffect } from 'react' +import { Loader2 } from 'lucide-react' + +export default function DocsPage() { + const [selectedDoc, setSelectedDoc] = useState(null) + const [isClient, setIsClient] = useState(false) + + useEffect(() => { + setSelectedDoc(Docs.Overview) + setIsClient(true) + }, []) + + return ( +
+
+
+
+
+ +

+ Docs +

+
+ + An organized collection of advice. + +
+
+
+

Concepts

+
+ {Object.values(Docs).map((doc: Doc) => ( +
setSelectedDoc(doc)} + > +
+ {doc.icon} + {doc.title} +
+
+ ))} +
+
+ +
+ {isClient && selectedDoc ? ( + selectedDoc.component + ) : ( +
+ + Loading... +
+ )} +
+
+
+
+
+ ) +} \ No newline at end of file diff --git a/app/music/page.tsx b/app/music/page.tsx new file mode 100644 index 0000000..dacb362 --- /dev/null +++ b/app/music/page.tsx @@ -0,0 +1,26 @@ +import Header from '@/components/Header' +import MusicWidget from '@/components/widgets/Music' +import MusicInfo from '@/components/objects/MusicInfo' +import Footer from '@/components/Footer' +import { Music as MusicNote } from "lucide-react"; + +export default function Music() { + return ( +
+
+
+
+ +
+

+ Music and Me +

+
+ + +
+
+
+
+ ) +} \ No newline at end of file diff --git a/app/page.tsx b/app/page.tsx index 9f23faa..2df63fe 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -3,6 +3,7 @@ import Header from '@/components/Header' import Footer from '@/components/Footer' import Button from '@/components/objects/Button' +import Link from '@/components/objects/Link' import LastPlayed from '@/components/widgets/NowPlaying' import Image from 'next/image' import { CreditCard, Mail, PillBottle, Scale } from 'lucide-react' @@ -52,6 +53,15 @@ export default function Home() { {mainStrings[secIndex].map((text: string, index: number) => (

{text} + {secIndex === 2 && index === 2 && ( + <> + {' '} + + CVE-2025-29927 + + . + + )}

))} @@ -70,6 +80,7 @@ export default function Home() {

{t('home.donation.title')}

{t('home.donation.description')}

+

{t('home.donation.charities.title')}

+ ) +} + diff --git a/app/time-periods/early-summer-2024/page.tsx b/app/time-periods/early-summer-2024/page.tsx new file mode 100644 index 0000000..15869fd --- /dev/null +++ b/app/time-periods/early-summer-2024/page.tsx @@ -0,0 +1,15 @@ +import Header from '@/components/Header' +import WhatWasGoingOn from '@/components/pages/time-periods/early-summer-2024/WhatWasGoingOn' +import Footer from '@/components/Footer' + +export default function EarlySummer2024() { + return ( +
+
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/app/time-periods/early-summer-2024/what-was-going-on/page.tsx b/app/time-periods/early-summer-2024/what-was-going-on/page.tsx new file mode 100644 index 0000000..31a9ee4 --- /dev/null +++ b/app/time-periods/early-summer-2024/what-was-going-on/page.tsx @@ -0,0 +1,15 @@ +import Header from '@/components/Header' +import WhatWasGoingOn from '@/components/pages/time-periods/early-summer-2024/WhatWasGoingOn' +import Footer from '@/components/Footer' + +export default function Music() { + return ( +
+
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/app/time-periods/late-summer-2024/page.tsx b/app/time-periods/late-summer-2024/page.tsx new file mode 100644 index 0000000..d45de92 --- /dev/null +++ b/app/time-periods/late-summer-2024/page.tsx @@ -0,0 +1,15 @@ +import Header from '@/components/Header' +import WhatWasGoingOn from '@/components/pages/time-periods/late-summer-2024/WhatWasGoingOn' +import Footer from '@/components/Footer' + +export default function LateSummer2024() { + return ( +
+
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/app/time-periods/late-summer-2024/what-was-going-on/page.tsx b/app/time-periods/late-summer-2024/what-was-going-on/page.tsx new file mode 100644 index 0000000..353e524 --- /dev/null +++ b/app/time-periods/late-summer-2024/what-was-going-on/page.tsx @@ -0,0 +1,15 @@ +import Header from '@/components/Header' +import WhatWasGoingOn from '@/components/pages/time-periods/late-summer-2024/WhatWasGoingOn' +import Footer from '@/components/Footer' + +export default function Music() { + return ( +
+
+
+ +
+
+
+ ) +} \ No newline at end of file diff --git a/components/Header.tsx b/components/Header.tsx index 68cc54e..4c8efbd 100644 --- a/components/Header.tsx +++ b/components/Header.tsx @@ -2,18 +2,7 @@ import React, { useState, useRef, useEffect } from 'react' import Link from 'next/link' -import { - House, - Link as LinkIcon, - User, - Phone, - BookOpen, - Rss, - X, - Menu, - Globe, - ChevronDown -} from 'lucide-react' +import { House, Link as LinkIcon, User, Phone, BookOpen, Music, Rss, X, Menu, Globe, ChevronDown } from 'lucide-react' import { useTranslation } from 'react-i18next' interface NavItemProps { @@ -36,7 +25,7 @@ const LanguageSelector = () => { const [isOpen, setIsOpen] = useState(false); const [isMobile, setIsMobile] = useState(false); const dropdownRef = useRef(null); - + const languages = [ { code: 'en-US', name: 'English' }, ]; @@ -45,7 +34,7 @@ const LanguageSelector = () => { const checkMobile = () => { setIsMobile(window.innerWidth < 1024); }; - + checkMobile(); window.addEventListener('resize', checkMobile); return () => window.removeEventListener('resize', checkMobile); @@ -88,7 +77,7 @@ const LanguageSelector = () => { return (
- {isOpen && ( -
Contact Domains Manifesto + Music Blog
diff --git a/components/docs/Docs.tsx b/components/docs/Docs.tsx new file mode 100644 index 0000000..a80eaa9 --- /dev/null +++ b/components/docs/Docs.tsx @@ -0,0 +1,22 @@ +import { House, Brain } from "lucide-react" +import { Overview } from "@/components/docs/pages/Overview" +import { MentalHealth } from "@/components/docs/pages/MentalHealth" + +export interface Doc { + title: string + component: React.ReactNode + icon: React.ReactNode +} + +export const Docs: Record = { + Overview: { + "title": "Overview", + "component": , + "icon": + }, + MentalHealth: { + "title": "Mental Health", + "component": , + "icon": + } +} \ No newline at end of file diff --git a/components/docs/pages/MentalHealth.tsx b/components/docs/pages/MentalHealth.tsx new file mode 100644 index 0000000..f23fae0 --- /dev/null +++ b/components/docs/pages/MentalHealth.tsx @@ -0,0 +1,10 @@ +export function MentalHealth() { + return ( +
+

Mental Health

+

+ --- +

+
+ ) +} \ No newline at end of file diff --git a/components/docs/pages/Overview.tsx b/components/docs/pages/Overview.tsx new file mode 100644 index 0000000..73e5cd8 --- /dev/null +++ b/components/docs/pages/Overview.tsx @@ -0,0 +1,35 @@ +import Link from "@/components/objects/Link" + +export function Overview() { + return ( +
+
+

+ Overview +

+

+ It's time to get a cup of coffee! +

+
+
+

Docs is the space where I share my thoughts and advice on a variety of topics. All of the content is Unlicensed, meaning you are free to use it however you please. All content on this website is not legal, medical, financial, or professional advice.

+
+

+ Reading +

+

+ While reading, I hope you will consider the following: +

+
    +
  • + Even if your opinion is different than mine, that does not mean you're wrong. +
  • +
  • + Take all advice with a grain of salt; nobody lives the same life as you do. +
  • +
+
+
+
+ ) +} \ No newline at end of file diff --git a/components/objects/MusicInfo.tsx b/components/objects/MusicInfo.tsx new file mode 100644 index 0000000..450cf8e --- /dev/null +++ b/components/objects/MusicInfo.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import Button from './Button'; + +interface TimePeriod { + title: string; + slug: string; +} + +const timePeriods: TimePeriod[] = [ + { title: 'Late Summer 2024', slug: 'late-summer-2024' }, + { title: 'Early Summer 2024', slug: 'early-summer-2024' }, +]; + +const MusicInfo: React.FC = () => { + return ( +
+ {timePeriods.map((period) => ( +
+

{period.title}

+
+ ))} +
+ ); +}; + +export default MusicInfo; + diff --git a/components/objects/RandomFooterMsg.tsx b/components/objects/RandomFooterMsg.tsx index 5a5a4a4..41a86a4 100644 --- a/components/objects/RandomFooterMsg.tsx +++ b/components/objects/RandomFooterMsg.tsx @@ -1,16 +1,14 @@ -"use client" - import { SiNextdotjs, SiLucide, SiVercel, + SiCloudflarepages, SiSimpleicons, SiFontawesome, SiShadcnui, SiTailwindcss } from "react-icons/si" import Link from 'next/link' -import { useState, useEffect } from 'react' export const footerMessages = [ [ @@ -33,6 +31,11 @@ export const footerMessages = [ "https://vercel.com/font", ], + [ + "Hosted by Cloudflare", + "https://workers.cloudflare.com/", + + ], [ "Icons by Font Awesome", "https://fontawesome.com/", @@ -51,30 +54,11 @@ export const footerMessages = [ ] export default function RandomFooterMsg() { - const [randomIndex, setRandomIndex] = useState(0) - const [isMounted, setIsMounted] = useState(false) - - useEffect(() => { - setIsMounted(true) - setRandomIndex(Math.floor(Math.random() * footerMessages.length)) - }, []) - - if (!isMounted) { - const [message, url, icon] = footerMessages[0] - return ( - -
- {icon} - {message} -
- - ) - } - + const randomIndex = Math.floor(Math.random() * footerMessages.length) const [message, url, icon] = footerMessages[randomIndex] return ( - +
{icon} {message} diff --git a/components/pages/time-periods/early-summer-2024/WhatWasGoingOn.tsx b/components/pages/time-periods/early-summer-2024/WhatWasGoingOn.tsx new file mode 100644 index 0000000..6689389 --- /dev/null +++ b/components/pages/time-periods/early-summer-2024/WhatWasGoingOn.tsx @@ -0,0 +1,27 @@ +import React from 'react' +import BackButton from '@/components/objects/BackButton' + +const WhatWasGoingOnLateSummer2024: React.FC = () => { + return ( +
+

+ What was going on during the start of summer 2024? +

+
+

+ During Early Summer 2024, I was walking a ton in towns all across Massachusetts. During this time, I would listen to a lot of music. I regret not finding out about LastFM for so long... During this time, I was always happy, especially when I had music or a YouTube video playing. I would also call my friends often during this time. +

+

Context

+

+ This summer was the one where I came back from my abusive treatment center. I was finally free from the place that had been holding me back for so long. So as you can imagine, I felt free as a bird. +

+

+ With this chance to explore, being in so many different towns, I really had a good time and made good memories, which I will not be writing about. +

+ +
+
+ ); +}; + +export default WhatWasGoingOnLateSummer2024; \ No newline at end of file diff --git a/components/pages/time-periods/late-summer-2024/WhatWasGoingOn.tsx b/components/pages/time-periods/late-summer-2024/WhatWasGoingOn.tsx new file mode 100644 index 0000000..9f5b03c --- /dev/null +++ b/components/pages/time-periods/late-summer-2024/WhatWasGoingOn.tsx @@ -0,0 +1,26 @@ +import React from 'react' +import BackButton from '@/components/objects/BackButton' + +const WhatWasGoingOnLateSummer2024: React.FC = () => { + return ( +
+

+ What was going on during the end of summer 2024? +

+
+

+ During late summer 2024, my depression and the "after effects" of treatment really kicked in. I had quit going to my therapist as I didn't feel like they were doing much of anything for me. I am very happy to say that since I quit my therapist, I have been doing much better. +

+

+ At this time, the baseball season was over, so I was walking around much less. I was still listening to a lot of music and I started getting into less depressed songs. I was also starting to get into more "normal" music, which was an interesting phase (which I believe I'm still in). +

+

+ A highlight of late summer 2024 was a vacation I took. This vacation has entire albums which remind me of it and I will always cherish those memories deeply. +

+ +
+
+ ); +}; + +export default WhatWasGoingOnLateSummer2024; diff --git a/components/widgets/FeaturedRepos.tsx b/components/widgets/FeaturedRepos.tsx index 7dc5ef6..36e76ab 100644 --- a/components/widgets/FeaturedRepos.tsx +++ b/components/widgets/FeaturedRepos.tsx @@ -1,8 +1,9 @@ -import { SiGithub, SiForgejo } from "react-icons/si" -import { TbStar, TbGitBranch } from "react-icons/tb" -import featuredProjects from "@/public/data/featured.json" -import Link from "next/link" -import { cn } from "@/lib/utils" +import { FontAwesomeIcon } from '@fortawesome/react-fontawesome' +import { faGitAlt, faGithub } from '@fortawesome/free-brands-svg-icons' +import { faStar, faCodeBranch } from '@fortawesome/free-solid-svg-icons' +import featuredProjects from '@/public/data/featured.json' +import Link from 'next/link' +import { cn } from '@/lib/utils' export default function GitHubFeatured({ className }: { className?: string }) { return ( @@ -10,16 +11,16 @@ export default function GitHubFeatured({ className }: { className?: string }) { {featuredProjects.map((project) => (
-

- {project.github ? : } {project.name} +

+ {project.name}

{project.description}

View Repo
- {project.stars} - {project.forks} + {project.stars} + {project.forks}
diff --git a/components/widgets/Music.tsx b/components/widgets/Music.tsx new file mode 100644 index 0000000..ca3dce3 --- /dev/null +++ b/components/widgets/Music.tsx @@ -0,0 +1,127 @@ +"use client" + +import { useState, useEffect } from "react" +import Image from "next/image" +import { Play, SkipBack, SkipForward } from "lucide-react" +import LoadingSpinner from "../objects/LoadingSpinner" +import { SeekBar } from "@/components/objects/SeekBar" + +interface Song { + albumArt: string + name: string + artist: string + duration: string + link?: string +} + +interface Period { + timePeriod: string + songs: Song[] +} + +export default function Home() { + const [timePeriod, setTimePeriod] = useState("Early Summer 2024") + const [songs, setSongs] = useState([]) + const [currentIndex, setCurrentIndex] = useState(0) + const [isLoading, setIsLoading] = useState(true) + const [currentPosition, setCurrentPosition] = useState(0) + + useEffect(() => { + setIsLoading(true) + fetch("/data/music.json") + .then((response) => response.json()) + .then((data: Period[]) => { + const selectedPeriod = data.find((period) => period.timePeriod === timePeriod) + const songsList = selectedPeriod ? selectedPeriod.songs : [] + setSongs(songsList) + const newIndex = Math.floor(Math.random() * songsList.length) + setCurrentIndex(newIndex) + // Set initial random position for the selected song + if (songsList.length > 0) { + const durationInSeconds = parseDuration(songsList[newIndex]?.duration || "0:00") + setCurrentPosition(Math.floor(Math.random() * durationInSeconds)) + } + setIsLoading(false) + }) + .catch((error) => { + console.error("Error fetching music data:", error) + setIsLoading(false) + }) + }, [timePeriod]) + + const handleNext = () => { + setCurrentIndex((prevIndex) => { + const nextIndex = (prevIndex + 1) % songs.length + const durationInSeconds = parseDuration(songs[nextIndex].duration) + setCurrentPosition(Math.floor(Math.random() * durationInSeconds)) + return nextIndex + }) + } + + const handlePrevious = () => { + setCurrentIndex((prevIndex) => { + const nextIndex = (prevIndex - 1 + songs.length) % songs.length + const durationInSeconds = parseDuration(songs[nextIndex].duration) + setCurrentPosition(Math.floor(Math.random() * durationInSeconds)) + return nextIndex + }) + } + + const parseDuration = (duration: string): number => { + const [minutes, seconds] = duration.split(":").map(Number) + return minutes * 60 + seconds + } + + return ( +
+ +
+ ) +} + diff --git a/package-lock.json b/package-lock.json index c1e921f..6572658 100644 --- a/package-lock.json +++ b/package-lock.json @@ -31,14 +31,14 @@ }, "devDependencies": { "@eslint/eslintrc": "^3.3.1", - "@tailwindcss/postcss": "^4.1.5", + "@tailwindcss/postcss": "^4.1.6", "@types/node": "^20.17.46", "@types/react": "^19.1.3", "@types/react-dom": "^19.1.3", "eslint": "^9.26.0", "eslint-config-next": "15.1.3", "postcss": "^8.5.3", - "tailwindcss": "^4.1.5", + "tailwindcss": "^4.1.6", "typescript": "^5.8.3" } }, @@ -55,6 +55,20 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { "version": "7.27.1", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.1.tgz", @@ -736,6 +750,72 @@ "url": "https://opencollective.com/libvips" } }, + "node_modules/@isaacs/fs-minipass": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", + "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", + "dev": true, + "license": "ISC", + "dependencies": { + "minipass": "^7.0.4" + }, + "engines": { + "node": ">=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@modelcontextprotocol/sdk": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.11.1.tgz", @@ -1088,46 +1168,54 @@ } }, "node_modules/@tailwindcss/node": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.5.tgz", - "integrity": "sha512-CBhSWo0vLnWhXIvpD0qsPephiaUYfHUX3U9anwDaHZAeuGpTiB3XmsxPAN6qX7bFhipyGBqOa1QYQVVhkOUGxg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.6.tgz", + "integrity": "sha512-ed6zQbgmKsjsVvodAS1q1Ld2BolEuxJOSyyNc+vhkjdmfNUDCmQnlXBfQkHrlzNmslxHsQU/bFmzcEbv4xXsLg==", "dev": true, "license": "MIT", "dependencies": { + "@ampproject/remapping": "^2.3.0", "enhanced-resolve": "^5.18.1", "jiti": "^2.4.2", "lightningcss": "1.29.2", - "tailwindcss": "4.1.5" + "magic-string": "^0.30.17", + "source-map-js": "^1.2.1", + "tailwindcss": "4.1.6" } }, "node_modules/@tailwindcss/oxide": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.5.tgz", - "integrity": "sha512-1n4br1znquEvyW/QuqMKQZlBen+jxAbvyduU87RS8R3tUSvByAkcaMTkJepNIrTlYhD+U25K4iiCIxE6BGdRYA==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.6.tgz", + "integrity": "sha512-0bpEBQiGx+227fW4G0fLQ8vuvyy5rsB1YIYNapTq3aRsJ9taF3f5cCaovDjN5pUGKKzcpMrZst/mhNaKAPOHOA==", "dev": true, + "hasInstallScript": true, "license": "MIT", + "dependencies": { + "detect-libc": "^2.0.4", + "tar": "^7.4.3" + }, "engines": { "node": ">= 10" }, "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-arm64": "4.1.5", - "@tailwindcss/oxide-darwin-x64": "4.1.5", - "@tailwindcss/oxide-freebsd-x64": "4.1.5", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.5", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.5", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.5", - "@tailwindcss/oxide-linux-x64-musl": "4.1.5", - "@tailwindcss/oxide-wasm32-wasi": "4.1.5", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.5", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.5" + "@tailwindcss/oxide-android-arm64": "4.1.6", + "@tailwindcss/oxide-darwin-arm64": "4.1.6", + "@tailwindcss/oxide-darwin-x64": "4.1.6", + "@tailwindcss/oxide-freebsd-x64": "4.1.6", + "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.6", + "@tailwindcss/oxide-linux-arm64-gnu": "4.1.6", + "@tailwindcss/oxide-linux-arm64-musl": "4.1.6", + "@tailwindcss/oxide-linux-x64-gnu": "4.1.6", + "@tailwindcss/oxide-linux-x64-musl": "4.1.6", + "@tailwindcss/oxide-wasm32-wasi": "4.1.6", + "@tailwindcss/oxide-win32-arm64-msvc": "4.1.6", + "@tailwindcss/oxide-win32-x64-msvc": "4.1.6" } }, "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.5.tgz", - "integrity": "sha512-LVvM0GirXHED02j7hSECm8l9GGJ1RfgpWCW+DRn5TvSaxVsv28gRtoL4aWKGnXqwvI3zu1GABeDNDVZeDPOQrw==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.6.tgz", + "integrity": "sha512-VHwwPiwXtdIvOvqT/0/FLH/pizTVu78FOnI9jQo64kSAikFSZT7K4pjyzoDpSMaveJTGyAKvDjuhxJxKfmvjiQ==", "cpu": [ "arm64" ], @@ -1142,9 +1230,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.5.tgz", - "integrity": "sha512-//TfCA3pNrgnw4rRJOqavW7XUk8gsg9ddi8cwcsWXp99tzdBAZW0WXrD8wDyNbqjW316Pk2hiN/NJx/KWHl8oA==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.6.tgz", + "integrity": "sha512-weINOCcqv1HVBIGptNrk7c6lWgSFFiQMcCpKM4tnVi5x8OY2v1FrV76jwLukfT6pL1hyajc06tyVmZFYXoxvhQ==", "cpu": [ "arm64" ], @@ -1159,9 +1247,9 @@ } }, "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.5.tgz", - "integrity": "sha512-XQorp3Q6/WzRd9OalgHgaqgEbjP3qjHrlSUb5k1EuS1Z9NE9+BbzSORraO+ecW432cbCN7RVGGL/lSnHxcd+7Q==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.6.tgz", + "integrity": "sha512-3FzekhHG0ww1zQjQ1lPoq0wPrAIVXAbUkWdWM8u5BnYFZgb9ja5ejBqyTgjpo5mfy0hFOoMnMuVDI+7CXhXZaQ==", "cpu": [ "x64" ], @@ -1176,9 +1264,9 @@ } }, "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.5.tgz", - "integrity": "sha512-bPrLWbxo8gAo97ZmrCbOdtlz/Dkuy8NK97aFbVpkJ2nJ2Jo/rsCbu0TlGx8joCuA3q6vMWTSn01JY46iwG+clg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.6.tgz", + "integrity": "sha512-4m5F5lpkBZhVQJq53oe5XgJ+aFYWdrgkMwViHjRsES3KEu2m1udR21B1I77RUqie0ZYNscFzY1v9aDssMBZ/1w==", "cpu": [ "x64" ], @@ -1193,9 +1281,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.5.tgz", - "integrity": "sha512-1gtQJY9JzMAhgAfvd/ZaVOjh/Ju/nCoAsvOVJenWZfs05wb8zq+GOTnZALWGqKIYEtyNpCzvMk+ocGpxwdvaVg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.6.tgz", + "integrity": "sha512-qU0rHnA9P/ZoaDKouU1oGPxPWzDKtIfX7eOGi5jOWJKdxieUJdVV+CxWZOpDWlYTd4N3sFQvcnVLJWJ1cLP5TA==", "cpu": [ "arm" ], @@ -1210,9 +1298,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.5.tgz", - "integrity": "sha512-dtlaHU2v7MtdxBXoqhxwsWjav7oim7Whc6S9wq/i/uUMTWAzq/gijq1InSgn2yTnh43kR+SFvcSyEF0GCNu1PQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.6.tgz", + "integrity": "sha512-jXy3TSTrbfgyd3UxPQeXC3wm8DAgmigzar99Km9Sf6L2OFfn/k+u3VqmpgHQw5QNfCpPe43em6Q7V76Wx7ogIQ==", "cpu": [ "arm64" ], @@ -1227,9 +1315,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.5.tgz", - "integrity": "sha512-fg0F6nAeYcJ3CriqDT1iVrqALMwD37+sLzXs8Rjy8Z1ZHshJoYceodfyUwGJEsQoTyWbliFNRs2wMQNXtT7MVA==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.6.tgz", + "integrity": "sha512-8kjivE5xW0qAQ9HX9reVFmZj3t+VmljDLVRJpVBEoTR+3bKMnvC7iLcoSGNIUJGOZy1mLVq7x/gerVg0T+IsYw==", "cpu": [ "arm64" ], @@ -1244,9 +1332,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.5.tgz", - "integrity": "sha512-SO+F2YEIAHa1AITwc8oPwMOWhgorPzzcbhWEb+4oLi953h45FklDmM8dPSZ7hNHpIk9p/SCZKUYn35t5fjGtHA==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.6.tgz", + "integrity": "sha512-A4spQhwnWVpjWDLXnOW9PSinO2PTKJQNRmL/aIl2U/O+RARls8doDfs6R41+DAXK0ccacvRyDpR46aVQJJCoCg==", "cpu": [ "x64" ], @@ -1261,9 +1349,9 @@ } }, "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.5.tgz", - "integrity": "sha512-6UbBBplywkk/R+PqqioskUeXfKcBht3KU7juTi1UszJLx0KPXUo10v2Ok04iBJIaDPkIFkUOVboXms5Yxvaz+g==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.6.tgz", + "integrity": "sha512-YRee+6ZqdzgiQAHVSLfl3RYmqeeaWVCk796MhXhLQu2kJu2COHBkqlqsqKYx3p8Hmk5pGCQd2jTAoMWWFeyG2A==", "cpu": [ "x64" ], @@ -1278,9 +1366,9 @@ } }, "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.5.tgz", - "integrity": "sha512-hwALf2K9FHuiXTPqmo1KeOb83fTRNbe9r/Ixv9ZNQ/R24yw8Ge1HOWDDgTdtzntIaIUJG5dfXCf4g9AD4RiyhQ==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.6.tgz", + "integrity": "sha512-qAp4ooTYrBQ5pk5jgg54/U1rCJ/9FLYOkkQ/nTE+bVMseMfB6O7J8zb19YTpWuu4UdfRf5zzOrNKfl6T64MNrQ==", "bundleDependencies": [ "@napi-rs/wasm-runtime", "@emnapi/core", @@ -1308,9 +1396,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.5.tgz", - "integrity": "sha512-oDKncffWzaovJbkuR7/OTNFRJQVdiw/n8HnzaCItrNQUeQgjy7oUiYpsm9HUBgpmvmDpSSbGaCa2Evzvk3eFmA==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.6.tgz", + "integrity": "sha512-nqpDWk0Xr8ELO/nfRUDjk1pc9wDJ3ObeDdNMHLaymc4PJBWj11gdPCWZFKSK2AVKjJQC7J2EfmSmf47GN7OuLg==", "cpu": [ "arm64" ], @@ -1325,9 +1413,9 @@ } }, "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.5.tgz", - "integrity": "sha512-WiR4dtyrFdbb+ov0LK+7XsFOsG+0xs0PKZKkt41KDn9jYpO7baE3bXiudPVkTqUEwNfiglCygQHl2jklvSBi7Q==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.6.tgz", + "integrity": "sha512-5k9xF33xkfKpo9wCvYcegQ21VwIBU1/qEbYlVukfEIyQbEA47uK8AAwS7NVjNE3vHzcmxMYwd0l6L4pPjjm1rQ==", "cpu": [ "x64" ], @@ -1342,17 +1430,17 @@ } }, "node_modules/@tailwindcss/postcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.5.tgz", - "integrity": "sha512-5lAC2/pzuyfhsFgk6I58HcNy6vPK3dV/PoPxSDuOTVbDvCddYHzHiJZZInGIY0venvzzfrTEUAXJFULAfFmObg==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@tailwindcss/postcss/-/postcss-4.1.6.tgz", + "integrity": "sha512-ELq+gDMBuRXPJlpE3PEen+1MhnHAQQrh2zF0dI1NXOlEWfr2qWf2CQdr5jl9yANv8RErQaQ2l6nIFO9OSCVq/g==", "dev": true, "license": "MIT", "dependencies": { "@alloc/quick-lru": "^5.2.0", - "@tailwindcss/node": "4.1.5", - "@tailwindcss/oxide": "4.1.5", + "@tailwindcss/node": "4.1.6", + "@tailwindcss/oxide": "4.1.6", "postcss": "^8.4.41", - "tailwindcss": "4.1.5" + "tailwindcss": "4.1.6" } }, "node_modules/@tybys/wasm-util": { @@ -2362,6 +2450,16 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, + "node_modules/chownr": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", + "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/class-variance-authority": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/class-variance-authority/-/class-variance-authority-0.7.1.tgz", @@ -4893,6 +4991,16 @@ "react": "^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -4996,6 +5104,45 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/minizlib": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", + "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", + "dev": true, + "license": "MIT", + "dependencies": { + "minipass": "^7.1.2" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/mkdirp": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", + "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", + "dev": true, + "license": "MIT", + "bin": { + "mkdirp": "dist/cjs/src/bin.js" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6371,9 +6518,9 @@ } }, "node_modules/tailwindcss": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.5.tgz", - "integrity": "sha512-nYtSPfWGDiWgCkwQG/m+aX83XCwf62sBgg3bIlNiiOcggnS1x3uVRDAuyelBFL+vJdOPPCGElxv9DjHJjRHiVA==", + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.6.tgz", + "integrity": "sha512-j0cGLTreM6u4OWzBeLBpycK0WIh8w7kSwcUsQZoGLHZ7xDTdM69lN64AgoIEEwFi0tnhs4wSykUa5YWxAzgFYg==", "license": "MIT" }, "node_modules/tailwindcss-animate": { @@ -6395,6 +6542,24 @@ "node": ">=6" } }, + "node_modules/tar": { + "version": "7.4.3", + "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", + "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", + "dev": true, + "license": "ISC", + "dependencies": { + "@isaacs/fs-minipass": "^4.0.0", + "chownr": "^3.0.0", + "minipass": "^7.1.2", + "minizlib": "^3.0.1", + "mkdirp": "^3.0.1", + "yallist": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/tinyglobby": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", @@ -6844,6 +7009,16 @@ "dev": true, "license": "ISC" }, + "node_modules/yallist": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", + "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/public/data/featured.json b/public/data/featured.json index 807371e..f28b2ea 100644 --- a/public/data/featured.json +++ b/public/data/featured.json @@ -4,35 +4,35 @@ "name": "aidxnCC", "description": "aidxnCC is the third version of my personal website", "github": false, - "url": "https://git.p0ntus.com/aidan/aidxnCC", - "stars": 1, - "forks": 0 + "url": "https://git.pontusmail.org/aidan/aidxnCC", + "stars": 2, + "forks": 1 }, { "id": 2, - "name": "abocn/TelegramBot", + "name": "librecloud/web", "description": "Landing page for p0ntus mail", - "github": true, - "url": "https://github.com/abocn/TelegramBot", - "stars": 13, - "forks": 6 - }, - { - "id": 3, - "name": "mail-connect", - "description": "API bridge for docker-mailserver", - "github": true, - "url": "https://github.com/ihatenodejs/mail-connect", + "github": false, + "url": "https://git.pontusmail.org/librecloud/web", "stars": 0, "forks": 0 }, { - "id": 4, - "name": "pontus/pontus-front", - "description": "The frontend and API for p0ntus, my free privacy-focused service provider", + "id": 3, + "name": "modules", + "description": "An open-source Magisk module and FOSS app store", "github": false, - "url": "https://git.p0ntus.com/pontus/pontus-front", - "stars": 1, + "url": "https://git.pontusmail.org/aidan/modules", + "stars": 3, "forks": 0 + }, + { + "id": 4, + "name": "AndroidIntegrity/website", + "description": "AIA website source code", + "github": true, + "url": "https://github.com/AndroidIntegrity/website", + "stars": 6, + "forks": 1 } ] diff --git a/public/data/music.json b/public/data/music.json new file mode 100644 index 0000000..8c01d75 --- /dev/null +++ b/public/data/music.json @@ -0,0 +1,56 @@ +[ + { + "timePeriod": "Early Summer 2024", + "songs": [ + { + "albumArt": "https://p0ntus.com/archives/img/noticeme.png", + "name": "Notice Me", + "artist": "tobi lou feat. MIA GLADSTONE", + "duration": "2:35", + "link": "https://www.last.fm/music/tobi+lou/Notice+Me" + }, + { + "albumArt": "https://p0ntus.com/archives/img/comforttexas.webp", + "name": "comfort, texas", + "artist": "Buppy.", + "duration": "2:11", + "link": "https://www.last.fm/music/Buppy./comfort,+texas" + }, + { + "albumArt": "https://p0ntus.com/archives/img/nonperishable.webp", + "name": "Jelly", + "artist": "tobi lou", + "duration": "1:50", + "link": "https://www.last.fm/music/tobi+lou/_/Jelly" + }, + { + "albumArt": "https://p0ntus.com/archives/img/exes.webp", + "name": "exes", + "artist": "Tate McRae", + "duration": "2:39", + "link": "https://www.last.fm/music/Tate+McRae/exes/exes" + }, + { + "albumArt": "https://p0ntus.com/archives/img/ick.webp", + "name": "Ick", + "artist": "Lay Bankz", + "duration": "1:55", + "link": "https://www.last.fm/music/Lay+Bankz/_/Ick" + }, + { + "albumArt": "https://p0ntus.com/archives/img/nani.webp", + "name": "NANi", + "artist": "Saweetie", + "duration": "2:34", + "link": "https://www.last.fm/music/Saweetie/Nani" + }, + { + "albumArt": "https://p0ntus.com/archives/img/killerloverboy.webp", + "name": "killer lover boy", + "artist": "SEB", + "duration": "2:14", + "link": "https://www.last.fm/music/Seb/_/killer+lover+boy" + } + ] + } + ] \ No newline at end of file diff --git a/public/img/bonito.png b/public/img/bonito.png deleted file mode 100644 index 4b418e7..0000000 Binary files a/public/img/bonito.png and /dev/null differ diff --git a/public/locales/en-US.json b/public/locales/en-US.json index 65c849a..4ce5aab 100644 --- a/public/locales/en-US.json +++ b/public/locales/en-US.json @@ -14,7 +14,7 @@ "whereYouAre": [ "I am not here to brag about my accomplishments or plug my cool SaaS product. That's why I've made every effort to make this website as personal and fun as possible.", "I hope you find this website an interesting place to find more about me, but also learn something new, and inspire a new project or two.", - "In a technical sense, this site is hosted on my NY1 dedicated server, hosted by ColoCrossing out of Buffalo, New York." + "This page is currently hosted on Cloudflare Workers, after what happened with " ], "sections": { "whoIAm": "Who I am", @@ -88,35 +88,31 @@ "featuredProjects": "Featured Projects" }, "projects": [ - "I have worked on countless projects over the past five years, for the most part. I started learning to code with Python when I was seven and my interest has only evolved from there. I got into web development due to my uncle, who taught my how to write my first lines of HTML.", - "Recently, I have been involved in developing several projects, especially with TypeScript, which is my new favorite language as of a year ago. My biggest project currently is p0ntus, a free service provider for privacy-focused individuals.", - "Me and my developer friends operate an organization called ABOCN, where we primarily maintain a Telegram bot called Kowalski. You can find it on Telegram as @KowalskiNodeBot.", - "I have learned system administration from the past three years of learning Linux for practical use and fun. I currently operate four servers running in the cloud, ran out of Canada, Germany, and the United States.", - "I own a channel called PontusHub on Telegram, where I post updates about my projects, along with commentary and info about my projects related to the Android rooting community." + "I have worked on countless projects over the past five years, for the most part. I have been learning to program in Python since I was seven and have evolved from there. I got into web development due to my uncle, who taught my how to write my first lines of HTML.", + "Recently, I have been involved in developing several projects, especially with Node.js, my new favorite language as of a year ago. My biggest project is LibreCloud, a free service provider for individuals.", + "In terms of system administration, I have developed my skills over the past three years of learning Linux for fun. I currently operate three servers running in the cloud, which run out of Germany and the United States." ], "hobbies": [ - "When I'm not programming, I can typically be found distro hopping or flashing a new ROM to my phone. I also spend a lot of time spreading Next.js and TypeScript propaganda to JavaScript developers.", - "I consider maintaining my devices as a hobby as well, as I devote a lot of time to it. I genuinely enjoy installing Arch, Gentoo, and NixOS frequently, and flashing new ROMs to the phones I own.", - "I am frequently active on my Forgejo server and GitHub, and aim to make daily contributions. 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!", - "When I touch grass, I prefer to walk on the streets, especially in Boston, Massachusetts. I also used to swim competitively, though it has turned into to a casual hobby over time.", - "Editing Wikipedia has also been a good pastime for me, and I have been editing for a year and a half now. As of writing, I have made 6.1k edits to the English Wikipedia. I am also an AfC reviewer, new page reviewer, and rollbacker. You can find me on Wikipedia as OnlyNano." + "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 consider maintaining my technology as a hobby as well, as I devote a lot of time to it. I currently run Gentoo Linux on my Thinkpad T470s, which does not use a single bin package. I am very proud of this laptop, despite it's constant need for compiling updates.", + "I am almost always active on my Gitea instance and 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!", + "My Google Pixel 7 Pro (cheetah) runs LineageOS 22.1, and has been one of my favorite additions to my life. It is proudly rooted with KernelSU-Next. It has suffered one drop to it's back on a tile floor." ], "devices": { - "Mobile Devices": [ - "I use a Google Pixel 7 Pro (cheetah) as my daily driver. It runs Android 16 and is proudly rooted with KernelSU-Next.", - "It's back is shattered and missing volume buttons, but it continues to thrive and survive as my daily driver.", - "I also have a Google Pixel 3a XL (bonito) which I use as a secondary device. It runs LineageOS 22.2 and is also rooted with KernelSU-Next." + "Phone": [ + "I use a Google Pixel 7 Pro (cheetah) as my daily driver. It runs LineageOS microG and is proudly rooted with KernelSU-Next.", + "It's back is shattered and missing volume buttons, but it continues to thrive and survive as my daily driver." ], - "Laptops": [ - "I use a Lenovo Thinkpad T470s with NixOS unstable as my daily driver. I've had it for about a year now, and it's been a great experience. At the time of writing, I am using KDE Plasma as my desktop environment.", - "I also own two MacBook Airs (2015 and 2013 base model) and a HP Chromebook used as a secondary devices. The 2013 runs unsupported macOS Sequoia Beta, the 2015 runs Xubuntu, and the Chromebook runs Arch Linux." + "Laptop": [ + "I use a Lenovo Thinkpad T470s running Arch Linux. I've had it for about half a year now, and it's been a great experience. I proudly use X11 and LXDE, with some Xfce backend components to make management easier." ] }, "contributions": [ - "Most of my repositories have migrated to p0ntus git. My username is aidan. You can find me on GitHub as ihatenodejs." + "Most of my repositories have migrated to LibreCloud Git. My username is aidan.", + "You can find me on GitHub as ihatenodejs." ], "featuredProjects": [ "Here's just four of my top projects. Star and fork counts are manually updated and count both Gitea and GitHub." ] } -} \ No newline at end of file +} \ No newline at end of file