Browse Source

[REF-3273] Add SVG circle, polygon and rect components (#3684)

Elijah Ahianyo 10 tháng trước cách đây
mục cha
commit
9666244a87

+ 1 - 0
reflex/components/el/__init__.py

@@ -10,6 +10,7 @@ _SUBMODULES: set[str] = {"elements"}
 _SUBMOD_ATTRS: dict[str, list[str]] = {
 _SUBMOD_ATTRS: dict[str, list[str]] = {
     f"elements.{k}": v for k, v in elements._MAPPING.items()
     f"elements.{k}": v for k, v in elements._MAPPING.items()
 }
 }
+_PYRIGHT_IGNORE_IMPORTS = elements._PYRIGHT_IGNORE_IMPORTS
 
 
 __getattr__, __dir__, __all__ = lazy_loader.attach(
 __getattr__, __dir__, __all__ = lazy_loader.attach(
     __name__,
     __name__,

+ 8 - 5
reflex/components/el/__init__.pyi

@@ -3,6 +3,7 @@
 # This file was generated by `reflex/utils/pyi_generator.py`!
 # This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 # ------------------------------------------------------
 
 
+from . import elements
 from .elements.forms import Button as Button
 from .elements.forms import Button as Button
 from .elements.forms import Fieldset as Fieldset
 from .elements.forms import Fieldset as Fieldset
 from .elements.forms import Form as Form
 from .elements.forms import Form as Form
@@ -91,7 +92,7 @@ from .elements.media import Defs as Defs
 from .elements.media import Embed as Embed
 from .elements.media import Embed as Embed
 from .elements.media import Iframe as Iframe
 from .elements.media import Iframe as Iframe
 from .elements.media import Img as Img
 from .elements.media import Img as Img
-from .elements.media import Lineargradient as Lineargradient
+from .elements.media import LinearGradient as LinearGradient
 from .elements.media import Map as Map
 from .elements.media import Map as Map
 from .elements.media import Object as Object
 from .elements.media import Object as Object
 from .elements.media import Path as Path
 from .elements.media import Path as Path
@@ -104,19 +105,19 @@ from .elements.media import Track as Track
 from .elements.media import Video as Video
 from .elements.media import Video as Video
 from .elements.media import area as area
 from .elements.media import area as area
 from .elements.media import audio as audio
 from .elements.media import audio as audio
-from .elements.media import defs as defs
+from .elements.media import defs as defs  # type: ignore
 from .elements.media import embed as embed
 from .elements.media import embed as embed
 from .elements.media import iframe as iframe
 from .elements.media import iframe as iframe
 from .elements.media import image as image
 from .elements.media import image as image
 from .elements.media import img as img
 from .elements.media import img as img
-from .elements.media import lineargradient as lineargradient
+from .elements.media import lineargradient as lineargradient  # type: ignore
 from .elements.media import map as map
 from .elements.media import map as map
 from .elements.media import object as object
 from .elements.media import object as object
-from .elements.media import path as path
+from .elements.media import path as path  # type: ignore
 from .elements.media import picture as picture
 from .elements.media import picture as picture
 from .elements.media import portal as portal
 from .elements.media import portal as portal
 from .elements.media import source as source
 from .elements.media import source as source
-from .elements.media import stop as stop
+from .elements.media import stop as stop  # type: ignore
 from .elements.media import svg as svg
 from .elements.media import svg as svg
 from .elements.media import track as track
 from .elements.media import track as track
 from .elements.media import video as video
 from .elements.media import video as video
@@ -230,3 +231,5 @@ from .elements.typography import ol as ol
 from .elements.typography import p as p
 from .elements.typography import p as p
 from .elements.typography import pre as pre
 from .elements.typography import pre as pre
 from .elements.typography import ul as ul
 from .elements.typography import ul as ul
+
+_PYRIGHT_IGNORE_IMPORTS = elements._PYRIGHT_IGNORE_IMPORTS

+ 3 - 1
reflex/components/el/elements/__init__.py

@@ -67,6 +67,7 @@ _MAPPING = {
         "svg",
         "svg",
         "defs",
         "defs",
         "lineargradient",
         "lineargradient",
+        "LinearGradient",
         "stop",
         "stop",
         "path",
         "path",
     ],
     ],
@@ -129,12 +130,13 @@ _MAPPING = {
 }
 }
 
 
 
 
-EXCLUDE = ["del_", "Del", "image"]
+EXCLUDE = ["del_", "Del", "image", "lineargradient", "LinearGradient"]
 for _, v in _MAPPING.items():
 for _, v in _MAPPING.items():
     v.extend([mod.capitalize() for mod in v if mod not in EXCLUDE])
     v.extend([mod.capitalize() for mod in v if mod not in EXCLUDE])
 
 
 _SUBMOD_ATTRS: dict[str, list[str]] = _MAPPING
 _SUBMOD_ATTRS: dict[str, list[str]] = _MAPPING
 
 
+_PYRIGHT_IGNORE_IMPORTS = ["stop", "lineargradient", "path", "defs"]
 __getattr__, __dir__, __all__ = lazy_loader.attach(
 __getattr__, __dir__, __all__ = lazy_loader.attach(
     __name__,
     __name__,
     submod_attrs=_SUBMOD_ATTRS,
     submod_attrs=_SUBMOD_ATTRS,

+ 8 - 6
reflex/components/el/elements/__init__.pyi

@@ -91,7 +91,7 @@ from .media import Defs as Defs
 from .media import Embed as Embed
 from .media import Embed as Embed
 from .media import Iframe as Iframe
 from .media import Iframe as Iframe
 from .media import Img as Img
 from .media import Img as Img
-from .media import Lineargradient as Lineargradient
+from .media import LinearGradient as LinearGradient
 from .media import Map as Map
 from .media import Map as Map
 from .media import Object as Object
 from .media import Object as Object
 from .media import Path as Path
 from .media import Path as Path
@@ -104,19 +104,19 @@ from .media import Track as Track
 from .media import Video as Video
 from .media import Video as Video
 from .media import area as area
 from .media import area as area
 from .media import audio as audio
 from .media import audio as audio
-from .media import defs as defs
+from .media import defs as defs  # type: ignore
 from .media import embed as embed
 from .media import embed as embed
 from .media import iframe as iframe
 from .media import iframe as iframe
 from .media import image as image
 from .media import image as image
 from .media import img as img
 from .media import img as img
-from .media import lineargradient as lineargradient
+from .media import lineargradient as lineargradient  # type: ignore
 from .media import map as map
 from .media import map as map
 from .media import object as object
 from .media import object as object
-from .media import path as path
+from .media import path as path  # type: ignore
 from .media import picture as picture
 from .media import picture as picture
 from .media import portal as portal
 from .media import portal as portal
 from .media import source as source
 from .media import source as source
-from .media import stop as stop
+from .media import stop as stop  # type: ignore
 from .media import svg as svg
 from .media import svg as svg
 from .media import track as track
 from .media import track as track
 from .media import video as video
 from .media import video as video
@@ -294,6 +294,7 @@ _MAPPING = {
         "svg",
         "svg",
         "defs",
         "defs",
         "lineargradient",
         "lineargradient",
+        "LinearGradient",
         "stop",
         "stop",
         "path",
         "path",
     ],
     ],
@@ -347,6 +348,7 @@ _MAPPING = {
         "Del",
         "Del",
     ],
     ],
 }
 }
