sync: UI animations, select styling, TLS verify flag via proxy second line, brand spacing
This commit is contained in:
@@ -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;
|
||||
}
|
||||
@@ -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 (_) {
|
||||
|
||||
Reference in New Issue
Block a user