Further updates on 29-10-25
This commit is contained in:
@ -1,8 +1,44 @@
|
|||||||
'use client'
|
'use client'
|
||||||
import React, { useState } from "react";
|
import React, { useState, useEffect, useRef } from "react";
|
||||||
|
|
||||||
export default function Process() {
|
export default function Process() {
|
||||||
const [activeStep, setActiveStep] = useState(-1);
|
const [activeStep, setActiveStep] = useState(-1);
|
||||||
|
const [scrollProgress, setScrollProgress] = useState(0);
|
||||||
|
const containerRef = useRef<HTMLDivElement>(null);
|
||||||
|
const timelineRef = useRef<HTMLDivElement>(null);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
const handleScroll = () => {
|
||||||
|
if (!containerRef.current || !timelineRef.current) return;
|
||||||
|
|
||||||
|
const container = containerRef.current;
|
||||||
|
const timeline = timelineRef.current;
|
||||||
|
const rect = container.getBoundingClientRect();
|
||||||
|
const timelineHeight = timeline.scrollHeight - timeline.clientHeight;
|
||||||
|
|
||||||
|
// Calculate when section enters viewport
|
||||||
|
if (rect.top <= 0 && rect.bottom >= window.innerHeight) {
|
||||||
|
// Section is sticky, scroll the timeline
|
||||||
|
const progress = Math.abs(rect.top) / (rect.height - window.innerHeight);
|
||||||
|
const clampedProgress = Math.max(0, Math.min(1, progress));
|
||||||
|
setScrollProgress(clampedProgress);
|
||||||
|
timeline.scrollTop = clampedProgress * timelineHeight;
|
||||||
|
} else if (rect.top > 0) {
|
||||||
|
// Before sticky
|
||||||
|
setScrollProgress(0);
|
||||||
|
timeline.scrollTop = 0;
|
||||||
|
} else {
|
||||||
|
// After sticky
|
||||||
|
setScrollProgress(1);
|
||||||
|
timeline.scrollTop = timelineHeight;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
window.addEventListener('scroll', handleScroll);
|
||||||
|
handleScroll(); // Initial check
|
||||||
|
|
||||||
|
return () => window.removeEventListener('scroll', handleScroll);
|
||||||
|
}, []);
|
||||||
|
|
||||||
const CalendarIcon = (
|
const CalendarIcon = (
|
||||||
<svg
|
<svg
|
||||||
@ -25,31 +61,147 @@ export default function Process() {
|
|||||||
const steps = [
|
const steps = [
|
||||||
{
|
{
|
||||||
number: "1",
|
number: "1",
|
||||||
title: "Feb 2022",
|
title: "2017",
|
||||||
description: "Trauma Registry established on Feb.2022 in collaboration with Transport Corporation of India Limited (TCI).",
|
description: "Formation of Trauma Services",
|
||||||
icon: CalendarIcon,
|
icon: CalendarIcon,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
number: "2",
|
number: "2",
|
||||||
title: "Dec 2023",
|
title: "2020",
|
||||||
description: "Trauma Quality Improvement Programme established on Dec.2023 in collaboration with the Indian Council of Medical Research.",
|
description: "Establishment of the Department of Trauma Surgery under Dr. Sukria Nayak",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "3",
|
||||||
|
title: "May 2021",
|
||||||
|
description: "Development of Trauma Protocols (MHTP, TROB, TRIP, Airway, Obstetric Trauma)",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "4",
|
||||||
|
title: "June 2022",
|
||||||
|
description: "Inauguration of CMC Ranipet Campus: Level 1 Trauma Centre",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "5",
|
||||||
|
title: "November 2022",
|
||||||
|
description: "Formation of T-ReCS (Trauma Registry – CMC – Pilot Study) under TCI-CMC Research Scholar Program",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "6",
|
||||||
|
title: "November 2022",
|
||||||
|
description: "Integration of Multidisciplinary Trauma Services",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "7",
|
||||||
|
title: "November 2022",
|
||||||
|
description: "Formation of Neurotrauma Unit",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "8",
|
||||||
|
title: "January 2023",
|
||||||
|
description: "Accreditation of Trauma Radiology Fellowship",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "9",
|
||||||
|
title: "August 2023",
|
||||||
|
description: "Inaugural ATLS® Course at CMC Vellore",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "10",
|
||||||
|
title: "September 2023",
|
||||||
|
description: "First Research Publication from the Department",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "11",
|
||||||
|
title: "October 2023",
|
||||||
|
description: "ACTraM Conference: Advances in Chest Trauma Management",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "12",
|
||||||
|
title: "October 2023",
|
||||||
|
description: "CME Cadaveric Workshop",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "13",
|
||||||
|
title: "December 2023",
|
||||||
|
description: "ICMR Trauma Quality Improvement Programme (TQIP) Initiated at CMC",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "14",
|
||||||
|
title: "February 2024",
|
||||||
|
description: "HOPE Grant & RCPSG Trauma First Responder Outreach Programme",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "15",
|
||||||
|
title: "April 2024",
|
||||||
|
description: "Launch of Masters of Trauma Online Lecture Series",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "16",
|
||||||
|
title: "April 2024",
|
||||||
|
description: "Inaugural ATCN® Course for Nurses",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "17",
|
||||||
|
title: "July 2024",
|
||||||
|
description: "MOU with GVK EMRI for Strengthening Pre-hospital Trauma Care",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "18",
|
||||||
|
title: "July 2024",
|
||||||
|
description: "Accreditation for FNB in Trauma and Acute Care Surgery",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "19",
|
||||||
|
title: "January 2025",
|
||||||
|
description: "Trauma Quality Workshop under ICMR-TQIP at CMC Vellore",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "20",
|
||||||
|
title: "March 2025",
|
||||||
|
description: "Formation of CMC Trauma Quality Improvement Committee",
|
||||||
|
icon: CalendarIcon,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
number: "21",
|
||||||
|
title: "July 2025",
|
||||||
|
description: "Establishment of Trauma Orthopaedics Unit",
|
||||||
icon: CalendarIcon,
|
icon: CalendarIcon,
|
||||||
},
|
},
|
||||||
// {
|
|
||||||
// number: "3",
|
|
||||||
// title: "Nov 2022",
|
|
||||||
// description: "Trauma centre begins operations with full emergency suite",
|
|
||||||
// icon: CalendarIcon,
|
|
||||||
// },
|
|
||||||
];
|
];
|
||||||
|
|
||||||
|
// Calculate extra height needed for scroll effect
|
||||||
|
const extraHeight = 2000;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="bg-white py-12 sm:py-20">
|
<div
|
||||||
<div className="max-w-7xl mx-auto px-4 sm:px-6">
|
ref={containerRef}
|
||||||
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-16">
|
className="bg-white py-10 sm:py-10"
|
||||||
|
style={{ minHeight: `calc(100vh + ${extraHeight}px)` }}
|
||||||
|
>
|
||||||
|
<div className="sticky top-0 h-screen flex items-start pt-12 sm:pt-20">
|
||||||
|
<div className="max-w-7xl mx-auto px-4 sm:px-6 w-full">
|
||||||
|
<div className="grid grid-cols-1 lg:grid-cols-2 gap-8 lg:gap-16 items-start">
|
||||||
{/* Left Column */}
|
{/* Left Column */}
|
||||||
<div className="flex flex-col justify-start">
|
<div className="flex flex-col justify-start">
|
||||||
<div className="mb-8 lg:mb-16">
|
<div>
|
||||||
<div className="text-xl mb-4" style={{ color: "#e64838" }}>
|
<div className="text-xl mb-4" style={{ color: "#e64838" }}>
|
||||||
Milestones
|
Milestones
|
||||||
</div>
|
</div>
|
||||||
@ -60,21 +212,27 @@ export default function Process() {
|
|||||||
Our Journey in Trauma Care
|
Our Journey in Trauma Care
|
||||||
</h2>
|
</h2>
|
||||||
<p className="text-base sm:text-lg leading-relaxed mb-8" style={{ color: '#333' }}>
|
<p className="text-base sm:text-lg leading-relaxed mb-8" style={{ color: '#333' }}>
|
||||||
From the inauguration of our Department of Trauma Surgery to
|
From the formation of Trauma Services in 2017 to establishing a Level-1 Trauma Facility and comprehensive trauma care programs, we continue to expand our emergency care services with dedication and excellence.
|
||||||
establishing a Level-1 Trauma Facility, we continue to expand our
|
|
||||||
emergency care services with dedication and excellence.
|
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{/* Right Column - Steps */}
|
{/* Right Column - Auto-scrolling Timeline */}
|
||||||
<div className="relative">
|
<div className="relative h-[600px]">
|
||||||
|
<div
|
||||||
|
ref={timelineRef}
|
||||||
|
className="h-full overflow-y-auto pr-2 pl-2 py-2 [&::-webkit-scrollbar]:hidden pointer-events-none"
|
||||||
|
style={{
|
||||||
|
scrollbarWidth: 'none',
|
||||||
|
msOverflowStyle: 'none'
|
||||||
|
}}
|
||||||
|
>
|
||||||
{steps.map((step, index) => (
|
{steps.map((step, index) => (
|
||||||
<div
|
<div
|
||||||
key={index}
|
key={index}
|
||||||
className={`relative group cursor-pointer transition-all duration-500 ${
|
className={`relative group transition-all duration-500 ${
|
||||||
index !== 0 ? "mt-8 sm:mt-12" : ""
|
index !== 0 ? "mt-8 sm:mt-12" : ""
|
||||||
}`}
|
} ${index === 0 ? "pt-2" : ""}`}
|
||||||
onMouseEnter={() => setActiveStep(index)}
|
onMouseEnter={() => setActiveStep(index)}
|
||||||
onMouseLeave={() => setActiveStep(-1)}
|
onMouseLeave={() => setActiveStep(-1)}
|
||||||
>
|
>
|
||||||
@ -108,7 +266,7 @@ export default function Process() {
|
|||||||
activeStep === index ||
|
activeStep === index ||
|
||||||
(activeStep === -1 && index === 0)
|
(activeStep === -1 && index === 0)
|
||||||
? "#012068"
|
? "#012068"
|
||||||
: "#333", // Black when inactive
|
: "#333",
|
||||||
"--tw-ring-color":
|
"--tw-ring-color":
|
||||||
activeStep === index ||
|
activeStep === index ||
|
||||||
(activeStep === -1 && index === 0)
|
(activeStep === -1 && index === 0)
|
||||||
@ -137,7 +295,7 @@ export default function Process() {
|
|||||||
activeStep === index ||
|
activeStep === index ||
|
||||||
(activeStep === -1 && index === 0)
|
(activeStep === -1 && index === 0)
|
||||||
? "white"
|
? "white"
|
||||||
: "#333", // Black text when inactive
|
: "#333",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{/* Icon */}
|
{/* Icon */}
|
||||||
@ -153,7 +311,7 @@ export default function Process() {
|
|||||||
activeStep === index ||
|
activeStep === index ||
|
||||||
(activeStep === -1 && index === 0)
|
(activeStep === -1 && index === 0)
|
||||||
? "white"
|
? "white"
|
||||||
: "black", // Black icon when inactive
|
: "black",
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{step.icon}
|
{step.icon}
|
||||||
@ -174,5 +332,7 @@ export default function Process() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user