Files

581 lines
16 KiB
CSS
Raw Permalink 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.
/* =========================================================
PulseBoard — Bileşenler
Kart, buton, form, modal, toast, ilerleme, chip, empty state
========================================================= */
/* ---------- Kart ---------- */
.kart {
position: relative;
background: var(--yuzey);
border: 1px solid var(--cizgi);
border-radius: var(--r-lg);
backdrop-filter: var(--blur);
box-shadow: var(--golge-1);
padding: var(--bosluk-5);
transition: border-color var(--gecis), box-shadow var(--gecis), transform var(--gecis);
}
.kart-vurgulu::after {
content: "";
position: absolute;
inset: 0;
border-radius: inherit;
padding: 1px;
background: var(--aksan);
-webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
-webkit-mask-composite: xor;
mask-composite: exclude;
opacity: .55;
pointer-events: none;
}
.kart-baslik {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--bosluk-3);
margin-bottom: var(--bosluk-4);
}
.kart-baslik h2,
.kart-baslik h3 {
font-size: 1.02rem;
font-weight: 700;
letter-spacing: -.01em;
}
.kart-baslik .ipucu {
font-size: .8rem;
color: var(--metin-3);
font-weight: 500;
}
.bolum-basligi {
display: flex;
align-items: flex-end;
justify-content: space-between;
gap: var(--bosluk-4);
flex-wrap: wrap;
margin-bottom: var(--bosluk-5);
}
.bolum-basligi h2 {
font-size: 1.35rem;
font-weight: 750;
letter-spacing: -.025em;
}
.bolum-basligi p {
color: var(--metin-2);
font-size: .9rem;
margin-top: 4px;
}
/* ---------- Izgara ---------- */
.izgara { display: grid; gap: var(--bosluk-4); }
.izgara-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.izgara-3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.izgara-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.izgara-2-1 { grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr); }
.izgara-1-2 { grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr); }
/* ---------- Metrik kart ---------- */
.metrik {
padding: var(--bosluk-4) var(--bosluk-5);
display: flex;
flex-direction: column;
gap: 10px;
/* overflow: hidden DEĞİL — kart içeriği taşarsa kırpılmasın.
Dekoratif taşma gerekmez; metin/sayı her zaman okunabilir kalır. */
overflow: visible;
min-width: 0;
}
.metrik-ust {
display: flex;
align-items: center;
justify-content: space-between;
gap: var(--bosluk-3);
}
.metrik-etiket {
font-size: .78rem;
letter-spacing: .06em;
text-transform: uppercase;
color: var(--metin-3);
font-weight: 600;
}
.metrik-ikon {
width: 34px; height: 34px;
flex: none;
padding: 8px;
border-radius: 11px;
color: var(--teal);
background: rgba(45, 212, 191, .12);
border: 1px solid rgba(45, 212, 191, .2);
}
.metrik-ikon.mor { color: var(--mor); background: rgba(168, 85, 247, .12); border-color: rgba(168, 85, 247, .2); }
.metrik-ikon.mavi { color: var(--mavi); background: rgba(56, 189, 248, .12); border-color: rgba(56, 189, 248, .2); }
.metrik-ikon.sari { color: var(--sari); background: rgba(251, 191, 36, .12); border-color: rgba(251, 191, 36, .2); }
.metrik-deger {
font-size: 1.85rem;
font-weight: 780;
letter-spacing: -.035em;
line-height: 1.05;
font-variant-numeric: tabular-nums;
}
.metrik-deger small { font-size: .95rem; font-weight: 600; color: var(--metin-3); letter-spacing: 0; }
.metrik-alt {
display: flex;
align-items: center;
gap: 6px;
font-size: .82rem;
color: var(--metin-2);
}
.metrik-alt .ok-yukari { color: var(--yesil); }
.metrik-alt .ok-asagi { color: var(--kirmizi); }
.metrik-cizgi {
height: 3px;
border-radius: var(--r-full);
background: var(--cizgi-guclu);
overflow: hidden;
}
.metrik-cizgi > span {
display: block;
height: 100%;
border-radius: inherit;
background: var(--aksan);
transition: width var(--gecis-yavas);
}
/* ---------- Butonlar ---------- */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 8px;
padding: 10px 17px;
border-radius: var(--r-sm);
border: 1px solid var(--cizgi-guclu);
background: var(--yuzey-2);
color: var(--metin);
font-size: .9rem;
font-weight: 600;
white-space: nowrap;
transition: transform var(--gecis-hizli), box-shadow var(--gecis), background var(--gecis), border-color var(--gecis), opacity var(--gecis);
}
.btn svg { width: 17px; height: 17px; flex: none; }
.btn:hover { transform: translateY(-1px); border-color: var(--cizgi-guclu); background: var(--yuzey-yuksek); }
.btn:active { transform: translateY(0); }
.btn:disabled { opacity: .45; cursor: not-allowed; transform: none; }
.btn-ana {
background: var(--aksan);
color: #041a1c;
border-color: transparent;
box-shadow: var(--glow-teal);
}
.btn-ana:hover { box-shadow: 0 0 0 1px rgba(45, 212, 191, .35), 0 14px 34px -12px rgba(45, 212, 191, .6); }
.btn-sade { background: transparent; border-color: var(--cizgi); color: var(--metin-2); }
.btn-sade:hover { color: var(--metin); background: var(--yuzey-2); }
.btn-tehlike { color: var(--kirmizi); border-color: rgba(248, 113, 113, .35); background: rgba(248, 113, 113, .1); }
.btn-tehlike:hover { background: rgba(248, 113, 113, .18); border-color: rgba(248, 113, 113, .5); }
.btn-kucuk { padding: 7px 12px; font-size: .82rem; border-radius: var(--r-xs); }
.btn-blok { width: 100%; }
/* Dokunma hedefi WCAG 2.5.5: en az 44x44px (mobilde parmakla basılabilirlik) */
.ikon-btn {
width: 44px; height: 44px;
flex: none;
padding: 12px;
display: inline-flex;
align-items: center;
justify-content: center;
border-radius: var(--r-sm);
border: 1px solid var(--cizgi);
color: var(--metin-2);
background: var(--yuzey-2);
transition: color var(--gecis-hizli), background var(--gecis-hizli), border-color var(--gecis-hizli), transform var(--gecis-hizli);
}
.ikon-btn:hover { color: var(--metin); border-color: var(--cizgi-guclu); transform: translateY(-1px); }
.ikon-btn.tehlike:hover { color: var(--kirmizi); border-color: rgba(248, 113, 113, .45); }
.ikon-btn.kucuk { width: 44px; height: 44px; padding: 12px; border-radius: var(--r-xs); }
/* ---------- Form ---------- */
.form-satir { display: flex; flex-direction: column; gap: 7px; margin-bottom: var(--bosluk-4); }
.form-satir:last-child { margin-bottom: 0; }
.form-izgara { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--bosluk-4); }
.etiket {
font-size: .8rem;
font-weight: 600;
letter-spacing: .03em;
text-transform: uppercase;
color: var(--metin-3);
}
.girdi,
.secim,
.metin-alani {
width: 100%;
padding: 11px 13px;
border-radius: var(--r-sm);
border: 1px solid var(--cizgi);
background: var(--yuzey-2);
color: var(--metin);
font-size: .93rem;
transition: border-color var(--gecis-hizli), box-shadow var(--gecis-hizli), background var(--gecis-hizli);
}
.girdi::placeholder, .metin-alani::placeholder { color: var(--metin-3); }
.girdi:focus, .secim:focus, .metin-alani:focus {
outline: none;
border-color: rgba(45, 212, 191, .55);
box-shadow: 0 0 0 3px rgba(45, 212, 191, .14);
background: var(--yuzey-yuksek);
}
.secim {
appearance: none;
background-image: linear-gradient(45deg, transparent 50%, var(--metin-3) 50%), linear-gradient(135deg, var(--metin-3) 50%, transparent 50%);
background-position: calc(100% - 18px) calc(50% + 1px), calc(100% - 13px) calc(50% + 1px);
background-size: 5px 5px, 5px 5px;
background-repeat: no-repeat;
padding-right: 34px;
cursor: pointer;
}
.secim option { background: var(--zemin-2); color: var(--metin); }
.metin-alani { resize: vertical; min-height: 76px; }
.form-hata {
font-size: .82rem;
color: var(--kirmizi);
min-height: 1.1em;
}
.anahtar-alani {
display: flex;
align-items: center;
gap: 8px;
padding: 9px 12px;
border: 1px dashed var(--cizgi-guclu);
border-radius: var(--r-sm);
color: var(--metin-3);
font-size: .82rem;
font-family: var(--font-mono);
}
/* ---------- Segmented kontrol ---------- */
.segmentli {
display: inline-flex;
gap: 3px;
padding: 3px;
border-radius: var(--r-full);
border: 1px solid var(--cizgi);
background: var(--yuzey-2);
flex-wrap: wrap;
}
.segmentli button {
padding: 7px 14px;
border-radius: var(--r-full);
font-size: .83rem;
font-weight: 600;
color: var(--metin-2);
transition: background var(--gecis-hizli), color var(--gecis-hizli);
}
.segmentli button:hover { color: var(--metin); }
.segmentli button.aktif {
color: var(--metin);
background: var(--aksan-yumusak);
box-shadow: inset 0 0 0 1px var(--cizgi-guclu);
}
/* ---------- Chip / badge ---------- */
.chip {
display: inline-flex;
align-items: center;
gap: 6px;
padding: 3px 10px;
border-radius: var(--r-full);
font-size: .74rem;
font-weight: 650;
letter-spacing: .02em;
border: 1px solid var(--cizgi);
background: var(--yuzey-2);
color: var(--metin-2);
white-space: nowrap;
}
.chip .nokta { width: 7px; height: 7px; border-radius: 50%; background: currentColor; flex: none; }
.chip-dusuk { color: var(--mavi); border-color: rgba(56, 189, 248, .3); background: rgba(56, 189, 248, .1); }
.chip-orta { color: var(--sari); border-color: rgba(251, 191, 36, .3); background: rgba(251, 191, 36, .1); }
.chip-yuksek { color: var(--turuncu); border-color: rgba(251, 146, 60, .32); background: rgba(251, 146, 60, .12); }
.chip-acil { color: var(--kirmizi); border-color: rgba(248, 113, 113, .32); background: rgba(248, 113, 113, .12); }
.chip-basarili { color: var(--yesil); border-color: rgba(52, 211, 153, .32); background: rgba(52, 211, 153, .12); }
.chip-notr { color: var(--metin-2); }
/* ---------- İlerleme ---------- */
.ilerleme-bar {
height: 7px;
border-radius: var(--r-full);
background: var(--cizgi-guclu);
overflow: hidden;
}
.ilerleme-bar > .ilerleme-dolgu {
display: block;
height: 100%;
border-radius: inherit;
background: var(--aksan);
transition: width var(--gecis-yavas);
}
.ilerleme-bar.ince { height: 5px; }
/* ---------- Liste ---------- */
.liste { display: flex; flex-direction: column; gap: 10px; }
.liste-ogesi {
display: flex;
align-items: flex-start;
gap: var(--bosluk-3);
padding: 13px 15px;
border-radius: var(--r-md);
border: 1px solid var(--cizgi);
background: var(--yuzey-2);
transition: border-color var(--gecis-hizli), background var(--gecis-hizli), transform var(--gecis-hizli), opacity var(--gecis);
}
.liste-ogesi:hover { border-color: var(--cizgi-guclu); transform: translateX(2px); }
.liste-ogesi.tamam {
opacity: .58;
background: transparent;
}
.liste-ogesi.tamam .og-e-ad { text-decoration: line-through; color: var(--metin-3); }
.og-e-govde { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 7px; }
.og-e-ad { font-weight: 600; font-size: .96rem; word-break: break-word; }
.og-e-aciklama { font-size: .85rem; color: var(--metin-2); word-break: break-word; }
.og-e-meta { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.og-e-eylem { display: flex; align-items: center; gap: 6px; flex: none; }
/* Özel onay kutusu */
.onay {
width: 24px; height: 24px;
flex: none;
margin-top: 1px;
border-radius: 8px;
border: 1.8px solid var(--cizgi-guclu);
background: transparent;
display: inline-flex;
align-items: center;
justify-content: center;
color: transparent;
transition: background var(--gecis-hizli), border-color var(--gecis-hizli), color var(--gecis-hizli), transform var(--gecis-hizli);
}
.onay svg { width: 14px; height: 14px; stroke-width: 3; }
.onay:hover { border-color: var(--teal); transform: scale(1.06); }
.onay.secili {
background: var(--aksan);
border-color: transparent;
color: #04191b;
}
/* ---------- Empty state ---------- */
.bos-durum {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
gap: 10px;
padding: var(--bosluk-6) var(--bosluk-4);
border: 1px dashed var(--cizgi-guclu);
border-radius: var(--r-md);
background: linear-gradient(180deg, transparent, rgba(148, 176, 224, .04));
}
.bos-durum .bos-ikon {
width: 54px; height: 54px;
padding: 14px;
border-radius: 18px;
color: var(--teal);
background: rgba(45, 212, 191, .1);
border: 1px solid rgba(45, 212, 191, .2);
box-shadow: 0 10px 30px -18px rgba(45, 212, 191, .9);
}
.bos-durum h3 { font-size: 1.02rem; font-weight: 700; }
.bos-durum p { font-size: .89rem; color: var(--metin-2); max-width: 42ch; }
.bos-durum .btn { margin-top: var(--bosluk-2); }
/* ---------- Modal ---------- */
.modal-kok {
position: fixed;
inset: 0;
z-index: var(--z-modal);
display: flex;
align-items: center;
justify-content: center;
padding: var(--bosluk-4);
}
.modal-kok[hidden] { display: none; }
.modal-perde {
position: absolute;
inset: 0;
background: rgba(3, 7, 18, .68);
backdrop-filter: blur(4px);
animation: solma var(--gecis) both;
}
.modal {
position: relative;
width: 100%;
max-width: 520px;
max-height: min(88vh, 780px);
overflow-y: auto;
padding: var(--bosluk-5);
border-radius: var(--r-lg);
border: 1px solid var(--cizgi-guclu);
background: var(--yuzey-duz);
background-image: linear-gradient(160deg, rgba(45, 212, 191, .05), rgba(168, 85, 247, .05));
box-shadow: var(--golge-2);
animation: yukariGel var(--gecis-yavas) both;
}
.modal-genis { max-width: 620px; }
.modal-dar { max-width: 420px; }
.modal-ust {
display: flex;
align-items: flex-start;
justify-content: space-between;
gap: var(--bosluk-4);
margin-bottom: var(--bosluk-5);
}
.modal-ust h2 { font-size: 1.16rem; font-weight: 750; }
.modal-ust p { font-size: .87rem; color: var(--metin-2); margin-top: 4px; }
.modal-eylemler {
display: flex;
align-items: center;
justify-content: flex-end;
gap: var(--bosluk-3);
margin-top: var(--bosluk-5);
flex-wrap: wrap;
}
.modal-eylemler.iki-uclu { justify-content: space-between; }
/* ---------- Toast ---------- */
.toast-kok {
position: fixed;
right: var(--bosluk-5);
bottom: var(--bosluk-5);
z-index: var(--z-toast);
display: flex;
flex-direction: column;
gap: 10px;
max-width: min(360px, calc(100vw - 32px));
pointer-events: none;
}
.toast {
display: flex;
align-items: center;
gap: 11px;
padding: 12px 14px;
border-radius: var(--r-md);
border: 1px solid var(--cizgi-guclu);
background: var(--yuzey-duz);
box-shadow: var(--golge-2);
pointer-events: auto;
animation: yandanGel var(--gecis-yavas) both;
}
.toast.cikiyor { animation: yanaGit 180ms ease-in both; }
.toast-ikon {
width: 30px; height: 30px;
flex: none;
padding: 7px;
border-radius: 10px;
color: var(--teal);
background: rgba(45, 212, 191, .14);
}
.toast-basari .toast-ikon { color: var(--yesil); background: rgba(52, 211, 153, .14); }
.toast-hata .toast-ikon { color: var(--kirmizi); background: rgba(248, 113, 113, .14); }
.toast-bilgi .toast-ikon { color: var(--mavi); background: rgba(56, 189, 248, .14); }
.toast-govde { flex: 1; min-width: 0; font-size: .88rem; }
.toast-govde strong { display: block; font-size: .9rem; font-weight: 650; }
.toast-govde span { color: var(--metin-2); font-size: .82rem; }
.toast-islem {
flex: none;
font-size: .82rem;
font-weight: 700;
color: var(--teal);
padding: 5px 8px;
border-radius: var(--r-xs);
transition: background var(--gecis-hizli);
}
.toast-islem:hover { background: rgba(45, 212, 191, .12); }
/* ---------- Animasyonlar ---------- */
@keyframes solma { from { opacity: 0 } to { opacity: 1 } }
@keyframes yukariGel { from { opacity: 0; transform: translateY(14px) scale(.985) } to { opacity: 1; transform: none } }
@keyframes yandanGel { from { opacity: 0; transform: translateX(18px) } to { opacity: 1; transform: none } }
@keyframes yanaGit { to { opacity: 0; transform: translateX(18px) } }
.gorunum-girisi { animation: gorunumGiris var(--gecis-yavas) both; }
@keyframes gorunumGiris { from { opacity: 0; transform: translateY(9px) } to { opacity: 1; transform: none } }
@media (prefers-reduced-motion: reduce) {
*, *::before, *::after {
animation-duration: 1ms !important;
animation-iteration-count: 1 !important;
transition-duration: 1ms !important;
}
}
/* ---------- Tablo ---------- */
.tablo { width: 100%; border-collapse: collapse; font-size: .88rem; }
.tablo th, .tablo td { padding: 10px 12px; text-align: left; border-bottom: 1px solid var(--cizgi); }
.tablo th { font-size: .74rem; letter-spacing: .06em; text-transform: uppercase; color: var(--metin-3); font-weight: 650; }
.tablo tbody tr:last-child td { border-bottom: none; }
.tablo tbody tr:hover td { background: rgba(148, 176, 224, .05); }
.tablo td.sayi { font-variant-numeric: tabular-nums; font-weight: 650; }
.tablo-sarmal { overflow-x: auto; -webkit-overflow-scrolling: touch; }