{"id":15615,"date":"2026-06-10T08:33:38","date_gmt":"2026-06-10T08:33:38","guid":{"rendered":"https:\/\/www.milleniumproperties.ch\/appartements-et-maisons-de-luxe-a-vendre\/"},"modified":"2026-10-23T14:58:28","modified_gmt":"2026-10-23T14:58:28","slug":"luxury-real-estate-geneva","status":"publish","type":"page","link":"https:\/\/www.milleniumproperties.ch\/en\/luxury-real-estate-geneva\/","title":{"rendered":"Appartements et maisons de luxe \u00e0 vendre"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"15615\" class=\"elementor elementor-15615 elementor-3423\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3a741ba e-con-full e-flex e-con e-parent\" data-id=\"3a741ba\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4a4ef53 e-con-full e-flex e-con e-child\" data-id=\"4a4ef53\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-21b141a elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"21b141a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Prestige properties<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0f6c0ee e-con-full e-flex e-con e-parent\" data-id=\"0f6c0ee\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-37c4ec4 elementor-widget elementor-widget-shortcode\" data-id=\"37c4ec4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"shortcode.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-shortcode\">\n    <div id=\"carte-biens-filtres-overlay\"><\/div>\n\n    <div id=\"carte-biens-filtres\">\n        <button type=\"button\" id=\"btn-fermer-filtres-croix\" aria-label=\"Close\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"5\" y1=\"5\" x2=\"19\" y2=\"19\"\/><line x1=\"19\" y1=\"5\" x2=\"5\" y2=\"19\"\/><\/svg>\n        <\/button>\n        <div class=\"filtre-champ\">\n            <label for=\"filtre-recherche\">Search<\/label>\n            <input type=\"text\" id=\"filtre-recherche\" placeholder=\"e.g. 1292, Chamb\u00e9sy or a reference\">\n        <\/div>\n                <div class=\"filtre-champ\">\n            <label for=\"filtre-type-bien\">Property type<\/label>\n            <select id=\"filtre-type-bien\">\n                <option value=\"\">All<\/option>\n                <option value=\"Appartement\">Apartment<\/option>\n                <option value=\"Maison\">House<\/option>\n                <option value=\"Commercial\">Commercial<\/option>\n            <\/select>\n        <\/div>\n        <div class=\"filtre-champ\">\n            <label for=\"filtre-pieces\">Rooms<\/label>\n            <select id=\"filtre-pieces\">\n                <option value=\"\">All<\/option>\n                <option value=\"1\">1<\/option>\n                <option value=\"2\">2<\/option>\n                <option value=\"3\">3<\/option>\n                <option value=\"4\">4<\/option>\n                <option value=\"5\">5<\/option>\n                <option value=\"6\">6+<\/option>\n            <\/select>\n        <\/div>\n        <div class=\"filtre-champ\">\n            <label for=\"filtre-prix-min\">Min price (CHF)<\/label>\n            <input type=\"number\" id=\"filtre-prix-min\" placeholder=\"0\" min=\"0\" step=\"10000\">\n        <\/div>\n        <div class=\"filtre-champ\">\n            <label for=\"filtre-prix-max\">Max price (CHF)<\/label>\n            <input type=\"number\" id=\"filtre-prix-max\" placeholder=\"No max\" min=\"0\" step=\"10000\">\n        <\/div>\n        <button type=\"button\" id=\"btn-fermer-filtres\">View results<\/button>\n        <button type=\"button\" id=\"btn-reset-filtres\">Reset search<\/button>\n    <\/div>\n\n    <div id=\"carte-biens-topbar\">\n        <button type=\"button\" id=\"btn-ouvrir-filtres\">\n            <svg viewBox=\"0 0 24 24\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\"><line x1=\"4\" y1=\"6\" x2=\"20\" y2=\"6\"\/><circle cx=\"9\" cy=\"6\" r=\"2\" fill=\"currentColor\" stroke=\"none\"\/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"\/><circle cx=\"15\" cy=\"12\" r=\"2\" fill=\"currentColor\" stroke=\"none\"\/><line x1=\"4\" y1=\"18\" x2=\"20\" y2=\"18\"\/><circle cx=\"7\" cy=\"18\" r=\"2\" fill=\"currentColor\" stroke=\"none\"\/><\/svg>\n            Filters            <span id=\"badge-filtres-actifs\" class=\"filtres-badge\"><\/span>\n        <\/button>\n\n        <div id=\"carte-biens-ligne-resultats\">\n            <div id=\"carte-biens-compteur\"><\/div>\n            <button type=\"button\" id=\"btn-toggle-vue\">\n                <span id=\"icone-vue-carte\">\n                    <svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"currentColor\"><path d=\"M15 5.1L9 3 3 5.1v15.8l6-2.1 6 2.1 6-2.1V3l-6 2.1zM9 5.2l6-1.9v15.5l-6 1.9V5.2z\"\/><\/svg>\n                <\/span>\n                <span id=\"icone-vue-liste\">\n                    <svg viewBox=\"0 0 24 24\" width=\"15\" height=\"15\" fill=\"currentColor\"><rect x=\"3\" y=\"4\" width=\"4\" height=\"4\"\/><rect x=\"9\" y=\"4\" width=\"12\" height=\"4\"\/><rect x=\"3\" y=\"10\" width=\"4\" height=\"4\"\/><rect x=\"9\" y=\"10\" width=\"12\" height=\"4\"\/><rect x=\"3\" y=\"16\" width=\"4\" height=\"4\"\/><rect x=\"9\" y=\"16\" width=\"12\" height=\"4\"\/><\/svg>\n                <\/span>\n                <span id=\"btn-toggle-vue-texte\">Map<\/span>\n            <\/button>\n        <\/div>\n    <\/div>\n    <div id=\"carte-biens-topbar-spacer\"><\/div>\n\n    <div id=\"carte-biens-wrapper\">\n        <div id=\"liste-biens\"><\/div>\n\n        <div id=\"carte-biens-zone\">\n            <div id=\"carte-biens\"><\/div>\n        <\/div>\n    <\/div>\n\n    <script>\n    window.biensData = [{\"titre\":\"Exclusive Listing | Elegant apartment with an outdoor\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/geneve\\\/km-2628\\\/\",\"lat\":46.192969953364184,\"lng\":6.167087861625879,\"prix\":2300000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/bb53d\\\/1435\\\/pictures\\\/objects\\\/1435_6acfb30d28f407.90568986.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"KM\\\/ 2628\",\"npa\":\"1206\",\"surface\":\"132.2\",\"pieces\":4.5,\"chambres\":\"2\",\"nouveau\":true,\"statut_label\":\"\"},{\"titre\":\"Detached villa with a pool near the UN\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/vernier\\\/sh-km-rey-2622\\\/\",\"lat\":46.21446366280191,\"lng\":6.07668034300989,\"prix\":2750000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/7a0df\\\/1435\\\/pictures\\\/objects\\\/1435_6a20323e858612.77954260.jpg\",\"commune\":\"Vernier\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH\\\/KM\\\/REY\\\/ 2622\",\"npa\":\"1214\",\"surface\":\"240\",\"pieces\":9,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"A stately villa full of character nestled in lush greenery in Nyon\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/nyon\\\/rey-2598\\\/\",\"lat\":46.38040833895354,\"lng\":6.235969308141377,\"prix\":0,\"prix_affiche\":false,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/e4476\\\/1435\\\/pictures\\\/objects\\\/1435_6ab12a20615c32.68954329.jpg\",\"commune\":\"Nyon\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"REY\\\/ 2598\",\"npa\":\"1260\",\"surface\":\"330\",\"pieces\":10,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Charming Garden-Level Duplex Apartment \\u2014 Satigny\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/satigny\\\/sch-2595\\\/\",\"lat\":46.22721699012141,\"lng\":6.040715301113031,\"prix\":2190000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/beb89\\\/1435\\\/pictures\\\/objects\\\/1435_6aabda5270f869.42154421.jpg\",\"commune\":\"Satigny\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"SCH\\\/ 2595\",\"npa\":\"1242\",\"surface\":\"205\",\"pieces\":8,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Exceptional duplex with a terrace and access to the lake in Versoix\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/versoix\\\/rey-2586\\\/\",\"lat\":46.28866321672762,\"lng\":6.169104993757341,\"prix\":1800000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/07e7b\\\/1435\\\/pictures\\\/objects\\\/1435_6aa170c17e7654.16212975.jpg\",\"commune\":\"Versoix\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"REY 2586\",\"npa\":\"1290\",\"surface\":\"169.7\",\"pieces\":4.5,\"chambres\":\"2\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Family apartment with terrace and panoramic view \\u2013 Meyrin\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/meyrin\\\/fz-km-2572\\\/\",\"lat\":46.23668183343177,\"lng\":6.076786864175443,\"prix\":1550000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/03289\\\/1435\\\/pictures\\\/objects\\\/1435_6a8c73f7be9153.43770586.jpg\",\"commune\":\"Meyrin\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"FZ\\\/ 2573\",\"npa\":\"1217\",\"surface\":\"177\",\"pieces\":7,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"SI apartment with balcony in the immediate vicinity of the lake\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/geneve\\\/sh-rey-2566\\\/\",\"lat\":46.21374494658212,\"lng\":6.1479941363342325,\"prix\":695000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/b6461\\\/1435\\\/pictures\\\/objects\\\/1435_6a7f1820e9c584.29547181.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"SH\\\/REY- 2566\",\"npa\":\"1202\",\"surface\":\"43\",\"pieces\":2,\"chambres\":\"1\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Exceptional THPE villa 3 minutes from the lake \\u2013 Collonge-Bellerive\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/collonge-bellerive\\\/sh2456\\\/\",\"lat\":46.25521469977633,\"lng\":6.200228161413898,\"prix\":5640000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/eb365\\\/1435\\\/pictures\\\/objects\\\/1435_6a3e61bc043927.15177009.jpg\",\"commune\":\"Collonge-Bellerive\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH \\\/ 2456\",\"npa\":\"1245\",\"surface\":\"274\",\"pieces\":7,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Exclusivity \\u2013 Beautiful family villa with pool\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/athenaz-avusy\\\/6151943\\\/\",\"lat\":46.15290552888448,\"lng\":5.996371871497367,\"prix\":2295000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/102f5\\\/1435\\\/pictures\\\/objects\\\/1435_6a7c14ea0fa655.38426370.jpg\",\"commune\":\"Athenaz (Avusy)\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH 2583\",\"npa\":\"1285\",\"surface\":\"167\",\"pieces\":7,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Family apartment with 5 rooms, terrace and parental suite\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/meyrin\\\/km-2556\\\/\",\"lat\":46.224990267609655,\"lng\":6.079743902657458,\"prix\":1585000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/787f3\\\/1435\\\/pictures\\\/objects\\\/1435_6a60f296178407.95656932.jpg\",\"commune\":\"Meyrin\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"KM 2556\",\"npa\":\"1217\",\"surface\":\"117\",\"pieces\":5,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Beautiful renovated duplex in the heart of Gimel\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/gimel\\\/sch-2552\\\/\",\"lat\":46.50833785220955,\"lng\":6.308098338761567,\"prix\":730000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/0411a\\\/1435\\\/pictures\\\/objects\\\/1435_6a565244798fa2.72668498.jpg\",\"commune\":\"Gimel\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"SCH 2552\",\"npa\":\"1188\",\"surface\":\"94\",\"pieces\":4.5,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Panoramic view of Lake Geneva and Mont Blanc - Gex (FRANCE)\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/nyon\\\/km\\\/\",\"lat\":46.378600269965844,\"lng\":6.232065911898532,\"prix\":1180000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/147f7\\\/1435\\\/pictures\\\/objects\\\/1435_6a9196d776b8b5.08921555.jpg\",\"commune\":\"Nyon\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM -2533\",\"npa\":\"1260\",\"surface\":\"203.2\",\"pieces\":9,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"City arcade with exceptional location\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/commercial\\\/geneve\\\/km-1480-2\\\/\",\"lat\":46.20281497890905,\"lng\":6.1458261005319255,\"prix\":3660000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/04022\\\/1435\\\/pictures\\\/objects\\\/1435_69de1d677d86f1.49416611.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"commercial\",\"reference\":\"KM- 1480\",\"npa\":\"1204\",\"surface\":\"61\",\"pieces\":1,\"chambres\":\"\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"City arcade with exceptional location\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/commercial\\\/geneve\\\/km-1478-2\\\/\",\"lat\":46.20298445041518,\"lng\":6.146477368062681,\"prix\":2650000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/b61ed\\\/1435\\\/pictures\\\/objects\\\/1435_65b8d6f6a60a60.64188193.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"commercial\",\"reference\":\"KM 1478\",\"npa\":\"1204\",\"surface\":\"44\",\"pieces\":0,\"chambres\":\"\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"7-room Detached Villa - Near International Organizations\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/cointrin\\\/km-2218-4\\\/\",\"lat\":46.22076746841274,\"lng\":6.111797707306297,\"prix\":3090000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/3c8b8\\\/1435\\\/pictures\\\/objects\\\/1435_68df938b251d05.21726636.jpg\",\"commune\":\"Cointrin\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM. 2218\\\/4\",\"npa\":\"1216\",\"surface\":\"160\",\"pieces\":7,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Townhouse in the heart of Beaumont (FRANCE)\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/la-croix-de-rozon\\\/sch-2285-3\\\/\",\"lat\":46.144869816832525,\"lng\":6.138565690938167,\"prix\":550000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/7eaa7\\\/1435\\\/pictures\\\/objects\\\/1435_69ce237adc8f22.72628178.jpg\",\"commune\":\"La Croix-de-Rozon\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SCH- 2285\",\"npa\":\"1257\",\"surface\":\"100.2\",\"pieces\":4,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Attic duplex with exceptional panoramic view!\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/geneve\\\/sh-2301-5\\\/\",\"lat\":46.199771796086154,\"lng\":6.167756486048413,\"prix\":5450000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/6fbb6\\\/1435\\\/pictures\\\/objects\\\/1435_6944108f8adc09.15154333.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"SH- 2301\\\/5\",\"npa\":\"1208\",\"surface\":\"230\",\"pieces\":9,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Exclusive: Family Home with Large Garden in Neydens (FRANCE)\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/la-croix-de-rozon\\\/sh-mc-2291-3\\\/\",\"lat\":46.1459039672677,\"lng\":6.1353231948302245,\"prix\":785000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/e391e\\\/1435\\\/pictures\\\/objects\\\/1435_6a3278a17b1237.42936561.jpg\",\"commune\":\"La Croix-de-Rozon\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH\\\/MC 2291\",\"npa\":\"1257\",\"surface\":\"140\",\"pieces\":5,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Attic with terrace in the heart of Perly\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/perly\\\/cm-sch-2328-6\\\/\",\"lat\":46.154007990723045,\"lng\":6.09389292577371,\"prix\":1100000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/49605\\\/1435\\\/pictures\\\/objects\\\/1435_69662f9cab0db4.18639578.jpg\",\"commune\":\"Perly\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"CM\\\/SCH- 2328\",\"npa\":\"1258\",\"surface\":\"91\",\"pieces\":3.5,\"chambres\":\"1\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Detached 7-Room Villa \\u2013 Close to International Organizations\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/le-grand-saconnex\\\/km-2352\\\/\",\"lat\":46.22216070911885,\"lng\":6.115110952484004,\"prix\":3090000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/78f69\\\/1435\\\/pictures\\\/objects\\\/1435_69cbafc853a793.56853141.jpg\",\"commune\":\"Le Grand-Saconnex\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM 2352\",\"npa\":\"1218\",\"surface\":\"160\",\"pieces\":7,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Beautiful modern house in Saxon\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/saxon\\\/sh-sch-2375-2\\\/\",\"lat\":46.14864988803736,\"lng\":7.181343156549565,\"prix\":2900000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/5917e\\\/1435\\\/pictures\\\/objects\\\/1435_69b2c6015d8620.59284232.jpg\",\"commune\":\"Saxon\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH\\\/SCH\\\/ 2375\",\"npa\":\"1907\",\"surface\":\"600\",\"pieces\":8.5,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"VILLAS STIERLIN\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/meyrin\\\/km-sh-2388\\\/\",\"lat\":46.23893211860473,\"lng\":6.0887201110400175,\"prix\":1490000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/dda57\\\/1435\\\/pictures\\\/objects\\\/1435_6a1ae35877ce26.46008256.jpg\",\"commune\":\"Meyrin\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM\\\/SH- 2388\",\"npa\":\"1217\",\"surface\":\"150\",\"pieces\":5,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Attic with terrace in the heart of Perly\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/perly\\\/cm-sch-2418\\\/\",\"lat\":46.15232379402826,\"lng\":6.095307097425834,\"prix\":1100000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/c1e3b\\\/1435\\\/pictures\\\/objects\\\/1435_69c3ed67b13732.91873298.jpg\",\"commune\":\"Perly\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"CM\\\/SCH 2418\",\"npa\":\"1258\",\"surface\":\"91\",\"pieces\":3.5,\"chambres\":\"1\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Master house with panoramic views of the Alps mountains\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/versoix\\\/bp-km-2447\\\/\",\"lat\":46.28697827344959,\"lng\":6.166054619822891,\"prix\":9850000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/c88b6\\\/1435\\\/pictures\\\/objects\\\/1435_69de57ace253c5.07736795.jpg\",\"commune\":\"Versoix\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"BP\\\/KM- 2447\",\"npa\":\"1290\",\"surface\":\"450\",\"pieces\":9,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"\"},{\"titre\":\"Charming duplex apartment on the ground floor at Ch\\u00e2teau Barillet -Satigny\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/satigny\\\/sch-2515\\\/\",\"lat\":46.229260842734305,\"lng\":6.041861453642209,\"prix\":2190000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/81ae1\\\/1435\\\/pictures\\\/objects\\\/1435_6aabdb84bb9712.68101722.jpg\",\"commune\":\"Satigny\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"SCH -2515\",\"npa\":\"1242\",\"surface\":\"205\",\"pieces\":8,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"\"}];\n    window.carteBiensCategorie = \"vente\";\n    window.carteBiensI18n = {\"prixSurDemande\":\"Price on request\",\"surDemande\":\"On request\",\"parMois\":\" \\\/ month\",\"nouveau\":\"New\",\"aucunResultat\":\"No property matches these criteria.\",\"vueCarte\":\"Map\",\"vueListe\":\"List\",\"pieceUn\":\"room\",\"piecePlus\":\"rooms\",\"chambreUn\":\"bedroom\",\"chambrePlus\":\"bedrooms\",\"transactions\":{\"vente\":\"For sale\",\"location\":\"For rent\"},\"compteur\":{\"vente\":{\"un\":\"property for sale\",\"plus\":\"properties for sale\"},\"location\":{\"un\":\"property for rent\",\"plus\":\"properties for rent\"},\"international\":{\"un\":\"international property\",\"plus\":\"international properties\"},\"neuf\":{\"un\":\"new property\",\"plus\":\"new properties\"},\"vendus\":{\"un\":\"property sold\",\"plus\":\"properties sold\"},\"loues\":{\"un\":\"property rented\",\"plus\":\"properties rented\"},\"defaut\":{\"un\":\"property found\",\"plus\":\"properties found\"}}};\n\n    const STYLE_CARTE_CLAIR = [\n        { elementType: \"geometry\", stylers: [{ color: \"#f5f5f3\" }] },\n        { elementType: \"labels.icon\", stylers: [{ visibility: \"off\" }] },\n        { elementType: \"labels.text.fill\", stylers: [{ color: \"#6b7280\" }] },\n        { elementType: \"labels.text.stroke\", stylers: [{ color: \"#ffffff\" }] },\n        { featureType: \"administrative\", elementType: \"geometry\", stylers: [{ color: \"#dcdcd8\" }] },\n        { featureType: \"administrative.land_parcel\", stylers: [{ visibility: \"off\" }] },\n        { featureType: \"landscape\", elementType: \"geometry\", stylers: [{ color: \"#f5f5f3\" }] },\n        { featureType: \"poi\", stylers: [{ visibility: \"off\" }] },\n        { featureType: \"road\", elementType: \"geometry\", stylers: [{ color: \"#ffffff\" }] },\n        { featureType: \"road\", elementType: \"geometry.stroke\", stylers: [{ color: \"#e5e5e2\" }] },\n        { featureType: \"road.highway\", elementType: \"geometry\", stylers: [{ color: \"#f0ebe0\" }] },\n        { featureType: \"road.highway\", elementType: \"geometry.stroke\", stylers: [{ color: \"#e3dbc8\" }] },\n        { featureType: \"road.arterial\", elementType: \"labels\", stylers: [{ visibility: \"off\" }] },\n        { featureType: \"road.local\", elementType: \"labels\", stylers: [{ visibility: \"off\" }] },\n        { featureType: \"transit\", stylers: [{ visibility: \"off\" }] },\n        { featureType: \"water\", elementType: \"geometry\", stylers: [{ color: \"#cfe3ec\" }] },\n    ];\n\n    const ICONES = {\n        surface: '<svg viewBox=\"0 0 16 16\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M14.5.125h-13C.742.125.125.742.125 1.5v13c0 .758.617 1.375 1.375 1.375h13c.758 0 1.375-.617 1.375-1.375v-13c0-.758-.617-1.375-1.375-1.375zm.625 14.375c0 .345-.28.625-.625.625h-13a.626.626 0 0 1-.625-.625v-13c0-.345.28-.625.625-.625h13c.345 0 .625.28.625.625z\"\/><path d=\"M13.5 2.125h-3a.375.375 0 0 0 0 .75h2.094l-9.719 9.719V10.5a.375.375 0 0 0-.75 0v3c0 .207.168.375.375.375h3a.375.375 0 0 0 0-.75H3.406l9.719-9.719V5.5a.375.375 0 0 0 .75 0v-3a.375.375 0 0 0-.375-.375z\"\/><\/svg>',\n        pieces: '<svg viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M511.55 497.93H.45V227.32L256 14.07l255.55 213.25zM38 460.34h436V244.91L256 63 38 244.91z\"\/><\/svg>',\n        chambres: '<svg viewBox=\"0 0 512 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M440 188h-8v-64c-.026-22.08-17.92-39.974-40-40H120c-22.08.026-39.974 17.92-40 40v64h-8c-39.744.048-71.952 32.256-72 72v112h16v56h40v-56h400v56h40v-56h16V260c-.048-39.744-32.256-71.952-72-72zM96 124c0-13.255 10.745-24 24-24h272c13.255 0 24 10.745 24 24v64h-24v-32c0-13.255-10.745-24-24-24h-72c-13.255 0-24 10.745-24 24v32h-32v-32c0-13.255-10.745-24-24-24h-72c-13.255 0-24 10.745-24 24v32H96v-64zm280 32v32h-88v-32a8 8 0 0 1 8-8h72a8 8 0 0 1 8 8zm-152 0v32h-88v-32a8 8 0 0 1 8-8h72a8 8 0 0 1 8 8zM40 412h-8v-40h8v40zm440 0h-8v-40h8v40zm16-56H16v-40h480v40zm0-56H16v-40c.035-30.913 25.087-55.965 56-56h368c30.913.035 55.965 25.087 56 56v40z\"\/><\/svg>',\n    };\n\n    const T = window.carteBiensI18n;\n\n    function normaliser(texte) {\n        return (texte || '').toString().toLowerCase().normalize('NFD').replace(\/[\\u0300-\\u036f]\/g, '');\n    }\n\n    function formaterPrix(bien) {\n        if (!bien.prix || !bien.prix_affiche) return T.prixSurDemande;\n        const formatted = Math.round(bien.prix).toString().replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, \"'\");\n        const estLocation = (bien.transaction || '').toLowerCase().includes('location');\n        return `CHF ${formatted}.-${estLocation ? T.parMois : ''}`;\n    }\n\n    function formaterPrixCourt(bien) {\n        if (!bien.prix || !bien.prix_affiche) return T.surDemande;\n        return Math.round(bien.prix).toString().replace(\/\\B(?=(\\d{3})+(?!\\d))\/g, \"'\") + '.-';\n    }\n\n    function libelleCompteur(compteur) {\n        const pluriel = compteur > 1;\n        const cle = T.compteur[window.carteBiensCategorie] ? window.carteBiensCategorie : 'defaut';\n        return pluriel ? T.compteur[cle].plus : T.compteur[cle].un;\n    }\n\n    \/\/ Libelle affiche pour une valeur de transaction, la valeur brute restant inchangee.\n    function libelleTransaction(valeur) {\n        const cle = (valeur || '').toString().toLowerCase();\n        return T.transactions[cle] || valeur;\n    }\n\n    function construireIconePrix(texte) {\n        const largeur = Math.max(56, texte.length * 7 + 24);\n        const hauteur = 26;\n        const svg = `<svg xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"${largeur}\" height=\"${hauteur}\">\n            <rect x=\"1\" y=\"1\" width=\"${largeur - 2}\" height=\"${hauteur - 2}\" rx=\"${hauteur \/ 2}\" ry=\"${hauteur \/ 2}\"\n                  fill=\"#C7171B\" fill-opacity=\"0.6\" stroke=\"#C7171B\" stroke-width=\"2\" stroke-opacity=\"1\"\/>\n            <text x=\"50%\" y=\"52%\" dominant-baseline=\"central\" text-anchor=\"middle\" font-family=\"Arial, sans-serif\" font-size=\"12\" font-weight=\"400\" fill=\"#ffffff\">${texte}<\/text>\n        <\/svg>`;\n        return {\n            url: 'data:image\/svg+xml;charset=UTF-8,' + encodeURIComponent(svg),\n            scaledSize: new google.maps.Size(largeur, hauteur),\n            anchor: new google.maps.Point(largeur \/ 2, hauteur \/ 2),\n        };\n    }\n\n    function construireContenuBien(bien) {\n        const specs = [];\n        if (bien.surface) specs.push(`<li>${ICONES.surface}<span>${bien.surface} m\u00b2<\/span><\/li>`);\n        if (bien.pieces) specs.push(`<li>${ICONES.pieces}<span>${bien.pieces} ${bien.pieces > 1 ? T.piecePlus : T.pieceUn}<\/span><\/li>`);\n        if (bien.chambres) specs.push(`<li>${ICONES.chambres}<span>${bien.chambres} ${bien.chambres > 1 ? T.chambrePlus : T.chambreUn}<\/span><\/li>`);\n\n        \/\/ Sur les pages Vendus\/Lou\u00e9s, le badge indique le statut ; ailleurs, \"Nouveau\" si r\u00e9cent.\n        let badgeHtml = '';\n        if (bien.statut_label) {\n            badgeHtml = `<span class=\"carte-biens-badge carte-biens-badge-statut\">${bien.statut_label}<\/span>`;\n        } else if (bien.nouveau) {\n            badgeHtml = `<span class=\"carte-biens-badge\">${T.nouveau}<\/span>`;\n        }\n\n        return `\n            <div class=\"carte-biens-image-wrap\">\n                <img decoding=\"async\" src=\"${bien.image || ''}\" alt=\"\">\n                <div class=\"carte-biens-watermark\"><\/div>\n                ${badgeHtml}\n            <\/div>\n            <div class=\"carte-biens-body\">\n                <div class=\"carte-biens-meta-row\">\n                    ${bien.commune ? `<p class=\"carte-biens-commune\">${bien.commune}<\/p>` : '<span><\/span>'}\n                    <p class=\"carte-biens-prix\">${formaterPrix(bien)}<\/p>\n                <\/div>\n                <h4 class=\"carte-biens-titre\">${bien.titre}<\/h4>\n                ${specs.length ? `<ul class=\"carte-biens-specs\">${specs.join('')}<\/ul>` : ''}\n            <\/div>\n        `;\n    }\n\n    function creerCarteBien(bien) {\n        const card = document.createElement('div');\n        card.className = 'carte-biens-card';\n        card.innerHTML = construireContenuBien(bien);\n        card.addEventListener('click', () => { window.open(bien.lien, '_blank'); });\n        return card;\n    }\n\n    function largeurPopupSelonEcran() {\n        return window.innerWidth <= 480 ? Math.round(window.innerWidth * 0.9) : 320;\n    }\n\n    function hauteurHeaderFixe() {\n        let maxBas = 0;\n        document.querySelectorAll('body > *, header, #masthead, .site-header').forEach(el => {\n            if (el.id === 'carte-biens-topbar' || el.closest('#carte-biens-topbar')) return;\n            const cs = getComputedStyle(el);\n            if ((cs.position === 'fixed' || cs.position === 'sticky') && el.offsetHeight > 0) {\n                const rect = el.getBoundingClientRect();\n                if (rect.top <= 5 && rect.bottom > maxBas) maxBas = rect.bottom;\n            }\n        });\n        return Math.max(0, Math.round(maxBas));\n    }\n\n    function initCarteBiens() {\n        const data = window.biensData;\n        const listeEl = document.getElementById('liste-biens');\n        const compteurEl = document.getElementById('carte-biens-compteur');\n\n        const selTransaction = document.getElementById('filtre-transaction');\n        const selTypeBien   = document.getElementById('filtre-type-bien');\n        const selPieces     = document.getElementById('filtre-pieces');\n        const inputRecherche = document.getElementById('filtre-recherche');\n        const inputPrixMin  = document.getElementById('filtre-prix-min');\n        const inputPrixMax  = document.getElementById('filtre-prix-max');\n        const badgeFiltres  = document.getElementById('badge-filtres-actifs');\n\n        function remplirSelect(selectEl, valeurs) {\n            if (!selectEl) return;\n            [...new Set(valeurs)].filter(Boolean).sort().forEach(v => {\n                const opt = document.createElement('option');\n                opt.value = v;\n                opt.textContent = libelleTransaction(v);\n                selectEl.appendChild(opt);\n            });\n        }\n        remplirSelect(selTransaction, data.map(b => b.transaction));\n\n        const map = new google.maps.Map(document.getElementById('carte-biens'), {\n            zoom: 10,\n            center: { lat: 46.2044, lng: 6.1432 },\n            gestureHandling: 'greedy',\n            styles: STYLE_CARTE_CLAIR,\n        });\n\n        \/\/ autoPan d\u00e9sactiv\u00e9 : on g\u00e8re nous-m\u00eames le recentrage avant d'ouvrir le popup (voir plus bas),\n        \/\/ pour \u00e9viter le conflit avec notre CSS personnalis\u00e9 qui faisait dispara\u00eetre le popup au premier clic.\n        const popupPartage = new google.maps.InfoWindow({ disableAutoPan: true });\n\n        const markers = data.map(bien => {\n            const marker = new google.maps.Marker({\n                position: { lat: bien.lat, lng: bien.lng },\n                title: bien.titre,\n                icon: construireIconePrix(formaterPrixCourt(bien)),\n            });\n            marker.addListener('click', () => {\n                map.panTo(marker.getPosition());\n                google.maps.event.addListenerOnce(map, 'idle', () => {\n                    popupPartage.setOptions({ maxWidth: largeurPopupSelonEcran() });\n                    popupPartage.setContent(`<div class=\\\"carte-biens-card carte-biens-card-popup\\\" style=\\\"cursor:pointer;\\\" onclick=\\\"window.open('${bien.lien}', '_blank')\\\">${construireContenuBien(bien)}<\/div>`);\n                    popupPartage.open({ map, anchor: marker, shouldFocus: false });\n                });\n            });\n            return marker;\n        });\n\n        google.maps.event.addListener(popupPartage, 'domready', () => {\n            const btn = document.querySelector('.gm-ui-hover-effect');\n            if (btn) btn.style.display = 'none';\n        });\n\n        map.addListener('click', () => popupPartage.close());\n\n        const clusterer = new markerClusterer.MarkerClusterer({\n            map, markers,\n            renderer: {\n                render: ({ count, position }) => new google.maps.Marker({\n                    position,\n                    label: { text: String(count), color: '#ffffff', fontSize: '12px', fontWeight: '600' },\n                    icon: {\n                        path: google.maps.SymbolPath.CIRCLE,\n                        fillColor: '#C7171B',\n                        fillOpacity: 0.6,\n                        strokeColor: '#C7171B',\n                        strokeWeight: 2,\n                        scale: Math.min(18 + count \/ 3, 32),\n                    },\n                    zIndex: 1000 + count,\n                }),\n            },\n        });\n        clusterer.addListener('clusteringend', () => popupPartage.close());\n\n        function bienEstVisible(bien) {\n            if (selTransaction && selTransaction.value && bien.transaction !== selTransaction.value) return false;\n            if (selTypeBien.value && normaliser(bien.type_bien) !== normaliser(selTypeBien.value)) return false;\n\n            \/\/ Pi\u00e8ces : nombre exact, sauf pour \"6\" qui reste \"6 et plus\"\n            if (selPieces.value) {\n                const val = parseFloat(selPieces.value);\n                const piecesArrondi = Math.floor(bien.pieces);\n                if (val === 6) {\n                    if (piecesArrondi < 6) return false;\n                } else {\n                    if (piecesArrondi !== val) return false;\n                }\n            }\n\n            const recherche = normaliser(inputRecherche.value.trim());\n            if (recherche) {\n                const reference = normaliser(bien.reference);\n                const npa       = normaliser(bien.npa);\n                const commune   = normaliser(bien.commune);\n                if (!reference.includes(recherche) && !npa.includes(recherche) && !commune.includes(recherche)) return false;\n            }\n\n            const prixMin = parseFloat(inputPrixMin.value);\n            const prixMax = parseFloat(inputPrixMax.value);\n            if (!isNaN(prixMin) && bien.prix < prixMin) return false;\n            if (!isNaN(prixMax) && bien.prix > prixMax) return false;\n\n            return true;\n        }\n\n        function compterFiltresActifs() {\n            let n = 0;\n            if (selTransaction && selTransaction.value) n++;\n            if (selTypeBien.value) n++;\n            if (selPieces.value) n++;\n            if (inputRecherche.value.trim()) n++;\n            if (inputPrixMin.value) n++;\n            if (inputPrixMax.value) n++;\n            return n;\n        }\n\n        function appliquerFiltres() {\n            listeEl.innerHTML = '';\n            let compteur = 0;\n\n            markers.forEach((marker, i) => {\n                const bien = data[i];\n                const visible = bienEstVisible(bien);\n                marker.setVisible(visible);\n                if (visible) {\n                    compteur++;\n                    listeEl.appendChild(creerCarteBien(bien));\n                }\n            });\n\n            clusterer.clearMarkers();\n            clusterer.addMarkers(markers.filter(m => m.getVisible()));\n\n            compteurEl.innerHTML = `<span class=\"compteur-nombre\">${compteur}<\/span> ${libelleCompteur(compteur)}`;\n\n            const nbActifs = compterFiltresActifs();\n            if (nbActifs > 0) {\n                badgeFiltres.textContent = nbActifs;\n                badgeFiltres.style.display = 'inline-block';\n            } else {\n                badgeFiltres.style.display = 'none';\n            }\n\n            if (compteur === 0) {\n                listeEl.innerHTML = '<p style=\"padding:20px;\">' + T.aucunResultat + '<\/p>';\n            }\n        }\n\n        [selTransaction, selTypeBien, selPieces, inputPrixMin, inputPrixMax].forEach(el => {\n            if (el) el.addEventListener('change', appliquerFiltres);\n        });\n        inputPrixMin.addEventListener('input', appliquerFiltres);\n        inputPrixMax.addEventListener('input', appliquerFiltres);\n        inputRecherche.addEventListener('input', appliquerFiltres);\n\n        appliquerFiltres();\n\n        \/\/ --- R\u00e9initialiser la recherche ---\n        const btnReset = document.getElementById('btn-reset-filtres');\n        btnReset.addEventListener('click', () => {\n            if (selTransaction) selTransaction.value = '';\n            selTypeBien.value = '';\n            selPieces.value = '';\n            inputRecherche.value = '';\n            inputPrixMin.value = '';\n            inputPrixMax.value = '';\n            appliquerFiltres();\n        });\n\n        \/\/ --- Panel de filtres mobile (plein \u00e9cran) ---\n        const btnOuvrirFiltres = document.getElementById('btn-ouvrir-filtres');\n        const btnFermerFiltres = document.getElementById('btn-fermer-filtres');\n        const btnFermerFiltresCroix = document.getElementById('btn-fermer-filtres-croix');\n        const filtresPanel     = document.getElementById('carte-biens-filtres');\n        const filtresOverlay   = document.getElementById('carte-biens-filtres-overlay');\n\n        function ouvrirPanelFiltres() {\n            filtresPanel.classList.add('ouvert');\n            filtresOverlay.classList.add('ouvert');\n        }\n        function fermerPanelFiltres() {\n            filtresPanel.classList.remove('ouvert');\n            filtresOverlay.classList.remove('ouvert');\n        }\n        btnOuvrirFiltres.addEventListener('click', ouvrirPanelFiltres);\n        btnFermerFiltres.addEventListener('click', fermerPanelFiltres);\n        btnFermerFiltresCroix.addEventListener('click', fermerPanelFiltres);\n        filtresOverlay.addEventListener('click', fermerPanelFiltres);\n\n        \/\/ --- Bascule Liste \/ Carte mobile ---\n        const wrapperEl         = document.getElementById('carte-biens-wrapper');\n        const btnToggleVue      = document.getElementById('btn-toggle-vue');\n        const btnToggleVueTexte = document.getElementById('btn-toggle-vue-texte');\n\n        btnToggleVue.addEventListener('click', () => {\n            const enModeCarte = wrapperEl.classList.toggle('vue-carte');\n            btnToggleVueTexte.textContent = enModeCarte ? T.vueListe : T.vueCarte;\n            if (enModeCarte) {\n                setTimeout(() => {\n                    google.maps.event.trigger(map, 'resize');\n                    map.setCenter({ lat: 46.2044, lng: 6.1432 });\n                }, 50);\n            }\n        });\n\n        \/\/ --- Ancrage du bandeau (Filtres + compteur\/vue) en JS, sous le header sticky du th\u00e8me ---\n        const topbarEl = document.getElementById('carte-biens-topbar');\n        const spacerEl = document.getElementById('carte-biens-topbar-spacer');\n        let topbarOffset = null;\n\n        function calculerOffset() {\n            if (topbarEl.classList.contains('fixe-mobile')) return;\n            topbarOffset = topbarEl.getBoundingClientRect().top + window.scrollY;\n        }\n        calculerOffset();\n\n        window.addEventListener('resize', () => {\n            topbarEl.classList.remove('fixe-mobile');\n            spacerEl.style.display = 'none';\n            calculerOffset();\n        });\n\n        window.addEventListener('scroll', () => {\n            if (window.innerWidth > 768 || topbarOffset === null) return;\n            const decalageHeader = hauteurHeaderFixe();\n\n            if (window.scrollY >= topbarOffset - decalageHeader) {\n                if (!topbarEl.classList.contains('fixe-mobile')) {\n                    spacerEl.style.height = topbarEl.offsetHeight + 'px';\n                    spacerEl.style.display = 'block';\n                    topbarEl.classList.add('fixe-mobile');\n                }\n                topbarEl.style.top = decalageHeader + 'px';\n            } else {\n                topbarEl.classList.remove('fixe-mobile');\n                spacerEl.style.display = 'none';\n            }\n        }, { passive: true });\n    }\n    <\/script>\n    <script src=\"https:\/\/unpkg.com\/@googlemaps\/markerclusterer\/dist\/index.min.js\"><\/script>\n    <script async src=\"https:\/\/maps.googleapis.com\/maps\/api\/js?key=AIzaSyCU4OaRqNqpmK0sp_ziCROsnpSQByTskCc&callback=initCarteBiens\"><\/script>\n    <\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8fecb29 e-con-full e-flex e-con e-parent\" data-id=\"8fecb29\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-4f21a6a e-con-full e-flex e-con e-child\" data-id=\"4f21a6a\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-175ef2c e-con-full e-flex e-con e-child\" data-id=\"175ef2c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-227edb8 elementor-widget elementor-widget-heading\" data-id=\"227edb8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<p class=\"elementor-heading-title elementor-size-default\">Prestige properties<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-69d0af2 elementor-widget elementor-widget-heading\" data-id=\"69d0af2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h1 class=\"elementor-heading-title elementor-size-default\">Luxury Apartments and Houses for Sale in Geneva<\/h1>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-868341f elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"868341f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><strong>Millenium Properties real estate agency<\/strong> offers a selection of <strong>luxury properties<\/strong> in <strong>Geneva<\/strong> and French-speaking Switzerland.<\/p>\n<p>We invite you to explore our collection of <strong>luxury villas and apartments<\/strong>, carefully selected by our real estate agents.<\/p>\n<p>For confidentiality reasons, some of our most exclusive properties are not publicly listed. Contact us to discover our off-market properties.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e0530d4 e-con-full e-flex e-con e-parent\" data-id=\"e0530d4\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-f327605 e-con-full e-flex e-con e-child\" data-id=\"f327605\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ec63e6 elementor-widget elementor-widget-heading\" data-id=\"6ec63e6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Luxury real estate sales<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-63fb7e0 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"63fb7e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p dir=\"ltr\">Luxury real estate sales is a dynamic and demanding market, offering unique opportunities for buyers and investors looking for exceptional properties. Whether you are searching for a prestige residence, a high-end property or a luxury home in Geneva or French-speaking Switzerland, we are your trusted partner in this exclusive market. With our expertise and in-depth knowledge of the local market, we offer a personalised, professional service to support you in your search and help you complete your luxury property purchase.<\/p>\n<p><\/p>\n<p dir=\"ltr\">We will help you realise your dream of buying a luxury property in this prestigious region, thanks to our approach dedicated to luxury real estate sales.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-00c612b elementor-widget elementor-widget-heading\" data-id=\"00c612b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Luxury house for sale in Geneva and French-speaking Switzerland<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-96b2907 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"96b2907\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p dir=\"ltr\">Are you interested in buying a luxury home in Geneva? We specialise in the sale of luxury homes in Geneva and French-speaking Switzerland.<\/p>\n<p><\/p>\n<p dir=\"ltr\">If you are looking for a luxury home in Geneva or the surrounding areas of French-speaking Switzerland, we offer a varied range of exclusive options. From majestic villas with panoramic views of Lake Geneva, to historic residences tastefully renovated, to contemporary properties with clean lines and high-end finishes, our selection will meet the most demanding expectations. Luxury homes in Geneva and French-speaking Switzerland generally offer generous living space, landscaped gardens, swimming pools and top-quality fittings and finishes for optimal comfort.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0738aaa elementor-widget elementor-widget-heading\" data-id=\"0738aaa\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Buying a luxury apartment in Geneva and French-speaking Switzerland<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ea95bd9 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"ea95bd9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p dir=\"ltr\">If you prefer apartment living, our selection of luxury apartments in Geneva and French-speaking Switzerland is sure to appeal. From modern apartments with panoramic views of the mountains or the city of Geneva and spacious terraces, to contemporary lofts, we have a variety of options to suit your needs. Luxury apartments in Geneva and French-speaking Switzerland are often located in sought-after neighbourhoods, with easy access to amenities, luxury shops and transport, while offering a high level of comfort and refinement.<\/p>\n<p><\/p>\n<p dir=\"ltr\">We specialise in the sale and purchase of luxury apartments in Geneva and French-speaking Switzerland.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-47ca84c elementor-widget elementor-widget-heading\" data-id=\"47ca84c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Buying a luxury chalet in Switzerland<\/h3>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b3e98ee elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"b3e98ee\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>For mountain lovers, Switzerland also offers luxury chalets in the Swiss Alps. Picture yourself breathing in the fresh mountain air and unwinding in your very own mountain chalet, with panoramic views of snow-capped peaks and a warm, luxurious interior. Luxury chalets in Switzerland are often located in world-famous ski resorts, with direct access to the slopes and leisure facilities, and a spectacular natural setting for unforgettable winter holidays.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8ffc9da elementor-widget elementor-widget-heading\" data-id=\"8ffc9da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Luxury real estate listings in Geneva and French-speaking Switzerland<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-16fad31 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"16fad31\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<div id=\"\" class=\"container\" data-dve-widget=\"\" data-dve-slug=\"html\" data-dve-unique=\"html_187e7138a36\">\n<p dir=\"ltr\">To find the luxury property of your dreams in Geneva or French-speaking Switzerland, we offer a wide choice of exclusive listings. Our listings are carefully selected to include high-quality luxury properties that meet the most demanding search criteria. Whether you are looking for a luxury home with a swimming pool, a prestige apartment in the city centre or a mountain chalet with views of the Alps, you will find exceptional properties in our listings to suit your needs and tastes.<\/p>\n<p dir=\"ltr\">If you are interested in buying a luxury property in Geneva or French-speaking Switzerland, discover our exclusive selection of luxury villas, apartments and chalets. We are here to help you realise your dream of owning a prestige property. Our team of experts is on hand to support you at every stage of the process. Get in touch to discover our off-market luxury properties in Geneva and French-speaking Switzerland and benefit from our professional expertise.<\/p>\n<p dir=\"ltr\">Contact us today to begin your search and enjoy an exceptional property experience.<\/p>\n<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Prestige properties Prestige properties Luxury Apartments and Houses for Sale in Geneva Millenium Properties real estate agency offers a selection of luxury properties in Geneva and French-speaking Switzerland. We invite you to explore our collection of luxury villas and apartments, carefully selected by our real estate agents. For confidentiality reasons, some of our most exclusive [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-15615","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/pages\/15615","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/comments?post=15615"}],"version-history":[{"count":5,"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/pages\/15615\/revisions"}],"predecessor-version":[{"id":16196,"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/pages\/15615\/revisions\/16196"}],"wp:attachment":[{"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/media?parent=15615"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}