Files

639 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.
/* =====================================================================
Numex Görev Paneli — stil dosyası
---------------------------------------------------------------------
Tema : modern karanlık (dark) tema, tek renk aksan (turkuaz)
Yerleşim : 2 kolonlu grid (görevler | canlı konsol)
Responsive : 1024px altında tek kolon, mobilde küçülen tipografi
Erişilebilirlik: dokunma hedefleri >= 44px, yeterli kontrast
===================================================================== */
/* ---------- Tema değişkenleri (tek yerden renk yönetimi) ---------- */
:root {
--bg-0: #080b12; /* en dip arka plan */
--bg-1: #0e131d; /* panel arka planı */
--bg-2: #141b28; /* kart / input yüzeyi */
--bg-3: #1b2433; /* hover yüzeyi */
--border: #243044; /* ince çerçeve */
--text-0: #e8eef8; /* ana metin */
--text-1: #a9b6cb; /* ikincil metin */
--text-2: #6b7a94; /* soluk metin */
--accent: #22d3ee; /* turkuaz aksan */
--accent-soft: rgba(34, 211, 238, 0.14);
--pending: #fbbf24; /* bekliyor - sarı */
--progress: #60a5fa; /* devam ediyor - mavi */
--completed: #34d399; /* tamamlandı - yeşil */
--danger: #f87171; /* hata - kırmızı */
--radius: 12px;
--radius-sm: 8px;
--shadow: 0 10px 30px rgba(0, 0, 0, 0.35);
/* Responsive tipografi: küçük ekranda küçük, büyükte büyür */
--fs-xs: clamp(0.68rem, 0.64rem + 0.2vw, 0.76rem);
--fs-sm: clamp(0.8rem, 0.76rem + 0.2vw, 0.88rem);
--fs-md: clamp(0.9rem, 0.85rem + 0.25vw, 1rem);
--fs-lg: clamp(1.1rem, 1rem + 0.5vw, 1.35rem);
--fs-xl: clamp(1.35rem, 1.15rem + 0.9vw, 1.85rem);
}
/* ---------- Temel sıfırlama ---------- */
*,
*::before,
*::after {
box-sizing: border-box;
}
html,
body {
margin: 0;
padding: 0;
}
body {
min-height: 100vh;
/* DİKKAT: overflow:hidden KULLANILMADI — içerik taşarsa dikey scroll gelsin */
overflow-y: auto;
overflow-x: hidden;
font-family: "Segoe UI", system-ui, -apple-system, "Helvetica Neue", Arial, sans-serif;
font-size: var(--fs-md);
line-height: 1.55;
color: var(--text-0);
background:
radial-gradient(1100px 600px at 12% -8%, rgba(34, 211, 238, 0.10), transparent 60%),
radial-gradient(900px 500px at 100% 0%, rgba(96, 165, 250, 0.08), transparent 55%),
var(--bg-0);
/* Uzun konsol listelerinde yumuşak kaydırma */
scroll-behavior: smooth;
}
/* Ekran okuyucu için gizli ama odaklanabilir etiketler */
.visually-hidden {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border: 0;
}
/* =====================================================================
ÜST BAR
===================================================================== */
.topbar {
display: flex;
flex-wrap: wrap;
gap: 1rem;
align-items: center;
justify-content: space-between;
padding: clamp(0.9rem, 2vw, 1.5rem) clamp(1rem, 3vw, 2rem);
border-bottom: 1px solid var(--border);
background: rgba(10, 14, 21, 0.75);
backdrop-filter: blur(10px);
position: sticky;
top: 0;
z-index: 20;
}
.brand {
display: flex;
align-items: center;
gap: 0.85rem;
min-width: 0;
}
.brand-logo {
display: grid;
place-items: center;
width: 44px; /* dokunma/hedef boyutu alt sınır */
height: 44px;
flex-shrink: 0;
border-radius: var(--radius-sm);
font-size: 1.35rem;
color: #041016;
background: linear-gradient(135deg, var(--accent), #4ade80);
box-shadow: 0 0 22px rgba(34, 211, 238, 0.35);
}
.brand h1 {
margin: 0;
font-size: var(--fs-xl);
letter-spacing: -0.02em;
line-height: 1.15;
}
.brand-sub {
margin: 0.15rem 0 0;
font-size: var(--fs-xs);
color: var(--text-2);
}
/* WebSocket durum rozeti */
.status-chip {
display: inline-flex;
align-items: center;
gap: 0.55rem;
min-height: 44px;
padding: 0 1rem;
border-radius: 999px;
border: 1px solid var(--border);
background: var(--bg-1);
font-size: var(--fs-sm);
color: var(--text-1);
white-space: nowrap;
}
.status-chip .dot {
width: 9px;
height: 9px;
border-radius: 50%;
background: var(--pending);
box-shadow: 0 0 10px currentColor;
}
/* Bağlantı durumuna göre renk (app.js data-state değiştirir) */
.status-chip[data-state="open"] { border-color: rgba(52, 211, 153, 0.4); color: var(--completed); }
.status-chip[data-state="open"] .dot { background: var(--completed); }
.status-chip[data-state="connecting"] .dot { background: var(--pending); animation: pulse 1.2s infinite; }
.status-chip[data-state="closed"] { border-color: rgba(248, 113, 113, 0.4); color: var(--danger); }
.status-chip[data-state="closed"] .dot { background: var(--danger); }
@keyframes pulse {
0%, 100% { opacity: 1; transform: scale(1); }
50% { opacity: 0.35; transform: scale(0.75); }
}
/* =====================================================================
İSTATİSTİK KARTLARI
===================================================================== */
.stats {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
gap: clamp(0.6rem, 1.5vw, 1rem);
padding: clamp(0.9rem, 2vw, 1.5rem) clamp(1rem, 3vw, 2rem) 0;
}
.stat-card {
display: flex;
flex-direction: column;
gap: 0.25rem;
padding: clamp(0.7rem, 1.5vw, 1rem) clamp(0.8rem, 2vw, 1.15rem);
border: 1px solid var(--border);
border-left: 3px solid var(--accent);
border-radius: var(--radius);
background: linear-gradient(180deg, var(--bg-1), rgba(14, 19, 29, 0.6));
}
.stat-card.accent-pending { border-left-color: var(--pending); }
.stat-card.accent-progress { border-left-color: var(--progress); }
.stat-card.accent-completed { border-left-color: var(--completed); }
.stat-label {
font-size: var(--fs-xs);
text-transform: uppercase;
letter-spacing: 0.08em;
color: var(--text-2);
}
.stat-value {
font-size: var(--fs-lg);
font-variant-numeric: tabular-nums;
}
/* =====================================================================
ANA YERLEŞİM (2 kolon → mobilde 1 kolon)
===================================================================== */
.layout {
display: grid;
grid-template-columns: minmax(0, 1.15fr) minmax(0, 0.85fr);
gap: clamp(0.8rem, 2vw, 1.4rem);
/* Geniş ekranda taşmasın: %95vw sınırı */
max-width: min(1500px, 95vw);
margin: 0 auto;
padding: clamp(1rem, 2.5vw, 1.75rem) clamp(1rem, 3vw, 2rem) 2rem;
align-items: start;
}
/* Tablet ve altı: konsol alt alta iner */
@media (max-width: 1024px) {
.layout {
grid-template-columns: 1fr;
max-width: 95vw;
}
}
/* Küçük telefon: boşlukları daralt */
@media (max-width: 560px) {
.layout {
padding-left: 0.75rem;
padding-right: 0.75rem;
}
.topbar {
padding-left: 0.75rem;
padding-right: 0.75rem;
}
}
/* Panel yüzeyi */
.panel {
min-width: 0; /* grid içinde taşmayı engeller */
padding: clamp(0.9rem, 2vw, 1.35rem);
border: 1px solid var(--border);
border-radius: var(--radius);
background: linear-gradient(180deg, rgba(16, 22, 33, 0.95), rgba(11, 15, 23, 0.95));
box-shadow: var(--shadow);
}
.panel h2 {
margin: 0 0 0.9rem;
font-size: var(--fs-lg);
letter-spacing: -0.01em;
}
/* =====================================================================
GÖREV FORMU
===================================================================== */
.task-form {
display: grid;
grid-template-columns: minmax(0, 1fr) auto auto;
gap: 0.6rem;
margin-bottom: 0.75rem;
}
/* Mobilde alanlar alt alta */
@media (max-width: 560px) {
.task-form {
grid-template-columns: 1fr;
}
}
.task-form input[type="text"],
.task-form select {
min-height: 44px; /* WCAG dokunma hedefi */
padding: 0.6rem 0.85rem;
font-size: var(--fs-md);
font-family: inherit;
color: var(--text-0);
background: var(--bg-2);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
outline: none;
transition: border-color 0.15s, box-shadow 0.15s;
min-width: 0;
}
.task-form input[type="text"]::placeholder {
color: var(--text-2);
}
.task-form input[type="text"]:focus,
.task-form select:focus {
border-color: var(--accent);
box-shadow: 0 0 0 3px var(--accent-soft);
}
.task-form select {
cursor: pointer;
/* Açılır liste koyu temada okunur kalsın */
color-scheme: dark;
}
/* ---------- Butonlar ---------- */
.btn {
display: inline-flex;
align-items: center;
justify-content: center;
gap: 0.4rem;
min-height: 44px; /* dokunma hedefi */
padding: 0.6rem 1.1rem;
font-family: inherit;
font-size: var(--fs-sm);
font-weight: 600;
color: var(--text-0);
background: var(--bg-3);
border: 1px solid var(--border);
border-radius: var(--radius-sm);
cursor: pointer;
transition: transform 0.1s, background 0.15s, border-color 0.15s, opacity 0.15s;
}
.btn:hover { background: #22303f; border-color: #33455f; }
.btn:active { transform: translateY(1px); }
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
.btn:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.btn-primary {
color: #04252c;
background: linear-gradient(135deg, var(--accent), #34d399);
border-color: transparent;
}
.btn-primary:hover { filter: brightness(1.08); background: linear-gradient(135deg, var(--accent), #34d399); }
.btn-ghost {
background: transparent;
color: var(--text-1);
}
/* Form altı bilgi/hata mesajı */
.form-message {
min-height: 1.2rem;
margin-bottom: 0.6rem;
font-size: var(--fs-sm);
color: var(--text-2);
}
.form-message.is-error { color: var(--danger); }
.form-message.is-success { color: var(--completed); }
/* =====================================================================
GÖREV KARTLARI
===================================================================== */
.task-list {
display: flex;
flex-direction: column;
gap: 0.7rem;
max-height: min(60vh, 640px);
overflow-y: auto;
padding-right: 0.25rem; /* scrollbar payı */
overscroll-behavior: contain; /* içeride kaydırırken sayfa zıplamasın */
}
.task-card {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 0.75rem;
align-items: center;
padding: 0.85rem 1rem;
border: 1px solid var(--border);
border-left: 3px solid var(--pending);
border-radius: var(--radius-sm);
background: var(--bg-2);
animation: kartGir 0.22s ease-out;
}
@keyframes kartGir {
from { opacity: 0; transform: translateY(-6px); }
to { opacity: 1; transform: translateY(0); }
}
/* Duruma göre sol şerit rengi */
.task-card[data-status="pending"] { border-left-color: var(--pending); }
.task-card[data-status="in_progress"] { border-left-color: var(--progress); }
.task-card[data-status="completed"] { border-left-color: var(--completed); }
.task-card.is-completed .task-title {
text-decoration: line-through;
color: var(--text-2);
}
.task-main { min-width: 0; }
.task-title {
margin: 0 0 0.3rem;
font-size: var(--fs-md);
font-weight: 600;
word-break: break-word; /* uzun başlık layout'u bozmasın */
}
.task-meta {
display: flex;
flex-wrap: wrap;
gap: 0.5rem 0.75rem;
align-items: center;
font-size: var(--fs-xs);
color: var(--text-2);
}
/* Durum seçici (kart üzerinden hızlı güncelleme) */
.status-select {
min-height: 32px;
padding: 0.25rem 0.5rem;
font-family: inherit;
font-size: var(--fs-xs);
color: var(--text-0);
background: var(--bg-3);
border: 1px solid var(--border);
border-radius: 6px;
cursor: pointer;
color-scheme: dark;
}
.task-actions {
display: flex;
align-items: center;
gap: 0.45rem;
}
/* Silme butonu: ikon + erişilebilir ad */
.icon-btn {
display: inline-grid;
place-items: center;
width: 44px;
height: 44px;
flex-shrink: 0;
font-size: 1rem;
color: var(--danger);
background: rgba(248, 113, 113, 0.08);
border: 1px solid rgba(248, 113, 113, 0.3);
border-radius: var(--radius-sm);
cursor: pointer;
transition: background 0.15s, transform 0.1s;
}
.icon-btn:hover { background: rgba(248, 113, 113, 0.2); }
.icon-btn:active { transform: scale(0.94); }
.icon-btn:focus-visible { outline: 2px solid var(--danger); outline-offset: 2px; }
.empty-state {
margin: 1.2rem 0;
text-align: center;
font-size: var(--fs-sm);
color: var(--text-2);
}
.empty-state.is-error { color: var(--danger); }
/* =====================================================================
CANLI KONSOL (sağ panel)
===================================================================== */
.console-head {
display: flex;
flex-wrap: wrap;
gap: 0.6rem;
align-items: center;
justify-content: space-between;
margin-bottom: 0.75rem;
}
.console-head h2 { margin: 0; }
.console-actions {
display: flex;
flex-wrap: wrap;
gap: 0.5rem;
align-items: center;
}
.autoscroll-toggle {
display: inline-flex;
align-items: center;
gap: 0.45rem;
min-height: 44px;
padding: 0 0.6rem;
font-size: var(--fs-xs);
color: var(--text-1);
border: 1px solid var(--border);
border-radius: 999px;
cursor: pointer;
user-select: none;
}
/* Checkbox'ı da makul boyuta çek (varsayılan çok küçük) */
.autoscroll-toggle input[type="checkbox"] {
width: 18px;
height: 18px;
accent-color: var(--accent);
cursor: pointer;
}
/* Terminal görünümlü konsol alanı */
.console {
height: min(52vh, 460px);
overflow-y: auto;
overscroll-behavior: contain;
padding: 0.85rem;
font-family: "Cascadia Mono", "Consolas", "SFMono-Regular", "Courier New", monospace;
font-size: var(--fs-sm);
line-height: 1.6;
background: #05080d;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
}
/* Tek bir log satırı */
.log-line {
display: grid;
grid-template-columns: auto auto minmax(0, 1fr);
gap: 0.6rem;
padding: 0.18rem 0;
border-bottom: 1px solid rgba(36, 48, 68, 0.45);
animation: logGir 0.18s ease-out;
word-break: break-word;
}
@keyframes logGir {
from { opacity: 0; transform: translateX(6px); }
to { opacity: 1; transform: translateX(0); }
}
.log-time { color: var(--text-2); white-space: nowrap; }
.log-level { font-weight: 700; white-space: nowrap; text-transform: uppercase; }
.log-msg { color: var(--text-1); min-width: 0; }
.log-line[data-level="info"] .log-level { color: var(--accent); }
.log-line[data-level="warn"] .log-level { color: var(--pending); }
.log-line[data-level="error"] .log-level { color: var(--danger); }
.log-line[data-level="error"] .log-msg { color: #fecaca; }
/* Sistem bilgi satırları (bağlantı kuruldu/koptu) */
.log-line.is-system .log-level { color: var(--text-2); }
/* Metrik şeridi */
.console-metrics {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(120px, 1fr));
gap: 0.6rem;
margin-top: 0.75rem;
}
.metric {
display: flex;
flex-direction: column;
gap: 0.15rem;
padding: 0.55rem 0.7rem;
border: 1px solid var(--border);
border-radius: var(--radius-sm);
background: var(--bg-2);
}
.metric-label {
font-size: var(--fs-xs);
color: var(--text-2);
text-transform: uppercase;
letter-spacing: 0.06em;
}
.metric-value {
font-size: var(--fs-sm);
font-variant-numeric: tabular-nums;
color: var(--text-0);
}
/* =====================================================================
ALT BİLGİ
===================================================================== */
.footer {
padding: 1rem clamp(1rem, 3vw, 2rem) 2rem;
text-align: center;
font-size: var(--fs-xs);
color: var(--text-2);
}
.footer code {
padding: 0.1rem 0.35rem;
border-radius: 4px;
background: var(--bg-2);
border: 1px solid var(--border);
color: var(--text-1);
}
/* =====================================================================
İNCE KAYDIRMA ÇUBUĞU (koyu temaya uyumlu)
===================================================================== */
.console::-webkit-scrollbar,
.task-list::-webkit-scrollbar {
width: 9px;
}
.console::-webkit-scrollbar-track,
.task-list::-webkit-scrollbar-track {
background: transparent;
}
.console::-webkit-scrollbar-thumb,
.task-list::-webkit-scrollbar-thumb {
background: #2a374b;
border-radius: 999px;
}
.console::-webkit-scrollbar-thumb:hover,
.task-list::-webkit-scrollbar-thumb:hover {
background: #3a4c66;
}
/* Hareket azaltma tercihi olan kullanıcılar için animasyonları kapat */
@media (prefers-reduced-motion: reduce) {
*,
*::before,
*::after {
animation-duration: 0.01ms !important;
animation-iteration-count: 1 !important;
transition-duration: 0.01ms !important;
scroll-behavior: auto !important;
}
}