diff --git a/_sass/components/countdown.scss b/_sass/components/countdown.scss
new file mode 100644
index 000000000..065867775
--- /dev/null
+++ b/_sass/components/countdown.scss
@@ -0,0 +1,115 @@
+// COUNT DOWN FOR SCALA DAYS 2025
+//------------------------------------------------
+//------------------------------------------------
+
+#countdown-clock-2025 {
+ width: 100%;
+ min-height: 120px;
+ background: #1793b1 url("/resources/img/scala-logo-large.svg") no-repeat center center;
+ position: relative;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ margin: 0 auto 0 auto;
+ overflow: hidden;
+}
+
+.countdown-content {
+ display: flex;
+ width: 100%;
+ max-width: 1600px;
+ align-items: center;
+ justify-content: space-between;
+ padding: 1.2em 1.5em 1.2em 1.5em;
+}
+
+.countdown-left {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ flex: 1 1 0;
+ z-index: 2;
+}
+
+.countdown-register-btn {
+ display: inline-block;
+ color: #fff;
+ border: 2px solid #fff;
+ background: transparent;
+ font-size: 1em;
+ font-weight: 400;
+ padding: 0.4em 1.5em;
+ border-radius: 2px;
+ margin-bottom: 0.7em;
+ text-decoration: none;
+ transition: background 0.2s, color 0.2s;
+}
+.countdown-register-btn:hover {
+ background: #fff;
+ color: #c32d1c;
+}
+
+.countdown-heading {
+ color: #fff;
+ font-size: 1.2em;
+ font-weight: 700;
+ letter-spacing: 0.01em;
+}
+
+.countdown-right {
+ display: flex;
+ align-items: center;
+ justify-content: flex-end;
+ flex: 1 1 0;
+ z-index: 2;
+}
+
+.countdown-timer {
+ display: flex;
+ gap: 1.5em;
+}
+
+.countdown-segment {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+}
+
+.countdown-value {
+ color: #fff;
+ font-size: 2.2em;
+ font-weight: 700;
+ line-height: 1;
+}
+
+.countdown-label {
+ color: #fff;
+ font-size: 0.8em;
+ font-weight: 400;
+ text-transform: uppercase;
+ margin-top: 0.1em;
+ letter-spacing: 0.05em;
+}
+
+@media (max-width: 900px) {
+ .countdown-content {
+ flex-direction: column;
+ align-items: center;
+ padding: 1em 0.5em;
+ }
+ .countdown-left, .countdown-right {
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+ text-align: center;
+ }
+ .countdown-timer {
+ gap: 0.7em;
+ }
+ .countdown-heading {
+ font-size: 1em;
+ }
+ .countdown-value {
+ font-size: 1.3em;
+ }
+}
\ No newline at end of file
diff --git a/_sass/components/scala-days-sponsors.scss b/_sass/components/scala-days-sponsors.scss
new file mode 100644
index 000000000..35963d4f4
--- /dev/null
+++ b/_sass/components/scala-days-sponsors.scss
@@ -0,0 +1,102 @@
+// SCALA DAYS 2025 SPONSORS
+//------------------------------------------------
+//------------------------------------------------
+
+.scala-days-sponsors-bar {
+ width: 100%;
+ overflow: hidden;
+ background: rgba(30, 40, 50, 0.2);
+ padding: 1em 0;
+ position: relative;
+}
+
+.sponsors-carousel {
+ width: 100%;
+ overflow: hidden;
+ position: relative;
+ white-space: nowrap;
+}
+
+.sponsors-track {
+ display: flex;
+ flex-direction: row;
+ align-items: center;
+ white-space: nowrap;
+ width: max-content;
+ animation: sponsors-scroll 120s linear infinite;
+ will-change: transform;
+}
+
+.sponsor-logo-link {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ width: 140px;
+ height: 48px;
+ margin: 0 1em;
+ flex: 0 0 auto;
+}
+
+.sponsor-logo {
+ max-height: 40px;
+ max-width: 120px;
+ width: auto;
+ height: auto;
+ filter: brightness(0) invert(1);
+ opacity: 0.92;
+ transition: opacity 0.2s;
+ display: block;
+ margin: 0 auto;
+}
+.sponsor-logo-link:hover .sponsor-logo {
+ opacity: 1;
+}
+
+.sponsors-static-row {
+ display: flex;
+ flex-direction: row;
+ align-items: flex-end;
+ width: max-content;
+ margin-left: auto;
+ margin-right: auto;
+ gap: 3em;
+ margin-bottom: 1em;
+}
+
+.sponsor-logo-link-platinum {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+.sponsor-logo-platinum {
+ max-height: 80px !important;
+ filter: brightness(0) invert(1);
+ opacity: 0.92;
+ transition: opacity 0.2s;
+}
+
+.sponsors-brought-to-you-by {
+ font-size: 1.2em;
+ font-weight: 600;
+ color: #fff;
+ margin-bottom: 1em;
+ text-align: center;
+}
+
+@keyframes sponsors-scroll {
+ 0% { transform: translateX(0); }
+ 100% { transform: translateX(-50%); }
+}
+
+@media (max-width: 700px) {
+ .sponsor-logo-link {
+ width: 80px;
+ height: 28px;
+ margin: 0 0.5em;
+ }
+ .sponsor-logo {
+ max-height: 24px;
+ max-width: 60px;
+ }
+}
diff --git a/_sass/layout/navigation.scss b/_sass/layout/navigation.scss
index 0cd2b7732..582b282ad 100755
--- a/_sass/layout/navigation.scss
+++ b/_sass/layout/navigation.scss
@@ -51,6 +51,7 @@
text-decoration: none;
}
}
+
}
}
}
diff --git a/resources/css/style.scss b/resources/css/style.scss
index 69181d5ec..37bbde972 100755
--- a/resources/css/style.scss
+++ b/resources/css/style.scss
@@ -76,3 +76,5 @@
@import 'components/tab';
@import 'components/tag';
@import 'components/search';
+@import 'components/countdown';
+@import 'components/scala-days-sponsors';
\ No newline at end of file
diff --git a/resources/img/scala-days-sponsors/gradle.png b/resources/img/scala-days-sponsors/gradle.png
new file mode 100644
index 000000000..c01df74e1
Binary files /dev/null and b/resources/img/scala-days-sponsors/gradle.png differ
diff --git a/resources/img/scala-days-sponsors/jetbrains.svg b/resources/img/scala-days-sponsors/jetbrains.svg
new file mode 100644
index 000000000..cb3a2a0e5
--- /dev/null
+++ b/resources/img/scala-days-sponsors/jetbrains.svg
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/scala-days-sponsors/scalac.svg b/resources/img/scala-days-sponsors/scalac.svg
new file mode 100644
index 000000000..747b186c6
--- /dev/null
+++ b/resources/img/scala-days-sponsors/scalac.svg
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/scala-days-sponsors/signify.png b/resources/img/scala-days-sponsors/signify.png
new file mode 100644
index 000000000..d3dc1b57e
Binary files /dev/null and b/resources/img/scala-days-sponsors/signify.png differ
diff --git a/resources/img/scala-days-sponsors/virtuslab.png b/resources/img/scala-days-sponsors/virtuslab.png
new file mode 100644
index 000000000..de2a48e9d
Binary files /dev/null and b/resources/img/scala-days-sponsors/virtuslab.png differ
diff --git a/resources/img/scala-days-sponsors/writer.svg b/resources/img/scala-days-sponsors/writer.svg
new file mode 100644
index 000000000..257dc440f
--- /dev/null
+++ b/resources/img/scala-days-sponsors/writer.svg
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
diff --git a/resources/img/scala-days-sponsors/xebia.svg b/resources/img/scala-days-sponsors/xebia.svg
new file mode 100644
index 000000000..a87af96b1
--- /dev/null
+++ b/resources/img/scala-days-sponsors/xebia.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/resources/img/scala-logo-large.svg b/resources/img/scala-logo-large.svg
new file mode 100644
index 000000000..249040e4e
--- /dev/null
+++ b/resources/img/scala-logo-large.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/resources/js/functions.js b/resources/js/functions.js
index 21b24315c..a7fcc687a 100644
--- a/resources/js/functions.js
+++ b/resources/js/functions.js
@@ -1,6 +1,3 @@
----
----
-
// Sliding Panel
$(document).ready(function() {
$('.navigation-panel-button,.navigation-fade-screen,.navigation-panel-close').on('click touchstart', function(e) {
@@ -595,3 +592,56 @@ $(document).ready(function() {
});
}
});
+
+// Scala Days 2025 Countdown
+$(document).ready(function() {
+ function countdownCalc(deadline, cityName) {
+ var now = new Date().getTime();
+ var t = deadline - now;
+ var days = Math.floor(t / (1000 * 60 * 60 * 24));
+ var hours = Math.floor((t % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+ var minutes = Math.floor((t % (1000 * 60 * 60)) / (1000 * 60));
+ var dayEl = document.getElementById(cityName + '-day');
+ var hourEl = document.getElementById(cityName + '-hour');
+ var minEl = document.getElementById(cityName + '-minute');
+ if (dayEl && hourEl && minEl) {
+ dayEl.innerHTML = days;
+ hourEl.innerHTML = hours;
+ minEl.innerHTML = minutes;
+ }
+ if (t < 0) {
+ clearInterval(window.scalaDaysCountdownInterval);
+ var clock = document.getElementById('countdown-clock-' + cityName);
+ if (clock) clock.innerHTML = 'Ready!';
+ if (dayEl) dayEl.innerHTML = '0';
+ if (hourEl) hourEl.innerHTML = '0';
+ if (minEl) minEl.innerHTML = '0';
+ }
+ }
+ var deadline2025 = new Date('Aug 19, 2025 09:00:00').getTime();
+ if (document.getElementById('countdown-clock-2025')) {
+ countdownCalc(deadline2025, '2025');
+ window.scalaDaysCountdownInterval = setInterval(function() {
+ countdownCalc(deadline2025, '2025');
+ }, 60000);
+ }
+});
+
+// Seamless infinite scroll for Scala Days sponsors bar (no memory leak, no visible jump)
+document.addEventListener("DOMContentLoaded", function() {
+ var track = document.getElementById('sponsors-track');
+ if (!track) return;
+
+ // Get the width of one set of logos (half the track)
+ var totalWidth = track.scrollWidth / 2;
+ var pos = 0;
+ function animateSponsorsBar() {
+ pos -= 1; // px per frame, adjust for speed
+ if (Math.abs(pos) >= totalWidth) {
+ pos = 0;
+ }
+ track.style.transform = 'translateX(' + pos + 'px)';
+ requestAnimationFrame(animateSponsorsBar);
+ }
+ animateSponsorsBar();
+});