-
+
-
Phone
-
+91 7488011618
-
Mon-Fri, 9am-5pm PST
+
Phone
+
+91 7488011618
+
Mon-Fri, 9am-5pm PST
-
+
-
Email
-
admin@visiflow.com
-
We respond within 24 hours
+
Email
+
admin@visiflow.com
+
We respond within 24 hours
diff --git a/app/page.tsx b/app/page.tsx
index f4738fd..32db93d 100644
--- a/app/page.tsx
+++ b/app/page.tsx
@@ -30,6 +30,8 @@ const staggerContainer = {
export default function Home() {
const [scrollY, setScrollY] = useState(0);
+ const [isDarkMode, setIsDarkMode] = useState(false);
+ const [currentSlide, setCurrentSlide] = useState(0);
const heroRef = useRef(null);
const { scrollYProgress } = useScroll({
target: heroRef,
@@ -44,6 +46,14 @@ export default function Home() {
const y = useTransform(scrollYProgress, [0, 1], ["0%", "40%"]);
const opacity = useTransform(scrollYProgress, [0, 0.8], [1, 0]);
+ // Load dark mode preference from localStorage
+ useEffect(() => {
+ const savedDarkMode = localStorage.getItem('darkMode');
+ if (savedDarkMode !== null) {
+ setIsDarkMode(JSON.parse(savedDarkMode));
+ }
+ }, []);
+
useEffect(() => {
const handleScroll = () => {
setScrollY(window.scrollY);
@@ -53,33 +63,146 @@ export default function Home() {
return () => window.removeEventListener("scroll", handleScroll);
}, []);
+ // Background slider for flood scenes
+ const floodScenes = [
+ {
+ title: "Water Body Monitoring",
+ description: "Real-time water level detection",
+ bgGradient: "from-slate-600 via-blue-600 to-indigo-600",
+ bgImage: "/monitoring-pattern.svg"
+ },
+ {
+ title: "Flood Alerts",
+ description: "Early warning systems active",
+ bgGradient: "from-indigo-600 via-purple-600 to-blue-600",
+ bgImage: "/flood-pattern.svg"
+ },
+ {
+ title: "Data Analytics",
+ description: "Live data visualization",
+ bgGradient: "from-blue-700 via-indigo-600 to-purple-600",
+ bgImage: "/hero-3d-bg.svg"
+ }
+ ];
+
+ // Auto-slide effect
+ useEffect(() => {
+ const interval = setInterval(() => {
+ setCurrentSlide((prev) => (prev + 1) % floodScenes.length);
+ }, 4000);
+ return () => clearInterval(interval);
+ }, []);
+
+ // Toggle dark mode
+ const toggleDarkMode = () => {
+ const newDarkMode = !isDarkMode;
+ setIsDarkMode(newDarkMode);
+ localStorage.setItem('darkMode', JSON.stringify(newDarkMode));
+ };
+
return (
-
+ <>
+
+
+
+ {/* Dark Mode Toggle */}
+
+ {isDarkMode ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
{/* Hero Section */}
- {/* River Conservation Background Effect */}
+ {/* Animated Background Slider */}
+
+ {floodScenes.map((scene, index) => (
+
+ {/* Background Image */}
+
+ {/* Enhanced Gradient Overlay */}
+
+ {/* Advanced 3D Pattern Overlay */}
+
+
+ ))}
+
+
+ {/* 3D Flood Visualization Background */}
- {/* Option 1: Using CSS background with river conservation pattern */}
-
-
- {/* Additional overlay for depth */}
-
-
-
- {/* Alternative Option 2: More detailed river conservation SVG pattern */}
-
+ {/* 3D Water Waves */}
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
- {/* Main river flow */}
-
-
-
- {/* Conservation elements - trees and vegetation */}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- {/* Fish and aquatic life representations */}
-
-
-
-
-
-
-
- {/* Water ripples */}
-
-
-
-
-
-
-
-
+
+
+
+ {/* Particle System for Atmospheric Effect */}
+
+ {[...Array(30)].map((_, i) => (
+
+ ))}
+
-
+
+ {/* Add backdrop blur for better text readability */}
+
View Live Data
):(
Sign In to View Data
@@ -215,7 +391,16 @@ export default function Home() {
Learn More
@@ -225,13 +410,29 @@ export default function Home() {
{/* Account Links - Only show when not authenticated */}
{!isAuthenticated && (
-
Already have an account?
+
+ Already have an account?
+
-
+
Sign In
- |
-
+ |
+
Sign Up
@@ -245,16 +446,36 @@ export default function Home() {
animate={{ opacity: 1, scale: 1 }}
transition={{ duration: 0.8, delay: 0.3 }}
>
- {/* Animated Device Visual */}
+ {/* Enhanced Device Visual */}
- V
+ {/* Enhanced 3D Background Pattern */}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {/* Large V Logo */}
+ V
+
+ {/* Centered Monitor Display */}
+ {/* Scene Title */}
+ {floodScenes[currentSlide].title}
+
+
+ {/* VISIFLOW Branding */}
+
-
-
- VISIFLOW
-
-
+ >
+ VISIFLOW
+
+
+ {/* Simple Data Bars */}
{[1, 2, 3, 4, 5, 6].map(i => (
- {/* Animated elements */}
+ {/* Enhanced 3D floating badge */}
+ {/* Enhanced 3D glow effects */}
+
+
@@ -355,7 +664,7 @@ export default function Home() {
{/* Scroll indicator */}
-
-
Scroll to explore
-
+
+ Scroll to explore
+
+
-
+ */}
+
+ {/* Background Slide Indicators */}
+
+
+ {floodScenes.map((_, index) => (
+ setCurrentSlide(index)}
+
+ />
+ ))}
+
+
+
+ {floodScenes[currentSlide].title}
+
+
+ {floodScenes[currentSlide].description}
+
+
+
{/* Features Section */}
-
+
@@ -395,8 +743,14 @@ export default function Home() {
viewport={{ once: true, margin: "-100px" }}
variants={fadeIn}
>
-
Advanced Flood Detection Features
-
+
+ Advanced Flood Detection Features
+
+
Visiflow combines cutting-edge sensor technology with advanced analytics to protect communities
@@ -411,6 +765,7 @@ export default function Home() {
title="Real-time Monitoring"
description="Get access to live data about river flow, water levels, and velocity analytics with millisecond precision."
delay={0}
+ isDarkMode={isDarkMode}
/>
{/* Data Visualization Section */}
-
+
- Powerful Data Visualization
-
+
+ Powerful Data Visualization
+
+
Make informed decisions with our interactive dashboards and real-time analytics
-
Monitor River Flow in Real-Time
-
+
+ Monitor River Flow in Real-Time
+
+
Our dashboard provides instant access to critical river flow data, and historical comparisons to help you anticipate flood conditions before they become dangerous.
-
Advanced algorithms
+
+ Advanced algorithms
+
-
Historical data comparison
+
+ Historical data comparison
+
-
Visualize flow of river
+
+ Visualize flow of river
+
View Live Data
@@ -496,11 +877,19 @@ export default function Home() {
-
- {/* Sample Dashboard UI */}
-
+
+ {/* Clean Sample Dashboard UI */}
+
-
Water Level Monitor
+
+ Water Level Monitor
+
@@ -508,76 +897,65 @@ export default function Home() {
-
- {/* Animated chart */}
-
- {[...Array(20)].map((_, i) => (
+
+ {/* Simple animated chart */}
+
+ {[...Array(8)].map((_, i) => (
7 && i < 11 ? 'bg-blue-600' :
- i > 4 && i < 14 ? 'bg-blue-500' : 'bg-blue-400'
+ className={`w-6 rounded-t ${
+ isDarkMode ? 'bg-blue-400' : 'bg-blue-600'
}`}
animate={{
- height: [
- `${20 + (i % 3) * 20}%`,
- `${20 + ((i + 2) % 5) * 15}%`,
- `${20 + (i % 3) * 20}%`
- ]
+ height: [`${30 + (i % 3) * 20}px`, `${20 + (i % 3) * 25}px`, `${30 + (i % 3) * 20}px`]
}}
transition={{
- duration: 3 + (i % 3),
+ duration: 2 + (i * 0.2),
repeat: Infinity,
repeatType: "reverse"
- }}
+ }}
/>
))}
-
-
Current Level
+
-
-
Status
-
Normal
+
+
+ Status
+
+
+ Normal
+
-
- {/* Floating elements */}
-
-
@@ -586,7 +964,11 @@ export default function Home() {
{/* Call to Action Section */}
-
+
Get Started Today
- {/*
-
- Request Demo
-
- */}
@@ -644,5 +1022,6 @@ export default function Home() {
{/* Footer */}
+ >
);
}
\ No newline at end of file
diff --git a/app/profile/page.tsx b/app/profile/page.tsx
index b1deadd..82d8265 100644
--- a/app/profile/page.tsx
+++ b/app/profile/page.tsx
@@ -13,6 +13,7 @@ export default function ProfilePage() {
const [isEditing, setIsEditing] = useState(false);
const [isSaving, setIsSaving] = useState(false);
const [message, setMessage] = useState({ type: '', text: '' });
+ const [isDarkMode, setIsDarkMode] = useState(false);
// Image upload state
const [profileImage, setProfileImage] = useState
(null);
@@ -101,6 +102,21 @@ export default function ProfilePage() {
}
}, [isEditing]);
+ // Load dark mode preference from localStorage
+ useEffect(() => {
+ const savedDarkMode = localStorage.getItem('darkMode');
+ if (savedDarkMode !== null) {
+ setIsDarkMode(JSON.parse(savedDarkMode));
+ }
+ }, []);
+
+ // Toggle dark mode
+ const toggleDarkMode = () => {
+ const newDarkMode = !isDarkMode;
+ setIsDarkMode(newDarkMode);
+ localStorage.setItem('darkMode', JSON.stringify(newDarkMode));
+ };
+
const handleTabChange = (tab: string) => {
setActiveTab(tab);
};
@@ -233,10 +249,40 @@ export default function ProfilePage() {
}
return (
-
+
+ {/* Dark Mode Toggle */}
+
+ {isDarkMode ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
{formData.location && (
{/* Tabs */}
-
+
handleTabChange('profile')}
className={`py-4 px-6 relative font-medium transition-all ${
activeTab === 'profile'
- ? 'text-blue-600'
- : 'text-gray-500 hover:text-gray-700'
+ ? (isDarkMode ? 'text-blue-400' : 'text-blue-600')
+ : (isDarkMode ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700')
}`}
>
@@ -470,7 +526,9 @@ export default function ProfilePage() {
{activeTab === 'profile' && (
handleTabChange('security')}
className={`py-4 px-6 relative font-medium transition-all ${
activeTab === 'security'
- ? 'text-blue-600'
- : 'text-gray-500 hover:text-gray-700'
+ ? (isDarkMode ? 'text-blue-400' : 'text-blue-600')
+ : (isDarkMode ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700')
}`}
>
@@ -494,7 +552,9 @@ export default function ProfilePage() {
{activeTab === 'security' && (
handleTabChange('notifications')}
className={`py-4 px-6 relative font-medium transition-all ${
activeTab === 'notifications'
- ? 'text-blue-600'
- : 'text-gray-500 hover:text-gray-700'
+ ? (isDarkMode ? 'text-blue-400' : 'text-blue-600')
+ : (isDarkMode ? 'text-gray-400 hover:text-gray-200' : 'text-gray-500 hover:text-gray-700')
}`}
>
@@ -518,7 +578,9 @@ export default function ProfilePage() {
{activeTab === 'notifications' && (
{/* Tab Content */}
-
+
{activeTab === 'profile' && (
-
About You
+
About You
-
+
Bio
- Brief description for your profile
+ Brief description for your profile
{isEditing && (
-
+
-
+
-
+
Your profile information will be visible to other users of the platform.
@@ -732,27 +862,47 @@ export default function ProfilePage() {
transition={{ duration: 0.3 }}
className="space-y-6"
>
-
+
-
+
-
Account Security
-
+
Account Security
+
Your account is secured with Google Authentication. To change your password, please use Google's account settings.
-
-
-
Login Sessions
+
+
+
Login Sessions
-
+
@@ -761,8 +911,12 @@ export default function ProfilePage() {
-
Current Session
-
Windows • Chrome • IP: 192.168.1.1
+
Current Session
+
Windows • Chrome • IP: 192.168.1.1
@@ -794,20 +948,34 @@ export default function ProfilePage() {
transition={{ duration: 0.3 }}
className="space-y-6"
>
- Notification Preferences
+ Notification Preferences
-
+
-
-
+
-
Email Notifications
-
Receive alerts and updates via email
+
Email Notifications
+
Receive alerts and updates via email
@@ -821,16 +989,28 @@ export default function ProfilePage() {
-
+
-
-
+
-
App Notifications
-
Receive in-app notifications and alerts
+
App Notifications
+
Receive in-app notifications and alerts
@@ -844,16 +1024,28 @@ export default function ProfilePage() {
-
+
-
-
+
-
SMS Notifications
-
Receive alerts via text message
+
SMS Notifications
+
Receive alerts via text message
diff --git a/app/realtime-data/page.tsx b/app/realtime-data/page.tsx
index 59375cd..0e05ebc 100644
--- a/app/realtime-data/page.tsx
+++ b/app/realtime-data/page.tsx
@@ -1,15 +1,3 @@
-
-
-
-
-
-
-
-
-
-
-
-
"use client";
import { useState, useEffect, useContext } from 'react';
@@ -69,6 +57,7 @@ const waterLevelData = {
export default function RealtimeDataPage() {
const [data, setData] = useState(riverData);
+ const [isDarkMode, setIsDarkMode] = useState(false);
const [currentTime, setCurrentTime] = useState(new Date());
const [isRefreshing, setIsRefreshing] = useState(false);
const [dischargeHistory, setDischargeHistory] = useState(timeSeriesData);
@@ -80,6 +69,13 @@ export default function RealtimeDataPage() {
const [maxVelocityIncrease, setMaxVelocityIncrease] = useState(0);
const [channelWidth, setTotalChannelWidth] = useState(0)
const [meanVelocityIncrease, setMeanVelocityIncrease] = useState(0);
+
+ // Toggle dark mode
+ const toggleDarkMode = () => {
+ const newDarkMode = !isDarkMode;
+ setIsDarkMode(newDarkMode);
+ localStorage.setItem('darkMode', JSON.stringify(newDarkMode));
+ };
// Format time consistently for both server and client
const formatTime = (date: Date) => {
const hours = date.getHours().toString().padStart(2, '0');
@@ -88,6 +84,14 @@ export default function RealtimeDataPage() {
return `${hours}:${minutes}:${seconds}`;
};
+ // Load dark mode preference from localStorage
+ useEffect(() => {
+ const savedDarkMode = localStorage.getItem('darkMode');
+ if (savedDarkMode !== null) {
+ setIsDarkMode(JSON.parse(savedDarkMode));
+ }
+ }, []);
+
useEffect(() => {
if (!value.machineCode) return;
async function fetchWidth() {
@@ -192,7 +196,33 @@ export default function RealtimeDataPage() {
}));
return (
-
+
+ {/* Dark Mode Toggle */}
+
+ {isDarkMode ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
{
+ const newDarkMode = !isDarkMode;
+ setIsDarkMode(newDarkMode);
+ localStorage.setItem('darkMode', JSON.stringify(newDarkMode));
+ };
const [alertHistory, setAlertHistory] = useState([
{
id: '1',
@@ -160,6 +168,14 @@ export default function StatusAlertsPage() {
}
]);
+ // Load dark mode preference from localStorage
+ useEffect(() => {
+ const savedDarkMode = localStorage.getItem('darkMode');
+ if (savedDarkMode !== null) {
+ setIsDarkMode(JSON.parse(savedDarkMode));
+ }
+ }, []);
+
// Auto-refresh the time every minute
useEffect(() => {
const timer = setInterval(() => {
@@ -245,7 +261,33 @@ export default function StatusAlertsPage() {
};
return (
-
+
+ {/* Dark Mode Toggle */}
+
+ {isDarkMode ? (
+
+
+
+ ) : (
+
+
+
+ )}
+
+
{/* Page header */}
-
+
-
+
Last updated: {currentTime.toLocaleTimeString()}
{isRefreshing ? (
<>
diff --git a/public/flood-pattern.svg b/public/flood-pattern.svg
new file mode 100644
index 0000000..d7e7a12
--- /dev/null
+++ b/public/flood-pattern.svg
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/hero-3d-bg.svg b/public/hero-3d-bg.svg
new file mode 100644
index 0000000..a9faef6
--- /dev/null
+++ b/public/hero-3d-bg.svg
@@ -0,0 +1,319 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/public/monitoring-pattern.svg b/public/monitoring-pattern.svg
new file mode 100644
index 0000000..d8e0d36
--- /dev/null
+++ b/public/monitoring-pattern.svg
@@ -0,0 +1,270 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+