|
8 | 8 | MobilityMeasures, |
9 | 9 | ODPTimeline, |
10 | 10 | LivingLabsMapSection, |
| 11 | + RButton, |
11 | 12 | } from "../components/react"; |
12 | 13 | import heroImage from "../assets/img/sum-hero.png"; |
13 | 14 | import ApiClient from "../lib/api-client/ApiClient"; |
@@ -57,6 +58,49 @@ const labs = livingLabsData?.map((lab) => { |
57 | 58 | sustainablePercentage: 0.4, |
58 | 59 | }; |
59 | 60 | }); |
| 61 | +
|
| 62 | +const steps = [ |
| 63 | + { |
| 64 | + id: 1, |
| 65 | + color: "primary", |
| 66 | + icon: "👤", |
| 67 | + title: "Create your account", |
| 68 | + description: |
| 69 | + "Sign up and join your existing Living Lab, or create a new one to start contributing.", |
| 70 | + }, |
| 71 | + { |
| 72 | + id: 2, |
| 73 | + color: "secondary", |
| 74 | + icon: "🏙️", |
| 75 | + title: "Describe your Living Lab", |
| 76 | + description: |
| 77 | + "Provide key details: name, city, and zone or area of intervention for your Living Lab.", |
| 78 | + }, |
| 79 | + { |
| 80 | + id: 3, |
| 81 | + color: "warning", |
| 82 | + icon: "📊", |
| 83 | + title: "Collect baseline data", |
| 84 | + description: |
| 85 | + "Input your first round of KPI values before implementing mobility measures.", |
| 86 | + }, |
| 87 | + { |
| 88 | + id: 4, |
| 89 | + color: "info", |
| 90 | + icon: "⚙️", |
| 91 | + title: "Add your measures", |
| 92 | + description: |
| 93 | + "Document the mobility measures and policies implemented in your Living Lab.", |
| 94 | + }, |
| 95 | + { |
| 96 | + id: 5, |
| 97 | + color: "primary", |
| 98 | + icon: "📈", |
| 99 | + title: "Collect post-data", |
| 100 | + description: |
| 101 | + "Measure KPIs again to assess the impact of measures and share results in the platform.", |
| 102 | + }, |
| 103 | +]; |
60 | 104 | --- |
61 | 105 |
|
62 | 106 | <Layout role="visitor"> |
@@ -134,6 +178,92 @@ const labs = livingLabsData?.map((lab) => { |
134 | 178 | </CTASection> |
135 | 179 | </div> |
136 | 180 |
|
| 181 | + <section class="bg-gray-50 py-16 px-4 sm:px-8 lg:px-16"> |
| 182 | + <div class="max-w-5xl mx-auto text-center mb-16"> |
| 183 | + <h2 class="text-3xl font-bold text-gray-900 mb-4"> |
| 184 | + How to Contribute to the SUM Open Data Platform |
| 185 | + </h2> |
| 186 | + <p class="text-lg text-gray-600"> |
| 187 | + Join the SUM Open Data Platform and help shape the future of sustainable |
| 188 | + urban mobility. Living Labs contribute real-world data to evaluate and |
| 189 | + improve New Shared Mobility measures across Europe. |
| 190 | + </p> |
| 191 | + </div> |
| 192 | + |
| 193 | + <div class="relative max-w-5xl mx-auto mt-40"> |
| 194 | + {/* Vertical line: left on mobile, centered on md+ */} |
| 195 | + <div |
| 196 | + class="absolute left-4 md:left-1/2 transform md:-translate-x-1/2 w-1 bg-primary h-full rounded" |
| 197 | + > |
| 198 | + </div> |
| 199 | + |
| 200 | + { |
| 201 | + steps.map((step, index) => ( |
| 202 | + <div |
| 203 | + key={step.id} |
| 204 | + class={`mb-16 flex items-start w-full md:justify-between md:items-center md:-mt-28 ${ |
| 205 | + index % 2 === 0 ? "md:flex-row-reverse" : "" |
| 206 | + }`} |
| 207 | + > |
| 208 | + {/* Empty space on one side only for md+ (keeps centered layout on larger screens) */} |
| 209 | + <div class="hidden md:block md:w-5/12" /> |
| 210 | + |
| 211 | + {/* Step marker + connector: circle and line adjacent (no extra spacing) */} |
| 212 | + <div |
| 213 | + class={`z-20 flex items-center ml-2 ${ |
| 214 | + index % 2 === 0 |
| 215 | + ? "flex-row md:-ml-18" |
| 216 | + : "md:flex-row-reverse md:-mr-18" |
| 217 | + }`} |
| 218 | + > |
| 219 | + <div |
| 220 | + class={`flex items-center justify-center w-5 h-5 rounded-full bg-${step.color} border-2 border-${step.color} text-xs font-extralight text-light shadow`} |
| 221 | + > |
| 222 | + {step.id} |
| 223 | + </div> |
| 224 | + |
| 225 | + {/* Connector between marker and card (visible on md+) */} |
| 226 | + <div class="hidden md:block md:w-14"> |
| 227 | + <div class="w-full h-0.5 bg-primary rounded" /> |
| 228 | + </div> |
| 229 | + </div> |
| 230 | + |
| 231 | + {/* Card: full width on mobile to the right of the line, constrained on md+ */} |
| 232 | + <div |
| 233 | + class={`relative w-full md:w-5/12 bg-white rounded-xl shadow-lg p-6 border-${step.color} ml-6 md:ml-0 ${ |
| 234 | + index % 2 === 0 ? "border-r-8" : "border-l-8" |
| 235 | + }`} |
| 236 | + > |
| 237 | + <div class="flex items-center mb-2"> |
| 238 | + <span class="text-2xl mr-3">{step.icon}</span> |
| 239 | + <h5 class="text-xl font-semibold text-gray-900"> |
| 240 | + {step.title} |
| 241 | + </h5> |
| 242 | + </div> |
| 243 | + <p class="text-gray-600">{step.description}</p> |
| 244 | + </div> |
| 245 | + </div> |
| 246 | + )) |
| 247 | + } |
| 248 | + </div> |
| 249 | + |
| 250 | + {/* CTA */} |
| 251 | + <div |
| 252 | + class="text-center mt-16 flex flex-col md:flex-row gap-4 mx-auto justify-center" |
| 253 | + > |
| 254 | + <RButton |
| 255 | + href="/lab-admin/login" |
| 256 | + variant="primary" |
| 257 | + className="bg-warning text-light" |
| 258 | + > |
| 259 | + Login to your account → |
| 260 | + </RButton> |
| 261 | + <RButton href="/lab-admin/signup" variant="primary"> |
| 262 | + Join the Platform → |
| 263 | + </RButton> |
| 264 | + </div> |
| 265 | + </section> |
| 266 | + |
137 | 267 | <!-- TODO: enable when features become available, only one section for tools --> |
138 | 268 | <!-- <CTASection |
139 | 269 | title="Push and pull measures impact assessment tool" |
@@ -175,7 +305,7 @@ const labs = livingLabsData?.map((lab) => { |
175 | 305 | order="center" |
176 | 306 | linkText="Contribute feedback or request features" |
177 | 307 | linkHref="https://fider-webapp.inocs-sum.lille.inria.fr" |
178 | | - className="border-t border-gray-200 py-10" |
| 308 | + class="border-t border-gray-200 py-10" |
179 | 309 | > |
180 | 310 | <div class="my-10 grid gap-6 sm:grid-cols-2 lg:grid-cols-4"> |
181 | 311 | <!-- Feature 1 --> |
|
0 commit comments