Skip to content
Open
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
5 changes: 0 additions & 5 deletions content/sessions/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,4 @@ talkType: "nop"
draft: false
---

{{% hero %}}

<!-- TODO: filter and search -->

{{% /hero %}}

7 changes: 5 additions & 2 deletions content/speakers/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,12 @@ menu:
draft: false
---

{{% hero %}}


{{% /hero %}}
<h1 style="text-align: center; margin-top:2.5rem; font-weight:800;" class="">Meet The Speakers</h1>

<p style="font-size:1.25rem; color:#555; margin-top:0.5rem; text-align:center; font-weight:400">
Discover the brilliant minds who have joined us previously
</p>


53 changes: 53 additions & 0 deletions data/speakers.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
- name: "Andreas Eberhart"
company: "Dashjoin, Ambassador"
city: "Mannheim, Baden-Württemberg, Germany"
photoURL: "/images/speakers/andreas_eberhart.png"
conferenceYear: 2024

- name: "Benjamin Granados"
company: "Celonis, TSC Member"
city: "Madrid, Community of Madrid, Spain"
photoURL: "/images/speakers/benjamin_granados.jpeg"
conferenceYear: 2024

- name: "Loïc Lefèvre"
company: "Oracle"
city: "Tours, Centre-Val de Loire, France"
photoURL: "/images/speakers/loic_lefevre.jpeg"
conferenceYear: 2024

- name: "Matthew Adams"
company: "Endjin, TSC Member"
city: "London, England, United Kingdom"
photoURL: "/images/speakers/matthew_adams.jpeg"
conferenceYear: 2024

- name: "Thomas Clark"
company: "Octue CEO, Conference Sponsor"
city: "Cambridge, England, United Kingdom"
photoURL: "/images/speakers/tom_clark.jpeg"
conferenceYear: 2024

- name: "James Gough"
company: "Morgan Stanley"
city: "London, England, United Kingdom"
photoURL: "/images/speakers/james.jpg"
conferenceYear: 2024

- name: "Tom Collins"
company: "DVLA, UK Gov"
city: "Greater Swansea Area"
photoURL: "/images/speakers/tom_collins.jpeg"
conferenceYear: 2024

- name: "Neha Singla"
company: "Apple"
city: "Seattle, Washington, United States"
photoURL: "/images/speakers/neha_singla.jpg"
conferenceYear: 2024

- name: "Juan Cruz Viotti"
company: "Sourcemeta CEO, TSC Member"
city: "London, England, United Kingdom"
photoURL: "/images/speakers/juan_cruz_viotti.jpeg"
conferenceYear: 2024
2 changes: 1 addition & 1 deletion layouts/_default/list.html
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
<ul class="pages">
{{ range .Pages }}
<li>
<a href="{{ .URL }}"> {{ .Title }}</a>
<a href="{{ .RelPermalink }}"> {{ .Title }}</a>
</li>
{{ end }}
</ul>
Expand Down
117 changes: 109 additions & 8 deletions layouts/partials/speaker.html
Original file line number Diff line number Diff line change
@@ -1,9 +1,110 @@
<a class="visually-hidden" aria-hidden="true" href="/speakers/{{ .Params.key }}">{{ .Params.name }}</a>
<a class="speaker" href="/speakers/{{ .Params.key }}">
<div role="presentation" class="speaker-img" style="background-image: url('{{ .Params.photoURL }}');"></div>
<div class="info">
<div class="speaker-company">{{ .Params.company }}</div>
<strong class="speaker-name">{{ .Params.name }}</strong>
<span class="speaker-country">{{ .Params.city }}</span>
</div>
</a>
<div class="speaker">
<div role="presentation" class="speaker-img" style="background-image: url('{{ .photoURL }}');"></div>
<div class="info">
<div class="speaker-company">{{ .company }}</div>
<strong class="speaker-name">{{ .name }}</strong>
<span class="speaker-country">{{ .city }}</span>
</div>
</div>

<style>
.speakers-list ul {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 1.5rem;
padding: 0;
list-style: none;
}

/* Speaker Card */
.speaker {
display: block;
background: #fff;
border-radius: 2rem;
overflow: hidden;
box-shadow: 0 4px 10px rgba(0,0,0,0.1);
text-decoration: none;
color: inherit;
transition: transform 0.25s ease, box-shadow 0.25s ease;
opacity: 0;
transform: translateY(20px);
animation: fadeUp 0.6s forwards;
cursor: pointer;
padding-top: 1.5rem;
margin: 0.5rem;

}

.speaker:before {
content: "";
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 2.5px;
background-color: #0071BC;
}


.speaker:hover {
transform: translateY(-6px) scale(1.1);
box-shadow: 0 12px 24px rgba(0,0,0,0.15);
}

.speaker-img {
background-size: cover;
background-position: center;
height: 220px;
transition: transform 0.4s ease;
}

