Files
DemonAlone a83c4e69ce v2.3.5
Forced English as language by default.
security fix
2026-09-10 22:27:13 +03:00

239 lines
9.0 KiB
HTML

<!DOCTYPE html>
<html dir="ltr" lang="en-US">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="x-ua-compatible" content="IE=edge" />
<title>miniPaint - image editor</title>
<meta name="description" content="miniPaint is free online image editor using HTML5. Edit, adjust your images, add effects online in your browser, without installing anything..." />
<meta name="keywords" content="photo, image, picture, transparent, layers, free, edit, html5, canvas, javascript, online, photoshop, gimp, effects, sharpen, blur, magic eraser tool, clone tool, rotate, resize, photoshop online, online tools, tilt shift, sprites, keypoints" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1.0, user-scalable=0" />
<link rel="icon" sizes="192x192" href="images/favicon.png">
<!-- <link rel="manifest" href="dist/manifest.json"> -->
<!-- Google -->
<meta itemprop="name" content="miniPaint" />
<meta itemprop="description" content="miniPaint is free online image editor using HTML5. Edit, adjust your images, add effects online in your browser, without installing anything..." />
<meta itemprop="image" content="https://viliusle.github.io/miniPaint/images/preview.jpg" />
<!-- Twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:title" content="miniPaint" />
<meta name="twitter:description" content="miniPaint is free online image editor using HTML5. Edit, adjust your images, add effects online in your browser, without installing anything..." />
<meta name="twitter:image" content="https://viliusle.github.io/miniPaint/images/preview.jpg" />
<meta name="twitter:image:alt" content="miniPaint is free online image editor using HTML5. Edit, adjust your images, add effects online in your browser, without installing anything..." />
<!-- Facebook, Pinterest -->
<meta property="og:title" content="miniPaint" />
<meta property="og:type" content="article" />
<meta property="og:url" content="https://viliusle.github.io/miniPaint/" />
<meta property="og:image" content="https://viliusle.github.io/miniPaint/images/preview.jpg" />
<meta property="og:description" content="miniPaint is free online image editor using HTML5. Edit, adjust your images, add effects online in your browser, without installing anything..." />
<meta property="og:site_name" content="miniPaint" />
<script>
localStorage.setItem('lang', 'en');
Object.defineProperty(navigator, 'language', { value: 'en-US', configurable: true });
Object.defineProperty(navigator, 'languages', { value: ['en-US', 'en'], configurable: true });
</script>
<script src="bundle.js"></script>
</head>
<body>
<div class="wrapper">
<nav aria-label="Main Menu" class="main_menu" id="main_menu"></nav>
<div class="submenu">
<a class="logo" href="#">miniPaint</a>
<div class="block attributes" id="action_attributes"></div>
<button class="undo_button" id="undo_button" type="button">
<span class="sr_only">Undo</span>
</button>
</div>
<div class="sidebar_left" id="tools_container"></div>
<div class="middle_area" id="middle_area">
<canvas class="ruler_left" id="ruler_left"></canvas>
<canvas class="ruler_top" id="ruler_top"></canvas>
<div class="main_wrapper" id="main_wrapper">
<div class="canvas_wrapper" id="canvas_wrapper">
<div id="mouse"></div>
<div class="transparent-grid" id="canvas_minipaint_background"></div>
<canvas id="canvas_minipaint">
<div class="trn error">
Your browser does not support canvas or JavaScript is not enabled.
</div>
</canvas>
</div>
</div>
</div>
<div class="sidebar_right">
<div class="preview block">
<h2 class="trn toggle" data-target="toggle_preview">Preview</h2>
<div id="toggle_preview"></div>
</div>
<div class="colors block">
<h2 class="trn toggle" data-target="toggle_colors">Colors</h2>
<div class="content" id="toggle_colors"></div>
</div>
<div class="block" id="info_base">
<h2 class="trn toggle toggle-full" data-target="toggle_info">Information</h2>
<div class="content" id="toggle_info"></div>
</div>
<div class="details block" id="details_base">
<h2 class="trn toggle toggle-full" data-target="toggle_details">Layer details</h2>
<div class="content details-content" id="toggle_details"></div>
</div>
<div class="layers block">
<h2 class="trn">Layers</h2>
<div class="content" id="layers_base"></div>
</div>
</div>
</div>
<div class="mobile_menu">
<button class="left_mobile_menu" id="left_mobile_menu_button" type="button">
<span class="sr_only">Toggle Menu</span>
</button>
<button class="right_mobile_menu" id="mobile_menu_button" type="button">
<span class="sr_only">Toggle Menu</span>
</button>
</div>
<div class="hidden" id="tmp"></div>
<div id="popups"></div>
<script>
async function loadFromComfy() {
console.log("Loading image from buffer...");
try {
const response = await fetch("/mypaint/get_buffer");
if (!response.ok) return;
const blob = await response.blob();
const img = new Image();
img.onload = () => console.log('Original image size:', img.width, img.height);
img.src = URL.createObjectURL(blob);
const file = new File([blob], "image.png", { type: "image/png" });
const dataTransfer = new DataTransfer();
dataTransfer.items.add(file);
const dropEvent = new DragEvent("drop", {
bubbles: true,
cancelable: true,
dataTransfer: dataTransfer
});
const target = document.getElementById('canvas_minipaint') || document;
target.dispatchEvent(dropEvent);
setTimeout(() => {
const canvas = document.getElementById('canvas_minipaint');
if(canvas) console.log('Canvas size after load:', canvas.width, canvas.height);
}, 500);
} catch (e) {
console.error("Load failed:", e);
}
}
window.addEventListener("message", (event) => {
if (event.data && event.data.type === "RELOAD_BUFFER") {
console.log("Remote signal received: Reloading buffer...");
loadFromComfy();
}
});
// Function to create the button using exportToComfy
function createSaveButton() {
if (document.getElementById("comfy_save_btn")) return;
const btn = document.createElement("button");
btn.id = "comfy_save_btn";
btn.innerHTML = "💾 SAVE TO COMFY";
btn.style = "position:fixed; top:10px; left:50%; transform:translateX(-50%); z-index:10000; padding:10px 20px; background:#007bff; color:white; border:none; border-radius:5px; cursor:pointer; font-weight:bold; box-shadow: 0 4px 6px rgba(0,0,0,0.3);";
btn.onclick = async () => {
btn.innerHTML = "⏳ SAVING...";
// Get Canvas and export as Blob
const canvas = document.getElementById('canvas_minipaint');
let blob = null;
if (canvas) {
blob = await new Promise(resolve => canvas.toBlob(resolve, "image/png"));
}
if (!blob) {
btn.innerHTML = "❌ NO DATA";
setTimeout(() => {
btn.innerHTML = "💾 SAVE TO COMFY";
btn.style.background = "#007bff";
}, 2000);
return;
}
const formData = new FormData();
formData.append("image", blob, "mypaint_edit.png");
try {
const resp = await fetch("/mypaint/save_back", {
method: "POST",
body: formData
});
const result = await resp.json();
// Define the target window (parent or opener)
let target = null;
if (window.opener) {
target = window.opener;
} else if (window.parent && window.self !== window.top) {
target = window.parent;
}
if (resp.ok && target) {
target.postMessage({ type: "MINIPAINT_SAVED", filename: result.filename }, "*");
btn.innerHTML = "✅ SAVED!";
btn.style.background = "#28a745";
} else {
throw new Error("Save failed");
}
} catch (e) {
console.error(e);
btn.innerHTML = "❌ ERROR";
btn.style.background = "#dc3545";
}
setTimeout(() => {
btn.innerHTML = "💾 SAVE TO COMFY";
btn.style.background = "#007bff";
}, 2000);
};
document.body.appendChild(btn);
}
// Wait for window.file_save to appear before creating the button
let saveButtonCreated = false;
function waitForFileSave() {
if (window.file_save && typeof window.file_save.exportToComfy === 'function') {
if (!saveButtonCreated) {
createSaveButton();
saveButtonCreated = true;
console.log("Save button created after file_save ready");
}
} else {
setTimeout(waitForFileSave, 100);
}
}
window.addEventListener('load', () => {
waitForFileSave();
// Load image after 2 seconds (as before)
setTimeout(loadFromComfy, 2000);
});
</script>
</body>
</html>