{"id":35961,"date":"2025-12-06T05:41:01","date_gmt":"2025-12-06T02:41:01","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=35961"},"modified":"2025-12-06T05:41:01","modified_gmt":"2025-12-06T02:41:01","slug":"react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/","title":{"rendered":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p><body><\/p>\n<h2>React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>React uygulamalar\u0131n\u0131zda kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) bile\u015fenleri tasarlarken, \u00e7o\u011fu zaman standart HTML \u00f6\u011felerinin \u00f6tesine ge\u00e7me ihtiyac\u0131 hissedersiniz. \u00d6zellikle etkile\u015fimli ve g\u00f6rsel olarak \u00e7ekici bile\u015fenler s\u00f6z konusu oldu\u011funda, \u00f6zel \u00e7\u00f6z\u00fcmler geli\u015ftirmek hem tasar\u0131m esnekli\u011fi hem de marka kimli\u011fi a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu makalede, React kullanarak s\u0131f\u0131rdan, tamamen \u00f6zelle\u015ftirilebilir, eri\u015filebilir ve yeniden kullan\u0131labilir bir toggle (a\u00e7ma\/kapama) anahtar\u0131 bile\u015feni nas\u0131l olu\u015fturulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<p>Toggle anahtarlar\u0131, bir ayar\u0131n iki durumu aras\u0131nda (\u00f6rne\u011fin, a\u00e7\u0131k\/kapal\u0131, evet\/hay\u0131r) ge\u00e7i\u015f yapmak i\u00e7in kullan\u0131lan temel UI \u00f6\u011feleridir. Taray\u0131c\u0131lar\u0131n varsay\u0131lan <code><input type=\"checkbox\"><\/code> \u00f6\u011fesi bu i\u015flevi yerine getirse de, stil a\u00e7\u0131s\u0131ndan s\u0131n\u0131rl\u0131d\u0131r ve modern UI tasar\u0131mlar\u0131na genellikle uymaz. Bu nedenle, kendi \u00f6zel toggle anahtar\u0131m\u0131z\u0131 olu\u015fturarak hem g\u00f6rsel kontrol\u00fc ele alacak hem de eri\u015filebilirlik standartlar\u0131n\u0131 g\u00f6z ard\u0131 etmeyece\u011fiz. Bu s\u00fcre\u00e7te React&#8217;\u0131n state y\u00f6netimi, prop&#8217;lar, olay dinleyicileri ve modern CSS tekniklerini bir araya getirece\u011fiz.<\/p>\n<h3>Temel Bile\u015fen Yap\u0131s\u0131 ve State Y\u00f6netimi<\/h3>\n<p>\u00d6zel toggle anahtar\u0131m\u0131z\u0131 olu\u015fturmaya, React&#8217;\u0131n temel bile\u015fen yap\u0131s\u0131 ve state y\u00f6netimi ile ba\u015flayaca\u011f\u0131z. Bir toggle anahtar\u0131n\u0131n en temel \u00f6zelli\u011fi, i\u00e7sel bir &#8220;a\u00e7\u0131k&#8221; veya &#8220;kapal\u0131&#8221; durumunu y\u00f6netmesidir. Bu durumu React&#8217;\u0131n <code>useState<\/code> hook&#8217;u ile y\u00f6netece\u011fiz.<\/p>\n<h4>Toggle Bile\u015feni Olu\u015fturma<\/h4>\n<p>\u0130lk ad\u0131m olarak, <code>ToggleSwitch.js<\/code> ad\u0131nda yeni bir dosya olu\u015ftural\u0131m ve temel React functional component yap\u0131s\u0131n\u0131 kural\u0131m.<\/p>\n<pre><code class=\"language-jsx\">\/\/ ToggleSwitch.js\nimport React, { useState } from 'react';\nimport '.\/ToggleSwitch.css'; \/\/ Stil dosyam\u0131z\u0131 import edece\u011fiz\n\nconst ToggleSwitch = ({ initialChecked = false, onChange, label }) => {\n  const [isChecked, setIsChecked] = useState(initialChecked);\n\n  const handleToggle = () => {\n    const newState = !isChecked;\n    setIsChecked(newState);\n    if (onChange) {\n      onChange(newState); \/\/ D\u0131\u015far\u0131ya durumu bildir\n    }\n  };\n\n  return (\n    <div className=\"toggle-switch-container\">\n      {label && <span className=\"toggle-switch-label\">{label}<\/span>}\n      <div\n        className={<code>toggle-switch ${isChecked ? 'is-checked' : ''}<\/code>}\n        onClick={handleToggle}\n        \/\/ Eri\u015filebilirlik i\u00e7in gerekli ARIA ve klavye etkile\u015fimleri burada eklenecek\n      >\n        <div className=\"toggle-switch-thumb\"><\/div>\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default ToggleSwitch;<\/code><\/pre>\n<p>Bu kod par\u00e7as\u0131nda:<br \/>\n*   <code>useState(initialChecked)<\/code>: Bile\u015fenin ba\u015flang\u0131\u00e7 durumunu <code>initialChecked<\/code> prop&#8217;u ile belirler ve <code>isChecked<\/code> ad\u0131nda bir state de\u011fi\u015fkeni ile bu durumu takip ederiz. <code>setIsChecked<\/code> fonksiyonu ile bu durumu g\u00fcncelleriz.<br \/>\n*   <code>handleToggle<\/code>: Anahtara t\u0131kland\u0131\u011f\u0131nda \u00e7al\u0131\u015fan bir fonksiyondur. Mevcut <code>isChecked<\/code> durumunu tersine \u00e7evirir, <code>setIsChecked<\/code> ile bile\u015fenin dahili durumunu g\u00fcnceller ve e\u011fer bir <code>onChange<\/code> prop&#8217;u tan\u0131mlanm\u0131\u015fsa, bu prop&#8217;u yeni durumla birlikte \u00e7a\u011f\u0131rarak d\u0131\u015far\u0131ya bir bildirim g\u00f6nderir. Bu, bile\u015fenin ebeveynlerinin anahtar\u0131n durum de\u011fi\u015fikliklerinden haberdar olmas\u0131n\u0131 sa\u011flar.<br \/>\n*   <code>label<\/code>: Toggle anahtar\u0131na e\u015flik eden bir metin etiketi sa\u011flamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>toggle-switch-container<\/code>: Etiket ve anahtar\u0131n kendisini saran bir kapsay\u0131c\u0131d\u0131r.<br \/>\n*   <code>toggle-switch<\/code>: Anahtar\u0131n genel g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc temsil eden ana <code>div<\/code> \u00f6\u011fesidir. <code>is-checked<\/code> s\u0131n\u0131f\u0131, anahtar\u0131n a\u00e7\u0131k oldu\u011fu durumlarda stil de\u011fi\u015fiklikleri uygulamak i\u00e7in kullan\u0131l\u0131r.<br \/>\n*   <code>toggle-switch-thumb<\/code>: Anahtar\u0131n i\u00e7inde hareket eden &#8220;ba\u015fparmak&#8221; veya &#8220;s\u00fcrg\u00fc&#8221; k\u0131sm\u0131n\u0131 temsil eder.<\/p>\n<p>Bu temel yap\u0131, toggle anahtar\u0131m\u0131z\u0131n davran\u0131\u015fsal mant\u0131\u011f\u0131n\u0131 olu\u015fturur. Ancak hen\u00fcz g\u00f6rsel bir kar\u015f\u0131l\u0131\u011f\u0131 yoktur.<\/p>\n<h4>G\u00f6rsel Temsil ve JSX<\/h4>\n<p>Yukar\u0131daki JSX yap\u0131s\u0131, toggle anahtar\u0131m\u0131z\u0131n g\u00f6rsel iskeletini olu\u015fturur. <code>toggle-switch<\/code> s\u0131n\u0131f\u0131na sahip <code>div<\/code>, anahtar\u0131n &#8220;yolunu&#8221; veya &#8220;izini&#8221; temsil ederken, <code>toggle-switch-thumb<\/code> s\u0131n\u0131f\u0131na sahip i\u00e7 <code>div<\/code> ise bu yol \u00fczerinde hareket eden d\u00fc\u011fmeyi temsil eder. <code>is-checked<\/code> s\u0131n\u0131f\u0131 ise anahtar\u0131n a\u00e7\u0131k durumdayken farkl\u0131 bir g\u00f6r\u00fcn\u00fcme sahip olmas\u0131n\u0131 sa\u011flayacak kilit noktad\u0131r. Bu s\u0131n\u0131fa ba\u011fl\u0131 olarak arka plan rengi ve s\u00fcrg\u00fcn\u00fcn konumu de\u011fi\u015fecektir.<\/p>\n<p>Bu basit JSX yap\u0131s\u0131, CSS ile birle\u015fti\u011finde g\u00f6rsel olarak tatmin edici bir toggle anahtar\u0131 olu\u015fturmam\u0131z\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h3>Stil Olu\u015fturma (CSS\/SCSS)<\/h3>\n<p>\u015eimdi, <code>ToggleSwitch.js<\/code> dosyas\u0131nda referans verdi\u011fimiz <code>ToggleSwitch.css<\/code> dosyas\u0131n\u0131 olu\u015ftural\u0131m ve toggle anahtar\u0131m\u0131za hayat veren stilleri ekleyelim. Bu b\u00f6l\u00fcmde, hem temel CSS kullan\u0131m\u0131 hem de SCSS gibi \u00f6n i\u015flemcilerle daha d\u00fczenli ve s\u00fcrd\u00fcr\u00fclebilir stil yazma yakla\u015f\u0131mlar\u0131na de\u011finece\u011fiz.<\/p>\n<h4>Temel Stil Kurulumu<\/h4>\n<p><code>ToggleSwitch.css<\/code> dosyam\u0131za a\u015fa\u011f\u0131daki temel stilleri ekleyelim:<\/p>\n<pre><code class=\"language-css\">\/<em> ToggleSwitch.css <\/em>\/\n\n.toggle-switch-container {\n  display: flex;\n  align-items: center;\n  gap: 10px; \/<em> Etiket ve anahtar aras\u0131na bo\u015fluk <\/em>\/\n  cursor: pointer; \/<em> Kapsay\u0131c\u0131n\u0131n tamam\u0131n\u0131n t\u0131klanabilir oldu\u011funu belirtir <\/em>\/\n  user-select: none; \/<em> Metin se\u00e7imini engeller <\/em>\/\n}\n\n.toggle-switch-label {\n  font-family: sans-serif;\n  font-size: 1rem;\n  color: #333;\n}\n\n.toggle-switch {\n  position: relative;\n  display: inline-block;\n  width: 50px; \/<em> Anahtar\u0131n geni\u015fli\u011fi <\/em>\/\n  height: 28px; \/<em> Anahtar\u0131n y\u00fcksekli\u011fi <\/em>\/\n  background-color: #ccc; \/<em> Kapal\u0131 durum arka plan rengi <\/em>\/\n  border-radius: 14px; \/<em> Yar\u0131\u00e7ap\u0131n yar\u0131s\u0131 ile tamamen yuvarlak kenarlar <\/em>\/\n  transition: background-color 0.2s ease-in-out; \/<em> Renk ge\u00e7i\u015fi animasyonu <\/em>\/\n  flex-shrink: 0; \/<em> Kapsay\u0131c\u0131 k\u00fc\u00e7\u00fcld\u00fc\u011f\u00fcnde anahtar\u0131n boyutunu koru <\/em>\/\n}\n\n.toggle-switch-thumb {\n  position: absolute;\n  top: 2px; \/<em> Anahtar\u0131n i\u00e7indeki s\u00fcrg\u00fcn\u00fcn dikey konumu <\/em>\/\n  left: 2px; \/<em> Anahtar\u0131n i\u00e7indeki s\u00fcrg\u00fcn\u00fcn yatay konumu <\/em>\/\n  width: 24px; \/<em> S\u00fcrg\u00fcn\u00fcn geni\u015fli\u011fi <\/em>\/\n  height: 24px; \/<em> S\u00fcrg\u00fcn\u00fcn y\u00fcksekli\u011fi <\/em>\/\n  background-color: white; \/<em> S\u00fcrg\u00fcn\u00fcn rengi <\/em>\/\n  border-radius: 50%; \/<em> Tamamen yuvarlak bir s\u00fcrg\u00fc <\/em>\/\n  transition: transform 0.2s ease-in-out; \/<em> S\u00fcrg\u00fc konumu ge\u00e7i\u015fi animasyonu <\/em>\/\n  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); \/<em> Hafif bir g\u00f6lge efekti <\/em>\/\n}<\/code><\/pre>\n<p>Bu temel stiller, toggle anahtar\u0131m\u0131z\u0131n kapal\u0131 durumdaki g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc ve s\u00fcrg\u00fcn\u00fcn ba\u015flang\u0131\u00e7 konumunu belirler. <code>transition<\/code> \u00f6zellikleri, durum de\u011fi\u015fikliklerinde yumu\u015fak animasyonlar sa\u011flamak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>A\u00e7\u0131k\/Kapal\u0131 Durumlar\u0131 \u0130\u00e7in Stil<\/h4>\n<p>\u015eimdi, anahtar <code>is-checked<\/code> durumundayken nas\u0131l g\u00f6r\u00fcnece\u011fini tan\u0131mlayal\u0131m. Bu, React bile\u015fenimizdeki ko\u015fullu s\u0131n\u0131fland\u0131rma ile uyumlu olacakt\u0131r.<\/p>\n<pre><code class=\"language-css\">\/<em> ToggleSwitch.css (devam\u0131) <\/em>\/\n\n.toggle-switch.is-checked {\n  background-color: #4CAF50; \/<em> A\u00e7\u0131k durum arka plan rengi (\u00f6rne\u011fin, ye\u015fil) <\/em>\/\n}\n\n.toggle-switch.is-checked .toggle-switch-thumb {\n  transform: translateX(22px); \/<em> S\u00fcrg\u00fcy\u00fc sa\u011fa kayd\u0131r (geni\u015flik - s\u00fcrg\u00fc geni\u015fli\u011fi - 2<\/em>padding) *\/\n}<\/code><\/pre>\n<p>Burada, <code>.toggle-switch.is-checked<\/code> s\u0131n\u0131f\u0131, anahtar a\u00e7\u0131k oldu\u011funda arka plan rengini ye\u015file \u00e7evirir. <code>.toggle-switch.is-checked .toggle-switch-thumb<\/code> ise s\u00fcrg\u00fcy\u00fc sa\u011fa do\u011fru 22 piksel kayd\u0131r\u0131r. Bu de\u011fer, anahtar\u0131n toplam geni\u015fli\u011fi (50px) eksi s\u00fcrg\u00fcn\u00fcn geni\u015fli\u011fi (24px) eksi her iki taraftan 2&#8217;\u015fer piksel bo\u015fluk (toplam 4px) g\u00f6z \u00f6n\u00fcnde bulundurularak hesaplanm\u0131\u015ft\u0131r: <code>50 - 24 - (2*2) = 22px<\/code>. Bu, s\u00fcrg\u00fcn\u00fcn anahtar\u0131n i\u00e7inde d\u00fczg\u00fcn bir \u015fekilde hareket etmesini sa\u011flar.<\/p>\n<h4>SCSS Kullan\u0131m\u0131 (Opsiyonel ama iyi bir pratik)<\/h4>\n<p>E\u011fer projenizde SCSS (Sass) kullan\u0131yorsan\u0131z, stillerinizi daha mod\u00fcler ve okunabilir hale getirebilirsiniz. SCSS, i\u00e7 i\u00e7e yaz\u0131m (nesting), de\u011fi\u015fkenler, mixin&#8217;ler ve fonksiyonlar gibi g\u00fc\u00e7l\u00fc \u00f6zellikler sunar.<\/p>\n<p>\u00d6ncelikle, projenize Sass&#8217;\u0131 kurman\u0131z gerekebilir (<code>npm install sass<\/code> veya <code>yarn add sass<\/code>). Ard\u0131ndan, <code>ToggleSwitch.css<\/code> dosyas\u0131n\u0131 <code>ToggleSwitch.module.scss<\/code> olarak yeniden adland\u0131rabiliriz (CSS Modules ile birlikte kullanmak yayg\u0131n bir pratiktir).<\/p>\n<pre><code class=\"language-scss\">\/<em> ToggleSwitch.module.scss <\/em>\/\n\n$toggle-width: 50px;\n$toggle-height: 28px;\n$thumb-size: 24px;\n$thumb-offset: 2px; \/\/ \u0130\u00e7 bo\u015fluk\n$border-radius: $toggle-height \/ 2;\n\n$color-off: #ccc;\n$color-on: #4CAF50;\n$color-thumb: white;\n$color-label: #333;\n\n.toggle-switch-container {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  cursor: pointer;\n  user-select: none;\n}\n\n.toggle-switch-label {\n  font-family: sans-serif;\n  font-size: 1rem;\n  color: $color-label;\n}\n\n.toggle-switch {\n  position: relative;\n  display: inline-block;\n  width: $toggle-width;\n  height: $toggle-height;\n  background-color: $color-off;\n  border-radius: $border-radius;\n  transition: background-color 0.2s ease-in-out;\n  flex-shrink: 0;\n\n  .toggle-switch-thumb {\n    position: absolute;\n    top: $thumb-offset;\n    left: $thumb-offset;\n    width: $thumb-size;\n    height: $thumb-size;\n    background-color: $color-thumb;\n    border-radius: 50%;\n    transition: transform 0.2s ease-in-out;\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n  }\n\n  &.is-checked {\n    background-color: $color-on;\n\n    .toggle-switch-thumb {\n      transform: translateX($toggle-width - $thumb-size - (2 * $thumb-offset));\n    }\n  }\n}<\/code><\/pre>\n<p>Ve <code>ToggleSwitch.js<\/code> dosyas\u0131nda stil importunu g\u00fcncelleyin:<\/p>\n<pre><code class=\"language-jsx\">\/\/ ToggleSwitch.js\nimport React, { useState } from 'react';\nimport styles from '.\/ToggleSwitch.module.scss'; \/\/ SCSS Modules importu\n\nconst ToggleSwitch = ({ initialChecked = false, onChange, label }) => {\n  const [isChecked, setIsChecked] = useState(initialChecked);\n\n  const handleToggle = () => {\n    const newState = !isChecked;\n    setIsChecked(newState);\n    if (onChange) {\n      onChange(newState);\n    }\n  };\n\n  return (\n    <div className={styles['toggle-switch-container']}>\n      {label && <span className={styles['toggle-switch-label']}>{label}<\/span>}\n      <div\n        className={<code>${styles['toggle-switch']} ${isChecked ? styles['is-checked'] : ''}<\/code>}\n        onClick={handleToggle}\n      >\n        <div className={styles['toggle-switch-thumb']}><\/div>\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default ToggleSwitch;<\/code><\/pre>\n<p>SCSS ile de\u011fi\u015fkenler kullanarak de\u011ferleri kolayca y\u00f6netebilir ve i\u00e7 i\u00e7e yaz\u0131m ile daha okunabilir bir yap\u0131 elde edebilirsiniz. Ayr\u0131ca, CSS Modules kullanmak, stil \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nleyerek bile\u015fen tabanl\u0131 geli\u015ftirme i\u00e7in ideal bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h3>Eri\u015filebilirlik (Accessibility &#8211; A11y)<\/h3>\n<p>Bir UI bile\u015feni tasarlarken eri\u015filebilirlik, yaln\u0131zca belirli kullan\u0131c\u0131 gruplar\u0131 i\u00e7in de\u011fil, herkes i\u00e7in daha iyi bir kullan\u0131c\u0131 deneyimi sa\u011flaman\u0131n temelidir. G\u00f6rme engelliler i\u00e7in ekran okuyucular, motor engelliler i\u00e7in klavye navigasyonu gibi konular\u0131 ele alarak toggle anahtar\u0131m\u0131z\u0131 eri\u015filebilir hale getirmeliyiz.<\/p>\n<h4>Neden Eri\u015filebilirlik \u00d6nemli?<\/h4>\n<p>Web \u0130\u00e7eri\u011fi Eri\u015filebilirlik Y\u00f6nergeleri (WCAG), web i\u00e7eri\u011fini daha eri\u015filebilir hale getirmek i\u00e7in uluslararas\u0131 bir standartt\u0131r. Bu standartlara uymak, yasal y\u00fck\u00fcml\u00fcl\u00fcklerin yan\u0131 s\u0131ra, \u00fcr\u00fcn\u00fcn\u00fcz\u00fcn daha geni\u015f bir kitleye ula\u015fmas\u0131n\u0131 ve herkes i\u00e7in kullan\u0131labilir olmas\u0131n\u0131 sa\u011flar. \u00d6zel bir toggle anahtar\u0131 olu\u015ftururken, varsay\u0131lan HTML <code><input type=\"checkbox\"><\/code> \u00f6\u011fesinin sa\u011flad\u0131\u011f\u0131 yerle\u015fik eri\u015filebilirlik \u00f6zelliklerini kaybederiz. Bu nedenle, bu \u00f6zellikleri manuel olarak eklememiz gerekir.<\/p>\n<h4>ARIA \u00d6zellikleri<\/h4>\n<p>WAI-ARIA (Web Accessibility Initiative \u2013 Accessible Rich Internet Applications) \u00f6zellikleri, HTML&#8217;in anlamsal yeteneklerini geni\u015fleterek, dinamik i\u00e7erik ve \u00f6zel UI bile\u015fenlerinin eri\u015filebilirli\u011fini art\u0131r\u0131r. Toggle anahtar\u0131m\u0131z i\u00e7in a\u015fa\u011f\u0131daki ARIA \u00f6zelliklerini kullanaca\u011f\u0131z:<\/p>\n<p>*   <code>role=\"switch\"<\/code>: Bu, \u00f6\u011fenin bir anahtar oldu\u011funu ekran okuyuculara bildirir.<br \/>\n*   <code>aria-checked<\/code>: Anahtar\u0131n mevcut durumunu (true\/false) belirtir. Bu de\u011fer dinamik olarak <code>isChecked<\/code> state&#8217;imize ba\u011fl\u0131 olacakt\u0131r.<br \/>\n*   <code>aria-labelledby<\/code> veya <code>aria-label<\/code>: Anahtar\u0131n amac\u0131n\u0131 a\u00e7\u0131klayan bir etiket sa\u011flar. E\u011fer g\u00f6rsel bir <code>label<\/code> prop&#8217;u kullan\u0131yorsak, <code>aria-labelledby<\/code> ile bu etikete referans verebiliriz. Aksi takdirde, do\u011frudan <code>aria-label<\/code> kullanabiliriz.<\/p>\n<p>Eri\u015filebilirlik i\u00e7in en sa\u011flam yakla\u015f\u0131mlardan biri, g\u00f6rsel olarak gizlenmi\u015f ancak eri\u015filebilirlik a\u011fac\u0131nda var olan bir <code><input type=\"checkbox\"><\/code> \u00f6\u011fesi kullanmakt\u0131r. Bu, taray\u0131c\u0131n\u0131n yerle\u015fik eri\u015filebilirlik \u00f6zelliklerinden (klavye navigasyonu, ARIA rolleri) faydalanmam\u0131z\u0131 sa\u011flar ve manuel olarak bir\u00e7ok \u015feyi y\u00f6netme y\u00fck\u00fcn\u00fc azalt\u0131r.<\/p>\n<p><code>ToggleSwitch.js<\/code> dosyam\u0131z\u0131 g\u00fcncelleyelim:<\/p>\n<pre><code class=\"language-jsx\">\/\/ ToggleSwitch.js (Eri\u015filebilirlik g\u00fcncellemeleri)\nimport React, { useState, useRef, useId } from 'react'; \/\/ useId hook'unu ekledik\nimport styles from '.\/ToggleSwitch.module.scss';\n\nconst ToggleSwitch = ({ initialChecked = false, onChange, label, disabled = false }) => {\n  const [isChecked, setIsChecked] = useState(initialChecked);\n  const inputRef = useRef(null);\n  const uniqueId = useId(); \/\/ Benzersiz ID olu\u015fturmak i\u00e7in useId kullan\u0131yoruz\n\n  const handleToggle = () => {\n    if (disabled) return; \/\/ Devre d\u0131\u015f\u0131 ise i\u015flem yapma\n\n    const newState = !isChecked;\n    setIsChecked(newState);\n    if (onChange) {\n      onChange(newState);\n    }\n    \/\/ Gizli input'un durumunu manuel olarak g\u00fcncelle\n    if (inputRef.current) {\n      inputRef.current.checked = newState;\n    }\n  };\n\n  const handleKeyDown = (event) => {\n    if (event.key === ' ' || event.key === 'Enter') {\n      event.preventDefault(); \/\/ Varsay\u0131lan kayd\u0131rma\/g\u00f6nderme davran\u0131\u015f\u0131n\u0131 engelle\n      handleToggle();\n    }\n  };\n\n  return (\n    <div className={styles['toggle-switch-container']} onClick={handleToggle}>\n      {label && (\n        <label htmlFor={uniqueId} className={styles['toggle-switch-label']}>\n          {label}\n        <\/label>\n      )}\n      <input\n        type=\"checkbox\"\n        id={uniqueId} \/\/ Etiket ile ili\u015fkilendirmek i\u00e7in benzersiz ID\n        ref={inputRef}\n        checked={isChecked}\n        onChange={() => {}} \/\/ React'\u0131n uyar\u0131 vermemesi i\u00e7in bo\u015f bir onChange\n        className={styles['visually-hidden']} \/\/ G\u00f6rsel olarak gizle\n        disabled={disabled}\n        role=\"switch\" \/\/ ARIA rol\u00fcn\u00fc belirt\n        aria-checked={isChecked} \/\/ ARIA durumunu belirt\n      \/>\n      <div\n        className={<code>${styles['toggle-switch']} ${isChecked ? styles['is-checked'] : ''} ${disabled ? styles['is-disabled'] : ''}<\/code>}\n        \/\/ G\u00f6rsel div'e focus y\u00f6netimi ve klavye etkile\u015fimi atam\u0131yoruz,\n        \/\/ \u00e7\u00fcnk\u00fc gizli input bunlar\u0131 zaten hallediyor.\n        \/\/ Ancak, e\u011fer gizli input kullanmasayd\u0131k, buraya tabIndex ve onKeyDown eklememiz gerekirdi.\n      >\n        <div className={styles['toggle-switch-thumb']}><\/div>\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default ToggleSwitch;<\/code><\/pre>\n<p>Ve <code>ToggleSwitch.module.scss<\/code>&#8216;ye <code>visually-hidden<\/code> s\u0131n\u0131f\u0131n\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-scss\">\/<em> ToggleSwitch.module.scss (devam\u0131) <\/em>\/\n\n.visually-hidden {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border-width: 0;\n}\n\n.toggle-switch.is-disabled {\n  opacity: 0.6;\n  cursor: not-allowed;\n}\n\n.toggle-switch-container {\n  \/\/ ... mevcut stiller\n  &:has(input[disabled]) { \/\/ CSS :has() selector for disabled container\n    cursor: not-allowed;\n  }\n}<\/code><\/pre>\n<p>Burada yap\u0131lan \u00f6nemli de\u011fi\u015fiklikler:<br \/>\n*   <strong>Gizli <code><input type=\"checkbox\"><\/code><\/strong>: G\u00f6rsel olarak gizlenmi\u015f bir checkbox ekledik. Bu, klavye navigasyonu (tab tu\u015fu ile odaklanma) ve ekran okuyucu deste\u011fi gibi temel eri\u015filebilirlik \u00f6zelliklerini otomatik olarak sa\u011flar.<br \/>\n*   <strong><code>useId<\/code> Hook&#8217;u<\/strong>: <code>label<\/code> \u00f6\u011fesini gizli <code>input<\/code> ile ili\u015fkilendirmek i\u00e7in benzersiz bir <code>id<\/code> sa\u011flamak amac\u0131yla React 18 ile gelen <code>useId<\/code> hook&#8217;unu kulland\u0131k. Bu, ayn\u0131 bile\u015fenin birden fazla \u00f6rne\u011fi oldu\u011funda ID \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nler.<br \/>\n*   <strong><code>htmlFor<\/code> ve <code>id<\/code><\/strong>: <code>label<\/code> \u00f6\u011fesindeki <code>htmlFor<\/code> niteli\u011fi ile <code>input<\/code> \u00f6\u011fesinin <code>id<\/code>&#8216;sini e\u015fle\u015ftirerek, etikete t\u0131kland\u0131\u011f\u0131nda input&#8217;un tetiklenmesini sa\u011fl\u0131yoruz.<br \/>\n*   <strong><code>role=\"switch\"<\/code> ve <code>aria-checked<\/code><\/strong>: Gizli input \u00fczerinde ARIA \u00f6zelliklerini tan\u0131mlayarak, ekran okuyuculara daha zengin anlamsal bilgi sa\u011fl\u0131yoruz.<br \/>\n*   <strong><code>disabled<\/code> Prop&#8217;u<\/strong>: Bile\u015fenin devre d\u0131\u015f\u0131 b\u0131rak\u0131labilmesi i\u00e7in bir <code>disabled<\/code> prop&#8217;u ekledik. Bu durumda, anahtar t\u0131klamalara yan\u0131t vermez ve g\u00f6rsel olarak grile\u015fir. Gizli input&#8217;a da <code>disabled<\/code> niteli\u011fi ekleyerek eri\u015filebilirlik ve davran\u0131\u015fsal tutarl\u0131l\u0131\u011f\u0131 sa\u011fl\u0131yoruz.<br \/>\n*   <strong><code>handleToggle<\/code> G\u00fcncellemesi<\/strong>: <code>handleToggle<\/code> fonksiyonu art\u0131k <code>disabled<\/code> durumunu kontrol ediyor ve gizli input&#8217;un <code>checked<\/code> \u00f6zelli\u011fini manuel olarak g\u00fcncelliyor.<\/p>\n<p>Bu yakla\u015f\u0131m, \u00f6zel bir UI bile\u015feni olu\u015ftururken en iyi eri\u015filebilirlik uygulamalar\u0131ndan biridir, \u00e7\u00fcnk\u00fc taray\u0131c\u0131n\u0131n yerle\u015fik eri\u015filebilirlik motorundan en \u00fcst d\u00fczeyde faydalan\u0131r\u0131z.<\/p>\n<h3>Geli\u015fmi\u015f \u00d6zellikler ve Yeniden Kullan\u0131labilirlik<\/h3>\n<p>Bile\u015fenimizi daha esnek ve farkl\u0131 senaryolarda yeniden kullan\u0131labilir hale getirmek i\u00e7in baz\u0131 geli\u015fmi\u015f \u00f6zellikler ekleyebiliriz.<\/p>\n<h4>Prop&#8217;lar ile \u00d6zelle\u015ftirme<\/h4>\n<p>\u015eimdiye kadar <code>initialChecked<\/code>, <code>onChange<\/code>, <code>label<\/code> ve <code>disabled<\/code> prop&#8217;lar\u0131n\u0131 g\u00f6rd\u00fck. Bunlara ek olarak, bile\u015fenimizin daha da \u00f6zelle\u015ftirilebilir olmas\u0131n\u0131 sa\u011flayacak ba\u015fka prop&#8217;lar da d\u00fc\u015f\u00fcnebiliriz:<\/p>\n<p>*   <strong><code>size<\/code><\/strong>: Anahtar\u0131n boyutunu kontrol etmek i\u00e7in (<code>small<\/code>, <code>medium<\/code>, <code>large<\/code>). Bu, CSS s\u0131n\u0131flar\u0131 veya CSS de\u011fi\u015fkenleri ile y\u00f6netilebilir.<br \/>\n*   <strong><code>color<\/code><\/strong>: Anahtar\u0131n a\u00e7\u0131k durumdaki rengini de\u011fi\u015ftirmek i\u00e7in. Bu da CSS de\u011fi\u015fkenleri veya inline stillerle yap\u0131labilir.<\/p>\n<p>\u00d6rnek olarak <code>size<\/code> prop&#8217;unu ekleyelim:<\/p>\n<pre><code class=\"language-jsx\">\/\/ ToggleSwitch.js (size prop'u eklendi)\nimport React, { useState, useRef, useId } from 'react';\nimport styles from '.\/ToggleSwitch.module.scss';\n\nconst ToggleSwitch = ({ \n  initialChecked = false, \n  onChange, \n  label, \n  disabled = false, \n  size = 'medium' \/\/ Yeni prop: 'small', 'medium', 'large'\n}) => {\n  const [isChecked, setIsChecked] = useState(initialChecked);\n  const inputRef = useRef(null);\n  const uniqueId = useId();\n\n  const handleToggle = () => {\n    if (disabled) return;\n\n    const newState = !isChecked;\n    setIsChecked(newState);\n    if (onChange) {\n      onChange(newState);\n    }\n    if (inputRef.current) {\n      inputRef.current.checked = newState;\n    }\n  };\n\n  return (\n    <div className={<code>${styles['toggle-switch-container']} ${styles[<\/code>size-${size}<code>]}<\/code>} onClick={handleToggle}>\n      {label && (\n        <label htmlFor={uniqueId} className={styles['toggle-switch-label']}>\n          {label}\n        <\/label>\n      )}\n      <input\n        type=\"checkbox\"\n        id={uniqueId}\n        ref={inputRef}\n        checked={isChecked}\n        onChange={() => {}}\n        className={styles['visually-hidden']}\n        disabled={disabled}\n        role=\"switch\"\n        aria-checked={isChecked}\n      \/>\n      <div\n        className={<code>${styles['toggle-switch']} ${isChecked ? styles['is-checked'] : ''} ${disabled ? styles['is-disabled'] : ''}<\/code>}\n      >\n        <div className={styles['toggle-switch-thumb']}><\/div>\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default ToggleSwitch;<\/code><\/pre>\n<p>Ve <code>ToggleSwitch.module.scss<\/code>&#8216;ye boyut s\u0131n\u0131flar\u0131n\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-scss\">\/<em> ToggleSwitch.module.scss (devam\u0131) <\/em>\/\n\n\/\/ Boyut de\u011fi\u015fkenleri\n$sizes: (\n  small: (width: 40px, height: 22px, thumb: 18px),\n  medium: (width: 50px, height: 28px, thumb: 24px),\n  large: (width: 60px, height: 34px, thumb: 30px)\n);\n\n@each $name, $values in $sizes {\n  .size-#{$name} {\n    .toggle-switch {\n      width: map-get($values, width);\n      height: map-get($values, height);\n      border-radius: map-get($values, height) \/ 2;\n\n      .toggle-switch-thumb {\n        width: map-get($values, thumb);\n        height: map-get($values, thumb);\n        top: (map-get($values, height) - map-get($values, thumb)) \/ 2;\n        left: (map-get($values, height) - map-get($values, thumb)) \/ 2;\n      }\n\n      &.is-checked .toggle-switch-thumb {\n        transform: translateX(map-get($values, width) - map-get($values, thumb) - (map-get($values, height) - map-get($values, thumb)));\n      }\n    }\n  }\n}<\/code><\/pre>\n<p>Bu SCSS yap\u0131s\u0131, <code>@each<\/code> d\u00f6ng\u00fcs\u00fc kullanarak farkl\u0131 boyutlar i\u00e7in stilleri otomatik olarak olu\u015fturur. Bu, tekrar eden CSS yazmaktan ka\u00e7\u0131narak daha s\u00fcrd\u00fcr\u00fclebilir bir stil y\u00f6netimi sa\u011flar.<\/p>\n<h4>Controlled vs. Uncontrolled Components<\/h4>\n<p>React&#8217;ta form elemanlar\u0131 genellikle iki kategoriye ayr\u0131l\u0131r:<br \/>\n*   <strong>Uncontrolled Components (Kontrols\u00fcz Bile\u015fenler)<\/strong>: Kendi i\u00e7 state&#8217;lerini y\u00f6netirler. Bizim <code>ToggleSwitch<\/code> bile\u015fenimiz, <code>initialChecked<\/code> prop&#8217;u ile ba\u015flang\u0131\u00e7 durumunu al\u0131p kendi <code>isChecked<\/code> state&#8217;ini y\u00f6netti\u011fi i\u00e7in varsay\u0131lan olarak kontrols\u00fcz bir bile\u015fendir. D\u0131\u015far\u0131dan sadece <code>onChange<\/code> ile durum de\u011fi\u015fiklikleri hakk\u0131nda bilgi verir.<br \/>\n*   <strong>Controlled Components (Kontroll\u00fc Bile\u015fenler)<\/strong>: State y\u00f6netimi tamamen ebeveyn bile\u015fen taraf\u0131ndan yap\u0131l\u0131r. <code>checked<\/code> gibi bir prop al\u0131rlar ve bu prop&#8217;un de\u011feri, bile\u015fenin mevcut durumunu belirler. Bile\u015fen sadece <code>onChange<\/code> olay\u0131n\u0131 tetikler, ancak kendi state&#8217;ini g\u00fcncellemez; bu i\u015fi ebeveyn yapar.<\/p>\n<p>Toggle anahtar\u0131m\u0131z\u0131 hem kontroll\u00fc hem de kontrols\u00fcz olarak \u00e7al\u0131\u015fabilecek \u015fekilde tasarlamak, esnekli\u011fini art\u0131r\u0131r. Bunu, <code>checked<\/code> prop&#8217;unun varl\u0131\u011f\u0131na ba\u011fl\u0131 olarak i\u00e7 state y\u00f6netimini de\u011fi\u015ftiren bir yakla\u015f\u0131mla yapabiliriz.<\/p>\n<pre><code class=\"language-jsx\">\/\/ ToggleSwitch.js (Controlled\/Uncontrolled deste\u011fi)\nimport React, { useState, useRef, useId, useEffect } from 'react';\nimport styles from '.\/ToggleSwitch.module.scss';\n\nconst ToggleSwitch = ({ \n  checked, \/\/ Yeni prop: Kontroll\u00fc bile\u015fen i\u00e7in\n  initialChecked = false, \n  onChange, \n  label, \n  disabled = false, \n  size = 'medium' \n}) => {\n  \/\/ checked prop'u tan\u0131ml\u0131ysa kontroll\u00fc, de\u011filse kontrols\u00fcz\n  const isControlled = typeof checked === 'boolean';\n  const [internalChecked, setInternalChecked] = useState(isControlled ? checked : initialChecked);\n\n  const currentChecked = isControlled ? checked : internalChecked;\n\n  const inputRef = useRef(null);\n  const uniqueId = useId();\n\n  \/\/ checked prop'u de\u011fi\u015fti\u011finde internalChecked'\u0131 g\u00fcncelle (sadece kontroll\u00fc bile\u015fenlerde)\n  useEffect(() => {\n    if (isControlled) {\n      setInternalChecked(checked);\n    }\n  }, [checked, isControlled]);\n\n  const handleToggle = () => {\n    if (disabled) return;\n\n    const newState = !currentChecked;\n    \n    if (!isControlled) {\n      setInternalChecked(newState); \/\/ Kontrols\u00fcz ise kendi state'ini g\u00fcncelle\n    }\n    \n    if (onChange) {\n      onChange(newState); \/\/ D\u0131\u015far\u0131ya durumu bildir (her zaman)\n    }\n    \n    \/\/ Gizli input'un durumunu manuel olarak g\u00fcncelle\n    if (inputRef.current) {\n      inputRef.current.checked = newState;\n    }\n  };\n\n  return (\n    <div className={<code>${styles['toggle-switch-container']} ${styles[<\/code>size-${size}<code>]}<\/code>} onClick={handleToggle}>\n      {label && (\n        <label htmlFor={uniqueId} className={styles['toggle-switch-label']}>\n          {label}\n        <\/label>\n      )}\n      <input\n        type=\"checkbox\"\n        id={uniqueId}\n        ref={inputRef}\n        checked={currentChecked} \/\/ Her zaman currentChecked'\u0131 kullan\n        onChange={() => {}} \/\/ React'\u0131n uyar\u0131 vermemesi i\u00e7in bo\u015f bir onChange\n        className={styles['visually-hidden']}\n        disabled={disabled}\n        role=\"switch\"\n        aria-checked={currentChecked}\n      \/>\n      <div\n        className={<code>${styles['toggle-switch']} ${currentChecked ? styles['is-checked'] : ''} ${disabled ? styles['is-disabled'] : ''}<\/code>}\n      >\n        <div className={styles['toggle-switch-thumb']}><\/div>\n      <\/div>\n    <\/div>\n  );\n};\n\nexport default ToggleSwitch;<\/code><\/pre>\n<p>Bu g\u00fcncelleme ile:<br \/>\n*   <code>isControlled<\/code> de\u011fi\u015fkeni, <code>checked<\/code> prop&#8217;unun varl\u0131\u011f\u0131n\u0131 kontrol eder.<br \/>\n*   <code>internalChecked<\/code> state&#8217;i, bile\u015fenin kontrols\u00fcz moddayken kendi durumunu y\u00f6netmesini sa\u011flar.<br \/>\n*   <code>currentChecked<\/code> de\u011fi\u015fkeni, bile\u015fenin mevcut durumunu her zaman do\u011fru bir \u015fekilde yans\u0131t\u0131r (kontroll\u00fc ise <code>checked<\/code> prop&#8217;undan, kontrols\u00fcz ise <code>internalChecked<\/code> state&#8217;inden).<br \/>\n*   <code>useEffect<\/code> hook&#8217;u, <code>checked<\/code> prop&#8217;u de\u011fi\u015fti\u011finde (yani bile\u015fen kontroll\u00fc oldu\u011funda) <code>internalChecked<\/code> state&#8217;ini g\u00fcnceller.<br \/>\n*   <code>handleToggle<\/code> fonksiyonu, <code>isControlled<\/code> durumuna g\u00f6re <code>internalChecked<\/code>&#8216;\u0131 g\u00fcncelleyip g\u00fcncellememe karar\u0131 verir.<\/p>\n<p>Bu sayede, <code>ToggleSwitch<\/code> bile\u015fenini a\u015fa\u011f\u0131daki gibi kullanabilirsiniz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.js (Kontrols\u00fcz kullan\u0131m)\nimport React, { useState } from 'react';\nimport ToggleSwitch from '.\/ToggleSwitch';\n\nfunction App() {\n  const handleToggleChange = (newState) => {\n    console.log('Toggle durumu de\u011fi\u015fti (kontrols\u00fcz):', newState);\n  };\n\n  return (\n    <div>\n      <ToggleSwitch label=\"E-posta Bildirimleri\" initialChecked={true} onChange={handleToggleChange} \/>\n      <ToggleSwitch label=\"Karanl\u0131k Mod\" size=\"small\" \/>\n    <\/div>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<pre><code class=\"language-jsx\">\/\/ App.js (Kontroll\u00fc kullan\u0131m)\nimport React, { useState } from 'react';\nimport ToggleSwitch from '.\/ToggleSwitch';\n\nfunction App() {\n  const [isDarkMode, setIsDarkMode] = useState(false);\n\n  const handleDarkModeToggle = (newState) => {\n    setIsDarkMode(newState);\n    console.log('Karanl\u0131k Mod durumu:', newState);\n  };\n\n  return (\n    <div style={{ background: isDarkMode ? '#333' : '#fff', color: isDarkMode ? '#fff' : '#333', minHeight: '100vh', padding: '20px' }}>\n      \n      <ToggleSwitch \n        label=\"Karanl\u0131k Modu Etkinle\u015ftir\" \n        checked={isDarkMode} \n        onChange={handleDarkModeToggle} \n        size=\"large\"\n      \/>\n      <p>Karanl\u0131k mod \u015fu anda: {isDarkMode ? 'A\u00c7IK' : 'KAPALI'}<\/p>\n    <\/div>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<h4>Forwarding Ref&#8217;ler (Opsiyonel)<\/h4>\n<p>Nadiren de olsa, ebeveyn bir bile\u015fenin custom toggle anahtar\u0131m\u0131z\u0131n alt\u0131ndaki gizli <code>input<\/code> \u00f6\u011fesine do\u011frudan referans eri\u015fimi (ref) sa\u011flamas\u0131 gerekebilir (\u00f6rne\u011fin, bir form g\u00f6nderimi \u00f6ncesi odaklanma veya do\u011frulama i\u00e7in). Bu senaryoda <code>React.forwardRef<\/code> kullanabiliriz.<\/p>\n<pre><code class=\"language-jsx\">\/\/ ToggleSwitch.js (forwardRef eklendi)\nimport React, { useState, useRef, useId, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport styles from '.\/ToggleSwitch.module.scss';\n\nconst ToggleSwitch = forwardRef(({ \n  checked, \n  initialChecked = false, \n  onChange, \n  label, \n  disabled = false, \n  size = 'medium' \n}, ref) => { \/\/ ref prop'u buraya gelir\n  const isControlled = typeof checked === 'boolean';\n  const [internalChecked, setInternalChecked] = useState(isControlled ? checked : initialChecked);\n\n  const currentChecked = isControlled ? checked : internalChecked;\n\n  const inputRef = useRef(null);\n  const uniqueId = useId();\n\n  useEffect(() => {\n    if (isControlled) {\n      setInternalChecked(checked);\n    }\n  }, [checked, isControlled]);\n\n  const handleToggle = () => {\n    if (disabled) return;\n\n    const newState = !currentChecked;\n    \n    if (!isControlled) {\n      setInternalChecked(newState);\n    }\n    \n    if (onChange) {\n      onChange(newState);\n    }\n    \n    if (inputRef.current) {\n      inputRef.current.checked = newState;\n    }\n  };\n\n  \/\/ Ebeveyn bile\u015fenin bu referans \u00fczerinden eri\u015febilece\u011fi y\u00f6ntemleri tan\u0131mla\n  useImperativeHandle(ref, () => ({\n    focus: () => {\n      inputRef.current?.focus();\n    },\n    \/\/ \u0130sterseniz ba\u015fka y\u00f6ntemler de ekleyebilirsiniz, \u00f6rne\u011fin toggle()\n    toggle: handleToggle\n  }));\n\n  return (\n    <div className={<code>${styles['toggle-switch-container']} ${styles[<\/code>size-${size}<code>]}<\/code>} onClick={handleToggle}>\n      {label && (\n        <label htmlFor={uniqueId} className={styles['toggle-switch-label']}>\n          {label}\n        <\/label>\n      )}\n      <input\n        type=\"checkbox\"\n        id={uniqueId}\n        ref={inputRef} \/\/ Dahili input'a referans\u0131 at\u0131yoruz\n        checked={currentChecked}\n        onChange={() => {}}\n        className={styles['visually-hidden']}\n        disabled={disabled}\n        role=\"switch\"\n        aria-checked={currentChecked}\n      \/>\n      <div\n        className={<code>${styles['toggle-switch']} ${currentChecked ? styles['is-checked'] : ''} ${disabled ? styles['is-disabled'] : ''}<\/code>}\n      >\n        <div className={styles['toggle-switch-thumb']}><\/div>\n      <\/div>\n    <\/div>\n  );\n});\n\nexport default ToggleSwitch;<\/code><\/pre>\n<p>Ve <code>App.js<\/code>&#8216;de kullan\u0131m\u0131:<\/p>\n<pre><code class=\"language-jsx\">\/\/ App.js (forwardRef kullan\u0131m\u0131)\nimport React, { useRef } from 'react';\nimport ToggleSwitch from '.\/ToggleSwitch';\n\nfunction App() {\n  const toggleRef = useRef(null);\n\n  const handleFocusToggle = () => {\n    toggleRef.current?.focus(); \/\/ ToggleSwitch'in i\u00e7indeki input'a odaklan\n  };\n\n  return (\n    <div>\n      <ToggleSwitch label=\"Ayar\u0131 Odakla\" ref={toggleRef} \/>\n      <button onClick={handleFocusToggle}>Toggle'a Odaklan<\/button>\n    <\/div>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<p><code>useImperativeHandle<\/code> hook&#8217;u ile, ebeveyn bile\u015fenlerin <code>ref<\/code> \u00fczerinden eri\u015febilece\u011fi belirli fonksiyonlar\u0131 (\u00f6rne\u011fin <code>focus()<\/code>) tan\u0131mlayabiliriz. Bu, bile\u015fenin i\u00e7 detaylar\u0131n\u0131 if\u015fa etmeden kontroll\u00fc bir aray\u00fcz sa\u011flar.<\/p>\n<h3>Tam Kod \u00d6rne\u011fi<\/h3>\n<p>Yukar\u0131daki t\u00fcm b\u00f6l\u00fcmleri bir araya getiren nihai kod \u00f6rnekleri:<\/p>\n<pre><code class=\"language-jsx\">\/\/ ToggleSwitch.js\nimport React, { useState, useRef, useId, useEffect, forwardRef, useImperativeHandle } from 'react';\nimport styles from '.\/ToggleSwitch.module.scss';\n\nconst ToggleSwitch = forwardRef(({ \n  checked, \n  initialChecked = false, \n  onChange, \n  label, \n  disabled = false, \n  size = 'medium' \n}, ref) => {\n  const isControlled = typeof checked === 'boolean';\n  const [internalChecked, setInternalChecked] = useState(isControlled ? checked : initialChecked);\n\n  const currentChecked = isControlled ? checked : internalChecked;\n\n  const inputRef = useRef(null);\n  const uniqueId = useId();\n\n  useEffect(() => {\n    if (isControlled) {\n      setInternalChecked(checked);\n    }\n  }, [checked, isControlled]);\n\n  const handleToggle = () => {\n    if (disabled) return;\n\n    const newState = !currentChecked;\n    \n    if (!isControlled) {\n      setInternalChecked(newState);\n    }\n    \n    if (onChange) {\n      onChange(newState);\n    }\n    \n    if (inputRef.current) {\n      inputRef.current.checked = newState;\n    }\n  };\n\n  useImperativeHandle(ref, () => ({\n    focus: () => {\n      inputRef.current?.focus();\n    },\n    toggle: handleToggle\n  }));\n\n  return (\n    <div className={<code>${styles['toggle-switch-container']} ${styles[<\/code>size-${size}<code>]}<\/code>} onClick={handleToggle}>\n      {label && (\n        <label htmlFor={uniqueId} className={styles['toggle-switch-label']}>\n          {label}\n        <\/label>\n      )}\n      <input\n        type=\"checkbox\"\n        id={uniqueId}\n        ref={inputRef}\n        checked={currentChecked}\n        onChange={() => {}}\n        className={styles['visually-hidden']}\n        disabled={disabled}\n        role=\"switch\"\n        aria-checked={currentChecked}\n      \/>\n      <div\n        className={<code>${styles['toggle-switch']} ${currentChecked ? styles['is-checked'] : ''} ${disabled ? styles['is-disabled'] : ''}<\/code>}\n      >\n        <div className={styles['toggle-switch-thumb']}><\/div>\n      <\/div>\n    <\/div>\n  );\n});\n\nexport default ToggleSwitch;<\/code><\/pre>\n<pre><code class=\"language-scss\">\/\/ ToggleSwitch.module.scss\n$color-off: #ccc;\n$color-on: #4CAF50;\n$color-thumb: white;\n$color-label: #333;\n\n.toggle-switch-container {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  cursor: pointer;\n  user-select: none;\n\n  &:has(input[disabled]) {\n    cursor: not-allowed;\n  }\n}\n\n.toggle-switch-label {\n  font-family: sans-serif;\n  font-size: 1rem;\n  color: $color-label;\n}\n\n.toggle-switch {\n  position: relative;\n  display: inline-block;\n  background-color: $color-off;\n  transition: background-color 0.2s ease-in-out;\n  flex-shrink: 0;\n  box-sizing: border-box; \/\/ Padding ve border'\u0131n geni\u015fli\u011fe dahil olmas\u0131n\u0131 sa\u011flar\n\n  .toggle-switch-thumb {\n    position: absolute;\n    background-color: $color-thumb;\n    border-radius: 50%;\n    transition: transform 0.2s ease-in-out;\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);\n    box-sizing: border-box;\n  }\n\n  &.is-checked {\n    background-color: $color-on;\n  }\n\n  &.is-disabled {\n    opacity: 0.6;\n    cursor: not-allowed;\n  }\n}\n\n.visually-hidden {\n  position: absolute;\n  width: 1px;\n  height: 1px;\n  padding: 0;\n  margin: -1px;\n  overflow: hidden;\n  clip: rect(0, 0, 0, 0);\n  white-space: nowrap;\n  border-width: 0;\n}\n\n\/\/ Boyut de\u011fi\u015fkenleri ve mixin\n$sizes: (\n  small: (width: 40px, height: 22px, thumb: 18px),\n  medium: (width: 50px, height: 28px, thumb: 24px),\n  large: (width: 60px, height: 34px, thumb: 30px)\n);\n\n@each $name, $values in $sizes {\n  .size-#{$name} {\n    .toggle-switch {\n      width: map-get($values, width);\n      height: map-get($values, height);\n      border-radius: map-get($values, height) \/ 2;\n      \n      $thumb-offset: (map-get($values, height) - map-get($values, thumb)) \/ 2; \/\/ Dinamik offset\n\n      .toggle-switch-thumb {\n        width: map-get($values, thumb);\n        height: map-get($values, thumb);\n        top: $thumb-offset;\n        left: $thumb-offset;\n      }\n\n      &.is-checked .toggle-switch-thumb {\n        transform: translateX(map-get($values, width) - map-get($values, thumb) - (2 * $thumb-offset));\n      }\n    }\n  }\n}<\/code><\/pre>\n<pre><code class=\"language-jsx\">\/\/ App.js (Kullan\u0131m \u00f6rne\u011fi)\nimport React, { useState, useRef } from 'react';\nimport ToggleSwitch from '.\/ToggleSwitch';\nimport '.\/App.css'; \/\/ Global stilleriniz i\u00e7in\n\nfunction App() {\n  const [isNotificationsEnabled, setIsNotificationsEnabled] = useState(true);\n  const [isDarkMode, setIsDarkMode] = useState(false);\n  const toggleRef = useRef(null);\n\n  const handleFocusToggle = () => {\n    toggleRef.current?.focus();\n  };\n\n  return (\n    <div className=\"App\" style={{ background: isDarkMode ? '#222' : '#f0f0f0', color: isDarkMode ? '#eee' : '#333' }}>\n      \n\n      <section style={{ marginBottom: '20px' }}>\n        <h2>Kontrols\u00fcz Kullan\u0131m<\/h2>\n        <ToggleSwitch \n          label=\"E-posta Bildirimleri\" \n          initialChecked={isNotificationsEnabled} \n          onChange={setIsNotificationsEnabled} \n        \/>\n        <p>Bildirimler: {isNotificationsEnabled ? 'A\u00e7\u0131k' : 'Kapal\u0131'}<\/p>\n      <\/section>\n\n      <section style={{ marginBottom: '20px' }}>\n        <h2>Kontroll\u00fc Kullan\u0131m<\/h2>\n        <ToggleSwitch \n          label=\"Karanl\u0131k Modu Etkinle\u015ftir\" \n          checked={isDarkMode} \n          onChange={setIsDarkMode} \n          size=\"large\"\n        \/>\n        <p>Karanl\u0131k Mod: {isDarkMode ? 'A\u00c7IK' : 'KAPALI'}<\/p>\n      <\/section>\n\n      <section style={{ marginBottom: '20px' }}>\n        <h2>Boyut ve Devre D\u0131\u015f\u0131 B\u0131rakma<\/h2>\n        <ToggleSwitch label=\"K\u00fc\u00e7\u00fck Anahtar\" size=\"small\" initialChecked={true} \/>\n        <ToggleSwitch label=\"Orta Anahtar (Devre D\u0131\u015f\u0131)\" disabled={true} initialChecked={false} \/>\n        <ToggleSwitch label=\"B\u00fcy\u00fck Anahtar\" size=\"large\" initialChecked={true} \/>\n      <\/section>\n\n      <section>\n        <h2>Ref Kullan\u0131m\u0131<\/h2>\n        <ToggleSwitch label=\"Odaklanabilir Anahtar\" ref={toggleRef} \/>\n        <button onClick={handleFocusToggle} style={{ marginLeft: '10px', padding: '8px 15px' }}>\n          Toggle'a Odaklan\n        <\/button>\n      <\/section>\n    <\/div>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, React kullanarak s\u0131f\u0131rdan, tamamen \u00f6zelle\u015ftirilebilir ve eri\u015filebilir bir toggle anahtar\u0131 bile\u015feni olu\u015fturman\u0131n t\u00fcm ad\u0131mlar\u0131n\u0131 detayl\u0131 bir \u015fekilde inceledik. Temel state y\u00f6netiminden ba\u015flayarak, modern CSS (veya SCSS) ile g\u00f6rselle\u015ftirme, gizli bir <code><input type=\"checkbox\"><\/code> kullanarak eri\u015filebilirli\u011fi sa\u011flama, kontroll\u00fc\/kontrols\u00fcz bile\u015fen davran\u0131\u015f\u0131n\u0131 destekleme ve <code>forwardRef<\/code> ile daha ileri d\u00fczey ref y\u00f6netimi gibi konulara de\u011findik.<\/p>\n<p>Kendi \u00f6zel UI bile\u015fenlerinizi olu\u015fturmak, React geli\u015ftiricisi olarak size b\u00fcy\u00fck bir esneklik ve kontrol sa\u011flar. Bu sadece bir toggle anahtar\u0131 i\u00e7in de\u011fil, herhangi bir karma\u015f\u0131k UI \u00f6\u011fesi i\u00e7in ge\u00e7erlidir. Eri\u015filebilirlik ve yeniden kullan\u0131labilirlik ilkelerini ba\u015ftan sona uygulamak, daha sa\u011flam, kapsay\u0131c\u0131 ve bak\u0131m\u0131 kolay uygulamalar geli\u015ftirmenizi sa\u011flar. Bu bile\u015feni kendi React projelerinize entegre edebilir, tasar\u0131m sistemlerinize uygun hale getirebilir ve uygulaman\u0131z\u0131n genel kullan\u0131c\u0131 deneyimini zenginle\u015ftirebilirsiniz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?\nReact uygulamalar\u0131n\u0131zda kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) bile\u015fenleri tasarlarken, \u00e7o\u011fu zaman","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[128],"tags":[],"class_list":{"0":"post-35961","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-react","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur? React uygulamalar\u0131n\u0131zda kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) bile\u015fenleri tasarlarken, \u00e7o\u011fu zaman\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-12-06T02:41:01+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2025-12-06T02:41:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/\"},\"wordCount\":2099,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"React\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/\",\"name\":\"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-12-06T02:41:01+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?","og_description":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur? React uygulamalar\u0131n\u0131zda kullan\u0131c\u0131 aray\u00fcz\u00fc (UI) bile\u015fenleri tasarlarken, \u00e7o\u011fu zaman","og_url":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-12-06T02:41:01+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?","datePublished":"2025-12-06T02:41:01+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/"},"wordCount":2099,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["React"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/","name":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-12-06T02:41:01+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/react-ile-ozel-bir-toggle-anahtari-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"React ile \u00d6zel Bir Toggle Anahtar\u0131 Nas\u0131l Olu\u015fturulur?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35961","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=35961"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35961\/revisions"}],"predecessor-version":[{"id":35962,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/35961\/revisions\/35962"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=35961"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=35961"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=35961"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}