Mercurial
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—usually June, and occasionally MrJuneJune because the domain name has committed me to the bit.</p> | 284 <p>Hi, I am Juntae—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>© 2026 June Park</small> | 322 <small>© 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> |