-EXCLUDE = ["del_", "Del", "image"]
+EXCLUDE = ["del_", "Del", "image", "lineargradient", "LinearGradient"]
 for _, v in _MAPPING.items():
 for _, v in _MAPPING.items():
     v.extend([mod.capitalize() for mod in v if mod not in EXCLUDE])
     v.extend([mod.capitalize() for mod in v if mod not in EXCLUDE])
+_PYRIGHT_IGNORE_IMPORTS = ["stop", "lineargradient", "path", "defs"]

+ 98 - 18
reflex/components/el/elements/media.py

@@ -2,8 +2,9 @@
 
 
 from typing import Any, Union
 from typing import Any, Union
 
 
-from reflex import Component
+from reflex import Component, ComponentNamespace
 from reflex.constants.colors import Color
 from reflex.constants.colors import Color
+from reflex.utils import console
 from reflex.vars import Var as Var
 from reflex.vars import Var as Var
 
 
 from .base import BaseHTML
 from .base import BaseHTML
@@ -309,6 +310,56 @@ class Svg(BaseHTML):
     """Display the svg element."""
     """Display the svg element."""
 
 
     tag = "svg"
     tag = "svg"
+    # The width of the svg.
+    width: Var[Union[str, int]]
+    # The height of the svg.
+    height: Var[Union[str, int]]
+    # The XML namespace declaration.
+    xmlns: Var[str]
+
+
+class Circle(BaseHTML):
+    """The SVG circle component."""
+
+    tag = "circle"
+    # The x-axis coordinate of the center of the circle.
+    cx: Var[Union[str, int]]
+    # The y-axis coordinate of the center of the circle.
+    cy: Var[Union[str, int]]
+    # The radius of the circle.
+    r: Var[Union[str, int]]
+    # The total length for the circle's circumference, in user units.
+    path_length: Var[int]
+
+
+class Rect(BaseHTML):
+    """The SVG rect component."""
+
+    tag = "rect"
+    # The x coordinate of the rect.
+    x: Var[Union[str, int]]
+    # The y coordinate of the rect.
+    y: Var[Union[str, int]]
+    # The width of the rect
+    width: Var[Union[str, int]]
+    # The height of the rect.
+    height: Var[Union[str, int]]
+    # The horizontal corner radius of the rect. Defaults to ry if it is specified.
+    rx: Var[Union[str, int]]
+    # The vertical corner radius of the rect. Defaults to rx if it is specified.
+    ry: Var[Union[str, int]]
+    # The total length of the rectangle's perimeter, in user units.
+    path_length: Var[int]
+
+
+class Polygon(BaseHTML):
+    """The SVG polygon component."""
+
+    tag = "polygon"
+    # defines the list of points (pairs of x,y absolute coordinates) required to draw the polygon.
+    points: Var[str]
+    # This prop lets specify the total length for the path, in user units.
+    path_length: Var[int]
 
 
 
 
 class Defs(BaseHTML):
 class Defs(BaseHTML):
