mirror of
http://10.0.2.1:3031/sauer/bfa-dryer-design.git
synced 2026-06-30 11:36:42 +10:00
Restore full working V1 from login commit
This commit is contained in:
parent
561d875e69
commit
a10a527a21
@ -170,8 +170,8 @@ body{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(
|
|||||||
<span class="sub">HMI Design Tool</span>
|
<span class="sub">HMI Design Tool</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="toolbar-right">
|
<div class="toolbar-right">
|
||||||
<select id="user-select"></select>
|
<span style="color:var(--blue);font-weight:600">{{ user }}</span>
|
||||||
<button onclick="addUser()">+ Add Person</button>
|
<a href="logout" style="color:var(--dim);text-decoration:none;font-size:12px">Logout</a>
|
||||||
<span style="color:var(--dim)">|</span>
|
<span style="color:var(--dim)">|</span>
|
||||||
<button class="mode-btn active" id="btn-edit" onclick="setMode('edit')">EDIT</button>
|
<button class="mode-btn active" id="btn-edit" onclick="setMode('edit')">EDIT</button>
|
||||||
<button class="mode-btn" id="btn-preview" onclick="setMode('preview')">PREVIEW</button>
|
<button class="mode-btn" id="btn-preview" onclick="setMode('preview')">PREVIEW</button>
|
||||||
@ -284,7 +284,7 @@ body{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(
|
|||||||
let layout = null;
|
let layout = null;
|
||||||
let currentPage = 0;
|
let currentPage = 0;
|
||||||
let mode = 'edit'; // 'edit' or 'preview'
|
let mode = 'edit'; // 'edit' or 'preview'
|
||||||
let currentUser = localStorage.getItem('bfa-user') || '';
|
let currentUser = '{{ user }}';
|
||||||
let simState = {}; // id -> {on:bool, value:number}
|
let simState = {}; // id -> {on:bool, value:number}
|
||||||
let commentTarget = null;
|
let commentTarget = null;
|
||||||
let sortableInstance = null;
|
let sortableInstance = null;
|
||||||
@ -303,17 +303,7 @@ async function init() {
|
|||||||
renderSchematic();
|
renderSchematic();
|
||||||
}
|
}
|
||||||
|
|
||||||
function initUsers() {
|
function initUsers() { /* handled by login page */ }
|
||||||
const sel = document.getElementById('user-select');
|
|
||||||
sel.innerHTML = '';
|
|
||||||
(layout.users || []).forEach(u => {
|
|
||||||
const o = document.createElement('option');
|
|
||||||
o.value = u; o.textContent = u;
|
|
||||||
if (u === currentUser) o.selected = true;
|
|
||||||
sel.appendChild(o);
|
|
||||||
});
|
|
||||||
sel.onchange = () => { currentUser = sel.value; localStorage.setItem('bfa-user', currentUser); };
|
|
||||||
}
|
|
||||||
|
|
||||||
function initSimState() {
|
function initSimState() {
|
||||||
layout.pages.forEach(p => p.cards.forEach(c => {
|
layout.pages.forEach(p => p.cards.forEach(c => {
|
||||||
@ -324,15 +314,7 @@ function initSimState() {
|
|||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
async function addUser() {
|
function addUser() { window.location.href = 'logout'; }
|
||||||
const name = prompt('Enter name:');
|
|
||||||
if (!name) return;
|
|
||||||
await fetch('api/users', {method:'POST', headers:{'Content-Type':'application/json'}, body:JSON.stringify({name})});
|
|
||||||
layout.users.push(name);
|
|
||||||
currentUser = name;
|
|
||||||
localStorage.setItem('bfa-user', name);
|
|
||||||
initUsers();
|
|
||||||
}
|
|
||||||
|
|
||||||
// ══════════════════════════════════════════════════════
|
// ══════════════════════════════════════════════════════
|
||||||
// MODE
|
// MODE
|
||||||
@ -849,8 +831,25 @@ function renderSchematic() {
|
|||||||
}
|
}
|
||||||
const cc = col||'var(--green)';
|
const cc = col||'var(--green)';
|
||||||
if (eq.anim === 'burner') {
|
if (eq.anim === 'burner') {
|
||||||
g.appendChild(mkSvgEl('circle', {'class':'anim-overlay burner-glow', id:'sim-'+eq.id,
|
// Flame SVG with flicker animation
|
||||||
cx:eq.x, cy:eq.y, r:r+4, fill:'none', stroke:col||'var(--amber)', 'stroke-width':'4'}));
|
const fg = mkSvgEl('g', {'class':'anim-overlay', id:'sim-'+eq.id});
|
||||||
|
fg.setAttribute('transform', `translate(${eq.x},${eq.y})`);
|
||||||
|
// Outer flame (orange)
|
||||||
|
fg.appendChild(mkSvgEl('path', {
|
||||||
|
d:`M 0 ${-r*0.3} Q ${-r*0.5} ${-r*0.8} ${-r*0.2} ${-r*1.2} Q 0 ${-r*1.5} ${r*0.2} ${-r*1.2} Q ${r*0.5} ${-r*0.8} 0 ${-r*0.3} Z`,
|
||||||
|
fill:'var(--amber)', opacity:'0.8', 'class':'burner-glow'
|
||||||
|
}));
|
||||||
|
// Inner flame (red-orange)
|
||||||
|
fg.appendChild(mkSvgEl('path', {
|
||||||
|
d:`M 0 ${-r*0.2} Q ${-r*0.25} ${-r*0.5} ${-r*0.1} ${-r*0.85} Q 0 ${-r*1.05} ${r*0.1} ${-r*0.85} Q ${r*0.25} ${-r*0.5} 0 ${-r*0.2} Z`,
|
||||||
|
fill:'var(--red)', opacity:'0.9', 'class':'burner-glow', style:'animation-delay:0.2s'
|
||||||
|
}));
|
||||||
|
// Core (bright)
|
||||||
|
fg.appendChild(mkSvgEl('ellipse', {
|
||||||
|
cx:0, cy: -r*0.4, rx: r*0.12, ry: r*0.25,
|
||||||
|
fill:'#ffdd44', opacity:'0.9', 'class':'burner-glow', style:'animation-delay:0.4s'
|
||||||
|
}));
|
||||||
|
g.appendChild(fg);
|
||||||
} else if (eq.anim === 'fan') {
|
} else if (eq.anim === 'fan') {
|
||||||
// Fan: 4 curved blades spinning inside the circle
|
// Fan: 4 curved blades spinning inside the circle
|
||||||
const ag = mkSvgEl('g', {'class':'anim-overlay', id:'sim-'+eq.id});
|
const ag = mkSvgEl('g', {'class':'anim-overlay', id:'sim-'+eq.id});
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user