223 lines
4.6 KiB
Svelte
223 lines
4.6 KiB
Svelte
|
|
<script>
|
||
|
|
export let activeSection = 'home';
|
||
|
|
|
||
|
|
let isMenuOpen = false;
|
||
|
|
|
||
|
|
const toggleMenu = () => {
|
||
|
|
isMenuOpen = !isMenuOpen;
|
||
|
|
};
|
||
|
|
|
||
|
|
const menuItems = [
|
||
|
|
{ id: 'home', label: 'Accueil', icon: '🌟' },
|
||
|
|
{ id: 'about', label: 'Découvrir', icon: '✨' },
|
||
|
|
{ id: 'predictions', label: 'Prédictions', icon: '📅' },
|
||
|
|
{ id: 'science', label: 'Science', icon: '🔭' },
|
||
|
|
{ id: 'culture', label: 'Culture', icon: '🌍' },
|
||
|
|
{ id: 'observatory', label: 'Observer', icon: '👁️' }
|
||
|
|
];
|
||
|
|
|
||
|
|
const scrollToSection = (id) => {
|
||
|
|
document.getElementById(id)?.scrollIntoView({ behavior: 'smooth' });
|
||
|
|
isMenuOpen = false;
|
||
|
|
};
|
||
|
|
</script>
|
||
|
|
|
||
|
|
<nav class="navbar" class:scrolled={activeSection !== 'home'}>
|
||
|
|
<div class="container">
|
||
|
|
<div class="nav-content">
|
||
|
|
<a href="#home" class="logo" on:click|preventDefault={() => scrollToSection('home')}>
|
||
|
|
<span class="logo-icon">☥</span>
|
||
|
|
<span class="logo-text">Sirius Gwada</span>
|
||
|
|
</a>
|
||
|
|
|
||
|
|
<button class="menu-toggle" on:click={toggleMenu} aria-label="Menu">
|
||
|
|
<span class="hamburger" class:active={isMenuOpen}></span>
|
||
|
|
</button>
|
||
|
|
|
||
|
|
<ul class="nav-menu" class:open={isMenuOpen}>
|
||
|
|
{#each menuItems as item}
|
||
|
|
<li>
|
||
|
|
<a
|
||
|
|
href="#{item.id}"
|
||
|
|
class:active={activeSection === item.id}
|
||
|
|
on:click|preventDefault={() => scrollToSection(item.id)}
|
||
|
|
>
|
||
|
|
<span class="nav-icon">{item.icon}</span>
|
||
|
|
<span class="nav-label">{item.label}</span>
|
||
|
|
</a>
|
||
|
|
</li>
|
||
|
|
{/each}
|
||
|
|
</ul>
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
</nav>
|
||
|
|
|
||
|
|
<style>
|
||
|
|
.navbar {
|
||
|
|
position: fixed;
|
||
|
|
top: 0;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
z-index: 1000;
|
||
|
|
background: rgba(26, 26, 46, 0.95);
|
||
|
|
backdrop-filter: blur(10px);
|
||
|
|
transition: var(--transition-base);
|
||
|
|
border-bottom: 1px solid transparent;
|
||
|
|
}
|
||
|
|
|
||
|
|
.navbar.scrolled {
|
||
|
|
border-bottom-color: rgba(255, 215, 0, 0.2);
|
||
|
|
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3);
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-content {
|
||
|
|
display: flex;
|
||
|
|
justify-content: space-between;
|
||
|
|
align-items: center;
|
||
|
|
padding: 1rem 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 0.5rem;
|
||
|
|
text-decoration: none;
|
||
|
|
color: var(--color-primary);
|
||
|
|
font-family: var(--font-display);
|
||
|
|
font-size: 1.5rem;
|
||
|
|
transition: var(--transition-base);
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo:hover {
|
||
|
|
transform: scale(1.05);
|
||
|
|
}
|
||
|
|
|
||
|
|
.logo-icon {
|
||
|
|
font-size: 2rem;
|
||
|
|
animation: rotate 20s linear infinite;
|
||
|
|
}
|
||
|
|
|
||
|
|
.menu-toggle {
|
||
|
|
display: none;
|
||
|
|
background: none;
|
||
|
|
border: none;
|
||
|
|
cursor: pointer;
|
||
|
|
padding: 0.5rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
.hamburger {
|
||
|
|
display: block;
|
||
|
|
width: 25px;
|
||
|
|
height: 2px;
|
||
|
|
background: var(--color-primary);
|
||
|
|
position: relative;
|
||
|
|
transition: var(--transition-base);
|
||
|
|
}
|
||
|
|
|
||
|
|
.hamburger::before,
|
||
|
|
.hamburger::after {
|
||
|
|
content: '';
|
||
|
|
position: absolute;
|
||
|
|
left: 0;
|
||
|
|
width: 100%;
|
||
|
|
height: 2px;
|
||
|
|
background: var(--color-primary);
|
||
|
|
transition: var(--transition-base);
|
||
|
|
}
|
||
|
|
|
||
|
|
.hamburger::before {
|
||
|
|
top: -8px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.hamburger::after {
|
||
|
|
bottom: -8px;
|
||
|
|
}
|
||
|
|
|
||
|
|
.hamburger.active {
|
||
|
|
background: transparent;
|
||
|
|
}
|
||
|
|
|
||
|
|
.hamburger.active::before {
|
||
|
|
transform: rotate(45deg);
|
||
|
|
top: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.hamburger.active::after {
|
||
|
|
transform: rotate(-45deg);
|
||
|
|
bottom: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu {
|
||
|
|
display: flex;
|
||
|
|
list-style: none;
|
||
|
|
gap: 2rem;
|
||
|
|
margin: 0;
|
||
|
|
padding: 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu a {
|
||
|
|
display: flex;
|
||
|
|
align-items: center;
|
||
|
|
gap: 0.5rem;
|
||
|
|
text-decoration: none;
|
||
|
|
color: var(--color-light);
|
||
|
|
transition: var(--transition-base);
|
||
|
|
position: relative;
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu a:hover,
|
||
|
|
.nav-menu a.active {
|
||
|
|
color: var(--color-primary);
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu a::after {
|
||
|
|
content: '';
|
||
|
|
position: absolute;
|
||
|
|
bottom: -5px;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
height: 2px;
|
||
|
|
background: var(--color-primary);
|
||
|
|
transform: scaleX(0);
|
||
|
|
transition: var(--transition-base);
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu a.active::after {
|
||
|
|
transform: scaleX(1);
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-icon {
|
||
|
|
font-size: 1.2rem;
|
||
|
|
}
|
||
|
|
|
||
|
|
/* Mobile */
|
||
|
|
@media (max-width: 768px) {
|
||
|
|
.menu-toggle {
|
||
|
|
display: block;
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu {
|
||
|
|
position: fixed;
|
||
|
|
top: 70px;
|
||
|
|
left: 0;
|
||
|
|
right: 0;
|
||
|
|
background: rgba(26, 26, 46, 0.98);
|
||
|
|
flex-direction: column;
|
||
|
|
padding: 2rem;
|
||
|
|
transform: translateY(-100%);
|
||
|
|
opacity: 0;
|
||
|
|
transition: var(--transition-base);
|
||
|
|
border-bottom: 2px solid var(--color-primary);
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu.open {
|
||
|
|
transform: translateY(0);
|
||
|
|
opacity: 1;
|
||
|
|
}
|
||
|
|
|
||
|
|
.nav-menu a {
|
||
|
|
padding: 0.5rem 0;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
</style>
|