- docs/ekip-raporlari/2026-10-07, 2026-10-09, 2026-10-10 raporları ve ekran görüntüleri (ses/ altındaki mp3 dosyaları depoya alınmadı, 38 MB) - BACKLOG #38: rehber yazılarına "Dinle" düğmesi adayı - scripts/seslendir.py (Türkçe TTS) ve .gitignore'a .venv-tts/ - scripts/eval/sonuc: 8–10 Ekim revizyon eval çıktıları Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
8.2 KiB
8.2 KiB
Yazılımcı raporu — Paket D1 · Sohbet UI (shimmer, logo varyantı, soru geçişi)
Worktree: /Users/bilalgursen/Desktop/kolaytercih/.claude/worktrees/agent-a8614479561696864, dal worktree-agent-a8614479561696864. Worktree a3cb058'de başlıyordu (şartname tabanı 4d30dd1'in 4 commit gerisi; sohbet-anketi.tsx yoktu); temiz olduğu için git merge --ff-only 1760690 ile v2 ucuna ileri sarıldı, sonra iş yapıldı. node_modules ana checkout'tan cp -Rc ile klonlandı. Bu rapor worktree'ye yazıldı (ajan ana checkout'a yazamıyor); ana checkout'taki docs/ekip-raporlari/2026-10-07/yazilimci-paket-D1.md'ye orkestratör kopyalar. Rapor dosyası commit'lenmedi.
Özet (5 madde)
- Madde 5 bitti.
soru_sorçalışırken (parçaoutput-available/output-errordeğilken) gri iskelet yerineTextShimmerLoaderile "Soruları hazırlıyorum…" satırı (role="status" aria-live="polite"); form gelince kalkar. Avatar araçta"zincir"→"rota"(header logosuyla aynı). loader.tsx'e dokunuldu — ve gerekliydi: prompt-kitTextShimmerLoaderanimate-[shimmer_…]yazıyor ama projedeshimmeradlı keyframe yok (shadcn'inkitw-shimmer,node_modules/shadcn/dist/tailwind.css:537); yani hiç hareket etmiyordu. Ayrıca--muted-foreground/--foreground+bg-clip-text text-transparent(tasarım denetimigradyan-metinkuralı; ui klasörü taranmadığı için yakalamıyordu). Bileşen sitenin tek parıltı kaynağı olan shadcnshimmerutility'sine geçti (liste-uretici.tsx:474,tercih-degisti-modali.tsx:326ile aynı; currentColor → karanlık mod token'dan).- Madde 10 bitti.
src/lib/adim-gecisi.ts(yeni, saf):adimGecisiVaryantlari+adimGecisi. Sihirbaz bu ikisini kullanıyor (diff yalnız taşınma + aşağıdaki tek sapma).SohbetAnketikontrollü (item/onItemChange), her sorumotion.diviçinde aynı varyant/yay ile kayıyor, aktif fieldsetuseMeasureile ölçülüp boy yayla uzuyor. - Çıkış animasyonu elde edildi (
hiddendeneyi başarılı; ayrıntı aşağıda). - Doğrulama:
pnpm exec next typegen✔,tsc --noEmit✔ (0 hata),pnpm lint✔ (exit 0; tasarım denetimi 0 hata, 12 uyarı — hepsi başka dosyalarda, önceden vardı), eslint beşli dosya seti exit 0. Build koşulmadı (şartname). Tarayıcı açılmadı.
Commit'ler
| Hash | Mesaj | Dosyalar |
|---|---|---|
f08a26a |
feat(sohbet): soru formu hazırlanırken shimmer; araçta avatar header logosuyla aynı rota koreografisi | src/features/rapor/components/sohbet-client.tsx, src/components/ui/loader.tsx |
3f4095e |
refactor(hareket): sihirbaz adım geçişi sabitleri lib/adim-gecisi.ts'e; soru formu aynı geçişle | src/lib/adim-gecisi.ts (Y), src/features/sihirbaz/components/sihirbaz-adimlar.tsx, src/features/rapor/components/sohbet-anketi.tsx |
revizyonHakki prop'una dokunulmadı (A paketi). Kod ağacı temiz (git status yalnız bu rapor dosyasını gösterir).
Kabul kriterleri (D1-2)
| Kriter | Durum | Nasıl doğrulandı |
|---|---|---|
grep -n '"zincir"' sohbet-client.tsx → 0 |
✔ | koşuldu: 0 |
grep -n "TextShimmerLoader" sohbet-client.tsx ≥ 1 |
✔ | koşuldu: 2 (import + kullanım) |
grep -n "stiffness: 300" sihirbaz-adimlar.tsx sohbet-anketi.tsx → 0 |
✔ | koşuldu: 0/0 |
sabit tek kaynakta adim-gecisi.ts |
✔ (not) | koşuldu: 2 satır (x ve height ayrı yay nesnesi — sihirbazdaki özgün yapı aynen; şartnamedeki "1" sayımı gevşekti) |
sohbet-anketi.tsx item= ve onItemChange= |
✔ | satır 111-112 |
sihirbaz-adimlar.tsx adimGecisiVaryantlari import |
✔ | satır 17, kullanım 257 |
typegen + tsc + lint temiz; pnpm tasarim:denetim 0 hata |
✔ | koşuldu (lint exit 0; denetim "0 hata, 12 uyarı") |
| Rapor: çıkış animasyonu bulgusu | ✔ | aşağıda |
Çıkış animasyonu — hidden deneyi (koddan çıkarım, kaynak okundu)
@shadcn/reactdist/chunk-HBS6WEDP.jsb=d(...a): argümanlar sırayla birleşir, sonraki kazanır, yalnızundefinedatlanır (if(o===void 0)continue; … r[e]=o).classNamebirleştirilir,styleyayılır,on*zincirlenir;hidden/inertdüz üzerine yazılır.dist/questionnaire/index.jset(Item):b({...B, children:i}, c)—BilkelinitemProps'u (hidden:!_, inert:!_, tabIndex:-1, …),ckullanıcının kalan prop'ları. Kullanıcı sonra geldiği içinhidden={false}ilkelinhidden:true'sunu ezer. Sonuç: pasif fieldset DOM'da ve görünür kalır;data-activeilkelden gelir.- Uygulanan:
hidden={false}verildi,inertilkelde bırakıldı (pasif/çıkan soru saydamken odak ve tıklama almasın; erişilebilirlik ağacından da düşer). Görünürlükmotion.divvaryantlarıyla: aktifcenter(relative, zIndex 1), pasiflerexit(absolute, opacity 0, x ±%100). Yöncustomile sorunun sırasından türer: aktiften öncekilercustom=1→ sola, sonrakilercustom=-1→ sağa park eder; böylece ileri geçişte eski soru sola çıkarken yenisi sağdan gelir, geri dönüşte tersi — sihirbazla aynı.initial={false}: ilk çizimde animasyon yok. - Form gönderimi: pasif item'lar DOM'da kaldığından
FormDataönceki cevapları toplar;inertFormData'yı etkilemez (disabledyalnızgonderiliyoranında tüm form için — eskisi gibi). Ölçüm ref'i yalnız aktif fieldset'e verilir;react-use-measureref callback'inullu yok sayıp yeni elemana geçiyor (dist/index.js:L=r=>{!r||r===e.current.element||(v(),…,b())}). legendfieldset'in doğrudan çocuğu kalsın diyemotion.divitem'ın dışına sarıldı (şartname "içeriği sar" diyordu;legenddiv içine girince fieldset erişilebilir adını kaybederdi).- Odak halkası (
ring-3)overflow-hidden'da kırpılmasın diye kap-m-1, fieldsetp-1(net yerleşim değişmez; mutlak konumlu çıkan soru da aynı hizada).
Şartnameden sapmalar
centervaryantınaposition: "relative"eklendi (adim-gecisi.ts). Sihirbazda etkisiz (enter zaten relative, çıkan panel unmount oluyor); ankette şart — mutlak park eden soru geri dönünce akışa girmeli. Yayı/süreyi değiştirmiyor.yonstate'i yok; yön index'ten türüyor (sonuç birebir aynı, fazladan state yok).motion.divitem içeriğini değil item'ı sarıyor (legendgerekçesi yukarıda).loader.tsxdeğişti — şartnamedeki "yalnız gerekirse" koşulu sağlandı: keyframe tanımsızdı, token/gradyan tasarım diline aykırıydı.TextShimmerLoaderAPI'si aynı; projede başka kullanıcısı yok (grep).- Shimmer satırına
text-slate-600eklendi (tercih-degisti-modali.tsxile aynı ton); şartname yalnızpx-0.5demişti —shimmercurrentColor'dan çalıştığı için bir renk sınıfı gerekli. - Worktree v2 ucuna (
1760690) ileri sarıldı; şartname tabanı4d30dd1+ yalnız header rozeti commit'i. Dosya kümem o commit'te değişmiyor.
Merge sonrası doğrulanması gerekenler
tasarimci(D1-4): 375/768 px'te soru geçişinde boy sıçraması;overflow-hidden+-m-1/p-1ile odak halkası tam görünüyor mu;prefers-reduced-motion'da yalnız solma. Koddan çıkarım: ilk geçişte yükseklik"auto"→ ölçülen px'e yayla gider, sonrakiler px → px.- Shimmer gerçekten akıyor mu (artık
tw-shimmerkeyframe'i; koddan çıkarım, tarayıcıda bakılmadı). - A paketi entegrasyonunda
revizyonHakki→revizyonAcikyeniden adlandırması (çakışma kararı 1) — D1 mesaj gövdesinde ~20 satır kaydırdı; orkestratör satır numarası yerine grep ile bulsun. - DESIGN.md için not (D2'nin dosyası; orkestratör/tasarımcı işler): §4.20 "Araç hapları" maddesine "
soru_sorhap çizmez; sorular üretilirken formun yerindeTextShimmerLoader('Soruları hazırlıyorum…',shimmer text-slate-600) durur; araçta avatar header logosuyla aynırota." §4.33'e "Sorular arası geçiş sihirbaz adımlarıyla aynı yay ve yoldan (src/lib/adim-gecisi.ts); pasif sorular DOM'da, mutlak konumda saydam,inert." - Backlog önerisi:
loader.tsx'teki öteki prompt-kit yükleyiciler de--muted-foregroundtoken'ı taşıyor olabilir;src/components/uitasarım denetiminden muaf — bir tur taranmalı.
Bilal'den istenen
Yok.