Spaces:
Running
Running
| class CustomHeader extends HTMLElement { | |
| connectedCallback() { | |
| this.attachShadow({ mode: 'open' }); | |
| this.shadowRoot.innerHTML = ` | |
| <style> | |
| header { | |
| background: rgba(26, 26, 26, 0.95); | |
| backdrop-filter: blur(10px); | |
| border-bottom: 1px solid rgba(184, 134, 11, 0.3); | |
| position: fixed; | |
| top: 0; | |
| width: 100%; | |
| z-index: 1000; | |
| padding: 1rem 0; | |
| } | |
| .header-container { | |
| max-width: 1200px; | |
| margin: 0 auto; | |
| display: flex; | |
| align-items: center; | |
| justify-content: space-between; | |
| padding: 0 2rem; | |
| } | |
| .logo-text { | |
| font-family: 'Playfair Display', serif; | |
| font-size: 1.8rem; | |
| font-weight: 700; | |
| color: #f4f4f4; | |
| margin: 0; | |
| letter-spacing: -0.5px; | |
| } | |
| .logo-subtitle { | |
| font-family: 'Lato', sans-serif; | |
| font-size: 0.7rem; | |
| color: #b8860b; | |
| letter-spacing: 1.5px; | |
| text-transform: uppercase; | |
| display: block; | |
| margin-top: -2px; | |
| } | |
| .logo-link { | |
| text-decoration: none; | |
| transition: all 0.3s ease; | |
| } | |
| .logo-link:hover { | |
| opacity: 0.8; | |
| } | |
| .nav-list { | |
| display: flex; | |
| list-style: none; | |
| margin: 0; | |
| padding: 0; | |
| gap: 2rem; | |
| } | |
| .nav-link { | |
| font-family: 'Lato', sans-serif; | |
| color: #e0e0e0; | |
| text-decoration: none; | |
| font-size: 1rem; | |
| font-weight: 400; | |
| transition: all 0.3s ease; | |
| position: relative; | |
| padding: 0.5rem 0; | |
| } | |
| .nav-link:hover { | |
| color: #b8860b; | |
| } | |
| .nav-link::after { | |
| content: ''; | |
| position: absolute; | |
| bottom: 0; | |
| left: 0; | |
| width: 0; | |
| height: 2px; | |
| background: #b8860b; | |
| transition: width 0.3s ease; | |
| } | |
| .nav-link:hover::after { | |
| width: 100%; | |
| } | |
| .nav-item.subtle { | |
| margin-left: 1rem; | |
| position: relative; | |
| } | |
| .nav-item.subtle::before { | |
| content: '•'; | |
| color: #666; | |
| margin-right: 1rem; | |
| } | |
| .subtle-link { | |
| font-size: 0.9rem; | |
| color: #999 !important; | |
| } | |
| .subtle-link:hover { | |
| color: #b8860b !important; | |
| } | |
| .language-selector { | |
| position: relative; | |
| } | |
| .language-btn { | |
| background: rgba(184, 134, 11, 0.1); | |
| border: 1px solid rgba(184, 134, 11, 0.3); | |
| border-radius: 4px; | |
| padding: 0.5rem 1rem; | |
| color: #e0e0e0; | |
| cursor: pointer; | |
| display: flex; | |
| align-items: center; | |
| gap: 0.5rem; | |
| transition: all 0.3s ease; | |
| } | |
| .language-btn:hover { | |
| background: rgba(184, 134, 11, 0.2); | |
| } | |
| .language-dropdown { | |
| position: absolute; | |
| top: 100%; | |
| right: 0; | |
| background: #1a1a1a; | |
| border: 1px solid rgba(184, 134, 11, 0.3); | |
| border-radius: 4px; | |
| padding: 0.5rem; | |
| min-width: 150px; | |
| display: none; | |
| margin-top: 0.5rem; | |
| } | |
| .language-dropdown.show { | |
| display: block; | |
| } | |
| .lang-option { | |
| display: block; | |
| padding: 0.5rem 1rem; | |
| color: #e0e0e0; | |
| text-decoration: none; | |
| transition: all 0.3s ease; | |
| border-radius: 2px; | |
| } | |
| .lang-option:hover { | |
| background: rgba(184, 134, 11, 0.1); | |
| color: #b8860b; | |
| } | |
| .mobile-menu-btn { | |
| display: none; | |
| flex-direction: column; | |
| background: none; | |
| border: none; | |
| cursor: pointer; | |
| padding: 0.5rem; | |
| } | |
| .mobile-menu-btn span { | |
| width: 25px; | |
| height: 2px; | |
| background: #e0e0e0; | |
| margin: 3px 0; | |
| transition: 0.3s; | |
| } | |
| @media (max-width: 768px) { | |
| .header-container { | |
| padding: 0 1rem; | |
| } | |
| .main-nav, .language-selector { | |
| display: none; | |
| } | |
| .mobile-menu-btn { | |
| display: flex; | |
| } | |
| .logo-text { | |
| font-size: 1.4rem; | |
| } | |
| .logo-subtitle { | |
| font-size: 0.6rem; | |
| } | |
| } | |
| </style> | |
| <header class="header"> | |
| <div class="header-container"> | |
| <div class="logo"> | |
| <a href="index.html" class="logo-link"> | |
| <h1 class="logo-text" data-i18n="site_title">La Fragua del Logos</h1> | |
| <span class="logo-subtitle" data-i18n="site_subtitle">Forjando Palabras, Creando Sentido</span> | |
| </a> | |
| </div> | |
| <nav class="main-nav"> | |
| <ul class="nav-list"> | |
| <li class="nav-item"><a href="index.html" class="nav-link" data-i18n="nav_home">Inicio</a></li> | |
| <li class="nav-item"><a href="#services" class="nav-link" data-i18n="nav_services">Servicios</a></li> | |
| <li class="nav-item"><a href="blog.html" class="nav-link" data-i18n="nav_blog">Blog</a></li> | |
| <li class="nav-item"><a href="#contact" class="nav-link" data-i18n="nav_contact">Contacto</a></li> | |
| <li class="nav-item subtle"> | |
| <a href="about.html" class="nav-link subtle-link" data-i18n="nav_about">Sobre Mí</a> | |
| </li> | |
| </ul> | |
| </nav> | |
| <div class="language-selector"> | |
| <button class="language-btn" id="languageToggle"> | |
| <span class="flag">🇪🇸</span> | |
| <span class="language-code">ES</span> | |
| </button> | |
| <div class="language-dropdown" id="languageDropdown"> | |
| <a href="#" data-lang="es" class="lang-option">🇪🇸 Español</a> | |
| <a href="#" data-lang="en" class="lang-option">🇬🇧 English</a> | |
| <a href="#" data-lang="fr" class="lang-option">🇫🇷 Français</a> | |
| </div> | |
| </div> | |
| <button class="mobile-menu-btn" id="mobileMenuToggle"> | |
| <span></span> | |
| <span></span> | |
| <span></span> | |
| </button> | |
| </div> | |
| </header> | |
| <script> | |
| document.addEventListener('DOMContentLoaded', () => { | |
| const shadowRoot = this.shadowRoot; | |
| const languageToggle = shadowRoot.getElementById('languageToggle'); | |
| const languageDropdown = shadowRoot.getElementById('languageDropdown'); | |
| // Language toggle | |
| languageToggle.addEventListener('click', (e) => { | |
| e.stopPropagation(); | |
| languageDropdown.classList.toggle('show'); | |
| }); | |
| // Language selection | |
| shadowRoot.querySelectorAll('.lang-option').forEach(option => { | |
| option.addEventListener('click', (e) => { | |
| e.preventDefault(); | |
| const lang = option.getAttribute('data-lang'); | |
| localStorage.setItem('language', lang); | |
| document.dispatchEvent(new CustomEvent('languageChange', { detail: lang })); | |
| languageDropdown.classList.remove('show'); | |
| }); | |
| }); | |
| // Close dropdown when clicking outside | |
| document.addEventListener('click', () => { | |
| languageDropdown.classList.remove('show'); | |
| }); | |
| // Mobile menu toggle | |
| const mobileMenuToggle = shadowRoot.getElementById('mobileMenuToggle'); | |
| const mainNav = shadowRoot.querySelector('.main-nav'); | |
| mobileMenuToggle.addEventListener('click', () => { | |
| const isHidden = mainNav.style.display === 'none'; | |
| mainNav.style.display = isHidden ? 'block' : 'none'; | |
| feather.replace(); | |
| }); | |
| feather.replace(); | |
| }); | |
| </script> | |
| `; | |
| } | |
| } | |
| customElements.define('custom-header', CustomHeader); |