gradientRadial = () => {
let id = DOM.uid().id,
offsets = [0, 100],
colors = ["white", "black"],
transform = "",
units = "objectBoundingBox",
spread = "pad",
cx = 50,
cy = 50,
r = 50,
fx = 50,
fy = 50,
fr = 0;
function gradient(svg){
let defs = svg.select("defs");
if (defs.empty()) {
defs = svg.append("defs");
}
defs.append("radialGradient")
.attr("id", id)
.attr("gradientTransform", transform)
.attr("gradientUnits", units)
.attr("spreadMethod", spread)
.attr("cx", `${cx}%`)
.attr("cy", `${cy}%`)
.attr("r", `${r}%`)
.attr("fx", `${fx}%`)
.attr("fy", `${fy}%`)
.attr("fr", `${fr}%`)
.selectAll("stop")
.data(offsets.map((offset, i) => [offset, colors[i]]))
.enter().append("stop")
.attr("offset", ([offset, _]) => `${offset}%`)
.attr("stop-color", ([_, color]) => color);
}
gradient.id = function(string){
return string ? (id = string, gradient) : id;
}
gradient.offsets = function(array){
return array ? (offsets = array, gradient) : offsets;
}
gradient.colors = function(array){
return array ? (colors = array, gradient) : colors;
}
gradient.transform = function(string){
return string ? (transform = string, gradient) : transform;
}
gradient.units = function(string){
return string ? (units = string, gradient) : units;
}
gradient.spread = function(string){
return string ? (spread = string, gradient) : spread;
}
gradient.cx = function(number){
return !isNaN(number) ? (cx = number, gradient) : cx;
}
gradient.cy = function(number){
return !isNaN(number) ? (cy = number, gradient) : cy;
}
gradient.r = function(number){
return !isNaN(number) ? (r = number, gradient) : r;
}
gradient.fx = function(number){
return !isNaN(number) ? (fx = number, gradient) : fx;
}
gradient.fy = function(number){
return !isNaN(number) ? (fy = number, gradient) : fy;
}
gradient.fr = function(number){
return !isNaN(number) ? (fr = number, gradient) : fr;
}
return gradient;
}