Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
aca41b8
Add email sending on approve from staff page
Monster0506 Nov 25, 2025
34b44c7
Integrate modal into application submission
Monster0506 Nov 28, 2025
ce36fd8
Add start date
Monster0506 Nov 28, 2025
32a7cae
Reformat guide page
Monster0506 Nov 28, 2025
5a06429
Merge pull request #34 from hacksu/update-guide
Monster0506 Nov 28, 2025
4642d25
Merge pull request #35 from hacksu/update-sponsors
Monster0506 Nov 28, 2025
d60453b
Merge pull request #30 from Monster0506/email-sending
Monster0506 Nov 28, 2025
9a0311b
Merge pull request #32 from Monster0506/remove-ms-auth
Monster0506 Nov 28, 2025
2f4cbe5
Merge pull request #33 from Monster0506/set-start-date
Monster0506 Nov 28, 2025
7ebd24a
Merge pull request #36 from hacksu/update-guide-work
Monster0506 Nov 28, 2025
e8389a8
Add schedule page
Monster0506 Nov 28, 2025
11beb20
Add link to schedule page from landing
Monster0506 Nov 28, 2025
083ab31
Merge branch 'dev' of https://github.com/monster0506/khe-renaissance …
Monster0506 Nov 28, 2025
f7417e6
Merge pull request #39 from hacksu/updates/schedule
Monster0506 Nov 28, 2025
186cc95
Add prizes to landing page
Monster0506 Nov 28, 2025
b38469c
Merge pull request #40 from hacksu/updates/prizes
Monster0506 Nov 28, 2025
975b6af
Navbar improvements
Monster0506 Dec 1, 2025
f31ee0c
Merge pull request #41 from hacksu/ui/navbar
Monster0506 Dec 1, 2025
97a03cd
Fix the weird things with other pages
Monster0506 Dec 1, 2025
7ed78bf
Merge pull request #42 from hacksu/ui/navbar
Monster0506 Dec 1, 2025
1823199
Add board and bevy to sponsor section
Monster0506 Dec 1, 2025
567fa07
Add board and bevy logo
Monster0506 Dec 1, 2025
db764c7
Merge pull request #43 from hacksu/updates/sponsorship
Monster0506 Dec 1, 2025
97ec2b9
Modify schedule for YouTube Deep Dive
Monster0506 Dec 2, 2025
c07723e
Merge pull request #44 from hacksu/updates/schedule-additions
Monster0506 Dec 2, 2025
f36284c
Merge pull request #45 from hacksu/updates/schedule
Monster0506 Dec 2, 2025
621dc12
Fix navbar appearance on home page
Monster0506 Dec 2, 2025
dbb4811
Remove debugging
Monster0506 Dec 2, 2025
8c5828c
Merge pull request #46 from hacksu/ui/navbar-fixes
Monster0506 Dec 2, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added src/assets/sponsors/board_and_bevy.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
241 changes: 211 additions & 30 deletions src/components/navbar/Navbar.svelte
Original file line number Diff line number Diff line change
@@ -1,46 +1,227 @@
<script lang="ts">
import { authClient } from "$lib/client";
import { onMount } from "svelte";
import { page } from "$app/stores";
import Logo from "../../assets/2026logo.png";
import devPost from "../../assets/devPost.png";
import NavbarItem from "./NavbarItem.svelte";

let session = authClient.useSession();
// let element: HTMLDivElement

// onMount(() => {
// const scrollHandler = () => {
// const progress = window.pageYOffset / window.innerHeight;
// if (progress > 1) return;
// element.style.backgroundColor = `rgba(182, 182, 182, ${progress.toFixed(2)}`;
// };

// window.addEventListener("scroll", scrollHandler);
// return () => {
// window.removeEventListener("scroll", scrollHandler)
// }
// });
let scrolled = $state(false);
let mobileMenuOpen = $state(false);


// Navigation links - some are pages, some are homepage sections, sorry, nothing I can do about that.
const navLinks = [
{ href: "/", label: "Home", type: "page" },
{ href: "/schedule", label: "Schedule", type: "page" },
{ href: "/#prizes", label: "Prizes", type: "section" },
{ href: "/#faq", label: "FAQ", type: "section" },
{ href: "/#sponsors", label: "Sponsors", type: "section" }
];

onMount(() => {
const handleScroll = () => {
scrolled = window.scrollY > 100;
};

window.addEventListener("scroll", handleScroll);
return () => window.removeEventListener("scroll", handleScroll);
});

function isActive(href: string): boolean {
return $page.url.pathname === href;
}
</script>

