Skip to content

Commit d655fc7

Browse files
committed
ENG-6168: Add theme switcher
1 parent 3f2a08a commit d655fc7

File tree

3 files changed

+39
-0
lines changed

3 files changed

+39
-0
lines changed

demo/demo/demo.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ def index() -> rx.Component:
1616
position="top-center",
1717
),
1818
),
19+
ui.theme_switcher(class_name="absolute top-4 right-4"),
1920
class_name=ui.cn(
2021
"flex flex-col items-center justify-center h-screen", "bg-secondary-1"
2122
),

reflex_ui/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
_REFLEX_UI_MAPPING = {
66
"components.base.button": ["button"],
77
"components.base.avatar": ["avatar"],
8+
"components.base.theme_switcher": ["theme_switcher"],
89
}
910

1011
_SUBMODULES = {"components", "utils"}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
"""Theme switcher component"""
2+
3+
from reflex.components.component import Component, memo
4+
from reflex.components.core.cond import cond
5+
from reflex.components.el import Button, Div
6+
from reflex.style import LiteralColorMode, color_mode, set_color_mode
7+
8+
from reflex_ui.components.icons.hugeicon import hi
9+
from reflex_ui.utils.twmerge import cn
10+
11+
12+
def theme_switcher_item(mode: LiteralColorMode, icon: str) -> Component:
13+
active_cn = "text-secondary-12 shadow-small bg-secondary-1"
14+
unactive_cn = "hover:text-secondary-12 text-secondary-9"
15+
return Button.create(
16+
hi(icon, class_name="shrink-0", size=14),
17+
on_click=set_color_mode(mode),
18+
class_name=(
19+
"flex items-center cursor-pointer justify-center rounded-sm transition-color size-6",
20+
cond(mode == color_mode, active_cn, unactive_cn),
21+
),
22+
aria_label=f"Switch to {mode} mode",
23+
)
24+
25+
26+
@memo
27+
def theme_switcher(class_name: str = "") -> Component:
28+
"""Theme switcher component"""
29+
return Div.create(
30+
theme_switcher_item("system", "ComputerIcon"),
31+
theme_switcher_item("light", "Sun01Icon"),
32+
theme_switcher_item("dark", "Moon02Icon"),
33+
class_name=cn(
34+
"flex flex-row items-center bg-secondary-3 p-1 rounded-md w-fit",
35+
class_name,
36+
),
37+
)

0 commit comments

Comments
 (0)