diff --git a/db.js b/db.js
index f0d4588..988b26a 100644
--- a/db.js
+++ b/db.js
@@ -182,13 +182,6 @@ if (dbType === 'mysql' || dbType === 'mariadb') {
options: '-c timezone=UTC', // Ensure connection timezone is UTC
});
- // Ensure connection timezone is UTC via query fallback
- pool.on('connect', (client) => {
- client.query("SET TIME ZONE 'UTC'").catch(err => {
- console.error('[DB] Errore nell\'impostazione della timezone UTC per Postgres:', err);
- });
- });
-
pool.on('error', (err) => {
console.error('Unexpected error on idle client', err);
});
diff --git a/public/css/style.css b/public/css/style.css
index bddcaae..4ac3fde 100644
--- a/public/css/style.css
+++ b/public/css/style.css
@@ -2778,4 +2778,263 @@ body {
background: rgba(59, 130, 246, 0.35) !important;
color: transparent !important;
-webkit-text-fill-color: transparent !important;
+}
+
+/* ---- Linux Terminal Console ---- */
+.console-modal-overlay {
+ position: fixed;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: rgba(0, 0, 0, 0.75);
+ backdrop-filter: blur(6px);
+ z-index: 9999;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: var(--space-md);
+ animation: fadeIn 0.2s ease;
+}
+
+.console-window {
+ width: 900px;
+ max-width: 95vw;
+ height: 600px;
+ max-height: 85vh;
+ border-radius: 10px;
+ overflow: hidden;
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.7);
+ display: flex;
+ flex-direction: column;
+ border: 1px solid rgba(255, 255, 255, 0.15);
+ font-family: 'JetBrains Mono', 'Fira Code', 'Consolas', 'Courier New', monospace;
+ transition: all 0.2s ease;
+}
+
+.console-header {
+ height: 38px;
+ background: #1e1e2e;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.08);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 16px;
+ user-select: none;
+}
+
+.console-window-buttons {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.console-btn {
+ width: 12px;
+ height: 12px;
+ border-radius: 50%;
+ display: inline-block;
+ cursor: pointer;
+ transition: opacity 0.15s ease;
+}
+
+.console-btn:hover {
+ opacity: 0.8;
+}
+
+.console-btn.btn-close { background: #ff5f56; border: 1px solid #e0443e; }
+.console-btn.btn-minimize { background: #ffbd2e; border: 1px solid #dea123; }
+.console-btn.btn-maximize { background: #27c93f; border: 1px solid #1aab29; }
+
+.console-title {
+ font-size: 0.8rem;
+ color: #a6adc8;
+ font-weight: 600;
+}
+
+.console-badge {
+ font-size: 0.7rem;
+ background: rgba(255, 255, 255, 0.1);
+ padding: 2px 8px;
+ border-radius: 4px;
+ color: #cdd6f4;
+}
+
+.console-body {
+ flex: 1;
+ padding: 16px;
+ overflow-y: auto;
+ font-size: 0.88rem;
+ line-height: 1.45;
+ display: flex;
+ flex-direction: column;
+}
+
+/* Themes */
+.theme-dark .console-window { background: #0f1419; color: #e6edf3; }
+.theme-dark .console-prompt .user-part { color: #38bdf8; font-weight: bold; }
+.theme-dark .console-prompt .path-part { color: #818cf8; }
+.theme-dark .cmd-highlight { color: #38bdf8; font-weight: bold; }
+.theme-dark .cmd-executed { color: #f43f5e; font-weight: bold; }
+
+.theme-green .console-window { background: #051a05; color: #4ade80; }
+.theme-green .console-prompt .user-part { color: #22c55e; font-weight: bold; }
+.theme-green .console-prompt .path-part { color: #86efac; }
+.theme-green .cmd-highlight { color: #4ade80; font-weight: bold; }
+.theme-green .cmd-executed { color: #a7f3d0; font-weight: bold; }
+.theme-green .console-header { background: #082808; }
+
+.theme-amber .console-window { background: #1a1202; color: #fbbf24; }
+.theme-amber .console-prompt .user-part { color: #f59e0b; font-weight: bold; }
+.theme-amber .console-prompt .path-part { color: #fde68a; }
+.theme-amber .cmd-highlight { color: #fbbf24; font-weight: bold; }
+.theme-amber .cmd-executed { color: #fef08a; font-weight: bold; }
+.theme-amber .console-header { background: #2a1d04; }
+
+.theme-cyber .console-window { background: #0d0221; color: #00f5d4; }
+.theme-cyber .console-prompt .user-part { color: #7b2cbf; font-weight: bold; }
+.theme-cyber .console-prompt .path-part { color: #f72585; }
+.theme-cyber .cmd-highlight { color: #7209b7; font-weight: bold; }
+.theme-cyber .cmd-executed { color: #4cc9f0; font-weight: bold; }
+.theme-cyber .console-header { background: #19053d; }
+
+.console-banner {
+ font-size: 0.7rem;
+ line-height: 1.1;
+ color: var(--accent-primary);
+ margin-bottom: 12px;
+ font-weight: bold;
+}
+
+.console-welcome-text {
+ margin-bottom: 16px;
+ color: #94a3b8;
+ font-size: 0.85rem;
+}
+
+.console-line {
+ margin-bottom: 4px;
+}
+
+.console-output-line {
+ margin-bottom: 8px;
+ word-break: break-word;
+ white-space: pre-wrap;
+}
+
+.console-input-row {
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ margin-top: 4px;
+}
+
+.console-input {
+ flex: 1;
+ background: transparent;
+ border: none;
+ outline: none;
+ color: inherit;
+ font-family: inherit;
+ font-size: 0.88rem;
+ padding: 0;
+ caret-color: var(--accent-primary);
+}
+
+.text-success { color: #22c55e; }
+.text-danger { color: #ef4444; }
+.text-warning { color: #f59e0b; }
+.text-info { color: #3b82f6; }
+.text-muted { color: #64748b; }
+.text-accent { color: #38bdf8; font-weight: bold; }
+
+.dir-item { color: #60a5fa; font-weight: bold; }
+.file-item { color: #e2e8f0; }
+
+.console-help-table {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ padding: 6px 0;
+}
+
+.console-help-table > div {
+ display: flex;
+ gap: 16px;
+}
+
+.cmd-name {
+ width: 220px;
+ flex-shrink: 0;
+ color: #38bdf8;
+ font-weight: bold;
+}
+
+.cmd-desc {
+ color: #94a3b8;
+}
+
+.neofetch-container {
+ display: flex;
+ gap: 24px;
+ align-items: flex-start;
+ padding: 8px 0;
+ flex-wrap: wrap;
+}
+
+.neofetch-logo {
+ color: #38bdf8;
+ font-size: 0.75rem;
+ line-height: 1.15;
+ font-weight: bold;
+ margin: 0;
+}
+
+.neofetch-info {
+ display: flex;
+ flex-direction: column;
+ gap: 3px;
+ font-size: 0.82rem;
+}
+
+.console-table {
+ width: 100%;
+ border-collapse: collapse;
+ font-size: 0.82rem;
+ margin: 8px 0;
+}
+
+.console-table th {
+ text-align: left;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.2);
+ padding: 4px 8px;
+ color: #94a3b8;
+}
+
+.console-table td {
+ padding: 4px 8px;
+ border-bottom: 1px solid rgba(255, 255, 255, 0.05);
+}
+
+.badge-mini {
+ background: rgba(255, 255, 255, 0.1);
+ padding: 1px 6px;
+ border-radius: 3px;
+ font-size: 0.75rem;
+}
+
+.matrix-stream {
+ color: #22c55e;
+ font-size: 0.75rem;
+ line-height: 1.2;
+ margin: 0;
+ white-space: pre;
+}
+
+.sl-train-box {
+ color: #f59e0b;
+ font-size: 0.8rem;
+ line-height: 1.2;
+ margin: 0;
+ white-space: pre;
}
\ No newline at end of file
diff --git a/public/index.html b/public/index.html
index a3833e6..557fe76 100644
--- a/public/index.html
+++ b/public/index.html
@@ -279,6 +279,7 @@
+