|
89 | 89 | position: relative; |
90 | 90 | } |
91 | 91 |
|
92 | | - .nav-center .nav-link-item { |
| 92 | + .nav-link-btn { |
93 | 93 | text-decoration: none; |
94 | 94 | color: var(--text-muted); |
95 | 95 | font-weight: 600; |
|
108 | 108 | position: relative; |
109 | 109 | } |
110 | 110 |
|
111 | | - .nav-center .nav-link-item:hover, |
112 | | - .nav-center .nav-link-item.active-page, |
113 | | - .nav-center .dropdown:hover > .nav-link-item { |
| 111 | + .nav-link-btn:hover, |
| 112 | + .nav-link-btn.active-page, |
| 113 | + .dropdown:hover > .nav-link-btn { |
114 | 114 | color: var(--accent-blue); |
115 | 115 | } |
116 | 116 |
|
|
122 | 122 | height: 3px; |
123 | 123 | background: var(--accent-blue); |
124 | 124 | border-radius: 3px; |
125 | | - transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1), left 0.3s cubic-bezier(0.4, 0, 0.2, 1); |
| 125 | + transition: width 0.25s cubic-bezier(0.4, 0, 0.2, 1), transform 0.25s cubic-bezier(0.4, 0, 0.2, 1); |
126 | 126 | z-index: 1; |
127 | 127 | box-shadow: 0 0 10px rgba(0, 210, 255, 0.5); |
128 | 128 | pointer-events: none; |
| 129 | + opacity: 0; |
129 | 130 | } |
130 | 131 |
|
131 | 132 | /* DROPDOWN APPS */ |
|
344 | 345 | </div> |
345 | 346 | <div class="nav-center" id="navCenter"> |
346 | 347 | <div class="nav-indicator" id="navIndicator"></div> |
347 | | - <a href="/" class="nav-link-item {% if page.url == '/' %}active-page{% endif %}">Hub</a> |
348 | | - <a href="/newsy" class="nav-link-item {% if page.url contains 'newsy' %}active-page{% endif %}">Newsy</a> |
349 | | - <a href="/blog" class="nav-link-item {% if page.url contains 'blog' %}active-page{% endif %}">Blog</a> |
350 | | - <a href="/homelab" class="nav-link-item {% if page.url contains 'homelab' %}active-page{% endif %}">HomeLab</a> |
351 | | - <a href="/sponsors" class="nav-link-item {% if page.url contains 'sponsors' %}active-page{% endif %}">Sponsors</a> |
| 348 | + <a href="/" class="nav-link-btn {% if page.url == '/' %}active-page{% endif %}">Hub</a> |
| 349 | + <a href="/newsy" class="nav-link-btn {% if page.url contains 'newsy' %}active-page{% endif %}">Newsy</a> |
| 350 | + <a href="/blog" class="nav-link-btn {% if page.url contains 'blog' %}active-page{% endif %}">Blog</a> |
| 351 | + <a href="/homelab" class="nav-link-btn {% if page.url contains 'homelab' %}active-page{% endif %}">HomeLab</a> |
| 352 | + <a href="/sponsors" class="nav-link-btn {% if page.url contains 'sponsors' %}active-page{% endif %}">Sponsors</a> |
352 | 353 |
|
353 | | - <div class="dropdown"> |
354 | | - <a href="#" class="nav-link-item dropbtn {% if page.url contains 'orbit' or page.url contains 'homelab-cc' or page.url contains 'phone' or page.url contains 'apps' %}active-page{% endif %}" onclick="return false;">Apps ▾</a> |
| 354 | + <div class="dropdown" id="dropdownApps"> |
| 355 | + <a href="#" class="nav-link-btn dropbtn {% if page.url contains 'orbit' or page.url contains 'homelab-cc' or page.url contains 'phone' or page.url contains 'apps' %}active-page{% endif %}" onclick="return false;">Apps ▾</a> |
355 | 356 | <div class="dropdown-content"> |
356 | 357 | <div class="dropdown-links-wrapper"> |
357 | 358 | <a href="/orbit">Orbit <span>↗</span></a> |
|
366 | 367 | </div> |
367 | 368 | </div> |
368 | 369 |
|
369 | | - <a href="/benchmarks" class="nav-link-item {% if page.url contains 'benchmarks' %}active-page{% endif %}">Benchmarks</a> |
370 | | - <a href="/kontakt" class="nav-link-item {% if page.url contains 'kontakt' %}active-page{% endif %}">Kontakt</a> |
| 370 | + <a href="/benchmarks" class="nav-link-btn {% if page.url contains 'benchmarks' %}active-page{% endif %}">Benchmarks</a> |
| 371 | + <a href="/kontakt" class="nav-link-btn {% if page.url contains 'kontakt' %}active-page{% endif %}">Kontakt</a> |
371 | 372 | </div> |
372 | 373 | </nav> |
373 | 374 |
|
@@ -456,60 +457,49 @@ <h4>Follow DevLabStudy</h4> |
456 | 457 | </div> |
457 | 458 | </footer> |
458 | 459 |
|
459 | | - <!-- SKRYPT WSKAŹNIKA NAWIGACJI --> |
| 460 | + <!-- SKRYPT NAWIGACJI --> |
460 | 461 | <script> |
461 | | - document.addEventListener('DOMContentLoaded', () => { |
| 462 | + window.addEventListener('DOMContentLoaded', () => { |
462 | 463 | const navCenter = document.getElementById('navCenter'); |
463 | 464 | const indicator = document.getElementById('navIndicator'); |
464 | | - |
465 | | - // Pobieramy aktywne linki widoczne na pasku |
466 | | - const activeLink = navCenter.querySelector('.nav-link-item.active-page') || navCenter.querySelector('.nav-link-item'); |
| 465 | + const activeLink = navCenter.querySelector('.nav-link-btn.active-page') || navCenter.querySelector('.nav-link-btn'); |
467 | 466 |
|
468 | | - function moveIndicatorToEl(targetEl) { |
| 467 | + function positionIndicator(targetEl) { |
469 | 468 | if (!targetEl) return; |
470 | | - indicator.style.width = targetEl.offsetWidth + 'px'; |
471 | | - indicator.style.left = targetEl.offsetLeft + 'px'; |
472 | | - } |
| 469 | + const parentRect = navCenter.getBoundingClientRect(); |
| 470 | + const targetRect = targetEl.getBoundingClientRect(); |
473 | 471 |
|
474 | | - // Prawidłowe załadowanie pozycji po wyrenderowaniu strony |
475 | | - const savedLeft = sessionStorage.getItem('nav_indicator_left'); |
476 | | - const savedWidth = sessionStorage.getItem('nav_indicator_width'); |
477 | | - |
478 | | - if (savedLeft !== null && savedWidth !== null) { |
479 | | - indicator.style.transition = 'none'; |
480 | | - indicator.style.left = savedLeft + 'px'; |
481 | | - indicator.style.width = savedWidth + 'px'; |
482 | | - |
483 | | - // Wymuszenie przeliczenia przez przeglądarkę |
484 | | - void indicator.offsetHeight; |
485 | | - indicator.style.transition = 'width 0.3s cubic-bezier(0.4, 0, 0.2, 1), left 0.3s cubic-bezier(0.4, 0, 0.2, 1)'; |
486 | | - } else { |
487 | | - moveIndicatorToEl(activeLink); |
| 472 | + const leftOffset = targetRect.left - parentRect.left; |
| 473 | + const targetWidth = targetRect.width; |
| 474 | + |
| 475 | + indicator.style.width = `${targetWidth}px`; |
| 476 | + indicator.style.transform = `translateX(${leftOffset}px)`; |
| 477 | + indicator.style.opacity = '1'; |
488 | 478 | } |
489 | 479 |
|
490 | | - // Każdy widoczny element w pasku głównym |
491 | | - const navItems = navCenter.querySelectorAll('.nav-link-item, .dropdown'); |
492 | | - navItems.forEach(item => { |
493 | | - const targetHeaderEl = item.classList.contains('dropdown') ? item.querySelector('.dropbtn') : item; |
| 480 | + // Ustaw pozycję po pełnym wyrenderowaniu i załadowaniu fontów |
| 481 | + document.fonts.ready.then(() => { |
| 482 | + positionIndicator(activeLink); |
| 483 | + }); |
| 484 | + |
| 485 | + // Obsługa najechania na każdy przycisk na pasku |
| 486 | + const mainNavBtns = navCenter.querySelectorAll(':scope > .nav-link-btn, :scope > .dropdown'); |
| 487 | + mainNavBtns.forEach(item => { |
| 488 | + const buttonToHighlight = item.classList.contains('dropdown') ? item.querySelector('.dropbtn') : item; |
494 | 489 |
|
495 | 490 | item.addEventListener('mouseenter', () => { |
496 | | - moveIndicatorToEl(targetHeaderEl); |
497 | | - }); |
498 | | - |
499 | | - // Rejestrujemy kliknięcie w link i zapisujemy pozycję docelową |
500 | | - const allAnchors = item.querySelectorAll('a'); |
501 | | - allAnchors.forEach(anchor => { |
502 | | - anchor.addEventListener('click', () => { |
503 | | - if (anchor.getAttribute('href') === '#') return; |
504 | | - sessionStorage.setItem('nav_indicator_left', targetHeaderEl.offsetLeft); |
505 | | - sessionStorage.setItem('nav_indicator_width', targetHeaderEl.offsetWidth); |
506 | | - }); |
| 491 | + positionIndicator(buttonToHighlight); |
507 | 492 | }); |
508 | 493 | }); |
509 | 494 |
|
510 | | - // Po opuszczeniu paska nawigacji powróć do aktywnej strony |
| 495 | + // Opuszczenie paska nawigacji -> powrót na aktywny przycisk |
511 | 496 | navCenter.addEventListener('mouseleave', () => { |
512 | | - moveIndicatorToEl(activeLink); |
| 497 | + positionIndicator(activeLink); |
| 498 | + }); |
| 499 | + |
| 500 | + // Odświeżenie pozycji przy zmianie rozmiaru okna |
| 501 | + window.addEventListener('resize', () => { |
| 502 | + positionIndicator(activeLink); |
513 | 503 | }); |
514 | 504 | }); |
515 | 505 | </script> |
|
0 commit comments