{"id":14,"date":"2026-02-04T12:11:34","date_gmt":"2026-02-04T09:11:34","guid":{"rendered":"https:\/\/facadium.com.tr\/arduino\/?page_id=14"},"modified":"2026-03-03T11:01:21","modified_gmt":"2026-03-03T08:01:21","slug":"projeler","status":"publish","type":"page","link":"https:\/\/facadium.com.tr\/arduino\/projeler\/","title":{"rendered":"Projeler"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"14\" class=\"elementor elementor-14\">\n\t\t\t\t<div class=\"elementor-element elementor-element-0c00f88 e-con-full e-flex e-con e-parent\" data-id=\"0c00f88\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-254124c e-con-full e-flex e-con e-child\" data-id=\"254124c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-68a05fe elementor-widget elementor-widget-heading\" data-id=\"68a05fe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h4 class=\"elementor-heading-title elementor-size-default\">Arduino Proje K\u00fct\u00fcphanesi<\/h4>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1be1e8e elementor-widget elementor-widget-heading\" data-id=\"1be1e8e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h5 class=\"elementor-heading-title elementor-size-default\">Gelece\u011fi kodlayan projeler<\/h5>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-582d14f elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"582d14f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-8065478 elementor-widget elementor-widget-html\" data-id=\"8065478\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"arduinoProjectList\" data-widget_type=\"html.default\">\n\t\t\t\t\t<style>\n  \/* Kategori pill alan\u0131 *\/\n  #arduinoCategoryTags{\n    display:flex;\n    flex-wrap:wrap;\n    gap:10px;\n    margin: 12px 0 14px;\n  }\n\n  \/* Tema buton stillerini ez *\/\n  .arduino-cat-pill{\n    -webkit-appearance:none;\n    appearance:none;\n    border:1px solid rgba(0,0,0,.12);\n    background:#f3f4f6;\n    color:#111827;\n    padding:10px 14px;\n    border-radius:999px;\n    cursor:pointer;\n    font-weight:600;\n    line-height:1;\n    transition:transform .05s ease, background .15s ease, border-color .15s ease;\n  }\n  .arduino-cat-pill:hover{ background:#e5e7eb; }\n  .arduino-cat-pill:active{ transform:translateY(1px); }\n\n  .arduino-cat-pill.is-active{\n    background:#111827;\n    color:#fff;\n    border-color:#111827;\n  }\n<\/style>\n\n<div id=\"arduinoCategoryTags\" class=\"arduino-cat-tags\"><\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4765ad0 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"4765ad0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-89d05b9 elementor-widget elementor-widget-html\" data-id=\"89d05b9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<a href=\"\/uyelik\" class=\"premium-access-box\">\r\n  \ud83d\udd13 <strong>\u00dccretli \u00fcyelikle 1000+ Arduino projesine an\u0131nda eri\u015fim<\/strong>\r\n<\/a>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1309f15 elementor-widget-divider--view-line elementor-widget elementor-widget-divider\" data-id=\"1309f15\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"divider.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-divider\">\n\t\t\t<span class=\"elementor-divider-separator\">\n\t\t\t\t\t\t<\/span>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ada6a23 elementor-widget elementor-widget-html\" data-id=\"ada6a23\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<p class=\"support-note\">\r\n  Bizden e\u011fitim alarak hem kendinizi geli\u015ftirir hem de \u00e7al\u0131\u015fmalar\u0131m\u0131za destek olursunuz. Bilgi: 0553 377 29 28\r\n<\/p>\r\n\r\n<style>\r\n  .support-note{\r\n    margin-top:8px;\r\n    font-size:13px;\r\n    line-height:1.5;\r\n    color:#6b7280; \/* soft gri *\/\r\n    text-align:center;\r\n  }\r\n<\/style>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-669618d e-con-full e-flex e-con e-child\" data-id=\"669618d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-cfc5845 e-n-tabs-mobile elementor-widget elementor-widget-n-tabs\" data-id=\"cfc5845\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;horizontal_scroll&quot;:&quot;disable&quot;}\" data-widget_type=\"nested-tabs.default\">\n\t\t\t\t\t\t\t<div class=\"e-n-tabs\" data-widget-number=\"217864261\" aria-label=\"Sekmeler. Enter ve Space ile \u00f6geleri a\u00e7abilir, Escape ile \u00f6geleri kapatabilir ve Y\u00f6n tu\u015flar\u0131 ile \u00f6geler aras\u0131nda gezinebilirsiniz.\">\n\t\t\t<div class=\"e-n-tabs-heading\" role=\"tablist\">\n\t\t\t\t\t<button id=\"e-n-tab-title-2178642611\" data-tab-title-id=\"e-n-tab-title-2178642611\" class=\"e-n-tab-title\" aria-selected=\"true\" data-tab-index=\"1\" role=\"tab\" tabindex=\"0\" aria-controls=\"e-n-tab-content-2178642611\" style=\"--n-tabs-title-order: 1;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\tKod Blo\u011fu\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t<button id=\"e-n-tab-title-2178642612\" data-tab-title-id=\"e-n-tab-title-2178642612\" class=\"e-n-tab-title\" aria-selected=\"false\" data-tab-index=\"2\" role=\"tab\" tabindex=\"-1\" aria-controls=\"e-n-tab-content-2178642612\" style=\"--n-tabs-title-order: 2;\">\n\t\t\t\t\t\t<span class=\"e-n-tab-title-text\">\n\t\t\t\tBa\u011flant\u0131 \u015eemas\u0131\t\t\t<\/span>\n\t\t<\/button>\n\t\t\t\t\t<\/div>\n\t\t\t<div class=\"e-n-tabs-content\">\n\t\t\t\t<div id=\"e-n-tab-content-2178642611\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2178642611\" data-tab-index=\"1\" style=\"--n-tabs-title-order: 1;\" class=\"e-active elementor-element elementor-element-f59a61d e-con-full e-flex e-con e-child\" data-id=\"f59a61d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t<div class=\"elementor-element elementor-element-f1351cc e-flex e-con-boxed e-con e-child\" data-id=\"f1351cc\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d056a7d elementor-widget elementor-widget-html\" data-id=\"d056a7d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\r\n(function(){\r\n  function truthy(v){\r\n    return (v === 1 || v === \"1\" || v === true || v === \"true\");\r\n  }\r\n\r\n  if (!window.FACADIUM_ACCESS) return;\r\n\r\n  \/\/ logged_in de bazen 1\/true kar\u0131\u015f\u0131yor, ikisini de normalize edelim\r\n  var li = truthy(window.FACADIUM_ACCESS.logged_in);\r\n  var pr = truthy(window.FACADIUM_ACCESS.is_premium);\r\n\r\n  \/\/ Eski kodlar genelde === 1 kontrol ediyor \u2192 say\u0131sala \u00e7eviriyoruz\r\n  window.FACADIUM_ACCESS.logged_in  = li ? 1 : 0;\r\n  window.FACADIUM_ACCESS.is_premium = pr ? 1 : 0;\r\n\r\n  \/\/ \u0130stersen boolean da dursun (yeni kodlar i\u00e7in)\r\n  window.FACADIUM_ACCESS.logged_in_bool  = li;\r\n  window.FACADIUM_ACCESS.is_premium_bool = pr;\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a736201 elementor-widget elementor-widget-html\" data-id=\"a736201\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"panelKodBlogu\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- ARDUINO IDE WRAP -->\r\n<div class=\"arduino-ide-wrap\">\r\n\r\n  <!-- TOOLBAR -->\r\n  <div class=\"arduino-ide-toolbar\">\r\n    <div class=\"arduino-ide-title-wrap\">\r\n  <span id=\"arduinoFileName\" class=\"arduino-file-name\">File Name<\/span>\r\n<\/div>\r\n\r\n    <div class=\"arduino-ide-actions\">\r\n      <button id=\"arduinoFontMinus\" type=\"button\" title=\"Yaz\u0131y\u0131 k\u00fc\u00e7\u00fclt\">A\u2212<\/button>\r\n      <button id=\"arduinoFontPlus\"  type=\"button\" title=\"Yaz\u0131y\u0131 b\u00fcy\u00fct\">A+<\/button>\r\n      <button id=\"arduinoCopyBtn\"   type=\"button\">Kopyala<\/button>\r\n      <button id=\"arduinoReportBtn\" type=\"button\">Sorun Bildir<\/button>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <!-- BODY: LINE NUMBERS + CODE -->\r\n  <div class=\"arduino-ide-body\">\r\n    <div id=\"arduinoLineNumbers\" class=\"arduino-lines\"><\/div>\r\n    <pre id=\"arduinoCodeBlock\" class=\"arduino-ide\">Proje Y\u00fckleniyor...<\/pre>\r\n  <\/div>\r\n\r\n<\/div>\r\n\r\n<style>\r\n\/* WRAP *\/\r\n.arduino-ide-wrap{\r\n  border-radius:16px;\r\n  overflow:hidden;\r\n  box-shadow:0 10px 24px rgba(0,0,0,.12);\r\n}\r\n.arduino-ide-wrap:hover{\r\n  box-shadow:0 14px 30px rgba(0,0,0,.16);\r\n}\r\n\r\n\/* TOOLBAR *\/\r\n.arduino-ide-toolbar{\r\n  display:flex;\r\n  justify-content:space-between;\r\n  align-items:center;\r\n  background:#111;\r\n  color:#ddd;\r\n  padding:10px 14px;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-bottom:none;\r\n  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\r\n}\r\n.arduino-ide-title{ font-size:13px; opacity:.85; }\r\n\r\n.arduino-ide-actions{\r\n  display:flex;\r\n  gap:8px;\r\n  align-items:center;\r\n}\r\n\r\n#arduinoCopyBtn,\r\n#arduinoFontMinus, #arduinoFontPlus{\r\n  background:#1f2933;\r\n  color:#e5e7eb;\r\n  border:1px solid rgba(255,255,255,.15);\r\n  border-radius:8px;\r\n  padding:6px 12px;\r\n  font-size:12px;\r\n  cursor:pointer;\r\n}\r\n#arduinoFontMinus, #arduinoFontPlus{ padding:6px 10px; }\r\n\r\n#arduinoCopyBtn:hover,\r\n#arduinoFontMinus:hover, #arduinoFontPlus:hover{\r\n  background:#374151;\r\n}\r\n#arduinoCopyBtn.copied{\r\n  background:#065f46;\r\n  border-color:#10b981;\r\n  color:#ecfdf5;\r\n}\r\n\r\n\r\n\/* Astra inline button stilini EZ (sadece Arduino toolbar) *\/\r\nbody .arduino-ide-toolbar .arduino-ide-actions button#arduinoReportBtn{\r\n  background-color: rgba(255,255,255,.08) !important;\r\n  border: 1px solid rgba(255,255,255,.12) !important;\r\n  color: #fff !important;\r\n\r\n  padding: 10px 16px !important;\r\n  height: 25px !important;\r\n  line-height: 1 !important;\r\n\r\n  border-radius: 8px !important;\r\n  box-shadow: none !important;\r\n\r\n  font-family: inherit !important;\r\n  font-size: 12px !important;\r\n  font-weight: 500 !important;\r\n\r\n  display: inline-flex !important;\r\n  align-items: center !important;\r\n  justify-content: center !important;\r\n\r\n  text-decoration: none !important;\r\n  cursor: pointer !important;\r\n}\r\n\r\nbody .arduino-ide-toolbar .arduino-ide-actions button#arduinoReportBtn:hover{\r\n  background-color: rgba(255,255,255,.12) !important;\r\n}\r\n\r\n\r\n\/* BODY *\/\r\n.arduino-ide-body{\r\n  position:relative; \/* aktif sat\u0131r \u015feridi i\u00e7in *\/\r\n  display:flex;\r\n  background:#0b0f0f;\r\n  border:1px solid rgba(255,255,255,.08);\r\n  border-top:none;\r\n}\r\n\r\n\/* LINE NUMBERS *\/\r\n.arduino-lines{\r\n  user-select:none;\r\n  text-align:right;\r\n  padding:22px 10px 22px 14px;\r\n  color:#6b7280;\r\n  font-size:13px;\r\n  line-height:1.55;\r\n  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;\r\n  border-right:1px solid rgba(255,255,255,.08);\r\n  min-width:44px;\r\n  white-space:pre;\r\n  background: linear-gradient(to bottom, rgba(255,255,255,.03), rgba(255,255,255,.00));\r\n}\r\n\r\n\/* CODE *\/\r\n#arduinoCodeBlock.arduino-ide{\r\n  flex:1;\r\n  margin:0;\r\n  padding:22px 22px;\r\n  background:#0b0f0f;\r\n  color:#28ff6a;\r\n  line-height:1.55;\r\n  font-size:14px;\r\n  font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;\r\n  white-space:pre;\r\n  overflow:auto;\r\n  min-height:420px;\r\n  border-radius:0;\r\n}\r\n\r\n\/* Scrollbar (Chrome\/Edge) *\/\r\n#arduinoCodeBlock.arduino-ide::-webkit-scrollbar{width:10px;height:10px;}\r\n#arduinoCodeBlock.arduino-ide::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);border-radius:10px;}\r\n#arduinoCodeBlock.arduino-ide::-webkit-scrollbar-track{background:rgba(255,255,255,.06);border-radius:10px;}\r\n\r\n\/* Aktif sat\u0131r vurgusu \u015feridi *\/\r\n.arduino-active-line{\r\n  position:absolute;\r\n  top:0;\r\n  height:1.55em;\r\n  background: rgba(255,255,255,.04);\r\n  pointer-events:none;\r\n  transform: translateY(0);\r\n  transition: transform .06s linear, opacity .12s ease;\r\n  opacity:0;\r\n}\r\n\r\n\/* --- Syntax Highlighting (Arduino\/C) --- *\/\r\n#arduinoCodeBlock.arduino-ide .tok-comment { color: #6b7280; }\r\n#arduinoCodeBlock.arduino-ide .tok-string  { color: #a7f3d0; }\r\n#arduinoCodeBlock.arduino-ide .tok-keyword { color: #93c5fd; font-weight: 600; }\r\n#arduinoCodeBlock.arduino-ide .tok-type    { color: #fca5a5; }\r\n#arduinoCodeBlock.arduino-ide .tok-const   { color: #fcd34d; font-weight: 600; }\r\n#arduinoCodeBlock.arduino-ide .tok-number  { color: #fde68a; }\r\n#arduinoCodeBlock.arduino-ide .tok-func    { color: #67e8f9; }\r\n\r\n\r\n.arduino-ide-title-wrap{\r\n  display:flex;\r\n  align-items:center;\r\n  gap:10px;\r\n}\r\n\r\n.arduino-file-name{\r\n  font-weight:600;\r\n  font-size:13px;\r\n  padding:6px 10px;\r\n  border-radius:8px;\r\n  background:rgba(255,255,255,.08);\r\n  border:1px solid rgba(255,255,255,.12);\r\n  letter-spacing:.2px;\r\n}\r\n\r\n.arduino-output-panel {\r\n  margin-top: 12px;\r\n  background: #0f1419;\r\n  border-radius: 12px;\r\n  box-shadow: inset 0 0 0 1px #1f2933;\r\n  overflow: hidden;\r\n}\r\n\r\n.arduino-output-header {\r\n  display: flex;\r\n  justify-content: space-between;\r\n  align-items: center;\r\n  padding: 8px 12px;\r\n  background: #1b2430;\r\n  color: #9cdcfe;\r\n  font-size: 13px;\r\n  font-weight: 600;\r\n}\r\n\r\n.arduino-output-header button {\r\n  background: #2d3748;\r\n  color: #fff;\r\n  border: none;\r\n  border-radius: 6px;\r\n  padding: 4px 10px;\r\n  font-size: 12px;\r\n  cursor: pointer;\r\n}\r\n\r\n.arduino-output {\r\n  height: 140px;\r\n  padding: 10px;\r\n  margin: 0;\r\n  font-family: Consolas, Monaco, monospace;\r\n  font-size: 13px;\r\n  color: #9ae6b4;\r\n  background: #0f1419;\r\n  overflow-y: auto;\r\n  white-space: pre-wrap;\r\n}\r\n\r\n<\/style>\r\n\r\n<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  const codeEl  = document.getElementById(\"arduinoCodeBlock\");\r\n  const linesEl = document.getElementById(\"arduinoLineNumbers\");\r\n  const bodyEl  = document.querySelector(\".arduino-ide-body\");\r\n  const btnCopy = document.getElementById(\"arduinoCopyBtn\");\r\n  const btnPlus = document.getElementById(\"arduinoFontPlus\");\r\n  const btnMin  = document.getElementById(\"arduinoFontMinus\");\r\n\r\n  if (!codeEl || !linesEl || !bodyEl) return;\r\n\r\n  \/* =========================\r\n     1) COPY BUTTON\r\n  ========================== *\/\r\n  function copyText(text){\r\n    if (navigator.clipboard && window.isSecureContext) return navigator.clipboard.writeText(text);\r\n    return new Promise((resolve, reject) => {\r\n      try {\r\n        const ta = document.createElement(\"textarea\");\r\n        ta.value = text;\r\n        ta.setAttribute(\"readonly\", \"\");\r\n        ta.style.position = \"fixed\";\r\n        ta.style.left = \"-9999px\";\r\n        ta.style.top = \"-9999px\";\r\n        document.body.appendChild(ta);\r\n        ta.select();\r\n        const ok = document.execCommand(\"copy\");\r\n        document.body.removeChild(ta);\r\n        ok ? resolve() : reject(new Error(\"execCommand copy ba\u015far\u0131s\u0131z\"));\r\n      } catch (e) { reject(e); }\r\n    });\r\n  }\r\n\r\n  if (btnCopy){\r\n    btnCopy.addEventListener(\"click\", async function(){\r\n      const text = (codeEl.textContent || \"\").trim();\r\n      if (!text) return;\r\n\r\n      const old = btnCopy.textContent;\r\n      btnCopy.disabled = true;\r\n\r\n      try {\r\n        await copyText(text);\r\n        btnCopy.textContent = \"Kopyaland\u0131 \u2713\";\r\n        btnCopy.classList.add(\"copied\");\r\n      } catch (err) {\r\n        console.warn(\"Kopyalama hatas\u0131:\", err);\r\n        btnCopy.textContent = \"Kopyalanamad\u0131\";\r\n      } finally {\r\n        setTimeout(() => {\r\n          btnCopy.textContent = old || \"Kopyala\";\r\n          btnCopy.classList.remove(\"copied\");\r\n          btnCopy.disabled = false;\r\n        }, 1200);\r\n      }\r\n    });\r\n  }\r\n\r\n  \/* =========================\r\n     2) LINE NUMBERS + SCROLL SYNC\r\n  ========================== *\/\r\n  function renderLines(){\r\n    const text = (codeEl.textContent || \"\");\r\n    const count = Math.max(1, text.split(\"\\n\").length);\r\n    let out = \"\";\r\n    for (let i = 1; i <= count; i++) out += i + \"\\n\";\r\n    linesEl.textContent = out;\r\n  }\r\n\r\n  function syncScroll(){\r\n    linesEl.scrollTop = codeEl.scrollTop;\r\n  }\r\n\r\n  renderLines();\r\n  syncScroll();\r\n\r\n  \/\/ kod de\u011fi\u015fince sat\u0131r numaras\u0131n\u0131 g\u00fcncelle\r\n  const moLines = new MutationObserver(() => renderLines());\r\n  moLines.observe(codeEl, { childList:true, characterData:true, subtree:true });\r\n\r\n  codeEl.addEventListener(\"scroll\", syncScroll, { passive:true });\r\n\r\n  \/* =========================\r\n     3) ACTIVE LINE BAR (tek s\u00fcr\u00fcm)\r\n  ========================== *\/\r\n  let bar = bodyEl.querySelector(\".arduino-active-line\");\r\n  if (!bar){\r\n    bar = document.createElement(\"div\");\r\n    bar.className = \"arduino-active-line\";\r\n    bodyEl.insertBefore(bar, bodyEl.firstChild);\r\n  }\r\n\r\n  function getLineHeightPx(){\r\n    const lh = parseFloat(getComputedStyle(codeEl).lineHeight);\r\n    return Number.isFinite(lh) && lh > 0 ? lh : 22;\r\n  }\r\n\r\n  function layoutBar(){\r\n    \/\/ \u015feridi sadece kod alan\u0131na hizala (sat\u0131r numaras\u0131 kolonunu kaplamas\u0131n)\r\n    const left = codeEl.offsetLeft;\r\n    bar.style.left = left + \"px\";\r\n    bar.style.right = \"0\";\r\n    bar.style.width = codeEl.clientWidth + \"px\";\r\n  }\r\n\r\n  function moveBarToClientY(clientY){\r\n    layoutBar();\r\n    const rect = codeEl.getBoundingClientRect();\r\n    const linePx = getLineHeightPx();\r\n\r\n    const y = (clientY - rect.top) + codeEl.scrollTop;\r\n    const lineIndex = Math.max(0, Math.floor(y \/ linePx));\r\n    const top = (lineIndex * linePx) - codeEl.scrollTop;\r\n\r\n    bar.style.height = linePx + \"px\";\r\n    bar.style.transform = \"translateY(\" + top + \"px)\";\r\n    bar.style.opacity = \"1\";\r\n  }\r\n\r\n  let lastClientY = null;\r\n\r\n  codeEl.addEventListener(\"mousemove\", function(ev){\r\n    lastClientY = ev.clientY;\r\n    moveBarToClientY(ev.clientY);\r\n  });\r\n\r\n  codeEl.addEventListener(\"mouseleave\", function(){\r\n    bar.style.opacity = \"0\";\r\n  });\r\n\r\n  codeEl.addEventListener(\"scroll\", function(){\r\n    \/\/ scroll sonras\u0131 son bilinen mouse konumuna g\u00f6re bar'\u0131 yerinde tut\r\n    if (lastClientY !== null) moveBarToClientY(lastClientY);\r\n  }, { passive:true });\r\n\r\n  codeEl.addEventListener(\"touchstart\", function(){\r\n    bar.style.opacity = \"0\";\r\n  }, { passive:true });\r\n\r\n  window.addEventListener(\"resize\", function(){\r\n    if (lastClientY !== null) moveBarToClientY(lastClientY);\r\n    else layoutBar();\r\n  });\r\n\r\n  layoutBar();\r\n\r\n  \/* =========================\r\n     4) SYNTAX HIGHLIGHT (baseline)\r\n  ========================== *\/\r\n  const KEYWORDS = new Set([\r\n    \"if\",\"else\",\"for\",\"while\",\"do\",\"switch\",\"case\",\"break\",\"continue\",\"return\",\r\n    \"void\",\"int\",\"long\",\"float\",\"double\",\"char\",\"bool\",\"boolean\",\"byte\",\"short\",\r\n    \"unsigned\",\"signed\",\"const\",\"static\",\"volatile\",\"struct\",\"class\",\"public\",\"private\"\r\n  ]);\r\n  const TYPES = new Set([\"String\",\"HardwareSerial\"]);\r\n  const CONSTS = new Set([\"HIGH\",\"LOW\",\"INPUT\",\"OUTPUT\",\"INPUT_PULLUP\",\"LED_BUILTIN\"]);\r\n  const ARDUINO_FUNCS = new Set([\r\n    \"setup\",\"loop\",\"pinMode\",\"digitalWrite\",\"digitalRead\",\"analogRead\",\"analogWrite\",\r\n    \"delay\",\"delayMicroseconds\",\"millis\",\"micros\",\"attachInterrupt\",\"detachInterrupt\",\r\n    \"Serial\",\"print\",\"println\",\"begin\"\r\n  ]);\r\n\r\n  function escapeHtml(s){\r\n    return (s ?? \"\").toString()\r\n      .replaceAll(\"&\",\"&amp;\")\r\n      .replaceAll(\"<\",\"&lt;\")\r\n      .replaceAll(\">\",\"&gt;\")\r\n      .replaceAll('\"',\"&quot;\")\r\n      .replaceAll(\"'\",\"&#039;\");\r\n  }\r\n\r\n  function highlight(raw){\r\n    const s = raw || \"\";\r\n    let i = 0, out = \"\";\r\n\r\n    while (i < s.length){\r\n      const ch = s[i], next = s[i+1];\r\n\r\n      if (ch === \"\/\" && next === \"\/\"){\r\n        let j = i + 2; while (j < s.length && s[j] !== \"\\n\") j++;\r\n        out += `<span class=\"tok-comment\">${escapeHtml(s.slice(i, j))}<\/span>`;\r\n        i = j; continue;\r\n      }\r\n\r\n      if (ch === \"\/\" && next === \"*\"){\r\n        let j = i + 2; while (j < s.length && !(s[j] === \"*\" && s[j+1] === \"\/\")) j++;\r\n        j = Math.min(s.length, j + 2);\r\n        out += `<span class=\"tok-comment\">${escapeHtml(s.slice(i, j))}<\/span>`;\r\n        i = j; continue;\r\n      }\r\n\r\n      if (ch === `\"`){\r\n        let j = i + 1;\r\n        while (j < s.length){ if (s[j] === `\"` && s[j-1] !== \"\\\\\") { j++; break; } j++; }\r\n        out += `<span class=\"tok-string\">${escapeHtml(s.slice(i, j))}<\/span>`;\r\n        i = j; continue;\r\n      }\r\n\r\n      if (ch === `'`){\r\n        let j = i + 1;\r\n        while (j < s.length){ if (s[j] === `'` && s[j-1] !== \"\\\\\") { j++; break; } j++; }\r\n        out += `<span class=\"tok-string\">${escapeHtml(s.slice(i, j))}<\/span>`;\r\n        i = j; continue;\r\n      }\r\n\r\n      if (ch >= \"0\" && ch <= \"9\"){\r\n        let j = i + 1; while (j < s.length && \/[0-9.]\/.test(s[j])) j++;\r\n        out += `<span class=\"tok-number\">${escapeHtml(s.slice(i, j))}<\/span>`;\r\n        i = j; continue;\r\n      }\r\n\r\n      if (\/[A-Za-z_]\/.test(ch)){\r\n        let j = i + 1; while (j < s.length && \/[A-Za-z0-9_]\/.test(s[j])) j++;\r\n        const word = s.slice(i, j);\r\n\r\n        let k = j; while (k < s.length && \/\\s\/.test(s[k])) k++;\r\n        const isFn = s[k] === \"(\";\r\n\r\n        if (CONSTS.has(word)) out += `<span class=\"tok-const\">${escapeHtml(word)}<\/span>`;\r\n        else if (KEYWORDS.has(word)) out += `<span class=\"tok-keyword\">${escapeHtml(word)}<\/span>`;\r\n        else if (TYPES.has(word)) out += `<span class=\"tok-type\">${escapeHtml(word)}<\/span>`;\r\n        else if (isFn || ARDUINO_FUNCS.has(word)) out += `<span class=\"tok-func\">${escapeHtml(word)}<\/span>`;\r\n        else out += escapeHtml(word);\r\n\r\n        i = j; continue;\r\n      }\r\n\r\n      out += escapeHtml(ch);\r\n      i++;\r\n    }\r\n\r\n    return out;\r\n  }\r\n\r\n  let applying = false;\r\n  let lastRaw = \"\";\r\n\r\n  function applyHighlight(){\r\n    if (applying) return;\r\n    const raw = codeEl.textContent || \"\";\r\n    if (raw === lastRaw) return;\r\n\r\n    applying = true;\r\n    lastRaw = raw;\r\n    codeEl.innerHTML = highlight(raw);\r\n    applying = false;\r\n  }\r\n\r\n  applyHighlight();\r\n\r\n  const moHi = new MutationObserver(() => applyHighlight());\r\n  moHi.observe(codeEl, { childList:true, characterData:true, subtree:true });\r\n\r\n  \/* =========================\r\n     5) FONT +\/- (persist)\r\n  ========================== *\/\r\n  if (btnPlus && btnMin){\r\n    const STORAGE_KEY = \"arduino_ide_font_px\";\r\n    const MIN = 12, MAX = 18;\r\n\r\n    function getCurrentPx(){\r\n      const saved = parseInt(localStorage.getItem(STORAGE_KEY) || \"\", 10);\r\n      if (Number.isFinite(saved)) return saved;\r\n      const px = parseFloat(getComputedStyle(codeEl).fontSize);\r\n      return Number.isFinite(px) ? Math.round(px) : 14;\r\n    }\r\n\r\n    function apply(px){\r\n      px = Math.max(MIN, Math.min(MAX, px));\r\n\r\n      codeEl.style.fontSize  = px + \"px\";\r\n      linesEl.style.fontSize = Math.max(11, px - 1) + \"px\";\r\n\r\n      const lh = Math.round(px * 1.55 * 10) \/ 10;\r\n      codeEl.style.lineHeight  = lh + \"px\";\r\n      linesEl.style.lineHeight = lh + \"px\";\r\n\r\n      localStorage.setItem(STORAGE_KEY, String(px));\r\n\r\n      \/\/ bar \u00f6l\u00e7\u00fcs\u00fcn\u00fc yenile\r\n      layoutBar();\r\n    }\r\n\r\n    apply(getCurrentPx());\r\n\r\n    btnPlus.addEventListener(\"click\", () => apply(getCurrentPx() + 1));\r\n    btnMin.addEventListener(\"click\",  () => apply(getCurrentPx() - 1));\r\n  }\r\n})();\r\n<\/script>\r\n\r\n<!-- OUTPUT PANEL -->\r\n<div class=\"arduino-output-panel\">\r\n  <div class=\"arduino-output-header\">\r\n    <span>Output \/ Serial Monitor<\/span>\r\n    <button id=\"clearOutput\">Temizle<\/button>\r\n  <\/div>\r\n\r\n  <pre id=\"arduinoOutput\" class=\"arduino-output\">\r\n> Haz\u0131r. Bir proje se\u00e7in.\r\n  <\/pre>\r\n<\/div>\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<div id=\"e-n-tab-content-2178642612 proje-resim-alani\" role=\"tabpanel\" aria-labelledby=\"e-n-tab-title-2178642612\" data-tab-index=\"2\" style=\"--n-tabs-title-order: 2;\" class=\" elementor-element elementor-element-8f7c355 e-con-full e-flex e-con e-child\" data-id=\"8f7c355\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-927c1d6 elementor-widget elementor-widget-html\" data-id=\"927c1d6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div class=\"arduino-wiring-actions\">\r\n<a id=\"arduinoZoomBtn\"\r\n   class=\"arduino-btn arduino-btn-zoom\"\r\n   href=\"#\"\r\n   target=\"_blank\"\r\n   rel=\"noopener\">\r\n   Resmi B\u00fcy\u00fct\r\n<\/a>\r\n\r\n  <button id=\"arduinoMaterialsBtn\" type=\"button\" class=\"arduino-btn arduino-btn-secondary\">\r\n    Malzeme Listesi\r\n  <\/button>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3c8a34d elementor-widget elementor-widget-html\" data-id=\"3c8a34d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<div id=\"arduinoWiringEmptyNote\" style=\"display:none; padding:10px 12px; border:1px solid #e5e7eb; border-radius:10px; font-size:14px;\">\r\n  <b>Bu proje i\u00e7in ba\u011flant\u0131 \u015femas\u0131 bulunmamaktad\u0131r.<\/b>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5af3ced elementor-widget elementor-widget-image\" data-id=\"5af3ced\" data-element_type=\"widget\" data-e-type=\"widget\" id=\"arduinoWiringImg\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/facadium.com.tr\/arduino\/wp-content\/plugins\/elementor\/assets\/images\/placeholder.png\" title=\"\" alt=\"\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c22a780 elementor-widget elementor-widget-html\" data-id=\"c22a780\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\r\nconsole.log(\"ARDUINO JS Y\u00dcKLEND\u0130 (STABLE v3.10.3) - AJAX ONLY + PREMIUM MODAL + WIRING FIX + MATERIALS MODAL + NO PRINT\");\r\n\r\n(function () {\r\n  \"use strict\";\r\n\r\n  \/* =============================\r\n   * 0) AJAX API URL\u2019leri (ADMIN-AJAX)\r\n   * ============================= *\/\r\n  var API_LIST = new URL(\"\/arduino\/wp-admin\/admin-ajax.php\", window.location.origin);\r\n  API_LIST.searchParams.set(\"action\", \"facadium_arduino_projects\");\r\n\r\n  function API_ONE(slug){\r\n    var u = new URL(\"\/arduino\/wp-admin\/admin-ajax.php\", window.location.origin);\r\n    u.searchParams.set(\"action\", \"facadium_arduino_project\");\r\n    u.searchParams.set(\"slug\", String(slug || \"\"));\r\n    u.searchParams.set(\"_\", String(Date.now())); \/\/ cache-bust\r\n    return u;\r\n  }\r\n\r\n  function wpV2OneUrl(id){\r\n    var u = new URL(\"\/arduino\/wp-json\/wp\/v2\/arduino_projeleri\/\" + id, window.location.origin);\r\n    u.searchParams.set(\"acf_format\", \"standard\");\r\n    return u;\r\n  }\r\n\r\n  \/* =============================\r\n   * 1) Access helpers (server -> window.FACADIUM_ACCESS)\r\n   * ============================= *\/\r\n  function accessState(){\r\n    var a = window.FACADIUM_ACCESS || {};\r\n    return {\r\n      logged_in: !!a.logged_in || document.body.classList.contains(\"logged-in\"),\r\n      is_premium: !!a.is_premium\r\n    };\r\n  }\r\n\r\n  \/* =============================\r\n   * 2) DOM Referanslar\u0131\r\n   * ============================= *\/\r\n  var el = {\r\n    \/\/ Sol men\u00fc\r\n    menuList: document.getElementById(\"arduinoProjectList\"),\r\n    catWrap: document.getElementById(\"arduinoCategoryTags\"),\r\n\r\n    \/\/ Tablar\r\n    tabBtns: document.querySelectorAll(\"[data-arduino-tab]\"),\r\n    panelCode: document.getElementById(\"panelKodBlogu\"),\r\n    panelWiring: document.getElementById(\"panelBaglantiSemasi\"),\r\n\r\n    \/\/ Kod alan\u0131\r\n    codeBlock: document.getElementById(\"arduinoCodeBlock\"),\r\n    lineNums: document.getElementById(\"arduinoLineNumbers\"),\r\n    fileNameEl: document.getElementById(\"arduinoFileName\"),\r\n\r\n    \/\/ Toolbar\r\n    btnCopy: document.getElementById(\"arduinoCopyBtn\"),\r\n    btnFontMinus: document.getElementById(\"arduinoFontMinus\"),\r\n    btnFontPlus: document.getElementById(\"arduinoFontPlus\"),\r\n\r\n    \/\/ \u2705 Sorun Bildir\r\n    btnReport: document.getElementById(\"arduinoReportBtn\"),\r\n\r\n    \/\/ Ba\u011flant\u0131 \u015femas\u0131\r\n    wiringImg: document.getElementById(\"arduinoWiringImg\"),\r\n    wiringLink: document.getElementById(\"arduinoWiringLink\") || document.getElementById(\"arduinoWiringLinkAnchor\"),\r\n    wiringZoomBtn: document.getElementById(\"arduinoWiringZoomBtn\") || document.getElementById(\"arduinoZoomBtn\"),\r\n    wiringEmptyNote: document.getElementById(\"arduinoWiringEmptyNote\"),\r\n\r\n    \/\/ Output\r\n    output: document.getElementById(\"arduinoOutput\"),\r\n    clearOutput: document.getElementById(\"clearOutput\"),\r\n\r\n    \/\/ \u2705 Malzeme Listesi\r\n    materialsBtn: document.getElementById(\"arduinoMaterialsBtn\"),\r\n    materialsModal: document.getElementById(\"arduinoMaterialsModal\"),\r\n    materialsModalBody: document.getElementById(\"arduinoMaterialsModalBody\")\r\n  };\r\n\r\n  function requireElm(node, name) {\r\n    if (!node) console.warn(\"[ARDUINO] Eksik zorunlu element: \" + name);\r\n    return !!node;\r\n  }\r\n\r\n  var has = {\r\n    menuList: requireElm(el.menuList, \"arduinoProjectList\"),\r\n    panelCode: requireElm(el.panelCode, \"panelKodBlogu\"),\r\n    codeBlock: requireElm(el.codeBlock, \"arduinoCodeBlock\"),\r\n    lineNums: requireElm(el.lineNums, \"arduinoLineNumbers\"),\r\n    tabs: !!(el.tabBtns && el.tabBtns.length),\r\n    panelWiring: !!el.panelWiring,\r\n    wiringImg: !!el.wiringImg,\r\n    output: !!el.output,\r\n    fileName: !!el.fileNameEl,\r\n    catWrap: !!el.catWrap,\r\n    reportBtn: !!el.btnReport,\r\n    materialsBtn: !!el.materialsBtn,\r\n    materialsModal: !!el.materialsModal,\r\n    materialsModalBody: !!el.materialsModalBody\r\n  };\r\n\r\n  if (!has.menuList || !has.panelCode || !has.codeBlock || !has.lineNums) {\r\n    console.warn(\"[ARDUINO] Kritik DOM elementleri eksik. Script durduruldu.\");\r\n    return;\r\n  }\r\n\r\n  \/* =============================\r\n   * 3) Output helpers\r\n   * ============================= *\/\r\n  function outputSet(text) {\r\n    if (!has.output) return;\r\n    el.output.textContent = text || \"\";\r\n    el.output.scrollTop = el.output.scrollHeight;\r\n  }\r\n  function outputWrite(line) {\r\n    if (!has.output) return;\r\n    var prefix = el.output.textContent.trim().length ? \"\\n> \" : \"> \";\r\n    el.output.textContent += prefix + (line == null ? \"\" : String(line));\r\n    el.output.scrollTop = el.output.scrollHeight;\r\n  }\r\n  function outputWriteBlock(text) {\r\n    if (!has.output) return;\r\n    var t = String(text == null ? \"\" : text).trim();\r\n    if (!t) return;\r\n    var prefix = el.output.textContent.trim().length ? \"\\n> \" : \"> \";\r\n    el.output.textContent += prefix + t.replace(\/\\n\/g, \"\\n> \");\r\n    el.output.scrollTop = el.output.scrollHeight;\r\n  }\r\n  if (el.clearOutput && has.output) {\r\n    el.clearOutput.addEventListener(\"click\", function () { outputSet(\"\"); });\r\n  }\r\n\r\n  \/* =============================\r\n   * 4) Genel yard\u0131mc\u0131lar\r\n   * ============================= *\/\r\n  function sanitizeSlug(s) {\r\n    return String(s || \"\")\r\n      .trim()\r\n      .toLowerCase()\r\n      .replace(\/[^a-z0-9\\-_]\/g, \"\");\r\n  }\r\n\r\n  function escapeHtml(s) {\r\n    return String(s == null ? \"\" : s).replace(\/[&<>\"']\/g, function (m) {\r\n      return ({\r\n        \"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\"\r\n      })[m];\r\n    });\r\n  }\r\n\r\n  function decodeHtmlEntities(s) {\r\n    var str = String(s == null ? \"\" : s);\r\n    if (str.indexOf(\"&\") === -1) return str;\r\n    var t = document.createElement(\"textarea\");\r\n    t.innerHTML = str;\r\n    return t.value;\r\n  }\r\n\r\n  function htmlToText(html) {\r\n    var tmp = document.createElement(\"div\");\r\n    tmp.innerHTML = html || \"\";\r\n    return (tmp.textContent || \"\").trim();\r\n  }\r\n\r\n  function getSlugFromURL() {\r\n    var u = new URL(window.location.href);\r\n    var qs = u.searchParams.get(\"slug\");\r\n    if (qs) return sanitizeSlug(qs);\r\n    if (u.hash && u.hash.length > 1) return sanitizeSlug(u.hash.slice(1));\r\n    return null;\r\n  }\r\n\r\n  function setURLSlug(slug) {\r\n    var u = new URL(window.location.href);\r\n    u.hash = slug ? (\"#\" + slug) : \"\";\r\n    history.replaceState(null, \"\", u.toString());\r\n  }\r\n\r\n  function getProjectTitle(it, slug) {\r\n    var t = (it && it.title) || it.name || slug || \"Proje\";\r\n    \/\/ admin-ajax list title string gelir\r\n    return decodeHtmlEntities(String(t));\r\n  }\r\n\r\n  function getCurrentTab() {\r\n    if (!has.tabs) return \"code\";\r\n    var active = Array.prototype.slice.call(el.tabBtns).find(function (b) { return b.classList.contains(\"active\"); });\r\n    var t = active && active.getAttribute(\"data-arduino-tab\");\r\n    return (t === \"wiring\" || t === \"code\") ? t : \"code\";\r\n  }\r\n\r\n  \/* =============================\r\n   * \u2705 Premium + Wiring mesajlar\u0131\r\n   * ============================= *\/\r\n  var PREMIUM_MSG = \"Bu i\u00e7erik sadece \u00fccretli \u00fcyelere \u00f6zeldir.\";\r\n  var NO_WIRING_MSG = \"Bu proje i\u00e7in ba\u011flant\u0131 \u015femas\u0131 bulunmamaktad\u0131r.\";\r\n\r\n  function setWiringEmptyNoteText(text) {\r\n    if (!el.wiringEmptyNote) return;\r\n    el.wiringEmptyNote.textContent = text || \"\";\r\n  }\r\n\r\n  \/* =============================\r\n   * \u2705 Premium Modal\r\n   * ============================= *\/\r\n  function openPremiumModal(){\r\n    var modal = document.getElementById(\"arduinoPremiumModal\");\r\n    if(!modal) return;\r\n    modal.classList.add(\"is-open\");\r\n    modal.setAttribute(\"aria-hidden\",\"false\");\r\n    document.body.classList.add(\"arduino-modal-lock\");\r\n  }\r\n\r\n  function closePremiumModal(){\r\n    var modal = document.getElementById(\"arduinoPremiumModal\");\r\n    if(!modal) return;\r\n    modal.classList.remove(\"is-open\");\r\n    modal.setAttribute(\"aria-hidden\",\"true\");\r\n    document.body.classList.remove(\"arduino-modal-lock\");\r\n  }\r\n\r\n  \/\/ Kapatma: X ve overlay\r\n  document.addEventListener(\"click\", function(e){\r\n    if(e.target && e.target.closest && e.target.closest(\"[data-ap-premium-close]\")){\r\n      e.preventDefault();\r\n      closePremiumModal();\r\n    }\r\n  });\r\n\r\n  \/\/ ESC ile kapat\r\n  document.addEventListener(\"keydown\", function(e){\r\n    if(e.key === \"Escape\"){\r\n      closePremiumModal();\r\n    }\r\n  });\r\n\r\n  function renderPremiumRestrictedUI(message) {\r\n    var msg = message || PREMIUM_MSG;\r\n\r\n    renderCode(msg, \"premium.ino\");\r\n    outputSet(msg);\r\n\r\n    renderWiring(\"\"); \/\/ wiring'i temizle\r\n    setWiringEmptyNoteText(msg);\r\n    setWiringEmptyNoteVisible(true);\r\n  }\r\n\r\n  \/* =============================\r\n   * 4.1) Sorun Bildir helpers\r\n   * ============================= *\/\r\n  var currentProjectTitle = \"Arduino Projesi\";\r\n  function getCurrentProjectTitleSafe() {\r\n    if (typeof currentProjectTitle === \"string\" && currentProjectTitle.trim()) return currentProjectTitle.trim();\r\n    var h = document.querySelector(\".arduino-project-title, .entry-title, h1\");\r\n    if (h && h.textContent) return h.textContent.trim();\r\n    var s = getSlugFromURL();\r\n    return s ? s : \"Arduino Projesi\";\r\n  }\r\n\r\n  function openWhatsAppReport() {\r\n    var phone = \"905533772928\";\r\n    var pageUrl = window.location.href;\r\n\r\n    var msg =\r\n      \"Merhabalar, internet sitenizden ula\u015f\u0131m sa\u011fl\u0131yorum.\\n\\n\" +\r\n      \"Bu kod blo\u011funda hata vard\u0131r.\\n\\n\" +\r\n      \"Proje: \" + getCurrentProjectTitleSafe() + \"\\n\" +\r\n      \"Sayfa: \" + pageUrl;\r\n\r\n    var wa = \"https:\/\/wa.me\/\" + phone + \"?text=\" + encodeURIComponent(msg);\r\n    window.open(wa, \"_blank\", \"noopener\");\r\n  }\r\n\r\n  \/* =============================\r\n   * 5) Tabs\r\n   * ============================= *\/\r\n  function ensureWiringTabVisibility() {\r\n    if (!has.tabs) return;\r\n    if (!has.panelWiring) {\r\n      Array.prototype.slice.call(el.tabBtns).forEach(function (b) {\r\n        var t = b.getAttribute(\"data-arduino-tab\");\r\n        if (t === \"wiring\") {\r\n          b.setAttribute(\"aria-disabled\", \"true\");\r\n          b.style.display = \"none\";\r\n        }\r\n      });\r\n    }\r\n  }\r\n\r\n  function setActiveTab(tabName) {\r\n    var wantCode = (tabName === \"code\") || !has.panelWiring;\r\n    var wantWiring = !wantCode;\r\n\r\n    el.panelCode.style.display = wantCode ? \"block\" : \"none\";\r\n    if (el.panelWiring) el.panelWiring.style.display = wantWiring ? \"block\" : \"none\";\r\n\r\n    if (has.tabs) {\r\n      Array.prototype.slice.call(el.tabBtns).forEach(function (b) {\r\n        var t = b.getAttribute(\"data-arduino-tab\");\r\n        var isActive = (wantCode && t === \"code\") || (wantWiring && t === \"wiring\");\r\n        b.classList.toggle(\"active\", isActive);\r\n        b.setAttribute(\"aria-selected\", isActive ? \"true\" : \"false\");\r\n      });\r\n    }\r\n  }\r\n\r\n  if (has.tabs) {\r\n    Array.prototype.slice.call(el.tabBtns).forEach(function (btn) {\r\n      btn.addEventListener(\"click\", function (e) {\r\n        e.preventDefault();\r\n        var tab = btn.getAttribute(\"data-arduino-tab\");\r\n        if (tab !== \"code\" && tab !== \"wiring\") return;\r\n        setActiveTab(tab);\r\n      });\r\n    });\r\n  }\r\n\r\n  \/* =============================\r\n   * 6) Kod render\r\n   * ============================= *\/\r\n  function setFileName(name) {\r\n    if (!has.fileName) return;\r\n    el.fileNameEl.textContent = name || \"sketch.ino\";\r\n  }\r\n\r\n  function renderCode(codeText, fileName) {\r\n    var code = (codeText == null ? \"\" : String(codeText));\r\n    el.codeBlock.textContent = code;\r\n\r\n    var safeName = (fileName && String(fileName).trim()) ? String(fileName).trim() : \"sketch.ino\";\r\n    setFileName(safeName);\r\n\r\n    var lines = Math.max(1, code.split(\"\\n\").length);\r\n    var nums = \"\";\r\n    for (var i = 1; i <= lines; i++) nums += i + \"\\n\";\r\n    el.lineNums.textContent = nums.replace(\/\\n$\/, \"\");\r\n  }\r\n\r\n  function syncScroll() {\r\n    var code = el.codeBlock;\r\n    var lines = el.lineNums;\r\n    if (!code || !lines) return;\r\n    code.addEventListener(\"scroll\", function () { lines.scrollTop = code.scrollTop; });\r\n  }\r\n\r\n  \/* =============================\r\n   * 7) Wiring render (FIX)\r\n   * ============================= *\/\r\n  function getInnerImg(node) {\r\n    if (!node) return null;\r\n    var tag = (node.tagName || \"\").toLowerCase();\r\n    if (tag === \"img\") return node;\r\n    return node.querySelector(\"img\");\r\n  }\r\n\r\n  function setWiringEmptyNoteVisible(isVisible) {\r\n    if (!el.wiringEmptyNote) return;\r\n    el.wiringEmptyNote.style.display = isVisible ? \"block\" : \"none\";\r\n  }\r\n\r\n  function setWiringVisible(isVisible) {\r\n    if (!el.wiringImg) return;\r\n    var img = getInnerImg(el.wiringImg);\r\n    if (img) img.style.display = isVisible ? \"block\" : \"none\";\r\n    else el.wiringImg.style.display = isVisible ? \"block\" : \"none\";\r\n\r\n    if (el.wiringLink) el.wiringLink.style.display = isVisible ? \"block\" : \"none\";\r\n    if (el.wiringZoomBtn) el.wiringZoomBtn.style.display = isVisible ? \"inline-flex\" : \"none\";\r\n  }\r\n\r\n  function renderWiring(imageUrl) {\r\n    var url = String(imageUrl == null ? \"\" : imageUrl).trim();\r\n\r\n    if (!url) {\r\n      setWiringVisible(false);\r\n      setWiringEmptyNoteVisible(true);\r\n\r\n      \/\/ Premium mesaj\u0131 de\u011filse default \"\u015fema yok\" yaz\r\n      var cur = el.wiringEmptyNote ? (el.wiringEmptyNote.textContent || \"\").trim() : \"\";\r\n      if (!cur || cur === PREMIUM_MSG) {\r\n        setWiringEmptyNoteText(NO_WIRING_MSG);\r\n      }\r\n\r\n      if (el.wiringLink) el.wiringLink.removeAttribute(\"href\");\r\n      if (el.wiringZoomBtn) el.wiringZoomBtn.onclick = null;\r\n      return;\r\n    }\r\n\r\n    \/\/ URL varsa: notu kapat + sadece g\u00f6rsel\r\n    setWiringEmptyNoteText(\"\"); \r\n    setWiringEmptyNoteVisible(false);\r\n\r\n    var img = getInnerImg(el.wiringImg);\r\n    setWiringVisible(true);\r\n\r\n    if (img) img.src = url;\r\n    if (el.wiringLink) el.wiringLink.href = url;\r\n\r\n    if (el.wiringZoomBtn) {\r\n      el.wiringZoomBtn.onclick = function (e) {\r\n        e.preventDefault();\r\n        window.open(url, \"_blank\", \"noopener\");\r\n      };\r\n    }\r\n  }\r\n\r\n  \/* =============================\r\n   * 8) Font size\r\n   * ============================= *\/\r\n  var currentFont = 14;\r\n  var FONT_MIN = 12;\r\n  var FONT_MAX = 18;\r\n\r\n  function applyFontSize() {\r\n    el.codeBlock.style.fontSize = currentFont + \"px\";\r\n    el.lineNums.style.fontSize = currentFont + \"px\";\r\n    if (has.output) el.output.style.fontSize = Math.max(12, currentFont - 1) + \"px\";\r\n  }\r\n\r\n  if (el.btnFontMinus) {\r\n    el.btnFontMinus.addEventListener(\"click\", function () {\r\n      currentFont = Math.max(FONT_MIN, currentFont - 1);\r\n      applyFontSize();\r\n    });\r\n  }\r\n  if (el.btnFontPlus) {\r\n    el.btnFontPlus.addEventListener(\"click\", function () {\r\n      currentFont = Math.min(FONT_MAX, currentFont + 1);\r\n      applyFontSize();\r\n    });\r\n  }\r\n\r\n  \/* =============================\r\n   * 9) Copy\r\n   * ============================= *\/\r\n  function copyToClipboard(text) {\r\n    return navigator.clipboard && navigator.clipboard.writeText\r\n      ? navigator.clipboard.writeText(text).then(function(){ return true; }).catch(function(){ return false; })\r\n      : (function(){\r\n          try {\r\n            var ta = document.createElement(\"textarea\");\r\n            ta.value = text;\r\n            ta.style.position = \"fixed\";\r\n            ta.style.left = \"-9999px\";\r\n            document.body.appendChild(ta);\r\n            ta.select();\r\n            document.execCommand(\"copy\");\r\n            document.body.removeChild(ta);\r\n            return Promise.resolve(true);\r\n          } catch (e) {\r\n            return Promise.resolve(false);\r\n          }\r\n        })();\r\n  }\r\n\r\n  if (el.btnCopy) {\r\n    el.btnCopy.addEventListener(\"click\", function () {\r\n      var text = el.codeBlock.textContent || \"\";\r\n      copyToClipboard(text).then(function(ok){\r\n        outputWrite(ok ? \"Kod panoya kopyaland\u0131.\" : \"Kopyalama engellendi (taray\u0131c\u0131 izni).\");\r\n      });\r\n    });\r\n  }\r\n\r\n  \/* =============================\r\n   * \u2705 9.1) Sorun Bildir (WhatsApp)\r\n   * ============================= *\/\r\n  if (el.btnReport) {\r\n    el.btnReport.addEventListener(\"click\", function () {\r\n      openWhatsAppReport();\r\n    });\r\n  } else {\r\n    document.addEventListener(\"click\", function(e){\r\n      var b = e.target && e.target.closest ? e.target.closest(\"#arduinoReportBtn\") : null;\r\n      if (!b) return;\r\n      e.preventDefault();\r\n      openWhatsAppReport();\r\n    }, true);\r\n  }\r\n\r\n  \/* =============================\r\n   * 10) Cache \/ inflight\r\n   * ============================= *\/\r\n  var PROJECT_CACHE_LIMIT = 60;\r\n  var projectCache = new Map();\r\n  var inflight = new Map();\r\n\r\n  function cacheGet(slug) {\r\n    if (!slug || !projectCache.has(slug)) return null;\r\n    var v = projectCache.get(slug);\r\n    projectCache.delete(slug);\r\n    projectCache.set(slug, v);\r\n    return v;\r\n  }\r\n\r\n  function cacheSet(slug, data) {\r\n    if (!slug) return;\r\n    if (projectCache.has(slug)) projectCache.delete(slug);\r\n    projectCache.set(slug, data);\r\n    while (projectCache.size > PROJECT_CACHE_LIMIT) {\r\n      var firstKey = projectCache.keys().next().value;\r\n      projectCache.delete(firstKey);\r\n    }\r\n  }\r\n\r\n  \/* =============================\r\n   * 11) AJAX helpers (admin-ajax format)\r\n   * ============================= *\/\r\n  function fetchAjaxJSON(urlObj) {\r\n    return fetch(urlObj.toString(), {\r\n      method: \"GET\",\r\n      credentials: \"include\",\r\n      cache: \"no-store\",\r\n      headers: { \"Accept\": \"application\/json\" }\r\n    })\r\n    .then(function(res){\r\n      if (!res.ok) throw new Error(\"HTTP \" + res.status);\r\n      return res.json();\r\n    })\r\n    .then(function(json){\r\n      \/\/ WordPress admin-ajax: { success:true, data:{...} }\r\n      if (!json || json.success !== true) {\r\n        throw new Error(\"AJAX ba\u015far\u0131s\u0131z\");\r\n      }\r\n      return json.data;\r\n    });\r\n  }\r\n\r\n  function loadProjectList() {\r\n    return fetchAjaxJSON(API_LIST).then(function(payload){\r\n      if (!payload || !payload.ok) return [];\r\n      return payload.items || [];\r\n    });\r\n  }\r\n\r\n  function loadProjectBySlug(slug) {\r\n    var clean = sanitizeSlug(slug);\r\n    if (!clean) return Promise.reject(new Error(\"Slug bo\u015f\"));\r\n\r\n    var cached = cacheGet(clean);\r\n    if (cached) return Promise.resolve(cached);\r\n\r\n    if (inflight.has(clean)) return inflight.get(clean);\r\n\r\n    var url = API_ONE(clean);\r\n\r\n    var p = fetchAjaxJSON(url)\r\n      .then(function (payload) {\r\n        if (!payload || !payload.ok) throw new Error(\"Project payload ok de\u011fil\");\r\n        var data = payload.data || {};\r\n        cacheSet(clean, data);\r\n        return data;\r\n      })\r\n      .finally(function () { inflight.delete(clean); });\r\n\r\n    inflight.set(clean, p);\r\n    return p;\r\n  }\r\n\r\n  \/* =============================\r\n   * 12) Data normalize\r\n   * ============================= *\/\r\n  function normalizeProjectData(data, fallbackSlug) {\r\n    var code = (data && (data.arduino_kodu || data.code || data.sketch)) || \"\";\r\n    var baseSlug = sanitizeSlug((data && data.slug) || fallbackSlug || \"\");\r\n    var fileFromApi = String((data && (data.dosya_adi || data.filename)) || \"\").trim();\r\n    var file = fileFromApi ? fileFromApi : (baseSlug ? (baseSlug + \".ino\") : \"sketch.ino\");\r\n\r\n    \/\/ \u2705 wiring: \u00f6nce baglanti_semasi, sonra wiring_image\r\n    var wiring = (data && (data.baglanti_semasi || data.wiring_image || data.schema)) || \"\";\r\n\r\n    var outHtml = (data && data.output) || \"\";\r\n    var id = (data && data.id) || null;\r\n\r\n    var premiumOnly = !!(data && data.premium_only);\r\n    var restricted  = !!(data && data.restricted);\r\n\r\n    return {\r\n      id: id,\r\n      code: code,\r\n      file: file,\r\n      wiring: wiring,\r\n      outHtml: outHtml,\r\n      premiumOnly: premiumOnly,\r\n      restricted: restricted\r\n    };\r\n  }\r\n\r\n  \/* =============================\r\n   * 13) Men\u00fc: Accordion\r\n   * ============================= *\/\r\n  var slugToParent = new Map();\r\n\r\n  function closeAllAccordionExcept(parentKeyToKeep) {\r\n    el.menuList.querySelectorAll(\".ap-cat\").forEach(function (cat) {\r\n      var pkey = cat.getAttribute(\"data-parent\");\r\n      var btn = cat.querySelector(\".ap-cat-btn\");\r\n      var list = cat.querySelector(\".ap-list\");\r\n      var shouldOpen = (pkey && parentKeyToKeep && pkey === parentKeyToKeep);\r\n\r\n      if (btn) btn.classList.toggle(\"is-open\", shouldOpen);\r\n      if (btn) btn.setAttribute(\"aria-expanded\", shouldOpen ? \"true\" : \"false\");\r\n      if (list) list.classList.toggle(\"is-open\", shouldOpen);\r\n    });\r\n  }\r\n\r\n  function openParentAccordionBySlug(slug) {\r\n    var pkey = slugToParent.get(slug);\r\n    if (!pkey) return;\r\n    closeAllAccordionExcept(pkey);\r\n  }\r\n\r\n  function setActiveMenuSlug(slug) {\r\n    el.menuList.querySelectorAll(\"[data-slug]\").forEach(function (node) {\r\n      node.classList.toggle(\"is-active\", node.getAttribute(\"data-slug\") === slug);\r\n    });\r\n  }\r\n\r\n  function renderMenu(items) {\r\n    var arr = Array.isArray(items) ? items : [];\r\n    if (!arr.length) {\r\n      console.warn(\"[ARDUINO] Men\u00fc i\u00e7in liste bo\u015f geldi.\");\r\n      return;\r\n    }\r\n\r\n    var tree = new Map();\r\n    slugToParent.clear();\r\n\r\n    arr.forEach(function (it) {\r\n      var slug = sanitizeSlug((it && (it.slug || it.post_name || it.id)) || \"\");\r\n      if (!slug) return;\r\n\r\n      var title = getProjectTitle(it, slug);\r\n\r\n      \/\/ Kategori: API \"categories\" alan\u0131n\u0131 string dizi olarak d\u00f6nd\u00fcr\u00fcyor.\r\n      \/\/ \u00d6rn: categories: [\"Matematik\"]  -> parent = \"Matematik\"\r\n      var parent = (it && Array.isArray(it.categories) && it.categories.length)\r\n        ? String(it.categories[0]).trim()\r\n        : \"Di\u011fer\";\r\n        \r\n        console.log(\"DEBUG FULL it:\", JSON.stringify(it, null, 2));\r\n        console.log(\"DEBUG categories:\", it && it.categories);\r\n\r\n      if (!tree.has(parent)) tree.set(parent, []);\r\n      tree.get(parent).push({\r\n        slug: slug,\r\n        title: title,\r\n        premiumOnly: !!(it && it.premium_only)\r\n      });\r\n      slugToParent.set(slug, parent);\r\n    });\r\n\r\n    var parents = Array.from(tree.keys()).sort(function(a,b){ return a.localeCompare(b,\"tr\"); });\r\n    var currentSlug = getSlugFromURL();\r\n\r\n    el.menuList.innerHTML = \"\";\r\n\r\n    parents.forEach(function (parentName) {\r\n      var projects = (tree.get(parentName) || []).slice().sort(function(x,y){ return x.title.localeCompare(y.title,\"tr\"); });\r\n\r\n      var catLi = document.createElement(\"li\");\r\n      catLi.className = \"ap-cat\";\r\n      catLi.setAttribute(\"data-parent\", parentName);\r\n\r\n      var btn = document.createElement(\"button\");\r\n      btn.type = \"button\";\r\n      btn.className = \"ap-cat-btn\";\r\n      btn.setAttribute(\"aria-expanded\", \"false\");\r\n\r\n      var caret = document.createElement(\"span\");\r\n      caret.className = \"ap-caret\";\r\n      caret.textContent = \"\u203a\";\r\n\r\n      var label = document.createElement(\"span\");\r\n      label.textContent = parentName;\r\n\r\n      btn.appendChild(label);\r\n      btn.appendChild(caret);\r\n\r\n      var ul = document.createElement(\"ul\");\r\n      ul.className = \"ap-list\";\r\n\r\n      projects.forEach(function (p) {\r\n        var li = document.createElement(\"li\");\r\n\r\n        var item = document.createElement(\"button\");\r\n        item.type = \"button\";\r\n        item.className = \"ap-item\";\r\n        item.setAttribute(\"data-slug\", p.slug);\r\n\r\n        if (p.premiumOnly) {\r\n          item.classList.add(\"is-premium\");\r\n          item.innerHTML =\r\n            '<span class=\"ap-lock\">\ud83d\udd12<\/span>' +\r\n            '<span class=\"ap-title\">' + escapeHtml(p.title) + '<\/span>';\r\n        } else {\r\n          item.textContent = p.title;\r\n        }\r\n\r\n        li.appendChild(item);\r\n        ul.appendChild(li);\r\n      });\r\n\r\n      catLi.appendChild(btn);\r\n      catLi.appendChild(ul);\r\n      el.menuList.appendChild(catLi);\r\n    });\r\n\r\n    if (currentSlug) {\r\n      setActiveMenuSlug(currentSlug);\r\n      openParentAccordionBySlug(currentSlug);\r\n    } else {\r\n      var firstCat = el.menuList.querySelector(\".ap-cat\");\r\n      if (firstCat) closeAllAccordionExcept(firstCat.getAttribute(\"data-parent\"));\r\n    }\r\n  }\r\n\r\n  function bindMenuClicks() {\r\n    el.menuList.addEventListener(\"click\", function (e) {\r\n      var catBtn = e.target && e.target.closest(\".ap-cat-btn\");\r\n      if (catBtn) {\r\n        e.preventDefault();\r\n        var cat = catBtn.closest(\".ap-cat\");\r\n        if (!cat) return;\r\n        var pkey = cat.getAttribute(\"data-parent\");\r\n\r\n        var isOpenNow = catBtn.classList.contains(\"is-open\");\r\n        if (isOpenNow) {\r\n          catBtn.classList.remove(\"is-open\");\r\n          catBtn.setAttribute(\"aria-expanded\", \"false\");\r\n          var list = cat.querySelector(\".ap-list\");\r\n          if (list) list.classList.remove(\"is-open\");\r\n        } else {\r\n          closeAllAccordionExcept(pkey);\r\n        }\r\n        return;\r\n      }\r\n\r\n      var item = e.target && e.target.closest(\"[data-slug]\");\r\n      if (item) {\r\n        e.preventDefault();\r\n        var slug = item.getAttribute(\"data-slug\");\r\n        if (!slug) return;\r\n\r\n        \/\/ \u2705 premium item t\u0131kland\u0131ysa ve eri\u015fim yoksa modal a\u00e7\r\n        var isPremiumItem = item.classList.contains(\"is-premium\");\r\n        if (isPremiumItem) {\r\n          var acc = accessState();\r\n          if (!acc.logged_in || !acc.is_premium) {\r\n            openPremiumModal();\r\n            return;\r\n          }\r\n        }\r\n\r\n        openParentAccordionBySlug(slug);\r\n        selectProject(slug, { pushTab: getCurrentTab() });\r\n      }\r\n    });\r\n  }\r\n\r\n  \/* =============================\r\n   * 14) Malzeme Listesi Modal (BUY ONLY) \u2014 seninki ayn\u0131\r\n   * ============================= *\/\r\n  var currentProjectMaterials = [];\r\n\r\n  function normalizeMaterials(value){\r\n    if (value == null) return [];\r\n\r\n    if (Array.isArray(value)) {\r\n      return value.map(function(v){ return String(v == null ? \"\" : v).trim(); }).filter(Boolean);\r\n    }\r\n\r\n    var str = String(value).trim();\r\n    if (!str) return [];\r\n\r\n    str = str\r\n      .replace(\/<\\s*br\\s*\\\/?>\/gi, \"\\n\")\r\n      .replace(\/<\\\/\\s*(p|div|li)\\s*>\/gi, \"\\n\")\r\n      .replace(\/<\\s*li[^>]*>\/gi, \"\")\r\n      .replace(\/<\\s*\\\/?\\s*(ul|ol)[^>]*>\/gi, \"\\n\")\r\n      .replace(\/&nbsp;\/gi, \" \");\r\n\r\n    str = str.replace(\/<[^>]+>\/g, \"\");\r\n    str = str.replace(\/\\r\\n\/g, \"\\n\").replace(\/\\r\/g, \"\\n\");\r\n\r\n    var parts = [];\r\n    if (str.indexOf(\"\\n\") !== -1) {\r\n      parts = str.split(\"\\n\");\r\n    } else if (\/\\b\\d+\\s*[\\.\\)]\\s+\/.test(str)) {\r\n      parts = str.split(\/\\s*(?=\\d+\\s*[\\.\\)]\\s+)\/g);\r\n    } else {\r\n      parts = str.split(\/[,;]+\/);\r\n    }\r\n\r\n    var cleaned = parts\r\n      .map(function(s){ return String(s == null ? \"\" : s).trim(); })\r\n      .map(function(s){ return s.replace(\/^\\s*(?:[-\u2022*]+|\\d+\\s*[\\.\\)])\\s*\/g, \"\").trim(); })\r\n      .filter(Boolean);\r\n\r\n    if (cleaned.length === 1 && \/\\b\\d+\\s*[\\.\\)]\\s+\/.test(cleaned[0])) {\r\n      return cleaned[0]\r\n        .split(\/\\s*(?=\\d+\\s*[\\.\\)]\\s+)\/g)\r\n        .map(function(s){ return s.replace(\/^\\s*\\d+\\s*[\\.\\)]\\s*\/g, \"\").trim(); })\r\n        .filter(Boolean);\r\n    }\r\n\r\n    return cleaned;\r\n  }\r\n\r\n  function renderMaterialsHtml(list){\r\n    if (!list || !list.length) {\r\n      return '<div class=\"arduino-modal__empty\">Bu proje i\u00e7in malzeme listesi bulunamad\u0131.<\/div>';\r\n    }\r\n\r\n    var html = '<ol class=\"arduino-modal__list\">';\r\n    for (var i=0; i<list.length; i++){\r\n      html += \"<li>\" + escapeHtml(list[i]) + \"<\/li>\";\r\n    }\r\n    html += \"<\/ol>\";\r\n\r\n    html += '' +\r\n      '<div class=\"arduino-modal__footer\">' +\r\n        '<button type=\"button\" class=\"arduino-modal__action arduino-modal__action--buy\" id=\"arduinoBuyBtn\">Sat\u0131n al<\/button>' +\r\n      '<\/div>';\r\n\r\n    return html;\r\n  }\r\n\r\n  function openMaterialsModal(list){\r\n    el.materialsModal     = document.getElementById(\"arduinoMaterialsModal\");\r\n    el.materialsModalBody = document.getElementById(\"arduinoMaterialsModalBody\");\r\n    has.materialsModal     = !!el.materialsModal;\r\n    has.materialsModalBody = !!el.materialsModalBody;\r\n\r\n    if (!has.materialsModal || !has.materialsModalBody) return;\r\n\r\n    el.materialsModalBody.innerHTML = renderMaterialsHtml(list);\r\n\r\n    el.materialsModal.classList.add(\"is-open\");\r\n    el.materialsModal.setAttribute(\"aria-hidden\", \"false\");\r\n    document.body.classList.add(\"arduino-modal-lock\");\r\n  }\r\n\r\n  function closeMaterialsModal(){\r\n    el.materialsModal = document.getElementById(\"arduinoMaterialsModal\");\r\n    has.materialsModal = !!el.materialsModal;\r\n    if (!has.materialsModal) return;\r\n\r\n    el.materialsModal.classList.remove(\"is-open\");\r\n    el.materialsModal.setAttribute(\"aria-hidden\", \"true\");\r\n    document.body.classList.remove(\"arduino-modal-lock\");\r\n  }\r\n\r\n  function handleBuyAction(){\r\n    var url = window.location.href;\r\n    var phone = \"905533772928\";\r\n    var msg = \"Merhabalar, internet sitenizden sizlere ula\u015f\u0131m sa\u011fl\u0131yorum. Bu \u00fcr\u00fcn\u00fc sat\u0131n almak istiyorum: \" + url;\r\n    var wa = \"https:\/\/wa.me\/\" + phone + \"?text=\" + encodeURIComponent(msg);\r\n    window.open(wa, \"_blank\", \"noopener\");\r\n  }\r\n\r\n  var materialsBound = false;\r\n  function bindMaterialsUI(){\r\n    el.materialsBtn       = document.getElementById(\"arduinoMaterialsBtn\");\r\n    el.materialsModal     = document.getElementById(\"arduinoMaterialsModal\");\r\n    el.materialsModalBody = document.getElementById(\"arduinoMaterialsModalBody\");\r\n\r\n    has.materialsBtn       = !!el.materialsBtn;\r\n    has.materialsModal     = !!el.materialsModal;\r\n    has.materialsModalBody = !!el.materialsModalBody;\r\n\r\n    if (!has.materialsBtn || !has.materialsModal || !has.materialsModalBody) return;\r\n    if (materialsBound) return;\r\n    materialsBound = true;\r\n\r\n    el.materialsBtn.addEventListener(\"click\", function(e){\r\n      e.preventDefault();\r\n      openMaterialsModal(currentProjectMaterials);\r\n    });\r\n\r\n    el.materialsModal.addEventListener(\"click\", function (e) {\r\n      var t = e.target;\r\n\r\n      if (t && t.hasAttribute && t.hasAttribute(\"data-am-close\")) {\r\n        e.preventDefault();\r\n        closeMaterialsModal();\r\n        return;\r\n      }\r\n\r\n      var buyBtn = e.target && e.target.closest ? e.target.closest(\"#arduinoBuyBtn\") : null;\r\n      if (buyBtn) {\r\n        e.preventDefault();\r\n        handleBuyAction();\r\n        return;\r\n      }\r\n    });\r\n\r\n    document.addEventListener(\"keydown\", function (e) {\r\n      var m = document.getElementById(\"arduinoMaterialsModal\");\r\n      if (e.key === \"Escape\" && m && m.classList.contains(\"is-open\")) {\r\n        closeMaterialsModal();\r\n      }\r\n    });\r\n  }\r\n\r\n  function loadMaterialsFallbackById(postId){\r\n    if (!postId) return Promise.resolve([]);\r\n    return fetch(wpV2OneUrl(postId).toString(), {\r\n      method:\"GET\",\r\n      credentials:\"include\",\r\n      cache:\"no-store\",\r\n      headers:{ \"Accept\":\"application\/json\" }\r\n    })\r\n    .then(function(r){ if(!r.ok) throw new Error(\"HTTP \"+r.status); return r.json(); })\r\n    .then(function(data){\r\n      var v = (data && data.acf && (data.acf.malzeme_listesi || data.acf.materials)) || \"\";\r\n      return normalizeMaterials(v);\r\n    })\r\n    .catch(function(){\r\n      return [];\r\n    });\r\n  }\r\n\r\n  \/* =============================\r\n   * 15) Proje se\u00e7\r\n   * ============================= *\/\r\n  function selectProject(slug, opt) {\r\n    opt = opt || {};\r\n    var pushTab = opt.pushTab || \"code\";\r\n\r\n    var s = sanitizeSlug(slug);\r\n    if (pushTab === \"wiring\" && !has.panelWiring) pushTab = \"code\";\r\n\r\n    if (!s) {\r\n      renderCode(\"L\u00fctfen soldan bir proje se\u00e7in.\", \"sketch.ino\");\r\n      renderWiring(\"\");\r\n      setWiringEmptyNoteText(NO_WIRING_MSG);\r\n      currentProjectMaterials = [];\r\n      currentProjectTitle = \"Arduino Projesi\";\r\n      outputSet(\"> Haz\u0131r.\\n> Sol men\u00fcden bir Arduino projesi se\u00e7in.\");\r\n      return Promise.resolve();\r\n    }\r\n\r\n    setActiveMenuSlug(s);\r\n    setURLSlug(s);\r\n    setActiveTab(pushTab);\r\n    openParentAccordionBySlug(s);\r\n\r\n    outputSet(\"\");\r\n    outputWrite(\"Loading project: \" + s);\r\n\r\n    return loadProjectBySlug(s)\r\n      .then(function(data){\r\n        \/\/ \u2705 Server restricted d\u00f6nd\u00fcr\u00fcrse kilitle\r\n        if (data && data.restricted) {\r\n          currentProjectTitle = data && data.title ? decodeHtmlEntities(String(data.title)) : s;\r\n          renderPremiumRestrictedUI(PREMIUM_MSG);\r\n          return null;\r\n        }\r\n\r\n        var p = normalizeProjectData(data, s);\r\n\r\n        currentProjectTitle = data && data.title ? decodeHtmlEntities(String(data.title)) : s;\r\n\r\n        renderCode(String(p.code || \"\").trim() ? p.code : \"Bu proje i\u00e7in kod eklenmemi\u015f.\", p.file);\r\n\r\n        \/\/ \u2705 wiring fix: URL yoksa \u201c\u015fema yok\u201d yaz\u0131s\u0131 gelecek\r\n        setWiringEmptyNoteText(NO_WIRING_MSG);\r\n        renderWiring(String(p.wiring || \"\").trim());\r\n\r\n        if (p.outHtml) {\r\n          outputWriteBlock(htmlToText(decodeHtmlEntities(p.outHtml)));\r\n        } else {\r\n          outputWrite(\"OK.\");\r\n        }\r\n\r\n        \/\/ malzeme listesi (varsa)\r\n        var directMaterials = (data && (data.malzeme_listesi || (data.acf && data.acf.malzeme_listesi))) || \"\";\r\n        var normDirect = normalizeMaterials(directMaterials);\r\n\r\n        if (normDirect.length) {\r\n          currentProjectMaterials = normDirect;\r\n          return null;\r\n        }\r\n\r\n        return loadMaterialsFallbackById(p.id).then(function(list){\r\n          currentProjectMaterials = list || [];\r\n          return null;\r\n        });\r\n      })\r\n      .catch(function(err){\r\n        console.warn(\"[ARDUINO] Proje y\u00fcklenemedi:\", err);\r\n        renderCode(\"Proje y\u00fcklenemedi. L\u00fctfen tekrar deneyin.\", \"sketch.ino\");\r\n        setWiringEmptyNoteText(NO_WIRING_MSG);\r\n        renderWiring(\"\");\r\n        currentProjectMaterials = [];\r\n        currentProjectTitle = \"Arduino Projesi\";\r\n        outputWrite(\"ERROR: \" + (err && err.message ? err.message : String(err)));\r\n      });\r\n  }\r\n\r\n  \/* =============================\r\n   * 16) Init\r\n   * ============================= *\/\r\n  function init() {\r\n    ensureWiringTabVisibility();\r\n    syncScroll();\r\n    applyFontSize();\r\n    bindMenuClicks();\r\n\r\n    bindMaterialsUI();\r\n    setTimeout(bindMaterialsUI, 400);\r\n    setTimeout(bindMaterialsUI, 1200);\r\n\r\n    setActiveTab(\"code\");\r\n    outputSet(\"> Liste y\u00fckleniyor...\");\r\n\r\n    loadProjectList()\r\n      .then(function(list){\r\n        renderMenu(list);\r\n\r\n        var slug = getSlugFromURL();\r\n        if (slug) return selectProject(slug, { pushTab: getCurrentTab() });\r\n\r\n        if (list && list.length) {\r\n          var firstSlug = sanitizeSlug(list[0].slug || list[0].post_name || \"\");\r\n          if (firstSlug) return selectProject(firstSlug, { pushTab: \"code\" });\r\n        }\r\n\r\n        renderCode(\"Hen\u00fcz proje bulunamad\u0131.\", \"sketch.ino\");\r\n        setWiringEmptyNoteText(NO_WIRING_MSG);\r\n        renderWiring(\"\");\r\n        outputSet(\"> Proje listesi bo\u015f.\");\r\n        return null;\r\n      })\r\n      .catch(function(e){\r\n        console.warn(\"[ARDUINO] Init hata:\", e);\r\n        outputSet(\"> Hata: Liste y\u00fcklenemedi.\");\r\n      });\r\n  }\r\n\r\n  if (document.readyState === \"loading\") {\r\n    document.addEventListener(\"DOMContentLoaded\", init);\r\n  } else {\r\n    init();\r\n  }\r\n\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b683f5f elementor-widget elementor-widget-html\" data-id=\"b683f5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<!-- MALZEME L\u0130STES\u0130 MODAL (GLOBAL) -->\r\n<div id=\"arduinoMaterialsModal\" class=\"arduino-modal\" aria-hidden=\"true\">\r\n  <div class=\"arduino-modal__overlay\" data-am-close><\/div>\r\n\r\n  <div class=\"arduino-modal__dialog\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"arduinoMaterialsModalTitle\">\r\n    <div class=\"arduino-modal__header\">\r\n      <div class=\"arduino-modal__title\" id=\"arduinoMaterialsModalTitle\">Malzeme Listesi<\/div>\r\n      <button type=\"button\" class=\"arduino-modal__close\" data-am-close aria-label=\"Kapat\">\u2715<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"arduino-modal__body\" id=\"arduinoMaterialsModalBody\">\r\n      <div class=\"arduino-modal__empty\">Malzeme listesi y\u00fckleniyor\u2026<\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\r\n\r\n<!-- PREMIUM MODAL (GLOBAL) -->\r\n<div id=\"arduinoPremiumModal\" class=\"arduino-modal\" aria-hidden=\"true\">\r\n  <div class=\"arduino-modal__overlay\" data-ap-premium-close><\/div>\r\n\r\n  <div class=\"arduino-modal__dialog arduino-modal__dialog--premium\" role=\"dialog\" aria-modal=\"true\" aria-labelledby=\"arduinoPremiumModalTitle\">\r\n    <div class=\"arduino-modal__header\">\r\n      <div class=\"arduino-modal__title\" id=\"arduinoPremiumModalTitle\">\ud83d\udd12 Premium \u0130\u00e7erik<\/div>\r\n      <button type=\"button\" class=\"arduino-modal__close\" data-ap-premium-close aria-label=\"Kapat\">\u2715<\/button>\r\n    <\/div>\r\n\r\n    <div class=\"arduino-modal__body\">\r\n      <div class=\"ap-premium-text\">\r\n        Bu proje <strong>Premium \u00dcyelik<\/strong> gerektirir.\r\n        <br>\r\n        Premium ile <strong>1000+ Arduino projesine<\/strong> an\u0131nda eri\u015febilirsin.\r\n      <\/div>\r\n\r\n      <div class=\"ap-premium-actions\">\r\n        <a class=\"ap-premium-btn ap-premium-btn--primary\" href=\"\/arduino\/register\/\">\u00dcye Ol<\/a>\r\n        <a class=\"ap-premium-btn ap-premium-btn--ghost\" href=\"\/arduino\/login\/\">Giri\u015f Yap<\/a>\r\n      <\/div>\r\n\r\n      <div class=\"ap-premium-mini\">\r\n        Not: Giri\u015f yapt\u0131ktan sonra kilit ikonlar\u0131 otomatik gizlenir.\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n<\/div>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6e05302 elementor-widget elementor-widget-html\" data-id=\"6e05302\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  \/\/ === FACADIUM PROJECT OVERRIDE v1 ===\r\n  console.log(\"FACADIUM PROJECT OVERRIDE v1 LOADED\");\r\n\r\n  function ajaxUrl(){\r\n    return (window.FACADIUM_ACCESS && window.FACADIUM_ACCESS.ajax_url)\r\n      ? window.FACADIUM_ACCESS.ajax_url\r\n      : (window.location.origin + \"\/arduino\/wp-admin\/admin-ajax.php\");\r\n  }\r\n\r\n  function getSlugFromHash(){\r\n    var h = (window.location.hash || \"\").replace(\/^#\/, \"\").trim();\r\n    return h;\r\n  }\r\n\r\n  function qs(sel){ return document.querySelector(sel); }\r\n\r\n  function decodeHtmlToText(html){\r\n    if (!html) return \"\";\r\n    var div = document.createElement(\"div\");\r\n    div.innerHTML = html;\r\n    return (div.textContent || div.innerText || \"\").trim();\r\n  }\r\n\r\n  async function fetchProjectBySlug(slug){\r\n    var u = new URL(ajaxUrl(), window.location.origin);\r\n    u.searchParams.set(\"action\", \"facadium_arduino_project\");\r\n    u.searchParams.set(\"slug\", slug);\r\n    u.searchParams.set(\"_\", Date.now());\r\n\r\n    var res = await fetch(u.toString(), { credentials:\"include\", cache:\"no-store\" });\r\n    if (!res.ok) throw new Error(\"AJAX HTTP \" + res.status);\r\n    var json = await res.json();\r\n    if (!json || !json.success || !json.data) throw new Error(\"AJAX bad json\");\r\n    if (!json.data.ok) throw new Error(\"AJAX ok=false: \" + (json.data.error || \"unknown\"));\r\n    return json.data.data;\r\n  }\r\n\r\n  function renderPremiumPlaceholder(){\r\n    var fileEl = qs(\"#arduinoFileName\");\r\n    var codeEl = qs(\"#arduinoCodeBlock\");\r\n    var outEl  = qs(\"#arduinoOutput\");\r\n    if (fileEl) fileEl.textContent = \"premium.ino\";\r\n    if (codeEl) codeEl.textContent = \"Bu i\u00e7erik sadece \u00fccretli \u00fcyelere \u00f6zeldir.\";\r\n    if (outEl)  outEl.textContent  = \"Bu i\u00e7erik sadece \u00fccretli \u00fcyelere \u00f6zeldir.\";\r\n  }\r\n\r\n  function renderProject(p){\r\n    var fileEl = qs(\"#arduinoFileName\");\r\n    var codeEl = qs(\"#arduinoCodeBlock\");\r\n    var outEl  = qs(\"#arduinoOutput\");\r\n\r\n    \/\/ DOM haz\u0131r de\u011filse sessiz \u00e7\u0131k\r\n    if (!codeEl) return;\r\n\r\n    var restricted = !!p.restricted;\r\n\r\n    if (fileEl){\r\n      fileEl.textContent = restricted ? \"premium.ino\" : ((p.slug || \"sketch\") + \".ino\");\r\n    }\r\n\r\n    if (restricted){\r\n      renderPremiumPlaceholder();\r\n      \/\/ Premium modal varsa a\u00e7may\u0131 dene\r\n      var modal = qs(\"#arduinoPremiumModal\");\r\n      if (modal){\r\n        modal.setAttribute(\"aria-hidden\", \"false\");\r\n        modal.classList.add(\"is-open\");\r\n      }\r\n      return;\r\n    }\r\n\r\n    \/\/ \u2705 Premium kullan\u0131c\u0131da ger\u00e7ek kod\r\n    codeEl.textContent = (p.arduino_kodu || \"\").trim() || \"\/\/ Kod bulunamad\u0131\";\r\n    if (outEl){\r\n      outEl.textContent = decodeHtmlToText(p.output || \"\") || \"> Output yok\";\r\n    }\r\n\r\n    \/\/ Modal a\u00e7\u0131ksa kapat\r\n    var modal2 = qs(\"#arduinoPremiumModal\");\r\n    if (modal2){\r\n      modal2.setAttribute(\"aria-hidden\", \"true\");\r\n      modal2.classList.remove(\"is-open\");\r\n    }\r\n  }\r\n\r\n  var lastSlug = null;\r\n  var inFlight = false;\r\n\r\n  async function loadFromHash(){\r\n    var slug = getSlugFromHash();\r\n    if (!slug) return;\r\n    if (slug === lastSlug && inFlight) return;\r\n\r\n    lastSlug = slug;\r\n    inFlight = true;\r\n\r\n    try{\r\n      var p = await fetchProjectBySlug(slug);\r\n      renderProject(p);\r\n    }catch(e){\r\n      console.warn(\"FACADIUM OVERRIDE load err:\", e);\r\n      \/\/ bulamad\u0131ysa placeholder bas (eski scriptler bo\u015fa d\u00f6nmesin)\r\n      renderPremiumPlaceholder();\r\n    }finally{\r\n      inFlight = false;\r\n    }\r\n  }\r\n\r\n  \/\/ Hash de\u011fi\u015fince y\u00fckle\r\n  window.addEventListener(\"hashchange\", function(){\r\n    loadFromHash().catch(function(){});\r\n  });\r\n\r\n  \/\/ \u0130lk y\u00fcklemede \u00e7al\u0131\u015ft\u0131r\r\n  document.addEventListener(\"DOMContentLoaded\", function(){\r\n    loadFromHash().catch(function(){});\r\n  });\r\n\r\n  \/\/ Di\u011fer script \"premium.ino\"yu sonradan basarsa geri al (watchdog)\r\n  \/\/ Premium ise ve hash varsa tekrar y\u00fckler.\r\n  var codeEl = qs(\"#arduinoCodeBlock\");\r\n  if (codeEl){\r\n    var mo = new MutationObserver(function(){\r\n      var slug = getSlugFromHash();\r\n      if (!slug) return;\r\n\r\n      var isPremium = !!(window.FACADIUM_ACCESS && window.FACADIUM_ACCESS.is_premium);\r\n      if (!isPremium) return;\r\n\r\n      var txt = (codeEl.textContent || \"\").toLowerCase();\r\n      if (txt.includes(\"sadece \u00fccretli \u00fcyelere\")){\r\n        \/\/ k\u0131sa gecikmeyle tekrar y\u00fckle\r\n        setTimeout(function(){ loadFromHash().catch(function(){}); }, 80);\r\n      }\r\n    });\r\n    mo.observe(codeEl, { childList:true, characterData:true, subtree:true });\r\n  }\r\n\r\n})();\r\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12d369a elementor-widget elementor-widget-html\" data-id=\"12d369a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t\t<script>\r\n(function(){\r\n  \"use strict\";\r\n\r\n  const PREMIUM_TEXT = \"Bu i\u00e7erik sadece \u00fccretli \u00fcyelere \u00f6zeldir.\";\r\n  const EMPTY_WIRING_TEXT = \"Bu projede ba\u011flant\u0131 \u015femas\u0131 bulunmamaktad\u0131r.\";\r\n\r\n  \/\/ Son y\u00fcklenen proje datas\u0131n\u0131 burada tutaca\u011f\u0131z\r\n  window.__FAC_LAST_PROJECT = window.__FAC_LAST_PROJECT || null;\r\n\r\n  function isPremium(){\r\n    return !!(window.FACADIUM_ACCESS && (window.FACADIUM_ACCESS.is_premium === true || window.FACADIUM_ACCESS.is_premium === 1));\r\n  }\r\n\r\n  \/\/ 1) fetch\u2019i \u201cclone\u201d ile dinle: action=facadium_arduino_project cevab\u0131n\u0131 yakala\r\n  const _fetch = window.fetch;\r\n  window.fetch = async function(input, init){\r\n    const res = await _fetch.apply(this, arguments);\r\n\r\n    try{\r\n      const url = (typeof input === \"string\") ? input : (input && input.url) ? input.url : \"\";\r\n      if (url && url.indexOf(\"admin-ajax.php\") !== -1 && url.indexOf(\"action=facadium_arduino_project\") !== -1){\r\n        const clone = res.clone();\r\n        clone.json().then(function(json){\r\n          \/\/ beklenen format: {success:true, data:{ ok:true, data:{...payload...}}}\r\n          const payload = json && json.data && json.data.data ? json.data.data : null;\r\n          if (payload && payload.id){\r\n            window.__FAC_LAST_PROJECT = payload;\r\n          }\r\n        }).catch(function(){});\r\n      }\r\n    }catch(e){}\r\n\r\n    return res;\r\n  };\r\n\r\n  function getActiveSectionRoot(){\r\n    \/\/ \"Ba\u011flant\u0131 \u015eemas\u0131\" butonunu bul -> en yak\u0131n elementor section\/root\r\n    const btn = Array.from(document.querySelectorAll(\"button,a,div,span\"))\r\n      .find(n => ((n.textContent||\"\").trim().toLowerCase() === \"ba\u011flant\u0131 \u015femas\u0131\"));\r\n    if (!btn) return document;\r\n    return btn.closest(\"section, .elementor-section, .elementor-widget-wrap, .elementor\") || document;\r\n  }\r\n\r\n  function replaceTextEverywhere(root, fromText, toHtml){\r\n    const walker = document.createTreeWalker(root, NodeFilter.SHOW_ELEMENT, null);\r\n    const hits = [];\r\n    while (walker.nextNode()){\r\n      const el = walker.currentNode;\r\n      if (!el || !el.textContent) continue;\r\n      const t = (el.textContent || \"\").trim();\r\n      \/\/ sadece premium mesaj\u0131 i\u00e7eren \u201ck\u0131sa\u201d bloklar\u0131 hedef al (t\u00fcm sayfay\u0131 bozmayal\u0131m)\r\n      if (t === fromText || t.includes(fromText)){\r\n        hits.push(el);\r\n      }\r\n    }\r\n\r\n    hits.forEach(el => {\r\n      \/\/ E\u011fer bu elementin i\u00e7inde img varsa dokunma\r\n      if (el.querySelector && el.querySelector(\"img\")) return;\r\n\r\n      \/\/ \u00c7ok b\u00fcy\u00fck kapsay\u0131c\u0131lar\u0131 komple de\u011fi\u015ftirmeyelim; daha i\u00e7teki \"mesaj\" node'una bas\r\n      \/\/ E\u011fer elementin sadece bu metni i\u00e7erdi\u011fini d\u00fc\u015f\u00fcn\u00fcyorsak direkt de\u011fi\u015ftir\r\n      const onlyText = ((el.innerText||\"\").trim() === fromText);\r\n      if (onlyText){\r\n        el.innerHTML = toHtml;\r\n      } else {\r\n        \/\/ i\u00e7erde metin ge\u00e7en bir alt node arayal\u0131m\r\n        const inner = Array.from(el.querySelectorAll(\"*\"))\r\n          .find(x => ((x.innerText||\"\").trim() === fromText));\r\n        if (inner) inner.innerHTML = toHtml;\r\n      }\r\n    });\r\n\r\n    return hits.length;\r\n  }\r\n\r\n  function ensureEmptyMessageIfNoWiring(root){\r\n    \/\/ Wiring g\u00f6rseli var m\u0131?\r\n    const img = root.querySelector(\"img\");\r\n    const hasImg = !!(img && (img.getAttribute(\"src\")||\"\").trim().length);\r\n\r\n    if (hasImg) return;\r\n\r\n    \/\/ Root i\u00e7inde g\u00f6zle g\u00f6r\u00fcn\u00fcr bir i\u00e7erik alan\u0131 bul: genelde border\/rounded bir kutu\r\n    let box = root.querySelector(\".fac-wiring-empty\");\r\n    if (box) return;\r\n\r\n    \/\/ premium text yoksa ve i\u00e7erik bo\u015fsa, uygun bir hedefe mesaj basal\u0131m:\r\n    \/\/ root i\u00e7inde bo\u015f g\u00f6r\u00fcnen ilk \u201ckutumsu\u201d div\u2019i bulmaya \u00e7al\u0131\u015f\r\n    const candidates = Array.from(root.querySelectorAll(\"div\"))\r\n      .filter(d => {\r\n        const cs = getComputedStyle(d);\r\n        const t = (d.textContent||\"\").replace(\/\\s+\/g,\"\").trim();\r\n        const h = d.getBoundingClientRect().height;\r\n        \/\/ bo\u015f veya \u00e7ok az yaz\u0131 + g\u00f6rece kutu boyu\r\n        return (t.length === 0) && h > 20 && h < 200 && cs.borderRadius !== \"0px\";\r\n      });\r\n\r\n    const target = candidates[0] || root;\r\n    const html = '<div class=\"fac-wiring-empty\" style=\"padding:14px 12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff;\">'\r\n      + EMPTY_WIRING_TEXT +\r\n      '<\/div>';\r\n\r\n    \/\/ hedef root ise i\u00e7ine ekle, de\u011filse de\u011fi\u015ftir\r\n    if (target === root) target.insertAdjacentHTML(\"afterbegin\", html);\r\n    else target.innerHTML = html;\r\n  }\r\n\r\n  function fixWiring(){\r\n    const root = getActiveSectionRoot();\r\n    const p = window.__FAC_LAST_PROJECT;\r\n\r\n    \/\/ Proje datas\u0131 yoksa bile premium text g\u00f6r\u00fcrsek ve kullan\u0131c\u0131 premium ise en az\u0131ndan temizleyelim\r\n    const premium = isPremium();\r\n\r\n    \/\/ 1) premium de\u011fil ve restricted olabilecek durumlar: hi\u00e7bir \u015fey yapma\r\n    \/\/ 2) premium ise ve proje restricted de\u011filse premium mesaj\u0131n\u0131 kald\u0131r\r\n    const canView = premium && (!p || p.restricted === 0);\r\n\r\n    if (canView){\r\n      \/\/ wiring_image bo\u015fsa -> \"\u015fema yok\" mesaj\u0131\r\n      const wiringEmpty = (!p || !p.wiring_image || String(p.wiring_image).trim() === \"\");\r\n      if (wiringEmpty){\r\n        replaceTextEverywhere(\r\n          root,\r\n          PREMIUM_TEXT,\r\n          '<div class=\"fac-wiring-empty\" style=\"padding:14px 12px;border:1px solid #e5e7eb;border-radius:10px;background:#fff;\">'+EMPTY_WIRING_TEXT+'<\/div>'\r\n        );\r\n        ensureEmptyMessageIfNoWiring(root);\r\n      } else {\r\n        \/\/ wiring_image doluysa premium mesaj\u0131n\u0131 g\u00f6r\u00fcn\u00fcr yerde g\u00f6r\u00fcrsek kald\u0131r (render hatas\u0131)\r\n        replaceTextEverywhere(root, PREMIUM_TEXT, \"\");\r\n      }\r\n      return;\r\n    }\r\n\r\n    \/\/ Premium de\u011filse ama yine de bo\u015f wiring i\u00e7in mesaj basmak istersek:\r\n    \/\/ burada dokunmuyoruz; \u00e7\u00fcnk\u00fc ger\u00e7ekten premium olabilir.\r\n  }\r\n\r\n  \/\/ Wiring sekmesine t\u0131klan\u0131nca d\u00fczelt\r\n  document.addEventListener(\"click\", function(e){\r\n    const t = e.target;\r\n    if (!t) return;\r\n    const txt = (t.textContent||\"\").trim().toLowerCase();\r\n    if (txt === \"ba\u011flant\u0131 \u015femas\u0131\"){\r\n      setTimeout(fixWiring, 120);\r\n      setTimeout(fixWiring, 600);\r\n    }\r\n  }, true);\r\n\r\n  \/\/ Sayfa y\u00fcklenince de dinle\r\n  document.addEventListener(\"DOMContentLoaded\", function(){\r\n    setTimeout(fixWiring, 800);\r\n  });\r\n\r\n})();\r\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":"<p>Arduino Proje K\u00fct\u00fcphanesi Gelece\u011fi kodlayan projeler \ud83d\udd13 \u00dccretli \u00fcyelikle 1000+ Arduino projesine an\u0131nda eri\u015fim Bizden e\u011fitim alarak hem kendinizi geli\u015ftirir [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"site-sidebar-layout":"no-sidebar","site-content-layout":"","ast-site-content-layout":"full-width-container","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"disabled","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"default","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"class_list":["post-14","page","type-page","status-publish","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/pages\/14","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/comments?post=14"}],"version-history":[{"count":1464,"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/pages\/14\/revisions"}],"predecessor-version":[{"id":2270,"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/pages\/14\/revisions\/2270"}],"wp:attachment":[{"href":"https:\/\/facadium.com.tr\/arduino\/wp-json\/wp\/v2\/media?parent=14"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}