/* ── Gradient Color Picker (Dark Mode) ─────────────────────
Usage: const hex = await openColorPicker(anchorEl, '#4285f4');
Returns hex string or null if cancelled.
────────────────────────────────────────────────────────── */
// ── HSV ↔ RGB helpers ─────────────────────────────────────
function hsvToRgb(h, s, v) {
h = h / 360 * 6;
const i = Math.floor(h), f = h - i, p = v * (1 - s), q = v * (1 - f * s), t = v * (1 - (1 - f) * s);
let r, g, b;
switch (i % 6) {
case 0: r = v; g = t; b = p; break;
case 1: r = q; g = v; b = p; break;
case 2: r = p; g = v; b = t; break;
case 3: r = p; g = q; b = v; break;
case 4: r = t; g = p; b = v; break;
case 5: r = v; g = p; b = q; break;
}
return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
}
function rgbToHsv(r, g, b) {
r /= 255; g /= 255; b /= 255;
const max = Math.max(r, g, b), min = Math.min(r, g, b), d = max - min;
let h = 0, s = max === 0 ? 0 : d / max, v = max;
if (d !== 0) {
switch (max) {
case r: h = ((g - b) / d + (g < b ? 6 : 0)); break;
case g: h = ((b - r) / d + 2); break;
case b: h = ((r - g) / d + 4); break;
}
h *= 60;
}
return [h, s, v];
}
function hexToRgb(hex) {
hex = hex.replace('#', '');
if (hex.length === 3) hex = hex[0]+hex[0]+hex[1]+hex[1]+hex[2]+hex[2];
return [parseInt(hex.slice(0,2),16), parseInt(hex.slice(2,4),16), parseInt(hex.slice(4,6),16)];
}
function rgbToHex(r, g, b) {
return '#' + [r, g, b].map(c => c.toString(16).padStart(2, '0')).join('');
}
// ── Active picker tracking ────────────────────────────────
let activePicker = null;
let activeOutsideHandler = null;
function closeActivePicker() {
if (activePicker) {
activePicker.remove();
activePicker = null;
}
if (activeOutsideHandler) {
document.removeEventListener('mousedown', activeOutsideHandler);
activeOutsideHandler = null;
}
}
// ── Main export ───────────────────────────────────────────
export function openColorPicker(anchorEl, currentColor = '#4285f4') {
closeActivePicker();
return new Promise((resolve) => {
let [h, s, v] = rgbToHsv(...hexToRgb(currentColor));
// ── Build DOM ─────────────────────────────────────────
const picker = document.createElement('div');
picker.className = 'gcp';
picker.innerHTML = `