public/fonts/Balgin/BalginText-Light.otf
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.ttf
public/fonts/CuteNotes/CuteNotes.ttf
public/fonts/CuteNotes.woff2
public/fonts/CuteNotes/CuteNotes.woff2
public/fonts/CuteNotes.woff2
public/fonts/CuteNotes/CuteNotes.woff2
+3
-1
src/app/(home)/page.tsx
+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
+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
+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
+4
-1
src/app/contact/page.tsx
+13
-4
src/app/elsewhere/page.tsx
+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
+1
-1
src/app/error.tsx
+24
-6
src/app/green/page.tsx
+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
+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
+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
+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
+4
-1
src/app/pfp/page.tsx
+4
-1
src/app/podroll/page.tsx
+4
-1
src/app/podroll/page.tsx
+1
src/app/portfolio/page.tsx
+1
src/app/portfolio/page.tsx
+6
-1
src/app/to/page.tsx
+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
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
+1
-1
src/components/FOOTER.tsx
+21
-6
src/components/PostList.tsx
+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
+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
+1
-1
tailwind.config.ts