diff --git a/_data/scala-days-sponsors.yml b/_data/scala-days-sponsors.yml new file mode 100644 index 000000000..1af86d1da --- /dev/null +++ b/_data/scala-days-sponsors.yml @@ -0,0 +1,45 @@ +# Sponsors Data +# ---------------------------------------------------------------------------------------------------------- +# ---------------------------------------------------------------------------------------------------------- + +sponsorship-types: + - title: Platinum + icon: img/assets/icon-platinum.svg + - title: Gold + icon: img/assets/icon-gold.svg + +sponsors: + - title: VirtusLab + type: Platinum + logo: /resources/img/scala-days-sponsors/virtuslab.png + url: https://virtuslab.com + + - title: Signify Technology + type: Platinum + logo: /resources/img/scala-days-sponsors/signify.png + url: https://www.signifytechnology.com/ + + - title: Gradle + type: Gold + logo: /resources/img/scala-days-sponsors/gradle.png + url: https://gradle.com/ + + - title: JetBrains + type: Gold + logo: /resources/img/scala-days-sponsors/jetbrains.svg + url: https://jetbrains.com + + - title: Scalac + type: Gold + logo: /resources/img/scala-days-sponsors/scalac.svg + url: https://scalac.io + + - title: Xebia + type: Gold + logo: /resources/img/scala-days-sponsors/xebia.svg + url: https://xebia.com + + - title: Writer + type: Gold + logo: /resources/img/scala-days-sponsors/writer.svg + url: https://writer.com \ No newline at end of file diff --git a/_includes/scala-days-countdown.html b/_includes/scala-days-countdown.html new file mode 100644 index 000000000..9866f65f2 --- /dev/null +++ b/_includes/scala-days-countdown.html @@ -0,0 +1,24 @@ +
+
+
+ Learn More & Register Today +
Bringing Scala Days in...
+
+
+
+
+ + DAYS +
+
+ + HOURS +
+
+ + MINUTES +
+
+
+
+
diff --git a/_includes/scala-days-sponsors.html b/_includes/scala-days-sponsors.html new file mode 100644 index 000000000..01c578faa --- /dev/null +++ b/_includes/scala-days-sponsors.html @@ -0,0 +1,31 @@ +
+ +
+ Scala Days 2025 is brought to you by: +
+ + +
+ {% for sponsor in site.data.scala-days-sponsors.sponsors %} + {% if sponsor.type == 'Platinum' %} + + {% endif %} + {% endfor %} +
+ + +
\ No newline at end of file diff --git a/_layouts/frontpage.html b/_layouts/frontpage.html index 0f5a8ecbe..cb1448d91 100644 --- a/_layouts/frontpage.html +++ b/_layouts/frontpage.html @@ -16,6 +16,8 @@

+ {% include scala-days-countdown.html %} + {% include scala-days-sponsors.html %}
+
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(); +});