Spaces:
Running
Running
"""Simple dialog that looks similar to Angular Component Dialog.""" | |
from typing import Callable | |
import mesop as me | |
class State: | |
is_open: bool = False | |
def load(e: me.LoadEvent): | |
me.set_theme_mode("system") | |
def app(): | |
state = me.state(State) | |
with dialog( | |
is_open=state.is_open, | |
on_click_background=on_click_close_background, | |
): | |
me.text("Delete File", type="headline-5") | |
with me.box(): | |
me.text(text="Would you like to delete cat.jpeg?") | |
with dialog_actions(): | |
me.button("No", on_click=on_click_close_dialog) | |
me.button("Yes", on_click=on_click_close_dialog) | |
with me.box(style=me.Style(padding=me.Padding.all(30))): | |
me.button( | |
"Open Dialog", type="flat", color="primary", on_click=on_click_dialog_open | |
) | |
def on_click_close_background(e: me.ClickEvent): | |
state = me.state(State) | |
if e.is_target: | |
state.is_open = False | |
def on_click_close_dialog(e: me.ClickEvent): | |
state = me.state(State) | |
state.is_open = False | |
def on_click_dialog_open(e: me.ClickEvent): | |
state = me.state(State) | |
state.is_open = True | |
def dialog(*, is_open: bool, on_click_background: Callable | None = None): | |
"""Renders a dialog component. | |
The design of the dialog borrows from the Angular component dialog. So basically | |
rounded corners and some box shadow. | |
Args: | |
is_open: Whether the dialog is visible or not. | |
on_click_background: Event handler for when background is clicked | |
""" | |
with me.box( | |
style=me.Style( | |
background="rgba(0, 0, 0, 0.4)" | |
if me.theme_brightness() == "light" | |
else "rgba(255, 255, 255, 0.4)", | |
display="block" if is_open else "none", | |
height="100%", | |
overflow_x="auto", | |
overflow_y="auto", | |
position="fixed", | |
width="100%", | |
z_index=1000, | |
), | |
): | |
with me.box( | |
on_click=on_click_background, | |
style=me.Style( | |
place_items="center", | |
display="grid", | |
height="100vh", | |
), | |
): | |
with me.box( | |
style=me.Style( | |
background=me.theme_var("surface-container-lowest"), | |
border_radius=20, | |
box_sizing="content-box", | |
box_shadow=( | |
"0 3px 1px -2px #0003, 0 2px 2px #00000024, 0 1px 5px #0000001f" | |
), | |
margin=me.Margin.symmetric(vertical="0", horizontal="auto"), | |
padding=me.Padding.all(20), | |
) | |
): | |
me.slot() | |
def dialog_actions(): | |
"""Helper component for rendering action buttons so they are right aligned. | |
This component is optional. If you want to position action buttons differently, | |
you can just write your own Mesop markup. | |
""" | |
with me.box( | |
style=me.Style( | |
display="flex", justify_content="end", gap=5, margin=me.Margin(top=20) | |
) | |
): | |
me.slot() | |