// ── Avatar Editor Modal ──
// Wiederverwendbar für Session + Agent Avatar-Bearbeitung.
//
// Usage:
// const editor = AvatarEditor.init({
// previewEl: document.getElementById('myPreview'),
// initialImage: 'data:image/...' || null,
// initialScale: 1.5,
// onChange(imageData, scale) { ... }
// });
// // Cleanup:
// editor.destroy();
// // Get current values:
// editor.getImage(); // data-url or null
// editor.getScale(); // number
var AvatarEditor = (function () {
function init(opts) {
var previewEl = opts.previewEl;
var imageData = opts.initialImage || null;
var scale = opts.initialScale || 1;
var onChange = opts.onChange || function () {};
var overlay = null;
var pasteHandler = null;
var kreaAvailable = false;
// Krea-Status prüfen
apiKreaStatus().then(function (s) { kreaAvailable = s.configured; }).catch(function () {});
// Preview rendern
function renderPreview() {
if (imageData) {
previewEl.innerHTML = '';
previewEl.classList.add('has-image');
} else {
previewEl.innerHTML = '?';
previewEl.classList.remove('has-image');
}
}
renderPreview();
// Click → Modal öffnen
previewEl.style.cursor = 'pointer';
previewEl.addEventListener('click', openModal);
// Paste Handler (global, immer aktiv)
document.addEventListener('paste', pasteHandler = function (e) {
if (overlay) return; // Modal offen → Paste dort behandeln
var items = e.clipboardData && e.clipboardData.items;
if (!items) return;
for (var i = 0; i < items.length; i++) {
if (items[i].type.indexOf('image/') === 0) {
e.preventDefault();
readFile(items[i].getAsFile());
return;
}
}
});
function readFile(file) {
if (!file) return;
var reader = new FileReader();
reader.onload = function () {
imageData = reader.result;
renderPreview();
onChange(imageData, scale);
if (overlay) refreshModal();
};
reader.readAsDataURL(file);
}
function setImage(data) {
imageData = data;
scale = 1;
renderPreview();
onChange(imageData, scale);
}
function openModal() {
if (overlay) return;
overlay = document.createElement('div');
overlay.className = 'av-overlay';
overlay.innerHTML =
'