Qualité dyal tswirat : 5/10 · m9iyma b IA
Ain Chock, Casablanca
5 600 000 MAD
22 311 MAD/m²
Positionnement dyal taman
Taman machi 3adi f had l'7ouma — verifié l'mssa7a
L'wasat Ain Chock : 14 722 MAD/m² · 124 annonces m7allila
Rendement locatif estimé ≈ 4,8 % f 3am · Fin tinvesti f Casablanca ?
Chouf l'as3ar dyal l'7oumaCaractéristiques
Annonces mchabhin
5 600 000 MAD
22 311 MAD/m²
Surface
251 m²
Biout
5
Description
SIDI MAAROUF, Vend villa neuve bien Située dans une résidence fermée et très sécurisée, cette magnifique villa de 251 m² de terrain et 400 m² habitables se répartit sur trois niveaux et offre des prestations haut de gamme, idéales pour une grande famille ou pour un investissement de standing, Superficie terrain : 251 m² et 400m2 habitable, se compose de : Rez-de-chaussée :Un grand séjour lumineux avec cheminée, Deux chambres confortables, Toilettes invités séparées jardin, 1er étage : Un appartement parental : bien aménagé, offrant intimité et confort, Trois chambres supplémentaires, idéales pour enfants ou invités, Deux salles de bain modernes, bien agencées, Une terrasse spacieuse, pour profiter du plein air, prendre le petit-déjeuner ou se détendre en soirée, Sous-sol / Cave : Une cave pour le stockage ou comme pièce multifonction. document.addEventListener(`DOMContentLoaded`,function(){let e=document.getElementById(`voir-plus`),t=document.querySelector(`.label`);e.addEventListener(`change`,function(){e.checked||t.scrollIntoView({behavior:`smooth`})})}); proposée par : Cantarel Immobilier Agence immobilière à Casablanca Information financières --> --> Annonces Similaires Il y a 16 heures 5 400 000 DH 5 Ch 3 sdb 303 m² Villa à vendre Casablanca -Addaman Annonce par : Sélection agenz Il y a 17 heures 14 000 000 DH 5 Ch 5 sdb 1000 m² Villa à vendre Casablanca -Californie Annonce par : Sélection agenz Il y a 5 jours 9 200 000 DH 5 Ch 3 sdb 1141 m² Villa à vendre Casablanca -Sidi Maarouf Annonce par : Sélection agenz Il y a 6 jours 5 500 000 DH 5 Ch 4 sdb Villa à vendre Casablanca -Sidi Maarouf Annonce par : Sélection agenz (function(){const id = ""; const similarLen = 4; document.addEventListener("DOMContentLoaded", function () { const carousel = document.getElementById(`Cards-Container${id}`); const arrows = document.getElementById(`arrowsId${id}`); const indicators = document.getElementById(`indicators${id}`); // const prevStroke = document.getElementById(`prev-stroke${id}`); const nextButtons = document.querySelectorAll(`.next-btn${id}`); const prevButtons = document.querySelectorAll(`.prev-btn${id}`); if (!carousel) return; /* Card #4103 — measure the real card "step" (card width + gap) * by reading the two first children's offsetLeft. Falls back to * the first child's offsetWidth if there's only one card. This is * what makes the arrow navigation actually land on card edges * instead of being off by the gap. */ let currentIndex = 0; const firstCard = carousel.firstElementChild; const cardWidth = firstCard instanceof HTMLElement ? firstCard.offsetWidth || 320 : 320; const measureStep = () => { const first = carousel.children[0]; const second = carousel.children[1]; if (!first || !(first instanceof HTMLElement)) return cardWidth; if (second && second instanceof HTMLElement) { const delta = second.offsetLeft - first.offsetLeft; if (delta > 0) return delta; } return first.offsetWidth || cardWidth; }; let step = measureStep(); /* maxScroll is the true end of the scroll container. The card- * counted maxIndex is derived from it so the last "next" click * lands at scrollLeft = maxScroll and the final card sits fully * inside the viewport, no partial visibility. */ const getMaxScroll = () => Math.max(0, carousel.scrollWidth - carousel.clientWidth); let maxScroll = getMaxScroll(); let maxIndex = step > 0 ? Math.ceil(maxScroll / step) : 0; const maxDots = 5; const isRTL = getComputedStyle(carousel).direction === "rtl"; const recompute = () => { step = measureStep(); maxScroll = getMaxScroll(); maxIndex = step > 0 ? Math.ceil(maxScroll / step) : 0; }; const updateArrowsVisibility = () => { if (!arrows || !carousel) return; arrows.style.visibility = maxScroll > 0 ? "visible" : "hidden"; }; /* Dots window over the VALID scroll positions [0, maxIndex], * not over similarLen. Showing more dots than reachable positions * was the source of the "active dot stuck on an earlier position" * bug for cards = N where N - visibleCards maxDots and there's more content beyond an edge, * the dots closest to that edge shrink (1.0 → 0.7 → 0.5) so the * user gets a visual "there's more in this direction" cue without * the dot strip itself growing. */ const updateIndicators = () => { if (!indicators) return; const dots = indicators.querySelectorAll(".dot-indicator"); const pageCount = maxIndex + 1; // number of valid scroll positions let startDot = 0; if (pageCount > maxDots) { const half = Math.floor(maxDots / 2); if (currentIndex = pageCount - half - 1) { startDot = pageCount - maxDots; } else { startDot = currentIndex - half; } } const endDot = startDot + maxDots - 1; const overflowsAtStart = pageCount > maxDots && startDot > 0; const overflowsAtEnd = pageCount > maxDots && endDot { const actualIndex = startDot + dotPosition; const isVisible = actualIndex { if (!carousel) return; recompute(); currentIndex = Math.max(0, Math.min(index, maxIndex)); /* The container has `scroll-snap-type: x mandatory` and the cards * default to start-aligned snap. If we just
Localisation
Position ta9ribiya