@@ -317,30 +368,30 @@ class Defs(BaseHTML):
     tag = "defs"
     tag = "defs"
 
 
 
 
-class Lineargradient(BaseHTML):
+class LinearGradient(BaseHTML):
     """Display the linearGradient element."""
     """Display the linearGradient element."""
 
 
     tag = "linearGradient"
     tag = "linearGradient"
 
 
-    # Units for the gradient
+    # Units for the gradient.
     gradient_units: Var[Union[str, bool]]
     gradient_units: Var[Union[str, bool]]
 
 
-    # Transform applied to the gradient
+    # Transform applied to the gradient.
     gradient_transform: Var[Union[str, bool]]
     gradient_transform: Var[Union[str, bool]]
 
 
-    # Method used to spread the gradient
+    # Method used to spread the gradient.
     spread_method: Var[Union[str, bool]]
     spread_method: Var[Union[str, bool]]
 
 
-    # X coordinate of the starting point of the gradient
+    # X coordinate of the starting point of the gradient.
     x1: Var[Union[str, int, bool]]
     x1: Var[Union[str, int, bool]]
 
 
-    # X coordinate of the ending point of the gradient
+    # X coordinate of the ending point of the gradient.
     x2: Var[Union[str, int, bool]]
     x2: Var[Union[str, int, bool]]
 
 
