@@ -171,7 +177,7 @@ export default function Content({
) : (
- {hasSlides ? defaultPlaceholderText.noNotebook : ''}
+ {hasNotebook ? defaultPlaceholderText.noNotebook : ''}
)}
diff --git a/src/components/Bootcamp/ContentCarousel/index.tsx b/src/components/Bootcamp/ContentCarousel/index.tsx
new file mode 100644
index 00000000..d6e05a92
--- /dev/null
+++ b/src/components/Bootcamp/ContentCarousel/index.tsx
@@ -0,0 +1,81 @@
+'use client';
+
+import React, { useEffect, useState } from 'react';
+import useEmblaCarousel from 'embla-carousel-react';
+import Content from '@/components/Bootcamp/Content';
+
+export default function ContentCarousel() {
+ const [emblaRef, emblaApi] = useEmblaCarousel({
+ loop: true,
+ align: 'center',
+ });
+
+ const [selectedIndex, setSelectedIndex] = useState(0);
+
+ //@ts-ignore
+ useEffect(() => {
+ if (!emblaApi) return;
+ const onSelect = () => setSelectedIndex(emblaApi.selectedScrollSnap());
+ emblaApi.on('select', onSelect);
+ return () => emblaApi.off('select', onSelect);
+ }, [emblaApi]);
+
+ const contents = [
+ {
+ year: '2025',
+ hasSlides: true,
+ hasRecordings: false,
+ hasNotebook: true,
+ hasContent: true,
+ title: 'Agentic AI Content 2025',
+ },
+ {
+ year: '2024',
+ hasSlides: true,
+ hasRecordings: true,
+ hasNotebook: false,
+ hasContent: true,
+ title: 'ML Bootcamp Content 2024',
+ },
+ ];
+
+ return (
+
+
+
+ {contents.map((content, index) => (
+
+
+
+ ))}
+
+
+
+ {[0, 1].map((index) => (
+ emblaApi?.scrollTo(index)}
+ className={`w-[14px] h-[14px] mx-[6px] rounded-full transition-transform transition-opacity duration-200 ease-linear cursor-pointer
+ ${
+ selectedIndex === index
+ ? 'opacity-100 scale-[1.15] bg-[#a855f7]'
+ : 'bg-[#a855f7] opacity-40'
+ }`}
+ />
+ ))}
+
+
+
+ );
+}
diff --git a/src/components/Datathon/HighlightCarousel/index.tsx b/src/components/Datathon/HighlightCarousel/index.tsx
index 6fe1276e..88607c30 100644
--- a/src/components/Datathon/HighlightCarousel/index.tsx
+++ b/src/components/Datathon/HighlightCarousel/index.tsx
@@ -1,84 +1,152 @@
'use client';
-import React, { useEffect, useState } from 'react';
-import useEmblaCarousel from 'embla-carousel-react';
+import { Swiper, SwiperSlide } from 'swiper/react';
+import { Autoplay, Pagination, EffectCoverflow } from 'swiper/modules';
import Image from 'next/image';
-import Autoplay from 'embla-carousel-autoplay';
+
+import 'swiper/css';
+import 'swiper/css/pagination';
+import 'swiper/css/effect-coverflow';
interface ImageCarouselProps {
images: string[];
}
export function ImageCarousel({ images }: ImageCarouselProps) {
- const [emblaRef, emblaApi] = useEmblaCarousel(
- {
- loop: true,
- align: 'center',
- },
- [Autoplay({ playOnInit: true, stopOnInteraction: false, delay: 3000 })],
- );
- const [selectedIndex, setSelectedIndex] = useState(0);
+ return (
+
+
+ Bootcamp Highlights
+
- //@ts-ignore
- useEffect(() => {
- if (!emblaApi) return;
+
+
+
+ {images.map((img, idx) => (
+
+ {({ isActive }) => (
+
+
+
+ )}
+
+ ))}
+
+
- const onSelect = () => setSelectedIndex(emblaApi.selectedScrollSnap());
- emblaApi.on('select', onSelect);
+
-
+