{"id":3428,"date":"2026-09-01T21:22:26","date_gmt":"2026-09-01T21:22:26","guid":{"rendered":"https:\/\/bfta.com.tr\/3b-koyu-2\/"},"modified":"2026-10-02T19:18:38","modified_gmt":"2026-10-02T19:18:38","slug":"kadikoy-kentsel-donusumu","status":"publish","type":"page","link":"https:\/\/bfta.com.tr\/en\/kadikoy-kentsel-donusumu\/","title":{"rendered":"Kad\u0131k\u00f6y&#8217;de Kentsel D\u00f6n\u00fc\u015f\u00fcm"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"3428\" class=\"elementor elementor-3428 elementor-bc-flex-widget\" id=\"content\" role=\"main\" tabindex=\"-1\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-kdk1001 e-con-full e-flex e-con e-parent\" data-id=\"kdk1001\" data-element_type=\"container\" data-e-type=\"container\" data-settings=\"{&quot;jet_parallax_layout_list&quot;:[]}\">\n\t\t\t\t<div class=\"elementor-element elementor-element-kdk4400 elementor-widget elementor-widget-html\" data-id=\"kdk4400\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<style>.maplibregl-map{font:12px\/20px sans-serif;overflow:hidden;position:relative;-webkit-tap-highlight-color:rgba(0,0,0,0)}.maplibregl-canvas{left:0;position:absolute;top:0}.maplibregl-canvas-container.maplibregl-interactive{cursor:grab;-webkit-user-select:none;user-select:none}.maplibregl-canvas-container.maplibregl-interactive.maplibregl-track-pointer{cursor:pointer}.maplibregl-canvas-container.maplibregl-interactive:active{cursor:grabbing}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate .maplibregl-canvas{touch-action:pan-x pan-y}.maplibregl-canvas-container.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:pinch-zoom}.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan,.maplibregl-canvas-container.maplibregl-touch-zoom-rotate.maplibregl-touch-drag-pan .maplibregl-canvas{touch-action:none}.maplibregl-marker{left:0;position:absolute;top:0;will-change:transform;transition:opacity .2s}.maplibregl-ctrl-attrib{display:none}\n  .kdml{ --kara:#22242A; --deniz:#0B1428; --govde:#E7E5E1; --kunye:#9A9691; --isaret:#C9704F; --dis:#343841; --kirik:#1B1D22;\n         --unica:\"neue-haas-unica\",sans-serif; --serif:\"Newsreader Motto\",Georgia,\"Times New Roman\",serif; }\n  .kdml{position:relative;height:100vh;min-height:520px;overflow:hidden;background:var(--kara);color:var(--govde);font-family:var(--unica);-webkit-font-smoothing:antialiased}\n  .kdml{height:100dvh}\n  .kdml *{box-sizing:border-box}\n  .kdml .harita{position:absolute;inset:0;z-index:1}   \n  .maplibregl-ctrl-attrib{display:none} .kdml .atif{margin:10px 0 -14px;font-size:11px;letter-spacing:.04em;color:var(--kunye);pointer-events:none;text-align:right;line-height:1.4;opacity:.75} .kdml .yazi{pointer-events:none} .kdml .yazi h1, .kdml .yazi h2, .kdml .yazi p, .kdml .yazi a, .kdml .yazi details, .kdml .yazi summary, .kdml .yazi .metin{pointer-events:auto} .kdml .yazi{position:absolute;left:28px;top:calc(var(--hdr,6px) + 22px);z-index:5;max-width:clamp(380px, 23vw, 440px);    max-height:calc(100% - var(--hdr,6px) - 120px);\n    overflow-y:auto;overscroll-behavior:contain;background:transparent;padding:22px 24px;border:0} .kdml .perde{position:absolute;inset:0;z-index:5;background:#0E0F12;pointer-events:none;opacity:.9;transition:opacity 1.3s ease} .kdml .perde.ac{opacity:0} .kdml .anlati{position:absolute;inset:0;z-index:6;display:flex;align-items:center;justify-content:center;pointer-events:none;text-align:center;padding:0 24px} .kdml .anlati .satir{position:absolute;left:24px;right:24px;opacity:0;transform:translateY(10px);transition:opacity .9s ease,transform .9s ease} .kdml .anlati .satir.gel{opacity:1;transform:none} .kdml .anlati .buyuk{font-family:var(--serif);font-weight:500;font-size:clamp(32px,4.6vw,60px);line-height:1.08;letter-spacing:-.01em;color:#F2F1EE;text-shadow:0 2px 26px rgba(0,0,0,.65)} .kdml .anlati .kucuk{margin-top:14px;font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:#B9B5AF;text-shadow:0 1px 10px rgba(0,0,0,.7)} .kdml .atla{position:absolute;left:50%;bottom:26px;transform:translateX(-50%);z-index:7;font:12px var(--unica);letter-spacing:.12em;text-transform:uppercase;color:var(--govde);\n    background:rgba(27,29,34,.55);border:1px solid rgba(255,255,255,.18);padding:8px 16px;cursor:pointer;opacity:0;transition:opacity .6s}.kdml.kd-intro .atla{opacity:1} .kdml .yazi, .kdml .kumanda, .kdml .golge{transition:opacity 1.2s ease}.kdml.kd-intro .yazi,.kdml.kd-intro .kumanda,.kdml.kd-intro .golge{opacity:0;pointer-events:none}.kdml.kd-pinsiz .igne{opacity:0} .kdml .igne.bekle{opacity:0} .kdml .igne .uc{transition:transform .8s cubic-bezier(.3,1.45,.5,1),opacity .3s ease} .kdml .igne.bekle .uc{transform:translateY(-140px);opacity:0} .kdml .igne{transition:opacity .55s ease} .kdml .golge{position:absolute;inset:0;z-index:2;pointer-events:none;\n    background:linear-gradient(90deg,rgba(34,36,42,.96) 0,rgba(34,36,42,.9) 300px,rgba(34,36,42,.62) 470px,rgba(34,36,42,.22) 640px,rgba(34,36,42,0) 820px),\n               linear-gradient(180deg,rgba(34,36,42,.55) 0,rgba(34,36,42,0) 160px)} .kdml .golge::after{content:\"\";position:absolute;top:0;bottom:0;left:0;width:900px;opacity:.045;mix-blend-mode:overlay;\n    background:url(\"data:image\/svg+xml;utf8,<svg xmlns='http:\/\/www.w3.org\/2000\/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'\/><feColorMatrix values='0 0 0 0 .5 0 0 0 0 .5 0 0 0 0 .5 0 0 0 1 0'\/><\/filter><rect width='160' height='160' filter='url(%23n)'\/><\/svg>\");\n    -webkit-mask:linear-gradient(90deg,#000 0,#000 500px,transparent 900px);mask:linear-gradient(90deg,#000 0,#000 500px,transparent 900px)} .kdml .yazi::-webkit-scrollbar{width:8px} .kdml .yazi::-webkit-scrollbar-thumb{background:#4A4E55;border-radius:4px} .kdml .yazi h1{font-family:var(--serif);font-weight:500;font-size:26px;line-height:1.16;margin:0 0 10px;letter-spacing:-.01em} .kdml .yazi p{font-size:13.5px;line-height:1.62;margin:0 0 10px;color:var(--govde)} .kdml .yazi .not{font-size:11px;letter-spacing:.1em;text-transform:uppercase;color:var(--kunye);margin:0} .kdml .kumanda{position:absolute;left:0;right:0;bottom:0;z-index:3;padding:20px 28px 28px;\n    background:linear-gradient(to top,rgba(27,29,34,.85) 0%,rgba(27,29,34,.55) 55%,rgba(27,29,34,0) 100%)} .kdml .mahaller{display:flex;gap:6px;flex-wrap:wrap;align-items:center} .kdml .mahaller button{font-family:var(--unica);font-weight:400;font-size:13px;letter-spacing:.03em;padding:6px 11px;\n    background:rgba(27,29,34,.55);border:1px solid rgba(255,255,255,.16);color:var(--govde);cursor:pointer;line-height:1.2} .kdml .mahaller button .adet{opacity:.55;margin-left:5px;font-variant-numeric:tabular-nums} .kdml .mahaller button .leke{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:6px;vertical-align:baseline;opacity:.85} .kdml .mahaller button.secili{border-color:rgba(255,255,255,.55)} .kdml .mahaller button.secili .leke{opacity:1;box-shadow:0 0 0 1.5px rgba(255,255,255,.9)} .kdml .mahaller .plan-cip{margin-left:auto;background:transparent;border-color:var(--isaret);color:var(--isaret);\n    text-transform:uppercase;letter-spacing:.12em;font-size:11px;padding:6px 14px} .kdml .mahaller .plan-cip:hover{box-shadow:inset 0 0 0 1px var(--isaret)} .kdml .mahaller .plan-cip.acik{background:var(--isaret);border-color:var(--isaret);color:#1B1D22} .kdml .igne{position:relative;width:20px;pointer-events:auto;cursor:pointer;display:flex;flex-direction:column;align-items:center;justify-content:flex-end} .kdml .igne .uc{width:20px;height:24px;position:relative;margin-bottom:6px} .kdml .igne .uc .olcek{position:absolute;left:0;top:0;width:20px;height:24px;transform:scale(calc(var(--olcek,1) * 1.2));transform-origin:50% 100%;transition:transform .15s ease-out} .kdml .igne .damla{width:20px;height:20px;border:1.5px solid var(--isaret);border-radius:50% 50% 50% 0;transform:rotate(-45deg);box-sizing:border-box;position:relative;background:rgba(27,29,34,.55);transition:background .2s} .kdml .igne .damla::after{content:\"\";position:absolute;left:50%;top:50%;width:5px;height:5px;margin:-2.5px 0 0 -2.5px;border-radius:50%;background:var(--isaret);transition:background .2s} .kdml .igne .catik{width:0;background:transparent} .kdml .igne .uc{transition:transform .8s cubic-bezier(.3,1.45,.5,1),opacity .3s ease,margin-bottom .35s ease} .kdml .igne .ciz{width:1px;height:0;background:rgba(242,241,238,.85);transition:height .3s ease .1s;pointer-events:none} .kdml .igne.acik .uc{margin-bottom:8px} .kdml .igne.acik .ciz{height:22px;margin-bottom:6px} .kdml .igne.acik .uc .olcek{transform:scale(calc(var(--olcek,1) * 1.5))} .kdml .igne:hover .damla{background:var(--isaret)} .kdml .igne:hover .damla::after{background:#1B1D22} .kdml .igne.acik .damla{background:var(--isaret);border-color:#1B1D22;border-width:2px;box-shadow:0 0 0 2px rgba(242,241,238,.9)} .kdml .igne.acik .damla::after{background:#F2F1EE} .kdml .igne:hover .ad, .kdml .igne.acik .ad{left:50%;transform:translateX(-50%);bottom:calc(100% + 10px);background:rgba(27,29,34,.72);backdrop-filter:blur(3px);padding:5px 12px;font-size:13.5px;border:1px solid rgba(255,255,255,.14);border-radius:999px;font-weight:400;letter-spacing:.03em;text-shadow:none} .kdml .igne .ad{position:absolute;left:22px;bottom:calc(100% - 6px);font:500 12px var(--unica);color:#fff;white-space:nowrap;opacity:0;transition:opacity .2s;text-shadow:0 1px 3px rgba(0,0,0,.8);pointer-events:none} .kdml .igne:hover .ad, .kdml .igne.acik .ad{opacity:1} .kdml .igne.dis{opacity:.34} .kdml .balon{position:absolute;right:28px;top:28px;z-index:9;background:transparent;border:0;box-shadow:none;\n    opacity:0;transform:translateY(6px);transition:opacity .22s ease-in,transform .22s ease-in;pointer-events:none} .kdml .balon.gel{opacity:1;transform:translateY(0);pointer-events:auto;transition:opacity .26s ease-out,transform .3s cubic-bezier(.22,1,.36,1)} .kdml .balon .gor{display:block;width:100%;aspect-ratio:4\/5;object-fit:contain;background:transparent} .kdml .balon .pmetin{padding:14px 0 0;text-align:right} .kdml .balon .ad{font-family:var(--serif);font-weight:500;font-size:19px;line-height:1.22;color:#F2F1EE} .kdml .balon .isv{font-size:13px;line-height:19.5px;letter-spacing:normal;color:var(--kunye);margin-top:4px} .kdml .golge-sag{position:absolute;inset:0;z-index:2;pointer-events:none;opacity:0;transition:opacity .45s ease;\n    background:linear-gradient(270deg,rgba(34,36,42,.96) 0,rgba(34,36,42,.9) var(--kartG,460px),rgba(34,36,42,.6) calc(var(--kartG,460px) + 150px),rgba(34,36,42,.22) calc(var(--kartG,460px) + 320px),rgba(34,36,42,0) calc(var(--kartG,460px) + 520px))}.kdml.kart-acik .golge-sag{opacity:1} .kdml .balon .kapat{position:absolute;right:8px;top:8px;background:rgba(0,0,0,.5);border:0;color:#fff;width:28px;height:28px;cursor:pointer;font-size:16px} .kdml .kuzey{position:absolute;right:30px;top:calc(var(--hdrAlt,52px) + 10px);z-index:6;width:40px;height:52px;opacity:0;transition:opacity .35s ease,transform .3s ease;pointer-events:none;text-align:center;transform-origin:20px 20px} .kdml .kuzey span{display:block;font:500 10px var(--unica);letter-spacing:.1em;color:#E7E5E1;margin-top:-2px} .kdml .kuzey.gel{opacity:.9} .kdml .yukleyici{position:absolute;inset:0;z-index:6;background:var(--kara);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:14px;transition:opacity 1.4s cubic-bezier(.33,0,.15,1)} .kdml .yukleyici span{font:500 11.5px var(--unica);letter-spacing:.24em;text-transform:uppercase;color:#6E6B66} .kdml .yukleyici{gap:20px} .kdml .yukleyici .say{font:520 clamp(46px,7.2vw,88px)\/.92 var(--unica);letter-spacing:.055em;text-indent:.055em;color:#EDEBE6;font-variant-numeric:tabular-nums;font-feature-settings:'tnum' 1;opacity:0;transition:opacity .25s ease,transform .75s cubic-bezier(.22,.61,.36,1)} .kdml .yukleyici .say.gel{opacity:1} .kdml .yukleyici.git .say{transition:opacity .6s ease,transform 1.2s cubic-bezier(.33,0,.15,1)} .kdml .yukleyici.git{opacity:0;pointer-events:none} .kdml .yukleyici.git .say{transform:translateY(-22px) scale(.94);opacity:0} .kdml .yukleyici.git span{opacity:0;transition:opacity .35s ease} .kdml .kadraj{position:absolute;left:28px;bottom:34px;z-index:5;display:none;font:600 13px var(--unica);letter-spacing:.04em;color:#E8E6E1;background:rgba(18,20,24,.72);padding:6px 12px;border-radius:3px;user-select:all;font-variant-numeric:tabular-nums} .kdml .olcum{position:absolute;left:28px;bottom:6px;z-index:4;font-size:11px;letter-spacing:.04em;color:#6B7079;font-variant-numeric:tabular-nums;display:none} .kdml .yazi.metin-acik details.devam>summary{display:none} .kdml .yazi details.kd-liste{margin-top:4px} .kdml .yazi details.kd-liste>summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--govde);padding:2px 0 6px} .kdml .yazi details.kd-liste>summary::-webkit-details-marker{display:none} .kdml .yazi details.kd-liste h3{font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--kunye);font-weight:500;margin:14px 0 6px;display:flex;justify-content:space-between;align-items:baseline;gap:10px} .kdml .yazi details.kd-liste h3:first-of-type{margin-top:6px} .kdml .yazi details.kd-liste h3 span{font-size:10px;letter-spacing:.08em;opacity:.65;white-space:nowrap} .kdml .yazi details.kd-liste p{font-size:12.5px;line-height:1.5;margin:0 0 1px;color:var(--govde);cursor:pointer;padding:2px 6px;margin-left:-6px;border-radius:2px} .kdml .yazi details.kd-liste p:hover, .kdml .yazi details.kd-liste p:focus-visible{background:rgba(242,241,238,.06);outline:none} .kdml .yazi details.kd-liste p.basa{margin:14px 0 2px;padding:10px 0 0;cursor:default;border-top:1px solid rgba(255,255,255,.08)} .kdml .yazi details.kd-liste p.basa:hover{background:none} .kdml .yazi details.kd-liste .basadon{background:none;border:0;padding:0;cursor:pointer;color:var(--kunye);font:500 11px var(--unica);letter-spacing:.12em;text-transform:uppercase} .kdml .yazi details.kd-liste .basadon:before{content:\"\";display:inline-block;width:0;height:0;margin-right:7px;border:4px solid transparent;border-bottom-color:currentColor;transform:translateY(-1px)} .kdml .yazi details.kd-liste .basadon:hover{color:var(--govde)}\n  @media(max-width:900px){ .kdml .golge{display:none} .kdml .yazi{left:12px;right:12px;top:12px;bottom:auto;width:auto;max-height:44%;padding:14px 16px;border:1px solid rgba(255,255,255,.06);background:rgba(27,29,34,.42);backdrop-filter:blur(10px)} .kdml .yazi>p:first-of-type{display:-webkit-box;-webkit-line-clamp:4;-webkit-box-orient:vertical;overflow:hidden;margin-bottom:0} .kdml .yazi>p.not{display:none} .kdml .yazi:has(details.devam[open])>p:first-of-type{display:block;-webkit-line-clamp:unset;overflow:visible;margin-bottom:12px} .kdml .yazi:has(details.devam[open]){overflow:auto;-webkit-overflow-scrolling:touch;pointer-events:auto} .kdml .yazi details.devam{margin-top:10px} .kdml .kumanda{left:0} .kdml .kumanda{padding:12px 12px 14px} .kdml .mahaller{flex-wrap:nowrap;overflow-x:auto;scrollbar-width:none} .kdml .mahaller button{flex:0 0 auto;min-height:44px} .kdml .olcum{display:none} .kdml .atif{margin:8px 0 0;font-size:10px} .kdml .balon{left:12px;right:12px;top:auto} .kdml .golge-sag{display:none} .kdml .balon .pmetin{position:absolute;left:0;right:0;bottom:0;padding:34px 13px 12px;text-align:left;background:linear-gradient(to top,rgba(18,20,24,.94) 0%,rgba(18,20,24,.78) 42%,rgba(18,20,24,0) 100%)} .kdml .balon .isv{display:block;font-size:12px;line-height:17px;margin-top:2px;color:#CFCDC8;text-shadow:0 1px 3px rgba(0,0,0,.7)} .kdml .balon .ad{font-size:17px;text-shadow:0 1px 3px rgba(0,0,0,.7)} .kdml .yazi{transition:opacity .3s ease,transform .3s ease}.kdml.kart-acik .yazi{opacity:0;pointer-events:none;transform:translateY(-8px)}\n    }\n.kdml .yazi h2{font-family:var(--serif);font-weight:500;font-size:18px;line-height:1.27;margin:26px 0 9px;color:var(--govde)}.kdml .yazi a{color:var(--govde);text-decoration:underline;text-decoration-thickness:1px;text-underline-offset:2px;text-decoration-color:rgba(231,229,225,.35)}.kdml .yazi a:hover{color:var(--isaret);text-decoration-color:var(--isaret)}.kdml .yazi::-webkit-scrollbar{width:9px}.kdml .yazi::-webkit-scrollbar-thumb{background:#4A4E55;border-radius:5px}.kdml .yazi details.devam summary{list-style:none;cursor:pointer;display:inline-flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.08em;text-transform:uppercase;color:var(--govde);padding:2px 0 6px}.kdml .yazi details.devam summary::-webkit-details-marker{display:none}.kdml .yazi .art{display:inline-block;width:11px;height:11px;position:relative;opacity:.7}.kdml .yazi .art:before,.kdml .yazi .art:after{content:\"\";position:absolute;background:currentColor}.kdml .yazi .art:before{left:0;right:0;top:5px;height:1px}.kdml .yazi .art:after{top:0;bottom:0;left:5px;width:1px}.kdml .yazi details[open] > summary .art:after{display:none}.kdml .yazi details.devam[open] summary .kapali,.kdml .yazi details.devam:not([open]) summary .acikm{display:none}.kdml .yazi details.devam .metin{padding-top:10px}body.kd-tam .elementor-location-header{position:absolute;top:0;left:0;right:0;z-index:20;background:transparent}body.kd-tam .elementor-location-header a,body.kd-tam .elementor-location-header .elementor-item{color:#F2F1EE}body.kd-tam .elementor-location-header a:hover,body.kd-tam .elementor-location-header .elementor-item:hover{color:#C9704F}body.kd-tam .elementor-location-header img[src*=\"bfta-logo\"]{filter:brightness(0) invert(1)}body.kd-tam .elementor-location-header svg{fill:currentColor}body.kd-tam .elementor-location-header .elementor-menu-toggle{color:#F2F1EE}body.kd-tam .elementor-location-header .jet-nav__mobile-trigger,body.kd-tam .elementor-location-header .jet-nav__mobile-trigger-open,body.kd-tam .elementor-location-header .jet-nav__mobile-trigger-close{color:#F2F1EE}body.kd-tam .elementor-location-header .jet-nav__mobile-trigger svg,body.kd-tam .elementor-location-header .jet-nav__mobile-trigger svg *{fill:currentColor}body.kd-tam .elementor-location-header .e-n-menu-icon,body.kd-tam .elementor-location-header .e-n-menu-title,body.kd-tam .elementor-location-header .e-n-menu-toggle{color:#F2F1EE}body.kd-tam .elementor-location-header .e-n-menu-icon svg,body.kd-tam .elementor-location-header .e-n-menu-icon svg *,body.kd-tam .elementor-location-header .e-n-menu-toggle svg,body.kd-tam .elementor-location-header .e-n-menu-toggle svg *{fill:#F2F1EE !important;stroke:#F2F1EE}body.kd-tam.admin-bar .elementor-location-header{top:32px}@media(max-width:782px){body.kd-tam.admin-bar .elementor-location-header{top:46px}}body.kd-tam .elementor-location-header .elementor-element,body.kd-tam .elementor-location-header .e-con,body.kd-tam .elementor-location-header .e-con-inner{background-color:transparent !important;background-image:none !important}body.page-id-3428 header.elementor-location-header{position:absolute;top:0;left:0;right:0;z-index:100;pointer-events:none}body.page-id-3428 header.elementor-location-header a,body.page-id-3428 header.elementor-location-header button,body.page-id-3428 header.elementor-location-header .e-n-menu,body.page-id-3428 header.elementor-location-header .jet-nav-wrap{pointer-events:auto}body.page-id-3428 .elementor-element-kdk1001{padding:0}body.page-id-3428 footer.elementor-location-footer{display:none}@media(max-width:900px){.kdml .yazi{top:calc(var(--hdr,110px) + 12px)}}body.kd-tam .elementor-location-header .menu-item-link, body.kd-tam .elementor-location-header .trp-language-switcher-container a{ background-color:rgba(255,255,255,.12) !important;color:#F2F1EE !important; border-radius:2px}@media(max-width:900px){body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav .menu-item.kd-en-satir{ display:flex;align-items:center;justify-content:space-between;gap:14px}body.kd-tam .jet-nav-wrap.jet-mobile-menu .kd-en-satir .trp-language-switcher-container{margin-left:auto;flex:0 0 auto}body.kd-tam .jet-nav-wrap.jet-mobile-menu .kd-en-satir .trp-language-switcher-container{align-self:center !important}body.kd-tam .jet-nav-wrap.jet-mobile-menu .kd-en-satir .trp-language-switcher-container .menu-item-link{ background-color:transparent !important; color:#B9B5B0 !important; border:1px solid rgba(255,255,255,.22) !important; border-radius:3px !important; padding:6px 12px !important; font-size:12.5px !important; line-height:1 !important; letter-spacing:.06em !important; min-height:0 !important;height:auto !important; align-self:center !important}body.kd-tam .jet-nav-wrap.jet-mobile-menu .kd-en-satir .trp-language-switcher-container .menu-item-link:hover{ color:#F2F1EE !important;border-color:#C9704F !important}body.kd-tam .elementor-location-header .menu-mobile-lang-container:empty, body.kd-tam .elementor-location-header .jet-nav-wrap.m-layout-mobile:not(:has(.trp-language-switcher-container)){ display:none}body.kd-tam .jet-nav-wrap.jet-mobile-menu .kd-en-satir .trp-language-switcher-container .menu-item-link{ width:auto !important;min-width:44px; justify-content:center;text-align:center}}body.kd-tam .elementor-location-header .e-n-menu-icon svg:hover *{fill:#C9704F}body.kd-tam .elementor-location-header .e-n-menu-content{ background-color:#1B1D22 !important; border-top:1px solid rgba(255,255,255,.10)}body.kd-tam .elementor-location-header .e-n-menu-content a{color:#F2F1EE}body.kd-tam .elementor-location-header .e-n-menu-content a:hover{color:#C9704F}body.kd-tam .elementor-location-header .menu-item-link:hover{ background-color:rgba(201,112,79,.85) !important}body.kd-tam .elementor-location-header .jet-nav__mobile-trigger:hover svg *{ fill:#C9704F !important}body.kd-tam .jet-mobile-menu-cont, body.kd-tam .jet-nav--mobile, body.kd-tam .jet-nav__mobile-container, body.kd-tam .elementor-location-header .jet-nav-wrap.jet-mobile-menu ul{ background-color:#1B1D22 !important}body.kd-tam .jet-nav--mobile a, body.kd-tam .jet-nav__mobile-container a{color:#F2F1EE !important}body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav{ background-color:#1B1D22 !important; border-top:1px solid rgba(255,255,255,.12); box-shadow:0 14px 34px rgba(0,0,0,.5)}body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav .menu-item-link, body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav a{ background-color:transparent !important;color:#F2F1EE !important}body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav a:hover, body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav .menu-item-link:hover{ color:#C9704F !important}body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav .jet-nav__item + .jet-nav__item, body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav .menu-item + .menu-item{ border-top:1px solid rgba(255,255,255,.07)}body.kd-tam, html:has(body.kd-tam){background-color:#22242A !important}body.kd-tam .jet-nav-wrap.jet-mobile-menu .jet-nav{ position:fixed !important;top:var(--hdrAlt,160px) !important; left:0 !important;right:0 !important;width:100vw !important;max-width:100vw !important}<\/style>\n<div class=\"kdml\" id=\"kdml\"><div class=\"harita\" id=\"kdmlHarita\"><\/div>\n<div class=\"golge\" aria-hidden=\"true\"><\/div>\n<div class=\"golge-sag\" aria-hidden=\"true\"><\/div>\n<aside class=\"yazi\" id=\"yazi\"><h1>Kad\u0131k\u00f6y'de Kentsel D\u00f6n\u00fc\u015f\u00fcm<\/h1>\n<p>Kad\u0131k\u00f6y'de, \u00f6zellikle Ba\u011fdat Caddesi hatt\u0131nda, kentsel d\u00f6n\u00fc\u015f\u00fcm tek parselde ba\u015fl\u0131yor: emsal, \u00e7ekme mesafesi ve belediyenin de\u011fi\u015fen proje tasdik yakla\u015f\u0131m\u0131 bir arsan\u0131n ka\u00e7 daire \u00fcretebilece\u011fini daha ilk g\u00fcn sabitliyor. Projenin ba\u015far\u0131s\u0131 bu sabit hacmin, ortak alanlar\u0131 en aza indirerek, y\u00f6netmeliklerin izin verdi\u011fi en verimli \u015fekilde kullan\u0131lmas\u0131na ba\u011fl\u0131. Ofisimiz Suadiye'de, buradaki apartmanlar\u0131n \u00e7o\u011fu y\u00fcr\u00fcyerek gidilecek mesafede. T\u00fcm T\u00fcrkiye'de konut yerle\u015fimlerinden tek parsele kadar tasarlad\u0131\u011f\u0131m\u0131z alan 1.200.000m\u00b2'yi a\u015ft\u0131.<\/p>\n\n<details class=\"devam\"><summary><span class=\"art\" aria-hidden=\"true\"><\/span><span class=\"kapali\">Devam\u0131n\u0131 oku<\/span><span class=\"acikm\">K\u0131salt<\/span><\/summary><div class=\"metin\">\n<p>Riskli yap\u0131 karar\u0131ndan ruhsata giden takvimde mimari proje sonda de\u011fil t\u00fcm s\u00fcre\u00e7te canl\u0131 olarak durur. T\u00fcm s\u00fcrecin ba\u015f\u0131nda kat maliklerinin \u00f6n\u00fcne konan payla\u015f\u0131m tablosu en b\u00fcy\u00fck proje karar\u0131d\u0131r; kimin hangi kata, hangi cepheye ge\u00e7ece\u011fi ruhsatlanacak mimari projenin belkemi\u011fini olu\u015fturur.<\/p>\n<p>Ortaya \u00e7\u0131kan projenin de kal\u0131c\u0131 bir niteli\u011fi vard\u0131r; kentsel d\u00f6n\u00fc\u015f\u00fcm imar hakk\u0131n\u0131 sonuna kadar kulland\u0131\u011f\u0131 i\u00e7in bu binalar\u0131n d\u00fczenlenecek yeni bir imar art\u0131\u015f\u0131 planlamas\u0131 haricinde yeniden yap\u0131m ihtimali \u00e7ok az.<\/p><p>Kad\u0131k\u00f6y'de hak sahipleri ile yap\u0131lan g\u00f6r\u00fc\u015fmeler de ba\u015fka yerlerdekine benzemiyor. Apartman sakinleri \u00e7o\u011fu zaman binalar\u0131n\u0131n hangi y\u0131l ve kimin taraf\u0131ndan yap\u0131ld\u0131\u011f\u0131n\u0131 biliyorlar; giri\u015f hol\u00fcndeki mozai\u011fi ya da cephedeki \u00e7i\u00e7ekli\u011fi savunuyor, kendi prestijini \u00fcreten cephe karakteri ar\u0131yor, daire say\u0131s\u0131ndan \u00f6nce yap\u0131n\u0131n sokakta nas\u0131l duraca\u011f\u0131n\u0131 soruyorlar.<\/p>\n<p>Ada ve yerle\u015fim \u00f6l\u00e7e\u011findeki i\u015fler <a href=\"https:\/\/bfta.com.tr\/projeler\/\">projeler sayfas\u0131nda<\/a>; kentsel d\u00f6n\u00fc\u015f\u00fcm s\u00fcrecinin mevzuat taraf\u0131 ve devam\u0131 <a href=\"https:\/\/bfta.com.tr\/2026\/07\/29\/kadikoy-kentsel-donusum-bagdat-caddesi-mimari-ruhsat-sureci\/\">blogda<\/a>.<\/p>\n<\/div><\/details>\n<details class=\"kd-liste\">\n<summary><span class=\"art\" aria-hidden=\"true\"><\/span>T\u00fcm yap\u0131lar (65)<\/summary>\n<h3 id=\"bostanci\">Bostanc\u0131 <span>1 yap\u0131<\/span><\/h3>\n<p data-no=\"14\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/mutlus-apartmani\/\">Mutlu\u015f Apt.<\/a> \u2014 Yazmac\u0131 Tahir Soka\u011f\u0131<\/p>\n<h3 id=\"caddebostan\">Caddebostan <span>15 yap\u0131<\/span><\/h3>\n<p data-no=\"44\" role=\"button\" tabindex=\"0\">Aksoy Apt. \u2014 Ethem Efendi Caddesi<\/p>\n<p data-no=\"59\" role=\"button\" tabindex=\"0\">Atalay Apt. \u2014 Re\u015fit Belgesay Soka\u011f\u0131<\/p>\n<p data-no=\"13\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/atike-hanim-apartmani\/\">Atike Han\u0131m Apt.<\/a> \u2014 Caddebostan Plajyolu Sokak<\/p>\n<p data-no=\"39\" role=\"button\" tabindex=\"0\">Ba\u011fdat 288 \u2014 Ba\u011fdat Caddesi<\/p>\n<p data-no=\"26\" role=\"button\" tabindex=\"0\">Demet Apt. \u2014 Operat\u00f6r Cemil Topuzlu Caddesi<\/p>\n<p data-no=\"6\" role=\"button\" tabindex=\"0\">G\u00fcn Apt. \u2014 Caddebostan \u0130skele Soka\u011f\u0131<\/p>\n<p data-no=\"53\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/hakki-bey-apartmani\/\">Hakk\u0131 Bey Apt.<\/a> \u2014 Operat\u00f6r Cemil Topuzlu Caddesi<\/p>\n<p data-no=\"38\" role=\"button\" tabindex=\"0\">\u0130skele Apt. \u2014 Og\u00fcn Soka\u011f\u0131<\/p>\n<p data-no=\"23\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/sadikoglu-kaya-apt\/\">Kaya Apt.<\/a> \u2014 Papatyal\u0131 Soka\u011f\u0131<\/p>\n<p data-no=\"52\" role=\"button\" tabindex=\"0\">Og\u00fcn Apt. \u2014 Og\u00fcn Soka\u011f\u0131<\/p>\n<p data-no=\"55\" role=\"button\" tabindex=\"0\">R\u0131za Bey Apt. \u2014 Hamiyet Y\u00fcceses Soka\u011f\u0131<\/p>\n<p data-no=\"2\" role=\"button\" tabindex=\"0\">Saadet Apt. \u2014 Kemal Sunal Soka\u011f\u0131<\/p>\n<p data-no=\"36\" role=\"button\" tabindex=\"0\">Sema Apt. \u2014 Mehtap Soka\u011f\u0131<\/p>\n<p data-no=\"60\" role=\"button\" tabindex=\"0\">T\u00fcreg\u00fcn Apt. \u2014 G\u00f6k\u00e7e Soka\u011f\u0131<\/p>\n<p data-no=\"21\" role=\"button\" tabindex=\"0\">100. Y\u0131l Apt. \u2014 Nurettin Ali Berkol Soka\u011f\u0131<\/p>\n<h3 id=\"erenkoy\">Erenk\u00f6y <span>1 yap\u0131<\/span><\/h3>\n<p data-no=\"54\" role=\"button\" tabindex=\"0\">Ata Apt. \u2014 Nevzad Ayasbeyo\u011flu Soka\u011f\u0131<\/p>\n<h3 id=\"fenerbahce\">Fenerbah\u00e7e <span>15 yap\u0131<\/span><\/h3>\n<p data-no=\"47\" role=\"button\" tabindex=\"0\">Ar\u0131m Apt. \u2014 Dr. Faruk Ayano\u011flu Caddesi<\/p>\n<p data-no=\"12\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/yuksel-begum-apartmani\/\">Beg\u00fcm Apt.<\/a> \u2014 Ku\u015flu \u00c7\u0131kmaz\u0131<\/p>\n<p data-no=\"31\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/deniz-apartmani\/\">Deniz Apt.<\/a> \u2014 Operat\u00f6r Cemil Topuzlu Caddesi<\/p>\n<p data-no=\"63\" role=\"button\" tabindex=\"0\">Derya Apt. \u2014 Ahmet Mithat Efendi Caddesi<\/p>\n<p data-no=\"3\" role=\"button\" tabindex=\"0\">G\u00fclizar Apt. \u2014 G\u00fclizar Soka\u011f\u0131<\/p>\n<p data-no=\"1\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/huzur-apartmani\/\">Huzur Apt.<\/a> \u2014 Kuyu Soka\u011f\u0131<\/p>\n<p data-no=\"11\" role=\"button\" tabindex=\"0\">Koru Apt. \u2014 Fener Kalam\u0131\u015f Caddesi<\/p>\n<p data-no=\"10\" role=\"button\" tabindex=\"0\">Nilg\u00fcn Apt.<\/p>\n<p data-no=\"29\" role=\"button\" tabindex=\"0\">O\u011fult\u00fcrk Apt. \u2014 Fener Kalam\u0131\u015f Caddesi<\/p>\n<p data-no=\"65\" role=\"button\" tabindex=\"0\">Poyraz Apt. \u2014 Demet Soka\u011f\u0131<\/p>\n<p data-no=\"9\" role=\"button\" tabindex=\"0\">Poyraz Apt. \u2014 Fuat Pa\u015fa Caddesi<\/p>\n<p data-no=\"28\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/sadiye-hanim-apartmani\/\">Sadiye Han\u0131m Apt.<\/a> \u2014 Gazi Mehmet\u00e7ik Soka\u011f\u0131<\/p>\n<p data-no=\"66\" role=\"button\" tabindex=\"0\">Sorgut Apt. \u2014 Operat\u00f6r Cemil Topuzlu Caddesi<\/p>\n<p data-no=\"49\" role=\"button\" tabindex=\"0\">\u015eeyda Apt. \u2014 Mahur Soka\u011f\u0131<\/p>\n<p data-no=\"24\" role=\"button\" tabindex=\"0\">Yeni Defne Apt. \u2014 Dr. Faruk Ayano\u011flu Caddesi<\/p>\n<h3 id=\"feneryolu\">Feneryolu <span>7 yap\u0131<\/span><\/h3>\n<p data-no=\"17\" role=\"button\" tabindex=\"0\">Acar Apt. \u2014 Kuyuba\u015f\u0131 Soka\u011f\u0131<\/p>\n<p data-no=\"20\" role=\"button\" tabindex=\"0\">Aral Apt. \u2014 Feneryolu Soka\u011f\u0131<\/p>\n<p data-no=\"33\" role=\"button\" tabindex=\"0\">Arzum Apt. \u2014 Sel\u00e7uk Simdal Soka\u011f\u0131<\/p>\n<p data-no=\"7\" role=\"button\" tabindex=\"0\">Feneryolu Apt. \u2014 Muderris Ziya Soka\u011f\u0131<\/p>\n<p data-no=\"57\" role=\"button\" tabindex=\"0\">G\u00fcrmen Apt. \u2014 Gezgin Soka\u011f\u0131<\/p>\n<p data-no=\"4\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/metro-home\/\">Metro Home<\/a> \u2014 Selvi \u00c7\u0131kmaz\u0131<\/p>\n<p data-no=\"18\" role=\"button\" tabindex=\"0\">Taylan Apt. \u2014 Yaz\u0131c\u0131ba\u015f\u0131 Soka\u011f\u0131<\/p>\n<h3 id=\"goztepe\">G\u00f6ztepe <span>10 yap\u0131<\/span><\/h3>\n<p data-no=\"64\" role=\"button\" tabindex=\"0\">Can &amp; Selma Apt. \u2014 T\u00fct\u00fcnc\u00fc Mehmet Efendi Caddesi<\/p>\n<p data-no=\"43\" role=\"button\" tabindex=\"0\">Derg\u00e2h Apt. \u2014 T\u00fct\u00fcnc\u00fc Mehmet Efendi Caddesi<\/p>\n<p data-no=\"16\" role=\"button\" tabindex=\"0\">\u0130ftar Apt. \u2014 Fahrettin Kerim G\u00f6kay Caddesi<\/p>\n<p data-no=\"42\" role=\"button\" tabindex=\"0\">Korman Apt. \u2014 T\u00fct\u00fcnc\u00fc Mehmet Efendi Caddesi<\/p>\n<p data-no=\"37\" role=\"button\" tabindex=\"0\">Ne\u015fe Apt. \u2014 G\u00fcven\u00e7 Soka\u011f\u0131<\/p>\n<p data-no=\"19\" role=\"button\" tabindex=\"0\">\u00d6merpa\u015fa Apt. \u2014 \u00d6merpa\u015fa Soka\u011f\u0131<\/p>\n<p data-no=\"51\" role=\"button\" tabindex=\"0\">Salman Apt. \u2014 Avc\u0131 Soka\u011f\u0131<\/p>\n<p data-no=\"40\" role=\"button\" tabindex=\"0\">Sefa Apt. \u2014 Kaptan \u0130hsan Soka\u011f\u0131<\/p>\n<p data-no=\"50\" role=\"button\" tabindex=\"0\">Toprak Apt. \u2014 \u00d6merpa\u015fa Soka\u011f\u0131<\/p>\n<p data-no=\"34\" role=\"button\" tabindex=\"0\">Y\u0131llar Apt. \u2014 Cavitpa\u015fa soka\u011f\u0131<\/p>\n<h3 id=\"kozyatagi\">Kozyata\u011f\u0131 <span>2 yap\u0131<\/span><\/h3>\n<p data-no=\"48\" role=\"button\" tabindex=\"0\">G\u00fcnaltay Apt. \u2014 \u015eemsettin G\u00fcnaltay Caddesi<\/p>\n<p data-no=\"62\" role=\"button\" tabindex=\"0\">P\u0131nar Apt. \u2014 Sinan Ercan Caddesi<\/p>\n<h3 id=\"merdivenkoy\">Merdivenk\u00f6y <span>2 yap\u0131<\/span><\/h3>\n<p data-no=\"15\" role=\"button\" tabindex=\"0\">Kur\u00e7 Apt. \u2014 Hamle Soka\u011f\u0131<\/p>\n<p data-no=\"35\" role=\"button\" tabindex=\"0\">Ulusan Apt. \u2014 \u015eair Ar\u015fi Caddesi<\/p>\n<h3 id=\"suadiye\">Suadiye <span>10 yap\u0131<\/span><\/h3>\n<p data-no=\"32\" role=\"button\" tabindex=\"0\">Candan Apt. \u2014 Selim Rag\u0131p Eme\u00e7 Soka\u011f\u0131<\/p>\n<p data-no=\"58\" role=\"button\" tabindex=\"0\">Fuat Pa\u015fa Apt. \u2014 Hamiyet Y\u00fcceses Soka\u011f\u0131<\/p>\n<p data-no=\"8\" role=\"button\" tabindex=\"0\">Huzur Apt. \u2014 Ay\u015fe \u00c7avu\u015f Caddesi<\/p>\n<p data-no=\"22\" role=\"button\" tabindex=\"0\">Kaya Apt. \u2014 Nurettin Ali Berkol Soka\u011f\u0131<\/p>\n<p data-no=\"30\" role=\"button\" tabindex=\"0\">K\u0131rlang\u0131\u00e7 Apt. \u2014 Yazanlar Soka\u011f\u0131<\/p>\n<p data-no=\"27\" role=\"button\" tabindex=\"0\">Kilim Apt. \u2014 Selim Rag\u0131p Eme\u00e7 Soka\u011f\u0131<\/p>\n<p data-no=\"56\" role=\"button\" tabindex=\"0\">Manolya Apt. \u2014 Hamiyet Y\u00fcceses Soka\u011f\u0131<\/p>\n<p data-no=\"41\" role=\"button\" tabindex=\"0\">Nas\u0131r Apt. \u2014 M\u00fccahit Soka\u011f\u0131<\/p>\n<p data-no=\"25\" role=\"button\" tabindex=\"0\">Sahil Apt. \u2014 Plaj Yolu Soka\u011f\u0131<\/p>\n<p data-no=\"45\" role=\"button\" tabindex=\"0\">\u00dclk\u00fc Apt. \u2014 \u00dclk\u00fc Soka\u011f\u0131<\/p>\n<h3 id=\"zuhtupasa\">Z\u00fcht\u00fcpa\u015fa <span>2 yap\u0131<\/span><\/h3>\n<p data-no=\"5\" role=\"button\" tabindex=\"0\"><a href=\"https:\/\/bfta.com.tr\/proje\/intaya-kiziltoprak-apartmani\/\">K\u0131z\u0131ltoprak Apt.<\/a> \u2014 Mevsim \u00c7\u0131kmaz\u0131<\/p>\n<p data-no=\"46\" role=\"button\" tabindex=\"0\">Park Apt. \u2014 Kolej Soka\u011f\u0131<\/p>\n<p class=\"basa\"><button type=\"button\" class=\"basadon\">Ba\u015fa d\u00f6n<\/button><\/p>\n<\/details>\n<\/aside>\n<div class=\"balon\" id=\"balon\"><img class=\"gor\" id=\"kartg\" alt=\"\"><div class=\"pmetin\"><div class=\"ad\" id=\"kartad\"><\/div><div class=\"isv\" id=\"kartisv\"><\/div><\/div><\/div>\n<div class=\"kumanda\"><div class=\"mahaller\" id=\"mahaller\"><\/div><div class=\"atif\">\u00a9 OpenStreetMap katk\u0131c\u0131lar\u0131 (ODbL) \u00b7 KEOS<\/div><\/div>\n<div class=\"olcum\" id=\"olcum\">y\u00fckleniyor<\/div>\n<div class=\"kadraj\" id=\"kadraj\"><\/div>\n<div class=\"yukleyici\" id=\"yukleyici\"><div class=\"say\" id=\"kdmlSay\">00<\/div><span>Kad\u0131k\u00f6y 3B<\/span><\/div>\n<script>\n\/* 99. tur (Fuat: 'loading sayfasi marseille gibi olsun, onde durmasinin bir anlami olsun, belki arkada tile'lari da\n   daha iyi yukleriz'): veri artik ENGELLEYICI <script> ile degil fetch + ReadableStream ile iner; sayac inen bayti\n   Content-Length'e boler, yani GERCEK ilerleme. Indirme %0-78, cozme %78-86, karo isitma %86-100.\n   Akis desteklenmezse duz fetch'e duser; fetch de yoksa eski <script> yolu kullanilir. *\/\n(function () {\n  var e = document.getElementById('kdmlSay'); if (!e) return;\n  \/* 100. tur (Fuat: 'loader gercek yuku gostermesin, bir sayac mantiginda ritmik olarak 1 sn civari 00-99 arasi\n     saysin sonra fade out olsun'): sayac yuk ilerlemesine BAGLI DEGIL \u2014 10 ms'de bir artar, tam bir tur 1 saniye.\n     Harita hazir olsa bile icinde bulundugu turu 99'a kadar tamamlar, sonra perde kapanir; hazir degilse turu\n     bastan alir. Boylece ritim hep ayni, bitis her zaman 99'da. *\/\n  var n = 0, hazir = false;\n  function yaz(v) { e.textContent = (v < 10 ? '0' : '') + v; }\n  \/* 101. tur (Fuat: 'bizim sitenin font ailesi lutfen'): marka fontu (Typekit neue-haas-unica) ilk boyamada hazir\n     olmayabiliyor, rakam once yedek sans ile basip sonra ziplyordu. Rakam fontu yuklenene kadar (en cok 400 ms)\n     gorunmez; sonra acilir. *\/\n  (function fontBekle() {\n    function ac() { e.classList.add('gel'); }\n    if (document.fonts && document.fonts.load) {\n      var bitti = false;\n      document.fonts.load('700 88px \"neue-haas-unica\"').then(function () { if (!bitti) { bitti = true; ac(); } });\n      setTimeout(function () { if (!bitti) { bitti = true; ac(); } }, 400);\n    } else ac();\n  })();\n  window.kdmlIlerle = function () {};   \/* gercek ilerleme artik gosterilmiyor; cagri yerleri bozulmasin diye duruyor *\/\n  var iv = setInterval(function () {\n    n++;\n    if (n > 99) {\n      if (hazir) { clearInterval(iv); yaz(99); setTimeout(function () { if (window.kdmlYukKapat) window.kdmlYukKapat(); }, 220); return; }   \/* 101. tur: 99'da kisa duraklama, sonra yumusak cikis *\/\n      n = 0;\n    }\n    yaz(n);\n  }, 10);\n  window.kdmlSayBit = function () { hazir = true; };\n  window.kdmlVeriYukle = function (tamam) {\n    var url = window.KDML_VERI_URL;\n    if (!url || typeof fetch !== 'function') { tamam(false); return; }\n    function coz(metin) {\n      window.kdmlIlerle(0.80);\n      setTimeout(function () {\n        try { window.KDS = JSON.parse(metin.slice(metin.indexOf('=') + 1, metin.lastIndexOf(';'))); }\n        catch (h) { tamam(false); return; }\n        window.kdmlIlerle(0.86); tamam(true);\n      }, 16);\n    }\n    \/* 103. tur: head'deki <link rel=preload as=fetch crossorigin> ile ESLESMESI icin varsayilan kimlik kipi\n       (mode cors, credentials same-origin) kullanilir. credentials:'omit' idi ve tarayici preload'u kullanmayip\n       dosyayi IKI KEZ indiriyordu (konsol: 'request credentials mode does not match'). *\/\n    fetch(url).then(function (y) {\n      if (!y.ok) { tamam(false); return; }\n      var top = parseInt(y.headers.get('Content-Length') || '0', 10);\n      if (!y.body || !y.body.getReader || !top) { y.text().then(coz); return; }\n      var oku = y.body.getReader(), parcalar = [], inen = 0;\n      (function tik() {\n        oku.read().then(function (r) {\n          if (r.done) {\n            var hep = new Uint8Array(inen), k = 0;\n            parcalar.forEach(function (c) { hep.set(c, k); k += c.length; });\n            coz(new TextDecoder('utf-8').decode(hep)); return;\n          }\n          parcalar.push(r.value); inen += r.value.length;\n          window.kdmlIlerle(0.78 * inen \/ top); tik();\n        }).catch(function () { tamam(false); });\n      })();\n    }).catch(function () { tamam(false); });\n  };\n})();\n<\/script><\/div>\n<script src=\"https:\/\/bfta.com.tr\/wp-content\/uploads\/kd\/kd-lib-maplibre5.24.0-417d8508.js\"><\/script>\n<script>window.KDML_VERI_URL = \"https:\/\/bfta.com.tr\/wp-content\/uploads\/kd\/kd-veri-c-1d60be4fd0.js\";<\/script>\n<script>(function kdmlBasla() {\n  document.body.classList.add('kd-tam');\n  function headerOlc() {\n    var h = document.querySelector('.elementor-location-header') || document.querySelector('header');\n    document.documentElement.style.setProperty('--hdr', (h ? Math.round(h.getBoundingClientRect().height) : 0) + 'px');\n    document.documentElement.style.setProperty('--hdrAlt', (h ? Math.round(h.getBoundingClientRect().bottom) : 0) + 'px');\n  }\n  headerOlc(); window.addEventListener('load', headerOlc); window.addEventListener('resize', headerOlc);\n  \/* 54. tur: mobil EN etiketi hamburger menusunun ilk satirina (3428 enTasi ile ayni) *\/\n  function enTasi() {\n    if (window.innerWidth > 900) return;\n    var panel = document.querySelector('.jet-nav-wrap.jet-mobile-menu .jet-nav'); if (!panel) return;\n    var satir = panel.querySelector('.menu-item'); if (!satir || satir.querySelector('.trp-language-switcher-container')) return;\n    var en = document.querySelector('.jet-nav-wrap.m-layout-mobile .trp-language-switcher-container'); if (!en || en === satir) return;\n    satir.appendChild(en); satir.classList.add('kd-en-satir');\n  }\n  enTasi(); window.addEventListener('load', enTasi); window.addEventListener('resize', enTasi);\n  var _ht = document.querySelector('.jet-nav__mobile-trigger'); if (_ht) _ht.addEventListener('click', function () { setTimeout(enTasi, 60); });\n  if (\/(^|[?&])yazi=0(&|$)\/.test(location.search)) { var _y = document.getElementById('yazi'); if (_y) _y.style.display = 'none'; }\n\n  \/* 99. tur: veri fetch ile iniyor; gelmediyse once onu bekle, sonra bu islev bastan kosar *\/\n  if (typeof KDS === 'undefined' && window.KDML_VERI_URL && window.kdmlVeriYukle) {\n    window.kdmlVeriYukle(function (ok) { if (ok) kdmlBasla(); });\n    return;\n  }\n  \/* 115. tur (Fuat: 'ATLA, Devam\u0131n\u0131 oku, K\u0131salt, T\u00fcm\u00fc gibi t\u00fcmceleri EN'de \u0130ngilizce g\u00f6relim'): bu dizeler\n     aray\u00fcz\u00fcn kendi metni ve JS ile kuruluyor; TranslatePress yaln\u0131z sunucudan bas\u0131lan HTML'i \u00e7eviriyor, bu y\u00fczden\n     EN sayfada T\u00fcrk\u00e7e kal\u0131yorlard\u0131. Mahalle adlar\u0131, PLAN ve y\u00fckleyici metni Fuat'\u0131n iste\u011fiyle DI\u015eARIDA. *\/\n  var kdmlEN = \/^en\/i.test(document.documentElement.lang || '') || \/^\\\/en(\\\/|$)\/.test(location.pathname);\n  function kdmlS(tr, en) { return kdmlEN ? en : tr; }\n\n  \/* VERI COZUCU (27. tur, optimizasyon): site verisi sikistirilmis (var KDS, kdml-paket.py): koordinatlar\n     koleksiyon basina q nicemli tamsayi deltalar. Burada GeoJSON'a acilir; olcum 998 KB gz -> 495 KB. *\/\n  function kdmlAc(D) {\n    var V = { mrk: D.mrk, renk: D.renk };\n    function halka(a, q, o) { var out = [], x = o[0], y = o[1]; for (var i = 0; i < a.length; i += 2) { x += a[i]; y += a[i + 1]; out.push([x * q, y * q]); } return out; }\n    Object.keys(D).forEach(function (k) {\n      if (k === 'mrk' || k === 'renk' || k === 'mahAd') return;   \/* 90. tur: mahAd koleksiyon degil, mahalle adi tablosu *\/\n      var C = D[k], q = C.q, o = C.o, fs = [];\n      for (var i = 0; i < C.g.length; i++) {\n        var g = C.g[i], geo;\n        if (Array.isArray(g)) geo = { type: 'Polygon', coordinates: g.map(function (r) { return halka(r, q, o); }) };\n        else if (g.m) geo = { type: 'MultiPolygon', coordinates: g.m.map(function (poly) { return poly.map(function (r) { return halka(r, q, o); }); }) };\n        else if (g.l) geo = { type: 'LineString', coordinates: halka(g.l, q, o) };\n        else if (g.ml) geo = { type: 'MultiLineString', coordinates: g.ml.map(function (l) { return halka(l, q, o); }) };\n        else geo = { type: 'Point', coordinates: halka(g.p, q, o)[0] };\n        fs.push({ type: 'Feature', properties: C.p[i], geometry: geo });\n      }\n      V[k] = { type: 'FeatureCollection', features: fs };\n    });\n    return V;\n  }\n  \/* 90. tur: paket KDML_SIK ile kuculduyse bina ozellikleri burada tamamlanir (h = kat x 3,18; m = mahalle adi).\n     Eski paketlerde mahAd yok, hicbir sey yapilmaz \u2014 iki bicim de acilir. *\/\n  function kdmlTamamla(W, D) {   \/* 90. tur: parametre adi V OLMAZ \u2014 site derlemesi 'KDML.' gecislerini KDML. yapiyor *\/\n    if (!D.mahAd || !W.binalar) return W;\n    W.binalar.features.forEach(function (f) { var q = f.properties; q.m = D.mahAd[q.m]; q.h = Math.round(q.kat * 3.18 * 10) \/ 10; });\n    return W;\n  }\n  if (typeof KDS !== 'undefined') window.KDML = kdmlTamamla(kdmlAc(KDS), KDS);\n  var C = { kara: '#22242A', deniz: '#0B1428',   \/* 29. tur: daha koyu lacivert *\/ park: '#282D2B', yol: '#4A4E55', kontur: '#3A3E45',\n            ray: '#6B7079', minibus: '#71767F', bagdatKilif: 'rgba(232,230,226,.16)', bagdatCekirdek: '#9AA0A8',\n            cati: '#C9C7C2', catiSoluk: '#B4B2AE', duvarSoluk: '#7C7975', biz: '#C9704F', doku: '#2C3036', isaret: '#C9704F', bekleyen: '#3D3E43' };   \/* 99. tur: filtre kalkti, yukselmemis bina bu renkte duz cizilir *\/\n  \/* 68. tur: gezinme siniri yukseltilen binalarin kutusu (ilce kutusu degil) *\/\n  var binaKutu = (function () { var k = [999, 999, -999, -999]; KDML.binalar.features.forEach(function (f) { (f.geometry.type === 'Polygon' ? f.geometry.coordinates[0] : f.geometry.coordinates[0][0]).forEach(function (q) { k[0] = Math.min(k[0], q[0]); k[1] = Math.min(k[1], q[1]); k[2] = Math.max(k[2], q[0]); k[3] = Math.max(k[3], q[1]); }); }); return k; })();\n  var ilceKutu = (function () {\n    var b = [999, 999, -999, -999];\n    KDML.ilce.features[0].geometry.coordinates[0].forEach(function (p) {\n      b[0] = Math.min(b[0], p[0]); b[1] = Math.min(b[1], p[1]); b[2] = Math.max(b[2], p[0]); b[3] = Math.max(b[3], p[1]);\n    });\n    return b;\n  })();\n  \/* ACILIS = canvas'taki olculmus kare (sahne.js ACILIS: tx -853 m, ty +834 m mrk'ye gore,\n     dist 4809 m, egim 30 -> pitch 60, yon 255 -> bearing 75; Bagdat Caddesi kosegene yakin).\n     Zoom mesafeden: canvas dusey gorus 30 derece, hedef duzleminde gorunen yukseklik\n     2*d*tan(15) = 2577 m; MapLibre'de ayni yukseklik kap yuksekligine bolunur. *\/\n  var kx = 111320 * Math.cos(KDML.mrk[1] * Math.PI \/ 180), ky = 110540;\n  \/* 41. tur (Fuat, 16 Eyl: 'yeni bitis karesi budur'): ekran goruntusunden eslestirildi \u2014 merkez Caddebostan\n     (mrk +238\/-208 m), 5100 m, egim 58, yon 60. Eski kanvas karesi: -853\/+834, 4809, 60, 75. *\/\n  \/* 44. tur (Fuat, HUD'dan okudu): merkez mrk -873\/+622 m, mesafe 3763 m, egim 60, yon 84 *\/\n  var ACILIS = { center: [KDML.mrk[0] - 873 \/ kx, KDML.mrk[1] + 622 \/ ky], dist: 3763, pitch: 60, bearing: 84 };\n  \/* ACILIS UCUSU (Fuat, 15 Eyl aksam: \"orbit Bostanci ustunden baslasin, Moda'ya dogru ucsun, Bagdat\n     Caddesi odakta kalsin\"): ilk kare Bagdat Caddesi'nin Bostanci ucunda (Mutlus'a en yakin cadde noktasi,\n     mrk'ye gore +2249\/-1678 m'nin 350 m batisi: +1960\/-1481; Fuat: \"biraz daha yakin ve Bostanci odakli,\n     Maltepe'yi gormek istemiyorum\") ve 3000 m'den bakar; cadde boyunca ACILIS merkezine (Goztepe) suzulurken\n     4809 m'ye acilir: 3,7 km, 36 s, dogrusal (\"hizi yavaslayabilir\"). Ilk etkilesimde iptal; boy degisince\n     kalan yol ayni hizla surer (ACILIS.zoom da ayni log2 kaymasini alir). *\/\n  \/* 12. tur: Maltepe hala goruluyordu -> baslangic 500 m daha batida (+1546\/-1200) ve ilk bakis 9 derece\n     batiya (bearing 66); ucus boyunca 75'e doner. *\/\n  var UCUS = { bas: [KDML.mrk[0] + 1546 \/ kx, KDML.mrk[1] - 1200 \/ ky], dist: 2350, bearing: 75, sure: 24200, gecikme: 300 };   \/* 47. tur: %10 hizli (26,6 -> 24,2 s) *\/   \/* 44. tur: oranli \u2014 mesafe 0,62 x 3763, yon 84-9 *\/   \/* 41. tur: onceki kurulum oranli \u2014 mesafe 0,62 x bitis, yon bitis-9 *\/   \/* 36. tur: ucus hemen *\/   \/* 27. tur: %15 kisa *\/   \/* 25. tur: baslik fade-out'u (2400) basladiginda ucus 1 s'dir surer *\/   \/* 20. tur: 36 s -> 31,3 s (%15 hizli, Fuat) *\/\n  function zoomMesafeden(d, H) {\n    var mpp = 2 * d * Math.tan(15 * Math.PI \/ 180) \/ Math.max(400, H);\n    return Math.log2(40075016 * Math.cos(ACILIS.center[1] * Math.PI \/ 180) \/ (512 * mpp));\n  }\n  ACILIS.zoom = zoomMesafeden(ACILIS.dist, document.getElementById('kdmlHarita').clientHeight || 800);\n  UCUS.zoom = zoomMesafeden(UCUS.dist, document.getElementById('kdmlHarita').clientHeight || 800);\n  \/* Giris durumu haritadan ONCE (15. tur): yoksa 1 MB kutuphane + veri inene kadar yazi gorunup sonra\n     gizleniyordu (flas). Kutuphane hic inmezse bu satir calismaz, yazi normal kalir; harita hata verir ya da\n     12 s'de yuklenmezse siniflar kaldirilir. *\/\n  var kokErken = document.getElementById('kdmlHarita').parentElement;\n  kokErken.classList.add('kd-intro'); kokErken.classList.add('kd-pinsiz');\n  var introEmniyet = setTimeout(function () { kokErken.classList.remove('kd-intro'); kokErken.classList.remove('kd-pinsiz'); }, 12000);\n  \/* 102. tur (Fuat: 'harita da fade in ile gelsin'): harita kabi bastan saydam durur, perde giderken 1,4 s'de acilir.\n     Cizim etkilenmez, yalniz bilesik katman opakligi degisir. *\/\n  var map = new maplibregl.Map({\n    container: 'kdmlHarita', attributionControl: false,\n    \/* transition 0 (olculdu, 15 Eyl gece): varsayilan 300 ms kuresel gecis, herhangi bir paint degisikliginde\n       haritayi 300 ms surekli cizdiriyor (katman bazli *-transition sifirlamak YETMIYOR, isik\/kuresel\n       zamanlayici). Dalga tiki 12\/s ile 60 fps'e cikiyordu; 0 ile 12 tik = ~23 kare\/s. Solmasi istenen\n       tek sey bina rengi (mahalle secimi) \u2014 ona kendi gecisi verildi. *\/\n    style: { version: 8, transition: { duration: 0, delay: 0 }, state: { cephe: { default: -1e6 }, kiyiT: { default: 0 }, yon: { default: 84 }, odak: { default: -1 } }, sources: {}, layers: [{ id: 'bg', type: 'background', paint: { 'background-color': C.kara } }] },\n    center: UCUS.bas, zoom: UCUS.zoom, pitch: ACILIS.pitch, bearing: UCUS.bearing, maxPitch: 70,\n    \/* 17. tur (Fuat: \"harita cok uzaklasiyor, Kadikoy'le sinirli kalsin\"): minZoom 12,2 -> 13,4, kutu payi\n       0,08\/0,05 -> 0,02\/0,012 derece (yaklasik 1,7 \/ 1,3 km). *\/\n    minZoom: 12.9   \/* 85. tur: 1280x760'ta plan kadraji 13,4'e takilip kutu ustten 51 px tasiyordu; sinir kutusu zaten kisitlar *\/, maxZoom: 17.5, minPitch: 2,   \/* canvas: egim 20-88 *\/\n    maxBounds: [[binaKutu[0] - 0.018, binaKutu[1] - 0.013], [binaKutu[2] + 0.008, binaKutu[3] + 0.011]],   \/* 85. tur: dusey pay 1,4 \/ 1,2 km \u2014 genis ekranda sinir yuksekligi zoom'u kilitleyip kutuyu kesiyordu *\/   \/* 84. tur: genis ekranda gorunum sinirdan genis olunca MapLibre sinir merkezine kilitler; merkez 0,005 derece batida (bati pay 1,5 km, dogu 0,7 km) -> binalar saga *\/   \/* 74. tur (Fuat: 'Moda ustunden bakarken burun gorunmuyor'): bati 1 km, guney 0,9 km, dogu 0,85 km, kuzey 0,65 km pay *\/   \/* 68. tur (Fuat: 'zoom siniri genis'): boyanmis binalar + ~330 m pay *\/\n    antialias: true, dragRotate: false, pitchWithRotate: false,\n    \/* fadeDuration 0 (15 Eyl gece, olculdu): varsayilan 300 ms'de HER paint degisikligi 300 ms boyunca\n       ~19 kare cizdiriyor (yerlestirme\/solgunluk zamanlayicisi); dalga animasyonu 12 tik\/s ile haritayi\n       60 fps'te surekli cizdiriyordu. 0 ile tik basina 2 kare (~23 kare\/s). Sembol\/raster yok, kayip yok. *\/\n    fadeDuration: 0\n  });\n  window.map = map;\n  (function haritaSoluk() {\n    var kap = document.getElementById('kdmlHarita') || document.getElementById('kdmlHarita');\n    if (!kap) return;\n    kap.style.opacity = '0'; kap.style.transition = 'opacity 1.4s cubic-bezier(.33,0,.15,1)';\n    window.kdmlHaritaGel = function () { kap.style.opacity = '1'; };\n    setTimeout(function () { if (kap.style.opacity !== '1') kap.style.opacity = '1'; }, 9000);   \/* emniyet *\/\n  })();\n  map.on('error', function () { if (!map.loaded()) { clearTimeout(introEmniyet); kokErken.classList.remove('kd-intro'); kokErken.classList.remove('kd-pinsiz'); } });\n  map.once('load', function () { clearTimeout(introEmniyet); });\n  \/* GORUS ACISI: MapLibre varsayilani 36,87 derece, canvas 30 (TAN = tan 15). zoomMesafeden tan 15\n     ile hesaplandigindan kamera tam ACILIS.dist'te (4809 m, yerden 2405 m) durur; varsayilan acida\n     %20 yakina geliyor, yakin plan buyuyordu (Fuat, 15 Eyl: \"ilk acildiginda biraz buyuk geliyor\",\n     \"kamera yuksekligini ayni tut\"). 4.7'de setter transform'da; 5.x'te setVerticalFieldOfView. *\/\n  map.setVerticalFieldOfView(30);\n  \/* 30. tur (Fuat: \"guneybatidan 16:00 isigi\"): yuzey golgelemesi GB'den (azimut 240, yukseklik 33 -> polar 57);\n     yere dusen golgeler veride (KDML.golge, arazi-kirp.py). *\/\n  \/* 31. tur: setLight kaldirildi (Fuat: 'binalar aydinlanmasa, sadece golge atsa'); yer golgeleri KDML.golge ile kaliyor. *\/   \/* v5 resmi API (4.7'de transform.fov setter'iydi) *\/\n  \/* ORBIT: MapLibre'nin dragRotate'i KAPALI (piksel basina cok hizli, birakinca atalet;\n     kelepceyle birlesince \"orbit sonunda takiliyor\" \u2014 Fuat, 15 Eyl). Canvas surumundeki\n     orbit aynen: sag tus (ya da shift+sol) surukleme, piksel basina 0,28 derece yon ve\n     0,22 derece egim, atalet YOK, kelepce aninda (sahne.js 2003-2004). *\/\n  var ORB_YON = 0.28, ORB_EGIM = 0.22, orb = null, cvEl = map.getCanvas();\n  cvEl.addEventListener('contextmenu', function (e) { e.preventDefault(); });\n  cvEl.addEventListener('mousedown', function (e) {\n    if (!(e.button === 2 || (e.button === 0 && e.shiftKey))) return;\n    e.preventDefault(); map.stop();\n    orb = { x: e.clientX, y: e.clientY, b: map.getBearing(), p: map.getPitch() };\n    cvEl.style.cursor = 'grabbing';\n  });\n  window.addEventListener('mousemove', function (e) {\n    if (!orb) return;\n    var b = orb.b - (e.clientX - orb.x) * ORB_YON, p = orb.p - (e.clientY - orb.y) * ORB_EGIM;\n    map.jumpTo({ bearing: Math.max(YON_MIN, Math.min(YON_MAKS, b)), pitch: Math.max(2, Math.min(70, p)) });\n  });\n  window.addEventListener('mouseup', function () { if (orb) { orb = null; cvEl.style.cursor = ''; } });\n  \/* ZOOM STILI (18. tur, Fuat: \"Marseille gibi\"): egim zoom'a bagli \u2014 minZoom'da plan (0), ACILIS zoom'un\n     0,2 altindan itibaren 60; arada dogrusal. Tekerlek MapLibre'nin scrollZoom'u yerine kendi adimimizla\n     (canvas: 1,069\/cevrim, kisa ease) ve imlec altindaki nokta sabit (around). Dokunmatik pinch MapLibre'de\n     kalir, bitince egim ayni egriye oturur. Orbit (sag tus) egimi elle degistirebilir; bir sonraki zoom\n     egimi yine egriye getirir \u2014 Marseille'de egim kontrolu hic yok, bizde ikisi bir arada. *\/\n  map.scrollZoom.disable();\n  var ZOOM_ADIM = Math.log2(1.069), zoomHedef = null, egimHedef = null;\n  function egimZoom(z) { var a = map.getMinZoom(), b = ACILIS.zoom - 0.2; return 60 * Math.max(0, Math.min(1, (z - a) \/ (b - a))); }\n  \/* 78. tur (Fuat'in HUD gunlugu: 'down b0 canvas' -> hemen 'movestart-zoom' -> dragstart yok): fare basiliyken gelen\n     tekerlek (atalet\/son tik) easeTo baslatip MapLibre'nin surukleyicisini durduruyordu. Basiliyken tekerlek yok sayilir. *\/\n  var fareBasili = false, parselTetik = null;   \/* 87. tur: parsel yukleyici (asagida kurulur), kullanici zoom'unda cagrilir *\/\n  cvEl.addEventListener('mousedown', function (e) { if (e.button === 0) fareBasili = true; });\n  var sonBirakma = 0;\n  window.addEventListener('mouseup', function () { fareBasili = false; sonBirakma = performance.now(); });   \/* 79. tur: biraktiktan sonraki 300 ms'lik tekerlek kuyrugu (atalet) da dusurulur *\/\n  window.addEventListener('blur', function () { fareBasili = false; });\n  cvEl.addEventListener('wheel', function (e) {\n    e.preventDefault();\n    if (fareBasili || performance.now() - sonBirakma < 300) return;\n    var surer = zoomHedef !== null && map.isMoving();\n    var z0 = surer ? zoomHedef : map.getZoom(), p0 = surer ? egimHedef : map.getPitch(), adim = ZOOM_ADIM * Math.min(1.5, Math.abs(e.deltaY) \/ 100 || 1);   \/* ease surerken hedef birikir; duruyorsa guncel degerden *\/\n    zoomHedef = Math.max(map.getMinZoom(), Math.min(map.getMaxZoom(), z0 - Math.sign(e.deltaY) * adim));\n    \/* 23. tur (Fuat: \"egim daha azken zoom out'ta 60'a kitlenmis gibi\"): egim egrinin degerine ZIPLAMAZ,\n       egrinin o zoom araligindaki FARKI kadar degisir; kullanicinin orbitle verdigi egim korunur. *\/\n    egimHedef = Math.max(2, Math.min(70, p0 + egimZoom(zoomHedef) - egimZoom(z0)));\n    if (zoomHedef >= 14.2 && parselTetik) parselTetik();\n    var r = cvEl.getBoundingClientRect();\n    map.easeTo({ zoom: zoomHedef, pitch: egimHedef, around: map.unproject([e.clientX - r.left, e.clientY - r.top]), duration: 170, easing: function (t) { return 1 - Math.pow(1 - t, 2); } });\n  }, { passive: false });\n  var dokunZoom0 = null;\n  \/* 30. tur (Fuat: \"zoom'dan sonra pan'a gecmekte zorlaniyorum\"): suruklemeye baslarken suren ease'i durdur,\n     tekerlek hedeflerini sifirla; MapLibre'nin kendi durdurmasina birakilmiyor. *\/\n  cvEl.addEventListener('mousedown', function (e) { if (e.button === 0 && !e.shiftKey) { map.stop(); zoomHedef = null; egimHedef = null; } });\n  cvEl.addEventListener('touchstart', function () { map.stop(); zoomHedef = null; egimHedef = null; }, { passive: true });\n  map.on('zoomstart', function (e) { if (e.originalEvent && \/touch\/.test(e.originalEvent.type || '')) dokunZoom0 = map.getZoom(); });\n  map.on('zoomend', function (e) { if (dokunZoom0 !== null) { var d = egimZoom(map.getZoom()) - egimZoom(dokunZoom0); dokunZoom0 = null; if (map.getZoom() >= 14.2 && parselTetik) parselTetik(); if (Math.abs(d) > 1) map.easeTo({ pitch: Math.max(2, Math.min(70, map.getPitch() + d)), duration: 300 }); } });\n  \/* Kap gizliyken (arka plan sekmesi, panel) acilirsa MapLibre tuvali 400x300'de kalir ve\n     pencere olayi gelmeden buyumez -> siyah sayfa (15 Eyl). Kabin kendi boyutunu izle. *\/\n  \/* Kap boyu degisince MapLibre zoom'u (yer olcegini) korur, kamera mesafesi H ile degisir;\n     canvas'ta tersi: dist sabit, olcek H'den turer. Ayni davranis: her boy degisiminde zoom\n     log2(Hyeni\/Heski) kadar kayar, kamera yuksekligi sabit kalir. Acilis orbiti suruyorsa\n     jumpTo onu durdurur, orbitSur kaldigi yerden yeniden kurar. *\/\n  var sonH = Math.max(400, document.getElementById('kdmlHarita').clientHeight || 800);\n  var orbitAcik = false, orbitSur = function () {};\n  if (window.ResizeObserver) new ResizeObserver(function () {\n    map.resize();\n    var h = document.getElementById('kdmlHarita').clientHeight;\n    if (h && h !== sonH) { var dz = Math.log2(h \/ sonH); ACILIS.zoom += dz; map.jumpTo({ zoom: map.getZoom() + dz }); sonH = h; if (orbitAcik) orbitSur(); }\n  }).observe(document.getElementById('kdmlHarita'));\n  \/* 119. tur (Fuat: 'ekran 4K ise metin sigdigi yere kadar uzasin'): metin panele sigiyorsa\n     acik baslar ve ozet satiri gizlenir; sigmiyorsa '+ Devamini oku' olarak kapali kalir.\n     Olcum: liste KAPALI (ozet satiri akista), devam ACIK iken panelin icerigi kendi yuksekligini\n     asiyor mu. Mobilde (<=900) calismaz \u2014 orada kapali tasarim bilerek secildi (106. tur).\n     Yazi tipleri gec yuklenirse olcum kayar, bu yuzden document.fonts.ready sonrasi yinelenir. *\/\n  function metinSigdir() {\n    var y = document.getElementById('yazi'); if (!y) return;\n    var dv = y.querySelector('details.devam'), ls = y.querySelector('details.kd-liste');\n    if (!dv) return;\n    if (innerWidth <= 900) { dv.open = false; y.classList.remove('metin-acik'); return; }\n    var lsOnce = ls ? ls.open : false;\n    if (ls) ls.open = false;\n    dv.open = true;\n    var ofOnce = y.style.overflowY; y.style.overflowY = 'hidden';   \/* kendi kaydirma cubugu sutunu daraltmasin *\/\n    var sigar = y.scrollHeight <= y.clientHeight + 1;\n    y.style.overflowY = ofOnce;\n    dv.open = sigar;\n    y.classList.toggle('metin-acik', sigar);\n    if (ls) ls.open = lsOnce;\n  }\n  \/* Ilk olcum yerlesim oturmadan cabuk kaliyordu (yazi tipi, --hdr, 100dvh sonradan yerine oturuyor)\n     ve metin sigdigi halde kapali kaliyordu. Zamanlayici tahmini yerine kabin kendisi izlenir;\n     panelin boyu kabin boyunu degistirmedigi icin geri besleme dongusu olusmaz. *\/\n  \/* 122. tur: MAHALLE CAPASI (#caddebostan). liste_kur.py her mahalle <h3>'une id veriyor. Chrome kapali\n     <details>'i capada kendisi aciyor ve yalniz paneli kaydiriyor (olculdu: pencere ve .kdml 0'da kaliyor);\n     her tarayicida boyle oldugu varsayilmaz. Hedef listedeyse liste acilir, panel basliga kaydirilir.\n     metinSigdir ilk saniyelerde 'Devamini oku'yu acip kapatarak basligi yerinden oynatiyor; bu yuzden\n     capa ilk 4 s icinde her olcumden sonra yeniden tutturulur, kullanici paneli kaydirinca birakilir. *\/\n  var capaSon = Date.now() + 4000;\n  function capaAc() {\n    var y = document.getElementById('yazi'), id = (location.hash || '').slice(1);\n    if (!y || !id) return;\n    try { id = decodeURIComponent(id); } catch (h) {}\n    var h3 = document.getElementById(id), ls = h3 && h3.closest ? h3.closest('details.kd-liste') : null;\n    if (!ls || !y.contains(ls)) return;\n    ls.open = true;\n    y.scrollTop += h3.getBoundingClientRect().top - y.getBoundingClientRect().top - 8;\n  }\n  function sigdirCapa() { metinSigdir(); if (Date.now() < capaSon) capaAc(); }\n  ['wheel', 'touchstart', 'keydown'].forEach(function (o) { var y = document.getElementById('yazi'); if (y) y.addEventListener(o, function () { capaSon = 0; }, { passive: true }); });\n  window.addEventListener('hashchange', capaAc);\n  sigdirCapa();\n  if (document.fonts && document.fonts.ready) document.fonts.ready.then(sigdirCapa);\n  var sigZam = null;\n  function sigdirGecikmeli() { clearTimeout(sigZam); sigZam = setTimeout(sigdirCapa, 180); }\n  window.addEventListener('resize', sigdirGecikmeli);\n  var kokOlc = document.getElementById('kdml') || document.querySelector('.kdml');\n  if (kokOlc && window.ResizeObserver) new ResizeObserver(sigdirGecikmeli).observe(kokOlc);\n\n  var secili = null, acik = null, isaretler = [], navYon = null, binaOrbit = false, navJeton = 0;   \/* 52. tur: navigasyon durumu *\/\n  var YON_MIN = -95, YON_MAKS = 95, yonKilit = false;   \/* 53. tur (Fuat: 'kuzeyden bakilamiyordu, onu koru'): kamera hep guney yarim duzlemde; navigasyon -90\/90\/0 sirasiyla bakar, orbit kilitte yon degistirir *\/\n  \/* YON KELEPCESI (canvas YON_MIN 171 \/ YON_MAKS 270; kuzey-yukari = head 180).\n     Varsayim: bearing = head - 180 -> [-9, 90]. Isaret ters ciktiysa aralik [-90, 9] olur. *\/\n  \/* Kelepce asilinca: surukleme surerken degeri sabitle; birakildiktan sonraki atalet\n     (easeTo) animasyonunu DURDUR \u2014 yoksa animasyon bitene kadar her kare ayni degere\n     cekiliyor, MapLibre \"degisiklik yok\" deyip cizmiyor ve orbit sonu donuyor\n     (Fuat, 15 Eyl: \"orbitin sonunda takiliyor\"; olculdu: 1,4 s'de 28 kare \/ 74). *\/\n  map.on('rotate', function () {\n    if (yonKilit) return;\n    var b = map.getBearing(), c = Math.max(YON_MIN, Math.min(YON_MAKS, b));\n    if (c === b) return;\n    yonKilit = true;\n    var surukluyor = map.dragRotate && map.dragRotate.isActive && map.dragRotate.isActive();\n    if (!surukluyor) map.stop();\n    map.jumpTo({ bearing: c });\n    yonKilit = false;\n  });\n\n  function binaRengi() {\n    \/* secili mahalle disindakiler soluk (canvas: binaCiz -> disMah) *\/\n    \/* 99. tur: yukselmemis bina (cephe < u) taban renginde \u2014 filtre yerine renk ayirir *\/\n    var bekleyen = ['<', ['global-state', 'cephe'], ['get', 'u']];\n    \/* yukselmemis kutle: eski gorunumun esdegeri \u2014 zemin (#26282E) uzerine %14 opak cati renginin karisimi *\/\n    var normal = ['case', bekleyen, C.bekleyen, ['==', ['get', 'biz'], 1], C.biz, ['==', ['get', 'olc'], 1], C.cati, C.catiSoluk];\n    if (secili === null) return normal;\n    \/* 13. tur (Fuat): mahalle secilince diger mahallelerdeki BFTA binalari turuncu kalir *\/\n    return ['case', bekleyen, C.bekleyen, ['==', ['get', 'biz'], 1], C.biz, ['!=', ['get', 'm'], secili], C.duvarSoluk, ['==', ['get', 'olc'], 1], C.cati, C.catiSoluk];\n  }\n\n  map.on('load', function () {\n    if (KDML.yaya) map.addSource('yaya', { type: 'geojson', data: KDML.yaya, maxzoom: 14, tolerance: 0.05, buffer: 8 });   \/* 27. tur: OSM yaya\/patika (parklar) *\/\n    var S = { deniz: KDML.deniz, ilce: KDML.ilce, arazi: KDML.arazi || { type: 'FeatureCollection', features: [] }, park: KDML.parklar, yol: KDML.yollar, mah: KDML.mahalle, dis: KDML.dis, bina: KDML.binalar };\n    \/* Kutucuk ayari (15 Eyl, \"orbit sonunda takiliyor\"): hareket bitince ufuktaki yeni\n       kutucuklar yukleniyordu (88 olay). maxzoom 14: z14 ustu ayni kutucugu buyutur, zoom'da\n       yeniden kesilmez; tolerans 0,05 px (z14'te ~0,2 m) bina koselerini bozmaz; tampon 8. *\/\n    Object.keys(S).forEach(function (k) { map.addSource(k, { type: 'geojson', data: S[k], maxzoom: 14, tolerance: 0.05, buffer: 8 }); });\n    var Z = function (a, b, c) { return ['interpolate', ['exponential', 1.6], ['zoom'], 12, a, 15, b, 17, c]; };\n    \/* TARAMA (canvas: parkTara \/ denizTara, 45 derece cizgiler; park araligi 9 m, deniz 30 m).\n       MapLibre'de fill-pattern: ekran pikselinde tekrar eden kucuk resim. Renkler T.parkTara \/ T.denizTara. *\/\n    \/* yon +1: sol alt -> sag ust (45 derece); yon -1: 90 derece tersi (sol ust -> sag alt). *\/\n    \/* Desen 2x cozunurlukte cizilip pixelRatio 2 ile verilir: ince cizgiler HiDPI'da bulanmaz,\n       uzaktan bakista moire\/paralaks azalir (Fuat, 15 Eyl gece: \"park taramalari incelsin\"). *\/\n    function tarama(ad, renk, aralik, kalin, yon) {\n      var cv = document.createElement('canvas'), n = aralik * 2; cv.width = n; cv.height = n;\n      var x = cv.getContext('2d'); x.strokeStyle = renk; x.lineWidth = kalin * 2; x.lineCap = 'square';\n      x.beginPath();\n      if (yon === -1) { x.moveTo(-n \/ 2, -n \/ 2); x.lineTo(n \/ 2, n \/ 2); x.moveTo(0, -n \/ 2 + n); x.lineTo(n, n * 1.5); x.moveTo(n \/ 2, -n \/ 2); x.lineTo(n * 1.5, n \/ 2); }\n      else { x.moveTo(-n \/ 2, n \/ 2); x.lineTo(n \/ 2, -n \/ 2); x.moveTo(0, n); x.lineTo(n, 0); x.moveTo(n \/ 2, n * 1.5); x.lineTo(n * 1.5, n \/ 2); }\n      x.stroke();\n      map.addImage(ad, x.getImageData(0, 0, n, n), { pixelRatio: 2 });\n    }\n    \/* PARK TARAMASI (Fuat, 15 Eyl aksam): park katmani ile yesil arazi ayni deseni ust uste basiyordu,\n       koyulasiyordu. Ikisi tek kaynakta ('yesil') birlesti \u2014 ayni katmandaki bindirmeler stencil ile bir\n       kez cizilir. Buyuk (kaba) tarama kaldi, 90 derece tersine ince bir capraz tarama eklendi. *\/\n    \/* 13. tur (Fuat: \"uzakliga gore degisen tarama\"): uzakta seyrek (22 px), orta (14), yakinda sik (10);\n       ince 90 derece capraz yalniz zoom 15'ten sonra. Yesil alanlar veride tek kumeye eritildi (KDML.yesil),\n       sahil parklarindaki ust uste tarama gitti. *\/\n    tarama('tara-park-seyrek', 'rgba(108,132,84,.30)', 22, 0.6, 1);\n    tarama('tara-park', 'rgba(108,132,84,.30)', 14, 0.6, 1);\n    tarama('tara-park-sik', 'rgba(108,132,84,.32)', 10, 0.7, 1);\n    tarama('tara-deniz', 'rgba(88,140,174,.40)', 30, 1);\n    map.addLayer({ id: 'deniz', type: 'fill', source: 'deniz', paint: { 'fill-color': C.deniz } });\n    \/* DENIZ: kiyidan OFSETLI paralel cizgiler (Fuat, 15 Eyl: \"kiyidan cizgi alip offsetle,\n       yakisikli durur\"). Kiyi halkasi LineString olarak ayni kaynaktan; line-offset ekran\n       pikselinde, zoom'dan bagimsiz \u2014 deniz haritasi dalga cizgisi gibi. Isaret deniz tarafi\n       (halka yonune bagli, gorsel dogrulandi). Uzaklastikca soluyor. *\/\n    \/* DENIZ: kiyidan ES UZAKLIK EGRILERI (Fuat, 15 Eyl: \"kiyiya paralel cizgiler\").\n       Build'de uretildi (numpy): kiyi parcalari denize dogru 35\/80\/140\/215\/300\/400 m\n       otelenir, kiyiya d'den yakin kalan ornekler atilir (ilmek temizligi), kalanlar\n       egri parcalari olur -> KDML.kiyi. Sayfaya kutuphane girmez; uzaklastikca soluk. *\/\n    map.addSource('kiyi', { type: 'geojson', data: KDML.kiyi, maxzoom: 14, tolerance: 0.05, buffer: 8, lineMetrics: true });   \/* 61. tur: line-progress icin *\/\n    \/* 14 seviye (15 m'den 400 m'ye s\u0131kla\u015fan), her 4. \u00e7izgi kal\u0131n (Fuat, 15 Eyl) *\/\n    \/* DALGA (Fuat, 15 Eyl gece: \"denizlerin dalgalarini animate edebilir miyiz, en az GPU yukuyle\"):\n       egriler k mod 3 ile uc katmanda; her katmana farkli fazla 1 px'lik line-translate salinimi. line-translate\n       uniform'dur (veri tamponu yeniden kurulmaz), gecis 0 ms ki MapLibre araya 60 fps'lik gecis animasyonu\n       koymasin; tik 12 kare\/s, sekme gizliyken durur. Maliyet = saniyede 12 tam yeniden cizim. *\/\n    \/* 13. tur (Fuat: \"kiyiya en yakin 3-4 tanesi acik griden baslasin\", \"animasyon okunmuyor\"): k 0-3 acik\n       gri -> maviye gecen renk, her biri KENDI katmaninda (kiyi-y0..3) 2,6 px salinim; k >= 4 tek sabit katman. *\/\n    var KIYI_RENK = ['interpolate', ['linear'], ['get', 'k'], 0, '#9CC6EE', 2, '#7FB0E0', 4, '#5A8FC8', 7, '#3F73AE'];   \/* 29. tur (Fuat): dalgalar mavi *\/\n    var KIYI_GEN = ['interpolate', ['linear'], ['zoom'], 12, ['case', ['==', ['%', ['get', 'k'], 4], 3], 1.1, 0.5], 16, ['case', ['==', ['%', ['get', 'k'], 4], 3], 2.4, 1.1]];\n    \/* 49. tur (Fuat: 'deniz dalgalari da giri\u015fte anime olsun, cat diye gelmesin'): opaklik x kiyiT ile kiyidan\n       aciga dogru sirayla belirir (k=0 once); kiyiT 0 -> 1 giri\u015fte ~7 s. *\/\n    var KIYI_OP = ['*', ['interpolate', ['linear'], ['get', 'k'], 0, 0.8, 3, 0.5, 13, 0.14], ['max', 0, ['min', 1, ['\/', ['-', ['*', ['global-state', 'kiyiT'], 15], ['get', 'k']], 2]]]];\n    \/* 57. tur (Fuat): k0 acik gri NOKTA (kopuk soyutlamasi), k1 acik gri kisa cizgi (son dalga), k2 daha uzun cizgi\n       biraz koyu, k3+ mevcut mavi gradyan; en son egri (k13) mavi nokta nokta. Kesik desen katman basina (paint). *\/\n    \/* kesik birimi cizgi genisligi: nokta = 0,01 + bosluk; kopuk cizgisi 1,7x kalin ki noktalar okunsun *\/\n    \/* 58. tur (Fuat: 'nokta nokta gozukmuyor'): kopuk noktalari sabit genislik (zoom 13: 2 px, 16: 3,6 px), aralik 2,6 genislik *\/\n    \/* 61. tur (Fuat: 'cizgi ozellikleriyle stilize bir deniz'): k0-k2 uc asamali \u2014 kendi deseni (a), sonraki desen (b),\n       duz cizgi (c). Uc katman ayni egriyi cizer; hangisinin nerede gorunecegi line-gradient opaklik maskesiyle\n       (line-progress 0 = Caddebostan, egriler orada bolunmus) belirlenir. Cephe c1 0 -> 1,3 -> 0 ping-pong 24 s;\n       c2 = c1 - 0,25 geride. Gradyan paint ozelligi: tile yeniden kurulmaz, 12 kare\/s guncelleme. *\/\n    \/* \ud83d\udd34 Tuzak (61. tur): ['*', <zoom interpolate>, m] GECERSIZ \u2014 zoom yalniz en dis interpolate'te olabilir; MapLibre katmani\n       sessizce atlar (error olayi). 57-60. turlarda kiyi-y1 ve kiyi-son bu yuzden hic cizilmemisti. Carpan icerde. *\/\n    function kiyiGenX(m) { return ['interpolate', ['linear'], ['zoom'], 12, ['case', ['==', ['%', ['get', 'k'], 4], 3], 1.1 * m, 0.5 * m], 16, ['case', ['==', ['%', ['get', 'k'], 4], 3], 2.4 * m, 1.1 * m]]; }\n    function kiyiNoktaGenX(m) { return ['interpolate', ['linear'], ['zoom'], 13, 1.15 * m, 16, 2.1 * m, 17.5, 2.9 * m]; }   \/* 62. tur: kopuk daha ince *\/\n    var KIYI_NOKTA_GEN = kiyiNoktaGenX(1);\n    var KIYI_ASAMA = [\n      [ { rgb: '167,185,208', kesik: [0.01, 2.8], gen: 'nokta' }, { rgb: '185,193,204', kesik: [2, 3], gen: 1.3 }, { rgb: '159,182,208', kesik: null, gen: 1.2 } ],\n      [ { rgb: '185,193,204', kesik: [2, 3], gen: 1.3 },        { rgb: '143,167,198', kesik: [5, 3.5], gen: 1 }, { rgb: '143,167,198', kesik: null, gen: 1 } ],\n      [ { rgb: '143,167,198', kesik: [5, 3.5], gen: 1 },        null,                                            { rgb: '127,160,196', kesik: null, gen: 1 } ]\n    ];\n    function kiyiMaske(rgb, a0, a1) {   \/* [a0, a1] araliginda gorunur, 0,05 yumusak kenar; duraklar artan sirada *\/\n      if (a1 <= 0 || a0 >= 1 || a1 <= a0) return ['interpolate', ['linear'], ['line-progress'], 0, 'rgba(' + rgb + ',0)', 1, 'rgba(' + rgb + ',0)'];   \/* 62. tur: bos aralik tam saydam (orijin kalintisi) *\/\n      var e = 0.05, pts = [[0, a0 <= 0 ? 1 : 0], [a0 - e, 0], [a0 + e, 1], [a1 - e, 1], [a1 + e, 0], [1, a1 >= 1 ? 1 : 0]], st = [], son = -1;\n      pts.forEach(function (q) { var x = Math.max(0, Math.min(1, q[0])); if (x <= son) x = son + 1e-4; if (x > 1) return; son = x; st.push(x, 'rgba(' + rgb + ',' + q[1] + ')'); });\n      return ['interpolate', ['linear'], ['line-progress']].concat(st);\n    }\n    var kiyiKatman = [];\n    for (var kg = 0; kg < 4; kg++) {\n      var asama = KIYI_ASAMA[kg];\n      if (!asama) { map.addLayer({ id: 'kiyi-y' + kg, type: 'line', source: 'kiyi', filter: ['==', ['get', 'k'], kg], layout: { 'line-join': 'round', 'line-cap': 'round' },\n        paint: { 'line-color': KIYI_RENK, 'line-width': KIYI_GEN, 'line-translate-transition': { duration: 0, delay: 0 }, 'line-opacity': KIYI_OP } }); continue; }\n      for (var st = 0; st < 3; st++) { var dsn = asama[st]; if (!dsn) continue;\n        var pb = { 'line-width': dsn.gen === 'nokta' ? KIYI_NOKTA_GEN : kiyiGenX(dsn.gen), 'line-translate-transition': { duration: 0, delay: 0 }, 'line-opacity': KIYI_OP, 'line-gradient': kiyiMaske(dsn.rgb, 0, 1) };\n        if (dsn.kesik) pb['line-dasharray'] = dsn.kesik;\n        var id = 'kiyi-y' + kg + (st ? 'abc'[st] : '');\n        map.addLayer({ id: id, type: 'line', source: 'kiyi', filter: ['==', ['get', 'k'], kg], layout: { 'line-join': 'round', 'line-cap': 'round' }, paint: pb });\n        kiyiKatman.push({ id: id, k: kg, st: st, rgb: dsn.rgb }); }\n    }\n    map.addLayer({ id: 'kiyi-uzak', type: 'line', source: 'kiyi', filter: ['all', ['>=', ['get', 'k'], 4], ['<', ['get', 'k'], 13]], layout: { 'line-join': 'round', 'line-cap': 'round' },\n      paint: { 'line-color': KIYI_RENK, 'line-width': KIYI_GEN, 'line-opacity': KIYI_OP } });\n    \/* 68. tur: marina ic cizgileri (k=30), soluk mavi, animasyonsuz; giri\u015fte kiyiT ile belirir *\/\n    map.addLayer({ id: 'kiyi-marina', type: 'line', source: 'kiyi', filter: ['==', ['get', 'k'], 30], layout: { 'line-join': 'round', 'line-cap': 'round' },\n      paint: { 'line-color': '#4A7DB8', 'line-width': kiyiGenX(1), 'line-opacity': ['*', 0.32, ['max', 0, ['min', 1, ['global-state', 'kiyiT']]]] } });\n    map.addLayer({ id: 'kiyi-son', type: 'line', source: 'kiyi', filter: ['==', ['get', 'k'], 13], layout: { 'line-join': 'round', 'line-cap': 'round' },\n      paint: { 'line-color': '#3F73AE', 'line-width': kiyiNoktaGenX(0.8), 'line-dasharray': [0.01, 2.6], 'line-opacity': KIYI_OP } });\n    map.addLayer({ id: 'ilce', type: 'fill', source: 'ilce', paint: { 'fill-color': C.kara } });\n    map.addLayer({ id: 'ilce-kontur', type: 'line', source: 'ilce', paint: { 'line-color': C.kontur, 'line-width': 1.1 } });\n    \/* ARAZI KULLANIMI (Fuat, 15 Eyl: \"zemin daha zengin olsun, parklarda bosluklar var\"):\n       OSM landuse\/leisure\/natural\/amenity poligonlari, koyu temada alcak kontrastli tonlar.\n       Yesil alanlar park rengini paylasir; konut adalari zeminden bir tik acik. *\/\n    var ARAZI = { konut: '#26282E', ticari: '#2A2C31', sanayi: '#24262B', gri: '#202227', kurum: '#292C33',\n                  yesil: C.park, mezarlik: '#262B29', spor: '#2A312C', kum: '#2E2C27', su: C.deniz, marina: '#111D36', bahce: '#2C332E' };   \/* 30. tur: marina suyu *\/   \/* 29. tur: bahce\/oyun alani *\/\n    map.addLayer({ id: 'arazi', type: 'fill', source: 'arazi', paint: { 'fill-color': ['match', ['get', 's'],\n      'konut', ARAZI.konut, 'ticari', ARAZI.ticari, 'sanayi', ARAZI.sanayi, 'gri', ARAZI.gri, 'kurum', ARAZI.kurum,\n      'yesil', ARAZI.yesil, 'mezarlik', ARAZI.mezarlik, 'spor', ARAZI.spor, 'bahce', ARAZI.bahce, 'kum', ARAZI.kum, 'su', ARAZI.su, 'marina', ARAZI.marina, C.kara],\n      'fill-opacity': 0.9 } });\n    map.addLayer({ id: 'park', type: 'fill', source: 'park', paint: { 'fill-color': C.park } });\n    map.addSource('yesil', { type: 'geojson', data: KDML.yesil || { type: 'FeatureCollection', features: KDML.parklar.features.concat(\n      (S.arazi.features || []).filter(function (f) { return \/^(yesil|mezarlik|spor)$\/.test(f.properties.s); })) }, maxzoom: 14, tolerance: 0.05, buffer: 8 });\n    map.addLayer({ id: 'park-tara', type: 'fill', source: 'yesil', paint: { 'fill-pattern': ['step', ['zoom'], 'tara-park-seyrek', 14.3, 'tara-park', 15.8, 'tara-park-sik'] } });\n    \/* 26. tur (Fuat: 'kanayan yaramiz, tek tarafa tarama'): ince 90 derece capraz katman kaldirildi. *\/\n    \/* 31. tur: iskele\/dalgakiran katmanlari kaldirildi *\/\n    \/* 38. tur: kontrol cizgisi kaldirildi; Fuat kendi hattini ciziyor (asagida 'HAT CIZ') *\/\n    if (KDML.yaya) map.addLayer({ id: 'yaya', type: 'line', source: 'yaya', layout: { 'line-cap': 'round', 'line-join': 'round' }, paint: { 'line-color': '#5A5E66', 'line-width': Z(0.3, 1.2, 3), 'line-opacity': .9 } });\n    map.addLayer({ id: 'sokak', type: 'line', source: 'yol', filter: ['==', ['get', 'cls'], 'sokak'], layout: { 'line-cap': 'round', 'line-join': 'round' }, paint: { 'line-color': C.yol, 'line-width': Z(0.65, 2.8, 7.5) } });   \/* 27. tur: x1,25 *\/\n    map.addLayer({ id: 'cadde', type: 'line', source: 'yol', filter: ['==', ['get', 'cls'], 'cadde'], layout: { 'line-cap': 'round', 'line-join': 'round' }, paint: { 'line-color': C.yol, 'line-width': Z(1.5, 5.2, 13.5) } });   \/* 27. tur: x1,25 *\/\n    \/* 45. tur (Fuat): Bagdat Caddesi tek cizgi \u2014 kilif (dis cizgi) katmani kaldirildi *\/\n    map.addLayer({ id: 'bagdat', type: 'line', source: 'yol', filter: ['==', ['get', 'cls'], 'bagdat'], layout: { 'line-cap': 'round', 'line-join': 'round' }, paint: { 'line-color': C.biz, 'line-width': Z(3.9, 11.2, 27) } });   \/* 71. tur (Fuat): Bagdat BFTA turuncusu, x1,5 kalin, ustune beyaz yazi *\/\n    map.addLayer({ id: 'minibus', type: 'line', source: 'yol', filter: ['==', ['get', 'cls'], 'minibus'], paint: { 'line-color': C.minibus, 'line-width': Z(1.5, 5.2, 13.5), 'line-opacity': .9 } });\n    map.addLayer({ id: 'ray', type: 'line', source: 'yol', filter: ['==', ['get', 'cls'], 'ray'], paint: { 'line-color': C.ray, 'line-width': Z(1.2, 3, 8), 'line-opacity': .85 } });\n    map.addLayer({ id: 'ray-travers', type: 'line', source: 'yol', filter: ['==', ['get', 'cls'], 'ray'], paint: { 'line-color': '#FFFFFF', 'line-width': Z(.5, 1.2, 3), 'line-dasharray': [1.5, 1.5], 'line-opacity': .9 } });\n    \/* 27. tur (Fuat: \"mahalle poligonlari default cizili gelmesin, secilirse boyansin, yollari bozuyor\"):\n       genel kontur kalkti; secili mahalle kendi rengiyle hafif dolgu + kontur. *\/\n    \/* 97. tur (Fuat): mahalle dolgusu kaldirildi \u2014 mahalle rengi artik parsel dokusunda yasiyor *\/\n    map.addLayer({ id: 'mah-secili', type: 'line', source: 'mah', filter: ['==', ['get', 'ad'], ''], paint: { 'line-color': ['get', 'renk'], 'line-width': 2.2, 'line-opacity': .9 } });\n    map.addLayer({ id: 'dis', type: 'fill', source: 'dis', paint: { 'fill-color': C.doku } });\n    \/* MEKSIKA DALGASI (17. tur, Fuat: \"focuslanan yerler yuksel\u0435 yuksel\u0435 devam etse\"): her binaya ucus\n       ekseni uzerindeki konumu u (m, Bostanci ucundan Moda yonune artar) yazilir; yukseklik = h x\n       clamp((cephe - u) \/ DALGA_GEN). cephe global-state, kameranin onunde ilerler (bkz. giris). *\/\n    var DALGA_GEN = 400, PIN_GECIK = 900, PIN_KARE = 4, cizimKare = 0,   \/* 93. tur: bina oturduktan sonra pin gecikmesi + en az 4 cizilmis kare *\/ ucusYon = (function () { var dx = (ACILIS.center[0] - UCUS.bas[0]) * kx, dy = (ACILIS.center[1] - UCUS.bas[1]) * ky, n = Math.hypot(dx, dy); return [dx \/ n, dy \/ n]; })();\n    function uHesap(lon, lat) { return ((lon - UCUS.bas[0]) * kx) * ucusYon[0] + ((lat - UCUS.bas[1]) * ky) * ucusYon[1]; }\n    KDML.binalar.features.forEach(function (f, _ix) {\n      var r = f.geometry.type === 'Polygon' ? f.geometry.coordinates[0] : f.geometry.coordinates[0][0], sx = 0, sy = 0;\n      for (var i = 0; i < r.length; i++) { sx += r[i][0]; sy += r[i][1]; }\n      \/* 46. tur (Fuat: 'cizgi gibi degil, daha random'): u'ya binaya ozgu deterministik +-200 m sapma \u2014 cephe daginik ilerler *\/\n      var sap = ((((f.properties.i || (_ix + 1)) * 2654435761) >>> 0) % 1000) \/ 1000;   \/* 90. tur: i paketten cikti, dizi sirasi ayni dagilimi verir *\/\n      f.properties.u = Math.round(uHesap(sx \/ r.length, sy \/ r.length) + (sap - 0.5) * 400);\n    });\n    \/* BEYAZ TABAN (Fuat: \"binalar yukselmeden once sadece poligon beyaz boyansa\"): ayni kaynak, duz dolgu. *\/\n    \/* 32. tur: yer golgeleri iptal (Fuat) *\/\n    \/* 36. tur (Fuat: 'yukseklik sifirken ici bos ve silik dursun'): taban hafif dolgu + ince kontur *\/\n    \/* PARSELLER (86. tur, Fuat: '4 renk kurali, cok hafif kontrastli griler'): KEOS parselleri, komsu farkli 4 gri; arazi ustu, yol alti *\/\n    \/* 87. tur (Fuat: 'parselleri sadece yakinlasinca ve planda gorsek'): parsel ayri dosya (KDP, kdml-paket KDML_AYIR); ilk kez\n       zoom >= 14.2 ya da Plan'da indirilir, 14.6-15.2 arasi zoomla belirir, ilk gelisi 600 ms saydamlik gecisi. Ilk acilisa binmez. *\/\n    var parselYol = 'https:\/\/bfta.com.tr\/wp-content\/uploads\/kd\/kd-veri-a-f4227319e1.js', parselDurum = 0;\n    if (\/YERTUTUCU$\/.test(parselYol)) parselYol = '';\n    \/* 97. tur (Fuat: 'koyu paletin havasini cok bozmadan mahallelerin renklerinde 4 renk patchwork'):\n       parselin rengi MAHALLESININ renginden turer. Mahalle rengi once luminansina bolunup yon vektorune cevrilir,\n       sonra dort luminans kademesine (34\/42\/50\/59) yerlestirilir; mahalle renginin agirligi 0,38, gerisi notr gri \u2014\n       koyu palet korunur, yalniz doku mahalleye gore isinir\/soguur. *\/\n    function parselPalet() {\n      \/* 98. tur (Fuat: 'mahalle patchleri biraz kayboldu, koyu-wibe'i bozmadan parlatalim'): 97. turda mahalle\n         renginin KENDI doygunlugu tasiniyordu \u2014 Bostanci (#5C6E8C) gibi soluk renkler griye dusuyordu. Artik\n         yalniz TON aliniyor, doygunluk 11 mahallede SABIT (0,30) ve aciklik dort kademe (0,145-0,255). Boylece\n         her mahalle esit okunur, palet koyu kalir. *\/\n      \/* 105. tur (Fuat: 'patchworku daha okunur istiyorum'): okunurluk DOYGUNLUKTAN degil ACIKLIK ARALIGINDAN\n         geliyor \u2014 98. turda dort kademe 0,130-0,230 arasina sikisikti (RGB 33-59), komsu parseller ayirt edilmiyordu.\n         Aralik 0,100-0,300'e acildi (RGB 26-77), doygunluk 0,14 -> 0,15. Koyu hava korunuyor, patchwork okunuyor. *\/\n      var S = 0.15, LS = [0.100, 0.165, 0.230, 0.300], ifade = ['match', ['get', 'm']];\n      function tonAl(h) {\n        var r = parseInt(h.substr(1, 2), 16) \/ 255, g = parseInt(h.substr(3, 2), 16) \/ 255, b = parseInt(h.substr(5, 2), 16) \/ 255;\n        var mx = Math.max(r, g, b), mn = Math.min(r, g, b), d0 = mx - mn, t = 0;\n        if (d0 > 1e-6) {\n          if (mx === r) t = ((g - b) \/ d0 + (g < b ? 6 : 0));\n          else if (mx === g) t = ((b - r) \/ d0 + 2);\n          else t = ((r - g) \/ d0 + 4);\n          t \/= 6;\n        }\n        return t;\n      }\n      function hslHex(t, sa, l) {\n        function k(n) {\n          var a = sa * Math.min(l, 1 - l), q = (n + t * 12) % 12;\n          var v = l - a * Math.max(-1, Math.min(Math.min(q - 3, 9 - q), 1));\n          return ('0' + Math.round(Math.max(0, Math.min(1, v)) * 255).toString(16)).slice(-2);\n        }\n        return '#' + k(0) + k(8) + k(4);\n      }\n      (KDML.mahalle ? KDML.mahalle.features : []).forEach(function (f, i) {\n        var t = tonAl((KDML.renk || {})[f.properties.ad] || '#2C3036');\n        var kademe = ['match', ['get', 'c']];\n        LS.forEach(function (l, k) {\n          var hex = hslHex(t, S, l);\n          if (k < 3) { kademe.push(k, hex); } else { kademe.push(hex); }\n        });\n        ifade.push(i, kademe);\n      });\n      ifade.push(['match', ['get', 'c'], 0, '#262A31', 1, '#2F333B', 2, '#383D45', '#41464F']);\n      return ifade;\n    }\n    function parselKur(fc) {\n      map.addSource('parsel', { type: 'geojson', data: fc, maxzoom: 15, tolerance: 0.1, buffer: 8 });\n      map.addLayer({ id: 'parsel', type: 'fill', source: 'parsel', minzoom: 14.4, paint: { 'fill-color': parselPalet(), 'fill-antialias': false,\n        'fill-opacity': 0, 'fill-opacity-transition': { duration: 600, delay: 0 } } }, 'sokak');\n      map.once('idle', function () { map.setPaintProperty('parsel', 'fill-opacity', ['interpolate', ['linear'], ['zoom'], 14.6, 0, 15.2, 1]); });\n    }\n    function parselYukle() {\n      if (parselDurum) return; parselDurum = 1;\n      if (KDML.parsel) { parselKur(KDML.parsel); return; }\n      if (!parselYol) return;\n      var sc = document.createElement('script'); sc.src = parselYol;\n      sc.onload = function () { if (typeof KDP !== 'undefined') { var P = kdmlAc(KDP); if (P.parsel) parselKur(P.parsel); } };\n      document.head.appendChild(sc);\n    }\n    if (KDML.parsel || parselYol) parselTetik = parselYukle;   \/* acilis ucusu 14,2'yi gectigi icin zoom olayina degil kullanici tekerlegi\/dokunmasi, Plan ve bina odagina bagli *\/\n    \/* YOL YAZILARI (70. tur): zemin poligonu metin \u2014 binalarin ALTINDA cizilir, fill-extrusion orter. Iki yonlu (y 0\/1);\n       global-state yon (kamera bearing) ile okuma yonu ekranin sagina bakan gosterilir; proje sokagi yalniz odakta (odak = no). *\/\n    if (KDML.yolyazi) { map.addSource('yolyazi', { type: 'geojson', data: KDML.yolyazi, maxzoom: 16, tolerance: 0.02, buffer: 16 });\n      map.addLayer({ id: 'yol-yazi', type: 'fill', source: 'yolyazi', minzoom: 14.6,\n        filter: ['all', ['any', ['!=', ['get', 't'], 'proje'], ['==', ['get', 'p'], ['global-state', 'odak']]],\n                        ['<', ['%', ['+', ['-', ['get', 'a'], ['global-state', 'yon']], 720], 360], 180]],   \/* 71. tur: kopya kendi a'sini sinar; eski case mantigi ikisini birden gosteriyordu *\/\n        paint: { 'fill-color': ['match', ['get', 't'], 'proje', '#E8E4DC', 'bagdat', '#F6F5F3', '#BFBDB8'], 'fill-opacity': ['match', ['get', 't'], 'proje', 0.95, 'bagdat', 0.97, 0.5], 'fill-antialias': true } }); }\n    map.addLayer({ id: 'bina-taban', type: 'fill', source: 'bina', paint: { 'fill-color': C.cati, 'fill-opacity': 0.14 } });\n    map.addLayer({ id: 'bina-kontur', type: 'line', source: 'bina', paint: { 'line-color': C.cati, 'line-opacity': 0.55, 'line-width': ['interpolate', ['linear'], ['zoom'], 13, 0.4, 16, 0.9, 17.5, 1.5] } });\n    \/* 37. tur (Fuat: 'izlerin ici bos degil'): yukseklik sifirken ekstruzyon cati poligonunu dolu ciziyordu;\n       cephesi henuz gelmemis binalar katmandan filtreyle cikarilir (global-state filtrede: kaynak zaten her adimda yenileniyor). *\/\n    \/* 99. tur (Fuat: 'pinler hala turuncu bina gelisleri ile asenkron'): FILTRE KALDIRILDI. global-state'e bagli\n       bir filtre her cephe adiminda butun bina karolarini iscide yeniden kurduruyordu; yavas makinede katman modelin\n       gerisine dusuyor, DOM pin zamaninda iniyordu. Artik yalniz paint degerlendirmesi var: yukselmemis bina sifir\n       yukseklikte ve taban renginde (gorunum ayni), yukselen normal renginde. *\/\n    map.addLayer({ id: 'bina', type: 'fill-extrusion', source: 'bina',\n      paint: { 'fill-extrusion-color-transition': { duration: 0, delay: 0 }, 'fill-extrusion-opacity': 1, 'fill-extrusion-color': binaRengi(), 'fill-extrusion-height': ['*', ['get', 'h'], ['max', 0, ['min', 1, ['\/', ['-', ['global-state', 'cephe'], ['get', 'u']], DALGA_GEN]]]], 'fill-extrusion-base': ['*', ['coalesce', ['get', 'b'], 0], ['max', 0, ['min', 1, ['\/', ['-', ['global-state', 'cephe'], ['get', 'u']], DALGA_GEN]]]], 'fill-extrusion-vertical-gradient': true } });\n    \/* 33. tur: agac katmani kaldirildi (Fuat) *\/\n\n    \/* igneler: DOM isaretci \u2014 cizgi + nokta, cizgi catidan yukselir. Cati yuksekligi\n       piksele zoom ve egimle cevrilir (yaklasik; projeksiyonda yukseklik yok). *\/\n    var balon = document.getElementById('balon');\n    var bizBinalar = KDML.binalar.features.filter(function (f) { return f.properties.biz === 1; });\n    function icinde(r, x, y) { var ic = false; for (var i = 0, j = r.length - 1; i < r.length; j = i++) { if (((r[i][1] > y) !== (r[j][1] > y)) && (x < (r[j][0] - r[i][0]) * (y - r[i][1]) \/ (r[j][1] - r[i][1]) + r[i][0])) ic = !ic; } return ic; }\n    function merkez(r) { var a = 0, cx = 0, cy = 0; for (var i = 0, j = r.length - 1; i < r.length; j = i++) { var w = r[j][0] * r[i][1] - r[i][0] * r[j][1]; a += w; cx += (r[j][0] + r[i][0]) * w; cy += (r[j][1] + r[i][1]) * w; } if (Math.abs(a) < 1e-12) { var sx = 0, sy = 0; r.forEach(function (q) { sx += q[0]; sy += q[1]; }); return [sx \/ r.length, sy \/ r.length]; } return [cx \/ (3 * a), cy \/ (3 * a)]; }\n    function bizBinaBul(ll) {\n      for (var i = 0; i < bizBinalar.length; i++) {\n        var g = bizBinalar[i].geometry, r = g.type === 'Polygon' ? g.coordinates[0] : g.coordinates[0][0];\n        if (icinde(r, ll[0], ll[1])) return { merkez: merkez(r), h: bizBinalar[i].properties.h, u: bizBinalar[i].properties.u };\n      }\n      return null;\n    }\n    KDML.projeler.features.forEach(function (f) {\n      var p = f.properties, kap = document.createElement('div'), el = document.createElement('div'); el.className = 'igne'; kap.appendChild(el);\n      el.innerHTML = '<span class=\"ad\">' + p.ad + '<\/span><div class=\"uc\"><div class=\"olcek\"><div class=\"damla\"><\/div><\/div><\/div><div class=\"ciz\"><\/div><div class=\"catik\"><\/div>';\n      \/* 23. tur (Fuat: \"pinler binanin tam ortasinda olsun, ucu binaya degsin\"): nokta hangi BFTA\n         binasinin icindeyse pin o poligonun alan agirlikli merkezine, yukseklik o binanin h'si (catida). *\/\n      var ev = p.pm ? { merkez: p.pm, h: p.ph } : bizBinaBul(f.geometry.coordinates), ll = ev ? ev.merkez : f.geometry.coordinates;   \/* 25. tur: veride polylabel (pm\/ph) varsa o *\/\n      kap.setAttribute('data-no', p.no);   \/* 117. tur: liste satiri pini bununla bulur *\/\n      var mk = new maplibregl.Marker({ element: kap, anchor: 'bottom' }).setLngLat(ll).addTo(map);\n      var h = ev ? ev.h : (p.kat || 5) * 3.18;\n      el.addEventListener('click', function (e) { e.stopPropagation(); kartAc(p, el); });\n      \/* 89. tur: pinin KENDI binasinin dalga sirasi. 64 projenin hepsinde hazir merkez (pm) var, bu yuzden bizBinaBul\n         yolu hic calismiyordu; merkezi iceren biz binasi ayrica aranir. *\/\n      var bb = (ev && ev.u !== undefined && ev.u !== null) ? ev : bizBinaBul(ll);\n      \/* 112. tur (Fuat: 'pin etiketleri hover edince hep en ustte dursun'): isaretciler kardes DOM ogeleri,\n         yigin sirasi DOM sirasindan geliyordu \u2014 komsu pin, ustune gelinen pinin hap etiketini kesebiliyordu.\n         Uzerine gelince sarmalayicinin z-index'i yukseltilir, cikinca eski haline doner (acik pin 20'de kalir). *\/\n      el.addEventListener('mouseenter', function () { kap.style.zIndex = '40'; });\n      el.addEventListener('mouseleave', function () { kap.style.zIndex = el.classList.contains('acik') ? '20' : ''; });\n      isaretler.push({ el: el, mk: mk, h: h, p: p, ll: ll, bu: bb ? bb.u : null, kap: kap });\n    });\n    \/* 117. tur: LISTE DAVRANISI. Satira basinca harita o binaya odaklanir (pine basmakla ayni yol,\n       kartAc). Ada basinca proje sayfasi acilir \u2014 <a> kendi isini yapar, satir dinleyicisi cekilir;\n       adi dugmeye cevirmedik cunku 'Hakki Bey Apt.' capa metni SEO'da degerli. 'Basa don' haritaya\n       bagli degildir, pinler dogmadan da calisir. *\/\n    (function listeKur() {\n      var yaziK = document.getElementById('yazi'); if (!yaziK) return;\n      var bd = yaziK.querySelector('details.kd-liste .basadon');\n      if (bd) bd.addEventListener('click', function (e) {\n        e.preventDefault();\n        var bas = yaziK.scrollTop;\n        try { yaziK.scrollTo({ top: 0, behavior: 'smooth' }); } catch (h) {}\n        setTimeout(function () { if (yaziK.scrollTop === bas) yaziK.scrollTop = 0; }, 350);   \/* yumusak kaydirma bazi ortamlarda sessizce calismiyor *\/\n      });\n      var dizin = {};\n      isaretler.forEach(function (s) { if (s.p && s.p.no !== undefined) dizin[s.p.no] = s; });\n      yaziK.querySelectorAll('details.kd-liste p[data-no]').forEach(function (sat) {\n        function git(e) {\n          if (e.target.closest && e.target.closest('a')) return;\n          e.preventDefault();\n          var s = dizin[+sat.getAttribute('data-no')];\n          if (s) kartAc(s.p, s.el);\n        }\n        sat.addEventListener('click', git);\n        sat.addEventListener('keydown', function (e) { if (e.key === 'Enter' || e.key === ' ') git(e); });\n      });\n      \/* Kartin uzerine basinca kapanir, panel geri gelir (Fuat 19 Eyl). *\/\n      if (balon) balon.addEventListener('click', function (e) {\n        if (e.target.closest && e.target.closest('a')) return;\n        kartKapat();\n      });\n    })();\n    \/* Cati noktasi TAM projeksiyon: MapLibre'nin nokta katmaninda yukseklik yok ama\n       transform.coordinatePoint bir MercatorCoordinate'i (z = metre) ekrana yansitir.\n       Zemin noktasi ile cati noktasinin ekran farki igne tabanini catiya koyar; kucuk\n       yatay kayma (perspektif) da uygulanir. *\/\n    var tr = map.transform, MC = maplibregl.MercatorCoordinate, kapHarita = document.getElementById('kdmlHarita'), sonOlcekZ = -1;\n    \/* 50. tur: zoom'a gore pin olcegi (acilis zoomu = 1) ve cizgi kalinligi \u2014 tek CSS degiskeni, 61 pin birden *\/\n    function pinOlcek(z) { var d = z - ACILIS.zoom; return Math.max(.9, Math.min(1.7, d < 0 ? 1 - d \/ 2.1 * .7 : 1 - d \/ 2 * .1)); }   \/* 53. tur: yakinda en az x0,9 *\/\n    function igneGuncelle() {\n      var z = map.getZoom();\n      if (Math.abs(z - sonOlcekZ) > .02) { sonOlcekZ = z; var o = pinOlcek(z); kapHarita.style.setProperty('--olcek', o.toFixed(3)); }\n      isaretler.forEach(function (s) {\n        \/* MapLibre 4: coordinatePoint(coord, yukseklikMetre) \u2014 yukseklik ikinci parametre, koordinatin z'si degil *\/\n        var z = tr.coordinatePoint(MC.fromLngLat(s.ll), 0), c = tr.coordinatePoint(MC.fromLngLat(s.ll), s.h);\n        var dy = Math.max(0, z.y - c.y), dx = c.x - z.x;\n        s.el.querySelector('.catik').style.height = dy + 'px';\n        s.el.style.transform = 'translate(' + dx.toFixed(1) + 'px,0)';\n      });\n    }\n    map.on('render', function () { cizimKare++; });   \/* 93. tur: cizilen kare sayaci \u2014 pin birakma kosulu *\/\n    if (kdmlEN) {   \/* 115. tur: panelin ac\/kapa etiketleri sunucudan Turkce geliyor, EN sayfada degistirilir *\/\n      var _k = document.querySelector('.yazi details.devam .kapali'), _a = document.querySelector('.yazi details.devam .acikm');\n      if (_k) _k.textContent = 'Read more';\n      if (_a) _a.textContent = 'Show less';\n    }\n    igneGuncelle(); map.on('move', igneGuncelle);\n    \/* 70. tur: kamera yonu global-state'e (100 ms'de bir), yazilar dik kalsin *\/\n    var yonSonYaz = -999;\n    map.on('rotate', function () { var b = Math.round(map.getBearing()); if (Math.abs(b - yonSonYaz) >= 6) { yonSonYaz = b; map.setGlobalStateProperty('yon', (b + 360) % 360); } });\n    map.setGlobalStateProperty('yon', (Math.round(map.getBearing()) + 360) % 360);\n\n    \/* NAVIGASYON (52. tur, Fuat: \"yeni nesil navigasyon\"): her mahalle\/bina seciminde bakis yonu 90 derece\n       doner (Fenerbahce'ye Bostanci'dan, Feneryolu'na Moda'dan bakar gibi). Bina secilince kamera yapi adasini\n       kadraja alacak kadar yaklasir (BINA_ODAK), yaklasma bitince 2 derece\/s cok yavas orbit; suruklemede,\n       tekerlekte, dokunmada, mahalle secince ve kart kapaninca durur. *\/\n    var BINA_ODAK = { zoomFark: 1.7, pitch: 58, sure: 3200, hiz: 2.0 };   \/* zoom = ACILIS.zoom + 1,7 (~yapi adasi); hiz derece\/s *\/\n    \/* 118. tur (Fuat: 'odagi binanin sokak cephesinden baslatalim'): bina odaginda yon artik\n       siradan degil, projenin CEPHE YONUNDEN (p.cb) gelir \u2014 uretimde hesaplanir (arazi-kirp).\n       Kamera bu yonde durunca binanin sokak cephesi karsilar.\n       ODAK_YON kelepcesi 53. turdaki 'kuzeyden bakilmaz' kuralidir. +-95'te 64 binanin 43'u gercek\n       cepheden karsilanir, 21'i en yakin izinli aciya oturur (ortalama 45 derece sapma). Kelepce\n       +-155'e acilirsa 61\/64 gercek cephe olur ama kamera kuzeye gecer. Tek yerden degisir. *\/\n    var ODAK_YON_MIN = -95, ODAK_YON_MAKS = 95;\n    var YON_SIRA = [-90, 90, 0], yonSira = -1;   \/* dogudan (Bostanci), batidan (Moda), guneyden *\/\n    function yeniYon() { yonSira = (yonSira + 1) % YON_SIRA.length; navYon = YON_SIRA[yonSira]; return navYon; }\n    \/* 56. tur (Fuat: 'mahalle icinde pan\/zoom calismiyor'): map.stop() KALKTI \u2014 tekerlek dinleyicisi de orbitDur\n       cagiriyordu, tekerlegin kendi easeTo'sunu ayni olayda kesiyordu (zoomstart\/zoomend ayni karede). rAF orbiti\n       easeTo kullanmadigi icin durdurmak icin bayrak yeter. *\/\n    function orbitDur() { navJeton++; binaOrbit = false; }\n    \/* 53. tur (Fuat: 'ilk yaklasim cok hizli, bir duruyor sonra orbit basliyor'): yaklasma ve orbit tek rAF\n       dongusunde ic ice \u2014 merkez\/zoom\/egim 3,2 s ease-out ile hedefe, yon = 90 derece donus + rampali orbit\n       (hiz 0'dan 2 derece\/s'ye yaklasma boyunca), sonra sabit orbit; kilide (+-95) gelince yon degistirir. *\/\n    function kisaFark(a, b) { var d = (b - a) % 360; if (d > 180) d -= 360; if (d < -180) d += 360; return d; }\n    function binaOdak(p) {\n      var s = null; isaretler.forEach(function (q) { if (q.p === p) s = q; }); if (!s) return;\n      orbitDur(); var jeton = navJeton; binaOrbit = true; if (parselTetik) parselTetik();   \/* 87. tur: odaktaki binanin parseli *\/\n      var genis = balon.offsetWidth || 0, kaydir = innerWidth > 900 ? [Math.round((300 - genis) \/ 2), 0] : [0, -40];   \/* sol yazi paneli ve sag kart arasinda ortala *\/\n      var c0 = map.getCenter(), z0 = map.getZoom(), e0 = map.getPitch(), b0 = map.getBearing();\n      var z1 = ACILIS.zoom + BINA_ODAK.zoomFark, e1 = BINA_ODAK.pitch;\n      var yon = (p.cb === undefined || p.cb === null) ? yeniYon()\n                : Math.max(ODAK_YON_MIN, Math.min(ODAK_YON_MAKS, p.cb));   \/* cephe yoksa (adresi olmayan proje) eski sira *\/\n      var fark = kisaFark(b0, yon);\n      \/* hedef merkez: bina cp+kaydir'da gorunsun -> hedef transformda cp-kaydir noktasinin konumu *\/\n      var t = map.transform.clone(); t.setZoom(z1); t.setPitch(e1); t.setBearing(yon); t.setCenter(maplibregl.LngLat.convert(s.ll));\n      var cp = t.centerPoint, c1 = t.screenPointToLocation(new maplibregl.Point(cp.x - kaydir[0], cp.y - kaydir[1]));\n      var t0 = performance.now(), son = t0, orb = 0, dir = yon >= 0 ? -1 : 1, HIZ = BINA_ODAK.hiz \/ 1000;\n      (function kare(now) {\n        if (jeton !== navJeton || !binaOrbit) return;\n        var dt = Math.min(100, now - son); son = now;\n        var u = Math.min(1, (now - t0) \/ BINA_ODAK.sure), k = 1 - Math.pow(1 - u, 3);\n        orb += dir * HIZ * dt * u;\n        var bb = b0 + fark * k + orb;\n        if (bb > YON_MAKS) { dir = -1; orb -= 2 * (bb - YON_MAKS); bb = YON_MAKS; }\n        if (bb < YON_MIN) { dir = 1; orb += 2 * (YON_MIN - bb); bb = YON_MIN; }\n        map.jumpTo({ center: [c0.lng + (c1.lng - c0.lng) * k, c0.lat + (c1.lat - c0.lat) * k], zoom: z0 + (z1 - z0) * k, pitch: e0 + (e1 - e0) * k, bearing: bb });\n        requestAnimationFrame(kare);\n      })(t0);\n    }\n\n    \/* MAHALLE KADRAJI (52. tur): cameraForBounds egimi bilmez (plan fit). Transform klonunda hedef egim\/yonle\n       poligon ekrana yansitilir, kutu bos alana (yazi paneli ve cipler haric) sigacak sekilde 4 yinelemede\n       olcek ve merkez duzeltilir; sonuc easeTo'ya verilir. Olculdu: Fenerbahce plan fit 14,0 -> egimli 15,0. *\/\n    function mahalleKamera(ring, yon, egim, pad) {\n      var k = [999, 999, -999, -999];\n      ring.forEach(function (q) { k[0] = Math.min(k[0], q[0]); k[1] = Math.min(k[1], q[1]); k[2] = Math.max(k[2], q[0]); k[3] = Math.max(k[3], q[1]); });\n      var c0 = map.cameraForBounds([[k[0], k[1]], [k[2], k[3]]], { bearing: yon, padding: pad });\n      if (!c0 || !map.transform.clone) return c0;\n      var t = map.transform.clone(); t.setBearing(yon); t.setPitch(egim); t.setCenter(maplibregl.LngLat.convert(c0.center)); t.setZoom(c0.zoom);\n      var aw = t.width - pad.left - pad.right, ah = t.height - pad.top - pad.bottom, tx = pad.left + aw \/ 2, ty = pad.top + ah \/ 2;\n      for (var it = 0; it < 4; it++) {\n        var mx = 1e9, my = 1e9, Mx = -1e9, My = -1e9;\n        ring.forEach(function (q) { var e = t.locationToScreenPoint(new maplibregl.LngLat(q[0], q[1])); mx = Math.min(mx, e.x); my = Math.min(my, e.y); Mx = Math.max(Mx, e.x); My = Math.max(My, e.y); });\n        var sk = Math.min(aw \/ (Mx - mx), ah \/ (My - my)), cp = t.centerPoint;\n        t.setCenter(t.screenPointToLocation(new maplibregl.Point(cp.x + ((mx + Mx) \/ 2 - tx), cp.y + ((my + My) \/ 2 - ty))));\n        t.setZoom(t.zoom + Math.log2(sk));\n      }\n      return { center: [t.center.lng, t.center.lat], zoom: t.zoom };\n    }\n\n    \/* 70. tur (Fuat: 'Tumu, Plan ya da mahalleye basinca odaktan cikan binanin karti da kaybolsun') *\/\n    function kartKapat() {\n      if (acik === null) return;\n      acik = null; balon.classList.remove('gel'); kokErken.classList.remove('kart-acik'); orbitDur(); map.setGlobalStateProperty('odak', -1);\n      isaretler.forEach(function (s) { s.el.classList.remove('acik'); });\n    }\n    function kartAc(p, el) {\n      isaretler.forEach(function (s) { s.el.classList.remove('acik'); if (s.kap) s.kap.style.zIndex = ''; });\n      if (acik === p) { acik = null; balon.classList.remove('gel'); kokErken.classList.remove('kart-acik'); orbitDur(); map.setGlobalStateProperty('odak', -1); return; }\n      acik = p; el.classList.add('acik');\n      if (secili !== null && p.mah && p.mah !== secili) { secili = p.mah; secimUygula(); }   \/* 59. tur (Fuat): baska mahalledeki bina secilince o mahalle aktif *\/\n      binaOdak(p); map.setGlobalStateProperty('odak', p.no);   \/* 70. tur: sokak yazisi zeminde *\/\n      \/* 65. tur (Fuat): kart fade in (0,26 s); baska bina aciksa once mevcut kart fade out, sonra yenisi fade in *\/\n      var j = ++kartJeton;\n      function goster() {\n        if (j !== kartJeton) return;\n        document.getElementById('kartg').src = p.g || '';\n        document.getElementById('kartad').textContent = p.ad;\n        document.getElementById('kartisv').textContent = p.isv || '';\n        isaretler.forEach(function (s) { if (s.p === p && s.kap) s.kap.style.zIndex = '20'; });\n        kartYerlestir(); balon.classList.add('gel'); kokErken.classList.add('kart-acik');\n        \/* 117. tur (Fuat: 'mobilde karta tiklaninca kapansin tekrar yazili sayfaya gelsin'):\n           106. turdaki kalici gizleme KALDIRILDI. O kural panel UZUN oldugu icin konmustu \u2014\n           haritayi ortuyor, pine basilamiyordu. Panel artik kapali bloklarla kisa. *\/   \/* 106. tur (Fuat: 'mobilde yazi blogu haritayi ortuyor, kartlara tiklayamiyorum; eski tasarim daha iyiydi'): 3428'deki kural \u2014 ilk kart gorulduginde mobilde yazi blogu bir daha gelmez *\/\n      }\n      if (balon.classList.contains('gel')) { balon.classList.remove('gel'); setTimeout(goster, 240); } else goster();\n    }\n    var kartJeton = 0;\n    function kartYerlestir() {\n      \/* 3428 kurali: ust = yazi panelinin ustu, sag 28, ALT_PAY 112; genislik clamp(300, TAVAN, (kalan - kunye) * 4\/5),\n         TAVAN = clamp(460, H*0,42, 819). Mobil (<=900): alt yuva, kunye gorsel ustunde. *\/\n      var kr = kapHarita.getBoundingClientRect(), yr = document.getElementById('yazi').getBoundingClientRect(), H = kr.height;\n      if (innerWidth <= 900) {   \/* 104. tur: sabit 84 px cip seridini hesaba katmiyordu, kunye seridin altinda kaliyordu *\/\n        var kum = document.querySelector('.kumanda');\n        balon.style.width = ''; balon.style.top = 'auto';\n        balon.style.bottom = ((kum ? kum.offsetHeight : 72) + 14) + 'px'; return;\n      }\n      var ust = Math.max(6, Math.round(yr.top - kr.top)), ALT_PAY = 112, pm = balon.querySelector('.pmetin'), metinY = (pm && pm.offsetHeight) || 74;\n      var TAVAN = Math.max(460, Math.min(819, Math.round(H * 0.42))), kalan = H - ust - ALT_PAY;\n      var gen = Math.max(300, Math.min(TAVAN, Math.floor((kalan - metinY) * 4 \/ 5)));\n      balon.style.width = gen + 'px'; balon.style.top = ust + 'px'; balon.style.bottom = 'auto';\n      kokErken.style.setProperty('--kartG', (gen + 28) + 'px');\n    }\n    window.addEventListener('resize', kartYerlestir);\n    map.on('click', function () { if (acik) { acik = null; balon.classList.remove('gel'); kokErken.classList.remove('kart-acik'); orbitDur(); map.setGlobalStateProperty('odak', -1); isaretler.forEach(function (s) { s.el.classList.remove('acik'); }); } });\n\n    \/* mahalle seridi + PLAN (sag uc) *\/\n    var kum = document.getElementById('mahaller');\n    function secimUygula() {\n      Array.prototype.forEach.call(kum.children, function (x) { if (x.dataset.mah !== undefined) x.classList.toggle('secili', x.dataset.mah === (secili || '')); });\n      map.setFilter('mah-secili', ['==', ['get', 'ad'], secili || '']);\n      \/* 97. tur: mahalle dolgusu yok *\/\n      map.setPaintProperty('bina', 'fill-extrusion-color', binaRengi());\n      isaretler.forEach(function (s) { s.el.classList.toggle('dis', secili !== null && s.p.mah !== secili); });\n    }\n    \/* TUMU (canvas'taki ilk cip; Fuat 13. tur: \"Tumu butonu nerde?\"): secimi kaldirir, acilis karesine doner. *\/\n    var tumu = document.createElement('button'); tumu.type = 'button'; tumu.dataset.mah = ''; tumu.className = 'secili';\n    tumu.appendChild(document.createTextNode(kdmlS('T\u00fcm\u00fc', 'All')));\n    tumu.addEventListener('click', function () {\n      secili = null; secimUygula(); orbitDur(); navYon = null; kartKapat();\n      map.easeTo({ center: ACILIS.center, zoom: ACILIS.zoom, pitch: ACILIS.pitch, bearing: ACILIS.bearing, duration: 1600 });\n    });\n    kum.appendChild(tumu);\n    KDML.mahalle.features.forEach(function (f) {\n      if (!f.properties.proje) return;   \/* 51. tur (Fuat): projesi 0 olan mahalle cipi gosterilmez *\/\n      var b = document.createElement('button'); b.type = 'button'; b.dataset.mah = f.properties.ad;\n      var l = document.createElement('span'); l.className = 'leke'; l.style.background = f.properties.renk;\n      b.appendChild(l); b.appendChild(document.createTextNode(f.properties.ad));\n      \/* 59. tur (Fuat): cipte proje sayisi yazilmaz *\/\n      b.addEventListener('click', function () {\n        if (secili === f.properties.ad) { secili = null; }\n        else {\n          secili = f.properties.ad;\n          orbitDur(); kartKapat();   \/* 52. tur: mahalle %4 payla kadraja, bakis 90 derece doner *\/\n          var pay = Math.round(Math.min(innerWidth, innerHeight) * 0.04), yon = yeniYon();\n          \/* 60. tur (Fuat: 'Merdivenkoy'e tiklayinca bos arazi gosteriyor'): kadraj mahalle poligonu degil, o mahallenin\n             YUKSELTILEN binalarinin kutusu; bina yoksa poligon. *\/\n          var kb = [999, 999, -999, -999], nb = 0;\n          KDML.binalar.features.forEach(function (bf) { if (bf.properties.m !== f.properties.ad) return; nb++;\n            (bf.geometry.type === 'Polygon' ? bf.geometry.coordinates[0] : bf.geometry.coordinates[0][0]).forEach(function (q) { kb[0] = Math.min(kb[0], q[0]); kb[1] = Math.min(kb[1], q[1]); kb[2] = Math.max(kb[2], q[0]); kb[3] = Math.max(kb[3], q[1]); }); });\n          var ring = nb ? [[kb[0], kb[1]], [kb[2], kb[1]], [kb[2], kb[3]], [kb[0], kb[3]], [kb[0], kb[1]]] : f.geometry.coordinates[0];\n          var kam = mahalleKamera(ring, yon, 55, { top: pay + 20, bottom: pay + 64, left: pay + (innerWidth > 900 ? 300 : 0), right: pay });\n          if (kam) map.easeTo({ center: kam.center, zoom: Math.min(16.6, kam.zoom), pitch: 55, bearing: yon, duration: 1700, easing: function (t) { return 1 - Math.pow(1 - t, 3); } });\n        }\n        secimUygula();\n      });\n      kum.appendChild(b);\n    });\n    var plan = document.createElement('button'); plan.type = 'button'; plan.className = 'plan-cip'; plan.textContent = 'Plan';\n    \/* 85. tur: PLAN KADRAJI ve SINIR \u2014 genis ekranda gorunum sinir kutusundan genis olunca MapLibre zoom'u yukari\n       zorlar (2000x990: 13,44 -> 13,93, kutu tasar). Sinir kutusu = plan kadrajinin kapladigi alan \u222a (bina kutusu +\n       gevsek paylar); boy\/en degisince yeniden kurulur. Kadraj kutusu 0,005 derece batida (Fuat: 'saga kaysin'). *\/\n    \/* 109. tur (Fuat: 'plan\u0131 \u015fu marjda offset ederek set eder misin' + 't\u00fcm beyaz k\u00fctleleri almak i\u00e7in biraz\n       kuzeyi d\u00f6nd\u00fcrebilirsin'): boyal\u0131 bant KB-GD do\u011frultusunda uzan\u0131yor; kuzey yukar\u0131 kadrajda geni\u015f ekranda iki\n       yanda bo\u015fluk kal\u0131yor, s\u0131k\u0131la\u015ft\u0131r\u0131nca da Bostanc\u0131 ucu d\u0131\u015far\u0131 ta\u015f\u0131yordu. Art\u0131k plan y\u00f6n\u00fc BANDIN KEND\u0130 EKSEN\u0130:\n       boyal\u0131 k\u00fctlelerin ana ekseni (PCA) ekran\u0131n yatay\u0131na oturtulur, sonra tam kutu o y\u00f6nde s\u0131\u011fd\u0131r\u0131l\u0131r. B\u00f6ylece\n       b\u00fct\u00fcn beyaz k\u00fctleler ekranda kal\u0131r ve \u00f6l\u00e7ek b\u00fcy\u00fcr. Kuzey oku zaten d\u00f6n\u00fcyor, y\u00f6n okunur kal\u0131yor. *\/\n    var planYon = null, planNok = [], PLAN_YON = 15.8;   \/* 111. tur: Fuat'in elle verdigi plan yonu *\/\n    function planYonHesapla() {\n      var fs = KDML.binalar.features, n = 0, sx = 0, sy = 0, px = [], py = [];\n      for (var i = 0; i < fs.length; i++) {\n        var g = fs[i].geometry, r = g.type === 'Polygon' ? g.coordinates[0] : g.coordinates[0][0];\n        var x = (r[0][0] - KDML.mrk[0]) * kx, y = (r[0][1] - KDML.mrk[1]) * ky;\n        px.push(x); py.push(y); sx += x; sy += y; n++;\n      }\n      if (!n) { planYon = 0; return; }\n      var mx = sx \/ n, my = sy \/ n, sxx = 0, sxy = 0, syy = 0;\n      for (var j = 0; j < n; j++) { var dx = px[j] - mx, dy = py[j] - my; sxx += dx * dx; sxy += dx * dy; syy += dy * dy; }\n      var th = 0.5 * Math.atan2(2 * sxy, sxx - syy);          \/* ana eksenin dogu eksenine gore acisi (rad) *\/\n      \/* 109. tur (Fuat: 'kuzeyi bir tik daha az dondurebilirsin'): tam eksen 30,3 derece cikiyor; 0,82 ile\n         yaklasik 25 dereceye cekildi \u2014 bant yine yatayina yakin, kuzey daha az sapiyor. *\/\n      planYon = Math.round(-th * 180 \/ Math.PI * 0.82 * 10) \/ 10;   \/* olculen eksen; PLAN_YON bunu ezer *\/\n      planNok = []; for (var q = 0; q < n; q++) { planNok.push(px[q], py[q]); }   \/* sigdirma icin nokta bulutu (E,N metre) *\/\n    }\n    function planKadraj() {\n      \/* 111. tur \u2014 kadraj FUAT'IN VERDIGI OLCUMDEN turetildi:\n         \"KADRAJ zoom 14.10 \u00b7 yon 15.8 \u00b7 egim 2 \u00b7 merkez 29.06136,40.97356\" (2000x950 tuval).\n         Cozumleme: o kadrajda GENISLIK baglayici (bant 5.984 m, kullanilan 1.774 px -> 3,37 m\/px = zoom 14,10);\n         dikeyde bant header\/cip seridinin altina biraz tasiyor. Merkez, kutu merkezinden ekran ekseninde\n         105 px sola ve 17 px yukari kaydirilmis. Bunlar orana cevrildi: sag pay %10,9, sol pay %0,4,\n         dikey kaydirma %1,75. Boylece her ekran boyunda ayni kadraj cikar. *\/\n      if (planYon === null) planYonHesapla();\n      var kum = document.querySelector('.kumanda');\n      var hdrAlt = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--hdrAlt')) || 0;\n      var kr = kapHarita.getBoundingClientRect(), W = kr.width || 1280, H = kr.height || 760;\n      var B = PLAN_YON, rb = B * Math.PI \/ 180, cb = Math.cos(rb), sb = Math.sin(rb);\n      var x0 = 1e18, x1 = -1e18, y0 = 1e18, y1 = -1e18;\n      for (var i = 0; i < planNok.length; i += 2) {\n        var E = planNok[i], N = planNok[i + 1];\n        var x = E * cb - N * sb, y = E * sb + N * cb;\n        if (x < x0) x0 = x; if (x > x1) x1 = x; if (y < y0) y0 = y; if (y > y1) y1 = y;\n      }\n      var yanPay = W * 0.113;                                   \/* sol %0,4 + sag %10,9 *\/\n      var dikPay = Math.max(46, hdrAlt + 10) + ((kum ? kum.offsetHeight : 76) + 10);\n      \/* dikey tasma payi: Fuat'in kadrajinda bant, kullanilabilir yuksekligin 1,30 kati kadar yer kapliyor\n         (header 140 px + cip seridi 105 px dusuldukten sonra). 1,25 ile zoom 14,02 cikiyordu, hedef 14,10. *\/\n      var mpp = Math.max((x1 - x0) \/ Math.max(240, W - yanPay), (y1 - y0) \/ Math.max(240, (H - dikPay) * 1.30));\n      var zoom = Math.log2(40075016.686 * Math.cos(KDML.mrk[1] * Math.PI \/ 180) \/ (512 * mpp));\n      var kayX = -0.0495 * W * mpp, kayY = 0.0400 * H * mpp;    \/* ekran ekseninde: sola, yukari (olculen kadraja gore ince ayar) *\/\n      var cx = (x0 + x1) \/ 2 + kayX, cy = (y0 + y1) \/ 2 + kayY;\n      var E2 = cx * cb + cy * sb, N2 = -cx * sb + cy * cb;\n      return { center: [KDML.mrk[0] + E2 \/ kx, KDML.mrk[1] + N2 \/ ky], zoom: zoom, bearing: B };\n    }\n    function sinirKur() {\n      var k = planKadraj(); if (!k) return;\n      var W = kapHarita.clientWidth || 1280, H = kapHarita.clientHeight || 760, mpp = 40075016.686 * Math.cos(k.center[1] * Math.PI \/ 180) \/ (512 * Math.pow(2, k.zoom));\n      \/* 109. tur: plan artik DONUK (bandin ekseni yatay). Donuk gorunumun kapladigi alan kuzey-yukari kutudan\n         buyuk; yari-genislik iki eksende de kosegen yaricapindan alinir, yoksa maxBounds plan olce\u011fini k\u0131s\u0131yor\n         (olculdu: zoom minZoom'a, 12,9'a dusuyordu). *\/\n      var yaricap = Math.sqrt(W * W + H * H) * mpp \/ 2;\n      var lonY = yaricap \/ kx + 0.001, latY = yaricap \/ ky + 0.001;\n      map.setMaxBounds([[Math.min(k.center[0] - lonY, binaKutu[0] - 0.018), Math.min(k.center[1] - latY, binaKutu[1] - 0.013)], [Math.max(k.center[0] + lonY, binaKutu[2] + 0.008), Math.max(k.center[1] + latY, binaKutu[3] + 0.011)]]);\n    }\n    sinirKur(); window.addEventListener('resize', sinirKur);\n    plan.addEventListener('click', function () {\n      orbitDur(); kartKapat();   \/* 69. tur (Fuat: 'bina odagindayken Plan calismiyor'): rAF orbiti jumpTo ile easeTo'yu eziyordu *\/\n      var planda = map.getPitch() < 5;\n      \/* 80. tur (Fuat, ekran goruntusu): Plan = boyanmis binalarin kutusu ekrana sigar, kuzey yukari, egim 0;\n         ikinci basista acilis karesine doner. *\/\n      if (planda) map.easeTo({ center: ACILIS.center, zoom: ACILIS.zoom, pitch: ACILIS.pitch, bearing: ACILIS.bearing, duration: 1600 });\n      else {\n        \/* 81. tur (Fuat: 'tam sigmiyor'): paylar gercek kaplamalardan \u2014 ust = header alti + 12, alt = cip seridi + 12 *\/\n        var hdrAlt = parseFloat(getComputedStyle(document.documentElement).getPropertyValue('--hdrAlt')) || 0, kum = document.querySelector('.kumanda');\n        \/* 82. tur (Fuat): kadraj bir tik saga \u2014 kutu 0,0025 derece (~210 m) batiya kaydirilir: stad biraz daha, Bostanci biraz daha az *\/\n        var kam = planKadraj(); parselYukle();\n        if (kam) map.easeTo({ center: kam.center, zoom: kam.zoom, pitch: 0, bearing: kam.bearing || 0, duration: 1600, essential: true });   \/* 109. tur: plan yonu banda gore *\/\n      }\n    });\n    map.on('move', function () { plan.classList.toggle('acik', map.getPitch() < 5); kuzey.classList.toggle('gel', map.getPitch() < 5); kuzey.style.transform = 'rotate(' + (-map.getBearing()).toFixed(1) + 'deg)'; });\n    \/* 81. tur (Fuat): planda gercek kuzey \u2014 hamburgerin altinda, yonle doner *\/\n    var kuzey = document.createElement('div'); kuzey.className = 'kuzey'; kuzey.innerHTML = '<svg viewBox=\"0 0 40 40\" width=\"40\" height=\"40\"><path d=\"M20 4 L26 26 L20 21 L14 26 Z\" fill=\"#C9704F\"\/><path d=\"M20 21 L26 26 L20 36 L14 26 Z\" fill=\"rgba(242,241,238,.35)\"\/><\/svg><span>K<\/span>';\n    kokErken.appendChild(kuzey);\n    kum.appendChild(plan);\n\n    \/* 75. tur (Fuat: 'zoom'dan sonra pan bir sure ulasilmaz'): gecikme sayaci \u2014 mousedown'dan ilk s\u00fcr\u00fckleme karesine ms,\n       son tekerlekten ilk s\u00fcr\u00fcklemeye ms; HUD'da (?olcum) gorunur, Fuat kendi makinesinde okur. *\/\n    var olcBasma = 0, olcSonTeker = 0, olcGecikme = '-', olcZoomPan = '-';\n    cvEl.addEventListener('mousedown', function (e) { if (e.button === 0) olcBasma = performance.now(); });\n    cvEl.addEventListener('wheel', function () { olcSonTeker = performance.now(); }, { passive: true });\n    \/* 76. tur: olay gunlugu \u2014 son 8 olay (mousedown hedefi, dragstart, movestart, moveend) HUD'da *\/\n    var olcGun = [], olcT0 = performance.now();\n    function olcNot(ad) { olcGun.push(((performance.now() - olcT0) \/ 1000).toFixed(1) + 's ' + ad); if (olcGun.length > 8) olcGun.shift(); }\n    map.getContainer().addEventListener('mousedown', function (e) { var t = e.target, ad = (t.className && typeof t.className === 'string') ? t.className.split(' ')[0] : t.tagName; olcNot('down b' + e.button + ' ' + String(ad).slice(0, 18)); }, true);\n    map.getContainer().addEventListener('mouseup', function () { olcNot('up'); }, true);\n    map.on('dragstart', function () { olcNot('dragstart'); });\n    map.on('movestart', function () { olcNot('movestart' + (map.isZooming() ? '-zoom' : '')); });\n    map.on('moveend', function () { olcNot('moveend'); });\n    map.on('dragstart', function () { if (olcBasma) { olcGecikme = Math.round(performance.now() - olcBasma) + ' ms'; if (olcSonTeker) olcZoomPan = Math.round(performance.now() - olcSonTeker) + ' ms'; } });\n    \/* olcum (54. tur: yalniz ?olcum ile) *\/\n    if (\/(^|[?&])olcum(=|&|$)\/.test(location.search)) document.querySelector('.olcum').style.display = 'block';\n    if (\/(^|[?&])olcum(=|&|$)\/.test(location.search)) document.getElementById('kadraj').style.display = 'block';\n    if (\/(^|[?&])olcum(=|&|$)\/.test(location.search)) { window.kdmlMap = map; window.kdmlIsaret = isaretler; }\n    \/* 91. tur: degisken adi yukEkr \u2014 asagidaki HUD sayaci 'yuk' ayni kapsamda, var hoisting yuzunden silme calismiyordu *\/\n    \/* 98. tur: harita hazir -> sayac 00'a kosar, sonra perde kapanir *\/\n    window.kdmlYukKapat = function () {\n      var y = document.getElementById('yukleyici'); if (!y) return;\n      y.classList.add('git'); if (window.kdmlHaritaGel) window.kdmlHaritaGel();\n      setTimeout(function () { if (y.parentNode) y.parentNode.removeChild(y); }, 1600);   \/* 102. tur: gecis 1,4 s *\/\n    };\n    if (window.kdmlSayBit) window.kdmlSayBit(); else window.kdmlYukKapat();   \/* 88. tur: olcum kipinde harita tutamagi \u2014 katman\/kamera durumu tarayicidan sorgulanabilir (yalniz ?olcum ile) *\/\n    var kare = 0, son = performance.now(), sonKare = performance.now(), sure = [], yuk = 0, uzunMs = 0;\n    map.on('sourcedata', function (e) { if (e.tile) yuk++; });\n    if (window.PerformanceObserver) { try { new PerformanceObserver(function (l) { l.getEntries().forEach(function (e) { uzunMs += e.duration; }); }).observe({ entryTypes: ['longtask'] }); } catch (e) {} }\n    map.on('render', function () { var a = performance.now(); if (map.isMoving()) sure.push(a - sonKare); sonKare = a; kare++; });\n    setInterval(function () {\n      var a = performance.now(), fps = kare \/ ((a - son) \/ 1000); kare = 0; son = a;\n      sure.sort(function (x, y) { return x - y; });\n      var ort = sure.length ? sure[sure.length >> 1].toFixed(1) : '-';\n      \/* 110. tur (Fuat: 'zoom kararimizi askiya al, HUD'a yaz, istedigim kadraji sayisal vereyim'): ilk satir\n         yalniz KADRAJ \u2014 elle cerceveleyip bu dort sayiyi okuyor, plan hedefi ondan kuruluyor. *\/\n      var kd = map.getCenter();\n      document.getElementById('kadraj').textContent = 'KADRAJ  zoom ' + map.getZoom().toFixed(2) + '  \u00b7  y\u00f6n ' + map.getBearing().toFixed(1) + '  \u00b7  e\u011fim ' + map.getPitch().toFixed(0) + '  \u00b7  merkez ' + kd.lng.toFixed(5) + ',' + kd.lat.toFixed(5);\n      document.getElementById('olcum').textContent = KDML.binalar.features.length + ' bina \u00b7 ' + KDML.projeler.features.length + ' proje \u00b7 ' +\n        (map.isMoving() ? fps.toFixed(0) + ' fps \u00b7 ' + ort + ' ms\/kare \u00b7 HAREKET' : 'bo\u015fta') + ' \u00b7 s\u00fcr\u00fckle gecikme ' + olcGecikme + ' \u00b7 zoom\u2192pan ' + olcZoomPan + ' \u00b7 zoom ' + map.getZoom().toFixed(1) + ' \u00b7 e\u011fim ' + map.getPitch().toFixed(0) + '\u00b0' + ' \u00b7 y\u00f6n ' + map.getBearing().toFixed(0) + '\u00b0' + ' \u2016 ' + olcGun.join(' \u00b7 ') + (function () {\n          \/* 43. tur (Fuat: 'bulundugun yer ve yukseklik de yazsin'): merkez, mrk'ye gore m, kamera mesafesi ve yerden yuksekligi *\/\n          var c = map.getCenter(), t = map.transform, mppK = 40075016 * Math.cos(c.lat * Math.PI \/ 180) \/ (512 * Math.pow(2, map.getZoom()));\n          var mesafe = t.cameraToCenterDistance * mppK, yuk = mesafe * Math.cos(map.getPitch() * Math.PI \/ 180);\n          return ' \u00b7 merkez ' + c.lng.toFixed(5) + ',' + c.lat.toFixed(5) + ' (mrk ' + ((c.lng - KDML.mrk[0]) * kx).toFixed(0) + '\/' + ((c.lat - KDML.mrk[1]) * ky).toFixed(0) + ' m)' + ' \u00b7 mesafe ' + mesafe.toFixed(0) + ' m \u00b7 y\u00fckseklik ' + yuk.toFixed(0) + ' m';\n        })() +\n        (yuk ? ' \u00b7 y\u00fck ' + yuk : '') + (uzunMs ? ' \u00b7 UZUN ' + Math.round(uzunMs) + ' ms' : '');\n      sure = []; yuk = 0; uzunMs = 0;\n    }, 500);\n    document.getElementById('olcum').textContent = 'haz\u0131r';\n    \/* 39. tur: cizim araci kaldirildi (Fuat poligonu ek-bolge.json'a alindi) *\/\n    \/* ---- ANLATIMLI GIRIS v2 (17. tur; Fuat: \"siyahtan fade in baslik, fade out, sonra 1 s once harekete\n       baslamis harita fade in, focustaki yerleri yukselterek Moda'ya devam\"). Zamanlar yuklemeden itibaren ms:\n       300 baslik gelir \u00b7 3300 baslik gider \u00b7 3600 ucus baslar (UCUS.gecikme) \u00b7 4600 perde acilir (1,3 s) \u00b7\n       5000 dalga cephesi yola cikar (DALGA_HIZ m\/s, kameradan hizli, hep onunde) \u00b7 pinler dalga kendilerine\n       gelince \u00b7 8000\/12300 iki satir \u00b7 16000 arayuz. Dalga bati ucunu gecince durur (cephe 1e6). ---- *\/\n    var kok = document.getElementById('kdmlHarita').parentElement, introAcik = true, introZam = [];\n    kok.classList.add('kd-intro'); kok.classList.add('kd-pinsiz');\n    var perde = document.createElement('div'); perde.className = 'perde'; kok.appendChild(perde);\n    var anl = document.createElement('div'); anl.className = 'anlati';\n    var SATIR = [   \/* 36. tur (Fuat): baslik kaldirildi, animasyon yuklenir yuklenmez *\/\n    ].map(function (t) {\n      var d = document.createElement('div'); d.className = 'satir';\n      var b = document.createElement('div'); b.className = 'buyuk'; b.textContent = t[0];\n      var k = document.createElement('div'); k.className = 'kucuk'; k.textContent = t[1];\n      d.appendChild(b); d.appendChild(k); anl.appendChild(d); return d;\n    });\n    kok.appendChild(anl);\n    var atla = document.createElement('button'); atla.type = 'button'; atla.className = 'atla'; atla.textContent = kdmlS('Atla', 'Skip'); kok.appendChild(atla);\n    \/* 93. tur (Fuat: 'bastan harita altligi tum gelse sonra mi binalar boyanmaya baslasa'): acilis zinciri\n       (baslik, ucus, dalga, pinler) KAROLAR HAZIR OLANA kadar kuyrukta bekler; en gec 4,5 s'de baslar.\n       Kiyi taramasi ve perde disarida degil \u2014 onlar altligin parcasi, hemen calisir. *\/\n    var introKuyruk = [], introBasladi = false;\n    function zam(ms, f) { if (introBasladi) introZam.push(setTimeout(f, ms)); else introKuyruk.push([ms, f]); }\n    function introBaslat() {\n      if (introBasladi) return; introBasladi = true;\n      introKuyruk.forEach(function (q) { introZam.push(setTimeout(q[1], q[0])); }); introKuyruk = [];\n    }\n    \/* 99. tur: perde arkasinda karo isitma \u2014 cephe bir an icin sonsuz yapilir ki isci butun bina karolarini\n       kursun ve boya dizileri hazir olsun; sonra geri alinir. Sayac bu evrede %86'dan 100'e yurur. *\/\n    (function karoIsit(t0) {\n      var p = performance.now() - t0;\n      if (window.kdmlIlerle) window.kdmlIlerle(0.86 + 0.14 * Math.min(1, p \/ 3500));\n      if (p < 200) { map.setGlobalStateProperty('cephe', 1e7); setTimeout(function () { karoIsit(t0); }, 120); return; }\n      if (map.areTilesLoaded() || p > 4500) { map.setGlobalStateProperty('cephe', -1e6); if (window.kdmlIlerle) window.kdmlIlerle(1); introBaslat(); return; }   \/* 99. tur: karolar erken hazir olunca sayac 100'e cekilmeden cikiliyordu, perde asili kaliyordu *\/\n      setTimeout(function () { karoIsit(t0); }, 120);\n    })(performance.now());\n    var DALGA_HIZ = 0.267, DALGA_EASE = 2700, DALGA_ONDE = 800, DALGA_RAMPA = 8040, DALGA_KADEME = 6700, DALGA_T0 = 400, DALGA_UCUS_SON = UCUS.gecikme + UCUS.sure - 400, uSonKam = 0, uBas = -400, uSon = 0, dalgaZam = null;\n    \/* 33. tur (Fuat: 'Bostanci hala zipliyor'): cephe -400'den basliyordu; u < -800 olan dogu ucu binalari ilk adimda\n       sifirdan tam boya firliyordu. Baslangic = en dogudaki binanin u'su - rampa. *\/\n    KDML.binalar.features.forEach(function (f) { if (f.properties.u > uSon) uSon = f.properties.u; if (f.properties.u < uBas + 30) uBas = f.properties.u - 30; });   \/* 35. tur: en dogudaki binanin 30 m gerisi \u2014 ilk binalar hemen yukselmeye baslar *\/\n    uSon += DALGA_GEN + 200; uSonKam = uHesap(ACILIS.center[0], ACILIS.center[1]);\n    function cepheAyarla(u) { map.setGlobalStateProperty('cephe', u); }\n    \/* 19. tur (Fuat: \"dalga yavas olsun, kameradan cok onde gidiyor\"): cephe = min(dogrusal 180 m\/s,\n       max(kamera + 800 m, onceki + 180 m\/s x tik)). Baslangicta dogrusal terim yonetir (Bostanci'dan\n       kademeli), sonra kameraya kilitlenir (odagin 800 m onunde), kamera durunca kendi hiziyla bati ucuna\n       kadar surer; bitince arayuz gelir (introBitir). *\/\n    function dalgaBasla() {\n      var t0 = performance.now(), sonTik = t0, cepheSon = uBas;\n      (function tik() {\n        var simdi = performance.now(), c = map.getCenter(), dt = simdi - t0;\n        \/* 30. tur: dalga ucustan once (karanlikta) basliyor; ucus henuz baslamadiysa da 'ucusta' say, yoksa cephe hemen 1e6 oluyordu *\/\n        var ucusta = orbitAcik && (dt < (UCUS.gecikme - DALGA_T0) + 400 || map.isMoving());\n        \/* Fuat (19. tur): \"kamera hareketi bittiginde dalga da tamamlanmis olmali, faz farki olmasin\".\n           Ilk 10 s: min(dogrusal 180 m\/s, kamera+800) \u2014 Bostanci'dan kademeli. Sonra kameraya kilitli\n           (odagin 800 m onunde; u ekseni ekranda sol-alta baktigi icin on = alt kenar civari). Son 12 s'de\n           on pay dogrusal buyur, ucus bitiminde cephe = bati ucu (kalan bolge ekran disinda). Ucus biterse\n           (ya da erken durursa) cephe hemen tamamlanir. *\/\n        var onde = DALGA_ONDE + Math.max(0, uSon - uSonKam - DALGA_ONDE) * Math.max(0, Math.min(1, (dt - (DALGA_UCUS_SON - 1500 - DALGA_RAMPA)) \/ DALGA_RAMPA));   \/* 48. tur: rampa ucus bitiminden 1,5 s once tamamlanir *\/\n        var kam = uHesap(c.lng, c.lat) + onde;\n        \/* 32. tur (Fuat: 'Bostanci cok hizli zipliyor'): cephe sifir hizdan baslar, DALGA_EASE icinde tam hiza cikar *\/\n        var yol = dt < DALGA_EASE ? dt * dt \/ (2 * DALGA_EASE) : dt - DALGA_EASE \/ 2;\n        \/* kademe -> kamera kilidi gecisinde cephe si\u00e7ramasin: hedefe en fazla 1,6 x dalga hiziyla yaklasilir *\/\n        var hedef = dt < DALGA_KADEME ? Math.min(uBas + yol * DALGA_HIZ, kam) : kam;\n        \/* 46. tur: ucus bitince kalan bolge tek seferde firlamasin \u2014 600 m\/s kuyrukla tamamlanir, yazi ondan sonra *\/\n        var u = !ucusta ? cepheSon + (simdi - sonTik) * 0.6 : Math.min(hedef, cepheSon + (simdi - sonTik) * DALGA_HIZ * 1.6);\n        sonTik = simdi; cepheSon = Math.max(cepheSon, u);\n        \/* 93. tur (Fuat: 'hala asenkron'): pin saf DOM, bina ise WebGL + isci is parcacigi \u2014 yavas makinede bina\n           gecikir, pin zamaninda duser. Birakma artik UC kosula bagli: mesafe payi (260 m), karolarin gercekten\n           yuklenmis olmasi (areTilesLoaded) ve kosul saglandiktan sonra PIN_GECIK ms duvar saati. *\/\n        isaretler.forEach(function (s) {\n          if (!s.bekle) return;\n          \/* 93. tur: bina TAM yukseldigi an (cephe = u + DALGA_GEN) isaretlenir; pin o andan PIN_GECIK ms VE en az\n             PIN_KARE cizilmis kare sonra duser. Mesafe payi cephe hizina gore 0,1-3 s arasi degisiyordu; kare kosulu\n             yavas makinede kendiliginden uzar (bina gercekten cizilmeden pin dusmez). areTilesLoaded ucusta surekli\n             false oldugu icin kullanilmiyor \u2014 sabit 2 s gecikme yaratiyordu. *\/\n          if (!s.bitisT) { if (s.u + DALGA_GEN <= cepheSon) { s.bitisT = simdi; s.kare0 = cizimKare; } return; }\n          if (simdi - s.bitisT < PIN_GECIK || cizimKare - s.kare0 < PIN_KARE) return;\n          s.bekle = false; (s.el.querySelector('.igne') || s.el).classList.remove('bekle');\n        });\n        if (cepheSon >= uSon) { cepheAyarla(1e6); dalgaZam = null;\n          \/* 93. tur: son binalar tek karede oturuyor; kalan pinler karolar yuklenene kadar (en gec 2,5 s) bekler *\/\n          (function sonPin(t0) {\n            if (map.areTilesLoaded() || performance.now() - t0 > 2500) setTimeout(function () { pinleriGoster(false); }, 350);\n            else setTimeout(function () { sonPin(t0); }, 120);\n          })(performance.now());\n          setTimeout(function () { introBitir(false); }, 1800); return; }   \/* 92. tur: son binalar tek karede oturuyor; kalan pinler 450 ms SONRA dusuyor (once bina, sonra pin) *\/   \/* 48. tur: son binalar ve pinler otursun, yazi 1,5 s sonra *\/\n        cepheAyarla(cepheSon); dalgaZam = setTimeout(tik, 160);   \/* 95. tur (Fuat): adim 120 -> 160 ms; her adimda bina katmani yeniden suzuluyor, yavas makinede yuk azalir *\/\n      })();\n    }\n    function pinleriGoster(dalgayla) {\n      isaretler.forEach(function (s) {\n        var el = s.el.querySelector('.igne') || s.el;\n        \/* 89. tur (Fuat: 'acilista pinler onceden geliyor gibi'): binalarin u'suna binaya ozgu +-200 m sapma ekleniyor,\n           pin ise ham konumdan hesapliyordu -> sapmasi gec olan binanin pini bina yukselmeden cikiyordu. Kendi binasinin u'su varsa o. *\/\n        s.u = (s.bu === undefined || s.bu === null) ? uHesap(s.ll[0], s.ll[1]) : s.bu; s.bekle = !!dalgayla;\n        el.classList.toggle('bekle', !!dalgayla);   \/* dalgayla: cephe gecince tik icinde acilir *\/\n      });\n      kok.classList.remove('kd-pinsiz');\n    }\n    function introBitir(atlandi) {\n      if (!introAcik) return; introAcik = false;\n      introZam.forEach(clearTimeout);\n      if (atlandi) { if (dalgaZam) { clearTimeout(dalgaZam); dalgaZam = null; } cepheAyarla(1e6); pinleriGoster(false); if (kiyiZam) { clearTimeout(kiyiZam); kiyiZam = null; } map.setGlobalStateProperty('kiyiT', 1); }\n      else { if (dalgaZam) { clearTimeout(dalgaZam); dalgaZam = null; cepheAyarla(1e6); } pinleriGoster(false); }   \/* 92. tur: dalga kendiliginden bittiyse dalgaZam null olur, eskiden kalan pinler hic acilmiyordu *\/\n      perde.classList.add('ac');\n      SATIR.forEach(function (d) { d.classList.remove('gel'); });\n      kok.classList.remove('kd-intro');\n      setTimeout(function () { anl.remove(); atla.remove(); perde.remove(); }, 1400);\n    }\n    atla.addEventListener('click', function () {\n      introBitir(true); orbitIptal();\n      map.easeTo({ center: ACILIS.center, zoom: ACILIS.zoom, pitch: ACILIS.pitch, bearing: ACILIS.bearing, duration: 1400 });\n    });\n    ['mousedown', 'wheel', 'touchstart', 'keydown'].forEach(function (ev) { map.getContainer().addEventListener(ev, function () { introBitir(true); }, { passive: true }); });\n    \/* 18. tur sirasi: 300 baslik gelir (harita altta %10) \u00b7 3300 baslik gider \u00b7 3600 ucus baslar \u00b7 4200 perde\n       acilir (1,3 s) \u00b7 4400 dalga ve pinler \u00b7 9000 arayuz (dalga surerken). *\/\n    zam(150, function () { perde.classList.add('ac'); });   \/* 36. tur: perde hemen acilir (1,3 s) *\/\n    \/* 49. tur: kiyi egrileri 300 ms'den itibaren 7 s'de kiyidan aciga (12 adim\/s) *\/\n    var kiyiZam = null;\n    (function kiyiBasla() { var t0 = performance.now() + 300; (function tik() { var u = Math.max(0, Math.min(1, (performance.now() - t0) \/ 7000)); map.setGlobalStateProperty('kiyiT', u * (2 - u)); if (u < 1) kiyiZam = setTimeout(tik, 85); else kiyiZam = null; })(); })();\n    zam(DALGA_T0, function () { dalgaBasla(); pinleriGoster(true); });\n    \/* arayuz: dalga bitince (dalgaBasla icinde), Fuat: \"yazi bandi dalgayi ortuyor, en son fade in olsun\" *\/\n    var DALGA = { A: 2.6, T: 5200, fps: 12, son: 0 };\n    (function dalga(ts) {\n      requestAnimationFrame(dalga);\n      if (document.hidden || ts - DALGA.son < 1000 \/ DALGA.fps) return;\n      DALGA.son = ts;\n      var w = 2 * Math.PI * ts \/ DALGA.T;\n      for (var g = 0; g < 4; g++) { var f = w + g * 1.25, tr = [DALGA.A * Math.sin(f), DALGA.A * Math.cos(f)];\n        if (g === 3) map.setPaintProperty('kiyi-y3', 'line-translate', tr);\n        else ['', 'b', 'c'].forEach(function (ek) { if (map.getLayer('kiyi-y' + g + ek)) map.setPaintProperty('kiyi-y' + g + ek, 'line-translate', tr); }); }\n      \/* 61. tur: stil suzulmesi \u2014 c1 0 -> 1,3 -> 0 (24 s ping-pong), c2 = c1 - 0,25; a: p > c1, b: c2..c1, c: p < c2 *\/\n      var u = (ts % 12000) \/ 12000, c1 = (u < 0.5 ? u * 2 : 2 - u * 2) * 1.3, c2 = c1 - 0.25;   \/* 62. tur: periyot 12 s (6 kesim) *\/\n      kiyiKatman.forEach(function (L) {\n        var m = L.st === 0 ? kiyiMaske(L.rgb, c1, 1.01) : L.st === 1 ? kiyiMaske(L.rgb, c2, c1) : kiyiMaske(L.rgb, -0.01, c2);\n        if (L.k === 2 && L.st === 2) m = kiyiMaske(L.rgb, -0.01, c1);   \/* k2'de ara asama yok: duz cizgi dogrudan c1'e kadar *\/\n        map.setPaintProperty(L.id, 'line-gradient', m);\n      });\n    })(0);\n    \/* ACILIS UCUSU: UCUS.bas -> ACILIS.center (bkz. UCUS). Onceki surum (yon 75 -> 88 orbiti) kalkti.\n       Hiz m\/ms sabit ki boy degisiminden sonra kalan yol ayni tempoyla bitsin. *\/\n    orbitAcik = true;\n    var UCUS_YOL = Math.hypot((ACILIS.center[0] - UCUS.bas[0]) * kx, (ACILIS.center[1] - UCUS.bas[1]) * ky), UCUS_HIZ = UCUS_YOL \/ UCUS.sure;\n    function orbitIptal() { if (orbitAcik) { orbitAcik = false; map.stop(); } }\n    orbitSur = function () {\n      var c = map.getCenter(), kalan = Math.hypot((ACILIS.center[0] - c.lng) * kx, (ACILIS.center[1] - c.lat) * ky);\n      if (kalan < 2) return;\n      map.easeTo({ center: ACILIS.center, zoom: ACILIS.zoom, bearing: ACILIS.bearing, pitch: ACILIS.pitch, duration: kalan \/ UCUS_HIZ, easing: function (x) { return x; } });\n    };\n    ['mousedown', 'wheel', 'touchstart', 'keydown'].forEach(function (ev) { map.getContainer().addEventListener(ev, function () { orbitIptal(); orbitDur(); }, { passive: true }); });\n    document.getElementById('mahaller').addEventListener('click', orbitIptal, true);\n    zam(UCUS.gecikme, function () { if (orbitAcik) orbitSur(); });   \/* 93. tur: ucus da kuyrukta *\/\n  });\n})();<\/script>\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":"","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-3428","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/pages\/3428","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/comments?post=3428"}],"version-history":[{"count":3,"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/pages\/3428\/revisions"}],"predecessor-version":[{"id":3551,"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/pages\/3428\/revisions\/3551"}],"wp:attachment":[{"href":"https:\/\/bfta.com.tr\/en\/wp-json\/wp\/v2\/media?parent=3428"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}