-    # Y coordinate of the starting point of the gradient
+    # Y coordinate of the starting point of the gradient.
     y1: Var[Union[str, int, bool]]
     y1: Var[Union[str, int, bool]]
 
 
-    # Y coordinate of the ending point of the gradient
+    # Y coordinate of the ending point of the gradient.
     y2: Var[Union[str, int, bool]]
     y2: Var[Union[str, int, bool]]
 
 
 
 
@@ -349,13 +400,13 @@ class Stop(BaseHTML):
 
 
     tag = "stop"
     tag = "stop"
 
 
-    # Offset of the gradient stop
+    # Offset of the gradient stop.
     offset: Var[Union[str, float, int]]
     offset: Var[Union[str, float, int]]
 
 
-    # Color of the gradient stop
+    # Color of the gradient stop.
     stop_color: Var[Union[str, Color, bool]]
     stop_color: Var[Union[str, Color, bool]]
 
 
-    # Opacity of the gradient stop
+    # Opacity of the gradient stop.
     stop_opacity: Var[Union[str, float, int, bool]]
     stop_opacity: Var[Union[str, float, int, bool]]
 
 
 
 
@@ -364,10 +415,23 @@ class Path(BaseHTML):
 
 
     tag = "path"
     tag = "path"
 
 
-    # Defines the shape of the path
+    # Defines the shape of the path.
     d: Var[Union[str, int, bool]]
     d: Var[Union[str, int, bool]]
 
 
 
 
+class SVG(ComponentNamespace):
+    """SVG component namespace."""
+
+    circle = staticmethod(Circle.create)
+    rect = staticmethod(Rect.create)
+    polygon = staticmethod(Polygon.create)
+    path = staticmethod(Path.create)
+    stop = staticmethod(Stop.create)
+    linear_gradient = staticmethod(LinearGradient.create)
+    defs = staticmethod(Defs.create)
+    __call__ = staticmethod(Svg.create)
+
+
 area = Area.create
 area = Area.create
 audio = Audio.create
 audio = Audio.create
 image = img = Img.create
 image = img = Img.create
@@ -380,8 +444,24 @@ object = Object.create
 picture = Picture.create
 picture = Picture.create
 portal = Portal.create
 portal = Portal.create
 source = Source.create
 source = Source.create
-svg = Svg.create
-defs = Defs.create
-lineargradient = Lineargradient.create
-stop = Stop.create
-path = Path.create
+svg = SVG()
+
+
+def __getattr__(name: str):
+    if name in ("defs", "lineargradient", "stop", "path"):
+        console.deprecate(
+            f"`rx.el.{name}`",
+            reason=f"use `rx.el.svg.{'linear_gradient' if name =='lineargradient' else name}`",
+            deprecation_version="0.5.8",
+            removal_version="0.6.0",
+        )
+        return (
+            LinearGradient.create
+            if name == "lineargradient"
+            else globals()[name.capitalize()].create
+        )
+
+    try:
+        return globals()[name]
+    except KeyError:
+        raise AttributeError(f"module '{__name__} has no attribute '{name}'") from None

+ 523 - 18
reflex/components/el/elements/media.pyi

@@ -5,6 +5,7 @@
 # ------------------------------------------------------
 # ------------------------------------------------------
 from typing import Any, Callable, Dict, Optional, Union, overload
 from typing import Any, Callable, Dict, Optional, Union, overload
 
 
+from reflex import ComponentNamespace
 from reflex.constants.colors import Color
 from reflex.constants.colors import Color
 from reflex.event import EventHandler, EventSpec
 from reflex.event import EventHandler, EventSpec
 from reflex.style import Style
 from reflex.style import Style
