pathfinder-ai/public/style.css

349 lines
7.1 KiB
CSS
Raw Normal View History

2026-09-09 22:40:35 +00:00
:root {
--bg: #0f172a;
--panel: #1e293b;
--grid-bg: #1e293b;
--cell: #334155;
--cell-border: #1e293b;
--wall: #0f172a;
--start: #22c55e;
--goal: #ef4444;
--visited: #38bdf8;
--current: #7dd3fc;
--path: #facc15;
--path-glow: rgba(250, 204, 21, 0.9);
--text: #e2e8f0;
--muted: #94a3b8;
}
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
background: radial-gradient(circle at 20% 10%, #1e293b, #0f172a 70%);
min-height: 100vh;
font-family: 'Segoe UI', system-ui, sans-serif;
color: var(--text);
display: flex;
justify-content: center;
align-items: flex-start;
padding: 20px;
}
.container {
max-width: 920px;
width: 100%;
}
header { text-align: center; margin-bottom: 16px; }
h1 {
font-size: 2.2rem;
background: linear-gradient(135deg, #22d3ee, #a78bfa);
-webkit-background-clip: text;
background-clip: text;
-webkit-text-fill-color: transparent;
letter-spacing: 0.5px;
}
.subtitle {
color: var(--muted);
margin-top: 4px;
font-size: 0.95rem;
}
.controls {
display: flex;
flex-wrap: wrap;
gap: 10px;
align-items: center;
justify-content: center;
background: var(--panel);
border: 1px solid #334155;
border-radius: 12px;
padding: 12px;
margin-bottom: 12px;
}
.btn {
border: none;
border-radius: 8px;
padding: 10px 16px;
font-size: 0.95rem;
font-weight: 600;
cursor: pointer;
transition: transform 0.1s ease, box-shadow 0.2s ease, opacity 0.2s;
color: #fff;
}
.btn:active { transform: scale(0.97); }
.btn:disabled { opacity: 0.5; cursor: not-allowed; }
.btn-primary {
background: linear-gradient(135deg, #0ea5e9, #6366f1);
box-shadow: 0 4px 15px rgba(99, 102, 241, 0.4);
}
.btn-primary:hover:not(:disabled) {
box-shadow: 0 6px 22px rgba(99, 102, 241, 0.6);
transform: translateY(-1px);
}
.btn-secondary {
background: #475569;
}
.btn-secondary:hover:not(:disabled) {
background: #64748b;
}
.speed-wrap {
display: flex;
align-items: center;
gap: 6px;
margin-left: auto;
color: var(--muted);
font-size: 0.85rem;
}
.speed-wrap input[type="range"] {
accent-color: #22d3ee;
cursor: pointer;
}
#speed-value {
min-width: 20px;
text-align: center;
font-weight: 700;
color: var(--text);
}
.stats {
display: flex;
flex-wrap: wrap;
gap: 16px;
align-items: center;
justify-content: center;
margin-bottom: 12px;
font-size: 0.85rem;
color: var(--muted);
}
.stat {
display: flex;
align-items: center;
gap: 6px;
}
.dot { width: 12px; height: 12px; border-radius: 3px; display: inline-block; }
.dot-start { background: var(--start); }
.dot-goal { background: var(--goal); }
.grid-wrap {
background: var(--panel);
border: 1px solid #334155;
border-radius: 12px;
padding: 12px;
overflow-x: auto;
}
.grid {
display: grid;
grid-template-columns: repeat(25, 1fr);
gap: 1px;
background: var(--cell-border);
margin: 0 auto;
user-select: none;
-webkit-user-select: none;
touch-action: none;
max-width: 640px;
}
.cell {
aspect-ratio: 1 / 1;
background: var(--cell);
position: relative;
cursor: crosshair;
border-radius: 2px;
transition: background 0.05s ease, box-shadow 0.15s ease;
min-width: 8px;
}
.cell:hover { filter: brightness(1.2); }
.cell.wall {
background: var(--wall);
box-shadow: inset 0 0 0 1px #0f172a;
}
.cell.wall::after {
content: '';
position: absolute;
inset: 0;
background: repeating-linear-gradient(
45deg,
transparent,
transparent 3px,
rgba(15, 23, 42, 0.85) 3px,
rgba(15, 23, 42, 0.85) 5px
);
}
.cell.start {
background: var(--start);
cursor: grab;
box-shadow: 0 0 12px rgba(34, 197, 94, 0.5);
}
.cell.start::after {
content: '🟢';
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: clamp(10px, 2.2vw, 18px);
}
.cell.start.dragging { cursor: grabbing; filter: brightness(1.3); }
.cell.goal {
background: var(--goal);
cursor: grab;
box-shadow: 0 0 12px rgba(239, 68, 68, 0.5);
}
.cell.goal::after {
content: '🎯';
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: clamp(10px, 2.2vw, 18px);
}
.cell.goal.dragging { cursor: grabbing; filter: brightness(1.3); }
.cell.visited {
background: var(--visited);
animation: popIn 0.2s ease;
}
.cell.current {
background: var(--current);
box-shadow: 0 0 8px rgba(125, 211, 252, 0.8);
animation: pulseCurrent 0.4s ease-in-out infinite alternate;
}
.cell.path {
background: var(--path);
animation: pathGlow 1s ease-in-out infinite alternate;
z-index: 2;
}
.cell.path::before {
content: '✦';
position: absolute;
inset: 0;
display: flex;
align-items: center;
justify-content: center;
font-size: clamp(8px, 1.8vw, 14px);
color: #7a5b00;
}
@keyframes popIn {
0% { transform: scale(0.8); opacity: 0.5; }
100% { transform: scale(1); opacity: 1; }
}
@keyframes pulseCurrent {
0% { filter: brightness(1); }
100% { filter: brightness(1.4); }
}
@keyframes pathGlow {
0% { box-shadow: 0 0 6px var(--path-glow); }
100% { box-shadow: 0 0 18px var(--path-glow), 0 0 30px var(--path-glow); }
}
/* ─── Responsive ─── */
@media (max-width: 700px) {
.grid-wrap { padding: 6px; }
.cell { border-radius: 1px; }
h1 { font-size: 1.6rem; }
.controls { gap: 6px; }
.btn { padding: 8px 10px; font-size: 0.8rem; }
.legend { font-size: 0.7rem; flex-wrap: wrap; }
}
/* ─── Toast (Yol Bulunamadı — kırmızı neon) ─── */
.toast {
position: fixed;
top: 24px;
left: 50%;
transform: translateX(-50%) translateY(-120%);
background: rgba(127, 29, 29, 0.95);
border: 2px solid #ff4d4d;
border-radius: 14px;
padding: 18px 28px;
color: #fff;
text-align: center;
font-weight: 700;
font-size: 1.2rem;
z-index: 999;
box-shadow: 0 0 20px rgba(255, 77, 77, 0.8), 0 0 60px rgba(255, 0, 0, 0.4);
animation: neonToast 1.2s ease-in-out infinite alternate;
transition: transform 0.4s cubic-bezier(0.18, 0.89, 0.32, 1.28), opacity 0.3s ease;
pointer-events: none;
max-width: 90vw;
opacity: 0;
}
.toast.show {
transform: translateX(-50%) translateY(0);
opacity: 1;
}
.toast-icon { font-size: 1.8rem; display: block; margin-bottom: 4px; }
.toast-sub {
font-weight: 400;
font-size: 0.85rem;
color: #ffd6d6;
margin-top: 8px;
}
@keyframes neonToast {
0% {
box-shadow: 0 0 15px rgba(255, 77, 77, 0.7), 0 0 40px rgba(255, 0, 0, 0.3);
border-color: #ff4d4d;
}
100% {
box-shadow: 0 0 30px rgba(255, 77, 77, 1), 0 0 80px rgba(255, 0, 0, 0.7);
border-color: #ffdddd;
}
}
/* ─── Legend ─── */
.legend {
display: flex;
flex-wrap: wrap;
gap: 14px;
justify-content: center;
margin-top: 14px;
font-size: 0.8rem;
color: var(--muted);
user-select: none;
}
.legend-item {
display: flex;
align-items: center;
gap: 6px;
}
.legend-swatch {
width: 16px;
height: 16px;
border-radius: 4px;
display: inline-block;
}
.wall-swatch { background: #0f172a; border: 1px solid #334155; }
.start-swatch { background: var(--start); }
.goal-swatch { background: var(--goal); }
.visited-swatch { background: var(--visited); }
.current-swatch { background: var(--current); }
.path-swatch { background: var(--path); }