Source code for panel.template.fast.base
import pathlib
import param
from ...io.state import state
from ...theme import THEMES, DefaultTheme
from ...theme.fast import Design, Fast
from ..base import BasicTemplate
from ..react import ReactTemplate
_ROOT = pathlib.Path(__file__).parent
[docs]class FastBaseTemplate(BasicTemplate):
accent_base_color = param.Color(default="#0072B5", doc="""
Optional body accent color override.""")
background_color = param.Color(doc="""
Optional body background color override.""")
corner_radius = param.Integer(default=3, bounds=(0,25), doc="""
The corner radius applied to controls.""")
font = param.String(doc="""
The font name(s) to apply.""")
font_url = param.String(doc="""
A font url to import.""")
header_neutral_color = param.Color(doc="""
Optional header neutral color override.""")
header_accent_base_color = param.Color(doc="""
Optional header accent color override.""")
neutral_color = param.Color(doc="""
Optional body neutral color override.""")
theme_toggle = param.Boolean(default=True, doc="""
If True a switch to toggle the Theme is shown.""")
shadow = param.Boolean(doc="""
Optional shadow override. Whether or not to apply shadow.""")
sidebar_footer = param.String("", doc="""
A HTML string appended to the sidebar""")
# Might be extended to accordion or tabs in the future
main_layout = param.Selector(default="card", label="Layout", objects=[None, "card"], doc="""
What to wrap the main components into. Options are '' (i.e. none) and 'card' (Default).
Could be extended to Accordion, Tab etc. in the future.""")
design = param.ClassSelector(class_=Design, default=Fast,
is_instance=False, instantiate=False, doc="""
A Design applies a specific design system to a template.""")
_css = [_ROOT / "fast.css"]
_js = _ROOT / "js/fast_template.js"
__abstract = True
def __init__(self, **params):
query_theme = self._get_theme_from_query_args()
if query_theme:
params['theme'] = THEMES[query_theme]
elif "theme" not in params:
params['theme'] = DefaultTheme
elif isinstance(params['theme'], str):
params['theme'] = THEMES[params['theme']]
if "accent" in params:
accent = params.pop("accent")
if "accent_base_color" not in params:
params["accent_base_color"] = accent
if "header_background" not in params:
params["header_background"] = accent
super().__init__(**params)
self.param.update({
p: v for p, v in self._design.theme.style.param.values().items()
if p != 'name' and p in self.param and p not in params
})
@staticmethod
def _get_theme_from_query_args():
theme_arg = state.session_args.get("theme", None)
if not theme_arg:
return
theme_arg = theme_arg[0].decode("utf-8")
return theme_arg.strip("'").strip('"')
def _update_vars(self):
super()._update_vars()
style = self._design.theme.style
style.param.update({
p: getattr(self, p) for p in style.param
if p != 'name' and p in self.param
})
self._render_variables["style"] = style
self._render_variables["theme_toggle"] = self.theme_toggle
self._render_variables["theme"] = self.theme.__name__[:-5].lower()
self._render_variables["sidebar_footer"] = self.sidebar_footer
self._render_variables["main_layout"] = self.main_layout
[docs]class FastGridBaseTemplate(FastBaseTemplate, ReactTemplate):
"""
Combines the FastTemplate and the React template.
"""
_resources = dict(js=ReactTemplate._resources['js'])
__abstract = True