@@ -1563,6 +1564,9 @@ class Svg(BaseHTML):
     def create(  # type: ignore
     def create(  # type: ignore
         cls,
         cls,
         *children,
         *children,
+        width: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        height: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        xmlns: Optional[Union[Var[str], str]] = None,
         access_key: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
         access_key: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
         auto_capitalize: Optional[
         auto_capitalize: Optional[
             Union[Var[Union[bool, int, str]], str, int, bool]
             Union[Var[Union[bool, int, str]], str, int, bool]
@@ -1644,6 +1648,383 @@ class Svg(BaseHTML):
 
 
         Args:
         Args:
             *children: The children of the component.
             *children: The children of the component.
+            width: The width of the svg.
+            height: The height of the svg.
+            xmlns: The XML namespace declaration.
+            access_key:  Provides a hint for generating a keyboard shortcut for the current element.
+            auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
+            content_editable: Indicates whether the element's content is editable.
+            context_menu: Defines the ID of a <menu> element which will serve as the element's context menu.
+            dir: Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)
+            draggable: Defines whether the element can be dragged.
+            enter_key_hint: Hints what media types the media element is able to play.
+            hidden: Defines whether the element is hidden.
+            input_mode: Defines the type of the element.
+            item_prop: Defines the name of the element for metadata purposes.
+            lang: Defines the language used in the element.
+            role: Defines the role of the element.
+            slot: Assigns a slot in a shadow DOM shadow tree to an element.
+            spell_check: Defines whether the element may be checked for spelling errors.
+            tab_index: Defines the position of the current element in the tabbing order.
+            title: Defines a tooltip for the element.
+            style: The style of the component.
+            key: A unique key for the component.
+            id: The id for the component.
+            class_name: The class name for the component.
+            autofocus: Whether the component should take the focus once the page is loaded
+            custom_attrs: custom attribute
+            **props: The props of the component.
+
+        Returns:
+            The component.
+        """
+        ...
+
+class Circle(BaseHTML):
+    @overload
+    @classmethod
+    def create(  # type: ignore
+        cls,
+        *children,
+        cx: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        cy: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        r: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        path_length: Optional[Union[Var[int], int]] = None,
+        access_key: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        auto_capitalize: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        content_editable: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        context_menu: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        dir: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        draggable: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        enter_key_hint: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        hidden: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        input_mode: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        item_prop: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        lang: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        role: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        slot: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        spell_check: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        tab_index: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        title: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        style: Optional[Style] = None,
+        key: Optional[Any] = None,
+        id: Optional[Any] = None,
+        class_name: Optional[Any] = None,
+        autofocus: Optional[bool] = None,
+        custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
+        on_blur: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_context_menu: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_double_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_focus: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_down: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_enter: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_leave: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_move: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_out: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_over: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_up: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_scroll: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_unmount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        **props,
+    ) -> "Circle":
+        """Create the component.
+
+        Args:
+            *children: The children of the component.
+            cx: The x-axis coordinate of the center of the circle.
+            cy: The y-axis coordinate of the center of the circle.
+            r: The radius of the circle.
+            path_length: The total length for the circle's circumference, in user units.
+            access_key:  Provides a hint for generating a keyboard shortcut for the current element.
+            auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
+            content_editable: Indicates whether the element's content is editable.
+            context_menu: Defines the ID of a <menu> element which will serve as the element's context menu.
+            dir: Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)
+            draggable: Defines whether the element can be dragged.
+            enter_key_hint: Hints what media types the media element is able to play.
+            hidden: Defines whether the element is hidden.
+            input_mode: Defines the type of the element.
+            item_prop: Defines the name of the element for metadata purposes.
+            lang: Defines the language used in the element.
+            role: Defines the role of the element.
+            slot: Assigns a slot in a shadow DOM shadow tree to an element.
+            spell_check: Defines whether the element may be checked for spelling errors.
+            tab_index: Defines the position of the current element in the tabbing order.
+            title: Defines a tooltip for the element.
+            style: The style of the component.
+            key: A unique key for the component.
+            id: The id for the component.
+            class_name: The class name for the component.
+            autofocus: Whether the component should take the focus once the page is loaded
+            custom_attrs: custom attribute
+            **props: The props of the component.
+
+        Returns:
+            The component.
+        """
+        ...
+
+class Rect(BaseHTML):
+    @overload
+    @classmethod
+    def create(  # type: ignore
+        cls,
+        *children,
+        x: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        y: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        width: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        height: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        rx: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        ry: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        path_length: Optional[Union[Var[int], int]] = None,
+        access_key: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        auto_capitalize: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        content_editable: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        context_menu: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        dir: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        draggable: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        enter_key_hint: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        hidden: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        input_mode: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        item_prop: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        lang: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        role: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        slot: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        spell_check: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        tab_index: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        title: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        style: Optional[Style] = None,
+        key: Optional[Any] = None,
+        id: Optional[Any] = None,
+        class_name: Optional[Any] = None,
+        autofocus: Optional[bool] = None,
+        custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
+        on_blur: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_context_menu: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_double_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_focus: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_down: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_enter: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_leave: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_move: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_out: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_over: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_up: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_scroll: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_unmount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        **props,
+    ) -> "Rect":
+        """Create the component.
+
+        Args:
+            *children: The children of the component.
+            x: The x coordinate of the rect.
+            y: The y coordinate of the rect.
+            width: The width of the rect
+            height: The height of the rect.
+            rx: The horizontal corner radius of the rect. Defaults to ry if it is specified.
+            ry: The vertical corner radius of the rect. Defaults to rx if it is specified.
+            path_length: The total length of the rectangle's perimeter, in user units.
+            access_key:  Provides a hint for generating a keyboard shortcut for the current element.
+            auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
+            content_editable: Indicates whether the element's content is editable.
+            context_menu: Defines the ID of a <menu> element which will serve as the element's context menu.
+            dir: Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)
+            draggable: Defines whether the element can be dragged.
+            enter_key_hint: Hints what media types the media element is able to play.
+            hidden: Defines whether the element is hidden.
+            input_mode: Defines the type of the element.
+            item_prop: Defines the name of the element for metadata purposes.
+            lang: Defines the language used in the element.
+            role: Defines the role of the element.
+            slot: Assigns a slot in a shadow DOM shadow tree to an element.
+            spell_check: Defines whether the element may be checked for spelling errors.
+            tab_index: Defines the position of the current element in the tabbing order.
+            title: Defines a tooltip for the element.
+            style: The style of the component.
+            key: A unique key for the component.
+            id: The id for the component.
+            class_name: The class name for the component.
+            autofocus: Whether the component should take the focus once the page is loaded
+            custom_attrs: custom attribute
+            **props: The props of the component.
+
+        Returns:
+            The component.
+        """
+        ...
+
+class Polygon(BaseHTML):
+    @overload
+    @classmethod
+    def create(  # type: ignore
+        cls,
+        *children,
+        points: Optional[Union[Var[str], str]] = None,
+        path_length: Optional[Union[Var[int], int]] = None,
+        access_key: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        auto_capitalize: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        content_editable: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        context_menu: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        dir: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        draggable: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        enter_key_hint: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        hidden: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        input_mode: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        item_prop: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        lang: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        role: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        slot: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        spell_check: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        tab_index: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        title: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        style: Optional[Style] = None,
+        key: Optional[Any] = None,
+        id: Optional[Any] = None,
+        class_name: Optional[Any] = None,
+        autofocus: Optional[bool] = None,
+        custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
+        on_blur: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_context_menu: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_double_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_focus: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_down: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_enter: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_leave: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_move: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_out: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_over: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_up: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_scroll: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_unmount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        **props,
+    ) -> "Polygon":
+        """Create the component.
+
+        Args:
+            *children: The children of the component.
+            points: defines the list of points (pairs of x,y absolute coordinates) required to draw the polygon.
+            path_length: This prop lets specify the total length for the path, in user units.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             content_editable: Indicates whether the element's content is editable.
             content_editable: Indicates whether the element's content is editable.
@@ -1789,7 +2170,7 @@ class Defs(BaseHTML):
         """
         """
         ...
         ...
 
 
-class Lineargradient(BaseHTML):
+class LinearGradient(BaseHTML):
     @overload
     @overload
     @classmethod
     @classmethod
     def create(  # type: ignore
     def create(  # type: ignore
@@ -1878,18 +2259,18 @@ class Lineargradient(BaseHTML):
             Union[EventHandler, EventSpec, list, Callable, BaseVar]
             Union[EventHandler, EventSpec, list, Callable, BaseVar]
         ] = None,
         ] = None,
         **props,
         **props,
-    ) -> "Lineargradient":
+    ) -> "LinearGradient":
         """Create the component.
         """Create the component.
 
 
         Args:
         Args:
             *children: The children of the component.
             *children: The children of the component.
