diff --git a/docs/tasarim/cta-cekmece-tasarimi.md b/docs/tasarim/cta-cekmece-tasarimi.md index 47d7b72..12d29de 100644 --- a/docs/tasarim/cta-cekmece-tasarimi.md +++ b/docs/tasarim/cta-cekmece-tasarimi.md @@ -82,8 +82,9 @@ rozet, buton varyantı tasarlanmaz. - **Tamamlanınca:** `tercihProfiliYaz` → çekmece kapanır → `sonucHref` ile `/sonuc` (girişliye `sihirbaz: "1"`, girişsize `hazir: "1"`). Giriş duvarı sihirbazın hemen arkasında değildir; değer önce gösterilir. -- **Lenis:** çekmece içeriği ve kaydırma kabı `data-lenis-prevent` taşır; - sayfadaki smooth-scroll çekmece içi kaydırmayı ezmez. +- **Kaydırma:** sayfa yerel tarayıcı kaydırmasını kullanır (Lenis/skew + performans nedeniyle 21.09.2026'da kaldırıldı); çekmece içi kaydırma için + ek bir önlem gerekmez. ## 6. Erişilebilirlik diff --git a/package.json b/package.json index f667b08..61c60e9 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,6 @@ "clsx": "^2.1.1", "drizzle-orm": "^0.45.2", "iyzipay": "^2.0.69", - "lenis": "^1.3.25", "lucide-react": "^1.25.0", "marked": "^18.0.7", "mermaid": "^11.16.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 10ecf20..b3888f7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -35,9 +35,6 @@ importers: iyzipay: specifier: ^2.0.69 version: 2.0.69 - lenis: - specifier: ^1.3.25 - version: 1.3.25(react@19.2.4) lucide-react: specifier: ^1.25.0 version: 1.25.0(react@19.2.4) @@ -4195,20 +4192,6 @@ packages: layout-base@2.0.1: resolution: {integrity: sha512-dp3s92+uNI1hWIpPGH3jK2kxE2lMjdXdr+DH8ynZHpd6PUlH6x6cbuXnoMmiNumznqaNO31xu9e79F0uuZ0JFg==} - lenis@1.3.25: - resolution: {integrity: sha512-mOKxayErlaONK8fm4LN3XNd99Qu4plTpn9h9qf8wxzjGrJDzuD84FYzZ81HCd6ZsWp++VWVwOzL286Pf2s2u4A==} - peerDependencies: - '@nuxt/kit': '>=3.0.0' - react: '>=17.0.0' - vue: '>=3.0.0' - peerDependenciesMeta: - '@nuxt/kit': - optional: true - react: - optional: true - vue: - optional: true - levn@0.4.1: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} @@ -9688,10 +9671,6 @@ snapshots: layout-base@2.0.1: {} - lenis@1.3.25(react@19.2.4): - optionalDependencies: - react: 19.2.4 - levn@0.4.1: dependencies: prelude-ls: 1.2.1 diff --git a/src/app/giris/page.tsx b/src/app/giris/page.tsx index c8d2b10..53736f6 100644 --- a/src/app/giris/page.tsx +++ b/src/app/giris/page.tsx @@ -16,7 +16,7 @@ export default function GirisPage({ searchParams: Promise<{ callback?: string; hata?: string }>; }) { return ( - // -mb-28: layout'taki ScrollFlow sarmalayıcısının pb-28'ini nötrler — + // -mb-28: layout'taki içerik sarmalayıcısının pb-28'ini nötrler — // kart tam dvh içinde ortalanır, sayfa scroll etmez (sığmazsa scroll açılır).
diff --git a/src/app/globals.css b/src/app/globals.css index bb2bdd1..d84a774 100644 --- a/src/app/globals.css +++ b/src/app/globals.css @@ -252,7 +252,5 @@ } html { @apply font-sans; - /* scroll-behavior: smooth KULLANMA — Lenis (ScrollFlow, anchors: true) - kaydırmayı zaten yumuşatıyor; ikisi birlikte çift yumuşatma yapar. */ } } \ No newline at end of file diff --git a/src/app/layout.tsx b/src/app/layout.tsx index f9e2ed5..c273ca2 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -11,7 +11,6 @@ import { TercihProfiliKapisiLazy } from "@/features/liste/components/tercih-prof import { HeaderGate } from "@/components/header-gate"; import { ProgressiveBlur } from "@/components/ui/skiper-ui/skiper41"; import { DevPanelMount } from "@/components/dev/dev-panel-mount"; -import { ScrollFlow } from "@/components/scroll-flow"; import { JsonLd, organizationJsonLd, webSiteJsonLd, SITE_URL } from "@/lib/seo"; import "./globals.css"; @@ -79,10 +78,8 @@ export default function RootLayout({ return ( 'e bağlı ResizeObserver - // ile izliyor; html sabit %100 kalınca lazy yüklenen içerik sonrası limit - // bayatlıyor ve sayfa sonunda scroll kilitleniyor. html auto yükseklikte - // içerikle büyümeli, viewport tabanı body'deki min-h-dvh'den gelir. + // `h-full` verme: html auto yükseklikte içerikle büyür, viewport tabanı + // body'deki min-h-dvh'den gelir. className={`${calSans.variable} ${clarityCity.variable} ${geistMono.variable} ${bricolage.variable} antialiased`} > @@ -107,9 +104,9 @@ export default function RootLayout({ - +
{children} - +
{/* Manuel 24'lük liste çekmecesi + "+" uçuş katmanı (navbar'dan açılır) */} {/* Girişsiz + 3 seçimli kullanıcıya "listen yalnızca bu tarayıcıda" banner'ı */} diff --git a/src/app/odeme/page.tsx b/src/app/odeme/page.tsx index 7e5c316..6ddafc4 100644 --- a/src/app/odeme/page.tsx +++ b/src/app/odeme/page.tsx @@ -17,7 +17,7 @@ export default function OdemePage({ searchParams: Promise<{ siparis?: string }>; }) { return ( - // -mb-28: layout'taki ScrollFlow sarmalayıcısının pb-28'ini nötrler — o + // -mb-28: layout'taki içerik sarmalayıcısının pb-28'ini nötrler — o // padding gizlenen alt blur katmanı içindi, checkout'ta krom kapalı.
diff --git a/src/components/dev/dev-panel.tsx b/src/components/dev/dev-panel.tsx index a3aea11..34979aa 100644 --- a/src/components/dev/dev-panel.tsx +++ b/src/components/dev/dev-panel.tsx @@ -178,7 +178,6 @@ export function DevPanel() {
{/* Oturum */} diff --git a/src/components/scroll-flow.tsx b/src/components/scroll-flow.tsx deleted file mode 100644 index 7ced048..0000000 --- a/src/components/scroll-flow.tsx +++ /dev/null @@ -1,77 +0,0 @@ -"use client"; - -import { type ReactNode } from "react"; -import { ReactLenis } from "lenis/react"; -import { - motion, - useReducedMotion, - useScroll, - useSpring, - useTransform, - useVelocity, -} from "motion/react"; - -/** - * Vitrin sayfalarının akışkan scroll efekti: Lenis ile lerp'li (yavaşlatılmış, - * momentumlu) kaydırma + scroll hızına bağlı içerik bükülmesi (skew). - * Hızlı kaydırdıkça sayfa hafifçe yana yatar, durunca yayla yerine oturur. - * - * Sohbet ve liste gibi iç scroll alanı olan uygulama sayfalarında KULLANMA — - * Lenis tekerlek olayını sayfaya yönlendirdiği için iç scroll'u bozar, - * transform da `fixed` konumlu çocukları koparır. - * - * Hareket azaltılmışsa hem yumuşatma hem bükülme tamamen kapalıdır. - */ -export function ScrollFlow({ - children, - className, - maxSkew = 3, -}: { - children: ReactNode; - className?: string; - /** Derece cinsinden en fazla bükülme açısı. */ - maxSkew?: number; -}) { - const reduceMotion = useReducedMotion(); - const { scrollY } = useScroll(); - const velocity = useVelocity(scrollY); - - // Önce hızı kesintisiz bir hedef açıya dönüştür, sonra doğrudan görünen - // açıyı yumuşat. Böylece eşik/clamp kaynaklı ani hız değişimleri yaya girmez. - const targetSkew = useTransform(velocity, (v) => { - const RESPONSE = 1800; - return Math.tanh(v / RESPONSE) * maxSkew; - }); - const smoothSkew = useSpring(targetSkew, { - stiffness: 240, - damping: 26, - mass: 0.7, - restDelta: 0.005, - restSpeed: 0.01, - }); - - // Yuvarlama görsel basamaklanma üretir. Tam hassasiyetle çiz; yalnızca açı - // algılanamayacak kadar küçüldüğünde transform'u kaldırarak dev sayfa - // katmanının GPU belleğinde boşuna tutulmasını önle. - const transform = useTransform(smoothSkew, (v) => { - if (Math.abs(v) < 0.01) return "none"; - return `skewY(${v}deg)`; - }); - - // Hareket azaltılmışsa da AYNI ağaç render edilir (server/client farklı - // ağaç hydration uyumsuzluğu yaratıyordu); efektler koşullu kapatılır: - // Lenis tekerlek yumuşatması kapalı, skew transform'u hiç bağlanmaz. - return ( - - - {children} - - - ); -} diff --git a/src/components/ui/chat-container.tsx b/src/components/ui/chat-container.tsx index 883a4a0..f545d00 100644 --- a/src/components/ui/chat-container.tsx +++ b/src/components/ui/chat-container.tsx @@ -26,7 +26,6 @@ function ChatContainerRoot({ return ( true; const getServerSnapshot = () => false; /** - * Viewport'a sabit kalması gereken öğeleri, transform uygulanan sayfa - * katmanının dışına taşır. Böylece üst katmandaki scroll skew animasyonu - * `position: fixed` koordinat sistemini değiştirmez. + * Viewport'a sabit kalması gereken öğeleri sayfa katmanının dışına, doğrudan + * body'ye taşır. Böylece üst katmanlardaki bir transform (ör. Parallax/Reveal) + * `position: fixed` koordinat sistemini değiştiremez. */ export function ViewportPortal({ children }: { children: ReactNode }) { const mounted = useSyncExternalStore( diff --git a/src/features/liste/components/liste-cekmecesi.tsx b/src/features/liste/components/liste-cekmecesi.tsx index 3d446c3..6e58f2c 100644 --- a/src/features/liste/components/liste-cekmecesi.tsx +++ b/src/features/liste/components/liste-cekmecesi.tsx @@ -115,7 +115,6 @@ export function ListeCekmecesi() { onAnimationEnd={(open) => setOturdu(open)} > @@ -182,7 +181,6 @@ export function ListeCekmecesi() {
{liste.length === 0 ? ( diff --git a/src/features/sihirbaz/components/cta-sira-form.tsx b/src/features/sihirbaz/components/cta-sira-form.tsx index 6003c8f..8b3be95 100644 --- a/src/features/sihirbaz/components/cta-sira-form.tsx +++ b/src/features/sihirbaz/components/cta-sira-form.tsx @@ -190,7 +190,6 @@ export function CtaSiraForm({ baslik }: { baslik?: string }) { {/* Görünür başlıklar adıma göre değişir; erişilebilir ad sabit kalır. */} @@ -207,7 +206,6 @@ export function CtaSiraForm({ baslik }: { baslik?: string }) {
{adim === "sira" ? (