| <!DOCTYPE html> |
| <html lang="en"> |
| <head> |
| <meta charset="UTF-8"> |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
| <title>FloatChat - ARGO Data Explorer</title> |
| <script src="https://cdn.tailwindcss.com"></script> |
| <link href="https://unpkg.com/aos@2.3.1/dist/aos.css" rel="stylesheet"> |
| <script src="https://unpkg.com/aos@2.3.1/dist/aos.js"></script> |
| <script src="https://cdn.jsdelivr.net/npm/feather-icons/dist/feather.min.js"></script> |
| <script src="https://unpkg.com/feather-icons"></script> |
| <script src="https://cdn.jsdelivr.net/npm/animejs/lib/anime.iife.min.js"></script> |
| <script src="https://cdn.plot.ly/plotly-latest.min.js"></script> |
| <script src="https://unpkg.com/leaflet@1.7.1/dist/leaflet.js"></script> |
| <link rel="stylesheet" href="https://unpkg.com/leaflet@1.7.1/dist/leaflet.css" /> |
| <style> |
| @import url('https://fonts.googleapis.com/css2?family=Poppins:wght@300;400;500;600;700&display=swap'); |
| body { |
| font-family: 'Poppins', sans-serif; |
| background-color: #f8fafc; |
| } |
| .govt-header { |
| background: linear-gradient(135deg, #0f4c81 0%, #1a5f8b 100%); |
| box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1); |
| } |
| .nav-link { |
| position: relative; |
| } |
| .nav-link:after { |
| content: ''; |
| position: absolute; |
| width: 0; |
| height: 2px; |
| bottom: 0; |
| left: 0; |
| background-color: #fff; |
| transition: width 0.3s ease; |
| } |
| .nav-link:hover:after { |
| width: 100%; |
| } |
| .main-container { |
| display: flex; |
| height: 100vh; |
| width: 100%; |
| } |
| .chat-container { |
| display: flex; |
| flex-direction: column; |
| flex-grow: 1; |
| height: 100vh; |
| width: 100%; |
| border-left: 1px solid #e2e8f0; |
| } |
| .chat-messages { |
| flex-grow: 1; |
| overflow-y: auto; |
| padding: 1rem; |
| display: flex; |
| flex-direction: column; |
| gap: 1rem; |
| background-color: #ffffff; |
| } |
| .user-message { |
| align-self: flex-end; |
| max-width: 80%; |
| } |
| .user-message .message-bubble { |
| background-color: #d1e7ff; |
| border-radius: 18px 18px 0 18px; |
| padding: 12px 16px; |
| margin: 4px 0; |
| line-height: 1.4; |
| } |
| .bot-message { |
| align-self: flex-start; |
| max-width: 80%; |
| } |
| .bot-message .message-bubble { |
| background-color: #f1f1f1; |
| border-radius: 18px 18px 18px 0; |
| padding: 12px 16px; |
| margin: 4px 0; |
| line-height: 1.4; |
| } |
| .message-time { |
| font-size: 0.75rem; |
| color: #64748b; |
| margin-top: 4px; |
| text-align: right; |
| } |
| .message-time { |
| font-size: 0.75rem; |
| color: #64748b; |
| margin-top: 4px; |
| } |
| .chat-input-container { |
| padding: 1rem; |
| border-top: 1px solid #e2e8f0; |
| background: white; |
| position: sticky; |
| bottom: 0; |
| } |
| .chat-input { |
| display: flex; |
| padding: 0.5rem; |
| gap: 0.5rem; |
| align-items: center; |
| } |
| .chat-input textarea { |
| flex-grow: 1; |
| border: 1px solid #e2e8f0; |
| border-radius: 12px; |
| padding: 0.75rem 1rem; |
| resize: none; |
| min-height: 44px; |
| max-height: 200px; |
| outline: none; |
| font-family: inherit; |
| line-height: 1.5; |
| } |
| .chat-input textarea:focus { |
| border-color: #3b82f6; |
| box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1); |
| } |
| .quick-replies { |
| display: flex; |
| gap: 0.5rem; |
| flex-wrap: wrap; |
| margin-top: 0.5rem; |
| } |
| .quick-reply { |
| background-color: #f1f5f9; |
| border-radius: 16px; |
| padding: 4px 12px; |
| font-size: 0.875rem; |
| cursor: pointer; |
| transition: all 0.2s; |
| } |
| .quick-reply:hover { |
| background-color: #e2e8f0; |
| } |
| @media (max-width: 768px) { |
| .history-sidebar { |
| position: absolute; |
| left: -100%; |
| transition: transform 0.3s ease; |
| z-index: 10; |
| height: 100vh; |
| background: white; |
| } |
| .history-sidebar.active { |
| transform: translateX(100%); |
| } |
| .chat-container { |
| width: 100%; |
| } |
| } |
| .user-message { |
| animation: slideInRight 0.3s ease-out; |
| } |
| .bot-message { |
| animation: slideInLeft 0.3s ease-out; |
| } |
| @keyframes slideInRight { |
| from { transform: translateX(20px); opacity: 0; } |
| to { transform: translateX(0); opacity: 1; } |
| } |
| @keyframes slideInLeft { |
| from { transform: translateX(-20px); opacity: 0; } |
| to { transform: translateX(0); opacity: 1; } |
| } |
| .visualization-container { |
| transition: all 0.5s ease; |
| } |
| .history-item { |
| transition: all 0.2s ease; |
| } |
| .history-item:hover { |
| background-color: #f0f4f8; |
| } |
| .map-container { |
| height: 400px; |
| border-radius: 8px; |
| overflow: hidden; |
| } |
| .graph-container { |
| height: 400px; |
| border-radius: 8px; |
| overflow: hidden; |
| } |
| .typing-dots span { |
| display: inline-block; |
| width: 8px; |
| height: 8px; |
| background-color: #64748b; |
| border-radius: 50%; |
| animation: bounce 1.4s infinite ease-in-out; |
| } |
| .typing-dots span:nth-child(2) { |
| animation-delay: 0.2s; |
| } |
| .typing-dots span:nth-child(3) { |
| animation-delay: 0.4s; |
| } |
| @keyframes bounce { |
| 0%, 80%, 100% { transform: translateY(0); } |
| 40% { transform: translateY(-8px); } |
| } |
| </style> |
| </head> |
| <body class="min-h-screen flex flex-col"> |
| |
| <div class="govt-header text-white py-2 px-4"> |
| <div class="container mx-auto flex justify-between items-center"> |
| <div class="flex items-center space-x-4"> |
| <img src="https://upload.wikimedia.org/wikipedia/en/thumb/4/41/Flag_of_India.svg/1200px-Flag_of_India.svg.png" alt="Indian Flag" class="h-8"> |
| <img src="https://www.moes.gov.in/sites/default/files/moes-logo_1.png" alt="MoES Logo" class="h-10"> |
| <span class="font-bold">भारत सरकार | Government of India</span> |
| </div> |
| <div class="flex items-center space-x-4"> |
| <span class="text-sm">A-14, 15 & 19, Sector-1, Noida, UP-201301</span> |
| <span class="text-sm">Email: support@moes.gov.in</span> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <nav class="bg-white shadow-md"> |
| <div class="container mx-auto px-4 py-3 flex justify-between items-center"> |
| <div class="flex items-center space-x-8"> |
| <a href="index.html" class="text-xl font-bold text-blue-800">ARGO Data Explorer</a> |
| <div class="hidden md:flex space-x-6"> |
| <a href="index.html" class="nav-link text-gray-600 hover:text-blue-800 font-medium">Home</a> |
| <a href="chatbot.html" class="nav-link text-blue-800 font-medium">FloatChat</a> |
| <a href="#" class="nav-link text-gray-600 hover:text-blue-800 font-medium">Datasets</a> |
| <a href="#" class="nav-link text-gray-600 hover:text-blue-800 font-medium">Research</a> |
| <a href="#" class="nav-link text-gray-600 hover:text-blue-800 font-medium">Publications</a> |
| <a href="#" class="nav-link text-gray-600 hover:text-blue-800 font-medium">About</a> |
| </div> |
| </div> |
| <div class="flex items-center space-x-4"> |
| <span class="text-sm hidden md:block">Welcome, Researcher</span> |
| <button class="bg-blue-700 hover:bg-blue-800 text-white px-4 py-2 rounded-md font-medium transition duration-300 flex items-center space-x-2"> |
| <i data-feather="log-out" class="w-4 h-4"></i> |
| <span>Logout</span> |
| </button> |
| </div> |
| </div> |
| </nav> |
|
|
| |
| <main class="flex-1"> |
| <div class="main-container"> |
| |
| <div class="history-sidebar w-64 bg-white p-4 border-r border-gray-200 overflow-y-auto" data-aos="fade-right"> |
| <div class="flex justify-between items-center mb-4"> |
| <h2 class="text-xl font-bold text-gray-800">Chat History</h2> |
| <button class="text-blue-600 hover:text-blue-800"> |
| <i data-feather="refresh-cw" class="w-5 h-5"></i> |
| </button> |
| </div> |
| <div class="space-y-2 max-h-[calc(100vh-250px)] overflow-y-auto"> |
| <div class="history-item p-3 rounded-md cursor-pointer bg-blue-50 border border-blue-200"> |
| <p class="font-medium text-blue-800 truncate">Show salinity profiles near the equator</p> |
| <p class="text-xs text-gray-500">Today, 10:45 AM</p> |
| </div> |
| <div class="history-item p-3 rounded-md cursor-pointer hover:bg-gray-50 border border-transparent"> |
| <p class="font-medium text-gray-700 truncate">Compare BGC parameters in Arabian Sea</p> |
| <p class="text-xs text-gray-500">Yesterday, 3:22 PM</p> |
| </div> |
| <div class="history-item p-3 rounded-md cursor-pointer hover:bg-gray-50 border border-transparent"> |
| <p class="font-medium text-gray-700 truncate">Nearest ARGO floats to Mumbai</p> |
| <p class="text-xs text-gray-500">Yesterday, 11:10 AM</p> |
| </div> |
| <div class="history-item p-3 rounded-md cursor-pointer hover:bg-gray-50 border border-transparent"> |
| <p class="font-medium text-gray-700 truncate">Temperature trends in Bay of Bengal</p> |
| <p class="text-xs text-gray-500">May 15, 2023</p> |
| </div> |
| <div class="history-item p-3 rounded-md cursor-pointer hover:bg-gray-50 border border-transparent"> |
| <p class="font-medium text-gray-700 truncate">Salinity-depth profile at 10°N, 75°E</p> |
| <p class="text-xs text-gray-500">May 14, 2023</p> |
| </div> |
| </div> |
| <button class="mt-4 w-full bg-gray-100 hover:bg-gray-200 text-gray-700 py-2 rounded-md font-medium transition duration-300 flex items-center justify-center space-x-2"> |
| <i data-feather="plus" class="w-4 h-4"></i> |
| <span>New Chat</span> |
| </button> |
| </div> |
|
|
| |
| <div class="chat-container bg-white" data-aos="fade-up"> |
| |
| <div class="border-b p-4 bg-blue-50"> |
| <h2 class="text-xl font-bold text-gray-800">FloatChat - ARGO Data Explorer</h2> |
| <p class="text-sm text-gray-600">Ask questions about ARGO float data in natural language</p> |
| </div> |
| |
| |
| <div class="chat-messages"> |
| |
| <div class="bot-message flex"> |
| <div class="flex-shrink-0 mr-3"> |
| <div class="bg-blue-100 text-blue-800 rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="cpu" class="w-4 h-4"></i> |
| </div> |
| </div> |
| <div class="flex-1"> |
| <div class="message-bubble"> |
| <p>Hello! I'm your ARGO data assistant. You can ask me questions about ocean temperature, salinity, and other parameters from ARGO floats worldwide. How can I help you today?</p> |
| <div class="message-time">Today, 10:45 AM</div> |
| <div class="mt-2"> |
| <p class="text-sm font-medium text-gray-700 mb-1">Try asking:</p> |
| <div class="quick-replies"> |
| <div class="quick-reply">Show salinity profiles near equator</div> |
| <div class="quick-reply">Compare BGC parameters in Arabian Sea</div> |
| <div class="quick-reply">Nearest ARGO floats to Mumbai</div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="user-message flex justify-end"> |
| <div class="flex-1"> |
| <div class="message-bubble"> |
| <p>Show me temperature profiles at 10°N, 75°E for the last month</p> |
| <div class="message-time">Today, 10:46 AM</div> |
| </div> |
| </div> |
| <div class="flex-shrink-0 ml-3"> |
| <div class="bg-blue-700 text-white rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="user" class="w-4 h-4"></i> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="bot-message flex"> |
| <div class="flex-shrink-0 mr-3"> |
| <div class="bg-blue-100 text-blue-800 rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="cpu" class="w-4 h-4"></i> |
| </div> |
| </div> |
| <div class="flex-1"> |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <p>Here are the temperature profiles from ARGO floats near 10°N, 75°E over the past month:</p> |
| |
| |
| <div class="mt-4 visualization-container"> |
| <div class="graph-container" id="temperatureGraph"></div> |
| <script> |
| |
| const tempData = [ |
| { |
| z: [[28.5, 28.3, 28.1], [25.0, 24.8, 24.6], [15.0, 14.8, 14.6], [8.0, 7.9, 7.8]], |
| x: ['May 1', 'May 15', 'May 30'], |
| y: ['0-50m', '50-200m', '200-500m', '500-1000m'], |
| type: 'heatmap', |
| colorscale: 'Viridis', |
| colorbar: { |
| title: 'Temperature (°C)' |
| } |
| } |
| ]; |
| const tempLayout = { |
| title: 'Temperature Profiles at 10°N, 75°E', |
| xaxis: { title: 'Date' }, |
| yaxis: { title: 'Depth Range' } |
| }; |
| Plotly.newPlot('temperatureGraph', tempData, tempLayout); |
| </script> |
| </div> |
| |
| <div class="mt-4 text-sm text-gray-600"> |
| <p>The data shows surface temperatures around 28-29°C, decreasing with depth. The thermocline is visible around 50-200m depth where temperature drops rapidly.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="user-message flex justify-end"> |
| <div class="flex-1 max-w-[80%]"> |
| <div class="bg-blue-100 p-4 rounded-lg"> |
| <p>Show the locations of ARGO floats in the Indian Ocean</p> |
| </div> |
| </div> |
| <div class="flex-shrink-0 ml-3"> |
| <div class="bg-blue-700 text-white rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="user" class="w-4 h-4"></i> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="bot-message flex"> |
| <div class="flex-shrink-0 mr-3"> |
| <div class="bg-blue-100 text-blue-800 rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="cpu" class="w-4 h-4"></i> |
| </div> |
| </div> |
| <div class="flex-1"> |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <p>Here are the active ARGO floats currently reporting data in the Indian Ocean region:</p> |
| |
| |
| <div class="mt-4 visualization-container"> |
| <div class="map-container" id="argoMap"></div> |
| <script> |
| |
| const map = L.map('argoMap').setView([10, 75], 4); |
| |
| |
| L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { |
| attribution: '© <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors' |
| }).addTo(map); |
| |
| |
| const floatLocations = [ |
| { lat: 8.5, lng: 72.5, id: '2902304', date: '2023-05-28' }, |
| { lat: 12.3, lng: 68.7, id: '2902305', date: '2023-05-27' }, |
| { lat: 15.2, lng: 80.1, id: '2902306', date: '2023-05-26' }, |
| { lat: 5.5, lng: 85.3, id: '2902307', date: '2023-05-25' }, |
| { lat: -2.4, lng: 78.9, id: '2902308', date: '2023-05-24' } |
| ]; |
| |
| |
| floatLocations.forEach(loc => { |
| const marker = L.marker([loc.lat, loc.lng]).addTo(map) |
| .bindPopup(`<b>ARGO Float ${loc.id}</b><br>Last report: ${loc.date}`); |
| |
| |
| marker.setIcon(L.icon({ |
| iconUrl: 'https://cdn-icons-png.flaticon.com/512/447/447031.png', |
| iconSize: [25, 25], |
| iconAnchor: [12, 12] |
| })); |
| }); |
| </script> |
| </div> |
| |
| <div class="mt-4"> |
| <p class="text-sm text-gray-600">There are currently 47 active ARGO floats in the Indian Ocean region. Click on any marker to see float details.</p> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="user-message flex justify-end"> |
| <div class="flex-1 max-w-[80%]"> |
| <div class="bg-blue-100 p-4 rounded-lg"> |
| <p>Show a table comparing salinity at different depths for float 2902304</p> |
| </div> |
| </div> |
| <div class="flex-shrink-0 ml-3"> |
| <div class="bg-blue-700 text-white rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="user" class="w-4 h-4"></i> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="bot-message flex"> |
| <div class="flex-shrink-0 mr-3"> |
| <div class="bg-blue-100 text-blue-800 rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="cpu" class="w-4 h-4"></i> |
| </div> |
| </div> |
| <div class="flex-1"> |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <p>Here's the salinity data at different depths for ARGO float 2902304:</p> |
| |
| |
| <div class="mt-4 overflow-x-auto"> |
| <table class="min-w-full divide-y divide-gray-200"> |
| <thead class="bg-gray-50"> |
| <tr> |
| <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Depth (m)</th> |
| <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Salinity (PSU)</th> |
| <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Temperature (°C)</th> |
| <th scope="col" class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase tracking-wider">Date</th> |
| </tr> |
| </thead> |
| <tbody class="bg-white divide-y divide-gray-200"> |
| <tr> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">10</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">34.56</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">28.7</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-05-28</td> |
| </tr> |
| <tr> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">50</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">35.12</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">25.3</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-05-28</td> |
| </tr> |
| <tr> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">100</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">35.45</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">20.1</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-05-28</td> |
| </tr> |
| <tr> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">200</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">35.67</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">15.8</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-05-28</td> |
| </tr> |
| <tr> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">500</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">35.72</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">8.5</td> |
| <td class="px-6 py-4 whitespace-nowrap text-sm text-gray-500">2023-05-28</td> |
| </tr> |
| </tbody> |
| </table> |
| </div> |
| |
| <div class="mt-4"> |
| <button class="text-sm bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md font-medium transition duration-300 flex items-center space-x-2"> |
| <i data-feather="download" class="w-4 h-4"></i> |
| <span>Download Data (CSV)</span> |
| </button> |
| </div> |
| </div> |
| </div> |
| </div> |
|
|
| |
| <div class="typing-indicator flex hidden"> |
| <div class="flex-shrink-0 mr-3"> |
| <div class="bg-blue-100 text-blue-800 rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="cpu" class="w-4 h-4"></i> |
| </div> |
| </div> |
| <div class="flex-1"> |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <div class="flex items-center space-x-2"> |
| <div class="typing-dots flex space-x-1"> |
| <span></span> |
| <span></span> |
| <span></span> |
| </div> |
| <span class="text-sm text-gray-600">FloatChat is typing...</span> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| |
| |
| <div class="chat-input-container"> |
| <form class="chat-input"> |
| <textarea placeholder="Ask about ARGO data..." rows="1"></textarea> |
| <button type="submit" class="bg-blue-600 hover:bg-blue-700 text-white px-4 py-2 rounded-md font-medium transition duration-300 flex items-center justify-center"> |
| <i data-feather="send" class="w-4 h-4"></i> |
| </button> |
| </form> |
| <div class="quick-replies"> |
| <div class="quick-reply">Show salinity profiles</div> |
| <div class="quick-reply">Compare temperature trends</div> |
| <div class="quick-reply">Map of ARGO floats</div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </div> |
| </main> |
|
|
| |
| <footer class="bg-gray-800 text-white py-6 mt-auto"> |
| <div class="container mx-auto px-4"> |
| <div class="flex flex-col md:flex-row justify-between items-center"> |
| <div class="mb-4 md:mb-0"> |
| <p class="text-sm">© 2023 Ministry of Earth Sciences, Government of India. All Rights Reserved.</p> |
| </div> |
| <div class="flex space-x-4"> |
| <a href="#" class="text-sm hover:underline">Privacy Policy</a> |
| <a href="#" class="text-sm hover:underline">Terms of Service</a> |
| <a href="#" class="text-sm hover:underline">Contact Us</a> |
| </div> |
| </div> |
| </div> |
| </footer> |
|
|
| <script> |
| AOS.init(); |
| feather.replace(); |
| |
| // Auto-expand textarea |
| const textarea = document.querySelector('textarea'); |
| textarea.addEventListener('input', function() { |
| this.style.height = 'auto'; |
| this.style.height = (this.scrollHeight) + 'px'; |
| }); |
| |
| // Check for quick chat input from home page |
| const quickChatInput = sessionStorage.getItem('quickChatInput'); |
| if (quickChatInput) { |
| // Add the quick input as a user message |
| const messagesContainer = document.querySelector('.chat-messages'); |
| const userMessage = document.createElement('div'); |
| userMessage.className = 'user-message flex justify-end'; |
| userMessage.innerHTML = ` |
| <div class="flex-1 max-w-[80%]"> |
| <div class="bg-blue-100 p-4 rounded-lg"> |
| <p>${quickChatInput}</p> |
| </div> |
| </div> |
| <div class="flex-shrink-0 ml-3"> |
| <div class="bg-blue-700 text-white rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="user" class="w-4 h-4"></i> |
| </div> |
| </div> |
| `; |
| messagesContainer.appendChild(userMessage); |
| |
| // Clear the stored input |
| sessionStorage.removeItem('quickChatInput'); |
| |
| // Show typing indicator |
| showTyping(); |
| |
| // Generate mock response after delay |
| setTimeout(() => { |
| generateMockResponse(quickChatInput); |
| }, 1500); |
| } |
| |
| // Auto-scroll to bottom of chat |
| const messagesContainer = document.querySelector('.chat-messages'); |
| function scrollToBottom() { |
| messagesContainer.scrollTop = messagesContainer.scrollHeight; |
| } |
| scrollToBottom(); |
| |
| // Generate mock response based on input |
| function generateMockResponse(input) { |
| const messagesContainer = document.querySelector('.chat-messages'); |
| const botMessage = document.createElement('div'); |
| botMessage.className = 'bot-message flex'; |
| |
| let responseContent = ''; |
| if (input.toLowerCase().includes('temperature')) { |
| responseContent = ` |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <p>Here are temperature profiles matching your query:</p> |
| <div class="mt-4 text-sm text-gray-600"> |
| <p>• Surface temperature: 28-30°C</p> |
| <p>• 50m depth: 25-27°C</p> |
| <p>• 100m depth: 20-22°C</p> |
| <p>• 200m depth: 15-17°C</p> |
| </div> |
| <p class="mt-2 text-sm">Would you like to see this data visualized on a graph?</p> |
| </div> |
| `; |
| } else if (input.toLowerCase().includes('salinity')) { |
| responseContent = ` |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <p>Here are salinity measurements:</p> |
| <div class="mt-4 text-sm text-gray-600"> |
| <p>• Surface salinity: 34-35 PSU</p> |
| <p>• 50m depth: 35-36 PSU</p> |
| <p>• 100m depth: 36-37 PSU</p> |
| </div> |
| <p class="mt-2 text-sm">I can show you a time series comparison if you'd like.</p> |
| </div> |
| `; |
| } else if (input.toLowerCase().includes('map') || input.toLowerCase().includes('location')) { |
| responseContent = ` |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <p>Here are ARGO float locations in the Indian Ocean region:</p> |
| <div class="mt-4 text-sm text-gray-600"> |
| <p>• 8°N, 72°E - Float ID: 2902304</p> |
| <p>• 12°N, 68°E - Float ID: 2902305</p> |
| <p>• 15°N, 80°E - Float ID: 2902306</p> |
| </div> |
| <p class="mt-2 text-sm">Would you like to see these on an interactive map?</p> |
| </div> |
| `; |
| } else { |
| responseContent = ` |
| <div class="bg-gray-50 p-4 rounded-lg"> |
| <p>I can help you explore ARGO float data including:</p> |
| <div class="mt-2 text-sm text-gray-600"> |
| <p>• Temperature profiles</p> |
| <p>• Salinity measurements</p> |
| <p>• Float locations and trajectories</p> |
| <p>• Time series comparisons</p> |
| </div> |
| <p class="mt-2 text-sm">Try asking about specific parameters or regions.</p> |
| </div> |
| `; |
| } |
| |
| botMessage.innerHTML = ` |
| <div class="flex-shrink-0 mr-3"> |
| <div class="bg-blue-100 text-blue-800 rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="cpu" class="w-4 h-4"></i> |
| </div> |
| </div> |
| <div class="flex-1"> |
| ${responseContent} |
| </div> |
| `; |
| |
| messagesContainer.appendChild(botMessage); |
| feather.replace(); |
| scrollToBottom(); |
| |
| // Animate new message |
| anime({ |
| targets: botMessage, |
| opacity: [0, 1], |
| translateX: [-20, 0], |
| duration: 300 |
| }); |
| } |
| |
| // Simulate typing indicator |
| function showTyping() { |
| const typing = document.querySelector('.typing-indicator'); |
| typing.classList.remove('hidden'); |
| |
| setTimeout(() => { |
| typing.classList.add('hidden'); |
| // Add new bot message here |
| }, 1500); |
| } |
| |
| // Handle form submission |
| document.querySelector('form').addEventListener('submit', (e) => { |
| e.preventDefault(); |
| const input = e.target.querySelector('input'); |
| const message = input.value.trim(); |
| |
| if (message) { |
| // Add user message |
| const messagesContainer = document.querySelector('.chat-messages'); |
| const userMessage = document.createElement('div'); |
| userMessage.className = 'user-message flex justify-end'; |
| userMessage.innerHTML = ` |
| <div class="flex-1 max-w-[80%]"> |
| <div class="bg-blue-100 p-4 rounded-lg"> |
| <p>${message}</p> |
| </div> |
| </div> |
| <div class="flex-shrink-0 ml-3"> |
| <div class="bg-blue-700 text-white rounded-full w-8 h-8 flex items-center justify-center"> |
| <i data-feather="user" class="w-4 h-4"></i> |
| </div> |
| </div> |
| `; |
| messagesContainer.appendChild(userMessage); |
| |
| // Scroll to bottom |
| messagesContainer.scrollTop = messagesContainer.scrollHeight; |
| |
| // Clear input |
| input.value = ''; |
| |
| // Show typing indicator |
| showTyping(); |
| |
| // Animate new message |
| anime({ |
| targets: userMessage, |
| opacity: [0, 1], |
| translateX: [20, 0], |
| duration: 300 |
| }); |
| |
| // Replace feather icons |
| feather.replace(); |
| } |
| }); |
| </script> |
| </body> |
| </html> |
|
|