sync: UI animations, select styling, TLS verify flag via proxy second line, brand spacing

This commit is contained in:
2025-09-14 14:01:25 +03:00
parent 338e65624f
commit 563663f9f1
9 changed files with 255 additions and 48 deletions

View File

@@ -1167,4 +1167,39 @@ header { position: relative; }
0% { text-shadow: 0 0 2px rgba(249,168,212,.85), 0 0 6px rgba(249,168,212,.60), 0 0 10px rgba(249,168,212,.35); }
50% { text-shadow: 0 0 3px rgba(249,168,212,1), 0 0 10px rgba(249,168,212,.85), 0 0 18px rgba(249,168,212,.55); }
100% { text-shadow: 0 0 2px rgba(249,168,212,.90), 0 0 8px rgba(249,168,212,.70), 0 0 14px rgba(249,168,212,.45); }
}
/* Fix SetVars inspector layout: make name input wide and mode select compact */
#inspector .var-row .v-name {
width: auto; /* override generic width:100% */
flex: 1 1 260px; /* grow and take available space */
min-width: 240px; /* keep readable even on narrow layouts */
}
#inspector .var-row select.v-mode {
width: auto !important; /* override earlier #inspector select.v-mode { width:100% } */
min-width: 120px; /* compact, but not too small */
flex: 0 0 auto; /* do not stretch in flex row */
}
#inspector .var-row .v-del {
flex: 0 0 auto; /* keep delete button compact */
}
/* SetVars row: keep mode selector visible even on narrow widths */
#inspector .var-row > div {
flex-wrap: wrap !important; /* allow wrapping to next line */
}
#inspector .var-row label {
flex: 0 0 auto; /* labels don't stretch */
}
#inspector .var-row .v-name {
flex: 1 1 260px; /* wide name input */
min-width: 260px;
max-width: calc(100% - 220px); /* leave room for mode+delete on one line when possible */
}
#inspector .var-row select.v-mode {
width: auto !important;
flex: 0 0 140px; /* fixed, visible width */
min-width: 120px;
margin-top: 4px; /* if wrapped to next line, add a little spacing */
}
#inspector .var-row .v-del {
flex: 0 0 auto;
}

View File

@@ -79,6 +79,7 @@
<button class="chip-btn" id="btn-vars">ПЕРЕМЕННЫЕ</button>
<button class="chip-btn" id="btn-scheme" title="Показать мини‑схему">СХЕМА</button>
<button class="chip-btn" id="btn-logs" title="Журнал HTTP запросов/ответов">ЛОГИ</button>
<button class="chip-btn" id="btn-cancel" title="Прервать текущее исполнение пайплайна">СТОП ⏹</button>
<a class="chip-btn" href="/" role="button">ДОМОЙ</a>
</div>
<!-- Danmaku overlay layer -->
@@ -1720,6 +1721,29 @@
loadPipeline();
refreshPresets();
// Wire manual cancel button
try {
const btnCancel = document.getElementById('btn-cancel');
if (btnCancel) {
btnCancel.addEventListener('click', async () => {
try {
btnCancel.disabled = true;
btnCancel.textContent = 'СТОП…';
const res = await fetch('/admin/cancel', { method: 'POST' });
if (res.ok) {
status('Отмена исполнения запрошена');
} else {
status('Ошибка запроса отмены: ' + res.status);
}
} catch (e) {
status('Ошибка запроса отмены');
} finally {
setTimeout(()=>{ try { btnCancel.disabled = false; btnCancel.textContent = 'СТОП ⏹'; } catch(_){} }, 600);
}
});
}
} catch(_) {}
// Run drawer wiring
(function(){
const openBtn = document.getElementById('btn-open-run');
@@ -2923,6 +2947,10 @@ el.style.top = Math.max(2, Math.min(vpH - 24, top)) + 'px';
es.onmessage = (e) => {
try {
const data = JSON.parse(e.data);
// Special handling for manual cancel notification
if (data && data.event === 'cancelled') {
try { status('Исполнение остановлено пользователем'); } catch(_){}
}
handleTraceEvent(data);
handleLogEvent(data);
} catch (_) {