ticoyoyo commited on
Commit
0a8e650
·
verified ·
1 Parent(s): a020c4b

Add 3 files

Browse files
Files changed (3) hide show
  1. README.md +7 -5
  2. index.html +962 -19
  3. prompts.txt +3 -0
README.md CHANGED
@@ -1,10 +1,12 @@
1
  ---
2
- title: Test Mobile
3
- emoji: 🦀
4
- colorFrom: yellow
5
- colorTo: gray
6
  sdk: static
7
  pinned: false
 
 
8
  ---
9
 
10
- Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
 
1
  ---
2
+ title: test-mobile
3
+ emoji: 🐳
4
+ colorFrom: blue
5
+ colorTo: blue
6
  sdk: static
7
  pinned: false
8
+ tags:
9
+ - deepsite
10
  ---
11
 
12
+ Check out the configuration reference at https://huggingface.co/docs/hub/spaces-config-reference
index.html CHANGED
@@ -1,19 +1,962 @@
1
- <!doctype html>
2
- <html>
3
- <head>
4
- <meta charset="utf-8" />
5
- <meta name="viewport" content="width=device-width" />
6
- <title>My static Space</title>
7
- <link rel="stylesheet" href="style.css" />
8
- </head>
9
- <body>
10
- <div class="card">
11
- <h1>Welcome to your static Space!</h1>
12
- <p>You can modify this app directly by editing <i>index.html</i> in the Files and versions tab.</p>
13
- <p>
14
- Also don't forget to check the
15
- <a href="https://huggingface.co/docs/hub/spaces" target="_blank">Spaces documentation</a>.
16
- </p>
17
- </div>
18
- </body>
19
- </html>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html lang="fr">
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
6
+ <title>PizzaFinder - Découvrez les meilleures pizzerias près de vous</title>
7
+ <script src="https://cdn.tailwindcss.com"></script>
8
+ <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
9
+ <link rel="manifest" href="/manifest.json">
10
+ <style>
11
+ /* Mobile app styling */
12
+ body {
13
+ -webkit-tap-highlight-color: transparent;
14
+ -webkit-touch-callout: none;
15
+ overscroll-behavior-y: contain;
16
+ }
17
+
18
+ .bottom-nav {
19
+ box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.1);
20
+ }
21
+
22
+ .active-nav-item {
23
+ color: #dc2626;
24
+ }
25
+
26
+ .map-container {
27
+ height: 300px;
28
+ width: 100%;
29
+ border-radius: 16px;
30
+ }
31
+
32
+ .pizza-card {
33
+ transition: all 0.2s ease;
34
+ }
35
+
36
+ .pizza-card:active {
37
+ transform: scale(0.98);
38
+ }
39
+
40
+ .partner-badge {
41
+ position: absolute;
42
+ top: 8px;
43
+ right: 8px;
44
+ z-index: 10;
45
+ }
46
+
47
+ .modal-content {
48
+ max-height: 90vh;
49
+ overflow-y: auto;
50
+ -webkit-overflow-scrolling: touch;
51
+ }
52
+
53
+ /* Hide scrollbar but allow scrolling */
54
+ .hide-scrollbar {
55
+ -ms-overflow-style: none;
56
+ scrollbar-width: none;
57
+ }
58
+
59
+ .hide-scrollbar::-webkit-scrollbar {
60
+ display: none;
61
+ }
62
+
63
+ /* Splash screen */
64
+ .splash-screen {
65
+ position: fixed;
66
+ top: 0;
67
+ left: 0;
68
+ width: 100%;
69
+ height: 100%;
70
+ background: #dc2626;
71
+ z-index: 9999;
72
+ display: flex;
73
+ flex-direction: column;
74
+ justify-content: center;
75
+ align-items: center;
76
+ animation: fadeOut 0.5s ease 2s forwards;
77
+ }
78
+
79
+ @keyframes fadeOut {
80
+ to {
81
+ opacity: 0;
82
+ visibility: hidden;
83
+ }
84
+ }
85
+ </style>
86
+ </head>
87
+ <body class="bg-gray-50 font-sans relative">
88
+ <!-- Splash Screen -->
89
+ <div class="splash-screen">
90
+ <i class="fas fa-pizza-slice text-white text-6xl mb-4 animate-bounce"></i>
91
+ <h1 class="text-white text-2xl font-bold">PizzaFinder</h1>
92
+ </div>
93
+
94
+ <!-- Header -->
95
+ <header class="bg-red-600 text-white sticky top-0 z-10 shadow-sm">
96
+ <div class="container mx-auto px-4 py-3">
97
+ <div class="flex justify-between items-center">
98
+ <div class="flex items-center space-x-2">
99
+ <i class="fas fa-pizza-slice text-xl"></i>
100
+ <h1 class="text-xl font-bold">PizzaFinder</h1>
101
+ </div>
102
+ <div class="flex items-center space-x-4">
103
+ <button id="favorites-btn" class="relative">
104
+ <i class="fas fa-heart text-lg"></i>
105
+ <span id="fav-count" class="absolute -top-2 -right-2 bg-yellow-400 text-red-700 rounded-full w-5 h-5 flex items-center justify-center text-xs font-bold hidden">0</span>
106
+ </button>
107
+ <button id="search-btn-mobile">
108
+ <i class="fas fa-search text-lg"></i>
109
+ </button>
110
+ </div>
111
+ </div>
112
+ </div>
113
+ </header>
114
+
115
+ <!-- Main Content -->
116
+ <main class="pb-16">
117
+ <!-- Map View (default) -->
118
+ <div id="map-view" class="px-4 py-3">
119
+ <div class="relative">
120
+ <div id="map" class="map-container"></div>
121
+ <button id="current-location-btn" class="absolute bottom-4 right-4 bg-white p-3 rounded-full shadow-lg text-red-600">
122
+ <i class="fas fa-location-arrow"></i>
123
+ </button>
124
+ </div>
125
+
126
+ <!-- Quick Filters -->
127
+ <div class="flex space-x-2 mt-3 overflow-x-auto hide-scrollbar pb-2">
128
+ <button class="filter-chip bg-red-600 text-white px-3 py-1 rounded-full text-sm whitespace-nowrap">
129
+ <i class="fas fa-crown mr-1"></i> Partenaires
130
+ </button>
131
+ <button class="filter-chip bg-white border border-gray-300 px-3 py-1 rounded-full text-sm whitespace-nowrap">
132
+ <i class="fas fa-fire mr-1"></i> Populaires
133
+ </button>
134
+ <button class="filter-chip bg-white border border-gray-300 px-3 py-1 rounded-full text-sm whitespace-nowrap">
135
+ <i class="fas fa-leaf mr-1"></i> Végétarien
136
+ </button>
137
+ <button class="filter-chip bg-white border border-gray-300 px-3 py-1 rounded-full text-sm whitespace-nowrap">
138
+ <i class="fas fa-bolt mr-1"></i> Livraison rapide
139
+ </button>
140
+ <button class="filter-chip bg-white border border-gray-300 px-3 py-1 rounded-full text-sm whitespace-nowrap">
141
+ <i class="fas fa-clock mr-1"></i> Ouvert maintenant
142
+ </button>
143
+ </div>
144
+
145
+ <!-- Nearby Pizzerias -->
146
+ <h2 class="text-lg font-bold mt-4 mb-2">À proximité</h2>
147
+ <div id="nearby-list" class="space-y-3">
148
+ <!-- Nearby items will be inserted here by JS -->
149
+ </div>
150
+ </div>
151
+
152
+ <!-- List View (hidden by default) -->
153
+ <div id="list-view" class="px-4 py-3 hidden">
154
+ <div class="flex justify-between items-center mb-3">
155
+ <h2 class="text-lg font-bold">Toutes les pizzerias</h2>
156
+ <div class="flex space-x-1">
157
+ <button id="sort-distance" class="bg-gray-100 px-3 py-1 rounded-full text-xs font-medium">Distance</button>
158
+ <button id="sort-rating" class="bg-gray-100 px-3 py-1 rounded-full text-xs font-medium">Note</button>
159
+ </div>
160
+ </div>
161
+
162
+ <div id="full-list" class="space-y-3">
163
+ <!-- Full list items will be inserted here by JS -->
164
+ </div>
165
+ </div>
166
+
167
+ <!-- Favorites View (hidden by default) -->
168
+ <div id="favorites-view" class="px-4 py-3 hidden">
169
+ <h2 class="text-lg font-bold mb-3">Vos favoris</h2>
170
+ <div id="favorites-list" class="space-y-3">
171
+ <!-- Favorites items will be inserted here by JS -->
172
+ </div>
173
+
174
+ <div id="empty-favorites" class="text-center py-10 hidden">
175
+ <i class="fas fa-heart text-gray-300 text-4xl mb-3"></i>
176
+ <p class="text-gray-500">Aucune pizzeria en favoris</p>
177
+ <button class="mt-4 text-red-600 font-medium">Explorer les pizzerias</button>
178
+ </div>
179
+ </div>
180
+ </main>
181
+
182
+ <!-- Bottom Navigation -->
183
+ <nav class="bottom-nav bg-white fixed bottom-0 w-full flex justify-around items-center py-3 z-10">
184
+ <button class="nav-item active-nav-item flex flex-col items-center" data-view="map">
185
+ <i class="fas fa-map-marker-alt text-xl"></i>
186
+ <span class="text-xs mt-1">Carte</span>
187
+ </button>
188
+ <button class="nav-item text-gray-500 flex flex-col items-center" data-view="list">
189
+ <i class="fas fa-list text-xl"></i>
190
+ <span class="text-xs mt-1">Liste</span>
191
+ </button>
192
+ <button class="nav-item text-gray-500 flex flex-col items-center" data-view="favorites">
193
+ <i class="fas fa-heart text-xl"></i>
194
+ <span class="text-xs mt-1">Favoris</span>
195
+ </button>
196
+ <button class="nav-item text-gray-500 flex flex-col items-center" id="user-btn">
197
+ <i class="fas fa-user-circle text-xl"></i>
198
+ <span class="text-xs mt-1">Compte</span>
199
+ </button>
200
+ </nav>
201
+
202
+ <!-- Search Modal -->
203
+ <div id="search-modal" class="fixed inset-0 bg-white z-20 hidden flex flex-col">
204
+ <div class="px-4 py-3 border-b border-gray-200 flex items-center">
205
+ <button id="close-search" class="mr-3 text-gray-500">
206
+ <i class="fas fa-arrow-left"></i>
207
+ </button>
208
+ <div class="flex-1 relative">
209
+ <input type="text" id="search-input" placeholder="Rechercher une pizzeria, une ville..." class="w-full py-2 px-4 bg-gray-100 rounded-full focus:outline-none">
210
+ <button id="search-submit" class="absolute right-3 top-2 text-gray-500">
211
+ <i class="fas fa-search"></i>
212
+ </button>
213
+ </div>
214
+ </div>
215
+
216
+ <div class="flex-1 overflow-y-auto px-4 py-3">
217
+ <h3 class="font-bold text-gray-500 mb-2">Recherches récentes</h3>
218
+ <div class="space-y-2">
219
+ <button class="w-full text-left py-2 px-3 bg-gray-100 rounded-lg">Pizza végétarienne</button>
220
+ <button class="w-full text-left py-2 px-3 bg-gray-100 rounded-lg">Four à bois</button>
221
+ <button class="w-full text-left py-2 px-3 bg-gray-100 rounded-lg">Paris 15ème</button>
222
+ </div>
223
+
224
+ <h3 class="font-bold text-gray-500 mt-4 mb-2">Suggestions</h3>
225
+ <div class="flex flex-wrap gap-2">
226
+ <button class="bg-gray-100 px-3 py-1 rounded-full text-sm">Ouvert maintenant</button>
227
+ <button class="bg-gray-100 px-3 py-1 rounded-full text-sm">Livraison gratuite</button>
228
+ <button class="bg-gray-100 px-3 py-1 rounded-full text-sm">Promotions</button>
229
+ <button class="bg-gray-100 px-3 py-1 rounded-full text-sm">Note 4+</button>
230
+ </div>
231
+ </div>
232
+ </div>
233
+
234
+ <!-- Restaurant Detail Modal -->
235
+ <div id="restaurant-modal" class="fixed inset-0 bg-black bg-opacity-50 z-30 hidden flex items-end">
236
+ <div class="modal-content bg-white w-full rounded-t-3xl animate-slideUp">
237
+ <div class="relative">
238
+ <img src="https://images.unsplash.com/photo-1513104890138-7c749659a591?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80" alt="Pizzeria" class="w-full h-48 object-cover rounded-t-3xl">
239
+ <button id="close-modal" class="absolute top-4 right-4 bg-white p-2 rounded-full shadow-lg">
240
+ <i class="fas fa-times text-gray-700"></i>
241
+ </button>
242
+ <div id="partner-badge-modal" class="absolute top-4 left-4 bg-yellow-400 text-red-700 px-3 py-1 rounded-full font-bold text-xs flex items-center">
243
+ <i class="fas fa-crown mr-1"></i>
244
+ <span>Partenaire</span>
245
+ </div>
246
+ </div>
247
+
248
+ <div class="p-5">
249
+ <div class="flex justify-between items-start">
250
+ <div>
251
+ <h2 id="modal-title" class="text-xl font-bold">La Pizzeria du Coin</h2>
252
+ <div class="flex items-center mt-1">
253
+ <div class="flex text-yellow-400 text-sm">
254
+ <i class="fas fa-star"></i>
255
+ <i class="fas fa-star"></i>
256
+ <i class="fas fa-star"></i>
257
+ <i class="fas fa-star"></i>
258
+ <i class="fas fa-star-half-alt"></i>
259
+ </div>
260
+ <span class="text-gray-600 ml-2 text-sm">4.5 (128 avis)</span>
261
+ </div>
262
+ </div>
263
+ <button id="favorite-btn" class="text-2xl text-gray-300">
264
+ <i class="far fa-heart"></i>
265
+ </button>
266
+ </div>
267
+
268
+ <div class="mt-4 grid grid-cols-2 gap-3 text-sm">
269
+ <div class="flex items-center">
270
+ <i class="fas fa-map-marker-alt text-red-600 mr-2"></i>
271
+ <span id="modal-address">12 Rue de la Pizza, Paris</span>
272
+ </div>
273
+ <div class="flex items-center">
274
+ <i class="fas fa-phone text-red-600 mr-2"></i>
275
+ <span id="modal-phone">01 23 45 67 89</span>
276
+ </div>
277
+ <div class="flex items-center">
278
+ <i class="fas fa-clock text-red-600 mr-2"></i>
279
+ <span id="modal-hours">Ouvert • Ferme à 22h30</span>
280
+ </div>
281
+ <div class="flex items-center">
282
+ <i class="fas fa-euro-sign text-red-600 mr-2"></i>
283
+ <span id="modal-price">€€ - Moyen</span>
284
+ </div>
285
+ </div>
286
+
287
+ <div class="mt-5">
288
+ <h3 class="font-bold mb-2">Spécialités</h3>
289
+ <div id="modal-specialties" class="flex flex-wrap gap-2">
290
+ <span class="bg-gray-100 px-3 py-1 rounded-full text-xs">Four à bois</span>
291
+ <span class="bg-gray-100 px-3 py-1 rounded-full text-xs">Végétarienne</span>
292
+ <span class="bg-gray-100 px-3 py-1 rounded-full text-xs">Produits frais</span>
293
+ </div>
294
+ </div>
295
+
296
+ <div class="mt-5">
297
+ <h3 class="font-bold mb-2">Description</h3>
298
+ <p id="modal-description" class="text-gray-700 text-sm">Pizzas artisanales cuites au feu de bois avec des ingrédients frais et locaux. Notre chef italien apporte son savoir-faire traditionnel.</p>
299
+ </div>
300
+
301
+ <div id="partner-section" class="mt-5 bg-yellow-50 border border-yellow-200 rounded-lg p-4">
302
+ <div class="flex items-center mb-2">
303
+ <i class="fas fa-crown text-yellow-500 mr-2"></i>
304
+ <h3 class="font-bold text-sm">Pizzeria partenaire</h3>
305
+ </div>
306
+ <p class="text-gray-700 text-xs mb-3">Cette pizzeria est partenaire et dispose de sa propre application avec des fonctionnalités supplémentaires !</p>
307
+ <button id="partner-redirect" class="w-full bg-yellow-400 text-red-700 py-2 rounded-lg font-bold text-sm flex items-center justify-center space-x-2">
308
+ <i class="fas fa-external-link-alt"></i>
309
+ <span>Ouvrir l'application</span>
310
+ </button>
311
+ </div>
312
+
313
+ <div class="mt-4 grid grid-cols-2 gap-3">
314
+ <button class="bg-red-600 text-white py-3 rounded-lg font-bold text-sm flex items-center justify-center space-x-2">
315
+ <i class="fas fa-phone"></i>
316
+ <span>Appeler</span>
317
+ </button>
318
+ <button class="bg-white border border-red-600 text-red-600 py-3 rounded-lg font-bold text-sm flex items-center justify-center space-x-2">
319
+ <i class="fas fa-route"></i>
320
+ <span>Itinéraire</span>
321
+ </button>
322
+ </div>
323
+
324
+ <button class="mt-3 w-full bg-red-600 text-white py-3 rounded-lg font-bold text-sm">
325
+ Voir le menu complet
326
+ </button>
327
+ </div>
328
+ </div>
329
+ </div>
330
+
331
+ <!-- Login Modal -->
332
+ <div id="login-modal" class="fixed inset-0 bg-black bg-opacity-50 z-30 hidden flex items-center justify-center p-4">
333
+ <div class="bg-white rounded-xl max-w-sm w-full p-6 animate-popIn">
334
+ <div class="flex justify-between items-center mb-5">
335
+ <h2 class="text-xl font-bold">Connexion</h2>
336
+ <button id="close-login" class="text-gray-500">
337
+ <i class="fas fa-times"></i>
338
+ </button>
339
+ </div>
340
+
341
+ <div class="space-y-4">
342
+ <div>
343
+ <label for="login-email" class="block text-sm font-medium text-gray-700 mb-1">Email</label>
344
+ <input type="email" id="login-email" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-red-500 focus:border-red-500 text-sm">
345
+ </div>
346
+
347
+ <div>
348
+ <label for="login-password" class="block text-sm font-medium text-gray-700 mb-1">Mot de passe</label>
349
+ <input type="password" id="login-password" class="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-red-500 focus:border-red-500 text-sm">
350
+ </div>
351
+
352
+ <button id="login-btn" class="w-full bg-red-600 text-white py-3 rounded-lg font-bold text-sm mt-3">
353
+ Se connecter
354
+ </button>
355
+
356
+ <div class="text-center mt-4">
357
+ <p class="text-xs text-gray-600">Vous êtes une pizzeria ? <button id="show-business" class="text-red-600 hover:underline">Accédez à votre espace</button></p>
358
+ </div>
359
+ </div>
360
+ </div>
361
+ </div>
362
+
363
+ <!-- Load Google Maps API -->
364
+ <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyDkEJH8YQq0VXvNqk6BIS7E6n4Q1lZzJ6E&callback=initMap" async defer></script>
365
+
366
+ <script>
367
+ // Sample data for pizzerias
368
+ const pizzerias = [
369
+ {
370
+ id: 1,
371
+ name: "La Pizzeria du Coin",
372
+ address: "12 Rue de la Pizza, 75000 Paris",
373
+ phone: "01 23 45 67 89",
374
+ distance: 0.5,
375
+ rating: 4.5,
376
+ reviews: 128,
377
+ price: "€€",
378
+ hours: "Ouvert • Ferme à 22h30",
379
+ description: "Pizzas artisanales cuites au feu de bois avec des ingrédients frais et locaux. Notre chef italien apporte son savoir-faire traditionnel pour vous offrir une expérience authentique.",
380
+ specialties: ["Four à bois", "Végétarienne", "Produits frais"],
381
+ partner: true,
382
+ partnerUrl: "https://pizzeriaducoin.com/app",
383
+ image: "https://images.unsplash.com/photo-1513104890138-7c749659a591?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1470&q=80",
384
+ lat: 48.8566,
385
+ lng: 2.3522
386
+ },
387
+ {
388
+ id: 2,
389
+ name: "Pizza Napoli",
390
+ address: "34 Avenue des Gourmets, 69000 Lyon",
391
+ phone: "04 56 78 90 12",
392
+ distance: 1.2,
393
+ rating: 4.2,
394
+ reviews: 87,
395
+ price: "€",
396
+ hours: "Ouvert • Ferme à 23h00",
397
+ description: "Pizzas napolitaines authentiques préparées selon les traditions italiennes.",
398
+ specialties: ["Tradition napolitaine", "Pâte maison", "Livraison rapide"],
399
+ partner: false,
400
+ image: "https://images.unsplash.com/photo-1604382354936-9c362fad7426?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1374&q=80",
401
+ lat: 45.7640,
402
+ lng: 4.8357
403
+ },
404
+ {
405
+ id: 3,
406
+ name: "Mama Mia",
407
+ address: "56 Boulevard des Saveurs, 13000 Marseille",
408
+ phone: "04 91 23 45 67",
409
+ distance: 2.1,
410
+ rating: 4.7,
411
+ reviews: 215,
412
+ price: "€€€",
413
+ hours: "Fermé • Ouvre à 18h30",
414
+ description: "Pizzas gastronomiques avec des combinaisons de saveurs uniques et des produits haut de gamme.",
415
+ specialties: ["Gastronomique", "Produits bio", "Vin sélection"],
416
+ partner: true,
417
+ partnerUrl: "https://mamamia-pizza.com/app",
418
+ image: "https://images.unsplash.com/photo-1593504049359-74330189a345?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1527&q=80",
419
+ lat: 43.2965,
420
+ lng: 5.3698
421
+ },
422
+ {
423
+ id: 4,
424
+ name: "Pizza Express",
425
+ address: "78 Rue de la Rapidité, 75000 Paris",
426
+ phone: "01 98 76 54 32",
427
+ distance: 0.8,
428
+ rating: 3.9,
429
+ reviews: 65,
430
+ price: "€",
431
+ hours: "Ouvert • Ferme à 00h30",
432
+ description: "Pizzas rapides et délicieuses pour les soirées pressées ou les livraisons à domicile.",
433
+ specialties: ["Livraison rapide", "Ouvert tard", "Promotions"],
434
+ partner: false,
435
+ image: "https://images.unsplash.com/photo-1571407970349-bc81e7e96d47?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1325&q=80",
436
+ lat: 48.8600,
437
+ lng: 2.3400
438
+ },
439
+ {
440
+ id: 5,
441
+ name: "Pizza Verde",
442
+ address: "90 Allée Végétale, 69000 Lyon",
443
+ phone: "04 32 10 98 76",
444
+ distance: 1.5,
445
+ rating: 4.3,
446
+ reviews: 94,
447
+ price: "€€",
448
+ hours: "Ouvert • Ferme à 22h00",
449
+ description: "Pizzas végétariennes et véganes avec des alternatives créatives et savoureuses.",
450
+ specialties: ["Végétarienne", "Végane", "Sans gluten"],
451
+ partner: true,
452
+ partnerUrl: "https://pizzaverde.com/app",
453
+ image: "https://images.unsplash.com/photo-1613564834361-9436948817d1?ixlib=rb-4.0.3&ixid=M3wxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHx8fA%3D%3D&auto=format&fit=crop&w=1543&q=80",
454
+ lat: 45.7500,
455
+ lng: 4.8500
456
+ }
457
+ ];
458
+
459
+ // Favorites
460
+ let favorites = JSON.parse(localStorage.getItem('favorites')) || [];
461
+
462
+ // DOM Elements
463
+ const mapView = document.getElementById('map-view');
464
+ const listView = document.getElementById('list-view');
465
+ const favoritesView = document.getElementById('favorites-view');
466
+ const nearbyList = document.getElementById('nearby-list');
467
+ const fullList = document.getElementById('full-list');
468
+ const favoritesList = document.getElementById('favorites-list');
469
+ const emptyFavorites = document.getElementById('empty-favorites');
470
+ const navItems = document.querySelectorAll('.nav-item');
471
+ const restaurantModal = document.getElementById('restaurant-modal');
472
+ const closeModal = document.getElementById('close-modal');
473
+ const favoriteBtn = document.getElementById('favorite-btn');
474
+ const favoritesBtn = document.getElementById('favorites-btn');
475
+ const favCount = document.getElementById('fav-count');
476
+ const userBtn = document.getElementById('user-btn');
477
+ const loginModal = document.getElementById('login-modal');
478
+ const closeLogin = document.getElementById('close-login');
479
+ const searchModal = document.getElementById('search-modal');
480
+ const searchBtnMobile = document.getElementById('search-btn-mobile');
481
+ const closeSearch = document.getElementById('close-search');
482
+ const currentLocationBtn = document.getElementById('current-location-btn');
483
+
484
+ // Google Map variables
485
+ let map;
486
+ let markers = [];
487
+ let userMarker;
488
+
489
+ // Initialize map
490
+ function initMap() {
491
+ // Default to Paris center
492
+ const paris = { lat: 48.8566, lng: 2.3522 };
493
+
494
+ // Create map
495
+ map = new google.maps.Map(document.getElementById('map'), {
496
+ center: paris,
497
+ zoom: 14,
498
+ styles: [
499
+ {
500
+ "featureType": "poi",
501
+ "elementType": "labels",
502
+ "stylers": [
503
+ {
504
+ "visibility": "off"
505
+ }
506
+ ]
507
+ }
508
+ ]
509
+ });
510
+
511
+ // Add user location marker
512
+ userMarker = new google.maps.Marker({
513
+ position: paris,
514
+ map: map,
515
+ icon: {
516
+ path: google.maps.SymbolPath.CIRCLE,
517
+ scale: 8,
518
+ fillColor: '#4285F4',
519
+ fillOpacity: 1,
520
+ strokeColor: '#FFFFFF',
521
+ strokeWeight: 2
522
+ }
523
+ });
524
+
525
+ // Add pizzerias markers
526
+ addPizzeriasMarkers();
527
+
528
+ // Try to get user's current location
529
+ if (navigator.geolocation) {
530
+ navigator.geolocation.getCurrentPosition(
531
+ (position) => {
532
+ const userLocation = {
533
+ lat: position.coords.latitude,
534
+ lng: position.coords.longitude
535
+ };
536
+
537
+ // Update user marker
538
+ userMarker.setPosition(userLocation);
539
+
540
+ // Center map on user location
541
+ map.setCenter(userLocation);
542
+
543
+ // Update distances
544
+ updateDistances(userLocation);
545
+ },
546
+ () => {
547
+ // Handle error (use default location)
548
+ console.log('Geolocation error, using default location');
549
+ }
550
+ );
551
+ }
552
+ }
553
+
554
+ // Add markers for all pizzerias
555
+ function addPizzeriasMarkers() {
556
+ // Clear existing markers
557
+ markers.forEach(marker => marker.setMap(null));
558
+ markers = [];
559
+
560
+ pizzerias.forEach(pizzeria => {
561
+ const marker = new google.maps.Marker({
562
+ position: { lat: pizzeria.lat, lng: pizzeria.lng },
563
+ map: map,
564
+ title: pizzeria.name,
565
+ icon: {
566
+ url: "https://maps.google.com/mapfiles/ms/icons/red-dot.png"
567
+ }
568
+ });
569
+
570
+ // Add click event to show details
571
+ marker.addListener('click', () => {
572
+ showRestaurantDetails(pizzeria.id);
573
+ });
574
+
575
+ markers.push(marker);
576
+ });
577
+ }
578
+
579
+ // Update distances from user location
580
+ function updateDistances(userLocation) {
581
+ pizzerias.forEach(pizzeria => {
582
+ pizzeria.distance = calculateDistance(
583
+ userLocation.lat,
584
+ userLocation.lng,
585
+ pizzeria.lat,
586
+ pizzeria.lng
587
+ ).toFixed(1);
588
+ });
589
+
590
+ // Re-render pizzerias with updated distances
591
+ renderPizzerias();
592
+ }
593
+
594
+ // Calculate distance between two points in km
595
+ function calculateDistance(lat1, lon1, lat2, lon2) {
596
+ const R = 6371; // Radius of the earth in km
597
+ const dLat = deg2rad(lat2 - lat1);
598
+ const dLon = deg2rad(lon2 - lon1);
599
+ const a =
600
+ Math.sin(dLat/2) * Math.sin(dLat/2) +
601
+ Math.cos(deg2rad(lat1)) * Math.cos(deg2rad(lat2)) *
602
+ Math.sin(dLon/2) * Math.sin(dLon/2);
603
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a));
604
+ return R * c; // Distance in km
605
+ }
606
+
607
+ function deg2rad(deg) {
608
+ return deg * (Math.PI/180);
609
+ }
610
+
611
+ // Render pizzerias
612
+ function renderPizzerias() {
613
+ // Clear existing results
614
+ nearbyList.innerHTML = '';
615
+ fullList.innerHTML = '';
616
+ favoritesList.innerHTML = '';
617
+
618
+ // Sort by distance for nearby view
619
+ const nearbyPizzerias = [...pizzerias].sort((a, b) => a.distance - b.distance).slice(0, 3);
620
+
621
+ // Render nearby pizzerias (map view)
622
+ nearbyPizzerias.forEach(pizzeria => {
623
+ nearbyList.innerHTML += createPizzeriaCard(pizzeria, true);
624
+ });
625
+
626
+ // Render all pizzerias (list view)
627
+ pizzerias.forEach(pizzeria => {
628
+ fullList.innerHTML += createPizzeriaCard(pizzeria, false);
629
+ });
630
+
631
+ // Render favorites
632
+ if (favorites.length > 0) {
633
+ favorites.forEach(id => {
634
+ const pizzeria = pizzerias.find(p => p.id === id);
635
+ if (pizzeria) {
636
+ favoritesList.innerHTML += createPizzeriaCard(pizzeria, false);
637
+ }
638
+ });
639
+ emptyFavorites.classList.add('hidden');
640
+ } else {
641
+ emptyFavorites.classList.remove('hidden');
642
+ }
643
+
644
+ // Update favorites count
645
+ updateFavoritesCount();
646
+
647
+ // Add event listeners to all view details buttons
648
+ document.querySelectorAll('.view-details').forEach(button => {
649
+ button.addEventListener('click', (e) => {
650
+ const id = parseInt(e.currentTarget.getAttribute('data-id'));
651
+ showRestaurantDetails(id);
652
+ });
653
+ });
654
+
655
+ // Add event listeners to all favorite toggles
656
+ document.querySelectorAll('.favorite-toggle').forEach(button => {
657
+ button.addEventListener('click', (e) => {
658
+ const id = parseInt(e.currentTarget.getAttribute('data-id'));
659
+ toggleFavorite(id);
660
+ });
661
+ });
662
+ }
663
+
664
+ // Create pizzeria card HTML
665
+ function createPizzeriaCard(pizzeria, isSmall) {
666
+ const isFavorite = favorites.includes(pizzeria.id);
667
+
668
+ if (isSmall) {
669
+ return `
670
+ <div class="bg-white rounded-lg shadow p-3 flex pizza-card" data-id="${pizzeria.id}">
671
+ <img src="${pizzeria.image}" alt="${pizzeria.name}" class="w-16 h-16 object-cover rounded-lg">
672
+ <div class="ml-3 flex-1">
673
+ <div class="flex justify-between items-start">
674
+ <div>
675
+ <h3 class="font-bold text-sm">${pizzeria.name}</h3>
676
+ <div class="flex items-center mt-1">
677
+ <div class="flex text-yellow-400 text-xs">
678
+ ${renderStars(pizzeria.rating)}
679
+ </div>
680
+ <span class="text-gray-600 ml-1 text-xs">${pizzeria.rating}</span>
681
+ </div>
682
+ </div>
683
+ <button class="favorite-toggle text-lg ${isFavorite ? 'text-red-500' : 'text-gray-300'}" data-id="${pizzeria.id}">
684
+ <i class="fas fa-heart"></i>
685
+ </button>
686
+ </div>
687
+ <div class="flex items-center mt-2 text-xs text-gray-600">
688
+ <i class="fas fa-map-marker-alt mr-1 text-red-600"></i>
689
+ <span>${pizzeria.distance} km</span>
690
+ </div>
691
+ <div class="flex flex-wrap gap-1 mt-2">
692
+ ${pizzeria.specialties.slice(0, 2).map(spec => `<span class="bg-gray-100 px-2 py-0.5 rounded-full text-2xs">${spec}</span>`).join('')}
693
+ </div>
694
+ </div>
695
+ </div>
696
+ `;
697
+ } else {
698
+ return `
699
+ <div class="bg-white rounded-lg shadow overflow-hidden pizza-card">
700
+ <div class="relative">
701
+ <img src="${pizzeria.image}" alt="${pizzeria.name}" class="w-full h-32 object-cover">
702
+ ${pizzeria.partner ? '<div class="partner-badge bg-yellow-400 text-red-700 px-2 py-1 rounded-full text-xs font-bold flex items-center"><i class="fas fa-crown mr-1"></i> Partenaire</div>' : ''}
703
+ </div>
704
+ <div class="p-3">
705
+ <div class="flex justify-between items-start">
706
+ <div>
707
+ <h3 class="font-bold text-sm">${pizzeria.name}</h3>
708
+ <div class="flex items-center mt-1">
709
+ <div class="flex text-yellow-400 text-xs">
710
+ ${renderStars(pizzeria.rating)}
711
+ </div>
712
+ <span class="text-gray-600 ml-1 text-xs">${pizzeria.rating} (${pizzeria.reviews})</span>
713
+ </div>
714
+ </div>
715
+ <button class="favorite-toggle text-lg ${isFavorite ? 'text-red-500' : 'text-gray-300'}" data-id="${pizzeria.id}">
716
+ <i class="fas fa-heart"></i>
717
+ </button>
718
+ </div>
719
+ <div class="flex items-center mt-2 text-xs text-gray-600">
720
+ <i class="fas fa-map-marker-alt mr-1 text-red-600"></i>
721
+ <span>${pizzeria.distance} km • ${pizzeria.address.split(',')[0]}</span>
722
+ </div>
723
+ <div class="flex items-center mt-2 text-xs text-gray-600">
724
+ <i class="fas fa-clock mr-1 text-red-600"></i>
725
+ <span>${pizzeria.hours}</span>
726
+ </div>
727
+ <div class="flex flex-wrap gap-1 mt-2">
728
+ ${pizzeria.specialties.map(spec => `<span class="bg-gray-100 px-2 py-0.5 rounded-full text-2xs">${spec}</span>`).join('')}
729
+ </div>
730
+ <button class="mt-3 w-full bg-red-600 text-white py-2 rounded-lg text-xs font-bold view-details" data-id="${pizzeria.id}">
731
+ Voir la fiche
732
+ </button>
733
+ </div>
734
+ </div>
735
+ `;
736
+ }
737
+ }
738
+
739
+ // Render star rating
740
+ function renderStars(rating) {
741
+ let stars = '';
742
+ const fullStars = Math.floor(rating);
743
+ const hasHalfStar = rating % 1 >= 0.5;
744
+
745
+ for (let i = 0; i < fullStars; i++) {
746
+ stars += '<i class="fas fa-star"></i>';
747
+ }
748
+
749
+ if (hasHalfStar) {
750
+ stars += '<i class="fas fa-star-half-alt"></i>';
751
+ }
752
+
753
+ const emptyStars = 5 - fullStars - (hasHalfStar ? 1 : 0);
754
+ for (let i = 0; i < emptyStars; i++) {
755
+ stars += '<i class="far fa-star"></i>';
756
+ }
757
+
758
+ return stars;
759
+ }
760
+
761
+ // Show restaurant details in modal
762
+ function showRestaurantDetails(id) {
763
+ const pizzeria = pizzerias.find(p => p.id === id);
764
+ if (!pizzeria) return;
765
+
766
+ const isFavorite = favorites.includes(id);
767
+
768
+ // Update modal content
769
+ document.getElementById('modal-title').textContent = pizzeria.name;
770
+ document.getElementById('modal-address').textContent = pizzeria.address.split(',')[0];
771
+ document.getElementById('modal-phone').textContent = pizzeria.phone;
772
+ document.getElementById('modal-hours').textContent = pizzeria.hours;
773
+ document.getElementById('modal-price').textContent = pizzeria.price;
774
+ document.getElementById('modal-description').textContent = pizzeria.description;
775
+
776
+ // Update stars
777
+ const starsContainer = document.querySelector('#restaurant-modal .flex.text-yellow-400');
778
+ starsContainer.innerHTML = renderStars(pizzeria.rating);
779
+ starsContainer.nextElementSibling.textContent = `${pizzeria.rating} (${pizzeria.reviews} avis)`;
780
+
781
+ // Update specialties
782
+ const specialtiesContainer = document.getElementById('modal-specialties');
783
+ specialtiesContainer.innerHTML = pizzeria.specialties.map(spec =>
784
+ `<span class="bg-gray-100 px-2 py-1 rounded-full text-xs">${spec}</span>`
785
+ ).join('');
786
+
787
+ // Update favorite button
788
+ favoriteBtn.innerHTML = isFavorite ? '<i class="fas fa-heart text-red-500"></i>' : '<i class="far fa-heart"></i>';
789
+ favoriteBtn.setAttribute('data-id', pizzeria.id);
790
+
791
+ // Update partner section
792
+ const partnerSection = document.getElementById('partner-section');
793
+ if (pizzeria.partner) {
794
+ partnerSection.classList.remove('hidden');
795
+ document.getElementById('partner-redirect').setAttribute('data-url', pizzeria.partnerUrl);
796
+ document.getElementById('partner-badge-modal').classList.remove('hidden');
797
+ } else {
798
+ partnerSection.classList.add('hidden');
799
+ document.getElementById('partner-badge-modal').classList.add('hidden');
800
+ }
801
+
802
+ // Show modal
803
+ restaurantModal.classList.remove('hidden');
804
+ document.body.style.overflow = 'hidden';
805
+ }
806
+
807
+ // Toggle favorite
808
+ function toggleFavorite(id) {
809
+ const index = favorites.indexOf(id);
810
+ if (index === -1) {
811
+ favorites.push(id);
812
+ } else {
813
+ favorites.splice(index, 1);
814
+ }
815
+
816
+ // Save to localStorage
817
+ localStorage.setItem('favorites', JSON.stringify(favorites));
818
+
819
+ // Re-render pizzerias to update heart icons
820
+ renderPizzerias();
821
+
822
+ // Update favorites count
823
+ updateFavoritesCount();
824
+ }
825
+
826
+ // Update favorites count display
827
+ function updateFavoritesCount() {
828
+ if (favorites.length > 0) {
829
+ favCount.textContent = favorites.length;
830
+ favCount.classList.remove('hidden');
831
+ } else {
832
+ favCount.classList.add('hidden');
833
+ }
834
+ }
835
+
836
+ // Switch between views
837
+ function switchView(view) {
838
+ mapView.classList.add('hidden');
839
+ listView.classList.add('hidden');
840
+ favoritesView.classList.add('hidden');
841
+
842
+ if (view === 'map') {
843
+ mapView.classList.remove('hidden');
844
+ } else if (view === 'list') {
845
+ listView.classList.remove('hidden');
846
+ } else if (view === 'favorites') {
847
+ favoritesView.classList.remove('hidden');
848
+ }
849
+
850
+ // Update active nav item
851
+ navItems.forEach(item => {
852
+ if (item.getAttribute('data-view') === view) {
853
+ item.classList.add('active-nav-item');
854
+ item.classList.remove('text-gray-500');
855
+ } else {
856
+ item.classList.remove('active-nav-item');
857
+ item.classList.add('text-gray-500');
858
+ }
859
+ });
860
+ }
861
+
862
+ // Event listeners
863
+ navItems.forEach(item => {
864
+ item.addEventListener('click', () => {
865
+ const view = item.getAttribute('data-view');
866
+ switchView(view);
867
+ });
868
+ });
869
+
870
+ closeModal.addEventListener('click', () => {
871
+ restaurantModal.classList.add('hidden');
872
+ document.body.style.overflow = 'auto';
873
+ });
874
+
875
+ favoriteBtn.addEventListener('click', () => {
876
+ const id = parseInt(favoriteBtn.getAttribute('data-id'));
877
+ if (id) toggleFavorite(id);
878
+ });
879
+
880
+ favoritesBtn.addEventListener('click', () => {
881
+ switchView('favorites');
882
+ });
883
+
884
+ userBtn.addEventListener('click', () => {
885
+ loginModal.classList.remove('hidden');
886
+ document.body.style.overflow = 'hidden';
887
+ });
888
+
889
+ closeLogin.addEventListener('click', () => {
890
+ loginModal.classList.add('hidden');
891
+ document.body.style.overflow = 'auto';
892
+ });
893
+
894
+ document.getElementById('login-btn').addEventListener('click', () => {
895
+ const email = document.getElementById('login-email').value;
896
+ const password = document.getElementById('login-password').value;
897
+
898
+ // Simple check for demo purposes
899
+ if (email && password) {
900
+ loginModal.classList.add('hidden');
901
+ document.body.style.overflow = 'auto';
902
+ alert('Connecté avec succès!');
903
+ } else {
904
+ alert('Veuillez entrer un email et un mot de passe');
905
+ }
906
+ });
907
+
908
+ searchBtnMobile.addEventListener('click', () => {
909
+ searchModal.classList.remove('hidden');
910
+ document.body.style.overflow = 'hidden';
911
+ });
912
+
913
+ closeSearch.addEventListener('click', () => {
914
+ searchModal.classList.add('hidden');
915
+ document.body.style.overflow = 'auto';
916
+ });
917
+
918
+ document.getElementById('partner-redirect').addEventListener('click', () => {
919
+ const url = document.getElementById('partner-redirect').getAttribute('data-url');
920
+ alert(`Redirection vers l'application partenaire: ${url}`);
921
+ // In a real app: window.location.href = url;
922
+ });
923
+
924
+ // Current location button
925
+ currentLocationBtn.addEventListener('click', () => {
926
+ if (navigator.geolocation) {
927
+ navigator.geolocation.getCurrentPosition(
928
+ (position) => {
929
+ const userLocation = {
930
+ lat: position.coords.latitude,
931
+ lng: position.coords.longitude
932
+ };
933
+
934
+ // Update user marker
935
+ userMarker.setPosition(userLocation);
936
+
937
+ // Center map on user location
938
+ map.setCenter(userLocation);
939
+
940
+ // Update distances
941
+ updateDistances(userLocation);
942
+ },
943
+ () => {
944
+ alert('Impossible d\'obtenir votre position');
945
+ }
946
+ );
947
+ } else {
948
+ alert('La géolocalisation n\'est pas supportée par votre navigateur');
949
+ }
950
+ });
951
+
952
+ // Hide splash screen after animation
953
+ setTimeout(() => {
954
+ document.querySelector('.splash-screen').style.display = 'none';
955
+ }, 2500);
956
+
957
+ // Initialize
958
+ renderPizzerias();
959
+ updateFavoritesCount();
960
+ </script>
961
+ <p style="border-radius: 8px; text-align: center; font-size: 12px; color: #fff; margin-top: 16px;position: fixed; left: 8px; bottom: 8px; z-index: 10; background: rgba(0, 0, 0, 0.8); padding: 4px 8px;">Made with <img src="https://enzostvs-deepsite.hf.space/logo.svg" alt="DeepSite Logo" style="width: 16px; height: 16px; vertical-align: middle;display:inline-block;margin-right:3px;filter:brightness(0) invert(1);"><a href="https://enzostvs-deepsite.hf.space" style="color: #fff;text-decoration: underline;" target="_blank" >DeepSite</a> - 🧬 <a href="https://enzostvs-deepsite.hf.space?remix=ticoyoyo/test-mobile" style="color: #fff;text-decoration: underline;" target="_blank" >Remix</a></p></body>
962
+ </html>
prompts.txt ADDED
@@ -0,0 +1,3 @@
 
 
 
 
1
+ Objectif Créer une application mobile/web destinée au référencement national des pizzerias, avec une géolocalisation dynamique permettant à tout utilisateur de visualiser les pizzerias les plus proches et d'accéder à leur fiche détaillée. Les pizzerias partenaires seront mises en avant et bénéficieront d'une redirection directe vers leur propre application. Fonctionnalités utilisateur - Accueil avec carte interactive basée sur la géolocalisation de l'utilisateur. - Liste des pizzerias triées par distance. - Recherche avancée (ville, nom, spécialités...). - Fiche de chaque pizzeria : * Non partenaires : fiche informative simple (adresse, horaires, téléphone). * Partenaires : bouton pour redirection vers leur application dédiée. - Mise en avant automatique des pizzerias partenaires (badge, tri, top liste). - Système de favoris : possibilité d'enregistrer ses pizzerias préférées. - Filtres par spécialités, horaires, partenaires, etc. Fonctionnalités administrateur - Dashboard avec vue d'ensemble des consultations, redirections, ajouts récents. - Gestion des pizzerias : ajout, modification, suppression des fiches. - Statut de chaque pizzeria : Référencée ou Partenaire. - Gestion des liens d'intégration pour les pizzerias partenaires (URL, redirection). - Statistiques détaillées : clics, top recherches, villes les plus actives. - Système de mise en avant : affichage premium, top partenaires, filtres sponsorisés. Objectif commercial et stratégie - Offrir aux utilisateurs un outil centralisé pour découvrir toutes les pizzerias. - Créer un levier commercial pour démarcher les pizzerias : elles sont déjà visibles. - Proposer aux pizzerias référencées de devenir partenaires avec une app personnalisée. - Booster les partenaires avec une meilleure visibilité dans l'application mère
2
+ change to mobile app
3
+ le map est vide