Artifact on SVG button with FastListTemplate

Hi,
Anyone else experiencing issues with SVG image button generating artifact when used with FastList Template? See screenshot below. Works fine without template, also tried it with Material and worked with that one too. See code below as well, please.
If anyone could advise on this one.

panel_svg_issue

import panel as pn
import param
from unsync import unsync
from time import sleep as sl

CSS = """
.unstyled-button {
    transition: all 0.8s;
  border: none;
  padding: 0;
  background: none;
  cursor: pointer;
}

.unstyled-button:hover {
    transform: rotate(45deg);
}

svg {
    /*background: pink;*/
}
"""

pn.sizing_mode="stretch_width"
# pn.sizing_mode="stretch_both"
pn.extension(raw_css=[CSS])

@unsync
def fingerprint_func():
    sl(3)
    print('fingerprint_func')
    contents.object = 'A'

@unsync
def checklist_func():
    sl(3)
    print('checklist_func')
    contents.object = 'B'

class ImageButton(pn.reactive.ReactiveHTML):
    svg = param.String(doc="The SVG")
    name = param.String(doc='Icon ID')

    _template = """<button class="unstyled-button" type="button" id="pn_image_button" onclick="${_do}">{{svg}}</button>"""

    def _do(self, _):
        # print(self.name)
        if self.name == 'fingerprint':
            fingerprint_func()
        elif self.name == 'checklist':
            checklist_func()

SVG1="""<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 0 24 24" width="48px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M17.81 4.47c-.08 0-.16-.02-.23-.06C15.66 3.42 14 3 12.01 3c-1.98 0-3.86.47-5.57 1.41-.24.13-.54.04-.68-.2-.13-.24-.04-.55.2-.68C7.82 2.52 9.86 2 12.01 2c2.13 0 3.99.47 6.03 1.52.25.13.34.43.21.67-.09.18-.26.28-.44.28zM3.5 9.72c-.1 0-.2-.03-.29-.09-.23-.16-.28-.47-.12-.7.99-1.4 2.25-2.5 3.75-3.27C9.98 4.04 14 4.03 17.15 5.65c1.5.77 2.76 1.86 3.75 3.25.16.22.11.54-.12.7-.23.16-.54.11-.7-.12-.9-1.26-2.04-2.25-3.39-2.94-2.87-1.47-6.54-1.47-9.4.01-1.36.7-2.5 1.7-3.4 2.96-.08.14-.23.21-.39.21zm6.25 12.07c-.13 0-.26-.05-.35-.15-.87-.87-1.34-1.43-2.01-2.64-.69-1.23-1.05-2.73-1.05-4.34 0-2.97 2.54-5.39 5.66-5.39s5.66 2.42 5.66 5.39c0 .28-.22.5-.5.5s-.5-.22-.5-.5c0-2.42-2.09-4.39-4.66-4.39s-4.66 1.97-4.66 4.39c0 1.44.32 2.77.93 3.85.64 1.15 1.08 1.64 1.85 2.42.19.2.19.51 0 .71-.11.1-.24.15-.37.15zm7.17-1.85c-1.19 0-2.24-.3-3.1-.89-1.49-1.01-2.38-2.65-2.38-4.39 0-.28.22-.5.5-.5s.5.22.5.5c0 1.41.72 2.74 1.94 3.56.71.48 1.54.71 2.54.71.24 0 .64-.03 1.04-.1.27-.05.53.13.58.41.05.27-.13.53-.41.58-.57.11-1.07.12-1.21.12zM14.91 22c-.04 0-.09-.01-.13-.02-1.59-.44-2.63-1.03-3.72-2.1-1.4-1.39-2.17-3.24-2.17-5.22 0-1.62 1.38-2.94 3.08-2.94s3.08 1.32 3.08 2.94c0 1.07.93 1.94 2.08 1.94s2.08-.87 2.08-1.94c0-3.77-3.25-6.83-7.25-6.83-2.84 0-5.44 1.58-6.61 4.03-.39.81-.59 1.76-.59 2.8 0 .78.07 2.01.67 3.61.1.26-.03.55-.29.64-.26.1-.55-.04-.64-.29-.49-1.31-.73-2.61-.73-3.96 0-1.2.23-2.29.68-3.24 1.33-2.79 4.28-4.6 7.51-4.6 4.55 0 8.25 3.51 8.25 7.83 0 1.62-1.38 2.94-3.08 2.94s-3.08-1.32-3.08-2.94c0-1.07-.93-1.94-2.08-1.94s-2.08.87-2.08 1.94c0 1.71.66 3.31 1.87 4.51.95.94 1.86 1.46 3.27 1.85.27.07.42.35.35.61-.05.23-.26.38-.47.38z"/></svg>
"""
SVG2="""<svg xmlns="http://www.w3.org/2000/svg" height="48px" viewBox="0 0 24 24" width="48px" fill="#000000"><path d="M0 0h24v24H0V0z" fill="none"/><path d="M18 9l-1.41-1.42L10 14.17l-2.59-2.58L6 13l4 4zm1-6h-4.18C14.4 1.84 13.3 1 12 1c-1.3 0-2.4.84-2.82 2H5c-.14 0-.27.01-.4.04-.39.08-.74.28-1.01.55-.18.18-.33.4-.43.64-.1.23-.16.49-.16.77v14c0 .27.06.54.16.78s.25.45.43.64c.27.27.62.47 1.01.55.13.02.26.03.4.03h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm-7-.25c.41 0 .75.34.75.75s-.34.75-.75.75-.75-.34-.75-.75.34-.75.75-.75zM19 19H5V5h14v14z"/></svg>
"""

contents = pn.pane.Str('Zerus')

butt1 = ImageButton(svg=SVG1, name='fingerprint', height=60, width=60)
butt2 = ImageButton(svg=SVG2, name='checklist', height=60, width=60)

col1 = pn.Column(butt1)
col2 = pn.Column(butt2)
col3 = pn.Column(butt1, butt2)

template = pn.template.FastListTemplate(
    sidebar_width=75,
    sidebar=[col3],
    main=[pn.Row(col3, contents)],
    header=[pn.Row(col1, col2)],
    theme_toggle=False,
).show()

Hi @danmaty

You can use the browsers “developer tools” to see where its coming from

If you change to

CSS = """
.bk-root button.unstyled-button {
    transition: all 0.8s;
    border: none;
    padding: 0;
    background: none;
    cursor: pointer;
}

.bk-root button.unstyled-button:hover {
    transform: rotate(45deg);
    background: none;
}

svg {
    /*background: pink;*/
}
"""

it works

Worked like a charm. Thanks @Marc !
I need to learn a bit more about CSS referencing.

1 Like