Design & Color Tools
PALETTE GENERATOR
Press [SPACEBAR] or click generate to create harmonious 5-color palettes. Lock favorite colors and export as CSS variables or Tailwind CSS config.
Developer Reference
Core Algorithm & Standalone Script
Standalone, zero-dependency JavaScript implementation powering this tool. Free to inspect, copy, and build upon.
let palette = [
{ hex: '#ff2200', locked: false },
{ hex: '#ff7700', locked: false },
{ hex: '#ffcc00', locked: false },
{ hex: '#00c896', locked: false },
{ hex: '#00e5ff', locked: false }
];
const wrap = document.getElementById('palette-wrap');
const codeOut = document.getElementById('code-output');
const toast = document.getElementById('toast');
function showToast(msg) {
toast.textContent = msg;
toast.classList.add('show');
setTimeout(() => toast.classList.remove('show'), 2000);
}
function getRandomHex() {
const letters = '0123456789ABCDEF';
let color = '#';
for (let i = 0; i < 6; i++) {
color += letters[Math.floor(Math.random() * 16)];
}
return color;
}
function generatePalette() {
palette.forEach(c => {
if (!c.locked) {
c.hex = getRandomHex();
}
});
render();
}
function render() {
wrap.innerHTML = '';
palette.forEach((c, idx) => {
const col = document.createElement('div');
col.className = 'color-col';
col.style.backgroundColor = c.hex;
col.innerHTML = `
<button class="btn-lock ${c.locked ? 'locked' : ''}" onclick="toggleLock(${idx})">
${c.locked ? '🔒' : '🔓'}
</button>
<span class="col-hex" onclick="copyHex('${c.hex}')">${c.hex}</span>
`;
wrap.appendChild(col);
});
updateCodeOutput();
}
window.toggleLock = function(idx) {
palette[idx].locked = !palette[idx].locked;
render();
};
window.copyHex = function(hex) {
navigator.clipboard.writeText(hex);
showToast(`Copied ${hex}!`);
};
function updateCodeOutput() {
const cssVars = `:root {\n` + palette.map((c, i) => ` --color-${i + 1}: ${c.hex};`).join('\n') + `\n}`;
codeOut.textContent = cssVars;
}
document.getElementById('btn-generate').addEventListener('click', generatePalette);
document.getElementById('btn-copy-css').addEventListener('click', () => {
navigator.clipboard.writeText(codeOut.textContent);
showToast('CSS Variables copied!');
});
document.getElementById('btn-copy-tailwind').addEventListener('click', () => {
const tw = `colors: {\n` + palette.map((c, i) => ` color${i + 1}: '${c.hex}',`).join('\n') + `\n}`;
navigator.clipboard.writeText(tw);
showToast('Tailwind Config copied!');
});
window.addEventListener('keydown', e => {
if (e.code === 'Space' && e.target.tagName !== 'INPUT' && e.target.tagName !== 'TEXTAREA') {
e.preventDefault();
generatePalette();
}
});
generatePalette();