diff --git a/templates/index.html b/templates/index.html
index edc3fad..77b143f 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -38,8 +38,153 @@ a{color:var(--link)}
display: flex;
flex-direction: column;
overflow: hidden;
+ transition: width 0.3s ease, transform 0.3s ease;
}
+.sidebar.collapsed {
+ width: 60px;
+}
+
+.sidebar.collapsed .sidebar-header h1,
+.sidebar.collapsed .sidebar-header .subtitle,
+.sidebar.collapsed .sidebar-controls,
+.sidebar.collapsed .container-list {
+ display: none;
+}
+
+.sidebar.collapsed .sidebar-header {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 10px;
+}
+
+.sidebar.collapsed .header-buttons {
+ flex-direction: column;
+ gap: 4px;
+ align-items: center;
+ justify-content: center;
+ width: 100%;
+}
+
+/* Логотип в свернутом состоянии */
+.sidebar.collapsed .sidebar-logo {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ height: 40px;
+ font-size: 18px;
+ color: var(--accent);
+ font-weight: bold;
+ margin-bottom: 10px;
+ border-bottom: 1px solid var(--border);
+}
+
+.sidebar:not(.collapsed) .sidebar-logo {
+ display: none;
+}
+
+/* Сворачивание header вместе с sidebar */
+.sidebar.collapsed ~ .main-content .header {
+ height: 40px;
+ padding: 0 20px;
+ display: flex;
+ align-items: center;
+ gap: 10px;
+}
+
+.sidebar.collapsed ~ .main-content .header .header-title,
+.sidebar.collapsed ~ .main-content .header .header-badge,
+.sidebar.collapsed ~ .main-content .header .mobile-toggle {
+ display: none;
+}
+
+.sidebar.collapsed ~ .main-content .header .header-filter {
+ flex: 1;
+ max-width: 200px;
+ margin: 0;
+}
+
+.sidebar.collapsed ~ .main-content .header .header-controls { display: flex; align-items: center; gap: 8px; margin-left: auto; }
+
+/* Скрыть тему в компактном header */
+.sidebar.collapsed ~ .main-content .header .theme-toggle { display: none; }
+
+/* Скрыть весь log-header в компактном режиме */
+.sidebar.collapsed ~ .main-content .log-header { display: none; }
+
+/* Минимальный padding для log-content в свернутом состоянии */
+.sidebar.collapsed ~ .main-content .log-content {
+ padding: 2px;
+}
+
+/* Multi-view panel для Single View режима */
+.multi-view-panel {
+ display: none;
+ background: var(--panel);
+ border-bottom: 1px solid var(--border);
+ padding: 8px 16px;
+ font-size: 14px;
+ font-weight: 500;
+ color: var(--accent);
+}
+
+.sidebar.collapsed ~ .main-content .multi-view-panel {
+ display: block;
+}
+
+/* Всегда скрываем одиночный блок multi-view панели в Single View */
+#multiViewPanel {
+ display: none !important;
+}
+
+/* Приводим Single View лог к виду multi-view-log */
+.log-area .log-content .log {
+ height: 100%;
+ margin: 0;
+ padding: 12px;
+ font-size: 11px;
+ line-height: 1.4;
+ white-space: pre; /* по умолчанию как у multi-view; переключается applyWrapSettings() */
+ word-break: break-word;
+ overflow: auto;
+ background: var(--bg);
+ color: var(--fg);
+ font-family: ui-monospace, Menlo, Consolas, monospace;
+}
+
+
+
+.sidebar-toggle {
+ position: fixed;
+ top: 50vh;
+ left: var(--sidebar-width);
+ transform: translate(-50%, -50%);
+ width: 30px;
+ height: 30px;
+ background: var(--accent);
+ border: 2px solid var(--panel);
+ border-radius: 50%;
+ color: #0b0d12;
+ cursor: pointer;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ font-size: 12px;
+ z-index: 1001;
+ transition: all 0.2s ease;
+}
+
+.sidebar.collapsed + .sidebar-toggle {
+ left: 60px;
+}
+
+.sidebar-toggle:hover {
+ background: var(--ok);
+}
+
+
+
.sidebar-header {
padding: 20px;
border-bottom: 1px solid var(--border);
@@ -73,6 +218,7 @@ a{color:var(--link)}
}
.options-btn,
+.help-btn,
.logout-btn {
background: var(--chip);
border: 1px solid var(--border);
@@ -86,7 +232,71 @@ a{color:var(--link)}
justify-content: center;
}
+/* Help button: visible only when sidebar is collapsed */
+.sidebar:not(.collapsed) .help-btn { display: none; }
+.sidebar.collapsed .help-btn { display: flex; }
+
+/* Компактные контролы в header: по умолчанию скрыты, видны в свернутом режиме */
+.header-compact-controls { display: none; align-items: center; gap: 6px; }
+.sidebar.collapsed ~ .main-content .header .header-compact-controls { display: flex; }
+
+/* Стили для компактных кнопок в header - такие же как в развернутом состоянии */
+.sidebar.collapsed ~ .main-content .header .counter-btn {
+ display: inline-flex;
+ flex-direction: row;
+ align-items: center;
+ justify-content: center;
+ padding: 6px 12px;
+ margin: 0 4px;
+ border: none;
+ border-radius: 6px;
+ font-size: 11px;
+ font-weight: 500;
+ cursor: pointer;
+ transition: all 0.2s ease;
+ min-width: 70px;
+}
+
+.sidebar.collapsed ~ .main-content .header .counter-btn:hover {
+ transform: translateY(-1px);
+ box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
+.sidebar.collapsed ~ .main-content .header .counter-label {
+ font-size: 10px;
+ opacity: 0.9;
+ margin-right: 4px;
+}
+
+.sidebar.collapsed ~ .main-content .header .counter-value {
+ font-size: 12px;
+ font-weight: bold;
+}
+
+.sidebar.collapsed ~ .main-content .header .log-refresh-btn {
+ background: var(--accent);
+ color: white;
+ border: none;
+ border-radius: 6px;
+ transition: all 0.2s ease;
+ padding: 6px 24px;
+ font-size: 11px;
+ font-weight: 500;
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ height: fit-content;
+}
+
+.sidebar.collapsed ~ .main-content .header .log-refresh-btn:hover {
+ background: var(--accent);
+ opacity: 0.8;
+ transform: translateY(-1px);
+ box-shadow: 0 2px 4px rgba(0,0,0,0.2);
+}
+
.options-btn:hover,
+.help-btn:hover,
.logout-btn:hover {
background: var(--tab-active);
color: var(--fg);
@@ -612,8 +822,13 @@ a{color:var(--link)}
font-weight: 600;
color: var(--fg);
margin: 0;
+ display: flex;
+ align-items: center;
+ gap: 8px;
}
+
+
.header-badge {
color: var(--muted);
padding: 8px 12px;
@@ -959,6 +1174,9 @@ a{color:var(--link)}
gap: 2px;
height: 100%;
padding: 0px;
+ /* Равная высота строк для нескольких рядов (3+ окон) */
+ grid-auto-rows: 1fr;
+ align-items: stretch;
}
.multi-view-panel {
@@ -996,6 +1214,55 @@ a{color:var(--link)}
overflow: hidden;
}
+/* Single View Panel - аналогично Multi View */
+.single-view-panel {
+ background: var(--panel);
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ padding: 2px;
+ height: 100%;
+}
+
+.single-view-header {
+ padding: 12px 16px;
+ background: var(--chip);
+ border-bottom: 1px solid var(--border);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px;
+}
+
+.single-view-title {
+ font-size: 13px;
+ font-weight: 500;
+ color: var(--fg);
+ margin: 0;
+ flex: 1;
+}
+
+.single-view-content {
+ flex: 1;
+ overflow: hidden;
+}
+
+.single-view-content .log {
+ height: 100%;
+ margin: 0;
+ padding: 12px;
+ font-size: 11px;
+ line-height: 1.4;
+ white-space: pre;
+ word-break: break-word;
+ overflow: auto;
+ background: var(--bg);
+ color: var(--fg);
+ font-family: ui-monospace, Menlo, Consolas, monospace;
+}
+
.multi-view-log {
height: 100%;
margin: 0;
@@ -1044,7 +1311,7 @@ a{color:var(--link)}
.log-content {
flex: 1;
- overflow: auto;
+ overflow: hidden;
padding: 16px;
background: var(--bg);
}
@@ -1056,6 +1323,8 @@ a{color:var(--link)}
line-height: 1.5;
margin: 0;
tab-size: 2;
+ height: 100%;
+ overflow: auto;
}
/* Responsive */
@@ -1156,12 +1425,223 @@ footer{position:fixed;right:10px;bottom:10px;opacity:.6;font-size:11px}
}
.copy-fab.show{display:block}
.copy-fab:active{transform:translateY(1px)}
+
+/* Модальное окно с горячими клавишами */
+.hotkeys-modal {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100%;
+ height: 100%;
+ background: rgba(0, 0, 0, 0.5);
+ z-index: 10000;
+ display: none;
+ align-items: center;
+ justify-content: center;
+}
+
+.hotkeys-modal.show {
+ display: flex;
+}
+
+.hotkeys-modal-content {
+ background: var(--panel);
+ border: 1px solid var(--border);
+ border-radius: 12px;
+ box-shadow: 0 16px 64px rgba(0,0,0,0.4);
+ max-width: 500px;
+ width: 90%;
+ max-height: 80vh;
+ overflow-y: auto;
+ animation: modalSlideIn 0.3s ease;
+}
+
+@keyframes modalSlideIn {
+ from {
+ opacity: 0;
+ transform: scale(0.9) translateY(-20px);
+ }
+ to {
+ opacity: 1;
+ transform: scale(1) translateY(0);
+ }
+}
+
+.hotkeys-modal-header {
+ padding: 20px 24px 16px;
+ border-bottom: 1px solid var(--border);
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+}
+
+.hotkeys-modal-title {
+ font-size: 18px;
+ font-weight: 600;
+ color: var(--accent);
+ margin: 0;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.hotkeys-modal-close {
+ background: none;
+ border: none;
+ color: var(--muted);
+ cursor: pointer;
+ padding: 8px;
+ border-radius: 6px;
+ transition: all 0.2s ease;
+ font-size: 16px;
+}
+
+.hotkeys-modal-close:hover {
+ background: var(--chip);
+ color: var(--fg);
+}
+
+.hotkeys-modal-body {
+ padding: 20px 24px;
+}
+
+.hotkeys-section {
+ margin-bottom: 24px;
+}
+
+.hotkeys-section:last-child {
+ margin-bottom: 0;
+}
+
+.hotkeys-section-title {
+ font-size: 14px;
+ font-weight: 600;
+ color: var(--fg);
+ margin: 0 0 12px 0;
+ padding-bottom: 8px;
+ border-bottom: 1px solid var(--border);
+}
+
+.hotkeys-list {
+ list-style: none;
+ padding: 0;
+ margin: 0;
+}
+
+.hotkeys-list li {
+ display: flex;
+ align-items: center;
+ gap: 12px;
+ margin: 8px 0;
+ font-size: 13px;
+ color: var(--fg);
+}
+
+.hotkeys-list kbd {
+ background: var(--chip);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 4px 8px;
+ font-size: 11px;
+ font-family: monospace;
+ color: var(--accent);
+ min-width: 20px;
+ text-align: center;
+}
+
+/* Hotkeys notification */
+.hotkeys-notification {
+ position: fixed;
+ top: 20px;
+ right: 20px;
+ z-index: 10000;
+ background: var(--panel);
+ border: 1px solid var(--border);
+ border-radius: 8px;
+ box-shadow: 0 8px 32px rgba(0,0,0,0.3);
+ max-width: 350px;
+ animation: slideInRight 0.3s ease;
+}
+
+@keyframes slideInRight {
+ from {
+ transform: translateX(100%);
+ opacity: 0;
+ }
+ to {
+ transform: translateX(0);
+ opacity: 1;
+ }
+}
+
+.notification-content {
+ padding: 16px;
+ position: relative;
+}
+
+.notification-content h4 {
+ margin: 0 0 12px 0;
+ color: var(--accent);
+ font-size: 14px;
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.notification-content ul {
+ margin: 0;
+ padding: 0;
+ list-style: none;
+}
+
+.notification-content li {
+ margin: 8px 0;
+ font-size: 12px;
+ color: var(--fg);
+ display: flex;
+ align-items: center;
+ gap: 8px;
+}
+
+.notification-content kbd {
+ background: var(--chip);
+ border: 1px solid var(--border);
+ border-radius: 4px;
+ padding: 2px 6px;
+ font-size: 10px;
+ font-family: monospace;
+ color: var(--accent);
+}
+
+.notification-close {
+ position: absolute;
+ top: 8px;
+ right: 8px;
+ background: none;
+ border: none;
+ color: var(--muted);
+ cursor: pointer;
+ padding: 4px;
+ border-radius: 4px;
+ transition: all 0.2s ease;
+}
+
+.notification-close:hover {
+ background: var(--chip);
+ color: var(--fg);
+}
-