widget on svg image background

I am looking for creating widgets on a svg image in panel. I tried using Gridspec but it simply overrides the svg image (and does not overlap it). I want to create multiple widgets on 1 single svg image background. Is there a way to do that?

Using negative margin probably

Apologies for late reply.
Thanks for the idea, the negative margin works to overlap widgets on svg image.

However, I still feel there might be a better way to do this. By better, I mean that widgets should be placed anywhere I want just by dragging. Or may be, some other way.

Once again, thanks for this idea.

Hi @utkarshs1994

One way to solve this is to use ReactiveHTML.

import panel as pn
import param

pn.extension(sizing_mode="stretch_width", template="fast")

class SVGBackground(pn.reactive.ReactiveHTML):
    object = param.Parameter()
    svg = param.String()

    attachment = param.Selector(default="inherit", objects=["fixed", "inherit", "initial", "local", "revert", "scroll", "unset"])
    position = param.Selector(default="center center", objects=[
        "center center",
        "left top",
        "left center",
        "left bottom",
    repeat = param.Selector(default="no-repeat", objects=["no-repeat", "inherit", "initial", "repeat", "repeat-x", "repeat-y", "revert", "round", "space", "unset"])
    size = param.Selector(default="contain", objects=["auto", "contain", "cover", "initial", "revert", "unset"])

    _template = """
    <div id="pn-component" style="height:100%;width:100%">
        <div id="background" style="background-image: url(${svg});background-repeat: ${repeat};background-attachment: ${attachment};background-position: ${position};background-size: ${size};height:100%;width:100%">
button = pn.widgets.Button(name="Click me!", button_type="primary")
layout=pn.Row(pn.Spacer(), pn.Column(pn.Spacer(height=300), *[button.clone() for i in range(10)]), pn.Spacer())
svg_background = SVGBackground(object=layout, svg="https://upload.wikimedia.org/wikipedia/commons/c/c3/Python-logo-notext.svg", height=1000).servable()
pn.Param(svg_background, parameters=["repeat", "attachment", "position", "size"]).servable(area="sidebar")