Saved Tools

No tools bookmarked yet.

Sign In
⚠️

Report a Tool or Issue

MaskCurver Pro - Ultimate SVG Mask Generator

Processing changes...

MaskCurver Pro v3.5

Ultimate Responsive SVG Curve, Mask & Keyframe Architect

01

Select Vector Geometry Strategy

02

Parameter Architect

Wave Settings
Mask Output Mode Standard reveals inside path, Inverted cuts out inside path.
Frequency (Cycles) 3
Amplitude (Height) 60px
Phase Offset (Shift)
03

Mask Processing Filters & Precision

Mask Soft Blur Feathering 0px
Drop Shadow Blur 0px
Alpha Opacity Level 100%
Retro Noise Texture Intensity 0%
Code Precision Optimizer (Decimals) 1 decimal place
04

Media Background Studio

Select Image
05

Live Stage Studio

Viewport Resolution: 1920x1080 viewBox Interactive Stage
06

Real-Time Morphing Engine

Modify your controls and capture two separate shapes (State A & State B). Our engine will dynamically calculate keyframe interpolation values to test live morph transitions!

07

Export Code Studio

/* Compiling CSS Output... */
Production Asset Downloads
`;const blob = new Blob([html], { type: "text/html" }); const url = URL.createObjectURL(blob); const a = document.createElement("a"); a.href = url; a.download = `ProDevZone-masked-playground.html`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); showToast("HTML Playground file downloaded!"); }function updateCanvasAspectRatio() { const ratio = document.getElementById("canvas-aspect-ratio").value; const box = document.getElementById("preview-grid-box"); if (!box) return; box.className = "w-full rounded-2xl border border-gray-200 flex items-center justify-center relative overflow-hidden shadow-inner select-none transition-all duration-300"; if (showGrid) { box.classList.add("preview-checkerboard"); } else { box.classList.add("bg-white"); }if (ratio === "aspect-16-9") { box.classList.add("aspect-video"); } else if (ratio === "aspect-1-1") { box.classList.add("aspect-square"); } else if (ratio === "aspect-9-16") { box.classList.add("aspect-[9/16]", "max-w-[280px]", "mx-auto"); } renderHandlesOverlay(); }function togglePreviewGrid() { showGrid = !showGrid; const box = document.getElementById("preview-grid-box"); const btn = document.getElementById("toggle-grid"); if (!box || !btn) return; if (showGrid) { box.classList.add("preview-checkerboard"); box.classList.remove("bg-white"); btn.classList.add("bg-[#11999E]", "text-white"); btn.classList.remove("bg-white", "text-gray-400"); } else { box.classList.remove("preview-checkerboard"); box.classList.add("bg-white"); btn.classList.remove("bg-[#11999E]", "text-white"); btn.classList.add("bg-white", "text-gray-400"); } }function toggleHandlesOverlay() { showHandles = !showHandles; const el = document.getElementById("handles-container"); const btn = document.getElementById("toggle-handles"); if (!el || !btn) return; if (showHandles) { el.classList.remove("hidden"); btn.classList.add("bg-[#0A2647]"); btn.classList.remove("bg-white"); } else { el.classList.add("hidden"); btn.classList.add("bg-white"); btn.classList.remove("bg-[#0A2647]"); } renderHandlesOverlay(); }function loadLocalCustomImage(event) { const file = event.target.files[0]; if (file) { const reader = new FileReader(); reader.onload = function(e) { const stage = document.getElementById("masked-object"); if (stage) { stage.style.backgroundImage = `url('${e.target.result}')`; } const guide = document.getElementById("tracing-guide-object"); if (guide) { guide.style.backgroundImage = `url('${e.target.result}')`; } showToast("Custom background image loaded!"); }; reader.readAsDataURL(file); } }function updateParamValue(id, value) { const el = document.getElementById(id); if (el) el.innerText = value; }function showToast(message, isError = false) { const toast = document.getElementById("toast"); const msgEl = document.getElementById("toast-message"); const iconBox = document.getElementById("toast-icon-box"); if (!toast || !msgEl) return; msgEl.innerText = message; if (isError) { toast.classList.add("border-red-500/30"); toast.classList.remove("border-[#11999E]/30"); iconBox.innerHTML = ``; iconBox.className = "w-8 h-8 rounded-full bg-red-500/10 flex items-center justify-center"; } else { toast.classList.add("border-[#11999E]/30"); toast.classList.remove("border-red-500/30"); iconBox.innerHTML = ``; iconBox.className = "w-8 h-8 rounded-full bg-[#11999E]/10 flex items-center justify-center"; }toast.classList.remove("translate-y-24", "opacity-0"); toast.classList.add("translate-y-0", "opacity-100");setTimeout(() => { toast.classList.remove("translate-y-0", "opacity-100"); toast.classList.add("translate-y-24", "opacity-0"); }, 3000); }function generatePresetsDatabase() { masksPresetsDatabase = []; const categories = [ { id: 'wave', label: 'Wave Masks', prefixes: ["Fluid Tide", "Ocean Ripple", "Scenic Coast", "Pacific Wave", "Liquid Divider", "Rhythm Sweep", "Tidal Notch"] }, { id: 'blob', label: 'Organic Blobs', prefixes: ["Fluid Splat", "Biomorphic Cell", "Ectoplasm Frame", "Liquid Amoeba", "Splat Core", "Organic Soft", "Slime Node"] }, { id: 'bezier', label: 'Bezier Paths', prefixes: ["Premium Arch", "Parabolic Vault", "Swoosh Border", "Elliptical Edge", "Dynamic Swoosh", "Elegant Wave"] }, { id: 'polygon', label: 'Geometric Polygons', prefixes: ["Prismatic Diamond", "Cyber Star", "Hexagonal Shield", "Origami Fold", "Vector Hex", "Octagon Guard"] } ];categories.forEach(cat => { for (let i = 1; i <= 50; i++) { let prefix = cat.prefixes[i % cat.prefixes.length]; let name = `${prefix} Preset #${i}`; let desc = `Asymmetric mathematical shape iteration ${i} with optimized vector offsets.`; let params = {};if (cat.id === 'wave') { const sides = ["bottom", "top", "left", "right"]; params = { side: sides[i % 4], frequency: (i % 6) + 1, amplitude: 30 + (i * 2.5), phase: i * 7 }; } else if (cat.id === 'blob') { params = { complexity: (i % 8) + 4, inner: 50 + (i * 1.5), variance: 20 + (i * 1.8), seed: i * 13 }; } else if (cat.id === 'bezier') { params = { p0: 40 + (i * 2.2), p1x: (i * 1.7) % 100, p1y: (i * 3.1) % 200, p2x: 100 - ((i * 1.5) % 100), p2y: (i * 4.2) % 200, p3: 50 + (i * 2) }; } else if (cat.id === 'polygon') { const shapes = ["triangle", "rhombus", "pentagon", "hexagon", "octagon", "star-5", "star-8", "decagon"]; params = { shape: shapes[i % shapes.length], scale: 50 + (i % 11) * 4, rotate: i * 7.2 }; }masksPresetsDatabase.push({ id: `${cat.id}-preset-${i}`, name: name, cat: cat.id, desc: desc, params: params }); } }); }function populatePresetsList() { const container = document.getElementById("presets-grid-container"); if (!container) return; container.innerHTML = "";masksPresetsDatabase.forEach(preset => { const card = document.createElement("div"); card.className = "bg-white p-4 rounded-2xl border border-gray-200 hover:border-[#11999E]/40 transition-all duration-300 hover:shadow-md cursor-pointer flex flex-col justify-between group preset-item-card"; card.setAttribute("data-id", preset.id); card.setAttribute("data-category", preset.cat); card.setAttribute("data-name", preset.name.toLowerCase()); card.setAttribute("data-desc", preset.desc.toLowerCase()); card.onclick = () => applyPresetMask(preset.id);card.innerHTML = `
${preset.cat}

