1+ import { Editor } from "@/Editor" ;
2+ import { Preview } from "@/Preview" ;
3+ import { Logo } from "@/components/Logo" ;
14import { ResizableHandle , ResizablePanelGroup } from "@/components/Resizable" ;
2- import { Editor } from "./Editor" ;
3- import { Logo } from "./components/Logo" ;
4- import { Preview } from "./Preview" ;
55import { useStore } from "@/store" ;
6- import { useEffect } from "react" ;
6+ import {
7+ DropdownMenu ,
8+ DropdownMenuContent ,
9+ DropdownMenuItem ,
10+ DropdownMenuPortal ,
11+ DropdownMenuTrigger ,
12+ } from "@/components/DropdownMenu" ;
13+ import { type FC , useEffect , useMemo } from "react" ;
714
815// Glue code required to be able to run wasm compiled Go code.
916import "@/utils/wasm_exec.js" ;
17+ import { useTheme } from "@/contexts/theme" ;
18+ import { MoonIcon , SunIcon , SunMoonIcon } from "lucide-react" ;
19+ import { Button } from "./components/Button" ;
1020
1121type GoPreviewDef = ( v : unknown ) => Promise < string > ;
1222
@@ -93,13 +103,11 @@ export const App = () => {
93103 >
94104 Support
95105 </ a >
106+ < ThemeSelector />
96107 </ div >
97108 </ nav >
98109
99- < ResizablePanelGroup
100- aria-hidden = { ! $wasmState }
101- direction = { "horizontal" }
102- >
110+ < ResizablePanelGroup aria-hidden = { ! $wasmState } direction = { "horizontal" } >
103111 { /* EDITOR */ }
104112 < Editor />
105113
@@ -111,3 +119,42 @@ export const App = () => {
111119 </ main >
112120 ) ;
113121} ;
122+
123+ const ThemeSelector : FC = ( ) => {
124+ const { theme, setTheme } = useTheme ( ) ;
125+
126+ const Icon = useMemo ( ( ) => {
127+ if ( theme === "system" ) {
128+ return SunMoonIcon ;
129+ }
130+
131+ if ( theme === "dark" ) {
132+ return MoonIcon ;
133+ }
134+
135+ return SunIcon ;
136+ } , [ theme ] ) ;
137+
138+ return (
139+ < DropdownMenu >
140+ < DropdownMenuTrigger asChild = { true } >
141+ < Button variant = "subtle" size = "icon-lg" >
142+ < Icon height = { 24 } width = { 24 } />
143+ </ Button >
144+ </ DropdownMenuTrigger >
145+ < DropdownMenuPortal >
146+ < DropdownMenuContent align = "end" >
147+ < DropdownMenuItem onClick = { ( ) => setTheme ( "dark" ) } >
148+ < MoonIcon width = { 24 } height = { 24 } /> Dark
149+ </ DropdownMenuItem >
150+ < DropdownMenuItem onClick = { ( ) => setTheme ( "light" ) } >
151+ < SunIcon width = { 24 } height = { 24 } /> Light
152+ </ DropdownMenuItem >
153+ < DropdownMenuItem onClick = { ( ) => setTheme ( "system" ) } >
154+ < SunMoonIcon width = { 24 } height = { 24 } /> System
155+ </ DropdownMenuItem >
156+ </ DropdownMenuContent >
157+ </ DropdownMenuPortal >
158+ </ DropdownMenu >
159+ ) ;
160+ } ;
0 commit comments