Mavidart's picture
Manual changes saved
b50fbf2 verified
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);