diff --git a/docs/tasarim/DESIGN.md b/docs/tasarim/DESIGN.md index 4456a23..445b797 100644 --- a/docs/tasarim/DESIGN.md +++ b/docs/tasarim/DESIGN.md @@ -133,9 +133,13 @@ Seçici `src/components/tema-secici.tsx` (footer'da), sağlayıcı `src/componen (`next-themes`, ``). Renklerin tek kaynağı `src/app/globals.css` içindeki `.dark` bloğu. -**Geçiş ve kısayol (7 Eki 2026):** tema değişimi anlık değildir; yeni tema header'daki -KolayTercih işaretinin biçiminde logodan büyüyerek açılır (View Transitions + CSS maskesi: -`src/lib/tema-gecisi.ts`, `globals.css` `.kt-tema-gecis`; hareket azaltılmışsa düz değişir). +**Geçiş ve kısayol (7 Eki 2026):** tema değişimi anlık değildir; yeni tema +KolayTercih işaretinin biçiminde önce ekranın altından ortaya süzülür, sonra +merkezden büyüyerek ekranı kaplar — büyüme boyunca logo normal, boşluklu +hâliyle görünür; en büyük haline yaklaştıkça kareler arası boşluklar +merkezden dışa doğru yumuşak biçimde kapanır (View Transitions + CSS +maskesi, maskeyi motion sürer: `src/lib/tema-gecisi.ts`, `globals.css` +`.kt-tema-gecis`; hareket azaltılmışsa düz değişir). `D` tuşu açık ↔ koyu geçişi yapar (`src/components/tema-kisayolu.tsx`); ipucu seçicinin altında `Kbd` ile durur, başka yere kopyalanmaz. Header'daki Beta rozeti `/surum-notlari`na bağlantıdır. diff --git a/public/kolay-tercih-mark-dolu.svg b/public/kolay-tercih-mark-dolu.svg new file mode 100644 index 0000000..796bfa8 --- /dev/null +++ b/public/kolay-tercih-mark-dolu.svg @@ -0,0 +1,15 @@ + + KolayTercih + + + + diff --git a/src/app/globals.css b/src/app/globals.css index 26153ae..5267f7e 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -478,21 +478,39 @@ } /* Tema geçişi (DESIGN.md §2.3, lib/tema-gecisi.ts): tema değişirken yeni - görüntü, header'daki KolayTercih işaretinin biçiminde logodan büyüyerek - açılır. Eski görüntü yerinde durur; yeni görüntünün maskesi iki katman: - (1) işaretin SVG'si, merkezi --kt-tema-x/y'de, kenarı 0 → --kt-tema-son; - (2) aynı merkezden biraz geç kalkan bir daire — işaretin kareleri arasındaki - boşlukları kapatır ki geçiş sonunda eski temadan iz kalmasın. Hareket - azaltılmışsa JS geçişi hiç başlatmaz, tema düz değişir. */ + görüntü, KolayTercih işaretinin biçiminde önce ekranın ALTINDAN ortaya + süzülür, sonra merkezden büyüyerek ekranı kaplar. Eski görüntü yerinde + durur; yeni görüntünün maskesi üç katman (hepsi `add` ile toplanır, + mask-composite varsayılanı add — bu yüzden sıralama yalnızca okunurluk + içindir): + (1) işaretin NORMAL çizimi (kolay-tercih-mark.svg'nin gömülü kopyası — kareler arası boşluk + görünür, logo logonun kendisi gibi durur), merkezi --kt-tema-x/y'de, + boyu --kt-tema-kenar: uçuş ve büyüme boyunca bu görünür; + (2) aynı geometride BOŞLUKLARI DOLU çizim (kolay-tercih-mark-dolu.svg), + boyu --kt-tema-kenar × --kt-tema-kapanis (0 → 1): logo en büyük haline + ulaşmaya yakın dolu çizim merkezden dışa doğru büyür, kareler arası + boşlukları yumuşak biçimde kapatır; + (3) tam ekran dolgu: --kt-tema-dolgu (0 → 1) ile işaret ekranı tam + kapsadıktan sonra dış çentiklerde kalan eski zeminin son anda dolması. + Yuvarlak büyüme yok — logo ekranı kaplayınca geçiş tamamlanır. + Konum, boy ve dolgular motion ile sürülür (lib/tema-gecisi.ts); buradaki + kt-tema-omur yalnızca geçişin pseudo elemanı motion bitene kadar yaşasın + diye durur (süre --kt-tema-sure, JS'den gelir). Hareket azaltılmışsa JS + geçişi hiç başlatmaz, tema düz değişir. */ @property --kt-tema-kenar { syntax: ""; inherits: true; initial-value: 0px; } -@property --kt-tema-yaricap { - syntax: ""; +@property --kt-tema-kapanis { + syntax: ""; inherits: true; - initial-value: 0px; + initial-value: 0; +} +@property --kt-tema-dolgu { + syntax: ""; + inherits: true; + initial-value: 0; } .kt-tema-gecis { @@ -508,40 +526,42 @@ } .kt-tema-gecis::view-transition-new(root) { z-index: 2; + /* İki SVG de data URI olarak gömülü, dosyadan url() ile DEĞİL: Chrome'da + view-transition pseudo elemanı dosyadan yüklenen ikinci bir maske + katmanını (boyu 0'dan büyük olduğu an) tümden şeffaf çiziyor — logo + hiç görünmüyordu (8 Eki 2026 tanısı). Gömülü hâlde iki katman da + doğru birleşiyor. Çizimler public/kolay-tercih-mark.svg ve + public/kolay-tercih-mark-dolu.svg ile aynı geometridir; oradaki dosya + değişirse burası da güncellenir. */ mask-image: - url("/kolay-tercih-mark.svg"), - radial-gradient( - circle at var(--kt-tema-x) var(--kt-tema-y), - #000 calc(var(--kt-tema-yaricap) - 1px), - transparent var(--kt-tema-yaricap) + url("data:image/svg+xml,"), + url("data:image/svg+xml,"), + linear-gradient( + rgb(0 0 0 / var(--kt-tema-dolgu)), + rgb(0 0 0 / var(--kt-tema-dolgu)) ); mask-repeat: no-repeat; mask-size: + calc(var(--kt-tema-kenar) * var(--kt-tema-kapanis)) + calc(var(--kt-tema-kenar) * var(--kt-tema-kapanis)), var(--kt-tema-kenar) var(--kt-tema-kenar), 100% 100%; mask-position: + calc(var(--kt-tema-x) - var(--kt-tema-kenar) * var(--kt-tema-kapanis) / 2) + calc(var(--kt-tema-y) - var(--kt-tema-kenar) * var(--kt-tema-kapanis) / 2), calc(var(--kt-tema-x) - var(--kt-tema-kenar) / 2) calc(var(--kt-tema-y) - var(--kt-tema-kenar) / 2), 0 0; - animation: - kt-tema-isaret 0.9s cubic-bezier(0.65, 0, 0.35, 1) both, - kt-tema-daire 0.9s cubic-bezier(0.65, 0, 0.35, 1) both; + /* Değeri değişmeyen ama gerçek bir animasyon: view transition, üzerindeki + tüm animasyonlar bitene kadar kalkmaz; maskeyi JS (motion) sürerken + ömrü bu tutar. */ + animation: kt-tema-omur var(--kt-tema-sure, 1.05s) linear both; } -@keyframes kt-tema-isaret { +@keyframes kt-tema-omur { from { - --kt-tema-kenar: 0px; + opacity: 1; } to { - --kt-tema-kenar: var(--kt-tema-son); - } -} -/* Daire işaretin ardından gelir: ilk %35'te sıfırda bekler. */ -@keyframes kt-tema-daire { - 0%, - 35% { - --kt-tema-yaricap: 0px; - } - 100% { - --kt-tema-yaricap: var(--kt-tema-son); + opacity: 1; } } diff --git a/src/components/animasyonlu-mark.tsx b/src/components/animasyonlu-mark.tsx index 5cbca50..406e12a 100644 --- a/src/components/animasyonlu-mark.tsx +++ b/src/components/animasyonlu-mark.tsx @@ -166,15 +166,12 @@ function donguyuBaslat( * yerinden başlar. */ export function AnimasyonluMark({ - id, className, sadeceHover = false, oynat = true, varyant = "rota", renk = "marka", }: { - /** Kök elemanın id'si (ör. tema geçişinin merkez noktası, lib/tema-gecisi.ts). */ - id?: string; className?: string; sadeceHover?: boolean; /** `sadeceHover` yokken döngü açık mı. `false` iken işaret durağandır. */ @@ -287,7 +284,6 @@ export function AnimasyonluMark({ return (