Files
kolaytercih/src/app/globals.css
bilalgursen 3c995402c6 feat(ui): Arc bileşenleri, landing bölümleri ve bildirim yığını
Sonner/vaul yerine kendi bildirim yığını ve alt sayfa; çip grubu, kart
destesi, kaydırma eylemi, yazı dönüşümü, bölme tutamacı; landing'e program
duvarı, süzülen haplar ve veri akışı; yaylar tek dosyada (lib/hareket.ts).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-07 17:12:53 +03:00

487 lines
15 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);
/* Harita il zeminleri (tercih-haritasi, yurtdisi-haritalar) */
--kt-harita-secili: oklch(0.97 0.014 254.6); /* blue-50 */
--kt-harita-dolu: oklch(0.882 0.059 254.1); /* blue-200 */
}
/* Karanlık mod (DESIGN.md §2.3). Bileşenlere `dark:` sınıfı yazılmaz; tema
palet token'larını çevirerek çalışır: slate ölçeği ters döner (50 = sayfa
zemini, 900 = başlık metni), yüzeyler `bg-card`'dan gelir, renkli açık
zeminler (orange-50, amber-50…) koyu tona, koyu renkli metinler (amber-900,
emerald-800…) açık tona iner. `text-white` ve dolu marka zeminleri
(orange-500, primary, emerald-500…) iki temada aynıdır.
`@media screen`: yazdırma çıktısı tema ne olursa olsun açık kalır. */
@media screen {
.dark {
--background: oklch(0.21 0.03 262);
--foreground: oklch(0.95 0.008 250);
--card: oklch(0.21 0.03 262);
--card-foreground: oklch(0.95 0.008 250);
--popover: oklch(0.21 0.03 262);
--popover-foreground: oklch(0.95 0.008 250);
--primary-foreground: oklch(0.985 0 0);
--secondary: oklch(0.26 0.03 262);
--secondary-foreground: oklch(0.95 0.008 250);
--muted: oklch(0.26 0.03 262);
--muted-foreground: oklch(0.68 0.04 257);
--accent: oklch(0.26 0.03 262);
--accent-foreground: oklch(0.95 0.008 250);
--destructive: oklch(0.704 0.191 22.216);
--border: oklch(0.31 0.03 260);
--input: oklch(0.31 0.03 260);
--sidebar: oklch(0.21 0.03 262);
--sidebar-foreground: oklch(0.95 0.008 250);
--sidebar-primary: oklch(0.623 0.188 259.8);
--sidebar-primary-foreground: oklch(0.985 0 0);
--sidebar-accent: oklch(0.26 0.03 262);
--sidebar-accent-foreground: oklch(0.95 0.008 250);
--sidebar-border: oklch(0.31 0.03 260);
--sidebar-ring: oklch(0.556 0 0);
/* Nötr ölçek: ters çevrilmiş slate. 950 çevrilmez — koyu vurgu
yüzeyinin (kt-koyu-yuzey) zeminidir, iki temada koyu kalır. */
--color-slate-50: oklch(0.165 0.025 262);
--color-slate-100: oklch(0.26 0.03 262);
--color-slate-200: oklch(0.31 0.03 260);
--color-slate-300: oklch(0.4 0.035 258);
--color-slate-400: oklch(0.6 0.04 257);
--color-slate-500: oklch(0.68 0.04 257);
--color-slate-600: oklch(0.76 0.035 256);
--color-slate-700: oklch(0.83 0.025 255);
--color-slate-800: oklch(0.89 0.015 255);
--color-slate-900: oklch(0.95 0.008 250);
/* Renkli açık zeminler ve kenarlıklar → koyu ton */
--color-orange-50: oklch(0.27 0.05 50);
--color-orange-100: oklch(0.32 0.07 50);
--color-orange-200: oklch(0.45 0.1 48);
--color-amber-50: oklch(0.27 0.045 80);
--color-amber-100: oklch(0.32 0.06 80);
--color-amber-200: oklch(0.45 0.09 78);
--color-emerald-50: oklch(0.26 0.04 165);
--color-emerald-100: oklch(0.31 0.055 165);
--color-emerald-200: oklch(0.42 0.08 165);
--color-red-50: oklch(0.26 0.05 25);
--color-red-100: oklch(0.31 0.07 25);
--color-red-200: oklch(0.42 0.1 25);
--color-rose-50: oklch(0.26 0.05 12);
--color-rose-100: oklch(0.31 0.07 12);
--color-sky-50: oklch(0.26 0.04 235);
--color-sky-100: oklch(0.31 0.055 235);
--color-sky-200: oklch(0.42 0.07 235);
--color-violet-50: oklch(0.27 0.05 293);
/* Koyu renkli metinler → açık ton (koyu zeminde okunsun) */
--color-orange-700: oklch(0.8 0.13 55);
--color-amber-700: oklch(0.84 0.13 85);
--color-amber-800: oklch(0.88 0.11 88);
--color-amber-900: oklch(0.92 0.08 90);
--color-emerald-600: oklch(0.74 0.15 163);
--color-emerald-700: oklch(0.8 0.13 163);
--color-emerald-800: oklch(0.86 0.11 164);
--color-emerald-900: oklch(0.91 0.08 165);
--color-red-600: oklch(0.7 0.19 24);
--color-red-700: oklch(0.77 0.15 22);
--color-red-800: oklch(0.84 0.11 20);
--color-red-900: oklch(0.9 0.07 18);
--color-rose-700: oklch(0.8 0.12 12);
--color-rose-800: oklch(0.86 0.09 10);
--color-sky-600: oklch(0.74 0.13 235);
--kt-harita-secili: oklch(0.27 0.05 258);
--kt-harita-dolu: oklch(0.42 0.1 258);
}
/* Koyu vurgu yüzeyi (CTA bandı, arama funnel kartı): zemini slate-950,
içindeki açık slate metinler iki temada aynı kalsın diye ölçek burada
açık temadaki değerlerine geri döner. */
.dark .kt-koyu-yuzey {
--color-slate-50: oklch(0.984 0.003 247.858);
--color-slate-100: oklch(0.968 0.007 247.896);
--color-slate-200: oklch(0.929 0.013 255.508);
--color-slate-300: oklch(0.869 0.022 252.894);
--color-slate-400: oklch(0.704 0.04 256.788);
--color-slate-500: oklch(0.554 0.046 257.417);
--color-slate-600: oklch(0.446 0.043 257.281);
--color-slate-700: oklch(0.372 0.044 257.287);
--color-slate-800: oklch(0.279 0.041 260.031);
--color-slate-900: oklch(0.208 0.042 265.755);
}
/* El çizimi şemalar (mermaid) açık kâğıt için çizilir: düğüm renkleri
tanımın içinde sabit. Koyu temada şema beyaz bir kâğıdın üstünde durur. */
.dark .kt-sema-kagit {
padding: 0.75rem;
border-radius: 1rem;
background: #fff;
}
/* Tek renk koyu logolar (URAP): koyu temada açığa çevrilir; yerleşim
oynamaz. Çok renkli marka logolarında kullanılmaz (renk bozulur). */
.dark .kt-koyu-cevir {
filter: invert(1) hue-rotate(180deg);
}
/* Çok renkli, koyu metinli logo görselleri (iyzico bandı: kart markaları)
beyaz hap üstünde durur. */
.dark .kt-acik-logo {
box-sizing: content-box;
padding: 0.5rem 0.875rem;
border-radius: 0.75rem;
background: #fff;
}
}
/* 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, var(--color-slate-50));
-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, var(--color-slate-50));
-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;
}
}
/* 24'lük piksel listede dokunma nabzı (bkz. components/piksel-liste.tsx):
basılan kare ve komşuları kısa bir büyüyüp söner. Tek seferlik, 420 ms. */
@keyframes kt-piksel-nabiz {
0% {
transform: scale(1);
}
35% {
transform: scale(1.3);
}
100% {
transform: scale(1);
}
}
.kt-piksel-nabiz {
animation: kt-piksel-nabiz 0.42s cubic-bezier(0.23, 1, 0.32, 1);
}
/* Şehir haritasında (sehir-piksel-haritasi.tsx) ilin kareleri sırayla
belirir; her karenin gecikmesi inline (35 ms × sıra). DESIGN.md §4.17. */
@keyframes kt-piksel-belir {
from {
opacity: 0;
transform: scale(0.6);
}
to {
opacity: 1;
transform: scale(1);
}
}
.kt-piksel-belir {
transform-box: fill-box;
transform-origin: center;
animation: kt-piksel-belir 0.42s cubic-bezier(0.23, 1, 0.32, 1) both;
}
/* Harita görünüme girene kadar bekler (PikselSvg data-gorundu yazar). */
.kt-piksel-harita:not([data-gorundu]) .kt-piksel-belir {
animation-play-state: paused;
}
@media (prefers-reduced-motion: reduce) {
.kt-piksel-belir {
animation: none;
}
}
/* Veri akışı (veri-akisi.tsx, DESIGN.md §4.28): kare, çizgi boyunca karodan
merkeze akar. Uç noktalar satır içi --x1/--y1/--x2/--y2 ile gelir (SVG
içinde px = viewBox birimi). Yalnız ekrandayken oynar. */
@keyframes kt-akis {
0% {
translate: var(--x1) var(--y1);
opacity: 0;
}
12%,
82% {
opacity: 1;
}
100% {
translate: var(--x2) var(--y2);
opacity: 0;
}
}
.kt-akis-kare {
translate: var(--x1) var(--y1);
opacity: 0;
animation: kt-akis 2.4s cubic-bezier(0.45, 0, 0.55, 1) infinite;
animation-play-state: paused;
}
[data-oynuyor] .kt-akis-kare {
animation-play-state: running;
}
@media (prefers-reduced-motion: reduce) {
.kt-akis-kare {
animation: none;
}
}