181 lines
7.3 KiB
HTML
181 lines
7.3 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 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 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);
|
|
} catch (e) {
|
|
console.error("Load failed:", e);
|
|
}
|
|
}
|
|
|
|
// listen only to the explicit signal from ComfyUI
|
|
window.addEventListener("message", (event) => {
|
|
if (event.data && event.data.type === "RELOAD_BUFFER") {
|
|
console.log("Remote signal received: Reloading buffer...");
|
|
loadFromComfy();
|
|
}
|
|
});
|
|
|
|
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 () => {
|
|
const canvas = document.getElementById('canvas_minipaint');
|
|
if (!canvas) return alert("Canvas not found!");
|
|
btn.innerHTML = "⏳ SAVING...";
|
|
const dataUrl = canvas.toDataURL("image/png");
|
|
try {
|
|
const resp = await fetch("/mypaint/save_back", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ image: dataUrl })
|
|
});
|
|
const result = await resp.json();
|
|
if (resp.ok && window.opener) {
|
|
window.opener.postMessage({ type: "MINIPAINT_SAVED", filename: result.filename }, "*");
|
|
btn.innerHTML = "✅ SAVED!";
|
|
btn.style.background = "#28a745";
|
|
}
|
|
} catch (e) {
|
|
btn.innerHTML = "❌ ERROR";
|
|
btn.style.background = "#dc3545";
|
|
}
|
|
setTimeout(() => {
|
|
btn.innerHTML = "💾 SAVE TO COMFY";
|
|
btn.style.background = "#007bff";
|
|
}, 2000);
|
|
};
|
|
document.body.appendChild(btn);
|
|
}
|
|
|
|
window.addEventListener('load', () => {
|
|
createSaveButton();
|
|
// First load when the window opens
|
|
setTimeout(loadFromComfy, 2000);
|
|
});
|
|
</script>
|
|
|
|
</body>
|
|
</html>
|