-            gradient_units: Units for the gradient
-            gradient_transform: Transform applied to the gradient
-            spread_method: Method used to spread the gradient
-            x1: X coordinate of the starting point of the gradient
-            x2: X coordinate of the ending point of the gradient
-            y1: Y coordinate of the starting point of the gradient
-            y2: Y coordinate of the ending point of the gradient
+            gradient_units: Units for the gradient.
+            gradient_transform: Transform applied to the gradient.
+            spread_method: Method used to spread the gradient.
+            x1: X coordinate of the starting point of the gradient.
+            x2: X coordinate of the ending point of the gradient.
+            y1: Y coordinate of the starting point of the gradient.
+            y2: Y coordinate of the ending point of the gradient.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             content_editable: Indicates whether the element's content is editable.
             content_editable: Indicates whether the element's content is editable.
@@ -2013,9 +2394,9 @@ class Stop(BaseHTML):
 
 
         Args:
         Args:
             *children: The children of the component.
             *children: The children of the component.
-            offset: Offset of the gradient stop
-            stop_color: Color of the gradient stop
-            stop_opacity: Opacity of the gradient stop
+            offset: Offset of the gradient stop.
+            stop_color: Color of the gradient stop.
+            stop_opacity: Opacity of the gradient stop.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             content_editable: Indicates whether the element's content is editable.
             content_editable: Indicates whether the element's content is editable.
