pdf-lib icon indicating copy to clipboard operation
pdf-lib copied to clipboard

Add draw svg

Open Sharcoux opened this issue 3 years ago • 19 comments

What?

This PR adds support to drawing svg on a PDF Page.

      const doc = await PDFDocument.load(pdfBytes)
      const page = doc.getPage(0)
      page.drawSvg(svg, {
        x: 0,
        y: 100,
        width: 100,
        height: 100,
        fonts: {
              MyFont: await doc.embedFont(require('path/to/MyFont.ttf')),
        },
        fontSize: 12
      })

Why?

drawSvgPath is not enough in most cases to handle correctly the variety of svg users might have to draw on a pdf.

How?

Basically, we parse and interpret the svg xml and convert it into a sequence of instructions, relying on the current API offered by pdf-lib. Some edge cases could not yet be handled, though.

Testing?

We added 3 html test files in apps/web in the PR to test the result. We are currently using it, so it's working. I'll try to make a codesandbox as soon as we get a free time.

New Dependencies?

I needed to add a dependency to parse the html. We are internally using node-html-better-parser which is our fork of node-html-parser, but moving back to node-html-parser is also viable. It's just one file of 21Ko

I also needed to add a dependency to the color lib, in order to parse and convert every possible color format received in the svg.

Screenshots

image

Suggested Reading?

Yes

Anything Else?

Checklist

  • [x] I read CONTRIBUTING.md.
  • [x] I read MAINTAINERSHIP.md#pull-requests.
  • [ ] I added/updated unit tests for my changes.
  • [x] I added/updated integration tests for my changes.
  • [x] I ran the integration tests.
  • [x] I tested my changes in Node, Deno, and the browser.
  • [x] I viewed documents produced with my changes in Adobe Acrobat, Foxit Reader, Firefox, and Chrome.
  • [x] I added/updated doc comments for any new/modified public APIs.
  • [x] My changes work for both new and existing PDF files.
  • [x] I ran the linter on my changes.

Sharcoux avatar Nov 04 '21 15:11 Sharcoux

We'll check the missing points, but this won't impact the review. Don't hesitate if you have questions @Hopding

Sharcoux avatar Nov 04 '21 15:11 Sharcoux

@Hopding I think I'm done here. We will keep improving the support for wider svg instructions but there is no reason to wait for those improvements before publishing what we already have.

I didn't add unit tests. I don't have anyone free to do that for now. We might add them later. For now, just the fact that we have no impact on any existing code should be enough.

I also fixed this. I don't know if there was an open issue about it.

Tell me if you need something.

Sharcoux avatar Nov 09 '21 03:11 Sharcoux

@Sharcoux thanks for all the work you've done on this! Reviewing and merging this is going to take some time as it's a pretty hefty PR, but know that it is on my agenda.

I haven't dug in too far yet, but I will note upfront (as this has caused confusion in the past) that adding new dependencies to pdf-lib is a rare occurrence (for reasons documented here). That's not to say they can't be added, just that they have to match certain criteria.

Hopding avatar Nov 27 '21 19:11 Hopding

I understand your concern about adding a dependency.

There is no way to treat an xml like svg without a parser and a way to convert the colors. But if you want, we can make the libs as optional dependencies and display a warning when people try to use drawSvg without the dependencies in their app. I'm just not sure if this is doable in a way that is compatible with Webpack...

About the colors, we could also add our own implementation in pdf-lib if needed.

Sharcoux avatar Dec 07 '21 22:12 Sharcoux

@Hopding Happy new year =)

Have you thought more about this PR?

Sharcoux avatar Jan 14 '22 00:01 Sharcoux

anything we can help to move this forward?

siuying avatar Jan 31 '22 11:01 siuying

Oh, by the way, if anyone want to try the lib with this patch, you can add "@cantoo/pdf-lib": "1.17.0" to your package.json.

Sharcoux avatar Feb 08 '22 15:02 Sharcoux

@Hopding Would it be possible to fund merging of pull requests? This PR is a very important improvement to PDF-Lib, and yet it has been 6 months and it has not been merged yet. I am sure that a lot of us would be willing to contribute money to get some of the more important PR's merged ( there are other PR's with important fixed that need to be merged... )

dan-willett avatar May 10 '22 17:05 dan-willett

I wonder if Hopding hasn't abandoned the lib. We might be able to maintain our branch and include the most important PRs. More than money, we would probably need people to confirm that the PRs are working as expected before merging them.

Sharcoux avatar May 11 '22 23:05 Sharcoux

@Sharcoux I would like to see it forked off to a separate project. Of coarse this project (PDF-Lib) would be free to merge changes back in. But I would like to see a different name. The name PDF-Lib conflicts with PDFLib. The name should be unique and not conflict with other projects such as jsPDF, PDFjs, PDFKit, PDF Make, etc. Maybe something like Open PDF LibJS and come up with a logo to match...

