| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8" /> | |
| <!-- Imaging Plaza brand mark. The remote favicon is referenced first so | |
| it loads from the user's network; if a local high-res copy is later | |
| dropped in `public/imaging-plaza-mark.svg|.png`, replace the href. --> | |
| <link rel="icon" type="image/x-icon" href="https://imaging-plaza.epfl.ch/favicon.ico" /> | |
| <link rel="alternate icon" href="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100'%3E%3Crect width='100' height='100' rx='20' fill='%2300A991'/%3E%3Ctext x='50' y='66' font-family='system-ui' font-size='44' font-weight='700' text-anchor='middle' fill='white'%3EIP%3C/text%3E%3C/svg%3E" /> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0" /> | |
| <meta name="color-scheme" content="dark light" /> | |
| <link rel="preconnect" href="https://fonts.googleapis.com" /> | |
| <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> | |
| <link | |
| rel="stylesheet" | |
| href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&family=JetBrains+Mono:wght@400;500;700&display=swap" | |
| /> | |
| <script> | |
| // Apply the persisted theme before React mounts so the first paint is | |
| // already correct (no flash of wrong theme). | |
| (function () { | |
| try { | |
| var stored = localStorage.getItem("theme"); | |
| var prefersDark = window.matchMedia( | |
| "(prefers-color-scheme: dark)" | |
| ).matches; | |
| var theme = stored || (prefersDark ? "dark" : "light"); | |
| document.documentElement.dataset.theme = theme; | |
| } catch (e) { | |
| document.documentElement.dataset.theme = "dark"; | |
| } | |
| })(); | |
| </script> | |
| <title>ai_plaza · imaging assistant</title> | |
| </head> | |
| <body> | |
| <div id="root"></div> | |
| <script type="module" src="/src/main.tsx"></script> | |
| </body> | |
| </html> | |