Qualité dyal tswirat : 8/10 · m9iyma b IA
Sindibad, Casablanca
12 500 MAD/mois
227 MAD/m²
Positionnement dyal taman
Taman machi 3adi f had l'7ouma — verifié l'mssa7a
L'wasat Sindibad : 120 MAD/m² · 25 annonces m7allila
Chouf l'as3ar dyal l'7oumaCaractéristiques
Surface
Annonces mchabhin
12 500 MAD/mois
227 MAD/m²
55 m²
Biout
1
Description
Magnifique studio neuf de 55 m², au 1er étage d’une résidence moderne et sécurisée au cœur du quartier CIL. Entièrement meublé avec goût, ce bien offre un cadre de vie élégant, confortable et contemporain. Le studio se compose de : * Un salon moderne et lumineux * Une chambre confortable avec rangements * Une cuisine américaine entièrement équipée * Une salle de bain moderne * Un balcon agréable * Une place de garage sécurisée Les atouts du studio : * Appartement neuf jamais habité * Mobilier moderne et de qualité * Très belles finitions * Résidence calme et sécurisée * Emplacement recherché à proximité de toutes les commodités * Idéal pour célibataire, jeune actif ou expatrié 📞 Pour plus d’informations ou organiser une visite, contactez-nous. 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 un jour 9 500 DH / mois 1 Ch 1 sdb 55 m² Appartement à louer Casablanca -Ferme Bretonne Annonce par : Menzil Immobilier Il y a 19 jours 11 000 DH / mois 1 Ch 1 sdb 56 m² Appartement à louer Casablanca -Hay Hassani Annonce par : Cantarel Immobilier Il y a 2 mois 8 500 DH / mois 1 Ch 2 sdb 80 m² Appartement à louer Casablanca -Hay Hassani Annonce par : Cantarel Immobilier Il y a 2 mois 7 800 DH / mois 1 Ch 1 sdb 45 m² Appartement à louer Casablanca -Hay Hassani Annonce par : Cantarel Immobilier (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 < pageCount; const isActive = actualIndex === currentIndex; let scale = 1; let opacity = 1; /* Shrink the two dots closest to whichever edge has hidden * pages beyond the window. Active dot always stays full size. */ if (!isActive && isVisible) { if (overflowsAtStart && dotPosition === 0) { scale = 0.5; opacity = 0.6; } else if (overflowsAtStart && dotPosition === 1) { scale = 0.7; opacity = 0.8; } else if (overflowsAtEnd && dotPosition === maxDots - 1) { scale = 0.5; opacity = 0.6; } else if (overflowsAtEnd && dotPosition === maxDots - 2) { scale = 0.7; opacity = 0.8; } } dot.style.back
Localisation
Position ta9ribiya