This is the only Javascript library that I am aware of that allows to load existing PDF files and add to them. Which is a very important feature. I am currently using jsPDF to draw SVG's and then loading the PDF page into PDF-Lib, I am hoping that with this PR I would be able to not have to use jsPDF to import the SVG's. I like the jsPDF api, but the ability to load existing PDF files is a must have. I would like to see feature parity with jsPDF, PDFKit, PDF Make, html to pdf and markdown-pdf which would make this library the one solution to use.

I would like to see hopefully at least 10 people with write access that would be able to review and approve PR's, hopefully with consensus, but I would like to have enough people involved so that the absence of a few people will not block the progress of the project.

Also, I would like to see a road map for requested features, and the ability for people to get features added through bounties, contests, or events such as the Google Summer of Code or Hacktoberfest.

PDF generation is such an important capability and yet there is not a good open source project that fulfills the above requirements currently.

I am not sure that the structure of PDF-Lib is the best compared to the other projects, but it does have the one thing that is a requirement for the programs I am working on, and that is the ability to load existing PDF's and modify them.

dan-willett avatar May 23 '22 17:05 dan-willett

For people needing svg support, and maybe some other additions, and @dan-willett, we will do our best to maintain this fork. I opened the Issue section.

Sharcoux avatar Oct 22 '22 10:10 Sharcoux

I am using your patch to draw svg but having bad results.

below is the svg drawn by this lib https://ibb.co/D5cFZzt

but the actual svg is as follow https://ibb.co/pyR0KY6

Shasikhan avatar Nov 10 '23 06:11 Shasikhan

I don't see your images. Can you provide actual screenshots and the svg itself?

Sharcoux avatar Nov 10 '23 09:11 Sharcoux

Simulator Screenshot - iPhone 14 - 2023-11-10 at 11 54 59

Screenshot 2023-11-10 at 11 56 47 AM

Shasikhan avatar Nov 10 '23 14:11 Shasikhan

@Shasikhan Those are png. I need the original svg if you want me to help you.

Sharcoux avatar Nov 10 '23 19:11 Sharcoux

@Shasikhan Those are png. I need the original svg if you want me to help you.

Here is the svg

