349 lines
7.1 KiB
CSS
349 lines
7.1 KiB
CSS
|
|
: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); }
|