install.sh --laptop ahora detecta el gestor de paquetes (apt, dnf, pacman o zypper) e instala las dependencias en Debian/Ubuntu/Mint, Fedora, Arch/Manjaro y openSUSE; en el resto avisa de los 5 paquetes a instalar a mano. En portatil no se compila projectM (opcional). Panel: titulo superior mas grande y cada titulo de tarjeta mas grande y en fuente Xirod; en pantalla ancha el panel ocupa el 94% (hasta 1600px) para aprovechar el portatil. Audio: nuevo boton 'Aplicar microfono' que reconecta la captura desde el panel (evento reacquire_audio); el microfono integrado del portatil se capta como entrada por defecto. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
258 lines
8.5 KiB
CSS
258 lines
8.5 KiB
CSS
/* FOSFENO :: Panel de control
|
|
Tema verde acido y negro, con acentos en naranja neon.
|
|
Movil: una columna. Pantalla ancha: dos columnas. */
|
|
|
|
@font-face {
|
|
font-family: "Xirod";
|
|
src: url("/panel/fonts/xirod.otf") format("opentype");
|
|
font-display: swap;
|
|
}
|
|
|
|
: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;
|
|
}
|
|
|
|
/* --- Cabecera con el titulo centrado --- */
|
|
header {
|
|
position: sticky; top: 0; z-index: 10;
|
|
display: flex; align-items: center; justify-content: center;
|
|
padding: 16px 20px; border-bottom: 2px solid var(--green-d);
|
|
background: var(--bg);
|
|
}
|
|
header h1 {
|
|
font-family: "Xirod", "Arial Black", sans-serif;
|
|
font-size: 32px; font-weight: 400; letter-spacing: 0.09em;
|
|
color: var(--green); text-shadow: 0 0 18px rgba(180, 255, 0, 0.65);
|
|
}
|
|
#conn {
|
|
position: absolute; right: 20px; top: 50%; transform: translateY(-50%);
|
|
}
|
|
.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); }
|
|
|
|
/* --- Disposicion: movil en una columna --- */
|
|
main {
|
|
max-width: 560px; margin: 0 auto;
|
|
padding: 16px; display: flex; flex-direction: column; gap: 14px;
|
|
}
|
|
.column { display: contents; } /* en movil, las columnas no existen */
|
|
|
|
/* Orden de las tarjetas cuando estan todas en una sola columna (movil) */
|
|
#card-power { order: 1; }
|
|
#card-engines { order: 2; }
|
|
#card-audio { order: 3; }
|
|
#card-sens { order: 4; }
|
|
#ctl-butterchurn, #ctl-editor, #ctl-mixer, #ctl-projectm { order: 5; }
|
|
#card-now { order: 6; }
|
|
#card-sys { order: 7; }
|
|
#net-foot { order: 8; }
|
|
|
|
/* --- Disposicion: pantalla ancha (portatil) en dos columnas --- */
|
|
@media (min-width: 880px) {
|
|
main {
|
|
width: 94%; max-width: 1600px; flex-direction: row;
|
|
align-items: flex-start; gap: 18px;
|
|
}
|
|
.column {
|
|
display: flex; flex-direction: column; gap: 14px; flex: 1 1 0;
|
|
}
|
|
}
|
|
|
|
/* --- 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; }
|
|
|
|
/* Cabecera de tarjeta: titulo centrado, boton de info a la derecha */
|
|
.cardhead {
|
|
position: relative; width: 100%;
|
|
display: flex; align-items: center; justify-content: center;
|
|
min-height: 30px;
|
|
}
|
|
/* Titulo de cada tarjeta: mas grande y en la fuente Xirod */
|
|
.cardhead .label {
|
|
font-family: "Xirod", "Arial Black", sans-serif;
|
|
font-size: 16px; font-weight: 400; letter-spacing: 0.04em;
|
|
}
|
|
|
|
.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, esquina de la tarjeta) --- */
|
|
.info {
|
|
position: absolute; right: 0; top: 50%; transform: translateY(-50%);
|
|
width: 28px; height: 28px; 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;
|
|
}
|
|
|
|
/* --- Tarjeta de estado --- */
|
|
#card-now { text-align: center; }
|
|
.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); }
|
|
|
|
/* --- Pie con la direccion del panel --- */
|
|
.netfoot {
|
|
text-align: center; color: var(--dim);
|
|
font-size: 12px; font-family: monospace; padding: 4px 0 8px;
|
|
}
|
|
|
|
/* --- Banda de avisos --- */
|
|
.notif {
|
|
display: flex; align-items: center; gap: 10px;
|
|
padding: 12px 16px; font-size: 14px; font-weight: 600;
|
|
position: sticky; top: 66px; 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 {
|
|
font-family: "Xirod", "Arial Black", sans-serif; font-weight: 400;
|
|
color: var(--green); font-size: 16px; letter-spacing: 0.06em;
|
|
text-align: center;
|
|
}
|
|
.modal-box p { color: var(--txt); font-size: 14px; line-height: 1.5; }
|