// ui.js — kleine DOM-Helfer, Toast, Badge, Escaping + Inline-Icon-Set.
// Bewusst kein Icon-Font / kein CDN: SVGs als Strings, faerben via currentColor.
export const $ = (s, r = document) => r.querySelector(s);
export const $$ = (s, r = document) => [...r.querySelectorAll(s)];
export function esc(s) {
return String(s ?? "").replace(/[&<>]/g, c => ({ "&": "&", "<": "<", ">": ">" }[c]));
}
let _tt;
export function toast(msg, err = false) {
const t = $("#toast");
if (!t) return;
t.textContent = msg;
t.className = "toast show" + (err ? " err" : "");
clearTimeout(_tt);
_tt = setTimeout(() => (t.className = "toast"), 3200);
}
// Modell-Status -> Badge-HTML
export function badge(state) {
if (state === "running" || state === "ready") return 'geladen';
if (state === "loading" || state === "starting") return 'lädt…';
return 'bereit';
}
// relative Zeit aus Unix-Sekunden (z.B. "2m", "13h")
export function ago(ts) {
if (!ts) return "";
const s = Math.max(0, Math.floor(Date.now() / 1000 - ts));
if (s < 60) return s + "s";
if (s < 3600) return Math.floor(s / 60) + "m";
if (s < 86400) return Math.floor(s / 3600) + "h";
return Math.floor(s / 86400) + "d";
}
const _svg = (p) =>
``;
// Icon-Set (Stroke-Style, an die Referenz angelehnt)
export const ICON = {
logo: _svg(''),
grid: _svg(''),
cpu: _svg(''),
pulse: _svg(''),
server: _svg(''),
book: _svg(''),
help: _svg(''),
settings: _svg(''),
swap: _svg(''),
monitor: _svg(''),
layers: _svg(''),
alert: _svg(''),
gauge: _svg(''),
};
export function icon(name) { return ICON[name] || ""; }