Files
smart-city-digital-twin-mar…/smart-app-city/design/01-onboarding-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

233 lines
7.8 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 — 01 Onboarding</title>
<link rel="stylesheet" href="shared-blue.css">
<style>
.onboarding-bg {
width: 100%; height: 100%;
background: linear-gradient(160deg, #051C38 0%, #0D47A1 40%, #00838F 100%);
display: flex; flex-direction: column;
align-items: center; justify-content: center;
padding: 32px; text-align: center;
position: relative; overflow: hidden;
}
.onboarding-bg::before {
content: '';
position: absolute;
width: 400px; height: 400px;
border-radius: 50%;
background: rgba(255,255,255,0.04);
top: -100px; right: -100px;
}
.onboarding-bg::after {
content: '';
position: absolute;
width: 300px; height: 300px;
border-radius: 50%;
background: rgba(255,255,255,0.03);
bottom: -50px; left: -80px;
}
.wave-decoration {
position: absolute; bottom: 0; left: 0; right: 0;
height: 120px;
overflow: hidden;
}
.wave-decoration svg {
width: 100%; height: 100%;
}
.onboarding-logo {
width: 100px; height: 100px;
background: rgba(255,255,255,0.12);
border-radius: 28px;
display: flex; align-items: center; justify-content: center;
margin-bottom: 24px;
backdrop-filter: blur(12px);
position: relative; z-index: 1;
border: 1px solid rgba(255,255,255,0.15);
}
.onboarding-title {
font-size: var(--text-3xl);
font-weight: var(--weight-bold);
color: white;
margin-bottom: 6px;
position: relative; z-index: 1;
}
.onboarding-subtitle {
font-size: var(--text-base);
color: rgba(255,255,255,0.7);
margin-bottom: 8px;
position: relative; z-index: 1;
}
.onboarding-tagline {
font-size: var(--text-sm);
color: rgba(255,255,255,0.5);
margin-bottom: 32px;
position: relative; z-index: 1;
}
.onboarding-actions {
width: 100%;
max-width: 300px;
display: flex; flex-direction: column;
gap: 12px; position: relative; z-index: 1;
}
.onboarding-actions .btn { width: 100%; }
.btn-white {
background: white;
color: var(--primary-600);
font-weight: 700;
}
.btn-white:hover { background: var(--primary-50); }
.btn-ghost-white {
background: rgba(255,255,255,0.1);
color: white;
border: 2px solid rgba(255,255,255,0.25);
backdrop-filter: blur(4px);
}
.btn-ghost-white:hover { background: rgba(255,255,255,0.2); }
.lang-selector {
display: flex; gap: 8px; margin-bottom: 28px;
position: relative; z-index: 1;
flex-wrap: wrap; justify-content: center;
}
.lang-pill {
padding: 6px 16px;
border-radius: var(--radius-full);
background: rgba(255,255,255,0.15);
color: white;
font-size: var(--text-sm);
font-weight: var(--weight-medium);
cursor: pointer;
border: 2px solid transparent;
transition: all 0.2s;
backdrop-filter: blur(4px);
}
.lang-pill.active {
background: white;
color: var(--primary-600);
border-color: white;
}
.feature-icons {
display: flex; gap: 16px; margin-bottom: 32px;
position: relative; z-index: 1;
flex-wrap: wrap; justify-content: center;
}
.feat-icon {
display: flex; flex-direction: column;
align-items: center; gap: 6px;
}
.feat-icon-circle {
width: 48px; height: 48px;
border-radius: var(--radius-full);
background: rgba(255,255,255,0.12);
display: flex; align-items: center; justify-content: center;
backdrop-filter: blur(4px);
border: 1px solid rgba(255,255,255,0.1);
}
.feat-icon-label {
font-size: 10px;
color: rgba(255,255,255,0.6);
}
.page-label {
position: absolute; bottom: 20px;
left: 0; right: 0;
text-align: center;
font-size: var(--text-xs);
color: rgba(255,255,255,0.3);
}
.version-badge {
position: absolute; top: 50px; right: 16px;
background: rgba(255,255,255,0.15);
color: rgba(255,255,255,0.7);
font-size: 10px;
padding: 4px 10px;
border-radius: var(--radius-full);
font-weight: 600;
z-index: 2;
}
/* 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="version-badge">v2.0</div>
<div class="onboarding-bg">
<div class="onboarding-logo">
<svg width="52" height="52" viewBox="0 0 52 52" fill="none">
<rect x="8" y="22" width="9" height="22" rx="3" fill="white" opacity="0.9"/>
<rect x="21.5" y="15" width="9" height="29" rx="3" fill="white" opacity="0.7"/>
<rect x="35" y="8" width="9" height="36" rx="3" fill="white" opacity="0.85"/>
<circle cx="26" cy="5" r="4.5" fill="white"/>
</svg>
</div>
<div class="onboarding-title">Smart App City</div>
<div class="onboarding-subtitle">Martinique Digital Twin</div>
<div class="onboarding-tagline">Votre ville intelligente · Connectée · Durable</div>
<div class="lang-selector">
<div class="lang-pill active">🇫🇷 FR</div>
<div class="lang-pill">🇬🇧 EN</div>
<div class="lang-pill">🇪🇸 ES</div>
<div class="lang-pill">🇩🇪 DE</div>
</div>
<div class="feature-icons">
<div class="feat-icon">
<div class="feat-icon-circle">
<svg class="icon" viewBox="0 0 24 24" stroke="white"><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"/></svg>
</div>
<span class="feat-icon-label">City</span>
</div>
<div class="feat-icon">
<div class="feat-icon-circle">
<svg class="icon" viewBox="0 0 24 24" stroke="white"><circle cx="12" cy="12" r="3"/><path d="M12 1v2M12 21v2M4.22 4.22l1.42 1.42M18.36 18.36l1.42 1.42M1 12h2M21 12h2M4.22 19.78l1.42-1.42M18.36 5.64l1.42-1.42"/></svg>
</div>
<span class="feat-icon-label">IoT</span>
</div>
<div class="feat-icon">
<div class="feat-icon-circle">
<svg class="icon" viewBox="0 0 24 24" stroke="white"><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>
</div>
<span class="feat-icon-label">AI Chat</span>
</div>
<div class="feat-icon">
<div class="feat-icon-circle">
<svg class="icon" viewBox="0 0 24 24" stroke="white"><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>
</div>
<span class="feat-icon-label">Marché</span>
</div>
<div class="feat-icon">
<div class="feat-icon-circle">
<svg class="icon" viewBox="0 0 24 24" stroke="white"><rect x="1" y="4" width="22" height="16" rx="3"/><path d="M1 10h22"/><circle cx="12" cy="15" r="1.5"/></svg>
</div>
<span class="feat-icon-label">Wallet</span>
</div>
<div class="feat-icon">
<div class="feat-icon-circle">
<svg class="icon" viewBox="0 0 24 24" stroke="white"><path d="M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"/></svg>
</div>
<span class="feat-icon-label">Services</span>
</div>
</div>
<div class="onboarding-actions">
<button class="btn btn-white">Commencer</button>
<button class="btn btn-ghost-white">Se connecter</button>
</div>
<div class="page-label">01 — Onboarding v2 / Blue</div>
<!-- Wave decoration -->
<div class="wave-decoration">
<svg viewBox="0 0 390 120" preserveAspectRatio="none">
<path d="M0 60 Q60 20 130 50 Q200 80 260 40 Q320 10 390 50 L390 120 L0 120Z" fill="rgba(255,255,255,0.04)"/>
<path d="M0 80 Q80 50 150 70 Q220 90 300 60 Q350 45 390 65 L390 120 L0 120Z" fill="rgba(255,255,255,0.03)"/>
</svg>
</div>
</div>
</div>
</body>
</html>