From 9f8a63a136a1a605b4883c7f43406c92f47c0ad9 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 7 Apr 2026 20:50:10 -0700 Subject: [PATCH 01/10] lazy_loader: actually support submod alias tuples --- .../src/reflex_base/utils/lazy_loader.py | 80 ++++++++++++++----- reflex/__init__.py | 2 +- 2 files changed, 62 insertions(+), 20 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py index 3b1dd42798e..30cab4ce7e3 100644 --- a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py +++ b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py @@ -17,16 +17,18 @@ from __future__ import annotations -import copy import importlib import os import sys +from collections.abc import Mapping, Sequence + +SubmodAttrsType = Mapping[str, Sequence[str | tuple[str, str]]] def attach( package_name: str, submodules: set[str] | None = None, - submod_attrs: dict[str, list[str]] | None = None, + submod_attrs: SubmodAttrsType | None = None, **extra_mappings: str, ): """Replaces a package's __getattr__, __dir__, and __all__ attributes using lazy.attach. @@ -45,24 +47,21 @@ def attach( Returns: __getattr__, __dir__, __all__ """ - submod_attrs = copy.deepcopy(submod_attrs) - if submod_attrs: - for k, v in submod_attrs.items(): - # when flattening the list, only keep the alias in the tuple(mod[1]) - submod_attrs[k] = [ - mod if not isinstance(mod, tuple) else mod[1] for mod in v - ] - if submod_attrs is None: submod_attrs = {} submodules = set(submodules) if submodules is not None else set() - attr_to_modules = { - attr: mod for mod, attrs in submod_attrs.items() for attr in attrs + alias_to_module_and_attr = { + comp_alias(attr): (mod, comp_name(attr)) + for mod, attrs in submod_attrs.items() + for attr in attrs } - __all__ = sorted([*(submodules | attr_to_modules.keys()), *(extra_mappings or [])]) + __all__ = sorted([ + *(submodules | alias_to_module_and_attr.keys()), + *(extra_mappings or []), + ]) def __getattr__(name: str): # noqa: N807 if name in extra_mappings: @@ -74,15 +73,15 @@ def __getattr__(name: str): # noqa: N807 return getattr(submod, attr) if name in submodules: return importlib.import_module(f"{package_name}.{name}") - if name in attr_to_modules: - submod_path = f"{package_name}.{attr_to_modules[name]}" - submod = importlib.import_module(submod_path) - attr = getattr(submod, name) + if name in alias_to_module_and_attr: + module, attr_name = alias_to_module_and_attr[name] + submod = importlib.import_module(f"{package_name}.{module}") + attr = getattr(submod, attr_name) # If the attribute lives in a file (module) with the same # name as the attribute, ensure that the attribute and *not* # the module is accessible on the package. - if name == attr_to_modules[name]: + if name == module: pkg = sys.modules[package_name] pkg.__dict__[name] = attr @@ -94,7 +93,50 @@ def __dir__(): # noqa: N807 return __all__ if os.environ.get("EAGER_IMPORT", ""): - for attr in set(attr_to_modules.keys()) | submodules: + for attr in set(alias_to_module_and_attr.keys()) | submodules: __getattr__(attr) return __getattr__, __dir__, list(__all__) + + +def comp_name(comp: str | tuple[str, str]) -> str: + """Get the component name from the mapping value. + + This is the name used internally in the codebase. + + Args: + comp: The component name or a tuple of (component name, alias). + + Returns: + The component name. + """ + return comp[0] if isinstance(comp, tuple) else comp + + +def comp_alias(comp: str | tuple[str, str]) -> str: + """Get the component alias from the mapping value. + + This is the name external users will import. + + Args: + comp: The component name or a tuple of (component name, alias). + + Returns: + The component alias, or None if there is no alias. + """ + return comp[1] if isinstance(comp, tuple) else comp + + +def comp_path(path: str, comp: str | tuple[str, str]) -> str: + """Get the component path from the mapping key and value. + + This is the internal path that will be imported. + + Args: + path: The base path of the component. + comp: The component name or a tuple of (component name, alias). + + Returns: + The component path. + """ + return path + "." + comp_name(comp) diff --git a/reflex/__init__.py b/reflex/__init__.py index ca246b89616..39d51b2c505 100644 --- a/reflex/__init__.py +++ b/reflex/__init__.py @@ -167,7 +167,7 @@ } _COMPONENT_NAME_TO_PATH: dict[str, str] = { - comp: path + "." + comp + lazy_loader.comp_alias(comp): lazy_loader.comp_path(path, comp) for path, comps in _ALL_COMPONENTS_MAPPING.items() for comp in comps } | { From 33c616d927c2d01fc51fbfa48c09c47728fc691e Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 7 Apr 2026 17:23:18 -0700 Subject: [PATCH 02/10] pyi_generator: use get_type_hints to resolve Component annotations Previously the code was just checking in `__annotations__`, which was missing quite a few props that were only available as ForwardRef. This change brings the pyi_generator closer to full deferred evaluation type hinting mode compatibility. Fix `_get_type_hint` visible name determination: use `_get_visible_type_name` to ensure the fallback name is actually defined in the pyi globals. Otherwise use the fully qualified module.name construct as a fallback. --- .../src/reflex_base/components/component.py | 4 + .../src/reflex_base/utils/pyi_generator.py | 19 +- .../src/reflex_components_moment/moment.py | 8 +- .../src/reflex_components_radix/__init__.py | 2 +- .../src/reflex_components_radix/mappings.py | 18 +- .../primitives/__init__.py | 2 +- .../themes/components/__init__.py | 2 +- .../themes/layout/__init__.py | 2 +- .../themes/layout/list.py | 2 +- .../themes/typography/__init__.py | 2 +- pyi_hashes.json | 220 +++++++++--------- reflex/__init__.py | 10 +- 12 files changed, 156 insertions(+), 135 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/components/component.py b/packages/reflex-base/src/reflex_base/components/component.py index d7903c5c9e2..d809e633c32 100644 --- a/packages/reflex-base/src/reflex_base/components/component.py +++ b/packages/reflex-base/src/reflex_base/components/component.py @@ -3017,3 +3017,7 @@ def create( ), _var_value=value, ) + + +# Late import of reflex.state to resolve ForwardRef type hints without circular import. +import reflex.state # noqa: E402 diff --git a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py index 3479f10f321..19fdc389ec9 100644 --- a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py +++ b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py @@ -270,8 +270,21 @@ def _get_type_hint( _get_type_hint(arg, type_hint_globals, _is_optional(arg)) for arg in value ] return f"[{', '.join(res)}]" + elif (visible_name := _get_visible_type_name(value, type_hint_globals)) is not None: + res = visible_name else: - res = value.__name__ + # Best effort to find a submodule path in the globals. + for ix, part in enumerate(value.__module__.split(".")): + if part in type_hint_globals: + res = ".".join([ + part, + *value.__module__.split(".")[ix + 1 :], + value.__name__, + ]) + break + else: + # Fallback to the type name. + res = value.__name__ if is_optional and not res.startswith("Optional") and not res.endswith("| None"): res = f"{res} | None" return res @@ -536,7 +549,9 @@ def _extract_class_props_as_ast_nodes( **type_hint_globals, **_get_class_annotation_globals(target_class), } - for name, value in target_class.__annotations__.items(): + for name, value in typing.get_type_hints( + target_class, globalns=annotation_globals + ).items(): if ( name in func_kwonlyargs or name in EXCLUDED_PROPS diff --git a/packages/reflex-components-moment/src/reflex_components_moment/moment.py b/packages/reflex-components-moment/src/reflex_components_moment/moment.py index 908917b2093..d1753fcfece 100644 --- a/packages/reflex-components-moment/src/reflex_components_moment/moment.py +++ b/packages/reflex-components-moment/src/reflex_components_moment/moment.py @@ -3,7 +3,7 @@ from __future__ import annotations import dataclasses -from datetime import date, datetime, time, timedelta +import datetime from reflex_base.components.component import NoSSRComponent, field from reflex_base.event import EventHandler, passthrough_event_spec @@ -94,9 +94,9 @@ class Moment(NoSSRComponent): doc="Shows the duration (elapsed time) between two dates. duration property should be behind date property time-wise." ) - date: Var[str | datetime | date | time | timedelta] = field( - doc="The date to display (also work if passed as children)." - ) + date: Var[ + str | datetime.datetime | datetime.date | datetime.time | datetime.timedelta + ] = field(doc="The date to display (also work if passed as children).") duration_from_now: Var[bool] = field( doc="Shows the duration (elapsed time) between now and the provided datetime." diff --git a/packages/reflex-components-radix/src/reflex_components_radix/__init__.py b/packages/reflex-components-radix/src/reflex_components_radix/__init__.py index 6d1a990f380..4aafd3d9711 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/__init__.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/__init__.py @@ -8,7 +8,7 @@ _SUBMODULES: set[str] = {"themes", "primitives"} -_SUBMOD_ATTRS: dict[str, list[str]] = { +_SUBMOD_ATTRS: lazy_loader.SubmodAttrsType = { "".join(k.split("reflex_components_radix.")[-1]): v for k, v in RADIX_MAPPING.items() } diff --git a/packages/reflex-components-radix/src/reflex_components_radix/mappings.py b/packages/reflex-components-radix/src/reflex_components_radix/mappings.py index 141dc6ac59c..df2c6682501 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/mappings.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/mappings.py @@ -1,10 +1,12 @@ """Radix component mappings for lazy loading.""" -RADIX_THEMES_MAPPING: dict[str, list[str]] = { +from reflex_base.utils.lazy_loader import SubmodAttrsType + +RADIX_THEMES_MAPPING: SubmodAttrsType = { "reflex_components_radix.themes.base": ["color_mode", "theme", "theme_panel"], "reflex_components_radix.themes.color_mode": ["color_mode"], } -RADIX_THEMES_COMPONENTS_MAPPING: dict[str, list[str]] = { +RADIX_THEMES_COMPONENTS_MAPPING: SubmodAttrsType = { **{ f"reflex_components_radix.themes.components.{mod}": [mod] for mod in [ @@ -50,7 +52,7 @@ "reflex_components_radix.themes.components.progress": ["progress"], } -RADIX_THEMES_LAYOUT_MAPPING: dict[str, list[str]] = { +RADIX_THEMES_LAYOUT_MAPPING: SubmodAttrsType = { "reflex_components_radix.themes.layout.box": [ "box", ], @@ -78,14 +80,14 @@ "vstack", ], "reflex_components_radix.themes.layout.list": [ - "list", + ("list_ns", "list"), "list_item", "ordered_list", "unordered_list", ], } -RADIX_THEMES_TYPOGRAPHY_MAPPING: dict[str, list[str]] = { +RADIX_THEMES_TYPOGRAPHY_MAPPING: SubmodAttrsType = { "reflex_components_radix.themes.typography.blockquote": [ "blockquote", ], @@ -103,7 +105,7 @@ ], } -RADIX_PRIMITIVES_MAPPING: dict[str, list[str]] = { +RADIX_PRIMITIVES_MAPPING: SubmodAttrsType = { "reflex_components_radix.primitives.accordion": [ "accordion", ], @@ -118,11 +120,11 @@ ], } -RADIX_PRIMITIVES_SHORTCUT_MAPPING: dict[str, list[str]] = { +RADIX_PRIMITIVES_SHORTCUT_MAPPING: SubmodAttrsType = { k: v for k, v in RADIX_PRIMITIVES_MAPPING.items() if "progress" not in k } -RADIX_MAPPING: dict[str, list[str]] = { +RADIX_MAPPING: SubmodAttrsType = { **RADIX_THEMES_MAPPING, **RADIX_THEMES_COMPONENTS_MAPPING, **RADIX_THEMES_TYPOGRAPHY_MAPPING, diff --git a/packages/reflex-components-radix/src/reflex_components_radix/primitives/__init__.py b/packages/reflex-components-radix/src/reflex_components_radix/primitives/__init__.py index 47ef68a0b71..b8676a1e70b 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/primitives/__init__.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/primitives/__init__.py @@ -6,7 +6,7 @@ from reflex_components_radix.mappings import RADIX_PRIMITIVES_MAPPING -_SUBMOD_ATTRS: dict[str, list[str]] = { +_SUBMOD_ATTRS: lazy_loader.SubmodAttrsType = { "".join(k.split("reflex_components_radix.primitives.")[-1]): v for k, v in RADIX_PRIMITIVES_MAPPING.items() } | {"dialog": ["dialog"]} diff --git a/packages/reflex-components-radix/src/reflex_components_radix/themes/components/__init__.py b/packages/reflex-components-radix/src/reflex_components_radix/themes/components/__init__.py index bafdd75296b..99f45cc1a1f 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/themes/components/__init__.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/themes/components/__init__.py @@ -6,7 +6,7 @@ from reflex_components_radix.mappings import RADIX_THEMES_COMPONENTS_MAPPING -_SUBMOD_ATTRS: dict[str, list[str]] = { +_SUBMOD_ATTRS: lazy_loader.SubmodAttrsType = { "".join(k.split("reflex_components_radix.themes.components.")[-1]): v for k, v in RADIX_THEMES_COMPONENTS_MAPPING.items() } diff --git a/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.py b/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.py index 214f923696a..765ccb7f203 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.py @@ -6,7 +6,7 @@ from reflex_components_radix.mappings import RADIX_THEMES_LAYOUT_MAPPING -_SUBMOD_ATTRS: dict[str, list[str]] = { +_SUBMOD_ATTRS: lazy_loader.SubmodAttrsType = { "".join(k.split("reflex_components_radix.themes.layout.")[-1]): v for k, v in RADIX_THEMES_LAYOUT_MAPPING.items() } diff --git a/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.py b/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.py index 427760c804a..9ba8e1e747c 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.py @@ -189,7 +189,7 @@ class List(ComponentNamespace): __call__ = staticmethod(BaseList.create) -list = list_ns = List() +list_ns = List() list_item = list_ns.item ordered_list = list_ns.ordered unordered_list = list_ns.unordered diff --git a/packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.py b/packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.py index be914b414af..2bf232d92dd 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.py @@ -6,7 +6,7 @@ from reflex_components_radix.mappings import RADIX_THEMES_TYPOGRAPHY_MAPPING -_SUBMOD_ATTRS: dict[str, list[str]] = { +_SUBMOD_ATTRS: lazy_loader.SubmodAttrsType = { "".join(k.split("reflex_components_radix.themes.typography.")[-1]): v for k, v in RADIX_THEMES_TYPOGRAPHY_MAPPING.items() } diff --git a/pyi_hashes.json b/pyi_hashes.json index f7900836abd..c724f201c2c 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -1,124 +1,124 @@ { - "packages/reflex-components-code/src/reflex_components_code/code.pyi": "2797061144c4199f57848f6673a05a7f", - "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "db0de2879d57870831a030a69b5282b7", + "packages/reflex-components-code/src/reflex_components_code/code.pyi": "869f1ce363f11a528d7edd09f7e67ccb", + "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "2d8b0e74e6c8ecbfab049758920e6da5", "packages/reflex-components-core/src/reflex_components_core/__init__.pyi": "82b29d23f2490161d42fd21021bd39c3", "packages/reflex-components-core/src/reflex_components_core/base/__init__.pyi": "7009187aaaf191814d031e5462c48318", - "packages/reflex-components-core/src/reflex_components_core/base/app_wrap.pyi": "e7dfa98f5df5e30cb6d01d61b6974bef", - "packages/reflex-components-core/src/reflex_components_core/base/body.pyi": "0f98a7c1247e35059b76ae2985b7c81b", - "packages/reflex-components-core/src/reflex_components_core/base/document.pyi": "80a3090e5b7a46de6daa8e97e68e8638", - "packages/reflex-components-core/src/reflex_components_core/base/error_boundary.pyi": "f36f27e580041af842d348adbddcd600", - "packages/reflex-components-core/src/reflex_components_core/base/fragment.pyi": "39abed241f2def793dd0c59328bb0470", - "packages/reflex-components-core/src/reflex_components_core/base/link.pyi": "05d96de8a1d5f7be08de831b99663e67", - "packages/reflex-components-core/src/reflex_components_core/base/meta.pyi": "b83e94900f988ef5d2fdf121b01be7fa", - "packages/reflex-components-core/src/reflex_components_core/base/script.pyi": "cfb0d5bcfe67f7c2b40868cdf3a5f7c1", - "packages/reflex-components-core/src/reflex_components_core/base/strict_mode.pyi": "8a69093c8d40b10b1f0b1c4e851e9d53", + "packages/reflex-components-core/src/reflex_components_core/base/app_wrap.pyi": "c0c6564e0f3f025551e02b3e9458200b", + "packages/reflex-components-core/src/reflex_components_core/base/body.pyi": "b5c87f253d779d0d3277600b65ae450a", + "packages/reflex-components-core/src/reflex_components_core/base/document.pyi": "756ac4f65ecce51d79d14333b3dba211", + "packages/reflex-components-core/src/reflex_components_core/base/error_boundary.pyi": "3eb5fe255d025e7e5910442826795851", + "packages/reflex-components-core/src/reflex_components_core/base/fragment.pyi": "dabc61061f19066922e104e891a9bcdc", + "packages/reflex-components-core/src/reflex_components_core/base/link.pyi": "fdc378e62649c0a44a0fda6868bd6329", + "packages/reflex-components-core/src/reflex_components_core/base/meta.pyi": "fc4b70052ae4291516fb0e99d543f0c3", + "packages/reflex-components-core/src/reflex_components_core/base/script.pyi": "37411ac2e96fd11b86bd64fdd6974c02", + "packages/reflex-components-core/src/reflex_components_core/base/strict_mode.pyi": "6aca6c1e5e2ebc7ea1f5ee33b922f266", "packages/reflex-components-core/src/reflex_components_core/core/__init__.pyi": "dd5142b3c9087bf2bf22651adf6f2724", - "packages/reflex-components-core/src/reflex_components_core/core/auto_scroll.pyi": "29f5c106b98ddac94cf7c1244a02cfb1", - "packages/reflex-components-core/src/reflex_components_core/core/banner.pyi": "9af2721b01868b24a48c7899ad6b1c69", - "packages/reflex-components-core/src/reflex_components_core/core/clipboard.pyi": "20a3f4f500d44ac4365b6d831c6816ff", - "packages/reflex-components-core/src/reflex_components_core/core/debounce.pyi": "eb606cf8151e6769df7f2443ece739cd", - "packages/reflex-components-core/src/reflex_components_core/core/helmet.pyi": "5e28d554d2b4d7fae1ba35809c24f4fc", - "packages/reflex-components-core/src/reflex_components_core/core/html.pyi": "28bd59898f0402b33c34e14f3eef1282", - "packages/reflex-components-core/src/reflex_components_core/core/sticky.pyi": "4b34eca0e7338ec80ac5985345717bc9", - "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "6f3cdef9956dbe5c917edeefdffd1b0e", - "packages/reflex-components-core/src/reflex_components_core/core/window_events.pyi": "28e901ee970bec806ee766d0d126d739", + "packages/reflex-components-core/src/reflex_components_core/core/auto_scroll.pyi": "884c8995e99bf7cd867b0b2cf2fa2820", + "packages/reflex-components-core/src/reflex_components_core/core/banner.pyi": "9cb35b6e8e348f40c859ff55b8b49cb6", + "packages/reflex-components-core/src/reflex_components_core/core/clipboard.pyi": "f80892262c6c493043279529d8ea9bdb", + "packages/reflex-components-core/src/reflex_components_core/core/debounce.pyi": "f665bbf88a4965e74819dfcf3e08a39a", + "packages/reflex-components-core/src/reflex_components_core/core/helmet.pyi": "8ccd36c5139674036f5e75d27366ab70", + "packages/reflex-components-core/src/reflex_components_core/core/html.pyi": "86cd3612a02de339b8aae6d32e2368a5", + "packages/reflex-components-core/src/reflex_components_core/core/sticky.pyi": "44dca9092a99235d93738858979a98a6", + "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "28a0a7e6cd743171322e7dd146ca8be0", + "packages/reflex-components-core/src/reflex_components_core/core/window_events.pyi": "25275a275a2f238bbf478f94d8a6df49", "packages/reflex-components-core/src/reflex_components_core/datadisplay/__init__.pyi": "c96fed4da42a13576d64f84e3c7cb25c", "packages/reflex-components-core/src/reflex_components_core/el/__init__.pyi": "f09129ddefb57ab4c7769c86dc9a3153", - "packages/reflex-components-core/src/reflex_components_core/el/element.pyi": "1a8824cdd243efc876157b97f9f1b714", + "packages/reflex-components-core/src/reflex_components_core/el/element.pyi": "12f4b88707f2cb44234f96cecc6c7633", "packages/reflex-components-core/src/reflex_components_core/el/elements/__init__.pyi": "e6c845f2f29eb079697a2e31b0c2f23a", - "packages/reflex-components-core/src/reflex_components_core/el/elements/base.pyi": "7c74980207dc1a5cac14083f2edd31ba", - "packages/reflex-components-core/src/reflex_components_core/el/elements/forms.pyi": "da7ef00fd67699eeeb55e33279c2eb8d", - "packages/reflex-components-core/src/reflex_components_core/el/elements/inline.pyi": "0ea0058ea7b6ae03138c7c85df963c32", - "packages/reflex-components-core/src/reflex_components_core/el/elements/media.pyi": "97f7f6c66533bb3947a43ceefe160d49", - "packages/reflex-components-core/src/reflex_components_core/el/elements/metadata.pyi": "7ea09671a42d75234a0464fc3601577c", - "packages/reflex-components-core/src/reflex_components_core/el/elements/other.pyi": "869dca86b783149f9c59e1ae0d2900c1", - "packages/reflex-components-core/src/reflex_components_core/el/elements/scripts.pyi": "c3a5a4f2d0594414a160fe59b13ccc26", - "packages/reflex-components-core/src/reflex_components_core/el/elements/sectioning.pyi": "b2acdc964feabe78154be141dc978555", - "packages/reflex-components-core/src/reflex_components_core/el/elements/tables.pyi": "e75fbe0454df06abf462ab579b698897", - "packages/reflex-components-core/src/reflex_components_core/el/elements/typography.pyi": "f88089a2f4270b981a28e385d07460b5", - "packages/reflex-components-core/src/reflex_components_core/react_router/dom.pyi": "c5ac8ba14fdce557063a832a79f43f68", - "packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.pyi": "e10210239ce7dc18980e70eec19b9353", - "packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.pyi": "2a93782c63e82a6939411273fe2486d9", - "packages/reflex-components-lucide/src/reflex_components_lucide/icon.pyi": "f654cc9cb305712b485fcd676935c0c1", - "packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "2d6efa2d5f2586a7036d606a24fb425d", - "packages/reflex-components-moment/src/reflex_components_moment/moment.pyi": "ad4b084d94e50311f761d69b3173e357", - "packages/reflex-components-plotly/src/reflex_components_plotly/plotly.pyi": "241b80584f3e029145e6e003d1c476f2", - "packages/reflex-components-radix/src/reflex_components_radix/__init__.pyi": "b2f485bfde4978047b7b944cf15d92cb", + "packages/reflex-components-core/src/reflex_components_core/el/elements/base.pyi": "3443296989beef2488682d78acf9acac", + "packages/reflex-components-core/src/reflex_components_core/el/elements/forms.pyi": "da0c4d8985ddb1ddc0e94e47589b95e9", + "packages/reflex-components-core/src/reflex_components_core/el/elements/inline.pyi": "28eca1bb8af3eae4fe66c7a795eb4b09", + "packages/reflex-components-core/src/reflex_components_core/el/elements/media.pyi": "5bf66f02022f0885ae1d513926948d16", + "packages/reflex-components-core/src/reflex_components_core/el/elements/metadata.pyi": "f7967c873392fa8c6d3a8b19671d012a", + "packages/reflex-components-core/src/reflex_components_core/el/elements/other.pyi": "309da7308f5c0e2a240885a2c0e1ab98", + "packages/reflex-components-core/src/reflex_components_core/el/elements/scripts.pyi": "4339ef10297c28cd5c37e5cc9e2f8c13", + "packages/reflex-components-core/src/reflex_components_core/el/elements/sectioning.pyi": "b6c27f092a15905a4975982d1c21d2d0", + "packages/reflex-components-core/src/reflex_components_core/el/elements/tables.pyi": "f899d1c7c7e0ae19b6db676d587a2341", + "packages/reflex-components-core/src/reflex_components_core/el/elements/typography.pyi": "23f187439ef08796c7e782836c84f064", + "packages/reflex-components-core/src/reflex_components_core/react_router/dom.pyi": "10eb13d6e3340e0e57afbc040985482b", + "packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.pyi": "4bd9115e62ec1111ac2ef1a04fdbfc68", + "packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.pyi": "0fcc3ed34c5a74014d00614dc87c5d42", + "packages/reflex-components-lucide/src/reflex_components_lucide/icon.pyi": "c9b55cfb68e81039cc6cd3ee5ac8fcd1", + "packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "fc06009b984167cb7a91684adbbdc9a9", + "packages/reflex-components-moment/src/reflex_components_moment/moment.pyi": "8267bb49554cbce5bc2fecfad31d49e5", + "packages/reflex-components-plotly/src/reflex_components_plotly/plotly.pyi": "b6f217c16c56d795733832ca8794c33b", + "packages/reflex-components-radix/src/reflex_components_radix/__init__.pyi": "19216eb3618f68c8a76e5e43801cf4af", "packages/reflex-components-radix/src/reflex_components_radix/primitives/__init__.pyi": "5404a8da97e8b5129133d7f300e3f642", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/accordion.pyi": "18ed34323f671fcf655639dc78d7c549", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/base.pyi": "9c80e740d177b4a805dee3038d580941", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/dialog.pyi": "b47313aefc9a740851ee332656446afd", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/drawer.pyi": "d6a4f88f2988fa50fbed8a9026f5ef8b", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/form.pyi": "00c0e0b6c8190f2db7fd847a25b5c03d", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/progress.pyi": "577ec9714a4d8bc9f7dd7eca22fe5252", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/slider.pyi": "bc69b9443d04ae7856c0a411a90755a9", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/accordion.pyi": "63cf54bfe7183af2b575afa51e66ff1e", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/base.pyi": "ac7d799bf007a177082e90987b0c03ae", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/dialog.pyi": "3e01193a2aeb26f7dfc952d41d7d6e68", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/drawer.pyi": "b47bdbeb9f4b9e88f85a0eaf00a1e916", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/form.pyi": "93b14cc389d2af3391d3bb5d6772aa5e", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/progress.pyi": "67f88225f3ca5146306d694361dbac1b", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/slider.pyi": "5d7885df3921fa773d65e865ccc3dd8f", "packages/reflex-components-radix/src/reflex_components_radix/themes/__init__.pyi": "b433b9a099dc5b0ab008d02c85d38059", - "packages/reflex-components-radix/src/reflex_components_radix/themes/base.pyi": "90a182a1444b73c006e52ea67c2b3db1", - "packages/reflex-components-radix/src/reflex_components_radix/themes/color_mode.pyi": "3a419f78071b0dd6be55dc55e7334a1b", + "packages/reflex-components-radix/src/reflex_components_radix/themes/base.pyi": "b0f9a52a4a6e00e009cc4a9ab3f96dd9", + "packages/reflex-components-radix/src/reflex_components_radix/themes/color_mode.pyi": "d9d63fc00e0fd35dbccc8825ed846bc9", "packages/reflex-components-radix/src/reflex_components_radix/themes/components/__init__.pyi": "f10f0169f81c78290333da831915762f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/alert_dialog.pyi": "2b8c68239c9e9646e71ef8e81d7b5f69", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/aspect_ratio.pyi": "0f981ee0589f5501ab3c57e0aec01316", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/avatar.pyi": "d30f1bfb42198177ea08d7d358e99339", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/badge.pyi": "c3bb335b309177ff03d2cadcaf623744", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/button.pyi": "6a01812d601e8bf3dcd30dcccc75cb79", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/callout.pyi": "9b853e851805addacc2fcd995119f857", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/card.pyi": "67a71ec6ed4945a9ce270bd51d40b94e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox.pyi": "0c975a4812efc267c87119f10880e1a9", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_cards.pyi": "6425aae44ffe78f48699910906d16285", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_group.pyi": "d0029ee04a971d8a51be0c99e414a139", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/context_menu.pyi": "1ee25c7dd27fece9881800226e322d6b", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/data_list.pyi": "924addbc155a178709f5fd38af4eb547", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dialog.pyi": "e315e9779663f2f2fc9c2ca322a5645f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dropdown_menu.pyi": "ec6cb8830971b2a04bebe7459c059b15", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/hover_card.pyi": "28384945a53620ad6075797f8ada7354", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/icon_button.pyi": "6a3a37bdc9136f8c19fb3a7f55e76d64", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/inset.pyi": "05cfece835e2660bbc1b096529dfdec0", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/popover.pyi": "3033070773e8e32de283ad917367b386", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/progress.pyi": "798eadec25895a56e36d23203a4e0444", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio.pyi": "f6140dbf7ad4c25595c6983dcacc2a60", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_cards.pyi": "e16ca79a2ad4c2919f56efb54830c1ef", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_group.pyi": "473703616ed18d983dda3600899710a5", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/scroll_area.pyi": "12eb86d24886764bf1a5815e87ea519c", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/segmented_control.pyi": "6319f89d046b0fce8e9efb51e50dda9f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/select.pyi": "c6da1db236da70dc40815a404d2e29b3", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/separator.pyi": "d2dabb895d7fc63a556d3c3220e38b4d", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/skeleton.pyi": "55b003f62cc3e5c85c90c82f8f595bc6", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/slider.pyi": "c204f30612bfa35a62cb9f525a913f77", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/spinner.pyi": "faeddfd0e3dc0e3bbcfdeaa6e42cb755", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/switch.pyi": "70f1d8fc55398d3cbb01f157c768419e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/table.pyi": "a4c3052bc449924a630dad911f975e26", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tabs.pyi": "ec4e4ed03bd892c6f7d50ae4b490adb9", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_area.pyi": "06549c800759ae541cc3c3a74240af59", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_field.pyi": "dcb6a8ff4668082fc9406579098abf87", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tooltip.pyi": "69e4ce4eeaa60ac90ef120331cb8601c", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.pyi": "dcbb1dc8e860379188924c15dd21605b", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/base.pyi": "28e6cd3869c9cbad886b69b339e3ecf6", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/box.pyi": "004cae8160c3a91ae6c12b54205f5112", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/center.pyi": "9dbe595eddc2ec731beeb3a98743be36", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.pyi": "1fb9d0ce37de9c64f681ad70375b9e42", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/flex.pyi": "a729044bfe2d82404de07c4570262b55", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/grid.pyi": "74b017b63728ce328e110bc64f20a205", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "3a595ec7faf95645ab52bdad1bf9dc4a", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/section.pyi": "f3e44e291f3d96d06850d262de5d43a8", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/spacer.pyi": "a0a59ca93ea1e3a0e5136b9692a68d18", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/stack.pyi": "6ab750e790f0687b735d7464fa289c1f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/alert_dialog.pyi": "d59b9f942755b5c834b52f5a84c2367e", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/aspect_ratio.pyi": "cff788eed4bdc7dc66d4ad3d888bda60", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/avatar.pyi": "84a043c20582d6d73558ccebdc60054d", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/badge.pyi": "6921f2da42eebec5332535eae3c542d6", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/button.pyi": "1f7f7da7e41e596265b6f15d27414a82", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/callout.pyi": "f03b48a4abf948008098cae1a4a99eda", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/card.pyi": "2145870de0e7d60b8181756c057db234", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox.pyi": "a7ba797cc8a2b7f1ca1f72b4c6f579d9", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_cards.pyi": "545a5eaebc0b381276c871212d5d6e0c", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_group.pyi": "4fb9742b7cde5713bd665a25c391ca23", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/context_menu.pyi": "2816d4836b5bb9d708ca06cb88cc27de", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/data_list.pyi": "48db045ab4ddf1719c68b5ee8b342d02", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dialog.pyi": "18c377426c92087958d67ced909d06ef", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dropdown_menu.pyi": "050b9a25ec75066cd9b5b752aab4818e", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/hover_card.pyi": "21b935805a9cffc80c9a0cd1b79df78a", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/icon_button.pyi": "94e0001f486d5f00d703439ae408f00e", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/inset.pyi": "6f1dc67e42a4d05be812ea48eaedd9d9", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/popover.pyi": "4579c979d7b667e1a13a20e9072a55f4", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/progress.pyi": "922ad8cf11613104f5a0ea409cf60120", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio.pyi": "85e1a4faa3b8b92a28c8b93a0ef45421", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_cards.pyi": "b4911a5c282bc9539ee94b4d264f4899", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_group.pyi": "1d3017e0d7784b4c2907809f7c068797", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/scroll_area.pyi": "3d087254d642436ca0f41b8749fb7fc3", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/segmented_control.pyi": "400822cee5a97dbe23dd3e3cca3b12b0", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/select.pyi": "886ea80a92e7239db8e878923af6b5f8", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/separator.pyi": "22c43ea445fbc58bb3ff8877718670e8", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/skeleton.pyi": "0e8edc4ec4de57e1e4279758cc43634c", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/slider.pyi": "1e4e83460bb131a0b4e1fe26423c7489", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/spinner.pyi": "e0c2c09c7fa299e7f577bd484b4679a6", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/switch.pyi": "dbe5b3c1bc40e22dee76f280d090d42c", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/table.pyi": "46b72dc5c44248e7bf128b7848cfbf17", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tabs.pyi": "007773baee3d6c351d118852c7c66ee5", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_area.pyi": "10f3e236cb95bb548c8d91985b324d74", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_field.pyi": "81649296ed412f0581a1b1341280c4ad", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tooltip.pyi": "d330a001f0c9b9591dd44c78e214ba69", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.pyi": "9e452af27229b676ad0146e40f75bed5", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/base.pyi": "9d5398fae8403e514d2838f16397520b", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/box.pyi": "291ad8c97ed340c5a7b685b56025b64d", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/center.pyi": "bdb802747fba2fb45b5a2cb0bc73ef39", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.pyi": "c55b16993c079a226ab6a61475226649", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/flex.pyi": "e3f789dd62f7c5c335fa4563d51daab8", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/grid.pyi": "28937bde3d916cc9cdb2f54a5326f36f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "b7b0bb203cf999ee9f5f06f2ab8128b4", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/section.pyi": "7e21fcb3e0fe676ac522512909f023cc", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/spacer.pyi": "ac9d71f78da1640786e7d1cd49f8cbb8", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/stack.pyi": "8fb022fcd0374f3f01ce3110dd803fbb", "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.pyi": "de7ee994f66a4c1d1a6ac2ad3370c30e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/blockquote.pyi": "3dd8bc1d7117b4e2b3b38438b4d6631a", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "a71f56a8c51e9b00f953d87b16724bdb", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "47a5f03dc4c85c473026069d23b6c531", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "ced137b2820a5e156cd1846ff113cfc9", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "014444973b21272cf8c572b2913dfdf5", - "packages/reflex-components-react-player/src/reflex_components_react_player/audio.pyi": "2c3c398ec0cc1476995f316cf8d0d271", - "packages/reflex-components-react-player/src/reflex_components_react_player/react_player.pyi": "9f8631e66d64f8bed90cbfd63615a97a", - "packages/reflex-components-react-player/src/reflex_components_react_player/video.pyi": "d0efeacb8b4162e9ace79f99c03e4368", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/blockquote.pyi": "5fecf7ddaacee868438538fb647924d2", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "74f515c84f996e02ba76fdafb946d699", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "af6a5397ab1c4a44716064c5f7c82da5", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "c92e3e34ae39841409f37aee82687626", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "d645d8a7e5414cd0e2fc13d34f61f053", + "packages/reflex-components-react-player/src/reflex_components_react_player/audio.pyi": "6e0229a8421e1251469826d858a661f3", + "packages/reflex-components-react-player/src/reflex_components_react_player/react_player.pyi": "484064a8278c3982a2b1af51b2b9395d", + "packages/reflex-components-react-player/src/reflex_components_react_player/video.pyi": "2e01f60380dbbe15b7b9aa5b08c6b5b7", "packages/reflex-components-recharts/src/reflex_components_recharts/__init__.pyi": "7b8b69840a3637c1f1cac45ba815cccf", - "packages/reflex-components-recharts/src/reflex_components_recharts/cartesian.pyi": "9e99f951112c86ec7991bc80985a76b1", - "packages/reflex-components-recharts/src/reflex_components_recharts/charts.pyi": "5730b770af97f8c67d6d2d50e84fe14d", - "packages/reflex-components-recharts/src/reflex_components_recharts/general.pyi": "4097350ca05011733ce998898c6aefe7", - "packages/reflex-components-recharts/src/reflex_components_recharts/polar.pyi": "db5298160144f23ae7abcaac68e845c7", - "packages/reflex-components-recharts/src/reflex_components_recharts/recharts.pyi": "75150b01510bdacf2c97fca347c86c59", - "packages/reflex-components-sonner/src/reflex_components_sonner/toast.pyi": "dc43e142b089b1158588e999505444f6", - "reflex/__init__.pyi": "5de3d4af8ea86e9755f622510b868196", + "packages/reflex-components-recharts/src/reflex_components_recharts/cartesian.pyi": "3b463db9036c75944c014c762a6028a9", + "packages/reflex-components-recharts/src/reflex_components_recharts/charts.pyi": "b5e4be418cf50c99271f5067f9898be0", + "packages/reflex-components-recharts/src/reflex_components_recharts/general.pyi": "6db6f53e0396be1065c5f4bd63a49934", + "packages/reflex-components-recharts/src/reflex_components_recharts/polar.pyi": "f6b572c4d23313789cbd4fe0d86638bb", + "packages/reflex-components-recharts/src/reflex_components_recharts/recharts.pyi": "578f3055832dfa07e2bcdfaf46743981", + "packages/reflex-components-sonner/src/reflex_components_sonner/toast.pyi": "d129c457288b166e42720a4997da0edf", + "reflex/__init__.pyi": "3a9bb8544cbc338ffaf0a5927d9156df", "reflex/components/__init__.pyi": "f39a2af77f438fa243c58c965f19d42e", - "reflex/experimental/memo.pyi": "c10cbc554fe2ffdb3a008b59bc503936" + "reflex/experimental/memo.pyi": "469288136cf1b9ac6453f33d6d42bc14" } diff --git a/reflex/__init__.py b/reflex/__init__.py index 39d51b2c505..3a81b098db6 100644 --- a/reflex/__init__.py +++ b/reflex/__init__.py @@ -99,7 +99,7 @@ from reflex_components_radix.mappings import RADIX_MAPPING # noqa: E402 -_COMPONENTS_CORE_MAPPING: dict[str, list[str]] = { +_COMPONENTS_CORE_MAPPING: lazy_loader.SubmodAttrsType = { "reflex_components_core.core.banner": [ "connection_banner", "connection_modal", @@ -131,12 +131,12 @@ "reflex_components_core.core.window_events": ["window_event_listener"], } -_COMPONENTS_BASE_MAPPING: dict[str, list[str]] = { +_COMPONENTS_BASE_MAPPING: lazy_loader.SubmodAttrsType = { "reflex_components_core.base.fragment": ["fragment", "Fragment"], "reflex_components_core.base.script": ["script", "Script"], } -_ALL_COMPONENTS_MAPPING: dict[str, list[str]] = { +_ALL_COMPONENTS_MAPPING: lazy_loader.SubmodAttrsType = { "reflex_base.components.component": [ "Component", "NoSSRComponent", @@ -176,7 +176,7 @@ "recharts": "reflex_components_recharts", } -_MAPPING: dict[str, list[str]] = { +_MAPPING: lazy_loader.SubmodAttrsType = { "experimental": ["_x"], "admin": ["AdminDash"], "app": ["App", "UploadFile"], @@ -253,7 +253,7 @@ "compiler", "plugins", } -_SUBMOD_ATTRS: dict[str, list[str]] = _MAPPING +_SUBMOD_ATTRS: lazy_loader.SubmodAttrsType = _MAPPING _EXTRA_MAPPINGS: dict[str, str] = _COMPONENT_NAME_TO_PATH getattr, __dir__, __all__ = lazy_loader.attach( __name__, From 7ca45055f0ac17599589e0b595d94f0e72b1aacd Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 7 Apr 2026 23:05:05 -0700 Subject: [PATCH 03/10] pyi_generator: prop and docstring in mro order When rendering the props and docstring, include the subclasses props first, following the flattened MRO. Include descriptions for default event handlers. Include doc from ComponentField Run ruff format before ruff check --fix to avoid corrupting docstring indentation. --- .../src/reflex_base/utils/pyi_generator.py | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py index 19fdc389ec9..c37c1382c58 100644 --- a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py +++ b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py @@ -13,6 +13,7 @@ import subprocess import sys import typing +from collections import deque from collections.abc import Callable, Iterable, Mapping, Sequence from concurrent.futures import ProcessPoolExecutor from functools import cache @@ -23,7 +24,7 @@ from types import MappingProxyType, ModuleType, SimpleNamespace, UnionType from typing import Any, get_args, get_origin -from reflex_base.components.component import Component +from reflex_base.components.component import DEFAULT_TRIGGERS_AND_DESC, Component from reflex_base.vars.base import Var @@ -343,7 +344,7 @@ def _get_class_prop_comments(clz: type[Component]) -> Mapping[str, tuple[str, .. prop = match.group(0).strip(":") if comments: props_comments[prop] = tuple( - comment.strip().strip("#") for comment in comments + comment.strip().lstrip("#").strip() for comment in comments ) comments.clear() @@ -463,6 +464,24 @@ def _generate_imports( ] +def _maybe_default_event_handler_docstring( + prop_name: str, fallback: str = "no description" +) -> tuple[str, ...]: + """Add a docstring for default event handler prop. + + Args: + prop_name: The name of the prop. + fallback: The fallback docstring to use if the prop is not a default event handler and has no description. + + Returns: + The event handler description or the fallback if the prop is not a default event handler. + """ + try: + return (DEFAULT_TRIGGERS_AND_DESC[prop_name].description,) + except KeyError: + return (fallback,) + + def _generate_docstrings(clzs: list[type[Component]], props: list[str]) -> str: """Generate the docstrings for the create method. @@ -478,13 +497,17 @@ def _generate_docstrings(clzs: list[type[Component]], props: list[str]) -> str: for prop, comment_lines in _get_class_prop_comments(clz).items(): if prop in props: props_comments[prop] = list(comment_lines) + for prop, field in clz._fields.items(): + if prop in props and field.doc: + props_comments[prop] = [field.doc] clz = clzs[0] new_docstring = [] for line in (clz.create.__doc__ or "").splitlines(): if "**" in line: indent = line.split("**")[0] new_docstring.extend([ - f"{indent}{n}:{' '.join(c)}" for n, c in props_comments.items() + f"{indent}{prop_name}: {' '.join(props_comments.get(prop_name, _maybe_default_event_handler_docstring(prop_name)))}" + for prop_name in props ]) new_docstring.append(line) return "\n".join(new_docstring) @@ -524,7 +547,7 @@ def _extract_class_props_as_ast_nodes( clzs: list[type], type_hint_globals: dict[str, Any], extract_real_default: bool = False, -) -> list[tuple[ast.arg, ast.Constant | None]]: +) -> Sequence[tuple[ast.arg, ast.Constant | None]]: """Get the props defined on the class and all parents. Args: @@ -535,13 +558,13 @@ def _extract_class_props_as_ast_nodes( pydantic field definition. Returns: - The list of props as ast arg nodes + The sequence of props as ast arg nodes """ spec = _get_full_argspec(func) func_kwonlyargs = set(spec.kwonlyargs) all_props: set[str] = set() - kwargs = [] - for target_class in clzs: + kwargs = deque() + for target_class in reversed(clzs): event_triggers = _get_class_event_triggers(target_class) # Import from the target class to ensure type hints are resolvable. type_hint_globals.update(_get_module_star_imports(target_class.__module__)) @@ -549,9 +572,8 @@ def _extract_class_props_as_ast_nodes( **type_hint_globals, **_get_class_annotation_globals(target_class), } - for name, value in typing.get_type_hints( - target_class, globalns=annotation_globals - ).items(): + type_hints = typing.get_type_hints(target_class, globalns=annotation_globals) + for name, value in reversed(type_hints.items()): if ( name in func_kwonlyargs or name in EXCLUDED_PROPS @@ -572,7 +594,7 @@ def _extract_class_props_as_ast_nodes( if isinstance(default, Var): default = default._decode() - kwargs.append(( + kwargs.appendleft(( ast.arg( arg=name, annotation=ast.Name( @@ -1611,8 +1633,8 @@ def scan_all( # Fix generated pyi files with ruff. if file_paths: - subprocess.run(["ruff", "check", "--fix", *file_paths]) subprocess.run(["ruff", "format", *file_paths]) + subprocess.run(["ruff", "check", "--fix", *file_paths]) if use_json: if file_paths and changed_files is None: From 9766adfcda604cdc0cae0345fbcdd229a7003b93 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 7 Apr 2026 23:16:39 -0700 Subject: [PATCH 04/10] regenerate pyi for entire repo --- .../src/reflex_base/components/component.py | 4 +- .../reflex_components_core/core/debounce.py | 4 +- .../primitives/base.py | 4 +- .../reflex_components_radix/themes/base.py | 4 +- .../themes/layout/container.py | 4 +- .../react_player.py | 4 +- pyi_hashes.json | 212 +++++++++--------- 7 files changed, 119 insertions(+), 117 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/components/component.py b/packages/reflex-base/src/reflex_base/components/component.py index d809e633c32..c688ee9f1ca 100644 --- a/packages/reflex-base/src/reflex_base/components/component.py +++ b/packages/reflex-base/src/reflex_base/components/component.py @@ -702,7 +702,9 @@ class Component(BaseComponent, ABC): _rename_props: ClassVar[dict[str, str]] = {} custom_attrs: dict[str, Var | Any] = field( - doc="custom attribute", default_factory=dict, is_javascript_property=False + doc="Attributes passed directly to the component.", + default_factory=dict, + is_javascript_property=False, ) _memoization_mode: MemoizationMode = field( diff --git a/packages/reflex-components-core/src/reflex_components_core/core/debounce.py b/packages/reflex-components-core/src/reflex_components_core/core/debounce.py index 9c86c861941..500cd1f96a6 100644 --- a/packages/reflex-components-core/src/reflex_components_core/core/debounce.py +++ b/packages/reflex-components-core/src/reflex_components_core/core/debounce.py @@ -65,8 +65,8 @@ def create(cls, *children: Component, **props: Any) -> Component: the child, and then neuter the child's render method so it produces no output. Args: - children: The child component to wrap. - props: The component props. + *children: The child component to wrap. + **props: The component props. Returns: The DebounceInput component. diff --git a/packages/reflex-components-radix/src/reflex_components_radix/primitives/base.py b/packages/reflex-components-radix/src/reflex_components_radix/primitives/base.py index d2d895984b7..8ec5e8531e6 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/primitives/base.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/primitives/base.py @@ -43,8 +43,8 @@ def create(cls, *children: Any, **props: Any) -> Component: """Create a new RadixPrimitiveTriggerComponent instance. Args: - children: The children of the component. - props: The properties of the component. + *children: The children of the component. + **props: The properties of the component. Returns: The new RadixPrimitiveTriggerComponent instance. diff --git a/packages/reflex-components-radix/src/reflex_components_radix/themes/base.py b/packages/reflex-components-radix/src/reflex_components_radix/themes/base.py index 1b5fb5a0483..136f77721e8 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/themes/base.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/themes/base.py @@ -148,8 +148,8 @@ def create(cls, *children: Any, **props: Any) -> Component: """Create a new RadixThemesTriggerComponent instance. Args: - children: The children of the component. - props: The properties of the component. + *children: The children of the component. + **props: The properties of the component. Returns: The new RadixThemesTriggerComponent instance. diff --git a/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.py b/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.py index b98e30faf5f..d9ef24a186b 100644 --- a/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.py +++ b/packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.py @@ -39,10 +39,10 @@ def create( """Create the container component. Args: - children: The children components. + *children: The children components. padding: The padding of the container. stack_children_full_width: If True, any vstack/hstack children will have 100% width. - props: The properties of the container. + **props: The properties of the container. Returns: The container component. diff --git a/packages/reflex-components-react-player/src/reflex_components_react_player/react_player.py b/packages/reflex-components-react-player/src/reflex_components_react_player/react_player.py index c3a72bd6e71..77a4cdea940 100644 --- a/packages/reflex-components-react-player/src/reflex_components_react_player/react_player.py +++ b/packages/reflex-components-react-player/src/reflex_components_react_player/react_player.py @@ -236,8 +236,8 @@ def create(cls, *children, **props) -> ReactPlayer: """Create a component. Args: - children: The children of the component. - props: The props of the component. + *children: The children of the component. + **props: The props of the component. Returns: The created component. diff --git a/pyi_hashes.json b/pyi_hashes.json index c724f201c2c..0128a7ff8a2 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -1,124 +1,124 @@ { - "packages/reflex-components-code/src/reflex_components_code/code.pyi": "869f1ce363f11a528d7edd09f7e67ccb", - "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "2d8b0e74e6c8ecbfab049758920e6da5", + "packages/reflex-components-code/src/reflex_components_code/code.pyi": "e052a5d7bb20a7aa02f6d9241c6265a7", + "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "a6a1117b4c6519bb22f49a5823383404", "packages/reflex-components-core/src/reflex_components_core/__init__.pyi": "82b29d23f2490161d42fd21021bd39c3", "packages/reflex-components-core/src/reflex_components_core/base/__init__.pyi": "7009187aaaf191814d031e5462c48318", "packages/reflex-components-core/src/reflex_components_core/base/app_wrap.pyi": "c0c6564e0f3f025551e02b3e9458200b", - "packages/reflex-components-core/src/reflex_components_core/base/body.pyi": "b5c87f253d779d0d3277600b65ae450a", - "packages/reflex-components-core/src/reflex_components_core/base/document.pyi": "756ac4f65ecce51d79d14333b3dba211", - "packages/reflex-components-core/src/reflex_components_core/base/error_boundary.pyi": "3eb5fe255d025e7e5910442826795851", - "packages/reflex-components-core/src/reflex_components_core/base/fragment.pyi": "dabc61061f19066922e104e891a9bcdc", - "packages/reflex-components-core/src/reflex_components_core/base/link.pyi": "fdc378e62649c0a44a0fda6868bd6329", - "packages/reflex-components-core/src/reflex_components_core/base/meta.pyi": "fc4b70052ae4291516fb0e99d543f0c3", - "packages/reflex-components-core/src/reflex_components_core/base/script.pyi": "37411ac2e96fd11b86bd64fdd6974c02", - "packages/reflex-components-core/src/reflex_components_core/base/strict_mode.pyi": "6aca6c1e5e2ebc7ea1f5ee33b922f266", + "packages/reflex-components-core/src/reflex_components_core/base/body.pyi": "9c572ab4973b716b023bb26711292389", + "packages/reflex-components-core/src/reflex_components_core/base/document.pyi": "9b66e0cc4579a406dfc6a671025c84b1", + "packages/reflex-components-core/src/reflex_components_core/base/error_boundary.pyi": "ee2b2b4997eb87649bf571c28b8c7f2f", + "packages/reflex-components-core/src/reflex_components_core/base/fragment.pyi": "4330310dc8a32ec823c69105aa9445ef", + "packages/reflex-components-core/src/reflex_components_core/base/link.pyi": "fd3eb0f9943cb52b65c226f6efdbd211", + "packages/reflex-components-core/src/reflex_components_core/base/meta.pyi": "2e21e059ac87dc9897e09e5dff248fd6", + "packages/reflex-components-core/src/reflex_components_core/base/script.pyi": "d94c585877539b4c0f35973fa30ca92a", + "packages/reflex-components-core/src/reflex_components_core/base/strict_mode.pyi": "b42bd1c1978454d06d783d630e1d6a63", "packages/reflex-components-core/src/reflex_components_core/core/__init__.pyi": "dd5142b3c9087bf2bf22651adf6f2724", - "packages/reflex-components-core/src/reflex_components_core/core/auto_scroll.pyi": "884c8995e99bf7cd867b0b2cf2fa2820", - "packages/reflex-components-core/src/reflex_components_core/core/banner.pyi": "9cb35b6e8e348f40c859ff55b8b49cb6", - "packages/reflex-components-core/src/reflex_components_core/core/clipboard.pyi": "f80892262c6c493043279529d8ea9bdb", - "packages/reflex-components-core/src/reflex_components_core/core/debounce.pyi": "f665bbf88a4965e74819dfcf3e08a39a", - "packages/reflex-components-core/src/reflex_components_core/core/helmet.pyi": "8ccd36c5139674036f5e75d27366ab70", - "packages/reflex-components-core/src/reflex_components_core/core/html.pyi": "86cd3612a02de339b8aae6d32e2368a5", - "packages/reflex-components-core/src/reflex_components_core/core/sticky.pyi": "44dca9092a99235d93738858979a98a6", - "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "28a0a7e6cd743171322e7dd146ca8be0", - "packages/reflex-components-core/src/reflex_components_core/core/window_events.pyi": "25275a275a2f238bbf478f94d8a6df49", + "packages/reflex-components-core/src/reflex_components_core/core/auto_scroll.pyi": "5bd2e4aa0d32b6f76fdca5ecdd208922", + "packages/reflex-components-core/src/reflex_components_core/core/banner.pyi": "e2c488332e3f0accf1cf3a1a8e9e6419", + "packages/reflex-components-core/src/reflex_components_core/core/clipboard.pyi": "ec0e3f6c104520b3621559c833cb9ed2", + "packages/reflex-components-core/src/reflex_components_core/core/debounce.pyi": "e2233bf39fdcf74a795b7e3ff6736b5d", + "packages/reflex-components-core/src/reflex_components_core/core/helmet.pyi": "257b7d1ff394d7dfb79fc6e9bf583463", + "packages/reflex-components-core/src/reflex_components_core/core/html.pyi": "0515ecd0f7a1e6175b5781ee2a15a519", + "packages/reflex-components-core/src/reflex_components_core/core/sticky.pyi": "c13b4c9ddeccc854f7d4f735b6b8bf35", + "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "09ece177609cb795be88bcda8aec65f1", + "packages/reflex-components-core/src/reflex_components_core/core/window_events.pyi": "ccbd7f4c55eb499a058b4822db3639a3", "packages/reflex-components-core/src/reflex_components_core/datadisplay/__init__.pyi": "c96fed4da42a13576d64f84e3c7cb25c", "packages/reflex-components-core/src/reflex_components_core/el/__init__.pyi": "f09129ddefb57ab4c7769c86dc9a3153", - "packages/reflex-components-core/src/reflex_components_core/el/element.pyi": "12f4b88707f2cb44234f96cecc6c7633", + "packages/reflex-components-core/src/reflex_components_core/el/element.pyi": "3250cce0348494dac0075468bdc6daae", "packages/reflex-components-core/src/reflex_components_core/el/elements/__init__.pyi": "e6c845f2f29eb079697a2e31b0c2f23a", - "packages/reflex-components-core/src/reflex_components_core/el/elements/base.pyi": "3443296989beef2488682d78acf9acac", - "packages/reflex-components-core/src/reflex_components_core/el/elements/forms.pyi": "da0c4d8985ddb1ddc0e94e47589b95e9", - "packages/reflex-components-core/src/reflex_components_core/el/elements/inline.pyi": "28eca1bb8af3eae4fe66c7a795eb4b09", - "packages/reflex-components-core/src/reflex_components_core/el/elements/media.pyi": "5bf66f02022f0885ae1d513926948d16", - "packages/reflex-components-core/src/reflex_components_core/el/elements/metadata.pyi": "f7967c873392fa8c6d3a8b19671d012a", - "packages/reflex-components-core/src/reflex_components_core/el/elements/other.pyi": "309da7308f5c0e2a240885a2c0e1ab98", - "packages/reflex-components-core/src/reflex_components_core/el/elements/scripts.pyi": "4339ef10297c28cd5c37e5cc9e2f8c13", - "packages/reflex-components-core/src/reflex_components_core/el/elements/sectioning.pyi": "b6c27f092a15905a4975982d1c21d2d0", - "packages/reflex-components-core/src/reflex_components_core/el/elements/tables.pyi": "f899d1c7c7e0ae19b6db676d587a2341", - "packages/reflex-components-core/src/reflex_components_core/el/elements/typography.pyi": "23f187439ef08796c7e782836c84f064", - "packages/reflex-components-core/src/reflex_components_core/react_router/dom.pyi": "10eb13d6e3340e0e57afbc040985482b", - "packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.pyi": "4bd9115e62ec1111ac2ef1a04fdbfc68", - "packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.pyi": "0fcc3ed34c5a74014d00614dc87c5d42", - "packages/reflex-components-lucide/src/reflex_components_lucide/icon.pyi": "c9b55cfb68e81039cc6cd3ee5ac8fcd1", - "packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "fc06009b984167cb7a91684adbbdc9a9", - "packages/reflex-components-moment/src/reflex_components_moment/moment.pyi": "8267bb49554cbce5bc2fecfad31d49e5", - "packages/reflex-components-plotly/src/reflex_components_plotly/plotly.pyi": "b6f217c16c56d795733832ca8794c33b", + "packages/reflex-components-core/src/reflex_components_core/el/elements/base.pyi": "b494fbc3c0127645c8ec26bb3433f649", + "packages/reflex-components-core/src/reflex_components_core/el/elements/forms.pyi": "2b245f1839036fe0df71074ab84f98c0", + "packages/reflex-components-core/src/reflex_components_core/el/elements/inline.pyi": "07cb9aea9d31875fc8dcaf29eb1ffd4b", + "packages/reflex-components-core/src/reflex_components_core/el/elements/media.pyi": "ff3a9d9046048b282dd70aa4d7402e3c", + "packages/reflex-components-core/src/reflex_components_core/el/elements/metadata.pyi": "ea0643eae0be461db99618fea05967e2", + "packages/reflex-components-core/src/reflex_components_core/el/elements/other.pyi": "9e9a63318f10cc160ae9e5b6697babb4", + "packages/reflex-components-core/src/reflex_components_core/el/elements/scripts.pyi": "239b3e3c1a9f8602de1cff1987eda874", + "packages/reflex-components-core/src/reflex_components_core/el/elements/sectioning.pyi": "db2ab8f3fff84d638516bf2d49de703d", + "packages/reflex-components-core/src/reflex_components_core/el/elements/tables.pyi": "5ec710535671e9fab2ff7761fd0b980d", + "packages/reflex-components-core/src/reflex_components_core/el/elements/typography.pyi": "611a3addf30eed59b53d0a08c3e13662", + "packages/reflex-components-core/src/reflex_components_core/react_router/dom.pyi": "2b039f5a8661c2664921e145bbae9a65", + "packages/reflex-components-dataeditor/src/reflex_components_dataeditor/dataeditor.pyi": "19d114e89d15fd4e7549c12f00da3cdb", + "packages/reflex-components-gridjs/src/reflex_components_gridjs/datatable.pyi": "2813be430faa16707e1dba1523248035", + "packages/reflex-components-lucide/src/reflex_components_lucide/icon.pyi": "1ff690ec1e210d74e1b110a53e2c2be7", + "packages/reflex-components-markdown/src/reflex_components_markdown/markdown.pyi": "b055fb85e46a7f7b3222d3946fc5e1c5", + "packages/reflex-components-moment/src/reflex_components_moment/moment.pyi": "0080f856cb7385d2a60d262475aa9b55", + "packages/reflex-components-plotly/src/reflex_components_plotly/plotly.pyi": "109f735eaa418fd88821775111ed4f0e", "packages/reflex-components-radix/src/reflex_components_radix/__init__.pyi": "19216eb3618f68c8a76e5e43801cf4af", "packages/reflex-components-radix/src/reflex_components_radix/primitives/__init__.pyi": "5404a8da97e8b5129133d7f300e3f642", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/accordion.pyi": "63cf54bfe7183af2b575afa51e66ff1e", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/base.pyi": "ac7d799bf007a177082e90987b0c03ae", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/dialog.pyi": "3e01193a2aeb26f7dfc952d41d7d6e68", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/drawer.pyi": "b47bdbeb9f4b9e88f85a0eaf00a1e916", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/form.pyi": "93b14cc389d2af3391d3bb5d6772aa5e", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/progress.pyi": "67f88225f3ca5146306d694361dbac1b", - "packages/reflex-components-radix/src/reflex_components_radix/primitives/slider.pyi": "5d7885df3921fa773d65e865ccc3dd8f", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/accordion.pyi": "f43b5cd28126ec0290f7054f73251fc8", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/base.pyi": "02044350cb13430f4ed2ee731251a066", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/dialog.pyi": "0c4df70b06d647a3ddd5dba70c43f34f", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/drawer.pyi": "ce7fc5bce729b8e114d0655cd4994f9d", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/form.pyi": "96a11cfd7262e4b5d3d92d5bcbec7c96", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/progress.pyi": "8e4f2567cfdedae599426af7caecc05a", + "packages/reflex-components-radix/src/reflex_components_radix/primitives/slider.pyi": "4c6187c3e8b6b3a6be362ffba61fa8ad", "packages/reflex-components-radix/src/reflex_components_radix/themes/__init__.pyi": "b433b9a099dc5b0ab008d02c85d38059", - "packages/reflex-components-radix/src/reflex_components_radix/themes/base.pyi": "b0f9a52a4a6e00e009cc4a9ab3f96dd9", - "packages/reflex-components-radix/src/reflex_components_radix/themes/color_mode.pyi": "d9d63fc00e0fd35dbccc8825ed846bc9", + "packages/reflex-components-radix/src/reflex_components_radix/themes/base.pyi": "06d8d8014eba38c1ea173c53002a63e3", + "packages/reflex-components-radix/src/reflex_components_radix/themes/color_mode.pyi": "b6c9fcb1a2ff029d05b9d658b50b4d11", "packages/reflex-components-radix/src/reflex_components_radix/themes/components/__init__.pyi": "f10f0169f81c78290333da831915762f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/alert_dialog.pyi": "d59b9f942755b5c834b52f5a84c2367e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/aspect_ratio.pyi": "cff788eed4bdc7dc66d4ad3d888bda60", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/avatar.pyi": "84a043c20582d6d73558ccebdc60054d", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/badge.pyi": "6921f2da42eebec5332535eae3c542d6", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/button.pyi": "1f7f7da7e41e596265b6f15d27414a82", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/callout.pyi": "f03b48a4abf948008098cae1a4a99eda", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/card.pyi": "2145870de0e7d60b8181756c057db234", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox.pyi": "a7ba797cc8a2b7f1ca1f72b4c6f579d9", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_cards.pyi": "545a5eaebc0b381276c871212d5d6e0c", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_group.pyi": "4fb9742b7cde5713bd665a25c391ca23", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/context_menu.pyi": "2816d4836b5bb9d708ca06cb88cc27de", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/data_list.pyi": "48db045ab4ddf1719c68b5ee8b342d02", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dialog.pyi": "18c377426c92087958d67ced909d06ef", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dropdown_menu.pyi": "050b9a25ec75066cd9b5b752aab4818e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/hover_card.pyi": "21b935805a9cffc80c9a0cd1b79df78a", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/icon_button.pyi": "94e0001f486d5f00d703439ae408f00e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/inset.pyi": "6f1dc67e42a4d05be812ea48eaedd9d9", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/popover.pyi": "4579c979d7b667e1a13a20e9072a55f4", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/progress.pyi": "922ad8cf11613104f5a0ea409cf60120", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio.pyi": "85e1a4faa3b8b92a28c8b93a0ef45421", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_cards.pyi": "b4911a5c282bc9539ee94b4d264f4899", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_group.pyi": "1d3017e0d7784b4c2907809f7c068797", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/scroll_area.pyi": "3d087254d642436ca0f41b8749fb7fc3", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/segmented_control.pyi": "400822cee5a97dbe23dd3e3cca3b12b0", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/select.pyi": "886ea80a92e7239db8e878923af6b5f8", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/separator.pyi": "22c43ea445fbc58bb3ff8877718670e8", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/skeleton.pyi": "0e8edc4ec4de57e1e4279758cc43634c", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/slider.pyi": "1e4e83460bb131a0b4e1fe26423c7489", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/spinner.pyi": "e0c2c09c7fa299e7f577bd484b4679a6", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/switch.pyi": "dbe5b3c1bc40e22dee76f280d090d42c", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/table.pyi": "46b72dc5c44248e7bf128b7848cfbf17", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tabs.pyi": "007773baee3d6c351d118852c7c66ee5", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_area.pyi": "10f3e236cb95bb548c8d91985b324d74", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_field.pyi": "81649296ed412f0581a1b1341280c4ad", - "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tooltip.pyi": "d330a001f0c9b9591dd44c78e214ba69", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/alert_dialog.pyi": "f3026c5404ccb481cc46d4526d19e825", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/aspect_ratio.pyi": "48a00650a3a155e7f1bd09a09bd89543", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/avatar.pyi": "3f5e46fb7bae6b22c54b2134bd78a568", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/badge.pyi": "a7fd56b738b2b07ae5596836da6ede3c", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/button.pyi": "4b0481818b2d37243a00d5120abeca01", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/callout.pyi": "8973b229d7bc67f8c2f596478b527231", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/card.pyi": "4daa42eb9d6757ff4e8478cff3b30e6b", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox.pyi": "cfe85ecd154bf85333f895760171fa08", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_cards.pyi": "71ace8982a9f93d9fbbfcff669a4ad4b", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/checkbox_group.pyi": "f4e107e9330f7959ccf37dc39f50fb38", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/context_menu.pyi": "f71d1088345d3f48eb2dd754ee604e25", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/data_list.pyi": "8c476b1a25f3fa95e1bdf32b83881e2b", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dialog.pyi": "63715a2a2eb4f5d1517f162f005918dd", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/dropdown_menu.pyi": "14cf319ffe4044ea9b989b900676aa20", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/hover_card.pyi": "1e5fbafb9e8c1b39f126a9040a77c178", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/icon_button.pyi": "1e92d503ba0c3bbe294ccb116363333f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/inset.pyi": "493e6b10e8f8fc4c64ee9741860c1d73", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/popover.pyi": "bffd2325fdc29f3ecef53c409098e6a9", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/progress.pyi": "d80868e4dee2554fd1c85a0ae68ea975", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio.pyi": "9004f1d4d6b3f480b07e7728e5c344e0", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_cards.pyi": "1461c1348f86c318fc369fd11e04f1f1", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/radio_group.pyi": "8735fa2ad839bdcb41ee2abfc4ab6f42", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/scroll_area.pyi": "a2226bf54f66fe605168a9644ae81607", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/segmented_control.pyi": "5664c0d090767a4f938662b5adc8479a", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/select.pyi": "4192712f54ca0388c26a757b2d062fd4", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/separator.pyi": "d7c8626d43e079b102b1e1c2f4b5740f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/skeleton.pyi": "5ccf7896dffcc17c9520e0a1aeb9d8c2", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/slider.pyi": "ddcd9afeebdf49aa2ed2b34f4f2e7ad4", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/spinner.pyi": "c0f13b8f32600813135be9bc2b78b98f", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/switch.pyi": "216e9f6fd48bf34b116827bc7813b867", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/table.pyi": "82ccd17b638e717e05b6850c457d4756", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tabs.pyi": "e8588a7a5754684d1587d54bdce4ce08", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_area.pyi": "adc91a1ba5d549b3900c6cd97089be93", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/text_field.pyi": "17ba0d974f3a2595140a9f803fef2aaf", + "packages/reflex-components-radix/src/reflex_components_radix/themes/components/tooltip.pyi": "e619ef44dcd6121a88f21ec5eb0bcb76", "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/__init__.pyi": "9e452af27229b676ad0146e40f75bed5", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/base.pyi": "9d5398fae8403e514d2838f16397520b", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/box.pyi": "291ad8c97ed340c5a7b685b56025b64d", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/center.pyi": "bdb802747fba2fb45b5a2cb0bc73ef39", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.pyi": "c55b16993c079a226ab6a61475226649", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/flex.pyi": "e3f789dd62f7c5c335fa4563d51daab8", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/grid.pyi": "28937bde3d916cc9cdb2f54a5326f36f", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "b7b0bb203cf999ee9f5f06f2ab8128b4", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/section.pyi": "7e21fcb3e0fe676ac522512909f023cc", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/spacer.pyi": "ac9d71f78da1640786e7d1cd49f8cbb8", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/stack.pyi": "8fb022fcd0374f3f01ce3110dd803fbb", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/base.pyi": "59dfdd4b2237a4a97c58e70476fb53cd", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/box.pyi": "fa8f815127a06070d8315e2607c8914a", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/center.pyi": "05d3f0df46dd16d16f343fbcde0738c3", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.pyi": "422f06113f95e1f529b0c5fb063a924a", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/flex.pyi": "6974d7234d20ab3962ea3f214621f0fa", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/grid.pyi": "d3fc6e269dad51d58ef216f4f1383161", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "371ec28a80a0fee23aa61cc3dd8937ca", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/section.pyi": "8fc9ace12dc2203ac03f4e1eb40b0524", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/spacer.pyi": "9465d40e37799336ab293bd9f573239d", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/stack.pyi": "86bd2f0438888594ed2c27f33b1de618", "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.pyi": "de7ee994f66a4c1d1a6ac2ad3370c30e", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/blockquote.pyi": "5fecf7ddaacee868438538fb647924d2", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "74f515c84f996e02ba76fdafb946d699", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "af6a5397ab1c4a44716064c5f7c82da5", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "c92e3e34ae39841409f37aee82687626", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "d645d8a7e5414cd0e2fc13d34f61f053", - "packages/reflex-components-react-player/src/reflex_components_react_player/audio.pyi": "6e0229a8421e1251469826d858a661f3", - "packages/reflex-components-react-player/src/reflex_components_react_player/react_player.pyi": "484064a8278c3982a2b1af51b2b9395d", - "packages/reflex-components-react-player/src/reflex_components_react_player/video.pyi": "2e01f60380dbbe15b7b9aa5b08c6b5b7", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/blockquote.pyi": "cab479bcd17a1de02a160a128d6c79c8", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "c0d9fbb0f60356fbeee779d1f6d7074d", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "38340f3146519a872016b3e25d6b39ef", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "53afad79280af8d7dca69d75f96f0096", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "fd866ed867c6420fb9e1907b36942917", + "packages/reflex-components-react-player/src/reflex_components_react_player/audio.pyi": "dde60f9e0b7a2427570d88ae579d984a", + "packages/reflex-components-react-player/src/reflex_components_react_player/react_player.pyi": "2cd9d0cb2f6acd5bd0223fbdd74df232", + "packages/reflex-components-react-player/src/reflex_components_react_player/video.pyi": "18e673fcb6ef62d17f9b06d38d713b43", "packages/reflex-components-recharts/src/reflex_components_recharts/__init__.pyi": "7b8b69840a3637c1f1cac45ba815cccf", - "packages/reflex-components-recharts/src/reflex_components_recharts/cartesian.pyi": "3b463db9036c75944c014c762a6028a9", - "packages/reflex-components-recharts/src/reflex_components_recharts/charts.pyi": "b5e4be418cf50c99271f5067f9898be0", - "packages/reflex-components-recharts/src/reflex_components_recharts/general.pyi": "6db6f53e0396be1065c5f4bd63a49934", - "packages/reflex-components-recharts/src/reflex_components_recharts/polar.pyi": "f6b572c4d23313789cbd4fe0d86638bb", - "packages/reflex-components-recharts/src/reflex_components_recharts/recharts.pyi": "578f3055832dfa07e2bcdfaf46743981", - "packages/reflex-components-sonner/src/reflex_components_sonner/toast.pyi": "d129c457288b166e42720a4997da0edf", + "packages/reflex-components-recharts/src/reflex_components_recharts/cartesian.pyi": "2f1ada2312a4e9109a880df6097d4a52", + "packages/reflex-components-recharts/src/reflex_components_recharts/charts.pyi": "331c78673d708334233676cab327d15d", + "packages/reflex-components-recharts/src/reflex_components_recharts/general.pyi": "28717f060c6cff577e9a7e556c395019", + "packages/reflex-components-recharts/src/reflex_components_recharts/polar.pyi": "ce8813c1bfdd3b60e07f2dc8373ea8d8", + "packages/reflex-components-recharts/src/reflex_components_recharts/recharts.pyi": "7d1f8a97e8bdad9fbcd8543a9d9d37d7", + "packages/reflex-components-sonner/src/reflex_components_sonner/toast.pyi": "94fd94b9e127bbc98b7bf0011d6305fa", "reflex/__init__.pyi": "3a9bb8544cbc338ffaf0a5927d9156df", "reflex/components/__init__.pyi": "f39a2af77f438fa243c58c965f19d42e", - "reflex/experimental/memo.pyi": "469288136cf1b9ac6453f33d6d42bc14" + "reflex/experimental/memo.pyi": "5912c6017337c852fff42cdfcf95cd6c" } From e025f19fb57fb998b0fc3e74c9d906d71f91e749 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 7 Apr 2026 23:26:00 -0700 Subject: [PATCH 05/10] MarkdownComponentMap._explicit_return becomes ClassVar There's no practical reason for this to be a prop, so make it a ClassVar. --- .../src/reflex_components_core/core/markdown_component_map.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/reflex-components-core/src/reflex_components_core/core/markdown_component_map.py b/packages/reflex-components-core/src/reflex_components_core/core/markdown_component_map.py index 16a539d4d9f..a5f17c73a27 100644 --- a/packages/reflex-components-core/src/reflex_components_core/core/markdown_component_map.py +++ b/packages/reflex-components-core/src/reflex_components_core/core/markdown_component_map.py @@ -4,6 +4,7 @@ import dataclasses from collections.abc import Sequence +from typing import ClassVar from reflex_base.vars.base import Var, VarData from reflex_base.vars.function import ArgsFunctionOperation, DestructuredArg @@ -17,7 +18,7 @@ class MarkdownComponentMap: """Mixin class for handling custom component maps in Markdown components.""" - _explicit_return: bool = dataclasses.field(default=False) + _explicit_return: ClassVar[bool] = False @classmethod def get_component_map_custom_code(cls) -> Var: From 1cc2431ec7367ca3d70ab68c4caa6cfadb0d8722 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Tue, 7 Apr 2026 23:38:31 -0700 Subject: [PATCH 06/10] exclude ClassVar from prop/docstring generation ClassVar should never be accepted in a `create` function --- .../src/reflex_base/utils/pyi_generator.py | 4 ++-- pyi_hashes.json | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py index c37c1382c58..bbd8068d248 100644 --- a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py +++ b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py @@ -22,7 +22,7 @@ from itertools import chain from pathlib import Path from types import MappingProxyType, ModuleType, SimpleNamespace, UnionType -from typing import Any, get_args, get_origin +from typing import Any, ClassVar, get_args, get_origin from reflex_base.components.component import DEFAULT_TRIGGERS_AND_DESC, Component from reflex_base.vars.base import Var @@ -579,7 +579,7 @@ def _extract_class_props_as_ast_nodes( or name in EXCLUDED_PROPS or name in all_props or name in event_triggers - or (isinstance(value, str) and "ClassVar" in value) + or get_origin(value) is ClassVar ): continue all_props.add(name) diff --git a/pyi_hashes.json b/pyi_hashes.json index 0128a7ff8a2..01d72078c49 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -1,6 +1,6 @@ { - "packages/reflex-components-code/src/reflex_components_code/code.pyi": "e052a5d7bb20a7aa02f6d9241c6265a7", - "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "a6a1117b4c6519bb22f49a5823383404", + "packages/reflex-components-code/src/reflex_components_code/code.pyi": "714688c5b43deb05a65ff66e042c8c09", + "packages/reflex-components-code/src/reflex_components_code/shiki_code_block.pyi": "1aaa72237f8f000967a34bc3e2196b5e", "packages/reflex-components-core/src/reflex_components_core/__init__.pyi": "82b29d23f2490161d42fd21021bd39c3", "packages/reflex-components-core/src/reflex_components_core/base/__init__.pyi": "7009187aaaf191814d031e5462c48318", "packages/reflex-components-core/src/reflex_components_core/base/app_wrap.pyi": "c0c6564e0f3f025551e02b3e9458200b", @@ -20,7 +20,7 @@ "packages/reflex-components-core/src/reflex_components_core/core/helmet.pyi": "257b7d1ff394d7dfb79fc6e9bf583463", "packages/reflex-components-core/src/reflex_components_core/core/html.pyi": "0515ecd0f7a1e6175b5781ee2a15a519", "packages/reflex-components-core/src/reflex_components_core/core/sticky.pyi": "c13b4c9ddeccc854f7d4f735b6b8bf35", - "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "09ece177609cb795be88bcda8aec65f1", + "packages/reflex-components-core/src/reflex_components_core/core/upload.pyi": "f5529c6cb678c5287d5b06c7e288bce6", "packages/reflex-components-core/src/reflex_components_core/core/window_events.pyi": "ccbd7f4c55eb499a058b4822db3639a3", "packages/reflex-components-core/src/reflex_components_core/datadisplay/__init__.pyi": "c96fed4da42a13576d64f84e3c7cb25c", "packages/reflex-components-core/src/reflex_components_core/el/__init__.pyi": "f09129ddefb57ab4c7769c86dc9a3153", @@ -98,16 +98,16 @@ "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/container.pyi": "422f06113f95e1f529b0c5fb063a924a", "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/flex.pyi": "6974d7234d20ab3962ea3f214621f0fa", "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/grid.pyi": "d3fc6e269dad51d58ef216f4f1383161", - "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "371ec28a80a0fee23aa61cc3dd8937ca", + "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/list.pyi": "562a81aa0ecdb5e1df3ffeac627f1fac", "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/section.pyi": "8fc9ace12dc2203ac03f4e1eb40b0524", "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/spacer.pyi": "9465d40e37799336ab293bd9f573239d", "packages/reflex-components-radix/src/reflex_components_radix/themes/layout/stack.pyi": "86bd2f0438888594ed2c27f33b1de618", "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/__init__.pyi": "de7ee994f66a4c1d1a6ac2ad3370c30e", "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/blockquote.pyi": "cab479bcd17a1de02a160a128d6c79c8", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "c0d9fbb0f60356fbeee779d1f6d7074d", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "38340f3146519a872016b3e25d6b39ef", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "53afad79280af8d7dca69d75f96f0096", - "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "fd866ed867c6420fb9e1907b36942917", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/code.pyi": "bba3d1b425aa8b6cc33a40efa0dcb771", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/heading.pyi": "db7f5d1ee9840c362088387383e2ee1b", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/link.pyi": "168df16b7901bf3618745c1e9177e354", + "packages/reflex-components-radix/src/reflex_components_radix/themes/typography/text.pyi": "9bb6cc58f1ab188708e8b65189bddcaa", "packages/reflex-components-react-player/src/reflex_components_react_player/audio.pyi": "dde60f9e0b7a2427570d88ae579d984a", "packages/reflex-components-react-player/src/reflex_components_react_player/react_player.pyi": "2cd9d0cb2f6acd5bd0223fbdd74df232", "packages/reflex-components-react-player/src/reflex_components_react_player/video.pyi": "18e673fcb6ef62d17f9b06d38d713b43", From 3c8da1bbea62f6ccea03a27ccde4f0ee014be799 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Wed, 8 Apr 2026 10:24:04 -0700 Subject: [PATCH 07/10] Remove `reflex.state` import from reflex_base package Instead, the pyi_generator just pops out the `State` attribute from `__annotations__` because it was in EXCLUDED_PROPS anyway. --- packages/reflex-base/src/reflex_base/components/component.py | 4 ---- packages/reflex-base/src/reflex_base/utils/pyi_generator.py | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/components/component.py b/packages/reflex-base/src/reflex_base/components/component.py index c688ee9f1ca..a1d6c8c8956 100644 --- a/packages/reflex-base/src/reflex_base/components/component.py +++ b/packages/reflex-base/src/reflex_base/components/component.py @@ -3019,7 +3019,3 @@ def create( ), _var_value=value, ) - - -# Late import of reflex.state to resolve ForwardRef type hints without circular import. -import reflex.state # noqa: E402 diff --git a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py index bbd8068d248..5c916a61943 100644 --- a/packages/reflex-base/src/reflex_base/utils/pyi_generator.py +++ b/packages/reflex-base/src/reflex_base/utils/pyi_generator.py @@ -572,6 +572,8 @@ def _extract_class_props_as_ast_nodes( **type_hint_globals, **_get_class_annotation_globals(target_class), } + # State attr isn't really a prop and cannot be resolved, so pop it off. + target_class.__annotations__.pop("State", None) type_hints = typing.get_type_hints(target_class, globalns=annotation_globals) for name, value in reversed(type_hints.items()): if ( From eea00a46f0e84061046ac4c2c9455c66c8e4b720 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Wed, 8 Apr 2026 10:25:43 -0700 Subject: [PATCH 08/10] Update packages/reflex-base/src/reflex_base/utils/lazy_loader.py Co-authored-by: greptile-apps[bot] <165735046+greptile-apps[bot]@users.noreply.github.com> --- .../reflex-base/src/reflex_base/utils/lazy_loader.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py index 30cab4ce7e3..438cab2dc05 100644 --- a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py +++ b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py @@ -113,6 +113,12 @@ def comp_name(comp: str | tuple[str, str]) -> str: return comp[0] if isinstance(comp, tuple) else comp +def comp_alias(comp: str | tuple[str, str]) -> str: + """Get the component alias from the mapping value. + + This is the name external users will import. + + Args: def comp_alias(comp: str | tuple[str, str]) -> str: """Get the component alias from the mapping value. @@ -122,9 +128,8 @@ def comp_alias(comp: str | tuple[str, str]) -> str: comp: The component name or a tuple of (component name, alias). Returns: - The component alias, or None if there is no alias. + The component alias, or the component name itself if there is no alias. """ - return comp[1] if isinstance(comp, tuple) else comp def comp_path(path: str, comp: str | tuple[str, str]) -> str: From 5b40a2e0f08cb1ff245d37700448a4b1ac6f0f23 Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Wed, 8 Apr 2026 10:30:13 -0700 Subject: [PATCH 09/10] Revert "Update packages/reflex-base/src/reflex_base/utils/lazy_loader.py" This reverts commit eea00a46f0e84061046ac4c2c9455c66c8e4b720. --- .../reflex-base/src/reflex_base/utils/lazy_loader.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py index 438cab2dc05..30cab4ce7e3 100644 --- a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py +++ b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py @@ -113,12 +113,6 @@ def comp_name(comp: str | tuple[str, str]) -> str: return comp[0] if isinstance(comp, tuple) else comp -def comp_alias(comp: str | tuple[str, str]) -> str: - """Get the component alias from the mapping value. - - This is the name external users will import. - - Args: def comp_alias(comp: str | tuple[str, str]) -> str: """Get the component alias from the mapping value. @@ -128,8 +122,9 @@ def comp_alias(comp: str | tuple[str, str]) -> str: comp: The component name or a tuple of (component name, alias). Returns: - The component alias, or the component name itself if there is no alias. + The component alias, or None if there is no alias. """ + return comp[1] if isinstance(comp, tuple) else comp def comp_path(path: str, comp: str | tuple[str, str]) -> str: From 7834651a430935621387d23d12aac7ba4029c41e Mon Sep 17 00:00:00 2001 From: Masen Furer Date: Wed, 8 Apr 2026 10:30:35 -0700 Subject: [PATCH 10/10] fix lazy_loader docstring properly --- packages/reflex-base/src/reflex_base/utils/lazy_loader.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py index 30cab4ce7e3..eed28e0d2ec 100644 --- a/packages/reflex-base/src/reflex_base/utils/lazy_loader.py +++ b/packages/reflex-base/src/reflex_base/utils/lazy_loader.py @@ -122,7 +122,7 @@ def comp_alias(comp: str | tuple[str, str]) -> str: comp: The component name or a tuple of (component name, alias). Returns: - The component alias, or None if there is no alias. + The component alias, or the compoenent name if there is no alias. """ return comp[1] if isinstance(comp, tuple) else comp