Files
smart-city-digital-twin-mar…/smart-app-city/design/13-health-v2.html
Eric FELIXINE e30ae8ed09 feat(smart-app): implement complete mobile app MVP
- App.tsx: full navigation (Auth stack + Main tabs with 5 screens)
- Auth: LoginScreen, RegisterScreen, ForgotPasswordScreen
- HomeScreen: dashboard with IoT metrics, weather widget, alerts, quick actions, sensors
- MapScreen: interactive map with layer toggles (6 layers)
- MarketplaceScreen: categories (6), products (5), search
- ChatScreen: AI chat with quick prompts (4), bot responses
- ProfileScreen: user info, stats, menu (9 items), logout
- AlertsScreen: alert list with severity, acknowledge
- SensorsScreen: sensor list with type filters (6 types), search
- ZonesScreen: zone cards with stats
- SettingsScreen: language picker (FR/EN/ES/DE), privacy, about
- Stores: iotStore (sensors, zones, alerts), notificationStore, uiStore + i18n
- Hooks: useSensors, useAlerts, useNotifications, useLocation
- Components: Card, Button, LoadingSpinner, ErrorBoundary, Header
- Services: iotService, notificationService (with axios API client)
- Utils: formatters (temp, AQI, noise, dates), validators (email, password, IBAN)
- Theme: colors.ts with full design system (Blue Ocean palette)
- Ditto: fixed MongoDB connection, new JWT secrets, official gateway image
2026-06-01 18:00:35 -04:00

189 lines
8.6 KiB
HTML

