create a website called "algorithmic garden" that uses webxr or xr.js plus three.js to display a list of .glb models that can overlayed over whatever a cellphone camera sees (AR). There should be pinch to zoom and rotate commands on the phone interface.
e34da73 verified | class CustomHeader extends HTMLElement { | |
| connectedCallback() { | |
| this.attachShadow({ mode: 'open' }); | |
| this.shadowRoot.innerHTML = ` | |
| <style> | |
| :host { | |
| display: block; | |
| width: 100%; | |
| } | |
| header { | |
| background: linear-gradient(135deg, rgba(16, 185, 129, 0.1) 0%, rgba(5, 150, 105, 0.2) 100%); | |
| backdrop-filter: blur(10px); | |
| } | |
| .theme-toggle { | |
| transition: all 0.3s ease; | |
| } | |
| .theme-toggle:hover { | |
| transform: rotate(30deg); | |
| } | |
| @media (max-width: 640px) { | |
| .logo-text { | |
| display: none; | |
| } | |
| } | |
| </style> | |
| <header class="py-4 px-6 border-b border-emerald-200 dark:border-gray-700"> | |
| <div class="container mx-auto flex justify-between items-center"> | |
| <a href="/" class="flex items-center gap-2"> | |
| <i data-feather="leaf" class="text-emerald-600 dark:text-emerald-400"></i> | |
| <span class="logo-text text-xl font-bold text-emerald-800 dark:text-emerald-200">Algorithmic ARboretum</span> | |
| </a> | |
| <div class="flex items-center gap-4"> | |
| <button class="theme-toggle p-2 rounded-full bg-emerald-100 dark:bg-gray-700 text-emerald-600 dark:text-emerald-300"> | |
| <i data-feather="moon" class="dark:hidden"></i> | |
| <i data-feather="sun" class="hidden dark:block"></i> | |
| </button> | |
| </div> | |
| </div> | |
| </header> | |
| `; | |
| // Theme toggle functionality | |
| const toggleBtn = this.shadowRoot.querySelector('.theme-toggle'); | |
| toggleBtn.addEventListener('click', () => { | |
| document.documentElement.classList.toggle('dark'); | |
| localStorage.setItem('theme', document.documentElement.classList.contains('dark') ? 'dark' : 'light'); | |
| feather.replace(); | |
| }); | |
| // Check for saved theme preference | |
| if (localStorage.getItem('theme') === 'dark' || (!localStorage.getItem('theme') && window.matchMedia('(prefers-color-scheme: dark)').matches)) { | |
| document.documentElement.classList.add('dark'); | |
| } | |
| feather.replace(); | |
| } | |
| } | |
| customElements.define('custom-header', CustomHeader); |