Closed
Description
It’d be nice to support arbitrary clip paths. I can implement one by wrapping a mark like so:
function clip(mark, renderClip) {
return {
initialize(facets, channels) {
return mark.initialize(facets, channels);
},
filter(index, channels, values) {
return mark.filter(index, channels, values);
},
render(facet, scales, values, dimensions, context) {
const fragment = document.createDocumentFragment();
const svg = fragment.appendChild(mark.render(facet, scales, values, dimensions, context));
const clipPath = fragment.appendChild(renderClip(facet, scales, values, dimensions, context));
svg.setAttribute("clip-path", "url(#clip)");
clipPath.setAttribute("id", "clip");
return fragment;
}
};
}
That should probably extend Mark, though? And it should generate a unique identifier rather than using “clip”.
Then I could have a function that creates a clipPath element like so:
function renderClip(facet, scales) {
const clipPath = htl.svg`<clipPath>`;
for (const {a, b} of abDisplayabilityCoordinates.filter(d => d.displayable)) {
clipPath.appendChild(htl.svg`<rect
x=${scales.x(a - 0.0025)}
y=${scales.y(b + 0.0025)}
width=${scales.x(a + 0.0025) - scales.x(a - 0.0025) + 1}
height=${scales.y(b - 0.0025) - scales.y(b + 0.0025) + 1}
/>`);
}
return clipPath;
}
Ref. https://observablehq.com/@mjbo/oklab-named-colors-wheel