comparison mrjunejune/test/snapshots/root.snapshot @ 256:30c2196d03d4

[site] Integrate Zenbu themes and components Co-authored-by: Copilot <[email protected]>
author MrJuneJune <me@mrjunejune.com>
date Tue, 04 Aug 2026 16:49:01 -0700
parents 40fa2363fee1
children 60a876c4587a
comparison
equal deleted inserted replaced
255:5ec271d612ae 256:30c2196d03d4
2 <html lang="en"> 2 <html lang="en">
3 <head> 3 <head>
4 <title> MrJuneJune </title> 4 <title> MrJuneJune </title>
5 <meta charset="UTF-8"> 5 <meta charset="UTF-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0">
7 <meta name="theme-color" content="#f7f3e8">
7 <link rel="icon" type="image/svg+xml" href="/public/epi_all_colors.svg"> 8 <link rel="icon" type="image/svg+xml" href="/public/epi_all_colors.svg">
9 <link rel="manifest" href="/public/manifest.json">
10 <link rel="apple-touch-icon" href="/public/epi_all_colors.svg">
8 11
9 <link rel="preload" href="/public/fonts/Roboto-Regular.ttf" as="font" crossorigin> 12 <link rel="preload" href="/public/fonts/Roboto-Regular.ttf" as="font" crossorigin>
10 <link rel="preload" href="/public/fonts/Roboto-Thin.ttf"as="font" crossorigin> 13 <link rel="preload" href="/public/fonts/Roboto-Thin.ttf"as="font" crossorigin>
11 14
12 <!-- <link rel="preload" href="/public/fonts/atkinson-regular.woff" as="font" type="font/woff" crossorigin> --> 15 <!-- <link rel="preload" href="/public/fonts/atkinson-regular.woff" as="font" type="font/woff" crossorigin> -->
15 <!-- <link rel="preload" href="/public/fonts/more-sugar.extras.otf" as="font" type="font/otf" crossorigin> --> 18 <!-- <link rel="preload" href="/public/fonts/more-sugar.extras.otf" as="font" type="font/otf" crossorigin> -->
16 <link rel="preload" href="/public/fonts/more-sugar.regular.otf" as="font" type="font/otf" crossorigin> 19 <link rel="preload" href="/public/fonts/more-sugar.regular.otf" as="font" type="font/otf" crossorigin>
17 <link rel="preload" href="/public/fonts/more-sugar.thin.otf" as="font" type="font/otf" crossorigin> 20 <link rel="preload" href="/public/fonts/more-sugar.thin.otf" as="font" type="font/otf" crossorigin>
18 <link rel="preload" href="/public/epi_all_colors.svg" as="image"> 21 <link rel="preload" href="/public/epi_all_colors.svg" as="image">
19 22
23 <link rel="stylesheet" href="/public/design-system/styles/tokens.css" />
24 <link rel="stylesheet" href="/public/design-system/styles/themes.css" />
20 <link rel="preload" href="/base.css" as="style" /> 25 <link rel="preload" href="/base.css" as="style" />
21 <link rel="stylesheet" href="/base.css" /> 26 <link rel="stylesheet" href="/base.css" />
22 27 <link rel="stylesheet" href="/public/design-system/styles/components.css" />
28 <script
29 type="module"
30 src="/public/design-system/components/index.js"
31 ></script>
32
33 <script src="/public/pwa-register.js" defer></script>
23 34
24 <style> 35 <style>
25 .epi-photo { 36 .epi-photo {
26 display: flex; 37 display: flex;
27 justify-content: center; 38 justify-content: center;
44 } 55 }
45 56
46 li { 57 li {
47 margin-bottom: 0.75em; 58 margin-bottom: 0.75em;
48 } 59 }
60 }
61
62 #background {
63 position: fixed;
64 top: 0;
65 left: 0;
66 width: 100%;
67 height: 100%;
68 pointer-events: none;
69 z-index: 0;
70 }
71
72 #game {
73 position: fixed;
74 top: 0;
75 left: 0;
76 width: 100%;
77 height: 100%;
78 pointer-events: none;
79 z-index: 1;
80 cursor: default;
81 }
82
83 #game.active {
84 pointer-events: auto;
85 z-index: 100;
86 }
87
88 #gameUI {
89 position: fixed;
90 top: 10px;
91 right: 10px;
92 pointer-events: auto;
93 z-index: 101;
94 cursor: pointer;
95 }
96
97 .site-link-grid {
98 display: grid;
99 grid-template-columns: repeat(auto-fit, minmax(12rem, 1fr));
100 gap: var(--zen-space-4);
101 }
102
103 .site-link-grid > a {
104 color: inherit;
105 text-decoration: none;
106 }
107
108 .site-link-grid zen-card,
109 .site-link-grid article {
110 height: 100%;
111 }
112
113 .site-link-grid p {
114 margin: 0;
115 color: var(--zen-color-text-muted);
116 font-size: 0.9rem;
49 } 117 }
50 </style> 118 </style>
51 </head> 119 </head>
52 <body> 120 <body>
53 <style> 121 <style>
54 :root { 122 :root {
55 --header-background: var(--white); 123 --header-background: var(--white);
56 --header-color: rgb(var(--black)); 124 --header-color: var(--black);
57 --link-hover-accent: var(--awesome); 125 --link-hover-accent: var(--awesome);
58 } 126 }
59 127
60 /* Fixed icon in top left corner */ 128 #themeControl {
61 #themeToggle {
62 position: fixed; 129 position: fixed;
63 top: 20px; 130 top: 20px;
64 left: 20px; 131 left: 20px;
65 background: var(--header-background);
66 display: flex;
67 align-items: center;
68 border-radius: 50%;
69 cursor: pointer;
70 z-index: 1000; 132 z-index: 1000;
71 box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
72 transition: transform 0.2s ease; 133 transition: transform 0.2s ease;
73 } 134 }
74 135
75 #themeToggle:hover { 136 #themeControl:hover {
76 transform: scale(1.05); 137 transform: scale(1.05);
138 }
139
140 #themeToggle {
141 flex-direction: column;
142 min-width: 4.5rem;
143 padding: 0.35rem;
144 border-radius: 1.5rem;
145 }
146
147 #themeName {
148 font-family: "More", sans-serif;
149 font-size: 0.65rem;
150 line-height: 1;
77 } 151 }
78 152
79 /* Professional header */ 153 /* Professional header */
80 header { 154 header {
81 margin: auto; 155 margin: auto;
82 padding: 1.5em 1em; 156 padding: 1.5em 1em;
83 font-family: "More", sans-serif; 157 font-family: "More", sans-serif;
84 box-shadow: 0 2px 8px rgba(var(--black), 5%); 158 box-shadow: var(--zen-shadow-sm);
85 width: 720px; 159 width: 720px;
86 max-width: calc(100% - 2em); 160 max-width: calc(100% - 2em);
87 text-align: center; 161 text-align: center;
88 } 162 }
89 163
103 display: none; 177 display: none;
104 } 178 }
105 179
106 /* Mobile responsiveness */ 180 /* Mobile responsiveness */
107 @media (max-width: 720px) { 181 @media (max-width: 720px) {
108 #themeToggle { 182 #themeControl {
109 top: 15px; 183 top: 15px;
110 left: 15px; 184 left: 15px;
111 } 185 }
112 186
113 header { 187 header {
118 font-size: 1.5em; 192 font-size: 1.5em;
119 } 193 }
120 } 194 }
121 195
122 @media (max-width: 480px) { 196 @media (max-width: 480px) {
123 #themeToggle { 197 #themeControl {
124 top: 10px; 198 top: 10px;
125 left: 10px; 199 left: 10px;
126 } 200 }
127 201
128 #themeToggle img { 202 #themeToggle img {
144 --logo-invert: invert(0); 218 --logo-invert: invert(0);
145 --epi-grayscale: grayscale(0) brightness(1); 219 --epi-grayscale: grayscale(0) brightness(1);
146 } 220 }
147 221
148 /* 2. MANUAL DARK OVERRIDE */ 222 /* 2. MANUAL DARK OVERRIDE */
149 html.dark { 223 html[data-zen-theme="ink"] {
150 --logo-invert: invert(1); 224 --logo-invert: invert(1);
151 --epi-grayscale: grayscale(1); 225 --epi-grayscale: grayscale(1);
152 } 226 }
153 227
154 /* 3. MANUAL LIGHT OVERRIDE */ 228 /* 3. MANUAL LIGHT OVERRIDE */
155 html.light-mode { 229 html[data-zen-theme="paper"] {
156 --logo-invert: invert(0); 230 --logo-invert: invert(0);
157 --epi-grayscale: brightness(2.9) grayscale(1); 231 --epi-grayscale: brightness(2.9) grayscale(1);
158 } 232 }
233
234 html[data-zen-theme="playful"] {
235 --logo-invert: invert(0);
236 --epi-grayscale: saturate(1.25);
237 }
159 238
160 /* 4. SYSTEM PREFERENCE */ 239 /* 4. SYSTEM PREFERENCE */
161 @media (prefers-color-scheme: dark) { 240 @media (prefers-color-scheme: dark) {
162 :root:not(.light-mode) { 241 :root:not([data-zen-theme]) {
163 --logo-invert: invert(1); 242 --logo-invert: invert(1);
164 } 243 }
165 } 244 }
166 245
167 /* 5. APPLY TO ELEMENTS */ 246 /* 5. APPLY TO ELEMENTS */
176 filter: var(--epi-grayscale); 255 filter: var(--epi-grayscale);
177 transition: filter 0.3s ease; 256 transition: filter 0.3s ease;
178 } 257 }
179 </style> 258 </style>
180 259
181 <div id="themeToggle"> 260 <zen-button id="themeControl" variant="quiet">
182 <img id="epiChan" class="epi-logo" aria-label="Toggle dark mode" src="/public/epi_all_colors.svg" height="50" width="50"> 261 <button
183 </div> 262 id="themeToggle"
263 type="button"
264 aria-label="Change site theme"
265 >
266 <img
267 id="epiChan"
268 class="epi-logo"
269 alt=""
270 src="/public/epi_all_colors.svg"
271 height="50"
272 width="50"
273 >
274 <span id="themeName" aria-live="polite">Auto</span>
275 </button>
276 </zen-button>
184 277
185 <header> 278 <header>
186 <h1><a href="/">MrJuneJune</a></h1> 279 <h1><a href="/">MrJuneJune</a></h1>
187 </header> 280 </header>
188 <script src="/index.js"></script> 281 <script src="/index.js"></script>
189 282
190
191 <main> 283 <main>
192 <p>Hi, I am Juntae&mdash;usually June, and occasionally MrJuneJune because the domain name has committed me to the bit.</p> 284 <p>Hi, I am Juntae&mdash;usually June, and occasionally MrJuneJune because the domain name has committed me to the bit.</p>
193 285
194 <p>I am a Member of Technical Staff at Microsoft and an engineering leader with over 10 years of experience building products and infrastructure at Microsoft, Meta, Google, and startups. Recently, I have been working on Copilot Tasks, AI execution infrastructure, and SuperApp experiences at the kind of scale where "it worked on my machine" is not a release strategy.</p> 286 <p>I am a Member of Technical Staff at Microsoft and an engineering leader with over 10 years of experience building products and infrastructure at Microsoft, Meta, Google, and startups. Recently, I have been working on Copilot Tasks, AI execution infrastructure, and SuperApp experiences at the kind of scale where "it worked on my machine" is not a release strategy.</p>
195 287
198 <div class="epi-photo"> 290 <div class="epi-photo">
199 <img id="currentPhoto" style="opacity: 0; transition: opacity 0.2s;" /> 291 <img id="currentPhoto" style="opacity: 0; transition: opacity 0.2s;" />
200 </div> 292 </div>
201 293
202 <h2>Links</h2> 294 <h2>Links</h2>
203 <ul> 295 <div class="site-link-grid">
204 <li><a href="https://zenbu.babocoder.com/file/tip">Repository</a> - Check out my code</li> 296 <a href="https://zenbu.babocoder.com/file/tip">
205 <li><a href="/blog">Blogs</a> - My thoughts / Experiments </li> 297 <zen-card interactive>
206 <li><a href="/resume">Resume</a> - My professional experiences </li> 298 <article><h3>Repository</h3><p>Browse the code behind these experiments.</p></article>
207 <li><a href="/tools">Tools</a> - Things I made for myself </li> 299 </zen-card>
208 </ul> 300 </a>
301 <a href="/blog">
302 <zen-card interactive>
303 <article><h3>Blogs</h3><p>Thoughts, experiments, and technical notes.</p></article>
304 </zen-card>
305 </a>
306 <a href="/resume">
307 <zen-card interactive>
308 <article><h3>Resume</h3><p>Professional experience and selected work.</p></article>
309 </zen-card>
310 </a>
311 <a href="/tools">
312 <zen-card interactive>
313 <article><h3>Tools</h3><p>Small things I built for myself.</p></article>
314 </zen-card>
315 </a>
316 </div>
317 <canvas id="background"></canvas>
318 <canvas id="game"></canvas>
319 <canvas id="gameUI"></canvas>
209 </main> 320 </main>
210 <div style="display: flex; align-items: center; justify-content: center; margin: 30px 0px;"> 321 <div style="display: flex; align-items: center; justify-content: center; margin: 30px 0px;">
211 <small>&copy; 2026 June Park</small> 322 <small>&copy; 2026 June Park</small>
212 </div> 323 </div>
213 324
214 </body> 325 </body>
215 <script> 326 <script>
327 // Epi image
216 let arr = Array.from({ length: 18 }, (_, i) => i+1); 328 let arr = Array.from({ length: 18 }, (_, i) => i+1);
217 function setRandomImages() { 329 function setRandomImages() {
218 const randomIndex = Math.floor(Math.random() * arr.length); 330 const randomIndex = Math.floor(Math.random() * arr.length);
219 const pos = arr[randomIndex]; 331 const pos = arr[randomIndex];
220 currentPhoto.src = `/public/epi-photos/webp/${pos}.webp`; 332 currentPhoto.src = `/public/epi-photos/webp/${pos}.webp`;
223 }; 335 };
224 setTimeout(() => setRandomImages(), 1000); 336 setTimeout(() => setRandomImages(), 1000);
225 } 337 }
226 setRandomImages(); 338 setRandomImages();
227 </script> 339 </script>
340 <script src="/public/dog-game.js"></script>
228 </html> 341 </html>