personal website (jaspermayone.com)

font upgrades

Changed files
+259 -134
public
src
app
(home)
colophon
concerts
contact
elsewhere
green
keys
[key]
panera
pfp
podroll
portfolio
to
components
styles
public/fonts/Balgin/BalginText-Light.otf

This is a binary file and will not be displayed.

public/fonts/CuteNotes.ttf public/fonts/CuteNotes/CuteNotes.ttf
public/fonts/CuteNotes.woff2 public/fonts/CuteNotes/CuteNotes.woff2
+3 -1
src/app/(home)/page.tsx
··· 57 <div className="flex flex-col justify-center"> 58 <div className="space-y-4"> 59 <p className="font-medium text-xl"> 60 - Jasper Mayone [<i>he/they</i>]{" "} 61 <span className="text-gray-700 dark:text-white/70 font-normal"> 62 is a 19-year-old college student from rural Vermont, currently 63 residing in Boston.
··· 57 <div className="flex flex-col justify-center"> 58 <div className="space-y-4"> 59 <p className="font-medium text-xl"> 60 + <span style={{ fontFamily: "var(--font-balgin)" }}> 61 + Jasper Mayone [<i>he/they</i>] 62 + </span>{" "} 63 <span className="text-gray-700 dark:text-white/70 font-normal"> 64 is a 19-year-old college student from rural Vermont, currently 65 residing in Boston.
+32 -8
src/app/colophon/page.tsx
··· 121 <main className="flex-1"> 122 <div className="max-w-4xl mx-auto px-6 py-12"> 123 <div className="mb-16"> 124 - <h1 className="text-4xl font-bold mb-4 text-gray-900 dark:text-white"> 125 Colophon 126 </h1> 127 <p className="text-lg text-gray-600 dark:text-gray-300"> ··· 131 132 {/* Site History Section */} 133 <section className="mb-16"> 134 - <h2 className="text-2xl font-bold mb-6 text-gray-900 dark:text-white"> 135 Site History 136 </h2> 137 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8"> ··· 152 153 {/* Technology Stack Section */} 154 <section className="mb-16"> 155 - <h2 className="text-2xl font-bold mb-6 text-gray-900 dark:text-white"> 156 Technology Stack 157 </h2> 158 <div className="grid lg:grid-cols-2 gap-6"> ··· 165 <h3 className="text-lg font-bold text-gray-900 dark:text-white"> 166 {tech.name} 167 </h3> 168 - <span className="px-3 py-1 text-sm font-medium text-gray-600 dark:text-gray-300 bg-gray-100 dark:bg-gray-800 rounded-full"> 169 {tech.category} 170 </span> 171 </div> ··· 179 180 {/* Hosting & Deployment Section */} 181 <section className="mb-16"> 182 - <h2 className="text-2xl font-bold mb-6 text-gray-900 dark:text-white"> 183 Hosting & Deployment 184 </h2> 185 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8"> ··· 199 , which provides seamless deployment from GitHub, automatic 200 HTTPS, and global CDN distribution. 201 </p> 202 - <div className="flex flex-wrap gap-2"> 203 <span className="px-3 py-1 text-sm font-medium text-gray-600 dark:text-gray-300 bg-gray-100 dark:bg-gray-800 rounded-full"> 204 GitHub Integration 205 </span> ··· 215 216 {/* Development Tools Section */} 217 <section className="mb-16"> 218 - <h2 className="text-2xl font-bold mb-6 text-gray-900 dark:text-white"> 219 Development Tools 220 </h2> 221 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8"> ··· 236 237 {/* Hardware Section */} 238 <section className="mb-16"> 239 - <h2 className="text-2xl font-bold mb-6 text-gray-900 dark:text-white"> 240 Hardware 241 </h2> 242 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8">
··· 121 <main className="flex-1"> 122 <div className="max-w-4xl mx-auto px-6 py-12"> 123 <div className="mb-16"> 124 + <h1 125 + className="text-4xl font-bold mb-4 text-gray-900 dark:text-white" 126 + style={{ fontFamily: "var(--font-balgin)" }} 127 + > 128 Colophon 129 </h1> 130 <p className="text-lg text-gray-600 dark:text-gray-300"> ··· 134 135 {/* Site History Section */} 136 <section className="mb-16"> 137 + <h2 138 + className="text-2xl font-bold mb-6 text-gray-900 dark:text-white" 139 + style={{ fontFamily: "var(--font-balgin)" }} 140 + > 141 Site History 142 </h2> 143 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8"> ··· 158 159 {/* Technology Stack Section */} 160 <section className="mb-16"> 161 + <h2 162 + className="text-2xl font-bold mb-6 text-gray-900 dark:text-white" 163 + style={{ fontFamily: "var(--font-balgin)" }} 164 + > 165 Technology Stack 166 </h2> 167 <div className="grid lg:grid-cols-2 gap-6"> ··· 174 <h3 className="text-lg font-bold text-gray-900 dark:text-white"> 175 {tech.name} 176 </h3> 177 + <span 178 + className="px-3 py-1 text-sm font-medium text-gray-600 dark:text-gray-300 bg-gray-100 dark:bg-gray-800 rounded-full" 179 + style={{ fontFamily: "var(--font-balgin)" }} 180 + > 181 {tech.category} 182 </span> 183 </div> ··· 191 192 {/* Hosting & Deployment Section */} 193 <section className="mb-16"> 194 + <h2 195 + className="text-2xl font-bold mb-6 text-gray-900 dark:text-white" 196 + style={{ fontFamily: "var(--font-balgin)" }} 197 + > 198 Hosting & Deployment 199 </h2> 200 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8"> ··· 214 , which provides seamless deployment from GitHub, automatic 215 HTTPS, and global CDN distribution. 216 </p> 217 + <div 218 + className="flex flex-wrap gap-2" 219 + style={{ fontFamily: "var(--font-balgin)" }} 220 + > 221 <span className="px-3 py-1 text-sm font-medium text-gray-600 dark:text-gray-300 bg-gray-100 dark:bg-gray-800 rounded-full"> 222 GitHub Integration 223 </span> ··· 233 234 {/* Development Tools Section */} 235 <section className="mb-16"> 236 + <h2 237 + className="text-2xl font-bold mb-6 text-gray-900 dark:text-white" 238 + style={{ fontFamily: "var(--font-balgin)" }} 239 + > 240 Development Tools 241 </h2> 242 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8"> ··· 257 258 {/* Hardware Section */} 259 <section className="mb-16"> 260 + <h2 261 + className="text-2xl font-bold mb-6 text-gray-900 dark:text-white" 262 + style={{ fontFamily: "var(--font-balgin)" }} 263 + > 264 Hardware 265 </h2> 266 <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8">
+20 -5
src/app/concerts/page.tsx
··· 77 <MENU pageFirstWord="Concerts" /> 78 <main className="flex-1"> 79 <div className="mx-5 mt-4 mb-4"> 80 - <h1 className="text-xl font-bold mb-4 text-gray-800 dark:text-white"> 81 Concerts I've Attended 82 </h1> 83 ··· 89 <div className="space-y-8"> 90 {sortedConcerts.map((yearGroup) => ( 91 <div key={yearGroup.year}> 92 - <h2 className="text-lg font-semibold mb-3 text-gray-900 dark:text-white"> 93 {yearGroup.year} 94 </h2> 95 <ul className="space-y-3"> ··· 104 {concert.headliner} 105 </div> 106 {concert.openers && concert.openers.length > 0 && ( 107 - <div className="text-sm text-gray-600 dark:text-gray-400"> 108 with {concert.openers.join(", ")} 109 </div> 110 )} 111 {concert.tour && ( 112 - <div className="text-sm text-gray-600 dark:text-gray-400"> 113 {concert.tour} 114 </div> 115 )} ··· 120 </div> 121 )} 122 {concert.setlist && ( 123 - <div className="text-xs mt-1"> 124 <a 125 href={concert.setlist} 126 target="_blank"
··· 77 <MENU pageFirstWord="Concerts" /> 78 <main className="flex-1"> 79 <div className="mx-5 mt-4 mb-4"> 80 + <h1 81 + className="text-xl font-bold mb-4 text-gray-800 dark:text-white" 82 + style={{ fontFamily: "var(--font-balgin)" }} 83 + > 84 Concerts I've Attended 85 </h1> 86 ··· 92 <div className="space-y-8"> 93 {sortedConcerts.map((yearGroup) => ( 94 <div key={yearGroup.year}> 95 + <h2 96 + className="text-lg font-semibold mb-3 text-gray-900 dark:text-white" 97 + style={{ fontFamily: "var(--font-balgin)" }} 98 + > 99 {yearGroup.year} 100 </h2> 101 <ul className="space-y-3"> ··· 110 {concert.headliner} 111 </div> 112 {concert.openers && concert.openers.length > 0 && ( 113 + <div 114 + className="text-sm text-gray-600 dark:text-gray-400" 115 + style={{ fontFamily: "var(--font-balgin)" }} 116 + > 117 with {concert.openers.join(", ")} 118 </div> 119 )} 120 {concert.tour && ( 121 + <div 122 + className="text-sm text-gray-600 dark:text-gray-400" 123 + style={{ fontFamily: "var(--font-balgin)" }} 124 + > 125 {concert.tour} 126 </div> 127 )} ··· 132 </div> 133 )} 134 {concert.setlist && ( 135 + <div 136 + className="text-xs mt-1" 137 + style={{ fontFamily: "var(--font-balgin)" }} 138 + > 139 <a 140 href={concert.setlist} 141 target="_blank"
+4 -1
src/app/contact/page.tsx
··· 101 <MENU pageFirstWord="Contact" /> 102 <main className="flex-1"> 103 <div className="mx-5 mt-4 mb-4"> 104 - <h1 className="text-xl font-bold mb-4 text-gray-800 dark:text-white"> 105 Get in Touch 106 </h1> 107
··· 101 <MENU pageFirstWord="Contact" /> 102 <main className="flex-1"> 103 <div className="mx-5 mt-4 mb-4"> 104 + <h1 105 + className="text-xl font-bold mb-4 text-gray-800 dark:text-white" 106 + style={{ fontFamily: "var(--font-balgin)" }} 107 + > 108 Get in Touch 109 </h1> 110
+13 -4
src/app/elsewhere/page.tsx
··· 71 <MENU pageFirstWord="Elsewhere" /> 72 <main className="flex-1"> 73 <div className="mx-5 mt-4 mb-4"> 74 - <h1 className="text-xl font-bold mb-2 text-gray-800 dark:text-white"> 75 - /elsewhere or /appearances 76 </h1> 77 <p className="text-gray-600 dark:text-white/70 mb-6 italic"> 78 a list of output or writings on sites other than one's own ··· 97 <div className="flex items-start justify-between gap-4"> 98 <div className="flex-1 min-w-0"> 99 <div className="flex items-start gap-2 mb-1"> 100 - <h2 className="font-semibold text-gray-900 dark:text-white group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors"> 101 {appearance.title} 102 </h2> 103 <ArrowUpRight className="w-4 h-4 text-gray-400 group-hover:text-blue-600 dark:group-hover:text-blue-400 flex-shrink-0 mt-0.5" /> ··· 110 {appearance.type && ( 111 <> 112 <span>•</span> 113 - <span className="px-2 py-0.5 text-xs rounded-full bg-gray-100 dark:bg-gray-700"> 114 {appearance.type} 115 </span> 116 </>
··· 71 <MENU pageFirstWord="Elsewhere" /> 72 <main className="flex-1"> 73 <div className="mx-5 mt-4 mb-4"> 74 + <h1 75 + className="text-xl font-bold mb-2 text-gray-800 dark:text-white" 76 + style={{ fontFamily: "var(--font-balgin)" }} 77 + > 78 + My appearances elsewhere. 79 </h1> 80 <p className="text-gray-600 dark:text-white/70 mb-6 italic"> 81 a list of output or writings on sites other than one's own ··· 100 <div className="flex items-start justify-between gap-4"> 101 <div className="flex-1 min-w-0"> 102 <div className="flex items-start gap-2 mb-1"> 103 + <h2 104 + className="font-semibold text-gray-900 dark:text-white group-hover:text-blue-600 dark:group-hover:text-blue-400 transition-colors" 105 + style={{ fontFamily: "var(--font-balgin)" }} 106 + > 107 {appearance.title} 108 </h2> 109 <ArrowUpRight className="w-4 h-4 text-gray-400 group-hover:text-blue-600 dark:group-hover:text-blue-400 flex-shrink-0 mt-0.5" /> ··· 116 {appearance.type && ( 117 <> 118 <span>•</span> 119 + <span 120 + className="px-2 py-0.5 text-xs rounded-full bg-gray-100 dark:bg-gray-700" 121 + style={{ fontFamily: "var(--font-balgin)" }} 122 + > 123 {appearance.type} 124 </span> 125 </>
+1 -1
src/app/error.tsx
··· 43 /> */} 44 45 <div className="max-w-lg text-center"> 46 - <p className="inline"> 47 Uh oh! This page seems to have lost artistic direction. Please try 48 to 49 </p>{" "}
··· 43 /> */} 44 45 <div className="max-w-lg text-center"> 46 + <p className="inline" style={{ fontFamily: "var(--font-balgin)" }}> 47 Uh oh! This page seems to have lost artistic direction. Please try 48 to 49 </p>{" "}
+24 -6
src/app/green/page.tsx
··· 62 <MENU pageFirstWord="Green" /> 63 <main className="flex-1"> 64 <div className="mx-5 mt-4 mb-4"> 65 - <h1 className="text-xl font-bold mb-4 text-gray-800 dark:text-white"> 66 Living Green 67 </h1> 68 ··· 76 {/* Carbon Rating Card */} 77 <div className="border border-gray-200 dark:border-gray-700 rounded-lg p-6 bg-white dark:bg-gray-800/20"> 78 <div className="flex items-center justify-between mb-4"> 79 - <h2 className="text-lg font-semibold text-gray-800 dark:text-white"> 80 Website Carbon Rating 81 </h2> 82 <div className="flex items-center justify-center w-12 h-12 rounded-full bg-green-100 dark:bg-green-900/30"> 83 - <span className="text-2xl font-bold text-green-700 dark:text-green-400"> 84 A 85 </span> 86 </div> ··· 88 89 <div className="grid grid-cols-1 md:grid-cols-3 gap-4 mb-4"> 90 <div className="text-center p-3 rounded-md bg-gray-50 dark:bg-gray-700/30"> 91 - <div className="text-2xl font-bold text-gray-900 dark:text-white"> 92 0.17g 93 </div> 94 <div className="text-xs text-gray-600 dark:text-gray-400"> ··· 97 </div> 98 99 <div className="text-center p-3 rounded-md bg-gray-50 dark:bg-gray-700/30"> 100 - <div className="text-2xl font-bold text-gray-900 dark:text-white"> 101 20.7kg 102 </div> 103 <div className="text-xs text-gray-600 dark:text-gray-400"> ··· 106 </div> 107 108 <div className="text-center p-3 rounded-md bg-gray-50 dark:bg-gray-700/30"> 109 - <div className="text-2xl font-bold text-gray-900 dark:text-white"> 110 0.47 111 </div> 112 <div className="text-xs text-gray-600 dark:text-gray-400">
··· 62 <MENU pageFirstWord="Green" /> 63 <main className="flex-1"> 64 <div className="mx-5 mt-4 mb-4"> 65 + <h1 66 + className="text-xl font-bold mb-4 text-gray-800 dark:text-white" 67 + style={{ fontFamily: "var(--font-balgin)" }} 68 + > 69 Living Green 70 </h1> 71 ··· 79 {/* Carbon Rating Card */} 80 <div className="border border-gray-200 dark:border-gray-700 rounded-lg p-6 bg-white dark:bg-gray-800/20"> 81 <div className="flex items-center justify-between mb-4"> 82 + <h2 83 + className="text-lg font-semibold text-gray-800 dark:text-white" 84 + style={{ fontFamily: "var(--font-balgin)" }} 85 + > 86 Website Carbon Rating 87 </h2> 88 <div className="flex items-center justify-center w-12 h-12 rounded-full bg-green-100 dark:bg-green-900/30"> 89 + <span 90 + className="text-2xl font-bold text-green-700 dark:text-green-400" 91 + style={{ fontFamily: "var(--font-balgin)" }} 92 + > 93 A 94 </span> 95 </div> ··· 97 98 <div className="grid grid-cols-1 md:grid-cols-3 gap-4 mb-4"> 99 <div className="text-center p-3 rounded-md bg-gray-50 dark:bg-gray-700/30"> 100 + <div 101 + className="text-2xl font-bold text-gray-900 dark:text-white" 102 + style={{ fontFamily: "var(--font-balgin)" }} 103 + > 104 0.17g 105 </div> 106 <div className="text-xs text-gray-600 dark:text-gray-400"> ··· 109 </div> 110 111 <div className="text-center p-3 rounded-md bg-gray-50 dark:bg-gray-700/30"> 112 + <div 113 + className="text-2xl font-bold text-gray-900 dark:text-white" 114 + style={{ fontFamily: "var(--font-balgin)" }} 115 + > 116 20.7kg 117 </div> 118 <div className="text-xs text-gray-600 dark:text-gray-400"> ··· 121 </div> 122 123 <div className="text-center p-3 rounded-md bg-gray-50 dark:bg-gray-700/30"> 124 + <div 125 + className="text-2xl font-bold text-gray-900 dark:text-white" 126 + style={{ fontFamily: "var(--font-balgin)" }} 127 + > 128 0.47 129 </div> 130 <div className="text-xs text-gray-600 dark:text-gray-400">
+78 -73
src/app/keys/[key]/page.tsx
··· 1 - // app/keys/[key]/page.tsx 2 import FOOTER from "@/components/FOOTER"; 3 import MENU from "@/components/MENU"; 4 import { Button } from "@/components/ui/button"; ··· 56 const downloadURL = buildDownloadURL(title, fileExtension); 57 const fullDirectURL = `https://www.jaspermayone.com${directURL}`; 58 59 - // Create import commands 60 const sshImportCommand = `curl -s ${fullDirectURL} >> ~/.ssh/authorized_keys`; 61 const gpgImportCommand = `curl -s ${fullDirectURL} | gpg --import`; 62 63 - // Create structured data with breadcrumbs 64 const keyPageSchema = { 65 "@context": "https://schema.org", 66 "@graph": [ ··· 118 pageSecondWord="~" 119 pageThirdWord={`${title}`} 120 /> 121 - <main> 122 - <div className="max-w-4xl mx-auto px-3 py-6"> 123 - <div className="border border-gray-200 dark:border-gray-700 rounded-2xl p-8"> 124 - {/* Key Details */} 125 - <div className="mb-5"> 126 - <h2 className="text-xl font-bold mb-4 text-gray-900 dark:text-white"> 127 - Key Details 128 - </h2> 129 - <div className="space-y-4"> 130 - <div> 131 - <span className="font-medium text-gray-900 dark:text-white"> 132 - Fingerprint: 133 - </span> 134 - <p className="text-gray-600 dark:text-gray-300 font-mono text-sm mt-1 break-all"> 135 {fingerprint} 136 - </p> 137 - </div> 138 - <div> 139 - <span className="font-medium text-gray-900 dark:text-white"> 140 - Direct link: 141 - </span> 142 - <p className="mt-1"> 143 - <Link href={directURL} className="lnk break-all"> 144 - {directURL} 145 - </Link> 146 - </p> 147 </div> 148 </div> 149 - </div> 150 151 - {/* Actions */} 152 - <div className="border-t border-gray-200 dark:border-gray-700 pt-6 mb-8"> 153 - <h3 className="text-lg font-semibold mb-4 text-gray-900 dark:text-white"> 154 - Actions 155 - </h3> 156 - <div className="flex flex-col sm:flex-row gap-4"> 157 - <CopyButton label="Copy public key" valueToCopy={keyData} /> 158 - <Link href={downloadURL}> 159 - <Button variant="outline" className="w-full sm:w-auto"> 160 - <span className="mr-2">📥</span> 161 - Download public key 162 - </Button> 163 - </Link> 164 </div> 165 </div> 166 167 - {/* Import Command */} 168 - <div className="border-t border-gray-200 dark:border-gray-700 pt-6"> 169 - <h3 className="text-lg font-semibold mb-3 text-gray-900 dark:text-white"> 170 Import Command 171 - </h3> 172 - <p className="text-sm text-gray-600 dark:text-gray-400 mb-3"> 173 - Copy and run this command to import the key: 174 </p> 175 - {title === "ssh" ? ( 176 - <div className="space-y-3"> 177 - <div className="bg-gray-100 dark:bg-gray-900 p-3 rounded border overflow-x-auto"> 178 - <code className="text-xs whitespace-nowrap block font-mono text-gray-800 dark:text-gray-200"> 179 - {sshImportCommand} 180 - </code> 181 - </div> 182 - <CopyButton 183 - label="Copy SSH import command" 184 - valueToCopy={sshImportCommand} 185 - /> 186 </div> 187 - ) : title === "gpg" ? ( 188 - <div className="space-y-3"> 189 - <div className="bg-gray-100 dark:bg-gray-900 p-3 rounded border overflow-x-auto"> 190 - <code className="text-xs whitespace-nowrap block font-mono text-gray-800 dark:text-gray-200"> 191 - {gpgImportCommand} 192 - </code> 193 - </div> 194 - <CopyButton 195 - label="Copy GPG import command" 196 - valueToCopy={gpgImportCommand} 197 - /> 198 - </div> 199 - ) : null} 200 </div> 201 - </div> 202 </div> 203 </main> 204 <FOOTER />
··· 1 import FOOTER from "@/components/FOOTER"; 2 import MENU from "@/components/MENU"; 3 import { Button } from "@/components/ui/button"; ··· 55 const downloadURL = buildDownloadURL(title, fileExtension); 56 const fullDirectURL = `https://www.jaspermayone.com${directURL}`; 57 58 const sshImportCommand = `curl -s ${fullDirectURL} >> ~/.ssh/authorized_keys`; 59 const gpgImportCommand = `curl -s ${fullDirectURL} | gpg --import`; 60 61 const keyPageSchema = { 62 "@context": "https://schema.org", 63 "@graph": [ ··· 115 pageSecondWord="~" 116 pageThirdWord={`${title}`} 117 /> 118 + <main className="min-h-screen"> 119 + <div 120 + className="max-w-4xl mx-auto px-4 py-8 md:py-12" 121 + style={{ fontFamily: "var(--font-balgin)" }} 122 + > 123 + {/* Header */} 124 + <div className="mb-8"> 125 + <h1 className="text-3xl md:text-4xl font-bold text-gray-900 dark:text-white mb-2"> 126 + {title.toUpperCase()} Key 127 + </h1> 128 + <p className="text-gray-600 dark:text-gray-400"> 129 + Public {title.toUpperCase()} key for secure authentication 130 + </p> 131 + </div> 132 + 133 + {/* Quick Actions Card */} 134 + <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-6 mb-6 shadow-sm"> 135 + <h2 className="text-lg font-semibold text-gray-900 dark:text-white mb-4"> 136 + Quick Actions 137 + </h2> 138 + <div className="flex flex-col sm:flex-row gap-3"> 139 + <CopyButton label="Copy Key" valueToCopy={keyData} /> 140 + <Link href={downloadURL} className="flex-1 sm:flex-initial"> 141 + <Button variant="outline" className="w-full"> 142 + Download Key 143 + </Button> 144 + </Link> 145 + </div> 146 + </div> 147 + 148 + {/* Key Details Card */} 149 + <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-6 mb-6 shadow-sm"> 150 + <h2 className="text-lg font-semibold text-gray-900 dark:text-white mb-5"> 151 + Key Information 152 + </h2> 153 + 154 + <div className="space-y-5"> 155 + <div> 156 + <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2"> 157 + Fingerprint 158 + </label> 159 + <div className="bg-gray-50 dark:bg-gray-900 px-4 py-3 rounded-lg border border-gray-200 dark:border-gray-700"> 160 + <code className="text-sm font-mono text-gray-800 dark:text-gray-200 break-all"> 161 {fingerprint} 162 + </code> 163 </div> 164 </div> 165 166 + <div> 167 + <label className="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2"> 168 + Direct Link 169 + </label> 170 + <div className="bg-gray-50 dark:bg-gray-900 px-4 py-3 rounded-lg border border-gray-200 dark:border-gray-700"> 171 + <Link 172 + href={directURL} 173 + className="text-sm text-blue-600 dark:text-blue-400 hover:underline break-all font-mono" 174 + > 175 + {fullDirectURL} 176 + </Link> 177 + </div> 178 </div> 179 </div> 180 + </div> 181 182 + {/* Import Command Card */} 183 + {(title === "ssh" || title === "gpg") && ( 184 + <div className="bg-white dark:bg-gray-800 border border-gray-200 dark:border-gray-700 rounded-xl p-6 shadow-sm"> 185 + <h2 className="text-lg font-semibold text-gray-900 dark:text-white mb-3"> 186 Import Command 187 + </h2> 188 + <p className="text-sm text-gray-600 dark:text-gray-400 mb-4"> 189 + Run this command in your terminal to import the key: 190 </p> 191 + 192 + <div className="space-y-3"> 193 + <div className="bg-gray-900 dark:bg-black p-4 rounded-lg border border-gray-700 overflow-x-auto"> 194 + <code className="text-sm font-mono text-green-400 block whitespace-nowrap"> 195 + {title === "ssh" ? sshImportCommand : gpgImportCommand} 196 + </code> 197 </div> 198 + <CopyButton 199 + label={`Copy ${title.toUpperCase()} Import Command`} 200 + valueToCopy={ 201 + title === "ssh" ? sshImportCommand : gpgImportCommand 202 + } 203 + /> 204 + </div> 205 </div> 206 + )} 207 </div> 208 </main> 209 <FOOTER />
+20 -6
src/app/layout.tsx
··· 1 import { redirects } from "@/lib/defs"; 2 import "@/styles/globals.css"; 3 - import { ThemeProvider } from "@/components/theme-provider"; 4 - import { ThemeUpdater } from "@/components/theme-updater"; 5 import { SpeedInsights } from "@vercel/speed-insights/next"; 6 import type { Metadata, Viewport } from "next"; 7 import localFont from "next/font/local"; 8 import Script from "next/script"; 9 - import { ViewTransitions } from "next-view-transitions"; 10 11 const cuteNotes = localFont({ 12 src: [ 13 { 14 - path: "../../public/fonts/CuteNotes.ttf", 15 style: "normal", 16 }, 17 ], 18 variable: "--font-cuteNotes", 19 }); 20 21 export const metadata: Metadata = { ··· 318 children: React.ReactNode; 319 }>) { 320 return ( 321 - <html lang="en" className={cuteNotes.variable} suppressHydrationWarning> 322 <head> 323 <meta charSet="utf-8" /> 324 <meta name="og:type" content="website" /> ··· 383 384 <link rel="manifest" href="/site.webmanifest" /> 385 </head> 386 - <body className={`${cuteNotes.variable} font-sans`}> 387 <ThemeProvider 388 attribute="class" 389 defaultTheme="system"
··· 1 + import { ThemeProvider } from "@/components/theme-provider"; 2 + import { ThemeUpdater } from "@/components/theme-updater"; 3 import { redirects } from "@/lib/defs"; 4 import "@/styles/globals.css"; 5 import { SpeedInsights } from "@vercel/speed-insights/next"; 6 import type { Metadata, Viewport } from "next"; 7 + import { ViewTransitions } from "next-view-transitions"; 8 import localFont from "next/font/local"; 9 import Script from "next/script"; 10 11 const cuteNotes = localFont({ 12 src: [ 13 { 14 + path: "../../public/fonts/CuteNotes/CuteNotes.ttf", 15 style: "normal", 16 }, 17 ], 18 variable: "--font-cuteNotes", 19 + }); 20 + 21 + const balgin = localFont({ 22 + src: [ 23 + { 24 + path: "../../public/fonts/Balgin/BalginText-Light.otf", 25 + style: "normal", 26 + }, 27 + ], 28 + variable: "--font-balgin", 29 }); 30 31 export const metadata: Metadata = { ··· 328 children: React.ReactNode; 329 }>) { 330 return ( 331 + <html 332 + lang="en" 333 + className={`${cuteNotes.variable} ${balgin.variable}`} 334 + suppressHydrationWarning 335 + > 336 <head> 337 <meta charSet="utf-8" /> 338 <meta name="og:type" content="website" /> ··· 397 398 <link rel="manifest" href="/site.webmanifest" /> 399 </head> 400 + <body className={`${cuteNotes.variable} ${balgin.variable} font-sans`}> 401 <ThemeProvider 402 attribute="class" 403 defaultTheme="system"
+4 -4
src/app/panera/page.tsx
··· 1 import { PaneraCard } from "@/components/PaneraCard"; 2 - import Image from "next/image"; 3 import { Metadata } from "next"; 4 - import MENU from "@/components/MENU"; 5 - import FOOTER from "@/components/FOOTER"; 6 import Script from "next/script"; 7 8 export const metadata: Metadata = { ··· 89 <div 90 className="text-3xl font-bold mb-4" 91 style={{ 92 color: "#051402", 93 fontWeight: 600, 94 }} ··· 97 </div> 98 <p 99 className="text-gray-600 max-w-2xl mx-auto" 100 - style={{ lineHeight: "1.6" }} 101 > 102 Inspired by people creating /chipotle pages with their Chipotle 103 order for when their friends get them Chipotle, here's what I
··· 1 + import FOOTER from "@/components/FOOTER"; 2 + import MENU from "@/components/MENU"; 3 import { PaneraCard } from "@/components/PaneraCard"; 4 import { Metadata } from "next"; 5 import Script from "next/script"; 6 7 export const metadata: Metadata = { ··· 88 <div 89 className="text-3xl font-bold mb-4" 90 style={{ 91 + fontFamily: "var(--font-balgin)", 92 color: "#051402", 93 fontWeight: 600, 94 }} ··· 97 </div> 98 <p 99 className="text-gray-600 max-w-2xl mx-auto" 100 + style={{ lineHeight: "1.6", fontFamily: "var(--font-balgin)" }} 101 > 102 Inspired by people creating /chipotle pages with their Chipotle 103 order for when their friends get them Chipotle, here's what I
+4 -1
src/app/pfp/page.tsx
··· 70 <MENU pageFirstWord="PFPs" /> 71 <main className="flex-1"> 72 <div className="mx-5 mt-4 mb-4"> 73 - <h1 className="text-xl font-bold mb-4 text-gray-800 dark:text-white"> 74 Profile Photos 75 </h1> 76
··· 70 <MENU pageFirstWord="PFPs" /> 71 <main className="flex-1"> 72 <div className="mx-5 mt-4 mb-4"> 73 + <h1 74 + className="text-xl font-bold underline mb-4 text-gray-800 dark:text-white" 75 + style={{ fontFamily: "var(--font-balgin)" }} 76 + > 77 Profile Photos 78 </h1> 79
+4 -1
src/app/podroll/page.tsx
··· 102 <MENU pageFirstWord="Podcasts" /> 103 <main className="flex-1"> 104 <div className="mx-5 mt-4 mb-4"> 105 - <h1 className="text-xl font-bold mb-2 text-gray-800 dark:text-white"> 106 Recommended Podcasts 107 </h1> 108
··· 102 <MENU pageFirstWord="Podcasts" /> 103 <main className="flex-1"> 104 <div className="mx-5 mt-4 mb-4"> 105 + <h1 106 + className="text-xl font-bold mb-2 text-gray-800 dark:text-white" 107 + style={{ fontFamily: "var(--font-balgin)" }} 108 + > 109 Recommended Podcasts 110 </h1> 111
+1
src/app/portfolio/page.tsx
··· 145 <span 146 key={tagIndex} 147 className="px-2 py-1 text-xs rounded-full bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-300" 148 > 149 {tag} 150 </span>
··· 145 <span 146 key={tagIndex} 147 className="px-2 py-1 text-xs rounded-full bg-blue-100 dark:bg-blue-900/30 text-blue-800 dark:text-blue-300" 148 + style={{ fontFamily: "var(--font-balgin)" }} 149 > 150 {tag} 151 </span>
+6 -1
src/app/to/page.tsx
··· 16 return ( 17 <div className="min-h-screen bg-background text-foreground"> 18 <div className="container mx-auto px-4 py-8"> 19 - <h1 className="text-3xl font-bold mb-8">All /to Routes</h1> 20 21 <div className="grid gap-4"> 22 {toRoutes.map((redirect) => (
··· 16 return ( 17 <div className="min-h-screen bg-background text-foreground"> 18 <div className="container mx-auto px-4 py-8"> 19 + <h1 20 + className="text-3xl font-bold mb-8" 21 + style={{ fontFamily: "var(--font-balgin)" }} 22 + > 23 + All /to Routes 24 + </h1> 25 26 <div className="grid gap-4"> 27 {toRoutes.map((redirect) => (
+1 -1
src/components/FOOTER.tsx
··· 55 > 56 <p 57 className="text-xs text-center leading-relaxed break-words" 58 - style={{ color: textColor }} 59 > 60 ©{currentYear} Jasper Mayone. Made with &lt;3 in{" "} 61 <i>Boston, Massachusetts</i>.
··· 55 > 56 <p 57 className="text-xs text-center leading-relaxed break-words" 58 + style={{ fontFamily: "var(--font-balgin)", color: textColor }} 59 > 60 ©{currentYear} Jasper Mayone. Made with &lt;3 in{" "} 61 <i>Boston, Massachusetts</i>.
+16 -5
src/components/PageNavigation.tsx
··· 173 title={`Go to ${item.slug}`} 174 style={ 175 item.slug === selectedTab 176 - ? { ...textShadowStyle } 177 - : { color: textColor, ...textShadowStyle } 178 } 179 > 180 /{item.slug} ··· 192 title={`see more pages`} 193 style={ 194 showMoreDropdown 195 - ? { ...textShadowStyle } 196 - : { color: textColor, ...textShadowStyle } 197 } 198 > 199 /more ··· 215 handleMenuClick(item.slug); 216 setShowMoreDropdown(false); 217 }} 218 - style={{ color: textColor }} 219 > 220 /{item.slug} 221 </p>
··· 173 title={`Go to ${item.slug}`} 174 style={ 175 item.slug === selectedTab 176 + ? { fontFamily: "var(--font-balgin)", ...textShadowStyle } 177 + : { 178 + fontFamily: "var(--font-balgin)", 179 + color: textColor, 180 + ...textShadowStyle, 181 + } 182 } 183 > 184 /{item.slug} ··· 196 title={`see more pages`} 197 style={ 198 showMoreDropdown 199 + ? { fontFamily: "var(--font-balgin)", ...textShadowStyle } 200 + : { 201 + fontFamily: "var(--font-balgin)", 202 + color: textColor, 203 + ...textShadowStyle, 204 + } 205 } 206 > 207 /more ··· 223 handleMenuClick(item.slug); 224 setShowMoreDropdown(false); 225 }} 226 + style={{ 227 + fontFamily: "var(--font-balgin)", 228 + color: textColor, 229 + }} 230 > 231 /{item.slug} 232 </p>
+21 -6
src/components/PostList.tsx
··· 1 "use client"; 2 3 - import { formatRelative, format } from "date-fns"; 4 import { formatInTimeZone } from "date-fns-tz"; 5 - import { useState, useEffect } from "react"; 6 7 interface Post { 8 text: string; ··· 65 <div className="space-y-3"> 66 <div className="flex items-center justify-center py-8"> 67 <div className="animate-spin rounded-full h-6 w-6 border-b-2 border-gray-600"></div> 68 - <span className="ml-3 text-gray-600">Loading updates...</span> 69 </div> 70 </div> 71 ); ··· 76 <div className="space-y-3"> 77 <div className="flex items-center justify-center py-8"> 78 <div className="text-red-600"> 79 - <p className="font-medium">Failed to load updates</p> 80 <p className="text-sm mt-1">{error}</p> 81 </div> 82 </div> ··· 91 <div className="space-y-3"> 92 {postsToShow.map((post, index) => ( 93 <div key={index} className="flex items-start gap-3"> 94 - <div className="w-2 h-2 bg-gray-400 rounded-full mt-2 flex-shrink-0"></div> 95 <div className="flex-1"> 96 - <p className="text-gray-800">{post.text}</p> 97 <p className="text-xs text-gray-500 mt-1"> 98 {formatTimeAgo(post.createdAt)} 99 </p>
··· 1 "use client"; 2 3 + import { formatRelative } from "date-fns"; 4 import { formatInTimeZone } from "date-fns-tz"; 5 + import { useEffect, useState } from "react"; 6 7 interface Post { 8 text: string; ··· 65 <div className="space-y-3"> 66 <div className="flex items-center justify-center py-8"> 67 <div className="animate-spin rounded-full h-6 w-6 border-b-2 border-gray-600"></div> 68 + <span 69 + className="ml-3 text-gray-600" 70 + style={{ fontFamily: "var(--font-balgin)" }} 71 + > 72 + Loading updates... 73 + </span> 74 </div> 75 </div> 76 ); ··· 81 <div className="space-y-3"> 82 <div className="flex items-center justify-center py-8"> 83 <div className="text-red-600"> 84 + <p 85 + className="font-medium" 86 + style={{ fontFamily: "var(--font-balgin)" }} 87 + > 88 + Failed to load updates 89 + </p> 90 <p className="text-sm mt-1">{error}</p> 91 </div> 92 </div> ··· 101 <div className="space-y-3"> 102 {postsToShow.map((post, index) => ( 103 <div key={index} className="flex items-start gap-3"> 104 + <div className="w-2 h-2 bg-gray-400 rounded-full mt-2 shrink-0"></div> 105 <div className="flex-1"> 106 + <p 107 + className="text-gray-800" 108 + style={{ fontFamily: "var(--font-balgin)" }} 109 + > 110 + {post.text} 111 + </p> 112 <p className="text-xs text-gray-500 mt-1"> 113 {formatTimeAgo(post.createdAt)} 114 </p>
+6 -9
src/styles/globals.css
··· 14 --background-end-rgb: 0, 0, 0; 15 } 16 17 - @font-face { 18 - font-family: "Cute Notes"; 19 - src: 20 - url("/fonts/CuteNotes.woff2") format("woff2"), 21 - url("/fonts/CuteNotes.woff") format("woff"); 22 - font-weight: normal; 23 - font-style: normal; 24 - font-display: swap; 25 - } 26 27 body { 28 /* font-family: "Cute Notes", sans-serif; */ ··· 55 color: #56ba8e; 56 text-decoration: underline wavy; 57 transition: color 0.3s ease; 58 } 59 60 .lnk:hover { 61 color: light-dark(#003e73, #aad5fb); 62 } 63 64 /* View Transitions API Styles */
··· 14 --background-end-rgb: 0, 0, 0; 15 } 16 17 + /* Fonts are loaded via Next.js localFont in layout.tsx */ 18 19 body { 20 /* font-family: "Cute Notes", sans-serif; */ ··· 47 color: #56ba8e; 48 text-decoration: underline wavy; 49 transition: color 0.3s ease; 50 + font-family: var(--font-balgin), sans-serif; 51 } 52 53 .lnk:hover { 54 color: light-dark(#003e73, #aad5fb); 55 + } 56 + 57 + a { 58 + font-family: var(--font-balgin), sans-serif; 59 } 60 61 /* View Transitions API Styles */
+1 -1
tailwind.config.ts
··· 20 foreground: "var(--foreground)", 21 }, 22 fontFamily: { 23 - // "cute-notes": ['"Cute Notes"', "sans-serif"], 24 "cute-notes": "var(--font-cuteNotes)", 25 }, 26 textDecorationStyle: { 27 wavy: "wavy",
··· 20 foreground: "var(--foreground)", 21 }, 22 fontFamily: { 23 "cute-notes": "var(--font-cuteNotes)", 24 + balgin: "var(--font-balgin)", 25 }, 26 textDecorationStyle: { 27 wavy: "wavy",