diff --git a/docs/quality/uygulama-durumu.md b/docs/quality/uygulama-durumu.md index d8d02d6..c796db1 100644 --- a/docs/quality/uygulama-durumu.md +++ b/docs/quality/uygulama-durumu.md @@ -1208,3 +1208,11 @@ Taslak türü seçicisine erişilebilir ad eklendi. Üretim derlemesi geçti. Ö - Teknik şartname analiz penceresinde eksik olan dialog rolü, modal bilgisi, başlık bağlantısı ve odak yönetimi eklendi. Escape devam eden AI işini iptal etmiyor; mevcut Kapat düğmesiyle aynı pencere kapanışını yapıyor. - On gerçek tarayıcı kontrolü geçti: iki pencerede başlangıç odağı, ileri/geri sarma, Escape sonrası açana dönüş; ihale üstünde analiz açılması ve Escape ile yalnız analiz kapanıp odağın alttaki açan düğmeye dönmesi. Kanıt `rapor/qa-modal-keyboard-focus.json`. Analiz için ilk sıcak yenileme denemesi eski görünümü gösterdiğinden sunucu yeniden başlatıldı ve güncel kodla tekrar doğrulandı; başarısız ilk deneme kabul sayılmadı. - 275 test ve build başarılı. Bu kabul odak/klavye davranışını kapsar; bütün modallar, mobil klavye ve gerçek ekran okuyucunun sanal imleç davranışı henüz tamamlanmış sayılmaz. Genel plan açık. + + +### 2026-09-06 — Kılavuz ve firma profilinin klavye kabulü + +- Kullanım kılavuzu açıldığında odak arka plandaki yardım düğmesinde kalıyor ve panel dialog olarak tanımlanmıyordu. Tarayıcıda başlangıç odağının panel dışında ve dialog sayısının sıfır olması doğrulandı. Kılavuza başlıklı modal rolü ve ortak useModalFocus eklendi; kapatma düğmesi adı kılavuzu açıkça belirtiyor. +- Global Escape dinleyicisi kaldırıldı; kapanışı odaktaki pencere yönetiyor. Soru işareti kısayolu başka işlemin engellediği olayları, komut kombinasyonlarını ve düzenlenebilir metin alanlarını açma/kapatma komutu olarak kullanmıyor. Firma profili mevcut ayrı odak döngüsü yerine aynı ortak kancaya geçti; istek iptali ve bileşen yaşam döngüsü korunuyor. +- On gerçek tarayıcı kontrolü geçti: kılavuz ilk odağı, ileri/geri Tab ve açan düğmeye dönüş; profilde ilk odak/ileri/geri döngü; profilin üstünde ? ile kılavuz açma; ilk Escape ile yalnız kılavuzu kapatıp profile odak dönüşü; ikinci Escape ile profili kapatıp başlıktaki açan düğmeye dönüş. Kanıt `rapor/qa-guide-profile-focus.json`. +- Build başarılı. Önceki 275 birim/entegrasyon testi sonucu geçerli; JSX odak bağlamaları için tarayıcı kabulü yapıldı, tüm paket tekrarlanmadı. Bu kabul ekran okuyucunun sanal imleci/arka planın inert olması veya bütün mobil kontrolleri kapsamaz. Genel plan açık. diff --git a/src/components/CompanyScannerModal.jsx b/src/components/CompanyScannerModal.jsx index 172d7bf..732f8c1 100644 --- a/src/components/CompanyScannerModal.jsx +++ b/src/components/CompanyScannerModal.jsx @@ -1,5 +1,6 @@ import {HealthPortfolioEditor} from './HealthPortfolioEditor'; import React,{useState,useEffect,useRef,useId} from 'react'; +import {useModalFocus} from '../hooks/useModalFocus'; import {useApp} from '../context/AppContext'; import {getToken} from '../services/auth'; import {X,Loader2} from 'lucide-react'; @@ -13,10 +14,11 @@ function ProfileEditor(){ const [url,setUrl]=useState(userProfile.website || ''),[caps,setCaps]=useState(userProfile.scrapedCapabilities || {}); const [threshold,setThreshold]=useState(uyumEsigi),[busy,setBusy]=useState(''),[error,setError]=useState(null),[message,setMessage]=useState(''); const [entries,setEntries]=useState({}); - const alive=useRef(true),controller=useRef(null),locked=useRef(false),root=useRef(null),titleId=useId(); + const alive=useRef(true),controller=useRef(null),locked=useRef(false),titleId=useId(); + const modalFocus=useModalFocus(true,()=>setIsCompanyScannerOpen(false)); useEffect(()=>{ - alive.current=true;const opener=document.activeElement;root.current?.querySelector('button')?.focus(); - return()=>{alive.current=false;controller.current?.abort();if(opener?.isConnected)opener.focus();}; + alive.current=true; + return()=>{alive.current=false;controller.current?.abort();}; },[]); const run=async(kind,operation)=>{ if(locked.current)return;locked.current=true;setBusy(kind);setError(null);setMessage(''); @@ -32,16 +34,8 @@ function ProfileEditor(){ if(alive.current)setMessage('Firma profili sunucuya kaydedildi. Eşleşmeler kayıtlı profilinizle güncellenir.'); }); const edit=(key,values)=>{setCaps(previous=>({...previous,[key]:values}));setMessage('Kaydedilmemiş değişiklikler var.');}; - const keyDown=e=>{ - if(e.key==='Escape'){e.preventDefault();e.stopPropagation();setIsCompanyScannerOpen(false);} - if(e.key!=='Tab')return; - const controls=[...root.current.querySelectorAll('button,input,select,textarea,a[href]')].filter(el=>!el.disabled&&el.getClientRects().length); - const first=controls[0],last=controls.at(-1); - if(e.shiftKey&&document.activeElement===first){e.preventDefault();last?.focus();} - else if(!e.shiftKey&&document.activeElement===last){e.preventDefault();first?.focus();} - }; return
Ürünlerinizi elle ekleyebilir veya web sitenizden öneri alabilirsiniz. Tarama, ürün uygunluğunu ya da ÜTS/sertifika geçerliliğini doğrulamaz. Kaydetmeden kapatırsanız bu ekrandaki değişiklikler uygulanmaz.