Skip to content

Instantly share code, notes, and snippets.

@mbostock
Last active March 22, 2023 13:34
Show Gist options
  • Select an option

  • Save mbostock/3e115519a1b495e0bd95 to your computer and use it in GitHub Desktop.

Select an option

Save mbostock/3e115519a1b495e0bd95 to your computer and use it in GitHub Desktop.
HCL Color Picker
<!DOCTYPE html>
<meta charset="utf-8">
<style>
canvas {
float: left;
width: 960px;
height: 166px;
border-bottom: solid 1px #fff;
}
</style>
<canvas id="l" width="960" height="1"></canvas>
<canvas id="a" width="960" height="1"></canvas>
<canvas id="b" width="960" height="1"></canvas>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js" charset="utf-8"></script>
<script>
var white = d3.rgb("white"),
black = d3.rgb("black");
var channels = {
h: {extent: [0, 360], x: 480},
c: {extent: [0, 100], x: 480},
l: {extent: [0, 150], x: 480}
};
var canvas = d3.selectAll("canvas")
.data(d3.entries(channels))
.call(d3.behavior.drag().on("drag", dragged))
.each(render);
function dragged(d) {
d.value.x = Math.max(0, Math.min(this.width - 1, d3.mouse(this)[0]));
canvas.each(render);
}
function render(d) {
var width = this.width,
context = this.getContext("2d"),
image = context.createImageData(width, 1),
i = -1;
var current = d3.hcl(
channels.h.extent[0] + channels.h.x / width * (channels.h.extent[1] - channels.h.extent[0]),
channels.c.extent[0] + channels.c.x / width * (channels.c.extent[1] - channels.c.extent[0]),
channels.l.extent[0] + channels.l.x / width * (channels.l.extent[1] - channels.l.extent[0])
);
for (var x = 0, v, c; x < width; ++x) {
if (x === d.value.x) {
c = white;
} else if (x === d.value.x - 1) {
c = black;
} else {
current[d.key] = d.value.extent[0] + x / (width - 1) * (d.value.extent[1] - d.value.extent[0]);
c = d3.rgb(current);
}
image.data[++i] = c.r;
image.data[++i] = c.g;
image.data[++i] = c.b;
image.data[++i] = 255;
}
context.putImageData(image, 0, 0);
}
</script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment