瀏覽代碼

Progress component to support `color_scheme` on component level (#2684)

* Progress component to support `color_scheme` on component level

* pyi fix
Elijah Ahianyo 1 年之前
父節點
當前提交
a6fb25e139
共有 2 個文件被更改,包括 111 次插入10 次删除
  1. 40 8
      reflex/components/radix/primitives/progress.py
  2. 71 2
      reflex/components/radix/primitives/progress.pyi

+ 40 - 8
reflex/components/radix/primitives/progress.py

@@ -2,11 +2,13 @@
 
 
 from __future__ import annotations
 from __future__ import annotations
 
 
-from typing import Optional
+from typing import Optional, Union
 
 
 from reflex.components.component import Component, ComponentNamespace
 from reflex.components.component import Component, ComponentNamespace
+from reflex.components.core.colors import color
 from reflex.components.radix.primitives.accordion import DEFAULT_ANIMATION_DURATION
 from reflex.components.radix.primitives.accordion import DEFAULT_ANIMATION_DURATION
 from reflex.components.radix.primitives.base import RadixPrimitiveComponentWithClassName
 from reflex.components.radix.primitives.base import RadixPrimitiveComponentWithClassName
+from reflex.components.radix.themes.base import LiteralAccentColor
 from reflex.style import Style
 from reflex.style import Style
 from reflex.vars import Var
 from reflex.vars import Var
 
 
@@ -57,10 +59,26 @@ class ProgressIndicator(ProgressComponent):
     # The maximum progress value.
     # The maximum progress value.
     max: Var[Optional[int]]
     max: Var[Optional[int]]
 
 
+    # The color scheme of the progress indicator.
+    color_scheme: Var[LiteralAccentColor]
+
     def _apply_theme(self, theme: Component):
     def _apply_theme(self, theme: Component):
+        global_color_scheme = getattr(theme, "accent_color", None)
+
+        if global_color_scheme is None and self.color_scheme is None:
+            raise ValueError(
+                "`color_scheme` cannot be None. Either set the `color_scheme` prop on the progress indicator "
+                "component or set the `accent_color` prop in your global theme."
+            )
+
+        color_scheme = color(
+            self.color_scheme if self.color_scheme is not None else global_color_scheme,  # type: ignore
+            9,
+        )
+
         self.style = Style(
         self.style = Style(
             {
             {
-                "background-color": "var(--accent-9)",
+                "background-color": color_scheme,
                 "width": "100%",
                 "width": "100%",
                 "height": "100%",
                 "height": "100%",
                 f"transition": f"transform {DEFAULT_ANIMATION_DURATION}ms linear",
                 f"transition": f"transform {DEFAULT_ANIMATION_DURATION}ms linear",
@@ -72,20 +90,28 @@ class ProgressIndicator(ProgressComponent):
             }
             }
         )
         )
 
 
+    def _exclude_props(self) -> list[str]:
+        return ["color_scheme"]
+
 
 
 class Progress(ComponentNamespace):
 class Progress(ComponentNamespace):
-    """High level API for progress bar."""
+    """High-level API for progress bar."""
 
 
     root = staticmethod(ProgressRoot.create)
     root = staticmethod(ProgressRoot.create)
     indicator = staticmethod(ProgressIndicator.create)
     indicator = staticmethod(ProgressIndicator.create)
 
 
     @staticmethod
     @staticmethod
-    def __call__(width: Optional[str] = "100%", **props) -> Component:
-        """High level API for progress bar.
+    def __call__(
+        width: Optional[str] = "100%",
+        color_scheme: Optional[Union[Var, LiteralAccentColor]] = None,
+        **props,
+    ) -> Component:
+        """High-level API for progress bar.
 
 
         Args:
         Args:
-            width: The width of the progerss bar
-            **props: The props of the progress bar
+            width: The width of the progress bar.
+            **props: The props of the progress bar.
+            color_scheme: The color scheme of the progress indicator.
 
 
         Returns:
         Returns:
             The progress bar.
             The progress bar.
@@ -93,9 +119,15 @@ class Progress(ComponentNamespace):
         style = props.setdefault("style", {})
         style = props.setdefault("style", {})
         style.update({"width": width})
         style.update({"width": width})
 
 
+        progress_indicator_props = (
+            {"color_scheme": color_scheme} if color_scheme is not None else {}
+        )
+
         return ProgressRoot.create(
         return ProgressRoot.create(
             ProgressIndicator.create(
             ProgressIndicator.create(
-                value=props.get("value"), max=props.get("max", 100)
+                value=props.get("value"),
+                max=props.get("max", 100),
+                **progress_indicator_props,  # type: ignore
             ),
             ),
             **props,
             **props,
         )
         )

+ 71 - 2
reflex/components/radix/primitives/progress.pyi

@@ -7,10 +7,12 @@ from typing import Any, Dict, Literal, Optional, Union, overload
 from reflex.vars import Var, BaseVar, ComputedVar
 from reflex.vars import Var, BaseVar, ComputedVar
 from reflex.event import EventChain, EventHandler, EventSpec
 from reflex.event import EventChain, EventHandler, EventSpec
 from reflex.style import Style
 from reflex.style import Style
-from typing import Optional
+from typing import Optional, Union
 from reflex.components.component import Component, ComponentNamespace
 from reflex.components.component import Component, ComponentNamespace
+from reflex.components.core.colors import color
 from reflex.components.radix.primitives.accordion import DEFAULT_ANIMATION_DURATION
 from reflex.components.radix.primitives.accordion import DEFAULT_ANIMATION_DURATION
 from reflex.components.radix.primitives.base import RadixPrimitiveComponentWithClassName
 from reflex.components.radix.primitives.base import RadixPrimitiveComponentWithClassName
+from reflex.components.radix.themes.base import LiteralAccentColor
 from reflex.style import Style
 from reflex.style import Style
 from reflex.vars import Var
 from reflex.vars import Var
 
 
@@ -188,6 +190,68 @@ class ProgressIndicator(ProgressComponent):
         *children,
         *children,
         value: Optional[Union[Var[Optional[int]], Optional[int]]] = None,
         value: Optional[Union[Var[Optional[int]], Optional[int]]] = None,
         max: Optional[Union[Var[Optional[int]], Optional[int]]] = None,
         max: Optional[Union[Var[Optional[int]], Optional[int]]] = None,
+        color_scheme: Optional[
+            Union[
+                Var[
+                    Literal[
+                        "tomato",
+                        "red",
+                        "ruby",
+                        "crimson",
+                        "pink",
+                        "plum",
+                        "purple",
+                        "violet",
+                        "iris",
+                        "indigo",
+                        "blue",
+                        "cyan",
+                        "teal",
+                        "jade",
+                        "green",
+                        "grass",
+                        "brown",
+                        "orange",
+                        "sky",
+                        "mint",
+                        "lime",
+                        "yellow",
+                        "amber",
+                        "gold",
+                        "bronze",
+                        "gray",
+                    ]
+                ],
+                Literal[
+                    "tomato",
+                    "red",
+                    "ruby",
+                    "crimson",
+                    "pink",
+                    "plum",
+                    "purple",
+                    "violet",
+                    "iris",
+                    "indigo",
+                    "blue",
+                    "cyan",
+                    "teal",
+                    "jade",
+                    "green",
+                    "grass",
+                    "brown",
+                    "orange",
+                    "sky",
+                    "mint",
+                    "lime",
+                    "yellow",
+                    "amber",
+                    "gold",
+                    "bronze",
+                    "gray",
+                ],
+            ]
+        ] = None,
         as_child: Optional[Union[Var[bool], bool]] = None,
         as_child: Optional[Union[Var[bool], bool]] = None,
         style: Optional[Style] = None,
         style: Optional[Style] = None,
         key: Optional[Any] = None,
         key: Optional[Any] = None,
@@ -248,6 +312,7 @@ class ProgressIndicator(ProgressComponent):
             *children: The children of the component.
             *children: The children of the component.
             value: The current progress value.
             value: The current progress value.
             max: The maximum progress value.
             max: The maximum progress value.
+            color_scheme: The color scheme of the progress indicator.
             as_child: Change the default rendered element for the one passed as a child.
             as_child: Change the default rendered element for the one passed as a child.
             style: The style of the component.
             style: The style of the component.
             key: A unique key for the component.
             key: A unique key for the component.
@@ -270,6 +335,10 @@ class Progress(ComponentNamespace):
     indicator = staticmethod(ProgressIndicator.create)
     indicator = staticmethod(ProgressIndicator.create)
 
 
     @staticmethod
     @staticmethod
-    def __call__(width: Optional[str] = "100%", **props) -> Component: ...
+    def __call__(
+        width: Optional[str] = "100%",
+        color_scheme: Optional[Union[Var, LiteralAccentColor]] = None,
+        **props
+    ) -> Component: ...
 
 
 progress = Progress()
 progress = Progress()