<svg width="400" height="300" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full" viewBox="0 0 400 300"> <rect width="400" height="300" x="0" y="0" id="0" fill="#fff" fill-opacity="1"></rect> <path d="M40 230.5L360 230.5" fill="none" stroke="#E0E6F1"></path> <path d="M40 196.5L360 196.5" fill="none" stroke="#E0E6F1"></path> <path d="M40 162.5L360 162.5" fill="none" stroke="#E0E6F1"></path> <path d="M40 128.5L360 128.5" fill="none" stroke="#E0E6F1"></path> <path d="M40 94.5L360 94.5" fill="none" stroke="#E0E6F1"></path> <path d="M40 60.5L360 60.5" fill="none" stroke="#E0E6F1"></path> <path d="M40.5 60L40.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M48.5 60L48.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M55.5 60L55.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M63.5 60L63.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M71.5 60L71.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M79.5 60L79.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M87.5 60L87.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M94.5 60L94.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M102.5 60L102.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M110.5 60L110.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M118.5 60L118.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M126.5 60L126.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M133.5 60L133.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M141.5 60L141.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M149.5 60L149.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M157.5 60L157.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M165.5 60L165.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M172.5 60L172.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M180.5 60L180.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M188.5 60L188.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M196.5 60L196.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M204.5 60L204.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M211.5 60L211.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M219.5 60L219.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M227.5 60L227.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M235.5 60L235.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M243.5 60L243.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M250.5 60L250.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M258.5 60L258.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M266.5 60L266.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M274.5 60L274.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M282.5 60L282.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M290.5 60L290.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M297.5 60L297.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M305.5 60L305.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M313.5 60L313.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M321.5 60L321.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M329.5 60L329.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M336.5 60L336.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M344.5 60L344.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M352.5 60L352.5 230" fill="none" stroke="#E0E6F1"></path> <path d="M360.5 60L360.5 230" fill="none" stroke="#E0E6F1"></path> <text dominant-baseline="central" text-anchor="middle" style="font-size:12px;font-family:sans-serif;" y="-6" transform="matrix(0,-1,1,0,0,145)" fill="#6E7079">Percentage</text> <path d="M40 230.5L360 230.5" fill="none" stroke="#6E7079" stroke-linecap="round"></path> <text dominant-baseline="central" text-anchor="end" style="font-size:12px;font-family:sans-serif;" transform="translate(32 230)" fill="#6E7079">0</text> <text dominant-baseline="central" text-anchor="end" style="font-size:12px;font-family:sans-serif;" transform="translate(32 196)" fill="#6E7079">20</text> <text dominant-baseline="central" text-anchor="end" style="font-size:12px;font-family:sans-serif;" transform="translate(32 162)" fill="#6E7079">40</text> <text dominant-baseline="central" text-anchor="end" style="font-size:12px;font-family:sans-serif;" transform="translate(32 128)" fill="#6E7079">60</text> <text dominant-baseline="central" text-anchor="end" style="font-size:12px;font-family:sans-serif;" transform="translate(32 94)" fill="#6E7079">80</text> <text dominant-baseline="central" text-anchor="end" style="font-size:12px;font-family:sans-serif;" transform="translate(32 60)" fill="#6E7079">100</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,43.9024,52)" fill="#6E7079">19.05</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,67.3171,52)" fill="#6E7079">01.06</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,90.7317,52)" fill="#6E7079">22.06</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,114.1463,52)" fill="#6E7079">01.09</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,137.561,52)" fill="#6E7079">19.11</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,160.9756,52)" fill="#6E7079">03.01</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,184.3902,52)" fill="#6E7079">12.05</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,207.8049,52)" fill="#6E7079">25.05</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,231.2195,52)" fill="#6E7079">20.06</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,254.6341,52)" fill="#6E7079">20.09</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,278.0488,52)" fill="#6E7079">26.01</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,301.4634,52)" fill="#6E7079">03.02</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,324.878,52)" fill="#6E7079">16.02</text> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" transform="matrix(0.643,-0.766,0.766,0.643,348.2927,52)" fill="#6E7079">03.10</text> <g clip-path="url(#zr0-c0)"> <path d="M43.9 60L51.7 201.1L59.5 60L67.3 102.5L75.1 131.4L82.9 60L90.7 131.4L98.5 60L106.3 60L114.1 145L122 73.6L129.8 60L137.6 60L145.4 60L153.2 60L161 60L168.8 60L176.6 60L184.4 158.6L192.2 60L200 60L207.8 60L215.6 145L223.4 145L231.2 60L239 60L246.8 60L254.6 60L262.4 73.6L270.2 158.6L278 60L285.9 60L293.7 60L301.5 60L309.3 60L317.1 60L324.9 60L332.7 60L340.5 60L348.3 131.4L356.1 60" fill="none" stroke="black" stroke-width="2" stroke-linejoin="bevel"></path> </g> <g clip-path="url(#zr0-c1)"> <path d="M43.9 60L51.7 201.1L59.5 60L67.3 102.5L75.1 131.4L82.9 60L90.7 131.4L98.5 60L106.3 60L114.1 145L122 73.6L129.8 60L137.6 60L145.4 60L153.2 60L161 60L168.8 60L176.6 60L184.4 158.6L192.2 60L200 60L207.8 60L215.6 145L223.4 145L231.2 60L239 60L246.8 60L254.6 60L262.4 73.6L270.2 158.6L278 60L285.9 60L293.7 60L301.5 60L309.3 60L317.1 60L324.9 60L332.7 60L340.5 60L348.3 131.4L356.1 60" fill="none" stroke="rgb(0,0,0)" stroke-width="2" stroke-opacity="0" stroke-linejoin="bevel"></path> </g> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,43.9024,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,51.7073,201.1)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,59.5122,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,67.3171,102.5)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,75.1219,131.4)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,82.9268,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,90.7317,131.4)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,98.5366,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,106.3415,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,114.1463,145)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,121.9512,73.6)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,129.7561,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,137.561,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,145.3659,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,153.1707,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,160.9756,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,168.7805,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,176.5854,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,184.3902,158.6)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,192.1951,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,200,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,207.8049,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,215.6098,145)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,223.4146,145)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,231.2195,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,239.0244,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,246.8293,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,254.6341,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,262.439,73.6)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,270.2439,158.6)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,278.0488,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,285.8537,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,293.6585,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,301.4634,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,309.2683,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,317.0732,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,324.8781,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,332.6829,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,340.4878,60)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,348.2927,131.4)" fill="black"></path> <path d="M1 0A1 1 0 1 1 1 -0.1A1 1 0 0 1 1 0" transform="matrix(5,0,0,5,356.0976,60)" fill="black"></path> <path d="M-5 -5l129.9 0l0 24l-129.9 0Z" transform="translate(140.0605 246)" fill="rgb(0,0,0)" fill-opacity="0" stroke="#ccc" stroke-width="0"></path> <path d="M19.5 14L5.5 14L5.5 0L19.5 0L19.5 14Z" transform="translate(134.5605 246)" fill="black"></path> <text dominant-baseline="central" text-anchor="start" style="font-size:12px;font-family:sans-serif;" xml:space="preserve" x="30" y="7" transform="translate(134.5605 246)" fill="#333">Depression Score</text> <path d="M-5 -5l10 0l0 10l-10 0Z" transform="translate(395 5)" fill="none" stroke="#ccc" stroke-width="0"></path> <defs > <clipPath id="zr0-c0"> <path d="M39 59l322 0l0 172l-322 0Z" fill="#000"></path> </clipPath> <clipPath id="zr0-c1"> <path d="M39 59l322 0l0 172l-322 0Z" fill="#000"></path> </clipPath> </defs> </svg>

Shasikhan avatar Nov 11 '23 12:11 Shasikhan

Sharcoux any tips? I have shared the svg in comment above.

Shasikhan avatar Nov 21 '23 07:11 Shasikhan

Ah, my bad, I missed your message. We'll have a look.

Sharcoux avatar Nov 21 '23 08:11 Sharcoux

The fix has been released in v1.19.19. Please, open tickets directly on our repo there. Will be easier to track.

Sharcoux avatar Nov 24 '23 10:11 Sharcoux