fosfeno/web/panel/panel.css
hacklab 30a09fdee6 FOSFENO: motor de visuales audio-reactivas para Raspberry Pi
Primera version. Cinco motores (projectM, Butterchurn, Hydra, Shaders GLSL y mezclador VJ con camara y video), panel de control web, deteccion de BPM propia, pantalla de conexion con codigo QR, instalador robusto para Raspberry Pi 4 y 5 y documentacion completa en docs/.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-22 14:18:19 +02:00

212 lines
6.9 KiB
CSS

/* FOSFENO :: Panel de control
Tema verde acido y negro, con acentos en naranja neon. */
:root {
--bg: #060a06;
--card: #0d120c;
--line: #243016;
--green: #b4ff00; /* verde acido */
--green-d: #86bd00;
--orange: #ff7a00; /* naranja acido */
--orange-n: #ff9d2a; /* naranja neon */
--ink: #050705; /* negro: texto sobre superficies brillantes */
--txt: #cfe8ad; /* texto claro sobre fondo oscuro */
--dim: #6f8a52;
--red: #ff3b2f;
}
* { box-sizing: border-box; margin: 0; padding: 0; }
/* El atributo 'hidden' debe ocultar siempre, incluso sobre display:flex */
[hidden] { display: none !important; }
body {
background: var(--bg);
color: var(--txt);
font-family: "Segoe UI", Roboto, system-ui, sans-serif;
-webkit-tap-highlight-color: transparent;
padding-bottom: 48px;
}
header {
display: flex; align-items: center; justify-content: space-between;
padding: 18px 20px; border-bottom: 2px solid var(--green-d);
position: sticky; top: 0; background: var(--bg); z-index: 10;
}
header h1 {
font-size: 20px; font-weight: 800; letter-spacing: 0.32em;
color: var(--green); text-shadow: 0 0 14px rgba(180, 255, 0, 0.55);
}
.dot { width: 13px; height: 13px; border-radius: 50%; display: inline-block; }
.dot.on { background: var(--green); box-shadow: 0 0 9px var(--green); }
.dot.off { background: var(--red); box-shadow: 0 0 9px var(--red); }
main {
max-width: 560px; margin: 0 auto;
padding: 16px; display: flex; flex-direction: column; gap: 14px;
}
/* --- Tarjetas --- */
.card {
background: var(--card); border: 1px solid var(--line);
border-radius: 16px; padding: 16px;
display: flex; flex-direction: column; gap: 12px;
}
.card.center { align-items: center; }
.cardhead {
display: flex; align-items: center; justify-content: space-between;
gap: 10px; width: 100%;
}
.label { color: var(--green); font-size: 13px; text-transform: uppercase;
letter-spacing: 0.09em; font-weight: 700; }
.value { color: var(--orange-n); font-weight: 800; }
.hint { color: var(--dim); font-size: 12px; line-height: 1.45; }
.row { display: flex; align-items: center; justify-content: space-between;
gap: 10px; }
.row .cmd { flex: 1; }
/* --- Boton de informacion (circular naranja) --- */
.info {
width: 28px; height: 28px; flex: none; border-radius: 50%;
background: var(--orange); color: var(--ink); border: none;
font-weight: 900; font-style: italic; font-size: 15px; cursor: pointer;
box-shadow: 0 0 10px rgba(255, 122, 0, 0.5);
}
.info:active { background: var(--orange-n); }
/* --- Boton de encendido (circular grande) --- */
.power-btn {
width: 128px; height: 128px; border-radius: 50%;
border: none; cursor: pointer; font-weight: 900; font-size: 26px;
letter-spacing: 0.05em;
background: var(--green); color: var(--ink);
box-shadow: 0 0 26px rgba(180, 255, 0, 0.55);
}
.power-btn.off {
background: var(--card); color: var(--dim);
border: 3px solid var(--line); box-shadow: none;
}
/* --- Selector de motor (botones circulares) --- */
.engines {
display: flex; flex-wrap: wrap; gap: 12px; justify-content: center;
}
.engine {
width: 96px; height: 96px; border-radius: 50%;
display: flex; flex-direction: column; align-items: center;
justify-content: center; gap: 2px; cursor: pointer;
background: var(--card); border: 3px solid var(--line); color: var(--txt);
}
.engine strong { font-size: 13px; }
.engine small { font-size: 9px; color: var(--dim); }
.engine.active {
background: var(--green); color: var(--ink); border-color: var(--orange);
box-shadow: 0 0 20px rgba(180, 255, 0, 0.6);
}
.engine.active small { color: var(--ink); }
/* --- Botones de comando --- */
.cmd, .sysbtn {
padding: 13px; border-radius: 11px; cursor: pointer;
background: #161d10; border: 1px solid var(--line); color: var(--txt);
font-weight: 700; font-size: 14px;
}
.cmd:active, .sysbtn:active { background: #202a16; }
.cmd.accent {
background: var(--green); color: var(--ink); border: none;
}
/* --- Selectores y sliders --- */
select {
width: 100%; padding: 12px; border-radius: 11px;
background: #161d10; color: var(--txt); border: 1px solid var(--line);
font-size: 14px;
}
select.inline { width: auto; padding: 8px 10px; }
input[type=range] { width: 100%; accent-color: var(--green); height: 30px; }
.check { display: flex; align-items: center; gap: 10px; font-size: 14px;
color: var(--txt); }
.check input { width: 22px; height: 22px; accent-color: var(--orange); }
/* --- Botones segmentados --- */
.seg { display: flex; gap: 6px; }
.segbtn {
flex: 1; padding: 11px 6px; border-radius: 10px; cursor: pointer;
background: #161d10; border: 2px solid var(--line); color: var(--dim);
font-weight: 700; font-size: 13px;
}
.segbtn.active {
border-color: var(--orange); color: var(--orange-n);
box-shadow: 0 0 12px rgba(255, 122, 0, 0.35);
}
/* --- BPM --- */
.bpm {
font-size: 30px; font-weight: 900; color: var(--orange-n);
text-shadow: 0 0 14px rgba(255, 157, 42, 0.6);
font-variant-numeric: tabular-nums;
}
/* --- Sliders del mezclador --- */
.slider { display: flex; flex-direction: column; gap: 4px; margin-bottom: 6px; }
.slider .head {
display: flex; justify-content: space-between; font-size: 13px;
color: var(--dim);
}
.slider .head b { color: var(--green); font-weight: 800; }
/* --- Editor CodeMirror --- */
.CodeMirror {
height: 220px; border-radius: 11px; border: 1px solid var(--green-d);
font-size: 13px; font-family: "Fira Mono", Consolas, monospace;
}
.now { font-size: 15px; color: var(--orange-n); word-break: break-word; }
/* --- Sistema --- */
.sys { flex-direction: row; }
.sys .sysbtn { flex: 1; }
.sysbtn.danger { color: var(--red); border-color: var(--red); }
/* --- Banda de avisos --- */
.notif {
display: flex; align-items: center; gap: 10px;
padding: 12px 16px; font-size: 14px; font-weight: 600;
position: sticky; top: 60px; z-index: 9;
}
.notif.info { background: var(--green); color: var(--ink); }
.notif.warn { background: var(--orange); color: var(--ink); }
.notif.error { background: var(--red); color: #fff; }
.notif span { flex: 1; }
.notif button {
background: transparent; border: none; color: inherit;
font-size: 22px; font-weight: 900; cursor: pointer; line-height: 1;
}
/* --- Ventana de informacion --- */
.modal {
position: fixed; inset: 0; z-index: 50;
background: rgba(3, 6, 3, 0.88);
display: flex; align-items: center; justify-content: center; padding: 20px;
}
.modal-box {
background: var(--card); border: 2px solid var(--green);
border-radius: 16px; padding: 22px; max-width: 460px; width: 100%;
max-height: 80vh; overflow-y: auto;
display: flex; flex-direction: column; gap: 14px;
box-shadow: 0 0 30px rgba(180, 255, 0, 0.3);
}
.modal-box h2 {
color: var(--green); font-size: 18px; letter-spacing: 0.04em;
}
.modal-box p { color: var(--txt); font-size: 14px; line-height: 1.5; }
/* Pie con la direccion del panel */
.netfoot {
text-align: center; color: var(--dim);
font-size: 12px; font-family: monospace; padding: 4px 0 8px;
}