import panel as pn import numpy as np import holoviews as hv pn.extension(sizing_mode='stretch_width') bootstrap = pn.template.BootstrapTemplate(title='Bootstrap Template') xs = np.linspace(0, np.pi) freq = pn.widgets.FloatSlider(name="Frequency", start=0, end=10, value=2) phase = pn.widgets.FloatSlider(name="Phase", start=0, end=np.pi) @pn.depends(freq=freq, phase=phase) def sine(freq, phase): return hv.Curve((xs, np.sin(xs*freq+phase))).opts( responsive=True, min_height=400) @pn.depends(freq=freq, phase=phase) def cosine(freq, phase): return hv.Curve((xs, np.cos(xs*freq+phase))).opts( responsive=True, min_height=400) bootstrap.sidebar.append(freq) bootstrap.sidebar.append(phase) bootstrap.main.append( pn.Row( pn.Card(hv.DynamicMap(sine), title='Sine'), pn.Card(hv.DynamicMap(cosine), title='Cosine') ) ) import time # Callback that will be called when the About button is clicked def about_callback(event): bootstrap.open_modal() time.sleep(10) bootstrap.close_modal() # Create, link and add the button to the sidebar btn = pn.widgets.Button(name="About") btn.on_click(about_callback) bootstrap.sidebar.append(btn) # Add some content to the modal bootstrap.modal.append("# About...") from panel.template import DefaultTheme DefaultTheme.find_theme(pn.template.MaterialTemplate) import param from panel.template.theme import Theme from bokeh.themes import DARK_MINIMAL class DarkTheme(Theme): """ The DarkTheme provides a dark color palette """ bokeh_theme = param.ClassSelector(class_=(Theme, str), default=DARK_MINIMAL) class MaterialDarkTheme(DarkTheme): # css = param.Filename() Here we could declare some custom CSS to apply # This tells Panel to use this implementation _template = pn.template.MaterialTemplate from panel.template import DarkTheme dark_material = pn.template.MaterialTemplate(title='Material Template', theme=DarkTheme) dark_material.sidebar.append(freq) dark_material.sidebar.append(phase) dark_material.main.append( pn.Row( pn.Card(hv.DynamicMap(sine), title='Sine'), pn.Card(hv.DynamicMap(cosine), title='Cosine') ) ) template = """ {% extends base %} {% block postamble %} {% endblock %} {% block contents %} {{ app_title }}

This is a Panel app with a custom template allowing us to compose multiple Panel objects into a single HTML document.


{{ embed(roots.A) }}
{{ embed(roots.B) }}
{% endblock %} """ tmpl = pn.Template(template) tmpl.add_variable('app_title', '

Custom Template App

') tmpl.add_panel('A', hv.Curve([1, 2, 3])) tmpl.add_panel('B', hv.Curve([1, 2, 3])) tmpl nb_template = """ {% extends base %} {% block contents %} {{ app_title }}

This is a Panel app with a custom template allowing us to compose multiple Panel objects into a single HTML document.


{{ embed(roots.A) }}
{{ embed(roots.B) }}
{% endblock %} """ tmpl = pn.Template(template, nb_template=nb_template) tmpl.add_variable('app_title', '

Custom Template App

') tmpl.add_panel('A', hv.Curve([1, 2, 3])) tmpl.add_panel('B', hv.Curve([1, 2, 3])) tmpl from jinja2 import Environment, FileSystemLoader env = Environment(loader=FileSystemLoader('.')) jinja_template = env.get_template('sample_template.html') tmpl = pn.Template(jinja_template) tmpl.add_panel('A', hv.Curve([1, 2, 3])) tmpl.add_panel('B', hv.Curve([1, 2, 3])) tmpl.servable()