<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Smart App City v2 — 13 Santé</title>
<link rel="stylesheet" href="shared-blue.css">
<style>
.health-header {
padding: 16px;
background: linear-gradient(135deg, #C62828, #B71C1C);
color: white;
}
.health-title { font-size: var(--text-xl); font-weight: var(--weight-bold); margin-bottom: 4px; }
.health-sub { font-size: var(--text-sm); opacity: 0.85; }
.pharmacy-card {
display: flex; gap: 12px;
padding: 14px 16px;
background: white;
border-bottom: 1px solid var(--neutral-100);
align-items: center;
}
.pharmacy-icon {
width: 44px; height: 44px;
border-radius: var(--radius-md);
display: flex; align-items: center; justify-content: center;
font-size: 20px;
flex-shrink: 0;
}
.pharmacy-info { flex: 1; }
.pharmacy-name { font-size: var(--text-sm); font-weight: var(--weight-semibold); }
.pharmacy-addr { font-size: var(--text-xs); color: var(--neutral-500); }
.pharmacy-distance { font-size: 10px; color: var(--neutral-400); }
.open-badge {
padding: 3px 10px;
border-radius: var(--radius-full);
font-size: 10px;
font-weight: 600;
}
.open-now { background: rgba(46,125,50,0.1); color: var(--alert-success); }
.open-garde { background: rgba(245,124,0,0.1); color: var(--alert-warning); }
.open-closed { background: rgba(211,47,47,0.1); color: var(--alert-danger); }
.stats-row {
display: grid; grid-template-columns: repeat(3, 1fr);
gap: 10px; padding: 16px;
}
.stat-box {
background: white;
border-radius: var(--radius-lg);
padding: 14px 10px;
text-align: center;
box-shadow: var(--shadow-sm);
border: 1px solid var(--neutral-100);
}
.stat-box-icon { font-size: 24px; margin-bottom: 6px; }
.stat-box-value { font-size: var(--text-xl); font-weight: 700; color: var(--primary-500); }
.stat-box-label { font-size: 10px; color: var(--neutral-500); }
/* Fixed viewport for PDF/iframe embedding */
html, body { width: 390px !important; height: 844px !important; overflow: hidden !important; margin: 0 !important; padding: 0 !important; }
</style>
</head>
<body>
<div class="mobile-frame">
<div class="status-bar"><span>9:41</span></div>
<!-- Header -->
<div class="health-header">
<div class="health-title">🏥 Services de Santé</div>
<div class="health-sub">Pharmacies, urgences, rendez-vous · Martinique</div>
</div>
<!-- Content -->
<div class="content-area" style="top:88px;background:var(--neutral-50);">
<!-- Quick stats -->
<div class="stats-row">
<div class="stat-box">
<div class="stat-box-icon">💊</div>
<div class="stat-box-value">3</div>
<div class="stat-box-label">Pharmacies de garde</div>
</div>
<div class="stat-box">
<div class="stat-box-icon">🚑</div>
<div class="stat-box-value">1</div>
<div class="stat-box-label">Urgences à proximité</div>
</div>
<div class="stat-box">
<div class="stat-box-icon">📅</div>
<div class="stat-box-value">12</div>
<div class="stat-box-label">RDV disponibles</div>
</div>
</div>
<!-- Emergency banner -->
<div style="margin:0 16px 12px;background:linear-gradient(135deg,#FFEBEE,#FFCDD2);border:1px solid #EF9A9A;border-radius:var(--radius-lg);padding:12px 14px;display:flex;align-items:center;gap:10px;">
<div style="font-size:28px;">🚨</div>
<div>
<div style="font-weight:700;font-size:var(--text-sm);color:#C62828;">Urgences CHU</div>
<div style="font-size:11px;color:#C62828;">0596 55 20 00 · Pothière · 4.2 km</div>
</div>
</div>
<!-- Pharmacies -->
<div style="padding:0 16px 8px;font-size:var(--text-md);font-weight:700;">Pharmacies de garde 🌙</div>
<div class="pharmacy-card">
<div class="pharmacy-icon" style="background:#E8F5E9;">💊</div>
<div class="pharmacy-info">
<div class="pharmacy-name">Pharmacie Centrale</div>
<div class="pharmacy-addr">Av. des Caraïbes, FDF</div>
<div class="pharmacy-distance">📍 1.2 km · 5 min</div>
</div>
<div class="open-badge open-garde">Garde</div>
</div>
<div class="pharmacy-card">
<div class="pharmacy-icon" style="background:#E3F2FD;">💊</div>
<div class="pharmacy-info">
<div class="pharmacy-name">Pharmacie du Port</div>
<div class="pharmacy-addr">Bd du Général de Gaulle, FDF</div>
<div class="pharmacy-distance">📍 1.8 km · 7 min</div>
</div>
<div class="open-badge open-now">Ouverte</div>
</div>
<div class="pharmacy-card">
<div class="pharmacy-icon" style="background:#FFF3E0;">💊</div>
<div class="pharmacy-info">
<div class="pharmacy-name">Pharmacie de l'Université</div>
<div class="pharmacy-addr">Campus Schoelcher</div>
<div class="pharmacy-distance">📍 6.3 km · 15 min</div>
</div>
<div class="open-badge open-now">Ouverte</div>
</div>
<!-- Health quick actions -->
<div style="padding:16px 16px 8px;font-size:var(--text-md);font-weight:700;">Services santé</div>
<div style="display:grid;grid-template-columns:1fr 1fr;gap:10px;padding:0 16px 16px;">
<div style="background:white;border-radius:var(--radius-lg);padding:14px;text-align:center;box-shadow:var(--shadow-sm);border:1px solid var(--neutral-100);cursor:pointer;">
<div style="font-size:26px;margin-bottom:6px;">📅</div>
<div style="font-weight:600;font-size:var(--text-sm);">Prendre RDV</div>
<div style="font-size:10px;color:var(--neutral-500);">Médecin, dentiste...</div>
</div>
<div style="background:white;border-radius:var(--radius-lg);padding:14px;text-align:center;box-shadow:var(--shadow-sm);border:1px solid var(--neutral-100);cursor:pointer;">
<div style="font-size:26px;margin-bottom:6px;">🩺</div>
<div style="font-weight:600;font-size:var(--text-sm);">Téléconsultation</div>
<div style="font-size:10px;color:var(--neutral-500);">Médecin en ligne</div>
</div>
<div style="background:white;border-radius:var(--radius-lg);padding:14px;text-align:center;box-shadow:var(--shadow-sm);border:1px solid var(--neutral-100);cursor:pointer;">
<div style="font-size:26px;margin-bottom:6px;">📋</div>
<div style="font-weight:600;font-size:var(--text-sm);">Carnet santé</div>
<div style="font-size:10px;color:var(--neutral-500);">FHIR · Mon dossier</div>
</div>
<div style="background:white;border-radius:var(--radius-lg);padding:14px;text-align:center;box-shadow:var(--shadow-sm);border:1px solid var(--neutral-100);cursor:pointer;">
<div style="font-size:26px;margin-bottom:6px;">🧠</div>
<div style="font-weight:600;font-size:var(--text-sm);">Bien-être</div>
<div style="font-size:10px;color:var(--neutral-500);">Sport, nutrition</div>
</div>
</div>
<div style="height:16px;"></div>
</div>
<!-- Bottom Nav -->
<div class="bottom-nav">
<div class="bottom-nav-item">
<svg viewBox="0 0 24 24" fill="currentColor"><path d="M3 9l9-7 9 7v11a2 2 0 01-2 2H5a2 2 0 01-2-2z"/><polyline points="9 22 9 12 15 12 15 22" fill="none" stroke="currentColor" stroke-width="2"/></svg><span>Accueil</span>
</div>
<div class="bottom-nav-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><polygon points="1 6 1 22 8 18 16 22 23 18 23 2 16 6 8 2 1 6"/><line x1="8" y1="2" x2="8" y2="18"/><line x1="16" y1="6" x2="16" y2="22"/></svg><span>Carte</span>
</div>
<div class="bottom-nav-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M8 14s1.5 2 4 2 4-2 4-2"/><line x1="9" y1="9" x2="9.01" y2="9"/><line x1="15" y1="9" x2="15.01" y2="9"/></svg><span>AI Chat</span>
</div>
<div class="bottom-nav-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><rect x="2" y="3" width="20" height="14" rx="2"/><line x1="8" y1="21" x2="16" y2="21"/><line x1="12" y1="17" x2="12" y2="21"/></svg><span>Marché</span>
</div>
<div class="bottom-nav-item active">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M20 21v-2a4 4 0 00-4-4H8a4 4 0 00-4 4v2"/><circle cx="12" cy="7" r="4"/></svg><span>Profil</span>
</div>
</div>
<div style="position:absolute;bottom:88px;left:0;right:0;text-align:center;font-size:10px;color:var(--neutral-400);">13 — Services Santé v2 / Blue</div>
</div>
</body>
</html>