Discover unique coloring pages! Generate mandalas and patterns instantly in your browser. Print or download — unlimited fun awaits!
Bestis1 — Coloring Page Generator No login · No watermark · No daily limit
Coloring pages, generated on the spot. Build one-of-a-kind mandalas and patterns, or pick from a library of clean line-art scenes. Everything renders right here in your browser — print as many as you like.
Patterns Procedural
Library 14 designs
Pattern type
Mandala
Kaleidoscope
Florets
Geo Weave
Line weight
Fine
Medium
Bold
Generate new design
Download SVG
Print
All
Kids
Nature
Animals
Adult / Intricate
Line weight
Fine
Medium
Bold
Under the hood
Built from real geometry, not stock clip-art. 01
Procedural math Patterns mode builds each design live from radial symmetry, reflected tiles, and randomized seed values — every “Generate” click produces a genuinely new layout, not a re-skinned template.
02
Clean vector lines Every design is real SVG path geometry — not a raster trace — so lines stay crisp at any print size and the file downloads small.
03
Print-ready, instantly Designs are framed to a letter-page ratio by default. Download the SVG or print straight from the browser — no account, no watermark, no limit on how many you make.
');
win.document.close();
win.focus();
setTimeout(()=>{ win.print(); }, 250);
}/* =========================================================
LIBRARY MODE — curated SVG line-art designs
========================================================= */
const libGrid = document.getElementById('libGrid');
const libFilters = document.getElementById('libFilters');
const libDetail = document.getElementById('libDetail');
const libSheet = document.getElementById('libSheet');
const libSelectedName = document.getElementById('libSelectedName');
const downloadLibBtn = document.getElementById('downloadLibBtn');
const printLibBtn = document.getElementById('printLibBtn');// Each design: a function(strokeWeight) => inner SVG path markup, drawn on a 400x400 viewBox
const library = [
{ id:'cat', name:'Sitting Cat', cat:'kids', draw: sw => `
`},
{ id:'dog', name:'Playful Dog', cat:'kids', draw: sw => `
`},
{ id:'rocket', name:'Rocket Ship', cat:'kids', draw: sw => `
`},
{ id:'butterfly', name:'Butterfly', cat:'nature', draw: sw => `
`},
{ id:'leaf-branch', name:'Leaf Branch', cat:'nature', draw: sw => `
`},
{ id:'mountain', name:'Mountain Lake', cat:'nature', draw: sw => `
`},
{ id:'owl', name:'Owl on Branch', cat:'animals', draw: sw => `
`},
{ id:'fox', name:'Curious Fox', cat:'animals', draw: sw => `
`},
{ id:'fish', name:'Coral Fish', cat:'animals', draw: sw => `
`},
{ id:'flower-wreath', name:'Flower Wreath', cat:'adult', draw: sw => {
let p = '';
const n = 8;
for(let i=0;i
`;
}
p += `
`;
}
p += `
`;
return p;
}},
{ id:'paisley', name:'Paisley Tile', cat:'adult', draw: sw => `
`},
{ id:'lace-medallion', name:'Lace Medallion', cat:'adult', draw: sw => {
let p = '';
const rings = [60, 100, 140, 175];
rings.forEach((r, idx)=>{
const count = 8 + idx*4;
p += `
`;
for(let i=0;i
`;
}
});
return p;
}},
{ id:'pinecone', name:'Pinecone Sprig', cat:'nature', draw: sw => `
`},
{ id:'seahorse', name:'Seahorse', cat:'animals', draw: sw => `
`},
];function populateLibrary(filter){
libGrid.innerHTML = '';
const items = filter === 'all' ? library : library.filter(d=>d.cat === filter);
items.forEach(item=>{
const card = document.createElement('div');
card.className = 'lib-card';
card.dataset.id = item.id;
card.innerHTML = `
${item.draw(2)}
${item.name} ${item.cat}
`;
card.addEventListener('click', ()=> selectLibItem(item));
libGrid.appendChild(card);
});
}let currentLibItem = null;
let libStroke = 2;function selectLibItem(item){
currentLibItem = item;
libGrid.querySelectorAll('.lib-card').forEach(c=> c.classList.toggle('selected', c.dataset.id === item.id));
libDetail.classList.add('active');
libSelectedName.textContent = item.name;
renderLibDetail();
libDetail.scrollIntoView({behavior:'smooth', block:'nearest'});
}function renderLibDetail(){
if(!currentLibItem) return;
const svg = `
${currentLibItem.draw(libStroke)} `;
libSheet.innerHTML = svg + '
bestis1.com ';
}document.querySelectorAll('[data-libstroke]').forEach(btn=>{
btn.addEventListener('click', ()=>{
btn.parentElement.querySelectorAll('.opt-btn').forEach(b=>b.classList.remove('active'));
btn.classList.add('active');
libStroke = parseFloat(btn.dataset.libstroke);
renderLibDetail();
});
});libFilters.addEventListener('click', e=>{
const btn = e.target.closest('.filter-btn');
if(!btn) return;
libFilters.querySelectorAll('.filter-btn').forEach(b=>b.classList.remove('active'));
btn.classList.add('active');
populateLibrary(btn.dataset.filter);
libDetail.classList.remove('active');
});downloadLibBtn.addEventListener('click', ()=>{
const svgEl = libSheet.querySelector('svg');
if(svgEl && currentLibItem) downloadSVG(svgEl, 'bestis1-coloring-' + currentLibItem.id + '.svg');
});
printLibBtn.addEventListener('click', ()=> printSheet(libSheet));/* =========================================================
MODE TABS
========================================================= */
document.querySelectorAll('.mode-tab').forEach(tab=>{
tab.addEventListener('click', ()=>{
document.querySelectorAll('.mode-tab').forEach(t=>t.classList.remove('active'));
document.querySelectorAll('.mode-panel').forEach(p=>p.classList.remove('active'));
tab.classList.add('active');
document.getElementById('panel-' + tab.dataset.mode).classList.add('active');
});
});/* =========================================================
INIT
========================================================= */
renderPattern();
populateLibrary('all');})();