Ottimizzazione RAM, UI e sistema di timing aste

- Ridotto consumo RAM: limiti log, pulizia e compattazione dati aste, timer periodico di cleanup
- UI più fluida: cache locale aste, throttling aggiornamenti, refresh log solo se necessario
- Nuovo sistema Ticker Loop: timing configurabile, strategie solo vicino alla scadenza, feedback puntate tardive
- Migliorato layout e splitter, log visivo, gestione cache HTML
- Aggiornata UI impostazioni e fix vari per performance e thread-safety
This commit is contained in:
2026-02-07 19:28:30 +01:00
parent 5b95f18889
commit 690f7e636a
10 changed files with 1068 additions and 396 deletions

View File

@@ -208,6 +208,68 @@
background: rgba(239, 68, 68, 0.15);
}
/* ═══════════════════════════════════════════════════════════════════
LOG BOX - SCROLL FISSO
═══════════════════════════════════════════════════════════════════ */
.log-box {
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 0.75rem;
line-height: 1.4;
padding: 0.5rem;
height: 100%; /* Usa altezza dal pannello */
overflow-y: auto; /* Scroll verticale */
overflow-x: hidden;
}
.log-box-compact {
font-family: 'Consolas', 'Monaco', 'Courier New', monospace;
font-size: 0.75rem;
line-height: 1.4;
padding: 0.5rem;
max-height: 100%; /* Non superare il contenitore */
overflow-y: auto; /* Scroll verticale */
overflow-x: hidden;
}
.log-entry {
padding: 0.25rem 0.5rem;
margin-bottom: 0.15rem;
border-radius: 4px;
word-wrap: break-word;
transition: background 0.1s ease;
}
.log-entry:hover {
background: rgba(255, 255, 255, 0.05);
}
.log-entry-error {
color: #f87171;
background: rgba(239, 68, 68, 0.1);
border-left: 3px solid #ef4444;
padding-left: 0.5rem;
}
.log-entry-warning {
color: #fbbf24;
background: rgba(245, 158, 11, 0.1);
border-left: 3px solid #f59e0b;
padding-left: 0.5rem;
}
.log-entry-success {
color: #4ade80;
background: rgba(34, 197, 94, 0.1);
border-left: 3px solid #22c55e;
padding-left: 0.5rem;
}
.log-entry-debug {
color: #60a5fa;
opacity: 0.7;
}
/* ═══════════════════════════════════════════════════════════════════
LAYOUT CON SPLITTER TRASCINABILI
═══════════════════════════════════════════════════════════════════ */
@@ -220,34 +282,38 @@
width: 100%;
overflow: hidden;
box-sizing: border-box;
gap: 0; /* IMPORTANTE: nessun gap tra toolbar e content */
}
/* Area contenuto principale */
.main-content-area {
display: flex;
flex-direction: column;
flex: 1;
min-height: 0;
flex: 1 1 auto; /* Cresce e si riduce */
min-height: 0; /* IMPORTANTE per flex */
overflow: hidden;
gap: 0;
gap: 0; /* IMPORTANTE: nessun gap, gli splitter gestiscono lo spazio */
}
/* Riga superiore (Aste + Log) */
.top-row {
display: flex;
flex-direction: row;
flex: 1;
min-height: 150px;
flex: 1 1 auto; /* Cresce e si riduce - NON percentuale fissa */
min-height: 200px; /* Altezza minima */
overflow: hidden;
gap: 0;
gap: 0; /* IMPORTANTE: nessun gap, gutter gestisce lo spazio */
}
/* Riga inferiore (Dettagli) */
.bottom-row {
display: flex;
flex-direction: column;
min-height: 80px;
flex: 0 0 auto; /* NON cresce automaticamente */
height: 300px; /* Altezza iniziale fissa */
min-height: 150px; /* Altezza minima */
overflow: hidden;
gap: 0;
}
/* Pannello generico */
@@ -259,33 +325,55 @@
border-radius: var(--radius-md);
overflow: hidden;
box-sizing: border-box;
height: 100%; /* IMPORTANTE: altezza fissa dal contenitore */
position: relative; /* Per z-index */
}
/* IMPORTANTE: Previeni collasso dei bordi */
.panel::before {
content: '';
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
z-index: -1;
}
/* Pannello Aste */
.panel-auctions {
flex: 1;
min-width: 200px;
flex: 1 1 auto; /* Cresce per riempire lo spazio */
min-width: 300px;
height: 100%; /* Usa tutta l'altezza del contenitore */
overflow: hidden;
}
/* Pannello Log */
.panel-log {
flex: 0 0 280px;
min-width: 150px;
max-width: 450px;
flex: 0 0 auto; /* NON cresce/riduce automaticamente */
width: 320px; /* Larghezza fissa iniziale */
min-width: 200px;
max-width: 500px;
height: 100%; /* Usa tutta l'altezza del contenitore */
overflow: hidden;
}
/* Pannello Dettagli */
.panel-details {
flex: 1;
min-height: 80px;
overflow: auto;
flex: 1 1 auto; /* Cresce per riempire */
min-height: 150px;
height: 100%; /* Usa tutta l'altezza del contenitore */
overflow: hidden; /* Il contenitore non scrolla */
}
/* Gutter/Splitter */
.gutter {
background: rgba(255, 255, 255, 0.03);
flex-shrink: 0;
flex-shrink: 0; /* NON si riduce mai */
flex-grow: 0; /* NON cresce mai */
transition: background 0.15s ease;
z-index: 10; /* Sopra i pannelli */
}
.gutter:hover {
@@ -299,11 +387,15 @@
.gutter-vertical {
width: 6px;
cursor: col-resize;
min-width: 6px; /* Larghezza fissa */
max-width: 6px;
}
.gutter-horizontal {
height: 6px;
cursor: row-resize;
min-height: 6px; /* Altezza fissa */
max-height: 6px;
}
/* Header pannello */
@@ -327,15 +419,47 @@
.panel-content {
flex: 1;
overflow: auto;
min-height: 0;
overflow-y: auto; /* Scroll verticale */
overflow-x: hidden;
min-height: 0; /* Importante per flex */
max-height: 100%; /* Non superare il pannello */
}
/* Contenuto dettagli */
.auction-details-content {
padding: 0.5rem;
height: 100%;
overflow: auto;
display: flex;
flex-direction: column;
overflow: hidden; /* Il contenitore non scrolla */
}
/* Tab content deve scrollare */
.tab-content {
flex: 1;
overflow: hidden;
min-height: 0;
display: flex; /* IMPORTANTE per i tab-pane */
flex-direction: column;
}
.tab-pane {
height: 100%;
overflow: hidden;
display: none; /* Bootstrap lo gestisce con show active */
}
.tab-pane.show.active {
display: flex; /* Quando attivo diventa flex */
flex-direction: column;
}
.tab-panel-content {
flex: 1; /* Riempie il tab-pane */
overflow-y: auto; /* Scroll per il contenuto dei tab */
overflow-x: hidden;
padding: 0.5rem;
min-height: 0; /* IMPORTANTE per flex */
}
.details-header {