diff --git a/templates/editor.html b/templates/editor.html
index e414b50..2c6d003 100644
--- a/templates/editor.html
+++ b/templates/editor.html
@@ -170,8 +170,8 @@ body{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(
HMI Design Tool
-
-
+
{{ user }}
+
Logout
|
@@ -284,7 +284,7 @@ body{font-family:'Segoe UI',system-ui,sans-serif;background:var(--bg);color:var(
let layout = null;
let currentPage = 0;
let mode = 'edit'; // 'edit' or 'preview'
-let currentUser = localStorage.getItem('bfa-user') || '';
+let currentUser = '{{ user }}';
let simState = {}; // id -> {on:bool, value:number}
let commentTarget = null;
let sortableInstance = null;
@@ -303,17 +303,7 @@ async function init() {
renderSchematic();
}
-function initUsers() {
- 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 initUsers() { /* handled by login page */ }
function initSimState() {
layout.pages.forEach(p => p.cards.forEach(c => {
@@ -324,15 +314,7 @@ function initSimState() {
}));
}
-async function addUser() {
- 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();
-}
+function addUser() { window.location.href = 'logout'; }
// ══════════════════════════════════════════════════════
// MODE
@@ -849,8 +831,25 @@ function renderSchematic() {
}
const cc = col||'var(--green)';
if (eq.anim === 'burner') {
- g.appendChild(mkSvgEl('circle', {'class':'anim-overlay burner-glow', id:'sim-'+eq.id,
- cx:eq.x, cy:eq.y, r:r+4, fill:'none', stroke:col||'var(--amber)', 'stroke-width':'4'}));
+ // Flame SVG with flicker animation
+ 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') {
// Fan: 4 curved blades spinning inside the circle
const ag = mkSvgEl('g', {'class':'anim-overlay', id:'sim-'+eq.id});