import { h } from 'preact'; import { useRef, useLayoutEffect } from 'preact/hooks'; export const Links = ({ links, ...props }) => { const canvas = useRef(null); useLayoutEffect(() => { const ctx = canvas.current.getContext('2d'); ctx.lineWidth = 4; ctx.lineCap = 'round'; ctx.lineJoin = 'round'; ctx.strokeStyle = '#696969'; ctx.fillStyle = '#696969'; ctx.shadowBlur = 2; ctx.shadowOffsetX = 2; ctx.shadowOffsetY = 4; ctx.clearRect(0, 0, canvas.current.width, canvas.current.height); for (const points of links) { ctx.shadowColor = 'rgba(0,0,0, 0.7)'; ctx.beginPath(); ctx.moveTo(...points[1]); for (let i = 4; i < points.length; i += 3) { const [ax, ay] = points[i - 2]; const [bx, by] = points[i - 1]; const [x, y] = points[i]; ctx.bezierCurveTo(ax, ay, bx, by, x, y); } ctx.stroke(); const [lx, ly] = points[points.length - 1]; const [tx, ty] = points[0]; const [dx, dy] = [tx - lx, ty - ly]; const [hx, hy] = [dy*0.7, dx*-0.7]; ctx.shadowColor = 'transparent'; ctx.beginPath(); ctx.moveTo(lx + dx*0.8, ly + dy*0.8); ctx.lineTo(lx - dx*0.5 + hx, ly - dy*0.5 + hy); ctx.lineTo(lx - dx*0.5 - hx, ly - dy*0.5 - hy); ctx.fill(); } }); return ( ); };