@@ -2133,7 +2514,135 @@ class Path(BaseHTML):
 
 
         Args:
         Args:
             *children: The children of the component.
             *children: The children of the component.
-            d: Defines the shape of the path
+            d: Defines the shape of the path.
+            access_key:  Provides a hint for generating a keyboard shortcut for the current element.
+            auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
+            content_editable: Indicates whether the element's content is editable.
+            context_menu: Defines the ID of a <menu> element which will serve as the element's context menu.
+            dir: Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)
+            draggable: Defines whether the element can be dragged.
+            enter_key_hint: Hints what media types the media element is able to play.
+            hidden: Defines whether the element is hidden.
+            input_mode: Defines the type of the element.
+            item_prop: Defines the name of the element for metadata purposes.
+            lang: Defines the language used in the element.
+            role: Defines the role of the element.
+            slot: Assigns a slot in a shadow DOM shadow tree to an element.
+            spell_check: Defines whether the element may be checked for spelling errors.
+            tab_index: Defines the position of the current element in the tabbing order.
+            title: Defines a tooltip for the element.
+            style: The style of the component.
+            key: A unique key for the component.
+            id: The id for the component.
+            class_name: The class name for the component.
+            autofocus: Whether the component should take the focus once the page is loaded
+            custom_attrs: custom attribute
+            **props: The props of the component.
+
+        Returns:
+            The component.
+        """
+        ...
+
+class SVG(ComponentNamespace):
+    circle = staticmethod(Circle.create)
+    rect = staticmethod(Rect.create)
+    polygon = staticmethod(Polygon.create)
+    path = staticmethod(Path.create)
+    stop = staticmethod(Stop.create)
+    linear_gradient = staticmethod(LinearGradient.create)
+    defs = staticmethod(Defs.create)
+
+    @staticmethod
+    def __call__(
+        *children,
+        width: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        height: Optional[Union[Var[Union[int, str]], str, int]] = None,
+        xmlns: Optional[Union[Var[str], str]] = None,
+        access_key: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        auto_capitalize: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        content_editable: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        context_menu: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        dir: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        draggable: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        enter_key_hint: Optional[
+            Union[Var[Union[bool, int, str]], str, int, bool]
+        ] = None,
+        hidden: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        input_mode: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        item_prop: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        lang: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        role: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        slot: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        spell_check: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        tab_index: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        title: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
+        style: Optional[Style] = None,
+        key: Optional[Any] = None,
+        id: Optional[Any] = None,
+        class_name: Optional[Any] = None,
+        autofocus: Optional[bool] = None,
+        custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
+        on_blur: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_context_menu: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_double_click: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_focus: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_down: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_enter: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_leave: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_move: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_out: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_over: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_mouse_up: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_scroll: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        on_unmount: Optional[
+            Union[EventHandler, EventSpec, list, Callable, BaseVar]
+        ] = None,
+        **props,
+    ) -> "Svg":
+        """Create the component.
+
+        Args:
+            *children: The children of the component.
+            width: The width of the svg.
+            height: The height of the svg.
+            xmlns: The XML namespace declaration.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             access_key:  Provides a hint for generating a keyboard shortcut for the current element.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
             content_editable: Indicates whether the element's content is editable.
             content_editable: Indicates whether the element's content is editable.
