|
1 | 1 | "use client"; |
2 | 2 |
|
3 | 3 | import { motion } from "framer-motion"; |
4 | | -import { |
5 | | - FiGitMerge, |
6 | | - FiLayers, |
7 | | - FiActivity, |
8 | | - FiCloud, |
9 | | - FiCpu, |
10 | | - FiInfo, |
11 | | -} from "react-icons/fi"; |
12 | 4 |
|
13 | | -export default function RoadmapSection() { |
14 | | - return ( |
15 | | - <> |
16 | | - <section |
17 | | - id="roadmap" |
18 | | - className="relative py-32 border-t border-b border-slate-200 dark:border-slate-800 overflow-hidden bg-background-light dark:bg-background-dark" |
19 | | - > |
20 | | - {/* Micro Grid Background */} |
21 | | - <div className="absolute inset-0 micro-grid opacity-10 pointer-events-none"></div> |
22 | | - |
23 | | - <div className="relative z-10 max-w-7xl mx-auto px-6"> |
24 | | - {/* Header & Sponsor Badge */} |
25 | | - <motion.div |
26 | | - initial={{ opacity: 0, y: 40 }} |
27 | | - whileInView={{ opacity: 1, y: 0 }} |
28 | | - viewport={{ once: true }} |
29 | | - transition={{ duration: 0.8 }} |
30 | | - className="flex flex-col items-center text-center max-w-4xl mx-auto" |
31 | | - > |
32 | | - {/* InfraLane Sponsor Badge */} |
33 | | - <div className="inline-flex items-center gap-4 border border-slate-300 dark:border-slate-700 bg-white dark:bg-slate-900 px-5 py-2 mb-10 shadow-sm"> |
34 | | - <span className="text-[10px] font-bold uppercase tracking-[0.3em] text-slate-400"> |
35 | | - Sponsored By |
36 | | - </span> |
37 | | - <div className="h-3 w-px bg-slate-300 dark:bg-slate-700"></div> |
38 | | - <span className="text-[10px] font-black uppercase tracking-[0.3em] text-primary"> |
39 | | - InfraLane |
40 | | - </span> |
41 | | - </div> |
42 | | - |
43 | | - <span className="text-[10px] font-bold uppercase tracking-widest text-primary mb-4 block"> |
44 | | - Flagship Project |
45 | | - </span> |
46 | | - <h2 className="text-4xl md:text-6xl font-black uppercase tracking-tighter text-slate-900 dark:text-slate-100"> |
47 | | - Conveyor Stack <br /> Roadmap |
48 | | - </h2> |
49 | | - <p className="mt-6 text-lg text-slate-600 dark:text-slate-400 leading-relaxed max-w-2xl"> |
50 | | - A long-term initiative to build a sovereign, vendor-neutral IaaS |
51 | | - platform — evolving through open governance or independent system |
52 | | - design. |
53 | | - </p> |
54 | | - </motion.div> |
55 | | - |
56 | | - {/* Roadmap Flow */} |
57 | | - <div className="mt-24 flex flex-col items-center"> |
58 | | - <Node |
59 | | - icon={<FiLayers />} |
60 | | - title="Conveyor Stack" |
61 | | - description="A multi-year program to design an open infrastructure platform comparable to OpenStack or Apache CloudStack." |
62 | | - highlight |
63 | | - /> |
64 | | - |
65 | | - <Line /> |
66 | | - |
67 | | - <Node |
68 | | - icon={<FiActivity />} |
69 | | - title="Phase 1: Conveyor CI" |
70 | | - description="A headless, cloud-native CI/CD orchestration engine designed as the foundation of the stack." |
71 | | - /> |
72 | | - |
73 | | - <Line /> |
74 | | - |
75 | | - {/* DECISION GATE */} |
76 | | - <DecisionGate /> |
77 | | - |
78 | | - {/* SPLIT PATHS */} |
79 | | - <SplitPaths /> |
80 | | - </div> |
81 | | - </div> |
82 | | - </section> |
83 | | - |
84 | | - {/* PARTNERS SECTION ADDITION */} |
85 | | - <PartnersSection /> |
86 | | - </> |
87 | | - ); |
88 | | -} |
89 | | - |
90 | | -/* ================= Components ================= */ |
91 | | - |
92 | | -function Node({ |
93 | | - icon, |
94 | | - title, |
95 | | - description, |
96 | | - highlight = false, |
97 | | -}: { |
98 | | - icon: React.ReactNode; |
99 | | - title: string; |
100 | | - description: string; |
101 | | - highlight?: boolean; |
102 | | -}) { |
103 | | - return ( |
104 | | - <motion.div |
105 | | - initial={{ opacity: 0, scale: 0.98 }} |
106 | | - whileInView={{ opacity: 1, scale: 1 }} |
107 | | - viewport={{ once: true }} |
108 | | - transition={{ duration: 0.6 }} |
109 | | - className={`w-full max-w-xl text-center p-8 border ${ |
110 | | - highlight |
111 | | - ? "bg-primary/5 border-primary" |
112 | | - : "bg-white dark:bg-slate-900/50 border-slate-200 dark:border-slate-800" |
113 | | - }`} |
114 | | - > |
115 | | - <div |
116 | | - className={`flex justify-center mb-6 text-3xl ${ |
117 | | - highlight ? "text-primary" : "text-slate-900 dark:text-slate-100" |
118 | | - }`} |
119 | | - > |
120 | | - {icon} |
121 | | - </div> |
122 | | - <h3 className="text-xl font-bold uppercase tracking-tight text-slate-900 dark:text-slate-100 mb-3"> |
123 | | - {title} |
124 | | - </h3> |
125 | | - <p className="text-sm text-slate-500 dark:text-slate-400 leading-relaxed"> |
126 | | - {description} |
127 | | - </p> |
128 | | - </motion.div> |
129 | | - ); |
130 | | -} |
131 | | - |
132 | | -function Line() { |
133 | | - return <div className="h-16 w-px bg-slate-300 dark:bg-slate-700" />; |
134 | | -} |
135 | | - |
136 | | -/* -------- Decision Gate -------- */ |
137 | | - |
138 | | -function DecisionGate() { |
139 | | - return ( |
140 | | - <motion.div |
141 | | - initial={{ opacity: 0 }} |
142 | | - whileInView={{ opacity: 1 }} |
143 | | - viewport={{ once: true }} |
144 | | - transition={{ duration: 0.8 }} |
145 | | - className="relative flex flex-col items-center w-full max-w-lg" |
146 | | - > |
147 | | - {/* Pulsing Square Border (Swiss geometric style instead of rounded ring) */} |
148 | | - <motion.div |
149 | | - animate={{ scale: [1, 1.05, 1], opacity: [0.3, 0.8, 0.3] }} |
150 | | - transition={{ duration: 3, repeat: Infinity, ease: "easeInOut" }} |
151 | | - className="absolute inset-[-15px] border border-primary pointer-events-none" |
152 | | - /> |
153 | | - |
154 | | - <div className="relative z-10 w-full p-8 bg-slate-900 dark:bg-white text-center border border-slate-800 dark:border-slate-200"> |
155 | | - <div className="flex justify-center items-center gap-3 text-white dark:text-slate-900 mb-4"> |
156 | | - <FiGitMerge className="text-2xl text-primary" /> |
157 | | - <span className="text-lg font-bold uppercase tracking-tight"> |
158 | | - CNCF Sandbox Gate |
159 | | - </span> |
160 | | - <Tooltip text="The acceptance of Conveyor CI into the CNCF Sandbox determines governance, development model, and long-term ecosystem alignment." /> |
161 | | - </div> |
162 | | - |
163 | | - <p className="text-slate-400 dark:text-slate-500 text-sm leading-relaxed text-justify-custom"> |
164 | | - Conveyor CI is evaluated for acceptance into the CNCF Sandbox. This |
165 | | - outcome determines whether Conveyor Stack evolves through |
166 | | - community-integrated development or through a fully sovereign stack. |
167 | | - </p> |
168 | | - |
169 | | - <div className="mt-6 pt-4 border-t border-slate-800 dark:border-slate-200"> |
170 | | - <p className="text-[10px] font-bold uppercase tracking-widest text-primary"> |
171 | | - Critical Junction point |
172 | | - </p> |
173 | | - </div> |
174 | | - </div> |
175 | | - </motion.div> |
176 | | - ); |
177 | | -} |
178 | | - |
179 | | -/* -------- Split Paths -------- */ |
180 | | - |
181 | | -function SplitPaths() { |
182 | | - return ( |
183 | | - <div className="relative w-full max-w-6xl mt-16"> |
184 | | - {/* Vertical connector to split */} |
185 | | - <div className="absolute left-1/2 -top-16 h-16 w-px bg-slate-300 dark:bg-slate-700 -translate-x-1/2" /> |
186 | | - {/* Horizontal connector line */} |
187 | | - <div className="hidden md:block absolute left-1/4 right-1/4 top-0 h-px bg-slate-300 dark:bg-slate-700" /> |
188 | | - |
189 | | - {/* Drop lines for columns */} |
190 | | - <div className="hidden md:block absolute left-1/4 top-0 h-10 w-px bg-slate-300 dark:bg-slate-700 -translate-x-1/2" /> |
191 | | - <div className="hidden md:block absolute right-1/4 top-0 h-10 w-px bg-slate-300 dark:bg-slate-700 translate-x-1/2" /> |
192 | | - |
193 | | - <motion.div |
194 | | - initial={{ opacity: 0 }} |
195 | | - whileInView={{ opacity: 1 }} |
196 | | - viewport={{ once: true }} |
197 | | - transition={{ duration: 0.6 }} |
198 | | - className="grid md:grid-cols-2 gap-8 md:gap-16 pt-10" |
199 | | - > |
200 | | - <Path |
201 | | - title="Community Path" |
202 | | - icon={<FiCloud />} |
203 | | - tooltip="Activated if Conveyor CI is accepted into the CNCF Sandbox." |
204 | | - description="Leverage existing CNCF-aligned systems and communities to accelerate development." |
205 | | - items={[ |
206 | | - "Reuse mature databases & brokers", |
207 | | - "Community-driven governance", |
208 | | - "Focus on orchestration & integration", |
209 | | - ]} |
210 | | - /> |
211 | | - |
212 | | - <Path |
213 | | - title="Sovereign Stack" |
214 | | - icon={<FiCpu />} |
215 | | - tooltip="Activated if CNCF Sandbox acceptance is not achieved." |
216 | | - description="Design and build a fully sovereign infrastructure stack from first principles." |
217 | | - items={[ |
218 | | - "Distributed embeddable document database", |
219 | | - "Event-based message broker", |
220 | | - "Custom storage & virtualization", |
221 | | - ]} |
222 | | - /> |
223 | | - </motion.div> |
224 | | - </div> |
225 | | - ); |
226 | | -} |
227 | | - |
228 | | -function Path({ |
229 | | - title, |
230 | | - icon, |
231 | | - tooltip, |
232 | | - description, |
233 | | - items, |
234 | | -}: { |
235 | | - title: string; |
236 | | - icon: React.ReactNode; |
237 | | - tooltip: string; |
238 | | - description: string; |
239 | | - items: string[]; |
240 | | -}) { |
241 | | - return ( |
242 | | - <motion.div |
243 | | - initial={{ opacity: 0, y: 20 }} |
244 | | - whileInView={{ opacity: 1, y: 0 }} |
245 | | - viewport={{ once: true }} |
246 | | - transition={{ duration: 0.7 }} |
247 | | - className="p-8 bg-white dark:bg-slate-900/50 border border-slate-200 dark:border-slate-800 hover:border-primary dark:hover:border-primary transition-colors group cursor-default" |
248 | | - > |
249 | | - <div className="flex items-center gap-4 mb-6 text-slate-900 dark:text-slate-100"> |
250 | | - <span className="text-3xl text-primary">{icon}</span> |
251 | | - <h4 className="text-lg font-bold uppercase tracking-tight">{title}</h4> |
252 | | - <Tooltip text={tooltip} /> |
253 | | - </div> |
254 | | - |
255 | | - <p className="text-slate-500 dark:text-slate-400 text-sm leading-relaxed mb-6"> |
256 | | - {description} |
257 | | - </p> |
258 | | - |
259 | | - <ul className="space-y-3"> |
260 | | - {items.map((item, i) => ( |
261 | | - <li key={i} className="flex items-start gap-3"> |
262 | | - <span className="h-1.5 w-1.5 bg-primary mt-1.5 shrink-0"></span> |
263 | | - <span className="text-slate-600 dark:text-slate-300 text-sm font-medium"> |
264 | | - {item} |
265 | | - </span> |
266 | | - </li> |
267 | | - ))} |
268 | | - </ul> |
269 | | - </motion.div> |
270 | | - ); |
271 | | -} |
272 | | - |
273 | | -/* -------- Tooltip -------- */ |
274 | | - |
275 | | -function Tooltip({ text }: { text: string }) { |
276 | | - return ( |
277 | | - <span className="relative group ml-auto"> |
278 | | - <FiInfo className="text-slate-300 dark:text-slate-600 hover:text-primary dark:hover:text-primary cursor-help transition-colors text-lg" /> |
279 | | - <span className="absolute bottom-full right-0 md:left-1/2 md:-translate-x-1/2 mb-4 w-64 opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none z-50"> |
280 | | - <span className="block p-4 text-[10px] uppercase tracking-widest leading-relaxed text-white dark:text-slate-900 bg-slate-900 dark:bg-white border-b-2 border-primary shadow-xl"> |
281 | | - {text} |
282 | | - </span> |
283 | | - </span> |
284 | | - </span> |
285 | | - ); |
286 | | -} |
287 | | - |
288 | | -/* -------- Partners Section -------- */ |
289 | | - |
290 | | -function PartnersSection() { |
| 5 | +export default function PartnersSection() { |
291 | 6 | const partners = [ |
292 | | - "Open Infrastructure Foundation", |
293 | | - "Cloud Native Alliance", |
294 | | - "Distributed Systems Lab", |
| 7 | + "Cloud Native Kampala", |
295 | 8 | "InfraLane", |
296 | | - "Apex Compute", |
297 | | - "Nexus Networks", |
| 9 | + "Cranom Technologies Ltd", |
298 | 10 | ]; |
299 | 11 |
|
300 | 12 | return ( |
|
0 commit comments