Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
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
94 changes: 94 additions & 0 deletions src/components/SponsorBanner.astro
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
---
import type { Sponsor } from '../type'

interface Props {
sponsors: Sponsor[]
}

const { sponsors } = Astro.props
---

{
sponsors.length > 0 && (
<div id="sponsor-banner" class="sponsor-banner">
<div class="sponsor-banner-content">
<span class="sponsor-banner-text">Cet évènement est permis grâce au soutien de</span>
<div class="sponsor-banner-logos">
{sponsors.map((sponsor) => (
<a href={sponsor.website} target="_blank" rel="noopener noreferrer" class="sponsor-banner-link">
<img src={sponsor.logoUrl} alt={sponsor.name} class="sponsor-banner-logo" />
</a>
))}
</div>
</div>
</div>
)
}

<script>
window.addEventListener('scroll', () => {
const banner = document.querySelector('#sponsor-banner') as HTMLElement | null
if (banner) {
banner.classList.toggle('hidden', window.scrollY > 0)
}
})
</script>

<style>
.sponsor-banner {
background-color: var(--grey-1);
padding: var(--s-1) var(--s0);
overflow: hidden;
max-height: 4rem;
transition:
max-height 0.3s ease,
padding 0.3s ease,
opacity 0.3s ease;
opacity: 1;

&.hidden {
max-height: 0;
padding-top: 0;
padding-bottom: 0;
opacity: 0;
}
}

.sponsor-banner-content {
display: flex;
align-items: center;
justify-content: center;
gap: var(--s0);
max-width: var(--max-container-width);
margin: 0 auto;
}

.sponsor-banner-text {
font-size: var(--fs0);
color: var(--text-subtle);
white-space: nowrap;
}

.sponsor-banner-logos {
display: flex;
align-items: center;
gap: var(--s0);
}

.sponsor-banner-link {
display: flex;
align-items: center;
}

.sponsor-banner-logo {
height: 2rem;
width: auto;
object-fit: contain;
}

@media (max-width: 640px) {
.sponsor-banner-text {
display: none;
}
}
</style>
11 changes: 11 additions & 0 deletions src/layouts/Layout.astro
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
---
import { ClientRouter } from 'astro:transitions'
import { OPENPLANNER_URL } from 'astro:env/client'
import type { OpenPlannerType } from '../type'
import FooterBlock from '../components/footer/FooterBlock.astro'
import Menu from '../components/Menu.astro'
import SponsorBanner from '../components/SponsorBanner.astro'

interface Props {
title: string
Expand All @@ -10,6 +13,13 @@ interface Props {
}

const { title, description, metaImage } = Astro.props

const response = await fetch(OPENPLANNER_URL)
const openPlannerData: OpenPlannerType = await response.json()
const bannerSponsors = openPlannerData.sponsors.flatMap((cat) =>
cat.sponsors.filter((s) => s.customFields?.['option-comm'] === true)
)

const url = import.meta.env.SITE
const image = metaImage || url + '/social-share5.jpg'
const siteName = 'Sunny Tech'
Expand Down Expand Up @@ -79,6 +89,7 @@ const organizerTwitter = '@sunnyTech_MTP'
</head>
<body>
<a href="#main-content" class="skip-link">Aller au contenu principal</a>
<SponsorBanner sponsors={bannerSponsors} />
<Menu />
<main id="#main-content">
<slot />
Expand Down
1 change: 1 addition & 0 deletions src/type.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ export interface Sponsor {
name: string
logoUrl: string
jobPosts?: JobPost[]
customFields?: { [key: string]: string | boolean }
}

export interface Track {
Expand Down
Loading