import dash_mantine_components as dmc
from dash_iconify import DashIconify
from dash import Dash, _dash_renderer, Input, Output, State, callback, clientside_callback
_dash_renderer._set_react_version("18.2.0")
app = Dash(external_stylesheets=dmc.styles.ALL)
logo = "https://github.com/user-attachments/assets/c1ff143b-4365-4fd1-880f-3e97aab5c302"
theme_toggle = dmc.Switch(
offLabel=DashIconify(
icon="radix-icons:sun", width=15, color=dmc.DEFAULT_THEME["colors"]["yellow"][8]
),
onLabel=DashIconify(
icon="radix-icons:moon",
width=15,
color=dmc.DEFAULT_THEME["colors"]["yellow"][6],
),
id="color-scheme-toggle",
persistence=True,
color="grey",
)
layout = dmc.AppShell(
[
dmc.AppShellHeader(
dmc.Group(
[
dmc.Group(
[
dmc.Burger(
id="burger",
size="sm",
hiddenFrom="sm",
opened=False,
),
dmc.Image(src=logo, h=40),
dmc.Title("Demo App", c="blue"),
]
),
theme_toggle,
],
justify="space-between",
style={"flex": 1},
h="100%",
px="md",
),
),
dmc.AppShellNavbar(
id="navbar",
children=[
"Navbar",
*[dmc.Skeleton(height=28, mt="sm", animate=False) for _ in range(15)],
],
p="md",
),
dmc.AppShellMain("Main"),
],
header={"height": 60},
padding="md",
navbar={
"width": 300,
"breakpoint": "sm",
"collapsed": {"mobile": True},
},
id="appshell",
)
app.layout = dmc.MantineProvider(layout)
@callback(
Output("appshell", "navbar"),
Input("burger", "opened"),
State("appshell", "navbar"),
)
def navbar_is_open(opened, navbar):
navbar["collapsed"] = {"mobile": not opened}
return navbar
clientside_callback(
"""
(switchOn) => {
document.documentElement.setAttribute('data-mantine-color-scheme', switchOn ? 'dark' : 'light');
return window.dash_clientside.no_update
}
""",
Output("color-scheme-toggle", "id"),
Input("color-scheme-toggle", "checked"),
)
if __name__ == "__main__":
app.run(debug=True)