<div class="fixed w-full flex flex-row py-2 px-5 justify-between text-white gap-6 bg-secondary bg-opacity-25">
<div class="flex justify-between w-full">
<a href="https://mlh.io/seasons/2026/events" target="_blank">
<img decoding="async" src="https://s3.amazonaws.com/logged-assets/trust-badge/2026/mlh-trust-badge-2026-red.svg" alt="Major League Hacking 2026 Hackathon Season" class="w-20 absolute top-0 left-0">
</a>
</div>
<div class="flex justify-end lg:justify-center w-full">
<NavbarItem href="/"><img src={Logo} width={80} alt="Kent Hack Enough" /></NavbarItem>
<a href="https://mlh.io/seasons/2026/events" target="_blank" class="fixed top-0 left-0 z-50">
<img
decoding="async"
src="https://s3.amazonaws.com/logged-assets/trust-badge/2026/mlh-trust-badge-2026-red.svg"
alt="Major League Hacking 2026 Hackathon Season"
class="w-20"
>
</a>

<nav
class="fixed top-0 left-1/2 -translate-x-1/2 z-40 transition-all duration-500 ease-out"
class:scrolled
style="
margin-top: {scrolled ? '0' : '1.5rem'};
width: {scrolled ? '100%' : 'min(90%, 900px)'};
border-radius: {scrolled ? '0' : '9999px'};
"
>
<div
class="relative backdrop-blur-sm bg-white bg-opacity-30 border border-white border-opacity-20 shadow-lg transition-all duration-500"
style="border-radius: inherit;"
>
<div
class="absolute inset-0 bg-gradient-to-r from-primary/10 via-transparent to-accent/10 pointer-events-none transition-opacity duration-500"
style="border-radius: inherit; opacity: {scrolled ? '1' : '0.5'};"
></div>