@@ -2175,8 +2684,4 @@ object = Object.create
 picture = Picture.create
 picture = Picture.create
 portal = Portal.create
 portal = Portal.create
 source = Source.create
 source = Source.create
-svg = Svg.create
-defs = Defs.create
-lineargradient = Lineargradient.create
-stop = Stop.create
-path = Path.create
+svg = SVG()

+ 2 - 0
reflex/utils/pyi_generator.py

@@ -882,6 +882,7 @@ class PyiGenerator:
         # retrieve the _SUBMODULES and _SUBMOD_ATTRS from an init file if present.
         # retrieve the _SUBMODULES and _SUBMOD_ATTRS from an init file if present.
         sub_mods = getattr(mod, "_SUBMODULES", None)
         sub_mods = getattr(mod, "_SUBMODULES", None)
         sub_mod_attrs = getattr(mod, "_SUBMOD_ATTRS", None)
         sub_mod_attrs = getattr(mod, "_SUBMOD_ATTRS", None)
+        pyright_ignore_imports = getattr(mod, "_PYRIGHT_IGNORE_IMPORTS", [])
 
 
         if not sub_mods and not sub_mod_attrs:
         if not sub_mods and not sub_mod_attrs:
             return
             return
@@ -901,6 +902,7 @@ class PyiGenerator:
             # construct the import statement and handle special cases for aliases
             # construct the import statement and handle special cases for aliases
             sub_mod_attrs_imports = [
             sub_mod_attrs_imports = [
                 f"from .{path} import {mod if not isinstance(mod, tuple) else mod[0]} as {mod if not isinstance(mod, tuple) else mod[1]}"
                 f"from .{path} import {mod if not isinstance(mod, tuple) else mod[0]} as {mod if not isinstance(mod, tuple) else mod[1]}"
+                + ("  # type: ignore" if mod in pyright_ignore_imports else "")
                 for mod, path in sub_mod_attrs.items()
                 for mod, path in sub_mod_attrs.items()
             ]
             ]
             sub_mod_attrs_imports.append("")
             sub_mod_attrs_imports.append("")