{"id":15682,"date":"2026-08-31T14:26:49","date_gmt":"2026-08-31T14:26:49","guid":{"rendered":"https:\/\/www.milleniumproperties.ch\/nos-biens-vendus\/"},"modified":"2026-10-23T15:04:37","modified_gmt":"2026-10-23T15:04:37","slug":"sold-properties-geneva","status":"publish","type":"page","link":"https:\/\/www.milleniumproperties.ch\/en\/sold-properties-geneva\/","title":{"rendered":"Nos biens vendus"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"15682\" class=\"elementor elementor-15682 elementor-13469\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9901dab e-con-full e-flex e-con e-parent\" data-id=\"9901dab\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-af0ac10 e-con-full e-flex e-con e-child\" data-id=\"af0ac10\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-619d83c e-con-full e-flex e-con e-child\" data-id=\"619d83c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2e64b07 elementor-widget elementor-widget-heading\" data-id=\"2e64b07\" 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\">Track record<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6d71de7 elementor-widget__width-initial elementor-widget-mobile__width-initial elementor-widget elementor-widget-heading\" data-id=\"6d71de7\" 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\">Our sold properties.<\/h1>\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-e79bf56 e-con-full e-flex e-con e-child\" data-id=\"e79bf56\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2de5f30 elementor-mobile-align-center elementor-align-left elementor-widget elementor-widget-button\" data-id=\"2de5f30\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/www.milleniumproperties.ch\/en\/valuation-tool\/\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Value my property<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ec5b28e elementor-mobile-align-center elementor-align-right elementor-widget elementor-widget-button\" data-id=\"ec5b28e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t\t\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"#contact-r\u00e9f\u00e9rence\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Contact us<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\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<div class=\"elementor-element elementor-element-6d8811c e-con-full e-flex e-con e-parent\" data-id=\"6d8811c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-7e9809d e-con-full e-flex e-con e-child\" data-id=\"7e9809d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f5e9b29 elementor-widget elementor-widget-shortcode\" data-id=\"f5e9b29\" 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\":\"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\":\"Sold\"},{\"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\":\"Sold\"},{\"titre\":\"Villa d&#8217;exception THPE \\u00e0 3 minutes du lac \\u2013 Collonge-Bellerive\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/collonge-bellerive\\\/6106241\\\/\",\"lat\":46.253020982918336,\"lng\":6.19796174905571,\"prix\":5480000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/3f7e7\\\/1435\\\/pictures\\\/objects\\\/1435_6a4f90708b2237.38558273.jpg\",\"commune\":\"Collonge-Bellerive\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH 2551\",\"npa\":\"1245\",\"surface\":\"274\",\"pieces\":7,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"VENDUE &#8211; Maison cosy 5P \\u00e0 Plan-les-Ouates\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/plan-les-ouates\\\/km-1063\\\/\",\"lat\":46.16753213019274,\"lng\":6.1135334170057,\"prix\":2050000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/7d77d\\\/1435\\\/pictures\\\/objects\\\/1435_65b89279527008.24588734.jpg\",\"commune\":\"Plan-les-Ouates\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM 1063\",\"npa\":\"1228\",\"surface\":\"\",\"pieces\":5,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"VENDUE &#8211; Exclusivit\\u00e9 &#8211; Maison individuelle 8P \\u00e0 Commugny\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/commugny\\\/km-911\\\/\",\"lat\":46.318928787145815,\"lng\":6.175152437568806,\"prix\":3000000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/8736d\\\/1435\\\/pictures\\\/objects\\\/1435_65b88670565f22.45130695.jpg\",\"commune\":\"Commugny\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM.911\",\"npa\":\"1291\",\"surface\":\"160\",\"pieces\":8,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"VENDUE &#8211; Magnifique maison individuelle avec vue lac\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/vesenaz\\\/km-169\\\/\",\"lat\":46.24682782189349,\"lng\":6.194883127424846,\"prix\":3950000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/8f7f8\\\/1435\\\/pictures\\\/objects\\\/1435_65b802cc60aab9.55863106.jpg\",\"commune\":\"V\\u00e9senaz\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM.169\",\"npa\":\"1222\",\"surface\":\"250\",\"pieces\":12,\"chambres\":\"8\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Maison individuelle avec vue exceptionnelle \\u00e0 Beaumont\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/beaumont\\\/sch-1742\\\/\",\"lat\":46.09391319505869,\"lng\":6.109589562712163,\"prix\":1090000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/b5644\\\/1435\\\/pictures\\\/objects\\\/1435_66dedc56b35f99.71865970.jpg\",\"commune\":\"Beaumont\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SCH\\\/ 1742\",\"npa\":\"74160\",\"surface\":\"189\",\"pieces\":7,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Immeuble locatif \\u00e0 vendre\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/building\\\/carouge-ge\\\/lm-sh-1724\\\/\",\"lat\":46.1845636323242,\"lng\":6.1398871025745,\"prix\":5000000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/a8741\\\/1435\\\/pictures\\\/objects\\\/1435_65b8f56b296f36.97365315.jpg\",\"commune\":\"Carouge GE\",\"transaction\":\"vente\",\"type_bien\":\"immeuble\",\"reference\":\"LM\\\/SH\\\/ 1724\",\"npa\":\"1227\",\"surface\":\"600\",\"pieces\":21,\"chambres\":\"7\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Appartement r\\u00e9nov\\u00e9 au c\\u0153ur de la vieille ville de Gen\\u00e8ve\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/geneve\\\/sch-1699\\\/\",\"lat\":46.20124084757197,\"lng\":6.146620536175121,\"prix\":1650000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/45b34\\\/1435\\\/pictures\\\/objects\\\/1435_65b8f254459db2.97355639.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"SCH\\\/ 1699\",\"npa\":\"1204\",\"surface\":\"90.5\",\"pieces\":2.5,\"chambres\":\"1\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Bel appartement 3.5 P proche de l&#8217;Ecole Internationale\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/geneve\\\/km-1653\\\/\",\"lat\":46.20440808868399,\"lng\":6.14174342519027,\"prix\":1390000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/c7337\\\/1435\\\/pictures\\\/objects\\\/1435_65b8ec8a50bae4.46561546.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"KM 1653\",\"npa\":\"1208\",\"surface\":\"88.4\",\"pieces\":3.5,\"chambres\":\"1\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Grande maison jumel\\u00e9e \\u00e0 Cointrin\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/le-grand-saconnex\\\/sh-km-1892\\\/\",\"lat\":46.22556993150342,\"lng\":6.112966989430173,\"prix\":2295000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/16675\\\/1435\\\/pictures\\\/objects\\\/1435_668cfba588e3f2.55523605.jpg\",\"commune\":\"Le Grand-Saconnex\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH\\\/KM 1892\",\"npa\":\"1218\",\"surface\":\"180\",\"pieces\":7,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Chalet avec vue imprenable sur la Vall\\u00e9e de l&#8217;Arve\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/mont-saxonnex\\\/sh-1875\\\/\",\"lat\":46.05187530052989,\"lng\":6.500091974441704,\"prix\":549000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/67604\\\/1435\\\/pictures\\\/objects\\\/1435_666c23081dade0.77384080.jpg\",\"commune\":\"Mont-Saxonnex\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH 1875\",\"npa\":\"74130\",\"surface\":\"170\",\"pieces\":7,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Chalet de luxe avec vue sur le Mont Blanc \\u2013 Demi quartier (Meg\\u00e8ve)\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/demi-quartier\\\/sch-1914\\\/\",\"lat\":45.883773216518755,\"lng\":6.632280483338484,\"prix\":4500000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/fc714\\\/1435\\\/pictures\\\/objects\\\/1435_66a389716e1092.70498047.jpg\",\"commune\":\"Demi-Quartier\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SCH \\\/1914\",\"npa\":\"74120\",\"surface\":\"428\",\"pieces\":9,\"chambres\":\"6\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Belle maison mitoyenne  \\u00e0 Chamb\\u00e9sy\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/chambesy\\\/lm-km-1948\\\/\",\"lat\":46.23941156417393,\"lng\":6.146119151058675,\"prix\":1990000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/50ee8\\\/1435\\\/pictures\\\/objects\\\/1435_670001310c5072.01737537.jpg\",\"commune\":\"Chamb\\u00e9sy\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"LM\\\/KM 1948\",\"npa\":\"1292\",\"surface\":\"\",\"pieces\":9,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Belle maison de ma\\u00eetre 8P \\u00e0 Conches\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/conches\\\/bp-sch-1979-2\\\/\",\"lat\":46.18977420282782,\"lng\":6.165875476434678,\"prix\":9900000,\"prix_affiche\":false,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/20e90\\\/1435\\\/pictures\\\/objects\\\/1435_682d8c82422e17.10682593.jpg\",\"commune\":\"Conches\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"BP\\\/SCH\\\/ 1979\\\/2\",\"npa\":\"1231\",\"surface\":\"374\",\"pieces\":8,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Maison moderne proche des organisations internationales\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/chambesy\\\/km-2028\\\/\",\"lat\":46.24316755239429,\"lng\":6.133068536572355,\"prix\":2190000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/6122f\\\/1435\\\/pictures\\\/objects\\\/1435_6813784cba0ad5.21164206.jpg\",\"commune\":\"Chamb\\u00e9sy\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"KM \\\/ 2028\",\"npa\":\"1292\",\"surface\":\"\",\"pieces\":6,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Exclusivit\\u00e9 &#8211; appartement traversant avec vue imprenable sur le Lac\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/versoix\\\/km-2058\\\/\",\"lat\":46.287270016597766,\"lng\":6.1606411888551325,\"prix\":1350000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/40e65\\\/1435\\\/pictures\\\/objects\\\/1435_67c86dd6d53ff2.39812477.jpg\",\"commune\":\"Versoix\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"KM \\\/ 2058\",\"npa\":\"1290\",\"surface\":\"102.6\",\"pieces\":5,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Exclusivit\\u00e9 &#8211; Bel appartement traversant avec balcon \\u2013 Matutina Parc\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/geneve\\\/km-2102\\\/\",\"lat\":46.217535653984314,\"lng\":6.123677231845583,\"prix\":1380000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/24537\\\/1435\\\/pictures\\\/objects\\\/1435_67ff8e78c1ba67.85272749.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"KM 2102\",\"npa\":\"1209\",\"surface\":\"125.3\",\"pieces\":4,\"chambres\":\"2\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Propri\\u00e9t\\u00e9 d&#8217;exception \\u00e0 seulement 15 mn de l&#8217;a\\u00e9roport Lyon st Exup\\u00e9ry\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/saint-marcel-bel-accueil\\\/sh-mc-2179-3\\\/\",\"lat\":45.639087838330006,\"lng\":5.2215269683848735,\"prix\":1285000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/65099\\\/1435\\\/pictures\\\/objects\\\/1435_68751bb6f12960.15474133.jpg\",\"commune\":\"Saint-Marcel-Bel-Accueil\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH\\\/MC- 2179\\\/3\",\"npa\":\"38080\",\"surface\":\"415\",\"pieces\":10,\"chambres\":\"6\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Propri\\u00e9t\\u00e9 d&#8217;exception \\u00e0 Collonge-Bellerive\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/collonge-bellerive\\\/bp-sh-2200\\\/\",\"lat\":46.25834860999389,\"lng\":6.201860050026903,\"prix\":0,\"prix_affiche\":false,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/c47b7\\\/1435\\\/pictures\\\/objects\\\/1435_68baadb3dfd0b0.75012888.jpg\",\"commune\":\"Collonge-Bellerive\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"BP\\\/ SH 2200\",\"npa\":\"1245\",\"surface\":\"350\",\"pieces\":10,\"chambres\":\"6\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Chalet \\u00e0 r\\u00e9nover en plein c\\u0153ur de Meg\\u00e8ve Village\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/megeve\\\/mc-2259-3\\\/\",\"lat\":45.85563145378731,\"lng\":6.613719996007096,\"prix\":1700000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/a485b\\\/1435\\\/pictures\\\/objects\\\/1435_68ec0b68cfbd60.81551582.jpg\",\"commune\":\"Meg\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"MC- 2259\\\/3\",\"npa\":\"74120\",\"surface\":\"174\",\"pieces\":6,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Charmant appartement au c\\u0153ur du village de Meg\\u00e8ve\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/megeve\\\/mc-2272-3\\\/\",\"lat\":45.85629650032376,\"lng\":6.619623239169317,\"prix\":585000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/b5f8a\\\/1435\\\/pictures\\\/objects\\\/1435_69243d4778a9c1.78991378.jpg\",\"commune\":\"Meg\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"MC 2272\\\/3\",\"npa\":\"74120\",\"surface\":\"44.7\",\"pieces\":2,\"chambres\":\"1\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"En exclusivit\\u00e9 &#8211; Charmant duplex au c\\u0153ur de Bernex\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/bernex\\\/sh-lre-2298-3\\\/\",\"lat\":46.17459301380308,\"lng\":6.066175734911759,\"prix\":1380000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/50f0c\\\/1435\\\/pictures\\\/objects\\\/1435_68ee550bd53535.25152214.jpg\",\"commune\":\"Bernex\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"SH\\\/LRE\\\/2298\\\/3\",\"npa\":\"1233\",\"surface\":\"148\",\"pieces\":6,\"chambres\":\"3\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Belle maison de village \\u00e0 Choisy\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/choisy\\\/mc-2297-3\\\/\",\"lat\":45.99222449745213,\"lng\":6.060477607913286,\"prix\":559000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/5b68f\\\/1435\\\/pictures\\\/objects\\\/1435_697247acd849f4.33590521.jpg\",\"commune\":\"Choisy\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"MC- 2297\\\/3\",\"npa\":\"74330\",\"surface\":\"160\",\"pieces\":5,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Villa contemporaine neuve \\u00e0 100 m du Lac \\u00e0 V\\u00e9senaz\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/collonge-bellerive\\\/sh-2292-3\\\/\",\"lat\":46.245853475705616,\"lng\":6.194519701084541,\"prix\":4850000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/8de3e\\\/1435\\\/pictures\\\/objects\\\/1435_693c392cea09c1.70037367.jpg\",\"commune\":\"Collonge-Bellerive\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH- 2292\\\/3\",\"npa\":\"1245\",\"surface\":\"178\",\"pieces\":6,\"chambres\":\"4\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Exclusivit\\u00e9- Belle villa familiale dans un environnement privil\\u00e9gi\\u00e9\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/house\\\/athenaz-avusy\\\/sh-km-2341\\\/\",\"lat\":46.15300124478631,\"lng\":5.994838989580447,\"prix\":1980000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/86c8d\\\/1435\\\/pictures\\\/objects\\\/1435_6974dab882d654.72714347.jpg\",\"commune\":\"Athenaz (Avusy)\",\"transaction\":\"vente\",\"type_bien\":\"maison\",\"reference\":\"SH\\\/KM 2341\",\"npa\":\"1285\",\"surface\":\"167\",\"pieces\":8,\"chambres\":\"5\",\"nouveau\":false,\"statut_label\":\"Sold\"},{\"titre\":\"Bel appartement avec vue d\\u00e9gag\\u00e9e sur la verdure\",\"lien\":\"https:\\\/\\\/www.milleniumproperties.ch\\\/en\\\/for-sale\\\/apartment\\\/geneve\\\/jb-2470\\\/\",\"lat\":46.21933066612493,\"lng\":6.123499418629851,\"prix\":1600000,\"prix_affiche\":true,\"image\":\"https:\\\/\\\/www.immomigimg.ch\\\/s\\\/fa062\\\/1435\\\/pictures\\\/objects\\\/1435_69f4c96e7eec78.83457195.jpg\",\"commune\":\"Gen\\u00e8ve\",\"transaction\":\"vente\",\"type_bien\":\"appartement\",\"reference\":\"JB 2470\",\"npa\":\"1209\",\"surface\":\"110\",\"pieces\":4,\"chambres\":\"2\",\"nouveau\":false,\"statut_label\":\"Sold\"}];\n    window.carteBiensCategorie = \"vendus\";\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\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6081624 e-con-full e-flex e-con e-parent\" data-id=\"6081624\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-f0bb3ec e-con-full e-flex e-con e-child\" data-id=\"f0bb3ec\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-2e7949d e-con-full e-flex e-con e-child\" data-id=\"2e7949d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a29f529 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"a29f529\" 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\">Address<\/p>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8ce802a elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"8ce802a\" 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>5 Boulevard du Th\u00e9\u00e2tre<br \/>1204 Geneva<\/p>\n<p>Monday \u2013 Friday<br \/>9:00 am \u2013 5:30 pm<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-98ba937 e-con-full e-flex e-con e-child\" data-id=\"98ba937\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-a63f568 elementor-widget__width-initial elementor-widget elementor-widget-heading\" data-id=\"a63f568\" 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\">Contact<\/p>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cb181d8 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"cb181d8\" 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><span style=\"text-decoration: underline\"><a href=\"mailto:info@milleniumproperties.ch\">info@milleniumproperties.ch<\/a><\/span><\/p>\n<p><span style=\"text-decoration: underline\"><a href=\"tel:+41223424412\">+41 22 342 44 12<\/a><\/span><\/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-e66d32f e-con-full e-flex e-con e-child\" data-id=\"e66d32f\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-56631ce e-con-full e-flex e-con e-child\" data-id=\"56631ce\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ed787bf elementor-widget elementor-widget-heading\" data-id=\"ed787bf\" 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\">Contact<\/p>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0165ded elementor-widget elementor-widget-heading\" data-id=\"0165ded\" 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\">Come and meet us.<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1c80d66 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"1c80d66\" 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>Sales, rentals, property management or search: a single point of contact, from first conversation to signing.<\/p>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-81a7d04 elementor-widget__width-initial elementor-widget-mobile__width-inherit elementor-button-align-start elementor-widget elementor-widget-form\" data-id=\"81a7d04\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;step_next_label&quot;:&quot;Next&quot;,&quot;step_previous_label&quot;:&quot;Previous&quot;,&quot;button_width&quot;:&quot;100&quot;,&quot;step_type&quot;:&quot;number_text&quot;,&quot;step_icon_shape&quot;:&quot;circle&quot;}\" data-widget_type=\"form.default\">\n\t\t\t\t\t\t\t<form class=\"elementor-form\" method=\"post\" name=\"Nouveau formulaire\" aria-label=\"Nouveau formulaire\">\n\t\t\t<input type=\"hidden\" name=\"post_id\" value=\"15682\"\/>\n\t\t\t<input type=\"hidden\" name=\"form_id\" value=\"81a7d04\"\/>\n\t\t\t<input type=\"hidden\" name=\"referer_title\" value=\"Our sold properties | Millenium Properties\" \/>\n\n\t\t\t\t\t\t\t<input type=\"hidden\" name=\"queried_id\" value=\"15682\"\/>\n\t\t\t\n\t\t\t<div class=\"elementor-form-fields-wrapper elementor-labels-above\">\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-field_13a790e elementor-col-50 elementor-sm-50 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-field_13a790e\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tFirst name*\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[field_13a790e]\" id=\"form-field-field_13a790e\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"Jean\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-text elementor-field-group elementor-column elementor-field-group-name elementor-col-50 elementor-sm-50 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-name\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tLast name*\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"text\" name=\"form_fields[name]\" id=\"form-field-name\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"Dupond\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-email elementor-field-group elementor-column elementor-field-group-email elementor-col-50 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-email\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tEmail*\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<input size=\"1\" type=\"email\" name=\"form_fields[email]\" id=\"form-field-email\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"dupont@email.ch\" required=\"required\">\n\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-tel elementor-field-group elementor-column elementor-field-group-field_141286d elementor-col-50 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-field_141286d\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tPhone*\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t\t\t<input size=\"1\" type=\"tel\" name=\"form_fields[field_141286d]\" id=\"form-field-field_141286d\" class=\"elementor-field elementor-size-md  elementor-field-textual\" placeholder=\"+41 00 000 00 00\" required=\"required\" pattern=\"[0-9()#&amp;+*-=.]+\" title=\"Only numbers and phone characters (#, -, *, etc) are accepted.\">\n\n\t\t\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-textarea elementor-field-group elementor-column elementor-field-group-message elementor-col-100 elementor-field-required\">\n\t\t\t\t\t\t\t\t\t\t\t\t<label for=\"form-field-message\" class=\"elementor-field-label\">\n\t\t\t\t\t\t\t\tMessage\t\t\t\t\t\t\t<\/label>\n\t\t\t\t\t\t<textarea class=\"elementor-field-textual elementor-field  elementor-size-md\" name=\"form_fields[message]\" id=\"form-field-message\" rows=\"4\" placeholder=\"Tell us about your project in a few lines (optional)...\" required=\"required\"><\/textarea>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-type-recaptcha_v3 elementor-field-group elementor-column elementor-field-group-field_5a6a405 elementor-col-100 recaptcha_v3-bottomleft\">\n\t\t\t\t\t<div class=\"elementor-field\" id=\"form-field-field_5a6a405\"><div class=\"elementor-g-recaptcha\" data-sitekey=\"6LdJOyQtAAAAAFZDDIhF5v_VznKZDJ_j9ryAMLCC\" data-type=\"v3\" data-action=\"Form\" data-badge=\"bottomleft\" data-size=\"invisible\"><\/div><\/div>\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<div class=\"elementor-field-group elementor-column elementor-field-type-submit elementor-col-100 e-form__buttons\">\n\t\t\t\t\t<button class=\"elementor-button elementor-size-sm\" type=\"submit\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Send my message<\/span>\n\t\t\t\t\t\t\t\t\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/button>\n\t\t\t\t<\/div>\n\t\t\t<\/div>\n\t\t<input type='hidden' name='lang' value='en-gb' \/><\/form>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-35342f8 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"35342f8\" 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>Reply within 24 to 48 hours<\/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\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Track record Our sold properties. Value my property Contact us Address 5 Boulevard du Th\u00e9\u00e2tre1204 Geneva Monday \u2013 Friday9:00 am \u2013 5:30 pm Contact info@milleniumproperties.ch +41 22 342 44 12 Contact Come and meet us. Sales, rentals, property management or search: a single point of contact, from first conversation to signing. Reply within 24 to [&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-15682","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/pages\/15682","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=15682"}],"version-history":[{"count":2,"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/pages\/15682\/revisions"}],"predecessor-version":[{"id":16095,"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/pages\/15682\/revisions\/16095"}],"wp:attachment":[{"href":"https:\/\/www.milleniumproperties.ch\/en\/wp-json\/wp\/v2\/media?parent=15682"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}