{"id":63,"date":"2025-07-17T14:49:51","date_gmt":"2025-07-17T14:49:51","guid":{"rendered":"https:\/\/gazebo-ist.com\/?page_id=63"},"modified":"2025-10-03T10:10:29","modified_gmt":"2025-10-03T10:10:29","slug":"menu_","status":"publish","type":"page","link":"https:\/\/gazebo-ist.com\/en\/menu_\/","title":{"rendered":"Menu"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"63\" class=\"elementor elementor-63\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4a909a0 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"4a909a0\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-ad08d8c e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"ad08d8c\" data-element_type=\"container\" data-settings=\"{&quot;background_background&quot;:&quot;classic&quot;}\">\n\t\t<div class=\"elementor-element elementor-element-3ea109b e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"3ea109b\" data-element_type=\"container\">\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-80f90de e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"80f90de\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-aac5b5a e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"aac5b5a\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-c4d7470 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"c4d7470\" data-element_type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-56eaba7 e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"56eaba7\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-30bed54 elementor-widget elementor-widget-heading\" data-id=\"30bed54\" data-element_type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h3 class=\"elementor-heading-title elementor-size-default\">Our Menu<\/h3>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-0ce99cd e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"0ce99cd\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cc326be elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"cc326be\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>From appetizers to mains, from seafood to signature desserts, our menu caters to every palate.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-af3ae7e e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-parent\" data-id=\"af3ae7e\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-860f764 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no e-con e-child\" data-id=\"860f764\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2eda320 elementor-widget elementor-widget-html\" data-id=\"2eda320\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- Montserrat -->\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Montserrat:wght@400;600;700;800&display=swap\" rel=\"stylesheet\">\n\n<style>\n  :root{\n    --space-xs:.75rem; --space-sm:1rem; --space-md:1.5rem; --space-lg:2rem;\n    --color-text:#020101; --color-muted:#595959; --color-border:#e9e9e9;\n    --maxw:1200px; --radius:20px;\n  }\n\n  html,body{margin:0;padding:0}\n  #qr-menu-app{\n    max-width:var(--maxw);margin:0 auto;padding:var(--space-lg) var(--space-md);\n    overflow-anchor:none;\n  }\n  #qr-menu-app *{box-sizing:border-box}\n\n  \/* T\u00dcM YAZILAR MONTSERRAT *\/\n  #qr-menu-app,\n  #qr-menu-app *:not(svg):not(path){\n    font-family:'Montserrat',system-ui,-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,Arial,sans-serif !important;\n    color:var(--color-text) !important;\n    -webkit-text-fill-color:var(--color-text) !important;\n  }\n\n  .visually-hidden{position:absolute!important;left:-9999px!important;top:auto!important;width:1px;height:1px;overflow:hidden}\n\n  \/* ==== Kategoriler alt alta (akordeon) ==== *\/\n  .accordion{display:flex;flex-direction:column;gap:.5rem}\n  details.acc{border-bottom:1px solid var(--color-border);padding:.35rem 0;scroll-margin-top:12px;}\n  details.acc[open]{padding-bottom:var(--space-sm)}\n  summary.acc-h{\n    all:unset; display:block; cursor:pointer; padding:.15rem .05rem;\n    letter-spacing:.2px; line-height:1.35; border-bottom:1px solid transparent;\n    font-size:clamp(1.1rem,.35vw + 1rem,1.25rem);\n    transition:border-color .15s ease, transform .12s ease;\n    font-weight:400;\n  }\n  details.acc[open] > summary.acc-h{\n    font-size:clamp(1.35rem,1.1vw + 1.15rem,1.8rem);\n    font-weight:800;\n  }\n  summary.acc-h:hover, summary.acc-h:focus-visible{border-color:var(--color-border); outline:none; transform:translateX(1px)}\n  summary::-webkit-details-marker{display:none}\n\n  \/* ==== \u00dcr\u00fcn liste (g\u00f6rselsiz) ==== *\/\n  .products-list{display:block; content-visibility:auto; contain-intrinsic-size:400px;}\n  .prod-card{padding:1rem 0;border-bottom:1px solid var(--color-border)}\n  .prod-card:last-child{border-bottom:none}\n\n  .prod-title{margin:0 0 .35rem 0;font-size:clamp(1.2rem,1vw + 1rem,1.9rem);font-weight:400}\n  .price{margin:.05rem 0 .55rem 0;font-size:clamp(1.02rem,.2vw + .98rem,1.08rem);font-weight:700}\n  .price *{font-weight:inherit !important;}\n  .prod-desc{margin:0;color:var(--color-muted)}\n  .prod-desc p{margin:0}\n\n  \/* === Mobil (\u2264640px): t\u00fcm yaz\u0131lar %20 k\u00fc\u00e7\u00fck + SADECE \u00fcr\u00fcn ba\u015fl\u0131klar\u0131 bold === *\/\n  @media (max-width:640px){\n    html{ font-size:80%; } \/* rem tabanl\u0131 t\u00fcm metinleri %20 k\u00fc\u00e7\u00fclt\u00fcr *\/\n    .price{font-size:clamp(1.15rem,2.2vw + 1rem,1.3rem)}\n    .prod-desc{font-size:calc(1em - 1pt);}\n    .prod-title{ font-weight:700 !important; } \/* sadece ba\u015fl\u0131klar\u0131 mobilde kal\u0131n yap *\/\n  }\n\n  \/* Skeleton *\/\n  .skeleton{position:relative;overflow:hidden;background:linear-gradient(90deg,#eee,#f7f7f7,#eee);\n    background-size:200% 100%;animation:skeleton 1.1s linear infinite;border-radius:10px}\n  @keyframes skeleton{0%{background-position:200% 0}100%{background-position:-200% 0}}\n  .skeleton.line{height:14px;border-radius:8px}\n  .skeleton.line.wide{width:70%}.skeleton.line.mid{width:60%}.skeleton.line.short{width:40%}\n\n  \/* ==== Alt kategori akordeonu (ikinci seviye) ==== *\/\n  details.acc-sub{padding:.15rem 0 .75rem 0; border-bottom:1px solid var(--color-border); margin:.15rem 0 .35rem 0}\n  details.acc-sub:last-child{border-bottom:none}\n  summary.acc-h-sub{\n    all:unset; display:block; cursor:pointer; padding:.1rem .05rem; letter-spacing:.15px; line-height:1.35;\n    font-size:clamp(1.02rem,.5vw + .9rem,1.15rem); font-weight:600; border-bottom:1px solid transparent;\n    transition:border-color .15s ease, transform .12s ease;\n  }\n  details.acc-sub[open] > summary.acc-h-sub{\n    font-size:clamp(1.1rem,.7vw + .95rem,1.25rem); font-weight:700;\n  }\n  summary.acc-h-sub:hover, summary.acc-h-sub:focus-visible{border-color:var(--color-border); outline:none; transform:translateX(1px)}\n\n  \/* === Alkoll\u00fc \/ Alkols\u00fcz ba\u015fl\u0131klar\u0131 BOLD OLMASIN === *\/\n  summary.acc-h-sub.no-bold,\n  details.acc-sub[open] > summary.acc-h-sub.no-bold{\n    font-weight:400 !important;\n  }\n  \n  \/* === Mobil (\u2264640px): \u00fcr\u00fcn ba\u015fl\u0131klar\u0131n\u0131 k\u00fc\u00e7\u00fclt + daha sakin tipografi === *\/\n@media (max-width:640px){\n  html{\n    -webkit-text-size-adjust: 100%;\n    font-size: 80%;\n  }\n\n  \/* K\u00f6k ba\u015fl\u0131klar (\u00f6r. \"Ana Yemekler\") *\/\n  summary.acc-h{\n    font-size: clamp(1rem, 1.2vw + 0.90rem, 1.10rem);\n    line-height: 1.25;\n  }\n  details.acc[open] > summary.acc-h{\n    font-size: clamp(1.05rem, 1.4vw + 0.95rem, 1.20rem);\n    font-weight: 700;\n  }\n\n  \/* Alt ba\u015fl\u0131klar *\/\n  summary.acc-h-sub{\n    font-size: clamp(.95rem, 1vw + .85rem, 1.05rem);\n    line-height: 1.24;\n  }\n  details.acc-sub[open] > summary.acc-h-sub{\n    font-size: clamp(1rem, 1.2vw + .9rem, 1.15rem);\n    font-weight: 600;\n  }\n\n\/* Mobilde \u00fcr\u00fcn ba\u015fl\u0131\u011f\u0131: biraz daha b\u00fcy\u00fck, a\u011f\u0131rl\u0131k 600 *\/\n@media (max-width:640px){\n  .prod-title{\n    \/* min | fluid | max *\/\n    font-size: clamp(1.10rem, 1.4vw + 1.00rem, 1.35rem) !important;\n    font-weight: 600 !important;\n    line-height: 1.25;\n    margin-bottom: .28rem;\n  }\n}\n\n  \/* Fiyat ve a\u00e7\u0131klama *\/\n  .price{\n    font-size: clamp(.95rem, .6vw + .90rem, 1.05rem);\n    margin: .05rem 0 .40rem 0;\n  }\n  .prod-desc{\n    font-size: .95em;\n    line-height: 1.32;\n  }\n}\n\n\/* \u00c7ok k\u00fc\u00e7\u00fck cihazlar (\u2264360px) i\u00e7in biraz daha s\u0131k\u0131 \u00f6l\u00e7ek *\/\n@media (max-width:360px){\n  .prod-title{ font-size: clamp(.95rem, 1.8vw + .80rem, 1.05rem) !important; }\n  .price{ font-size: .95rem; }\n}\n\n\/* =========================\n   REV\u0130ZE \u2014 SADECE G\u00d6RSEL\n   1) \u00dcr\u00fcn ba\u015fl\u0131\u011f\u0131 rengi #89978b\n   2) Fiyat\u0131 \u00fcr\u00fcn ad\u0131yla ayn\u0131 sat\u0131ra al\n   (Markup de\u011fi\u015fmeden, sadece CSS ile)\n   ========================= *\/\n#qr-menu-app .prod-title{\n  color:#89978b !important;\n  -webkit-text-fill-color:#89978b !important;\n}\n\n\/* Ba\u015fl\u0131k ve fiyat ayn\u0131 sat\u0131r *\/\n#qr-menu-app .prod-card{\n  display:grid;\n  grid-template-columns: 1fr auto;   \/* ba\u015fl\u0131k | fiyat *\/\n  grid-auto-rows:auto;\n  column-gap:.75rem;\n  row-gap:.35rem;                    \/* eski .prod-title margin-bottom hissi *\/\n  align-items:baseline;\n}\n\n\/* Grid yerle\u015fimleri *\/\n#qr-menu-app .prod-title{ grid-column:1; margin:0; }\n#qr-menu-app .price{ grid-column:2; grid-row:1; margin:0; white-space:nowrap; }\n#qr-menu-app .prod-desc{ grid-column:1 \/ -1; margin:0; }\n\n\/* Skeleton sat\u0131rlar\u0131n\u0131n tek sat\u0131r kaplamas\u0131 i\u00e7in *\/\n#qr-menu-app .prod-card .skeleton.line{ grid-column:1 \/ -1; }\n<\/style>\n\n<div id=\"qr-menu-app\" role=\"region\" aria-label=\"QR Men\u00fc\">\n  <section id=\"categories-view\" aria-labelledby=\"categories-heading\">\n    <h1 id=\"categories-heading\" class=\"visually-hidden\">Kategoriler<\/h1>\n    <div class=\"accordion\" id=\"accordion\"><\/div>\n  <\/section>\n<\/div>\n\n<script>\n\/* ===========================\n   WooCommerce Store API \u2014 Akordeon Men\u00fc (g\u00f6rselsiz, D\u0130NAM\u0130K)\n   ANA BA\u015eLIKLAR SIRASI SAB\u0130T ve\n   ALT kategorisi olan \u00dcST ba\u015fl\u0131klarda \u00fcr\u00fcn listeleme yapma.\n   =========================== *\/\n(async () => {\n  \"use strict\";\n\n  const API_BASE       = 'https:\/\/gazebo-ist.com\/wp-json\/wc\/store';\n  const CATS_ENDPOINT  = `${API_BASE}\/products\/categories`;\n  const PRODS_ENDPOINT = `${API_BASE}\/products`;\n  const PER_PAGE       = 100;\n  const SCROLL_OFFSET  = 12;\n\n  const ORDER = [\n    'kahvalti','baslangiclar','mezeler','salatalar',\n    'deniz-mahsulleri','ana-yemekler','tatli-kahveler',\n    'beyaz-saraplar','kirmizi-saraplar','cocktail-alkoller'\n  ];\n\n  const accRoot = document.getElementById('accordion');\n\n  \/\/ durum\n  let slugToCat = new Map();\n  let idToChildren = new Map();\n  let idToParentId = new Map();\n  const productCache = new Map();\n\n  \/\/ \"&\" -> \" ve \" d\u00fczelt\n  const pretty = (s) => (s || '').replace(\/&amp;|&\/g, ' ve ');\n\n  \/\/ g\u00fcvenli HTML (fiyat ve a\u00e7\u0131klama)\n  function sanitizeHTML(dirty, {allowedTags=['BR','EM','STRONG','UL','OL','LI','P','SPAN','INS','DEL','BDI'], allowedAttrs={'SPAN':['class']}}={}) {\n    if (!dirty) return '';\n    const parser = new DOMParser();\n    const doc = parser.parseFromString(`<div>${dirty}<\/div>`, 'text\/html');\n    const walker = doc.createTreeWalker(doc.body, NodeFilter.SHOW_ELEMENT, null, false);\n    const rm=[]; while (walker.nextNode()) {\n      const el=walker.currentNode, tag=el.tagName;\n      if (!allowedTags.includes(tag)) { rm.push(el); continue; }\n      [...el.attributes].forEach(attr=>{\n        const ok=(allowedAttrs[tag]||[]).includes(attr.name);\n        if (ok && attr.name==='class') {\n          const safe=el.className.split(\/\\s+\/).filter(c=>['woocommerce-Price-amount','woocommerce-Price-currencySymbol'].includes(c));\n          el.className=safe.join(' ');\n        } else if (!ok) el.removeAttribute(attr.name);\n      });\n    }\n    rm.forEach(n=>n.replaceWith(...n.childNodes));\n    return doc.body.innerHTML;\n  }\n\n  function formatPriceFallback(prices){\n    if(!prices)return '';\n    try{\n      const minor=Number(prices.price??0);\n      const mu=Number(prices.currency_minor_unit??2);\n      const value=minor\/Math.pow(10,mu);\n      const code=prices.currency_code||'TRY';\n      return new Intl.NumberFormat('tr-TR',{style:'currency',currency:code}).format(value);\n    }catch{\n      return `${prices.price||''} ${prices.currency_code||''}`.trim();\n    }\n  }\n\n  async function fetchAll(urlBase, params){\n    const out=[]; let page=1;\n    while(true){\n      const url=new URL(urlBase);\n      url.searchParams.set('per_page', PER_PAGE);\n      url.searchParams.set('page', page);\n      Object.entries(params||{}).forEach(([k,v])=>url.searchParams.set(k,v));\n      const r=await fetch(url,{credentials:'omit',cache:'no-store'});\n      if(!r.ok){\n        if(r.status===400) break;\n        throw new Error(`\u0130stek ba\u015far\u0131s\u0131z: ${r.status}`);\n      }\n      const data=await r.json();\n      if(!Array.isArray(data)||data.length===0) break;\n      out.push(...data); page++;\n    }\n    return out;\n  }\n\n  \/* -------- Scroll yard\u0131mc\u0131lar\u0131 -------- *\/\n  const prefersReduced = () => window.matchMedia?.('(prefers-reduced-motion: reduce)').matches;\n  function stableScrollTo(el, offset=SCROLL_OFFSET){\n    if(!el) return;\n    const top = el.getBoundingClientRect().top + window.scrollY - offset;\n    window.scrollTo({ top, behavior: prefersReduced() ? 'auto' : 'smooth' });\n  }\n\n  \/* --- Kategorileri y\u00fckle ve akordeonlar\u0131 kur --- *\/\n  async function init(){\n    const cats=await fetchAll(CATS_ENDPOINT,{});\n\n    \/\/ Map'ler\n    slugToCat = new Map(cats.map(c=>[c.slug,c]));\n    idToChildren = new Map();\n    idToParentId = new Map();\n    for (const c of cats) {\n      idToParentId.set(c.id, c.parent);\n      const arr = idToChildren.get(c.parent) || [];\n      arr.push(c);\n      idToChildren.set(c.parent, arr);\n    }\n\n    \/\/ T\u00fcm root kategoriler (parent=0)\n    const rootsAll = (idToChildren.get(0) || []).filter(c => c && c.name && c.slug);\n\n    \/\/ Sabit s\u0131raya g\u00f6re: \u00f6nce ORDER, sonra kalanlar\n    const bySlug = new Map(rootsAll.map(c=>[c.slug,c]));\n    const orderedKnown = ORDER.map(s=>bySlug.get(s)).filter(Boolean);\n    const leftovers = rootsAll\n      .filter(c => !ORDER.includes(c.slug))\n      .sort((a,b)=> (a.menu_order??0)-(b.menu_order??0) || a.name.localeCompare(b.name,'tr'));\n    const roots = [...orderedKnown, ...leftovers];\n\n    renderRootAccordion(roots);\n    handleHash(true);\n  }\n\n  function skeletonLines(){\n    const wrap = document.createElement('div');\n    wrap.className = 'prod-card';\n    wrap.innerHTML = `\n      <div class=\"skeleton line wide\" aria-hidden=\"true\"><\/div>\n      <div class=\"skeleton line short\" aria-hidden=\"true\" style=\"margin-top:.5rem\"><\/div>\n      <div class=\"skeleton line mid\" aria-hidden=\"true\" style=\"margin-top:.5rem\"><\/div>`;\n    return wrap;\n  }\n\n  function renderRootAccordion(rootCats){\n    accRoot.innerHTML='';\n    for(const cat of rootCats){\n      const det=document.createElement('details');\n      det.className='acc';\n      det.id=`acc-${cat.slug}`;\n      det.dataset.level='root';\n\n      const sum=document.createElement('summary');\n      sum.className='acc-h';\n      sum.textContent=pretty(cat.name);\n      det.appendChild(sum);\n\n      const panel=document.createElement('div');\n\n      const children = (idToChildren.get(cat.id) || [])\n        .sort((a,b)=> (a.menu_order??0)-(b.menu_order??0) || a.name.localeCompare(b.name,'tr'));\n\n      \/\/ \u00dcst kategori \u00fcr\u00fcn listesi: SADECE alt yoksa\n      if (children.length === 0){\n        const list=document.createElement('div');\n        list.className='products-list';\n        list.id=`plist-${cat.slug}`;\n        list.appendChild(skeletonLines());\n        panel.appendChild(list);\n      }\n\n      \/\/ Alt kategoriler (ikinci seviye akordeon)\n      if (children.length){\n        for(const child of children){\n          const cdet = document.createElement('details');\n          cdet.className = 'acc-sub';\n          cdet.id = `acc-${child.slug}`;\n          cdet.dataset.level='sub';\n          cdet.dataset.parent = cat.slug;\n\n          const csum = document.createElement('summary');\n          csum.className='acc-h-sub';\n          csum.textContent = pretty(child.name);\n\n          \/* === Alkoll\u00fc \/ Alkols\u00fcz ba\u015fl\u0131klar\u0131n\u0131 bold yapma === *\/\n          const nm = (child.name || '')\n            .toLowerCase()\n            .normalize('NFD')\n            .replace(\/\\p{Diacritic}\/gu,''); \/\/ \u00fc -> u\n          if (nm === 'alkollu' || nm === 'alkolsuz' || nm === 'alkollu icecekler' || nm === 'alkolsuz icecekler') {\n            csum.classList.add('no-bold');\n          }\n          cdet.appendChild(csum);\n\n          const clist=document.createElement('div');\n          clist.className='products-list';\n          clist.id=`plist-${child.slug}`;\n          clist.appendChild(skeletonLines());\n          cdet.appendChild(clist);\n\n          cdet.addEventListener('toggle', () => {\n            if(cdet.open){\n              panel.querySelectorAll('details.acc-sub').forEach(d => { if(d!==cdet) d.open=false; });\n              ensureProductsInto(child.slug, child.id);\n              const targetHash = `#${cat.slug}\/${child.slug}`;\n              if(location.hash !== targetHash) history.replaceState(null,'',targetHash);\n              requestAnimationFrame(() => stableScrollTo(cdet));\n            }\n          });\n\n          panel.appendChild(cdet);\n        }\n      }\n\n      det.appendChild(panel);\n\n      det.addEventListener('toggle', () => {\n        if(det.open){\n          [...accRoot.querySelectorAll('details.acc[data-level=\"root\"]')].forEach(d => { if(d!==det) d.open=false; });\n          if ((idToChildren.get(cat.id) || []).length === 0) {\n            ensureProductsInto(cat.slug, cat.id);\n          }\n          const now = location.hash.replace('#','');\n          if(!now.includes('\/')) {\n            if(location.hash !== `#${cat.slug}`) history.replaceState(null,'',`#${cat.slug}`);\n          }\n          requestAnimationFrame(() => stableScrollTo(det));\n        }\n      });\n\n      accRoot.appendChild(det);\n    }\n  }\n\n  async function ensureProductsInto(slug, catId){\n    if(productCache.has(slug)){ renderProducts(slug, productCache.get(slug)); return; }\n    try{\n      const items=await fetchAll(PRODS_ENDPOINT,{ category: String(catId) });\n      productCache.set(slug, items);\n      renderProducts(slug, items);\n    }catch(err){\n      const list=document.getElementById(`plist-${slug}`);\n      if(list) list.innerHTML=`<div class=\"prod-card\"><p style=\"margin:0;color:#b00020\"><strong>Hata:<\/strong> ${err.message}<\/p><\/div>`;\n    }\n  }\n\n  function renderProducts(slug, items){\n    const list=document.getElementById(`plist-${slug}`); if(!list) return;\n    list.innerHTML='';\n    if(!items || items.length===0){\n      list.innerHTML=`<div class=\"prod-card\"><p class=\"prod-desc\" style=\"margin:0\">Bu kategoride \u00fcr\u00fcn bulunamad\u0131.<\/p><\/div>`;\n      return;\n    }\n    const frag=document.createDocumentFragment();\n    for(const p of items){\n      const title=p.name||'\u00dcr\u00fcn';\n      const priceHTML=p.price_html?sanitizeHTML(p.price_html):'';\n      const priceTxt=priceHTML||`<span>${formatPriceFallback(p.prices)}<\/span>`;\n      const descSafe=sanitizeHTML(p.description||'');\n      const card=document.createElement('article');\n      card.className='prod-card';\n      card.innerHTML=`<h3 class=\"prod-title\">${title}<\/h3><div class=\"price\">${priceTxt}<\/div><div class=\"prod-desc\">${descSafe}<\/div>`;\n      frag.appendChild(card);\n    }\n    list.appendChild(frag);\n  }\n\n  \/\/ Derin ba\u011flant\u0131lar: #parent veya #parent\/child\n  function handleHash(scroll=false){\n    const raw = location.hash.replace('#','').trim();\n    if(!raw) return;\n    const parts = raw.split('\/').filter(Boolean);\n\n    const openBySlug = (slug, parentSlug=null) => {\n      const rootEl = document.getElementById(`acc-${CSS.escape(parentSlug || slug)}`);\n      if(rootEl && rootEl.dataset.level==='root'){ rootEl.open = true; }\n      const subEl  = document.getElementById(`acc-${CSS.escape(slug)}`);\n      if(subEl && subEl.dataset.level==='sub'){\n        const parentEl = document.getElementById(`acc-${CSS.escape(parentSlug || subEl.dataset.parent)}`);\n        if(parentEl){ parentEl.open = true; subEl.open = true; }\n        if(scroll) requestAnimationFrame(()=>stableScrollTo(subEl));\n      }else if(rootEl && scroll){\n        requestAnimationFrame(()=>stableScrollTo(rootEl));\n      }\n    };\n\n    if(parts.length === 2){\n      const [parentSlug, childSlug] = parts;\n      if(slugToCat.has(parentSlug) && slugToCat.has(childSlug)){\n        openBySlug(childSlug, parentSlug);\n      }\n    }else if(parts.length === 1){\n      const slug = parts[0];\n      if(!slugToCat.has(slug)) return;\n      const cat = slugToCat.get(slug);\n      if(cat.parent && idToParentId.has(cat.id)){\n        const parentId = idToParentId.get(cat.id);\n        const parent = [...slugToCat.values()].find(c => c.id === parentId);\n        if(parent) openBySlug(slug, parent.slug);\n      }else{\n        openBySlug(slug, null);\n      }\n    }\n  }\n\n  window.addEventListener('hashchange', ()=>handleHash(true));\n\n  try{ await init(); }\n  catch(err){\n    accRoot.innerHTML=`<p style=\"margin:0;color:#b00020\"><strong>Hata:<\/strong> Veriler y\u00fcklenemedi (${err.message}).<\/p>`;\n  }\n})();\n<\/script>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>Men\u00fcm\u00fcz Ba\u015flang\u0131\u00e7lardan ana yemeklere, deniz \u00fcr\u00fcnlerinden \u00f6zel tatl\u0131lara kadar geni\u015f bir yelpazeye sahip olan men\u00fcm\u00fcz, her damak tad\u0131na hitap ediyor. Kategoriler<\/p>","protected":false},"author":2,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"elementor_header_footer","meta":{"_acf_changed":false,"hide_page_title":"","footnotes":""},"class_list":["post-63","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/pages\/63","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/comments?post=63"}],"version-history":[{"count":283,"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/pages\/63\/revisions"}],"predecessor-version":[{"id":2258,"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/pages\/63\/revisions\/2258"}],"wp:attachment":[{"href":"https:\/\/gazebo-ist.com\/en\/wp-json\/wp\/v2\/media?parent=63"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}