| 251 |
251 |
</nav> |
| 252 |
252 |
|
| 253 |
253 |
<div className="fiche"> |
| 254 |
|
− {/* -------- colonne gauche : galerie, description, caractéristiques ---- */} |
|
254 |
+ {/* -------- colonne gauche : galerie, prix/synthèse, description, ------ |
|
255 |
+ -------- caractéristiques, pièces — ordre du DOM = ordre visuel ---- */} |
| 255 |
256 |
<div className="f-col"> |
| 256 |
257 |
<section className="f-bloc f-galerie" aria-label="Photos"> |
| 257 |
258 |
<Galerie |
| 263 |
264 |
/> |
| 264 |
265 |
</section> |
| 265 |
266 |
|
| 266 |
|
− {l.description && ( |
| 267 |
|
− <section className="f-bloc f-desc" id="description"> |
| 268 |
|
− <h2>Description</h2> |
| 269 |
|
− <p className="desc-text">{l.description}</p> |
| 270 |
|
− </section> |
| 271 |
|
− )} |
| 272 |
|
− |
| 273 |
|
− {detEntries.length > 0 && ( |
| 274 |
|
− <section className="f-bloc" id="caracteristiques"> |
| 275 |
|
− <h2>Caractéristiques</h2> |
| 276 |
|
− <div className="dtable"> |
| 277 |
|
− {detEntries.map(([k, v]) => ( |
| 278 |
|
− <div className="drow" key={k}> |
| 279 |
|
− <span>{k}</span> |
| 280 |
|
− {/^https?:\/\//.test(String(v)) |
| 281 |
|
− ? <b><a href={String(v)} target="_blank" rel="noopener noreferrer">Ouvrir ↗</a></b> |
| 282 |
|
− : <b>{String(v)}</b>} |
| 283 |
|
− </div> |
| 284 |
|
− ))} |
| 285 |
|
− </div> |
| 286 |
|
− </section> |
| 287 |
|
− )} |
| 288 |
|
− |
| 289 |
|
− {rooms.length > 0 && ( |
| 290 |
|
− <section className="f-bloc" id="pieces"> |
| 291 |
|
− <h2>Pièces</h2> |
| 292 |
|
− <div className="rooms-wrap"> |
| 293 |
|
− <table className="rooms"> |
| 294 |
|
− <thead><tr><th>Pièce</th><th>Niveau</th><th>Dimensions</th><th>Revêtement</th></tr></thead> |
| 295 |
|
− <tbody> |
| 296 |
|
− {rooms.map((r, i) => ( |
| 297 |
|
− <tr key={i}> |
| 298 |
|
− <td>{r.nom || "—"}</td><td>{r.niveau || "—"}</td> |
| 299 |
|
− <td>{r.dimensions || "—"}</td><td>{r.revetement || "—"}</td> |
| 300 |
|
− </tr> |
| 301 |
|
− ))} |
| 302 |
|
− </tbody> |
| 303 |
|
− </table> |
| 304 |
|
− </div> |
| 305 |
|
− </section> |
| 306 |
|
− )} |
| 307 |
|
− |
| 308 |
|
− {l.features && l.features.length > 0 && ( |
| 309 |
|
− <section className="f-bloc" id="inclusions"> |
| 310 |
|
− <h2>Inclusions</h2> |
| 311 |
|
− <div className="amenity-row"> |
| 312 |
|
− {l.features.map((f, i) => <span className="amenity" key={i}><Ico name="check" size={13} /> {f}</span>)} |
| 313 |
|
− </div> |
| 314 |
|
− </section> |
| 315 |
|
− )} |
| 316 |
|
− |
| 317 |
|
− {l.lat != null && l.lng != null && ( |
| 318 |
|
− <section className="f-bloc" id="carte"> |
| 319 |
|
− <h2>Emplacement</h2> |
| 320 |
|
− <Suspense fallback={<div className="lmap3d lmap3d-skel map-loading">Chargement de la carte…</div>}> |
| 321 |
|
− <PropertyMap |
| 322 |
|
− uid={l.uid} lat={l.lat} lng={l.lng} price={l.price} |
| 323 |
|
− propertyType={l.property_type} address={l.address || l.title} |
| 324 |
|
− city={l.city} image={l.images?.[0]} |
| 325 |
|
− deal={l.price != null && l.vraiprix?.value != null |
| 326 |
|
− && l.price <= l.vraiprix.value * 0.95} |
| 327 |
|
− /> |
| 328 |
|
− </Suspense> |
| 329 |
|
− </section> |
| 330 |
|
− )} |
| 331 |
|
− |
| 332 |
|
− </div> |
| 333 |
|
− |
| 334 |
|
− {/* -------- colonne droite : synthèse, specs, courtier ---------------- */} |
| 335 |
|
− <div className="f-col"> |
| 336 |
267 |
<section className="f-bloc f-hero"> |
| 337 |
268 |
<div className="price-kicker"> |
| 338 |
269 |
{l.details?.transaction === "location" ? "Loyer mensuel" : "Prix demandé"} |
| 445 |
376 |
Agrégé par Immo-Ka — {sourceName(l.source)}{updated ? ` · synchronisé le ${updated}` : ""}. |
| 446 |
377 |
</div> |
| 447 |
378 |
</section> |
|
379 |
+ |
|
380 |
+ |
|
381 |
+ {l.description && ( |
|
382 |
+ <section className="f-bloc f-desc" id="description"> |
|
383 |
+ <h2>Description</h2> |
|
384 |
+ <p className="desc-text">{l.description}</p> |
|
385 |
+ </section> |
|
386 |
+ )} |
|
387 |
+ |
|
388 |
+ {detEntries.length > 0 && ( |
|
389 |
+ <section className="f-bloc" id="caracteristiques"> |
|
390 |
+ <h2>Caractéristiques</h2> |
|
391 |
+ <div className="dtable"> |
|
392 |
+ {detEntries.map(([k, v]) => ( |
|
393 |
+ <div className="drow" key={k}> |
|
394 |
+ <span>{k}</span> |
|
395 |
+ {/^https?:\/\//.test(String(v)) |
|
396 |
+ ? <b><a href={String(v)} target="_blank" rel="noopener noreferrer">Ouvrir ↗</a></b> |
|
397 |
+ : <b>{String(v)}</b>} |
|
398 |
+ </div> |
|
399 |
+ ))} |
|
400 |
+ </div> |
|
401 |
+ </section> |
|
402 |
+ )} |
|
403 |
+ |
|
404 |
+ {rooms.length > 0 && ( |
|
405 |
+ <section className="f-bloc" id="pieces"> |
|
406 |
+ <h2>Pièces</h2> |
|
407 |
+ <div className="rooms-wrap"> |
|
408 |
+ <table className="rooms"> |
|
409 |
+ <thead><tr><th>Pièce</th><th>Niveau</th><th>Dimensions</th><th>Revêtement</th></tr></thead> |
|
410 |
+ <tbody> |
|
411 |
+ {rooms.map((r, i) => ( |
|
412 |
+ <tr key={i}> |
|
413 |
+ <td>{r.nom || "—"}</td><td>{r.niveau || "—"}</td> |
|
414 |
+ <td>{r.dimensions || "—"}</td><td>{r.revetement || "—"}</td> |
|
415 |
+ </tr> |
|
416 |
+ ))} |
|
417 |
+ </tbody> |
|
418 |
+ </table> |
|
419 |
+ </div> |
|
420 |
+ </section> |
|
421 |
+ )} |
|
422 |
+ |
|
423 |
+ </div> |
|
424 |
+ |
|
425 |
+ {/* -------- colonne droite (desktop) : inclusions, carte ------------- */} |
|
426 |
+ <div className="f-col"> |
|
427 |
+ {l.features && l.features.length > 0 && ( |
|
428 |
+ <section className="f-bloc" id="inclusions"> |
|
429 |
+ <h2>Inclusions</h2> |
|
430 |
+ <div className="amenity-row"> |
|
431 |
+ {l.features.map((f, i) => <span className="amenity" key={i}><Ico name="check" size={13} /> {f}</span>)} |
|
432 |
+ </div> |
|
433 |
+ </section> |
|
434 |
+ )} |
|
435 |
+ |
|
436 |
+ {l.lat != null && l.lng != null && ( |
|
437 |
+ <section className="f-bloc" id="carte"> |
|
438 |
+ <h2>Emplacement</h2> |
|
439 |
+ <Suspense fallback={<div className="lmap3d lmap3d-skel map-loading">Chargement de la carte…</div>}> |
|
440 |
+ <PropertyMap |
|
441 |
+ uid={l.uid} lat={l.lat} lng={l.lng} price={l.price} |
|
442 |
+ propertyType={l.property_type} address={l.address || l.title} |
|
443 |
+ city={l.city} image={l.images?.[0]} |
|
444 |
+ deal={l.price != null && l.vraiprix?.value != null |
|
445 |
+ && l.price <= l.vraiprix.value * 0.95} |
|
446 |
+ /> |
|
447 |
+ </Suspense> |
|
448 |
+ </section> |
|
449 |
+ )} |
| 448 |
450 |
</div> |
| 449 |
451 |
</div> |
| 450 |
452 |
|