fix(panel-v3): detección de puerto, botones y limpieza de warnings

- oasis_running() usa ss en lugar de pgrep (evita falsos positivos)
- _start_oasis() lanza oasis.sh en background y espera el puerto
- INSTALAR se deshabilita cuando OASIS ya está instalado/activo
- Corrige DeprecationWarning: override_background_color → CssProvider
- Corrige DeprecationWarning: run_javascript → evaluate_javascript
- Desactiva caché de WebKit, carga por URI directa
- Inspector de WebKit activado para depuración

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
SITO 2026-03-30 12:26:24 +02:00
parent ae79e45c19
commit 67acbf1add
17 changed files with 2692 additions and 0 deletions

347
INSTALLER_V3/ui/style.css Normal file
View file

@ -0,0 +1,347 @@
/* ================================================================
OASIS Panel v3
CSS puro, sin limitaciones GTK. Control total como Electron/web.
================================================================ */
@font-face {
font-family: 'Dune Rise';
src: url('../Dune_Rise.otf') format('opentype');
font-weight: normal;
font-style: normal;
}
:root {
--bg: #000000;
--bg2: #080808;
--bg3: #0D0D0D;
/* OASIS — naranja */
--orange: #FF4E00;
--orange-dim: #882200;
--orange-mute: #441100;
/* ECOIN — amarillo */
--yellow: #FFB300;
--yellow-dim: #886000;
--yellow-mute: #443000;
/* LOG — verde neon */
--neon: #39FF14;
--neon-dim: #1a7a09;
/* General */
--green: #27D980;
--border: #1A1A1A;
--font: 'Dune Rise', 'Cantarell', 'Ubuntu', sans-serif;
--mono: 'DejaVu Sans Mono', 'Courier New', monospace;
}
/* ── Reset ── */
*, *::before, *::after {
margin: 0;
padding: 0;
box-sizing: border-box;
-webkit-font-smoothing: antialiased;
}
html, body {
width: 390px;
height: 620px;
overflow: hidden;
background: var(--bg);
color: var(--orange);
font-family: var(--font);
font-size: 10pt;
display: flex;
flex-direction: column;
user-select: none;
}
/* ── Header ─────────────────────────────────────────────────── */
header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
background: var(--bg2);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.header-left {
display: flex;
align-items: center;
gap: 10px;
}
.logo {
width: 38px;
height: 38px;
object-fit: contain;
flex-shrink: 0;
}
.header-titles {
display: flex;
flex-direction: column;
gap: 2px;
}
.app-title {
font-size: 15pt;
color: var(--orange);
letter-spacing: 5px;
line-height: 1;
}
.app-sub {
font-size: 6pt;
color: var(--orange-mute);
letter-spacing: 2px;
}
.status-dot {
font-size: 11pt;
transition: color 0.4s;
line-height: 1;
}
.status-dot[data-state="running"] { color: var(--green); }
.status-dot[data-state="stopped"] { color: var(--orange); }
.status-dot[data-state="unknown"] { color: var(--orange-mute); }
/* ── Tab bar ─────────────────────────────────────────────────── */
nav.tabbar {
display: flex;
background: var(--bg);
border-bottom: 1px solid var(--border);
flex-shrink: 0;
}
.tabBtn {
flex: 1;
background: none;
border: none;
border-bottom: 3px solid transparent;
padding: 11px 0;
font-size: 7.5pt;
letter-spacing: 2px;
font-family: var(--font);
cursor: pointer;
transition: color 0.2s, border-color 0.2s;
}
/* Tab OASIS — naranja */
.tabBtn[data-tab="oasis"] { color: var(--orange-dim); }
.tabBtn[data-tab="oasis"]:hover { color: var(--orange); }
.tabBtn[data-tab="oasis"].active { color: var(--orange); border-bottom-color: var(--orange); }
/* Tab ECOIN — amarillo */
.tabBtn[data-tab="ecoin"] { color: var(--yellow-dim); }
.tabBtn[data-tab="ecoin"]:hover { color: var(--yellow); }
.tabBtn[data-tab="ecoin"].active { color: var(--yellow); border-bottom-color: var(--yellow); }
/* Tab SISTEMA — verde neon */
.tabBtn[data-tab="sistema"] { color: var(--neon-dim); }
.tabBtn[data-tab="sistema"]:hover { color: var(--neon); }
.tabBtn[data-tab="sistema"].active { color: var(--neon); border-bottom-color: var(--neon); }
/* ── Main content ────────────────────────────────────────────── */
main {
flex: 1;
overflow: hidden;
position: relative;
background: var(--bg);
}
.tab-panel {
display: none;
flex-direction: column;
height: 100%;
overflow-y: auto;
background: var(--bg);
}
.tab-panel.active { display: flex; }
/* ── Scrollbar ───────────────────────────────────────────────── */
::-webkit-scrollbar { width: 4px; }
::-webkit-scrollbar-track { background: var(--bg); }
::-webkit-scrollbar-thumb { background: #222; border-radius: 2px; }
::-webkit-scrollbar-thumb:hover { background: #333; }
/* ================================================================
OASIS TAB naranja
================================================================ */
#tab-oasis .card-state { color: var(--orange-dim); }
#tab-oasis .status-card[data-state="running"] .card-state { color: var(--green); }
#tab-oasis .status-card[data-state="stopped"] .card-state { color: var(--orange); }
#tab-oasis .status-card[data-state="running"] .card-stripe { background: var(--green); }
#tab-oasis .status-card[data-state="stopped"] .card-stripe { background: var(--orange); }
#tab-oasis .card-sub { color: var(--orange-mute); }
#tab-oasis .btn { color: var(--orange); border-color: var(--orange); }
#tab-oasis .btn.primary { background: var(--orange); color: #000; border-color: var(--orange); }
#tab-oasis .ik { color: var(--orange-dim); }
#tab-oasis .iv { color: var(--orange); }
/* ================================================================
ECOIN TAB amarillo
================================================================ */
#tab-ecoin .card-state { color: var(--yellow-dim); }
#tab-ecoin .status-card[data-state="running"] .card-state { color: var(--yellow); }
#tab-ecoin .status-card[data-state="stopped"] .card-state { color: var(--yellow-dim); }
#tab-ecoin .status-card[data-state="running"] .card-stripe { background: var(--yellow); }
#tab-ecoin .status-card[data-state="stopped"] .card-stripe { background: var(--yellow-dim); }
#tab-ecoin .card-sub { color: var(--yellow-mute); }
#tab-ecoin .btn { color: var(--yellow); border-color: var(--yellow); }
#tab-ecoin .btn.primary { background: var(--yellow); color: #000; border-color: var(--yellow); }
#tab-ecoin .ik { color: var(--yellow-dim); }
#tab-ecoin .iv { color: var(--yellow); }
/* ================================================================
STATUS CARD base
================================================================ */
.status-card {
display: flex;
margin: 14px 14px 6px;
background: var(--bg2);
border: 1px solid var(--border);
border-radius: 10px;
overflow: hidden;
flex-shrink: 0;
transition: border-color 0.3s;
}
.card-stripe {
width: 5px;
flex-shrink: 0;
background: #1A1A1A;
transition: background 0.4s;
}
.status-card[data-state="unknown"] .card-stripe { background: #1A1A1A; }
.card-body {
padding: 14px 16px;
display: flex;
flex-direction: column;
gap: 5px;
}
.card-state {
font-size: 18pt;
font-weight: bold;
letter-spacing: 2px;
transition: color 0.4s;
}
.card-sub {
font-size: 7.5pt;
letter-spacing: 1px;
}
/* ── Botones base ────────────────────────────────────────────── */
.actions {
padding: 6px 14px 2px;
flex-shrink: 0;
}
.action-row {
display: flex;
gap: 8px;
margin-bottom: 8px;
}
.btn {
flex: 1;
background: var(--bg);
border: 1px solid currentColor;
border-radius: 20px;
padding: 9px 10px;
font-size: 7.5pt;
font-weight: bold;
letter-spacing: 1px;
font-family: var(--font);
cursor: pointer;
transition: background 0.2s, color 0.2s, border-color 0.2s, opacity 0.2s;
white-space: nowrap;
text-align: center;
}
.btn:hover:not(:disabled) {
background: var(--green);
color: #000;
border-color: var(--green);
}
.btn:active:not(:disabled) {
background: #1fa865;
border-color: #1fa865;
color: #000;
}
.btn:disabled {
opacity: 0.2;
cursor: not-allowed;
}
.btn.btn-clear {
flex: none;
width: calc(100% - 28px);
margin: 6px 14px 12px;
color: var(--neon);
border-color: var(--neon);
}
.btn.btn-clear:hover:not(:disabled) {
background: var(--neon);
color: #000;
border-color: var(--neon);
}
/* ── Info box ────────────────────────────────────────────────── */
.infobox {
margin: 8px 14px 14px;
border-top: 1px solid var(--border);
padding-top: 8px;
flex-shrink: 0;
}
.info-row {
display: flex;
align-items: center;
padding: 5px 2px;
border-bottom: 1px solid #080808;
}
.info-row:last-child { border-bottom: none; }
.ik {
font-size: 7.5pt;
letter-spacing: 1px;
min-width: 82px;
flex-shrink: 0;
}
.iv {
font-size: 7.5pt;
word-break: break-all;
}
/* ================================================================
SISTEMA / LOG verde neon
================================================================ */
.log-header {
font-size: 6.5pt;
color: var(--neon-dim);
letter-spacing: 2px;
padding: 12px 16px 6px;
flex-shrink: 0;
}
.log-area {
flex: 1;
background: #030303;
border: 1px solid #0a1a0a;
border-radius: 8px;
margin: 0 14px 8px;
padding: 10px 12px;
overflow-y: auto;
font-family: var(--mono);
font-size: 7.5pt;
color: var(--neon);
line-height: 1.55;
min-height: 0;
}
.log-line { word-break: break-all; padding: 1px 0; color: var(--neon); }
.log-line.cmd { color: var(--orange); }
.log-line.end { color: var(--neon-dim); margin-top: 4px; }
.log-line.error { color: #ff4444; }