cyberbeats/public/style.css

326 lines
9.3 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.

/* =========================================================
CYBER BEATS — Koyu Neon Stüdyo Teması
========================================================= */
:root {
--bg: #07070f;
--bg2: #0d0d1a;
--panel: #12121f;
--panel2: #1a1a2c;
--neon-cyan: #00f0ff;
--neon-pink: #ff2bd6;
--neon-green: #39ff88;
--neon-yellow: #ffe14d;
--neon-red: #ff3d5e;
--neon-orange: #ffa34d;
--neon-purple: #b26bff;
--text: #e8e8f4;
--dim: #6a6a85;
--grid-line: rgba(0, 240, 255, 0.12);
}
* { margin: 0; padding: 0; box-sizing: border-box; }
html, body { height: 100%; }
body {
font-family: 'Segoe UI', 'Helvetica Neue', Arial, sans-serif;
background: var(--bg);
color: var(--text);
overflow: hidden;
background-image:
radial-gradient(circle at 20% 10%, rgba(0, 240, 255, 0.08), transparent 40%),
radial-gradient(circle at 80% 90%, rgba(255, 43, 214, 0.08), transparent 45%),
radial-gradient(circle at 50% 50%, rgba(57, 255, 136, 0.04), transparent 60%);
}
.stage {
display: flex;
flex-direction: column;
max-width: 1040px;
min-height: 100vh;
margin: 0 auto;
padding: 20px 30px 14px;
background: linear-gradient(160deg, rgba(18, 18, 31, 0.92), rgba(10, 10, 20, 0.97));
border-left: 1px solid var(--grid-line);
border-right: 1px solid var(--grid-line);
box-shadow:
0 0 40px rgba(0, 240, 255, 0.07),
0 0 90px rgba(255, 43, 214, 0.05);
}
/* ---- Üst bar ---- */
.topbar {
display: flex;
justify-content: space-between;
align-items: center;
padding-bottom: 12px;
border-bottom: 1px solid var(--grid-line);
}
.brand { display: flex; align-items: center; gap: 12px; }
.brand-icon {
font-size: 26px;
color: var(--neon-cyan);
text-shadow: 0 0 14px var(--neon-cyan);
}
.brand h1 {
font-size: 22px;
letter-spacing: 3px;
font-weight: 800;
}
.brand h1 .accent { color: var(--neon-pink); text-shadow: 0 0 12px var(--neon-pink); }
.led-grid {
display: flex;
gap: 5px;
margin-left: 16px;
}
.led-grid .led {
width: 7px;
height: 7px;
border-radius: 50%;
background: rgba(120, 120, 160, 0.35);
transition: all 90ms ease;
}
.led-grid .led.on {
background: var(--neon-green);
box-shadow: 0 0 8px var(--neon-green);
}
.status { display: flex; align-items: center; gap: 8px; }
.play-indicator {
font-size: 14px;
color: var(--dim);
transition: all 150ms ease;
}
.play-indicator.running {
color: var(--neon-green);
text-shadow: 0 0 10px var(--neon-green);
animation: pulse 900ms infinite alternate;
}
@keyframes pulse { from { opacity: 0.45; } to { opacity: 1; } }
.status-text {
font-size: 12px;
letter-spacing: 2px;
color: var(--dim);
}
.status-text.running { color: var(--neon-green); }
/* ---- Kontroller ---- */
.controls {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
padding: 14px 0;
}
.transport { display: flex; align-items: center; gap: 10px; }
.btn {
border: none;
cursor: pointer;
font-family: inherit;
font-weight: 700;
border-radius: 10px;
transition: transform 80ms ease, box-shadow 150ms ease, background 150ms ease;
}
.btn:active { transform: translateY(1px) scale(0.97); }
.btn-play, .btn-stop {
width: 52px;
height: 48px;
font-size: 18px;
background: linear-gradient(145deg, #18d8e8, #0aa0c0);
color: #04222a;
box-shadow: 0 0 18px rgba(0, 240, 255, 0.35);
}
.btn-play:hover { box-shadow: 0 0 26px rgba(0, 240, 255, 0.7); }
.btn-play.running { background: linear-gradient(145deg, #ffe14d, #ffb300); color: #332500; box-shadow: 0 0 20px rgba(255, 225, 77, 0.6); }
.btn-stop { background: linear-gradient(145deg, #ff5166, #e02b44); color: #2b0006; box-shadow: 0 0 18px rgba(255, 61, 94, 0.4); }
.btn-clear {
padding: 0 16px;
height: 42px;
font-size: 12px;
letter-spacing: 1px;
background: rgba(255, 255, 255, 0.04);
color: var(--dim);
border: 1px solid rgba(255, 255, 255, 0.1);
}
.btn-clear:hover { border-color: var(--neon-red); color: var(--neon-red); box-shadow: 0 0 12px rgba(255, 61, 94, 0.3); }
.bpm-box {
display: flex;
align-items: center;
gap: 10px;
flex: 1;
justify-content: flex-end;
}
.bpm-label { font-size: 12px; letter-spacing: 2px; color: var(--dim); }
input[type="range"] {
-webkit-appearance: none;
appearance: none;
width: 210px;
height: 6px;
border-radius: 4px;
background: linear-gradient(90deg, #0aa0c0, var(--neon-pink));
outline: none;
cursor: pointer;
}
input[type="range"]::-webkit-slider-thumb {
-webkit-appearance: none;
appearance: none;
width: 18px;
height: 18px;
border-radius: 50%;
background: var(--text);
border: 2px solid var(--neon-pink);
box-shadow: 0 0 12px var(--neon-pink);
cursor: pointer;
}
.bpm-value {
font-size: 30px;
font-weight: 800;
min-width: 62px;
text-align: right;
color: var(--neon-cyan);
text-shadow: 0 0 12px rgba(0, 240, 255, 0.5);
font-variant-numeric: tabular-nums;
}
.bpm-unit { font-size: 12px; color: var(--dim); letter-spacing: 1px; }
/* ---- Adım başlıkları ---- */
.step-labels {
display: grid;
grid-template-columns: 108px repeat(16, 1fr);
gap: 5px;
padding: 0 2px 6px 2px;
}
.step-labels .step-num {
text-align: center;
font-size: 12px;
color: var(--dim);
font-variant-numeric: tabular-nums;
font-weight: 600;
}
.step-labels .step-num.group { color: var(--neon-cyan); text-shadow: 0 0 6px rgba(0, 240, 255, 0.4); }
/* ---- Matris sarmalayıcı ---- */
.matrix-wrap { display: flex; gap: 10px; align-items: stretch; }
.row-labels {
display: flex;
flex-direction: column;
gap: 5px;
width: 98px;
flex-shrink: 0;
}
.row-name {
height: 44px;
display: flex;
align-items: center;
justify-content: center;
font-size: 13px;
font-weight: 800;
letter-spacing: 1px;
border-radius: 8px;
background: rgba(255, 255, 255, 0.03);
border: 1px solid rgba(255, 255, 255, 0.07);
}
.row-name.kick { color: var(--neon-red); border-color: rgba(255, 61, 94, 0.3); }
.row-name.snare { color: var(--neon-orange); border-color: rgba(255, 163, 77, 0.3); }
.row-name.hat { color: var(--neon-cyan); border-color: rgba(0, 240, 255, 0.3); }
.row-name.synth { color: var(--neon-purple); border-color: rgba(178, 107, 255, 0.3); }
/* ---- Ana matris ---- */
.matrix {
display: flex;
flex-direction: column;
gap: 5px;
flex: 1;
position: relative;
}
.step-row {
display: grid;
grid-template-columns: repeat(16, 1fr);
gap: 5px;
}
.step-cell {
position: relative;
height: 44px;
border-radius: 7px;
background: rgba(255, 255, 255, 0.025);
border: 1px solid rgba(255, 255, 255, 0.06);
cursor: pointer;
transition: background 90ms ease, box-shadow 90ms ease, transform 70ms ease;
}
.step-cell:hover { background: rgba(255, 255, 255, 0.07); }
.step-cell:active { transform: scale(0.94); }
/* hücre içi neon ışık dolgusu */
.step-cell .cell-glow {
position: absolute;
inset: 6px;
border-radius: 5px;
opacity: 0;
transition: opacity 90ms ease;
}
/* ---- aktif (ON) hücreler ---- */
.step-row.kick-row .step-cell.on { background: rgba(255, 61, 94, 0.14); border-color: rgba(255, 61, 94, 0.7); }
.step-row.snare-row .step-cell.on { background: rgba(255, 163, 77, 0.14); border-color: rgba(255, 163, 77, 0.7); }
.step-row.hat-row .step-cell.on { background: rgba(0, 240, 255, 0.14); border-color: rgba(0, 240, 255, 0.7); }
.step-row.synth-row .step-cell.on { background: rgba(178, 107, 255, 0.16); border-color: rgba(178, 107, 255, 0.7); }
.step-cell.on .cell-glow { opacity: 1; }
.step-row.kick-row .step-cell.on .cell-glow { background: radial-gradient(circle, rgba(255,61,94,0.65), transparent 70%); box-shadow: 0 0 12px rgba(255,61,94,0.9); }
.step-row.snare-row .step-cell.on .cell-glow { background: radial-gradient(circle, rgba(255,163,77,0.6), transparent 70%); box-shadow: 0 0 12px rgba(255,163,77,0.9); }
.step-row.hat-row .step-cell.on .cell-glow { background: radial-gradient(circle, rgba(0,240,255,0.6), transparent 70%); box-shadow: 0 0 12px rgba(0,240,255,0.85); }
.step-row.synth-row .step-cell.on .cell-glow { background: radial-gradient(circle, rgba(178,107,255,0.6), transparent 70%); box-shadow: 0 0 12px rgba(178,107,255,0.85); }
/* ---- Playhead sütun ışığı ---- */
.step-col-head {
position: absolute;
top: 0;
bottom: 0;
width: calc((100% - 75px) / 16);
pointer-events: none;
background: linear-gradient(180deg, rgba(255, 255, 255, 0.25), rgba(255, 255, 255, 0.02));
border-radius: 7px;
box-shadow: 0 0 22px rgba(255, 255, 255, 0.55), 0 0 8px rgba(0, 240, 255, 0.6);
opacity: 0;
transition: opacity 60ms ease, left 40ms linear;
z-index: 2;
}
.step-col-head.active { opacity: 1; }
/* tıklandığında tetik parlaması */
.step-cell.hit .cell-glow { opacity: 1; transform: scale(1.06); }
/* ---- Alt bilgi ---- */
.footbar {
display: flex;
justify-content: center;
gap: 22px;
flex-wrap: wrap;
padding-top: 14px;
margin-top: auto;
border-top: 1px solid rgba(255, 255, 255, 0.05);
}
.hint {
font-size: 11px;
color: var(--dim);
letter-spacing: 0.5px;
}
.hint:first-child::before { content: "▶ "; color: var(--neon-green); }
.hint:last-child::before { content: "♪ "; color: var(--neon-pink); }
@media (max-width: 860px) {
body { overflow: auto; }
.stage { padding: 14px; }
.step-cell { height: 36px; }
.row-name { height: 36px; font-size: 11px; }
.controls { flex-direction: column; align-items: stretch; }
.bpm-box { justify-content: center; }
input[type="range"] { width: 60%; }
}