${preset.name}

${preset.desc}

Apply Mask
`; container.appendChild(card); });const matchCount = document.getElementById("preset-match-count"); if (matchCount) matchCount.innerText = masksPresetsDatabase.length; }function applyPresetMask(id) { const preset = masksPresetsDatabase.find(p => p.id === id); if (!preset) return;const cat = preset.cat; const p = preset.params;if (cat === "wave") { document.getElementById("wave-side").value = p.side; document.getElementById("wave-frequency").value = p.frequency; document.getElementById("wave-amplitude").value = p.amplitude; document.getElementById("wave-phase").value = p.phase; updateParamValue("wave-freq-val", p.frequency); updateParamValue("wave-amp-val", p.amplitude + "px"); updateParamValue("wave-phase-val", p.phase + "°"); } else if (cat === "blob") { document.getElementById("blob-complexity").value = p.complexity; document.getElementById("blob-inner").value = p.inner; document.getElementById("blob-variance").value = p.variance; document.getElementById("blob-seed").value = p.seed;updateParamValue("blob-complex-val", p.complexity); updateParamValue("blob-inner-val", p.inner + "px"); updateParamValue("blob-var-val", p.variance + "px"); } else if (cat === "bezier") { bezierHandles.p0y = p.p0; bezierHandles.p1x = p.p1x; bezierHandles.p1y = p.p1y; bezierHandles.p2x = p.p2x; bezierHandles.p2y = p.p2y; bezierHandles.p3y = p.p3;document.getElementById("bez-p0").value = p.p0; document.getElementById("bez-p1x").value = p.p1x; document.getElementById("bez-p1y").value = p.p1y; document.getElementById("bez-p2x").value = p.p2x; document.getElementById("bez-p2y").value = p.p2y; document.getElementById("bez-p3").value = p.p3; } else if (cat === "polygon") { document.getElementById("poly-shape").value = p.shape; document.getElementById("poly-scale").value = p.scale; document.getElementById("poly-rotation").value = p.rotate;updateParamValue("poly-scale-val", p.scale + "%"); updateParamValue("poly-rot-val", p.rotate + "°"); }switchCategory(cat); closePresetsModal(); showToast(`Preset "${preset.name}" applied!`); }function filterPresets() { const query = document.getElementById("preset-search").value.toLowerCase(); const cat = document.getElementById("preset-category-filter").value; const cards = document.getElementsByClassName("preset-item-card"); let count = 0;Array.from(cards).forEach(card => { const name = card.getAttribute("data-name"); const desc = card.getAttribute("data-desc"); const cardCat = card.getAttribute("data-category");const matchQuery = name.includes(query) || desc.includes(query); const matchCategory = cat === "all" || cardCat === cat;if (matchQuery && matchCategory) { card.classList.remove("hidden"); count++; } else { card.classList.add("hidden"); } });const matchCount = document.getElementById("preset-match-count"); if (matchCount) matchCount.innerText = count; }function openPresetsModal() { const modal = document.getElementById("presets-modal"); const box = document.getElementById("presets-modal-box"); if (modal && box) { modal.classList.remove("hidden"); modal.classList.add("flex"); setTimeout(() => { modal.classList.add("opacity-100"); box.classList.remove("scale-95"); box.classList.add("scale-100"); }, 10); } }function closePresetsModal() { const modal = document.getElementById("presets-modal"); const box = document.getElementById("presets-modal-box"); if (modal && box) { modal.classList.remove("opacity-100"); box.classList.remove("scale-100"); box.classList.add("scale-95"); setTimeout(() => { modal.classList.add("hidden"); modal.classList.remove("flex"); }, 150); } }window.onload = function() { renderCornersInputs(); renderEdgesInputs(); switchCategory("wave"); switchParamPanel("base"); updatePreviewMedium(); generatePresetsDatabase(); populatePresetsList(); setupInteractiveDragListeners(); };

Want to support our free tools?

Buy me a coffee
Person working

Best Online All-in-One Toolbox

ProDevZone is your ultimate destination for developer and creator utilities. From text manipulation and image processing to code formatting and SEO enhancements, we provide a comprehensive suite of online tools designed to streamline your daily tasks.