Files
kolaytercih/docs/ekip-raporlari/2026-10-07/yazilimci-paket-D1.md
bilalgursen da0e9dff7a docs(ekip): 7–10 Ekim raporları, eval sonuçları, seslendirme betiği
- 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>
2026-10-11 00:33:39 +03:00

64 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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)
1. **Madde 5 bitti.** `soru_sor` çalışırken (parça `output-available`/`output-error` değilken) gri iskelet yerine `TextShimmerLoader` ile "Soruları hazırlıyorum…" satırı (`role="status" aria-live="polite"`); form gelince kalkar. Avatar araçta `"zincir"` → `"rota"` (header logosuyla aynı).
2. **`loader.tsx`'e dokunuldu — ve gerekliydi:** prompt-kit `TextShimmerLoader` `animate-[shimmer_…]` yazıyor ama projede `shimmer` adlı keyframe **yok** (shadcn'inki `tw-shimmer`, `node_modules/shadcn/dist/tailwind.css:537`); yani hiç hareket etmiyordu. Ayrıca `--muted-foreground/--foreground` + `bg-clip-text text-transparent` (tasarım denetimi `gradyan-metin` kuralı; ui klasörü taranmadığı için yakalamıyordu). Bileşen sitenin tek parıltı kaynağı olan shadcn `shimmer` utility'sine geçti (`liste-uretici.tsx:474`, `tercih-degisti-modali.tsx:326` ile aynı; currentColor → karanlık mod token'dan).
3. **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). `SohbetAnketi` kontrollü (`item`/`onItemChange`), her soru `motion.div` içinde aynı varyant/yay ile kayıyor, aktif fieldset `useMeasure` ile ölçülüp boy yayla uzuyor.
4. **Çıkış animasyonu elde edildi** (`hidden` deneyi başarılı; ayrıntı aşağıda).
5. 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/react` `dist/chunk-HBS6WEDP.js` `b` = `d(...a)`: argümanlar sırayla birleşir, **sonraki kazanır**, yalnız `undefined` atlanır (`if(o===void 0)continue; … r[e]=o`). `className` birleştirilir, `style` yayılır, `on*` zincirlenir; `hidden`/`inert` düz üzerine yazılır.
- `dist/questionnaire/index.js` `et` (Item): `b({...B, children:i}, c)` — `B` ilkelin `itemProps`'u (`hidden:!_, inert:!_, tabIndex:-1, …`), `c` kullanıcının kalan prop'ları. Kullanıcı **sonra** geldiği için `hidden={false}` ilkelin `hidden:true`'sunu ezer. Sonuç: pasif fieldset DOM'da ve görünür kalır; `data-active` ilkelden gelir.
- Uygulanan: `hidden={false}` verildi, `inert` **ilkelde 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ük `motion.div` varyantlarıyla: aktif `center` (relative, zIndex 1), pasifler `exit` (absolute, opacity 0, x ±%100). Yön `custom` ile sorunun sırasından türer: aktiften öncekiler `custom=1` → sola, sonrakiler `custom=-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; `inert` `FormData`'yı etkilemez (`disabled` yalnız `gonderiliyor` anında tüm form için — eskisi gibi). Ölçüm ref'i yalnız aktif fieldset'e verilir; `react-use-measure` ref callback'i `null`u yok sayıp yeni elemana geçiyor (`dist/index.js`: `L=r=>{!r||r===e.current.element||(v(),…,b())}`).
- `legend` fieldset'in doğrudan çocuğu kalsın diye `motion.div` **item'ın dışına** sarıldı (şartname "içeriği sar" diyordu; `legend` div içine girince fieldset erişilebilir adını kaybederdi).
- Odak halkası (`ring-3`) `overflow-hidden`'da kırpılmasın diye kap `-m-1`, fieldset `p-1` (net yerleşim değişmez; mutlak konumlu çıkan soru da aynı hizada).
## Şartnameden sapmalar
1. `center` varyantına `position: "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.
2. `yon` state'i yok; yön index'ten türüyor (sonuç birebir aynı, fazladan state yok).
3. `motion.div` item içeriğini değil item'ı sarıyor (`legend` gerekçesi yukarıda).
4. `loader.tsx` değişti — şartnamedeki "yalnız gerekirse" koşulu sağlandı: keyframe tanımsızdı, token/gradyan tasarım diline aykırıydı. `TextShimmerLoader` API'si aynı; projede başka kullanıcısı yok (grep).
5. Shimmer satırına `text-slate-600` eklendi (`tercih-degisti-modali.tsx` ile aynı ton); şartname yalnız `px-0.5` demişti — `shimmer` currentColor'dan çalıştığı için bir renk sınıfı gerekli.
6. 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-1` ile 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-shimmer` keyframe'i; koddan çıkarım, tarayıcıda bakılmadı).
- A paketi entegrasyonunda `revizyonHakki` → `revizyonAcik` yeniden 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_sor` hap çizmez; sorular üretilirken formun yerinde `TextShimmerLoader` ('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-foreground` token'ı taşıyor olabilir; `src/components/ui` tasarım denetiminden muaf — bir tur taranmalı.
## Bilal'den istenen
Yok.