Due to the valid markup of the binding syntax, aurelia is well suited to binding to svg. We’ve created some modular visualisation components using aurelia so have quite a bit of experience trying it out.
Firstly, we found out very quickly that binding to large path strings was very slow:
<path d.one-way="humongousPathString" ... ></path>
Aurelia bindings should obviously not be used to pass huge primitive types, so it was considerably faster to simply set the attribute manually:
this.pathElement.setAttribute('d', newPath);
svg
in component template
causes a few issues
Aurelia svg components have to be wrapped in an svg element:
<template>
<svg>
... component here
</svg>
</template>
To get anything complex to display correctly, you’ll probably need to include the following CSS. This is because the default for the non-root svg is to hide the overflow:
svg {
overflow: visible !important;
}
We spent ages trying to work out why the above approach was not working when we exported to png. It turns out you have to inline styles in every component for that to work. That gives us:
<template>
<svg style="overflow: visible">
</svg>
</template>
The nestled svg element also causes issues if we want to use a clipPath
from a parent component as they don’t appear to work in the child svg. This means we currently have to copy the clip dimensions into some components and render the <clipPath>
within it:
<template>
<svg style="overflow: visible">
<clipPath id="clip">
<rect id="clip-rect" x.bind="rect.x" y.bind="rect.y" width.bind="rect.width" height.bind="rect.height"></rect>
</clipPath>
<line clip-path="url(#clip)" stroke="#000" ...
</svg>
</template>
Update
See below for a possible solution