42 lines
1.2 KiB
JavaScript
42 lines
1.2 KiB
JavaScript
|
import { helper } from '@ember/component/helper';
|
||
|
// arguments should be a list of {x: numLike, y: numLike} points
|
||
|
// numLike meaning they should be numbers (or numberlike strings i.e. "1" vs 1)
|
||
|
const curve = function() {
|
||
|
const args = [...arguments];
|
||
|
// our arguments are destination first control points last
|
||
|
// SVGs are control points first destination last
|
||
|
// we 'shift,push' to turn that around and then map
|
||
|
// through the values to convert it to 'x y, x y' etc
|
||
|
// whether the curve is cubic-bezier (C) or quadratic-bezier (Q)
|
||
|
// then depends on the amount of control points
|
||
|
// `Q|C x y, x y, x y` etc
|
||
|
return `${arguments.length > 2 ? `C` : `Q`} ${args
|
||
|
.concat(args.shift())
|
||
|
.map(p => Object.values(p).join(' '))
|
||
|
.join(',')}`;
|
||
|
};
|
||
|
const move = function(d) {
|
||
|
return `
|
||
|
M ${d.x} ${d.y}
|
||
|
`;
|
||
|
};
|
||
|
|
||
|
export default helper(function([dest], hash) {
|
||
|
const src = hash.src || { x: 0, y: 0 };
|
||
|
const type = hash.type || 'cubic';
|
||
|
let args = [
|
||
|
dest,
|
||
|
{
|
||
|
x: (src.x + dest.x) / 2,
|
||
|
y: src.y,
|
||
|
},
|
||
|
];
|
||
|
if (type === 'cubic') {
|
||
|
args.push({
|
||
|
x: args[1].x,
|
||
|
y: dest.y,
|
||
|
});
|
||
|
}
|
||
|
return `${move(src)}${curve(...args)}`;
|
||
|
});
|