Преглед изворни кода

Add support for toggling color mode ('night/day mode') (#382)

Co-authored-by: g0ee <0@g0.ee>
Co-authored-by: g0ee <adbokat.b.a.s.e@gmail.com>
advo-kat пре 2 година
родитељ
комит
41fffe677b

+ 1 - 0
pynecone/__init__.py

@@ -15,3 +15,4 @@ from .middleware import Middleware
 from .model import Model, session
 from .model import Model, session
 from .state import ComputedVar as var
 from .state import ComputedVar as var
 from .state import State
 from .state import State
+from .style import toggle_color_mode

+ 1 - 0
pynecone/compiler/compiler.py

@@ -17,6 +17,7 @@ DEFAULT_IMPORTS: ImportDict = {
     "next/router": {"useRouter"},
     "next/router": {"useRouter"},
     f"/{constants.STATE_PATH}": {"connect", "updateState", "E"},
     f"/{constants.STATE_PATH}": {"connect", "updateState", "E"},
     "": {"focus-visible/dist/focus-visible"},
     "": {"focus-visible/dist/focus-visible"},
+    "@chakra-ui/react": {"useColorMode"},
 }
 }
 
 
 
 

+ 3 - 0
pynecone/compiler/templates.py

@@ -197,3 +197,6 @@ ROUTER = f"const {constants.ROUTER} = useRouter()"
 
 
 # Sockets.
 # Sockets.
 SOCKET = "const socket = useRef(null)"
 SOCKET = "const socket = useRef(null)"
+
+# Color toggle
+COLORTOGGLE = "const { colorMode, toggleColorMode } = useColorMode()"

+ 4 - 1
pynecone/compiler/utils.py

@@ -17,6 +17,7 @@ from pynecone.components.base import (
     Main,
     Main,
     Script,
     Script,
     Title,
     Title,
+    ColorModeScript,
 )
 )
 from pynecone.components.component import Component, CustomComponent, ImportDict
 from pynecone.components.component import Component, CustomComponent, ImportDict
 from pynecone.state import State
 from pynecone.state import State
@@ -120,7 +121,8 @@ def compile_state(state: Type[State]) -> str:
     router = templates.ROUTER
     router = templates.ROUTER
     socket = templates.SOCKET
     socket = templates.SOCKET
     ready = templates.READY
     ready = templates.READY
-    return templates.join([synced_state, result, router, socket, ready])
+    color_toggle = templates.COLORTOGGLE
+    return templates.join([synced_state, result, router, socket, ready, color_toggle])
 
 
 
 
 def compile_events(state: Type[State]) -> str:
 def compile_events(state: Type[State]) -> str:
@@ -209,6 +211,7 @@ def create_document_root(stylesheets: List[str]) -> Component:
     return Html.create(
     return Html.create(
         DocumentHead.create(*sheets),
         DocumentHead.create(*sheets),
         Body.create(
         Body.create(
+            ColorModeScript.create(),
             Main.create(),
             Main.create(),
             Script.create(),
             Script.create(),
         ),
         ),

+ 1 - 1
pynecone/components/base/__init__.py

@@ -1,7 +1,7 @@
 """Base components."""
 """Base components."""
 
 
 from .body import Body
 from .body import Body
-from .document import DocumentHead, Html, Main, Script
+from .document import DocumentHead, Html, Main, Script, ColorModeScript
 from .head import Head
 from .head import Head
 from .link import Link
 from .link import Link
 from .meta import Description, Image, Title
 from .meta import Description, Image, Title

+ 13 - 0
pynecone/components/base/document.py

@@ -31,3 +31,16 @@ class Script(NextDocumentLib):
     """The document main scripts."""
     """The document main scripts."""
 
 
     tag = "NextScript"
     tag = "NextScript"
+
+
+class ChakraUiReactLib(Component):
+    """Chakra UI React document components."""
+
+    library = "@chakra-ui/react"
+
+
+class ColorModeScript(ChakraUiReactLib):
+    """Chakra color mode script."""
+
+    tag = "ColorModeScript"
+    initialColorMode = "light"

+ 5 - 0
pynecone/components/component.py

@@ -162,6 +162,11 @@ class Component(Base, ABC):
         Raises:
         Raises:
             ValueError: If the value is not a valid event chain.
             ValueError: If the value is not a valid event chain.
         """
         """
+        # If it's a JS var, return it.
+        if isinstance(value, Var):
+            if value.is_local is False and value.is_string is False:
+                return value
+
         # If it's an event chain var, return it.
         # If it's an event chain var, return it.
         if isinstance(value, Var):
         if isinstance(value, Var):
             if value.type_ is not EventChain:
             if value.type_ is not EventChain:

+ 9 - 0
pynecone/style.py

@@ -6,6 +6,15 @@ from pynecone import utils
 from pynecone.var import Var
 from pynecone.var import Var
 
 
 
 
+def toggle_color_mode():
+    """Toggle the color mode.
+
+    Returns:
+        Toggle color mode JS event as a variable
+    """
+    return Var.create(value="toggleColorMode", is_local=False, is_string=False)
+
+
 def convert(style_dict):
 def convert(style_dict):
     """Format a style dictionary.
     """Format a style dictionary.