-
-
-
-
- The Operators Building Doormile
-
-
-
+
+
+
+
+ The Operators Building Doormile
+
>
);
}
+
diff --git a/src/components/sections/BlogGrid.tsx b/src/components/sections/BlogGrid.tsx
index a5068c1..389977b 100644
--- a/src/components/sections/BlogGrid.tsx
+++ b/src/components/sections/BlogGrid.tsx
@@ -1,66 +1,67 @@
import React from "react";
import Image from "next/image";
+import { ScrollReveal } from "@/animations/Reveal";
export default function BlogGrid() {
const blogs = [
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "How AI Is Transforming Last-Mile EV Delivery",
excerpt: "Machine learning and real-time data are reshaping how fleets plan, dispatch, and adapt — making every kilometre smarter than the last.",
category: "Technology",
image: "/images/blog-post-pic-17.png",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "The EV Paradox: Solving Range Anxiety for Urban Fleets",
excerpt: "Electric vehicles promise sustainability, but battery constraints introduce a new routing challenge. Here's how MileTruth™ AI solves it before dispatch.",
category: "EV Fleet",
image: "/images/blog-post-pic-18-840x840.jpg",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "42% Less Distance: Insights from Our Hyderabad Hub",
excerpt: "A detailed look at how Doormile's MileTruth routing engine delivered measurable efficiency gains — fewer vehicles, less fuel, and zero SLA misses.",
category: "Case Study",
image: "/images/blog-post-pic-15.png",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "MileTruth™ AI — 10 Stages to Smarter Dispatch",
excerpt: "From order ingestion to final route output in under 45ms — a technical walkthrough of the ten-stage pipeline at the heart of our routing engine.",
category: "MileTruth",
image: "/images/blog-post-pic-31.png",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "Why Mathematical Precision Beats Heuristics in Routing",
excerpt: "Most routing tools guess. We calculate. Powered by Google OR-Tools, MileTruth evaluates six parallel strategy universes to select the optimal route every time.",
category: "Technology",
image: "/images/blog-post-pic-14.jpeg",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "Fleet Reduction Without Compromising Delivery Volume",
excerpt: "Deploying 37% fewer vehicles while handling the same order volumes isn't a trade-off — it's the result of smarter routing intelligence applied at every dispatch.",
category: "Fleet Management",
image: "/images/blog-post-pic-8.jpeg",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "Building a Greener City: The Future of Urban Logistics",
excerpt: "Cities are demanding cleaner delivery. We explore how AI-powered EV fleets and optimised routing create a path to zero-emission last-mile logistics at city scale.",
category: "Sustainability",
image: "/images/blog-post-pic-6.jpeg",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "How Doormile Maintains 99.9% SLA Compliance at Scale",
excerpt: "Hitting SLA targets 99.9% of the time isn't luck — it's the product of ETA pre-validation, real-time rebalancing, and a routing engine built with delivery reliability as its first constraint.",
category: "Operations",
image: "/images/blog-post-pic-4.jpeg",
},
{
- date: "Apr.06/2025",
+ date: "Apl.06/2025",
title: "Battery Simulation: The Secret to EV Route Pre-Validation",
excerpt: "Before a single rider leaves the hub, MileTruth™ simulates every route against real charge capacity — eliminating mid-route failures and protecting your fulfillment rate.",
category: "EV Fleet",
@@ -70,43 +71,175 @@ export default function BlogGrid() {
return (
+
-
+
{blogs.map((blog, i) => (
-
-
-
-
{blog.date}
+
+
+ {/* Text Block at Top */}
+
+ {/* Date */}
+
+ {blog.date}
+
+
+ {/* Thin divider line */}
+
+
+ {/* Bold Title */}
+
+ {blog.title}
+
+
+ {/* Description Excerpt */}
+
+ {blog.excerpt}
+
-
-
{blog.excerpt}
-
-
-
+
+ {/* Image at Bottom */}
+
+
+ {/* Category Badge overlay */}
+
+ {blog.category}
+
-
+
))}
diff --git a/src/components/sections/BlogsHero.tsx b/src/components/sections/BlogsHero.tsx
index e878f50..8c194d4 100644
--- a/src/components/sections/BlogsHero.tsx
+++ b/src/components/sections/BlogsHero.tsx
@@ -4,75 +4,42 @@ import Link from "next/link";
export default function BlogsHero() {
return (
<>
-
-
-
-
-
-
-
-
-
-
-
- Home
- /
- Blogs
-
-
-
-
-
-
+
+
+
+
+ {/* Title / Heading for Blogs */}
+
+
+ Our Blogs
+
+
+
+
+
+ Home
+ /
+ Blogs
+
+
+
+
>
);
}
+
diff --git a/src/components/sections/ConnectedLogistics.tsx b/src/components/sections/ConnectedLogistics.tsx
index e6f935b..ba96cc0 100644
--- a/src/components/sections/ConnectedLogistics.tsx
+++ b/src/components/sections/ConnectedLogistics.tsx
@@ -1,6 +1,9 @@
+"use client";
+
import React from "react";
import Link from "next/link";
import Image from "next/image";
+import { ScrollReveal, Magnetic } from "@/animations/Reveal";
export default function ConnectedLogistics() {
return (
@@ -9,97 +12,115 @@ export default function ConnectedLogistics() {
{/* Image side */}
-
{/* Content side */}
-
-
-
/ Connected Logistics /
+
+
+
+
/ Connected Logistics /
+
-
+
-
-
-
Smart logistics solutions we deliver for modern supply chains
+
+
+
+
Smart logistics solutions we deliver for modern supply chains
+
-
+
- {/* List items */}
-
-
-
Real-Time Visibility
+ {/* Staggered List items */}
+
+
-
-
-
-
See every shipment, every vehicle, every handoff—live. No blind spots.
+
+
+
See every shipment, every vehicle, every handoff—live. No blind spots.
+
-
+
-
-
-
Dynamic Route Adjustment
+
+
+
+
Dynamic Route Adjustment
+
-
-
-
-
AI continuously optimizes routes based on traffic, weather, and real-world conditions.
+
+
+
AI continuously optimizes routes based on traffic, weather, and real-world conditions.
+
-
+
-
-
-
Proactive Delay Prevention
+
+
+
+
Proactive Delay Prevention
+
-
-
-
-
Detect SLA risks hours before they become problems. Act, don't react.
+
+
+
Detect SLA risks hours before they become problems. Act, don't react.
+
-
+
-
-
-
Execution Intelligence
+
+
+
+
Execution Intelligence
+
-
-
-
-
Learn from every delivery. Get smarter with every mile traveled.
+
+
+
Learn from every delivery. Get smarter with every mile traveled.
+
-
+
-
-
diff --git a/src/components/sections/ContactForm.tsx b/src/components/sections/ContactForm.tsx
index 6bd9226..2e19343 100644
--- a/src/components/sections/ContactForm.tsx
+++ b/src/components/sections/ContactForm.tsx
@@ -2,6 +2,7 @@
import React, { useState } from "react";
import Image from "next/image";
+import { ScrollReveal } from "@/animations/Reveal";
export default function ContactForm() {
const socialIconSpacing = {
@@ -63,9 +64,11 @@ export default function ContactForm() {
-
- We are always ready to help you and answer your questions
-
+
+
+ We are always ready to help you and answer your questions
+
+
diff --git a/src/components/sections/ContactsHero.tsx b/src/components/sections/ContactsHero.tsx
index 0a91d56..8fa5f69 100644
--- a/src/components/sections/ContactsHero.tsx
+++ b/src/components/sections/ContactsHero.tsx
@@ -3,48 +3,42 @@ import Link from "next/link";
export default function ContactsHero() {
return (
-
-
-
-
-
+ <>
+
+
+
+
+
-
Contacts
+
+ Contacts
+
-
-
-
-
-
- Home
- /
- Contacts
-
-
-
-
-
-
-
-
+
+
+
+
+ Home
+ /
+ Contacts
+
-
+ >
);
}
+
diff --git a/src/components/sections/EVSection.tsx b/src/components/sections/EVSection.tsx
index 7ed7232..07ade49 100644
--- a/src/components/sections/EVSection.tsx
+++ b/src/components/sections/EVSection.tsx
@@ -1,13 +1,64 @@
"use client";
-import React, { useEffect, useState } from "react";
+import React, { useEffect, useRef } from "react";
import Link from "next/link";
+import { ScrollReveal, SlideReveal } from "@/animations/Reveal";
+import gsap from "gsap";
+import { ScrollTrigger } from "gsap/ScrollTrigger";
+
+if (typeof window !== "undefined") {
+ gsap.registerPlugin(ScrollTrigger);
+}
export default function EVSection() {
- const [hasMounted, setHasMounted] = useState(false);
+ const headingContainerRef = useRef
(null);
+ const bannerRef = useRef(null);
useEffect(() => {
- setHasMounted(true);
+ // 1. Heading Scroll-Triggered Animation (Up & Down, Replay)
+ const headingEl = headingContainerRef.current;
+ if (headingEl) {
+ const trigger = ScrollTrigger.create({
+ trigger: headingEl,
+ start: "top 88%",
+ onEnter: () => {
+ headingEl.classList.add("animated");
+ },
+ onEnterBack: () => {
+ headingEl.classList.add("animated");
+ },
+ onLeave: () => {
+ headingEl.classList.remove("animated");
+ },
+ onLeaveBack: () => {
+ headingEl.classList.remove("animated");
+ },
+ });
+
+ return () => trigger?.kill();
+ }
+ }, []);
+
+ useEffect(() => {
+ // 2. Banner Native Background Parallax (GSAP ScrollTrigger)
+ const banner = bannerRef.current;
+ if (!banner) return;
+
+ const parallaxTrigger = ScrollTrigger.create({
+ trigger: banner,
+ start: "top bottom",
+ end: "bottom top",
+ scrub: true,
+ onUpdate: (self) => {
+ // Subtle background offset to create beautiful native parallax depth
+ const yOffset = self.progress * 120;
+ gsap.set(banner, {
+ backgroundPosition: `center ${yOffset}px`,
+ });
+ },
+ });
+
+ return () => parallaxTrigger?.kill();
}, []);
const renderAnimatedText = () => {
@@ -16,6 +67,8 @@ export default function EVSection() {
{ text: "Not Adapted.", highlight: false }
];
+ let letterCount = 0;
+
return lines.map((line, lineIdx) => {
const words = line.text.split(/\s+/);
return (
@@ -25,13 +78,15 @@ export default function EVSection() {
return (
{letters.map((letter, letterIdx) => {
- const delay = (lineIdx * 0.2) + (wordIdx * 0.1) + (letterIdx * 0.03);
+ const delay = `${letterCount / 50}s`;
+ letterCount++;
return (
{letter}
@@ -54,38 +109,40 @@ export default function EVSection() {
.logico-title .word {
display: inline-block;
white-space: nowrap;
- margin-right: 0.1em;
+ margin-right: 0.15em;
}
.letter {
display: inline-block;
- opacity: 0;
- transform: translateY(0.5em);
}
- .letter.animated {
- animation: fadeInUp 0.8s cubic-bezier(0.23, 1, 0.32, 1) forwards;
- animation-delay: var(--delay);
+
+ /* Native, scroll-triggered heading reveal matching WordPress/Elementor */
+ .logico_heading_animation .word .letter {
+ opacity: 0 !important;
+ transform: translateY(120%) !important;
+ animation: none !important;
}
- @keyframes fadeInUp {
- to {
- opacity: 1;
- transform: translateY(0);
- }
+ .logico_heading_animation.animated .word .letter {
+ opacity: 0 !important;
+ transform: translateY(120%) !important;
+ animation: fadeIn 0.35s forwards, logico_heading_animation 0.7s cubic-bezier(.26, -.14, 0, 1.01) forwards !important;
}
`}} />
- {/* Parallax placeholder background */}
+ {/* Background Banner with Native GSAP Background Scroll Parallax */}
@@ -116,15 +173,17 @@ export default function EVSection() {
-
-
-
/ EV-Native Design /
+
+
-
+
-
+
{renderAnimatedText()}
@@ -133,11 +192,12 @@ export default function EVSection() {
-
+
+
@@ -261,6 +321,7 @@ export default function EVSection() {
+
diff --git a/src/components/sections/HowItWorksHero.tsx b/src/components/sections/HowItWorksHero.tsx
index 023431c..e69a4ca 100644
--- a/src/components/sections/HowItWorksHero.tsx
+++ b/src/components/sections/HowItWorksHero.tsx
@@ -36,6 +36,13 @@ export default function HowItWorksHero() {
background-size: cover !important;
}
+ @media (min-width: 1025px) {
+ .elementor-element.elementor-element-6c7cbcb .owl-carousel.owl-theme .content-item {
+ height: 800px !important;
+ min-height: 800px !important;
+ }
+ }
+
@media (max-width: 1024px) {
.elementor-element.elementor-element-741f56c {
width: calc(100% - 40px) !important;
@@ -98,7 +105,7 @@ export default function HowItWorksHero() {
-
+
{/* Slide 1 */}
diff --git a/src/components/sections/IndexHero.tsx b/src/components/sections/IndexHero.tsx
index 2ef8c70..9a6c2b2 100644
--- a/src/components/sections/IndexHero.tsx
+++ b/src/components/sections/IndexHero.tsx
@@ -1,10 +1,13 @@
"use client";
-import React, { useState, useEffect } from "react";
+import React, { useState, useEffect, useRef } from "react";
import Link from "next/link";
+import gsap from "gsap";
+import { ShimmerText } from "@/animations/Reveal";
export default function IndexHero() {
const [activeSlide, setActiveSlide] = useState(0);
+ const containerRef = useRef
(null);
// Auto-slide every 6 seconds
useEffect(() => {
@@ -18,6 +21,36 @@ export default function IndexHero() {
setActiveSlide(index);
};
+ // GSAP slide transition effect
+ useEffect(() => {
+ if (!containerRef.current) return;
+
+ // Find the currently active slide inside the container
+ const activeItem = containerRef.current.querySelector(".owl-item.active");
+ if (!activeItem) return;
+
+ const heading = activeItem.querySelector(".heading-content");
+ const text = activeItem.querySelector(".text-content");
+
+ if (heading && text) {
+ // Clear previous animations if any
+ gsap.killTweensOf([heading, text]);
+
+ // Premium elegant reveal with cubic elastic feel
+ gsap.fromTo(
+ heading,
+ { y: 55, opacity: 0, scale: 0.95 },
+ { y: 0, opacity: 1, scale: 1, duration: 1.1, ease: "power4.out" }
+ );
+
+ gsap.fromTo(
+ text,
+ { y: 30, opacity: 0 },
+ { y: 0, opacity: 1, duration: 0.95, ease: "power3.out", delay: 0.25 }
+ );
+ }
+ }, [activeSlide]);
+
return (
@@ -25,7 +58,7 @@ export default function IndexHero() {
-
+
@@ -45,7 +78,10 @@ export default function IndexHero() {
- ONE CONNECTED SYSTEM. ONE PROMISE KEPT.
+
+ ONE CONNECTED SYSTEM.
+ ONE PROMISE KEPT.
+
@@ -75,7 +111,10 @@ export default function IndexHero() {
- AI-POWERED CONNECTED LOGISTICS
+
+ AI-POWERED
+ CONNECTED LOGISTICS
+
diff --git a/src/components/sections/IndustrySolutions.tsx b/src/components/sections/IndustrySolutions.tsx
index 7260d08..b1994b6 100644
--- a/src/components/sections/IndustrySolutions.tsx
+++ b/src/components/sections/IndustrySolutions.tsx
@@ -1,6 +1,7 @@
import React from "react";
import Link from "next/link";
import Image from "next/image";
+import { ScrollReveal } from "@/animations/Reveal";
export default function IndustrySolutions() {
return (
@@ -16,52 +17,24 @@ export default function IndustrySolutions() {
-
-
- {(() => {
- const lines = [
- "Smart solutions built",
- "exclusively for your",
- "industry"
- ];
- let letterCount = 0;
- return lines.map((line, lineIdx) => (
-
- {line.split(" ").map((word, wordIdx, arr) => {
- const letters = word.split("").map((char, charIdx) => {
- const delay = `${(letterCount * 0.02).toFixed(2)}s`;
- letterCount++;
- return (
-
- {char}
-
- );
- });
- return (
-
-
- {letters}
-
- {wordIdx < arr.length - 1 && " "}
-
- );
- })}
- {lineIdx < lines.length - 1 && }
-
- ));
- })()}
+
+
+
+ Smart solutions built
+
+
+ exclusively for your
+
+
+ industry
+
diff --git a/src/components/sections/MileTruthHero.tsx b/src/components/sections/MileTruthHero.tsx
index e18e9bb..8046fa8 100644
--- a/src/components/sections/MileTruthHero.tsx
+++ b/src/components/sections/MileTruthHero.tsx
@@ -45,67 +45,237 @@ export default function MileTruthHero() {
return (
<>