123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- """A switch component for toggling color_mode.
- To style components based on color mode, use style props with `color_mode_cond`:
- ```
- pc.text(
- "Hover over me",
- _hover={
- "background": pc.color_mode_cond(
- light="var(--chakra-colors-gray-200)",
- dark="var(--chakra-colors-gray-700)",
- ),
- },
- )
- ```
- """
- from __future__ import annotations
- from typing import Any
- from pynecone.components.component import Component
- from pynecone.components.layout.cond import Cond, cond
- from pynecone.components.media.icon import Icon
- from pynecone.style import color_mode, toggle_color_mode
- from pynecone.vars import BaseVar
- from .button import Button
- from .switch import Switch
- DEFAULT_COLOR_MODE = "light"
- DEFAULT_LIGHT_ICON = Icon.create(tag="sun")
- DEFAULT_DARK_ICON = Icon.create(tag="moon")
- def color_mode_cond(light: Any, dark: Any = None) -> BaseVar | Component:
- """Create a component or Prop based on color_mode.
- Args:
- light: The component or prop to render if color_mode is default
- dark: The component or prop to render if color_mode is non-default
- Returns:
- The conditional component or prop.
- """
- return cond(
- color_mode == DEFAULT_COLOR_MODE,
- light,
- dark,
- )
- class ColorModeIcon(Cond):
- """Displays the current color mode as an icon."""
- @classmethod
- def create(
- cls,
- light_component: Component | None = None,
- dark_component: Component | None = None,
- ):
- """Create an icon component based on color_mode.
- Args:
- light_component: the component to display when color mode is default
- dark_component: the component to display when color mode is dark (non-default)
- Returns:
- The conditionally rendered component
- """
- return color_mode_cond(
- light=light_component or DEFAULT_LIGHT_ICON,
- dark=dark_component or DEFAULT_DARK_ICON,
- )
- class ColorModeSwitch(Switch):
- """Switch for toggling chakra light / dark mode via toggle_color_mode."""
- @classmethod
- def create(cls, *children, **props):
- """Create a switch component bound to color_mode.
- Args:
- *children: The children of the component.
- **props: The props to pass to the component.
- Returns:
- The switch component.
- """
- return Switch.create(
- *children,
- is_checked=color_mode != DEFAULT_COLOR_MODE,
- on_change=toggle_color_mode,
- **props,
- )
- class ColorModeButton(Button):
- """Button for toggling chakra light / dark mode via toggle_color_mode."""
- @classmethod
- def create(cls, *children, **props):
- """Create a button component that calls toggle_color_mode on click.
- Args:
- *children: The children of the component.
- **props: The props to pass to the component.
- Returns:
- The switch component.
- """
- return Button.create(
- *children,
- on_click=toggle_color_mode,
- **props,
- )
|