<div class="relative px-6 py-3 flex items-center justify-center gap-4">
<div class="hidden lg:flex items-center gap-1 flex-1 justify-end" style="padding-left: {$page.url.pathname === '/' ? '0' : (scrolled ? '100px' : '0')};">
{#each navLinks.slice(1) as link}
<NavbarItem
href={link.href}
class="relative px-3 py-2 text-gray-900 font-medium transition-all duration-300 hover:text-gray-600 group text-sm"
>
<span class="relative z-10">{link.label}</span>

{#if isActive(link.href)}
<div class="absolute bottom-0 left-1/2 -translate-x-1/2 w-1/2 h-0.5 bg-accent rounded-full"></div>
{/if}

<div class="absolute inset-0 bg-white/10 rounded-lg scale-0 group-hover:scale-100 transition-transform duration-300"></div>
</NavbarItem>
{/each}
</div>

<NavbarItem href="/" class="flex-shrink-0 mx-4">
<img
src={Logo}
width={scrolled ? 60 : 70}
alt="Kent Hack Enough"
class="transition-all duration-500 hover:scale-110 hover:rotate-3"
/>
</NavbarItem>

<div class="hidden lg:flex items-center gap-3 flex-1 justify-end">
<NavbarItem
href="https://kent-hack-enough-2026.devpost.com/"
target="_blank"
rel="noopener noreferrer"
class="transition-transform duration-300 hover:scale-110 hover:rotate-6"
>
<img src={devPost} width={40} alt="DevPost" />
</NavbarItem>

{#if $session.data}
<NavbarItem
href="/profile"
class="px-4 py-2 text-gray-900 font-medium bg-accent/20 hover:bg-accent/30 rounded-full transition-all duration-300 hover:shadow-lg hover:shadow-accent/50 text-sm"
>
{$session.data.user.email}
</NavbarItem>
{:else}
<NavbarItem
href="/auth/login"
class="px-5 py-2 text-gray-900 font-semibold bg-accent rounded-full transition-all duration-300 hover:shadow-lg hover:shadow-accent/50 hover:scale-105 hover:bg-accent/80 text-sm"
>
Login
</NavbarItem>
{/if}
</div>

<button
class="lg:hidden absolute right-4 w-10 h-10 flex flex-col justify-center items-center gap-1.5 group"
onclick={() => mobileMenuOpen = !mobileMenuOpen}
aria-label="Toggle menu"
>
<span
class="w-6 h-0.5 bg-offwhite rounded-full transition-all duration-300 group-hover:bg-white"
class:rotate-45={mobileMenuOpen}
class:translate-y-2={mobileMenuOpen}
></span>
<span
class="w-6 h-0.5 bg-offwhite rounded-full transition-all duration-300 group-hover:bg-white"
class:opacity-0={mobileMenuOpen}
></span>
<span
class="w-6 h-0.5 bg-offwhite rounded-full transition-all duration-300 group-hover:bg-white"
class:-rotate-45={mobileMenuOpen}
class:-translate-y-2={mobileMenuOpen}
></span>
</button>
</div>
</div>
<div class="hidden lg:flex gap-4 justify-end items-center w-full">
<NavbarItem href="https://kent-hack-enough-2026.devpost.com/" target="_blank" rel="noopener noreferrer"><img src={devPost} width={40} alt="DevPost" /></NavbarItem>
{#if $session.data}
<NavbarItem href="/profile" class="text-xl text-offwhite">{$session.data.user.email}</NavbarItem>
{:else}
<NavbarItem href="/auth/login" class="text-xl text-offwhite">Login</NavbarItem>
{/if}
</nav>

{#if mobileMenuOpen}
<div
class="fixed inset-0 z-30 lg:hidden"
onclick={() => mobileMenuOpen = false}
>
<div class="absolute inset-0 bg-black/50 backdrop-blur-sm animate-fade-in"></div>

<div
class="absolute top-20 right-4 left-4 bg-secondary/95 backdrop-blur-lg rounded-2xl shadow-2xl border border-white/20 overflow-hidden animate-slide-down"
onclick={(e) => e.stopPropagation()}
>
<div class="p-6 space-y-2">
{#each navLinks as link}
<NavbarItem
href={link.href}
class="block px-4 py-3 text-white font-medium rounded-lg transition-all duration-300 hover:bg-white/90 hover:translate-x-2"
onclick={() => mobileMenuOpen = false}
>
<span class="flex items-center gap-3">
{#if isActive(link.href)}
<span class="w-1.5 h-1.5 bg-accent rounded-full"></span>
{/if}
{link.label}
</span>
</NavbarItem>
{/each}

<div class="h-px bg-white/10 my-4"></div>

<NavbarItem
href="https://kent-hack-enough-2026.devpost.com/"
target="_blank"
rel="noopener noreferrer"
class="flex items-center gap-3 px-4 py-3 text-white font-medium rounded-lg transition-all duration-300 hover:bg-white/90"
>
<img src={devPost} width={24} alt="DevPost" />
Submit on DevPost
</NavbarItem>

{#if $session.data}
<NavbarItem
href="/profile"
class="block px-4 py-3 text-center text-white font-semibold bg-accent/20 hover:bg-accent/30 rounded-lg transition-all duration-300"
onclick={() => mobileMenuOpen = false}
>
{$session.data.user.email}
</NavbarItem>
{:else}
<NavbarItem
href="/auth/login"
class="block px-4 py-3 text-center text-white font-bold bg-gradient-to-r from-accent to-primary hover:from-primary hover:to-accent rounded-lg transition-all duration-300 hover:shadow-lg"
onclick={() => mobileMenuOpen = false}
>
Login
</NavbarItem>
{/if}
</div>
</div>
</div>
</div>
{/if}

<style>
@keyframes fade-in {
from { opacity: 0; }
to { opacity: 1; }
}

@keyframes slide-down {
from {
opacity: 0;
transform: translateY(-1rem);
}
to {
opacity: 1;
transform: translateY(0);
}
}

.animate-fade-in {
animation: fade-in 0.3s ease-out;
}

.animate-slide-down {
animation: slide-down 0.3s ease-out;
}
</style>
7 changes: 5 additions & 2 deletions src/routes/+layout.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,14 @@
import "../app.css";
import Footer from "../components/Footer.svelte";
import Navbar from "../components/navbar/Navbar.svelte";
import { page } from "$app/stores";
let { children } = $props();
</script>

<div class=" text-black bg-sand">
<div class="text-black bg-sand">
<Navbar />
{@render children()}
<div class={$page.url.pathname === '/' ? 'pt-0' : 'pt-24'}>
{@render children()}
</div>
<Footer />
</div>
2 changes: 2 additions & 0 deletions src/routes/+page.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,14 @@
import Landing from "../sections/Landing.svelte";
import Map from "../sections/Map.svelte";
import Sponsors from "../sections/Sponsors.svelte";
import Prizes from "../sections/Prizes.svelte";
</script>

<div>
<Landing />
<div class="w-full h-full flex flex-col gap-24 px-10 lg:px-56">
<Header />
<Prizes />
<FAQ />
<Sponsors />
<Map />
Expand Down
Loading