.speaker:hover .speaker-img {
transform: scale(1.15);
}

.speaker .info {
padding: 1rem;
text-align: center;
}

.speaker-company {
font-size: 0.9rem;
color: #666;
}

.speaker-name {
display: block;
font-size: 1.2rem;
margin: 0.5rem 0;
font-weight: 600;
color: #222;
}

.speaker-country {
font-size: 0.85rem;
color: #999;
}

@keyframes fadeUp {
from {
opacity: 0;
transform: translateY(20px);
}
to {
opacity: 1;
transform: translateY(0);
}
}

/* Accessibility helper */
.visually-hidden {
position: absolute;
left: -10000px;
top: auto;
width: 1px;
height: 1px;
overflow: hidden;
}

</style>
157 changes: 157 additions & 0 deletions layouts/previous-editions/single.html
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,33 @@ <h1>{{ .Title }}</h1>
<div class="edition-description">
{{ .Content }}
</div>
<h1>Picture Highlights</h1>

{{ $year := .Params.year }}
{{ $path := printf "images/conferences/%d" $year }}
{{ $fullpath := printf "static/%s" $path }}

{{ if (fileExists $fullpath) }}
<div class="conference-slider">
{{ range readDir $fullpath }}
<div class="slide">
<img src="/{{ $path }}/{{ .Name }}" alt="Conference photo">
</div>
{{ end }}

<button class="prev">&#10094;</button>
<button class="next">&#10095;</button>
</div>
{{ else }}
<p>No images available for {{ $year }}.</p>
{{ end }}


<!-- Modal for expanded view -->
<div id="imageModal" class="modal">
<span class="close">&times;</span>
<img class="modal-content" id="expandedImg">
</div>
</div>

<div class="edition-navigation">
Expand Down Expand Up @@ -182,6 +209,136 @@ <h1>{{ .Title }}</h1>
background-color: #005a9e;
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}

.conference-slider {
position: relative;
display: flex;
justify-content: center;
align-items: center;
background: rgba(0, 0, 0, 0.059);
width: 100%;
max-width: 900px;
aspect-ratio: 16 / 9;
margin: 2rem auto;
overflow: hidden;
border-radius: 12px;
box-shadow: 0 6px 16px rgba(0,0,0,0.15);
transition: transform 0.5s ease-in-out;
}

.conference-slider img {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
cursor: pointer;
width: 100%;
height: 100%;
object-fit: contain;
display: block;
}

.slide { display: none; }
.slide.active { display: block; }

.prev, .next {
position: absolute;
top: 50%;
transform: translateY(-50%);
background: rgba(0,0,0,0.5);
color: white;
border: none;
padding: 0.6rem 1rem;
cursor: pointer;
border-radius: 20%;
z-index: 10;
}
.prev { left: 10px; }
.next { right: 10px; }
.prev:hover, .next:hover {
background: rgba(0,0,0,0.8);
transform: translateY(-50%) scale(1.1);
transition: transform 0.2s ease;
}

/* Small screens adjustments */
@media (max-width: 768px) {
.conference-slider {
max-width: 100%;
aspect-ratio: 4 / 3;
}
}

@media (max-width: 480px) {
.conference-slider {
aspect-ratio: 1 / 1;
}
.prev, .next {
padding: 0.4rem 0.8rem;
font-size: 0.9rem;
}
}


/* Modal (expanded image) */
.modal {
display: none;
position: fixed;
z-index: 1000;
padding-top: 60px;
left: 0; top: 0;
width: 100%; height: 100%;
background: rgba(0,0,0,0.9);
}
.modal-content {
margin: auto;
display: block;
max-width: 80%;
max-height: 80%;
}
.close {
position: absolute;
top: 20px; right: 35px;
color: white;
font-size: 40px;
cursor: pointer;
}
</style>

<script>
document.addEventListener("DOMContentLoaded", () => {
let slides = document.querySelectorAll(".conference-slider .slide");
let current = 0;

function showSlide(i) {
slides.forEach(s => s.classList.remove("active"));
slides[i].classList.add("active");
}
document.querySelector(".next").onclick = () => {
current = (current + 1) % slides.length;
showSlide(current);
};
document.querySelector(".prev").onclick = () => {
current = (current - 1 + slides.length) % slides.length;
showSlide(current);
};

// Modal functionality
let modal = document.getElementById("imageModal");
let modalImg = document.getElementById("expandedImg");
let close = document.querySelector(".close");

slides.forEach(slide => {
slide.querySelector("img").onclick = (e) => {
modal.style.display = "block";
modalImg.src = e.target.src;
};
});
close.onclick = () => modal.style.display = "none";
modal.onclick = (e) => { if(e.target === modal) modal.style.display = "none"; };

showSlide(current);
});
</script>

{{ end }}
Loading