Files
kolaytercih/src/app/globals.css
bilalgursen cc46244206 fix(ui): iPad'de progressive blur kaydırmada ortaya kaymıyor
Site geneli üst/alt blur katmanları `position: fixed` + `backdrop-filter`
taşıyordu. iOS/iPadOS WebKit (iPad'de Chrome da WebKit) bu birleşimde
bulanıklığı ayrı kompozit katmana alıp scroll sırasında bayat kaydırma
konumuyla çiziyor; katman ekranın ortasında şerit gibi görünüyordu.

Katmanların stili skiper-ui bileşeninin inline stilinden globals.css'teki
`.kt-sayfa-blur`a taşındı (inline stil `@supports` ile ezilemiyordu).
`@supports (-webkit-touch-callout: none)` yalnızca iOS/iPadOS'ta eşleşir —
masaüstü Safari dahil başka hiçbir tarayıcıda desteklenmez — ve orada
bulanıklık + maske düşer, degrade fade korunur. Geometri (112px, z-40,
print:hidden) ve diğer tarayıcılardaki görüntü değişmedi.

Katalogdaki ProgressiveBlur kullanımları `absolute` olduğu için bu hatadan
etkilenmiyor; bileşen onlar için olduğu gibi kaldı.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-22 01:08:01 +03:00

306 lines
9.3 KiB
CSS
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.
@import "tailwindcss";
@import "tw-animate-css";
@import "shadcn/tailwind.css";
@custom-variant dark (&:is(.dark *));
@theme inline {
--color-background: var(--background);
--color-foreground: var(--foreground);
--font-sans: var(--font-clarity-city);
--font-mono: var(--font-geist-mono);
--font-heading: var(--font-cal-sans);
--font-bricolage: var(--font-bricolage-grotesque);
--color-sidebar-ring: var(--sidebar-ring);
--color-sidebar-border: var(--sidebar-border);
--color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
--color-sidebar-accent: var(--sidebar-accent);
--color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
--color-sidebar-primary: var(--sidebar-primary);
--color-sidebar-foreground: var(--sidebar-foreground);
--color-sidebar: var(--sidebar);
--color-chart-5: var(--chart-5);
--color-chart-4: var(--chart-4);
--color-chart-3: var(--chart-3);
--color-chart-2: var(--chart-2);
--color-chart-1: var(--chart-1);
--color-ring: var(--ring);
--color-input: var(--input);
--color-border: var(--border);
--color-destructive: var(--destructive);
--color-accent-foreground: var(--accent-foreground);
--color-accent: var(--accent);
--color-muted-foreground: var(--muted-foreground);
--color-muted: var(--muted);
--color-secondary-foreground: var(--secondary-foreground);
--color-secondary: var(--secondary);
--color-primary-foreground: var(--primary-foreground);
--color-primary: var(--primary);
--color-popover-foreground: var(--popover-foreground);
--color-popover: var(--popover);
--color-card-foreground: var(--card-foreground);
--color-card: var(--card);
--radius-sm: calc(var(--radius) * 0.6);
--radius-md: calc(var(--radius) * 0.8);
--radius-lg: var(--radius);
--radius-xl: calc(var(--radius) * 1.4);
--radius-2xl: calc(var(--radius) * 1.8);
--radius-3xl: calc(var(--radius) * 2.2);
--radius-4xl: calc(var(--radius) * 2.6);
}
:root {
--background: oklch(1 0 0);
--foreground: oklch(0.145 0 0);
--card: oklch(1 0 0);
--card-foreground: oklch(0.145 0 0);
--popover: oklch(1 0 0);
--popover-foreground: oklch(0.145 0 0);
--primary: oklch(0.623 0.188 259.8);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.97 0 0);
--secondary-foreground: oklch(0.205 0 0);
--muted: oklch(0.97 0 0);
--muted-foreground: oklch(0.556 0 0);
--accent: oklch(0.97 0 0);
--accent-foreground: oklch(0.205 0 0);
--destructive: oklch(0.577 0.245 27.325);
--border: oklch(0.922 0 0);
--input: oklch(0.922 0 0);
--ring: oklch(0.623 0.188 259.8 / 60%);
--chart-1: oklch(0.87 0 0);
--chart-2: oklch(0.556 0 0);
--chart-3: oklch(0.439 0 0);
--chart-4: oklch(0.371 0 0);
--chart-5: oklch(0.269 0 0);
--radius: 0.625rem;
--sidebar: oklch(0.985 0 0);
--sidebar-foreground: oklch(0.145 0 0);
--sidebar-primary: oklch(0.205 0 0);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.97 0 0);
--sidebar-accent-foreground: oklch(0.205 0 0);
--sidebar-border: oklch(0.922 0 0);
--sidebar-ring: oklch(0.708 0 0);
}
.dark {
--background: oklch(0.145 0 0);
--foreground: oklch(0.985 0 0);
--card: oklch(0.205 0 0);
--card-foreground: oklch(0.985 0 0);
--popover: oklch(0.205 0 0);
--popover-foreground: oklch(0.985 0 0);
--primary: oklch(0.707 0.143 254.6);
--primary-foreground: oklch(0.145 0 0);
--secondary: oklch(0.269 0 0);
--secondary-foreground: oklch(0.985 0 0);
--muted: oklch(0.269 0 0);
--muted-foreground: oklch(0.708 0 0);
--accent: oklch(0.269 0 0);
--accent-foreground: oklch(0.985 0 0);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(1 0 0 / 10%);
--input: oklch(1 0 0 / 15%);
--ring: oklch(0.556 0 0);
--chart-1: oklch(0.87 0 0);
--chart-2: oklch(0.556 0 0);
--chart-3: oklch(0.439 0 0);
--chart-4: oklch(0.371 0 0);
--chart-5: oklch(0.269 0 0);
--sidebar: oklch(0.205 0 0);
--sidebar-foreground: oklch(0.985 0 0);
--sidebar-primary: oklch(0.488 0.243 264.376);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.269 0 0);
--sidebar-accent-foreground: oklch(0.985 0 0);
--sidebar-border: oklch(1 0 0 / 10%);
--sidebar-ring: oklch(0.556 0 0);
}
/* TypingAnimation imleci (animate-blink-cursor utility'si) */
@theme {
--animate-blink-cursor: blink-cursor 1s step-end infinite;
@keyframes blink-cursor {
50% {
opacity: 0;
}
}
}
/* Rozet (PixelMark) pikselleri: sırayla turuncuya ısınır, iz gibi yavaşça söner.
Zamanlama ısı fırçasıyla aynı dili konuşur: ani ısınma (%8), uzun soğuma (%66). */
@theme {
--animate-pixel-isi: pixel-isi 2.4s ease-in-out infinite;
--animate-pixel-isi-accent: pixel-isi-accent 2.4s ease-in-out infinite;
@keyframes pixel-isi {
0%,
66%,
100% {
fill: currentColor;
fill-opacity: var(--px-op, 0.3);
}
8% {
fill: var(--color-orange-500);
fill-opacity: 0.85;
}
}
@keyframes pixel-isi-accent {
0%,
66%,
100% {
fill-opacity: 0.55;
}
8% {
fill-opacity: 1;
}
}
}
/* Ödeme dönüşünde kilidi açılan listenin blur çözülme animasyonu */
@keyframes kt-unblur {
from {
filter: blur(12px);
opacity: 0.4;
}
to {
filter: blur(0);
opacity: 1;
}
}
.kt-unblur {
animation: kt-unblur 0.9s ease-out both;
}
/* Hareket azaltılmışsa blur çözülmesi yerine kısa, yumuşak bir belirme:
kavramayı sağlayan geri bildirim kalır, gösterişli efekt düşer. */
@media (prefers-reduced-motion: reduce) {
.kt-unblur {
animation: kt-unblur-sade 0.25s ease-out both;
}
}
@keyframes kt-unblur-sade {
from {
opacity: 0.6;
}
to {
opacity: 1;
}
}
/* Landing bölümlerinin görünüme girerken belirmesi (bkz. landing/reveal.tsx).
İçerik SSR'da GÖRÜNÜR; gizleme yalnızca script çalışan tarayıcılarda ve
IO sınıfı ekleyene kadar geçerli — JS'siz istemcide sayfa asla boş kalmaz. */
@media (scripting: enabled) {
.kt-reveal {
opacity: 0;
translate: 0 var(--reveal-y, 28px);
transition:
opacity 0.55s cubic-bezier(0.21, 0.47, 0.32, 0.98),
translate 0.55s cubic-bezier(0.21, 0.47, 0.32, 0.98);
/* Emniyet: hydration hiç gelmezse 3 sn sonra içerik yine de belirir */
animation: kt-reveal-emniyet 0.5s ease-out 3s forwards;
}
.kt-reveal.kt-reveal-in {
opacity: 1;
translate: 0 0;
}
@media (prefers-reduced-motion: reduce) {
.kt-reveal {
translate: 0 0;
transition: opacity 0.25s ease-out;
}
}
}
@keyframes kt-reveal-emniyet {
to {
opacity: 1;
translate: 0 0;
}
}
/* Uzun tablo satırları: viewport dışı satırların layout/paint'i atlanır
(rendering-content-visibility). contain-intrinsic-size satır yüksekliği
tahminidir — scrollbar zıplamasını önler. Sorun çıkarsa satır bazında
class kaldırılarak geri alınabilir. */
@utility kt-cv-satir {
content-visibility: auto;
contain-intrinsic-size: auto 57px;
}
@layer base {
* {
@apply border-border outline-ring/50;
}
body {
@apply bg-background text-foreground;
}
/* Chrome autofill'in soluk mavi dolgusu inputun kendi arka planını
ezmesin; dolgu metne kırpılır, renkler temadan gelir. */
input:-webkit-autofill,
input:-webkit-autofill:hover,
input:-webkit-autofill:focus {
-webkit-background-clip: text;
-webkit-text-fill-color: var(--foreground);
caret-color: var(--foreground);
}
html {
@apply font-sans;
}
}
/* Site geneli üst/alt progressive blur katmanları (root layout).
Kendi CSS'iyle yazılır çünkü bu iki katman `position: fixed` + `backdrop-filter`
birleşimini taşıyan tek yer: iOS/iPadOS WebKit bu birleşimde bulanıklığı ayrı
bir kompozit katmana alıp kaydırma sırasında bayat scroll konumuyla çiziyor,
katman ekranın ortasında bir şerit gibi görünüyor (22 Eyl 2026, iPad + Chrome
raporu — Chrome iOS da WebKit'tir, hata Safari'yle aynı). Aşağıdaki @supports
bloğu yalnızca iOS/iPadOS'ta eşleşir (`-webkit-touch-callout` başka hiçbir
tarayıcıda desteklenmez; masaüstü Safari dahil) ve orada bulanıklık + maske
düşer, degrade fade kalır. Katalogdaki ProgressiveBlur kullanımları `absolute`
olduğu için bu hatadan etkilenmiyor; onlar bileşende kalır. */
.kt-sayfa-blur {
position: fixed;
inset-inline: 0;
z-index: 40;
height: 7rem;
pointer-events: none;
user-select: none;
-webkit-user-select: none;
-webkit-backdrop-filter: blur(6px);
backdrop-filter: blur(6px);
}
/* Degrade: ekran kenarında gövde zemini (bg-slate-50), içeriye doğru şeffaf.
Maske bulanıklığı aynı yönde söndürür — sert kenar kalmaz. */
.kt-sayfa-blur-ust {
top: 0;
background: linear-gradient(to top, transparent, #f8fafc);
-webkit-mask-image: linear-gradient(to bottom, #000 50%, transparent);
mask-image: linear-gradient(to bottom, #000 50%, transparent);
}
.kt-sayfa-blur-alt {
bottom: 0;
background: linear-gradient(to bottom, transparent, #f8fafc);
-webkit-mask-image: linear-gradient(to top, #000 50%, transparent);
mask-image: linear-gradient(to top, #000 50%, transparent);
}
@supports (-webkit-touch-callout: none) {
.kt-sayfa-blur {
-webkit-backdrop-filter: none;
backdrop-filter: none;
}
.kt-sayfa-blur-ust,
.kt-sayfa-blur-alt {
-webkit-mask-image: none;
mask-image: none;
}
}