diff --git a/reflex/components/core/html.py b/reflex/components/core/html.py
index f4d9ba923..b68761316 100644
--- a/reflex/components/core/html.py
+++ b/reflex/components/core/html.py
@@ -9,7 +9,7 @@ class Html(Div):
"""Render the html.
Returns:
- The code to render the html component.
+ The code to render the html component.
"""
# The HTML to render.
diff --git a/reflex/components/el/__init__.pyi b/reflex/components/el/__init__.pyi
index 81b00e37e..0181309eb 100644
--- a/reflex/components/el/__init__.pyi
+++ b/reflex/components/el/__init__.pyi
@@ -185,7 +185,7 @@ from .elements.tables import tfoot as tfoot
from .elements.tables import th as th
from .elements.tables import thead as thead
from .elements.tables import tr as tr
-from .elements.tables import Tbody as Tbody
+from .elements.tables import tbody as tbody
from .elements.tables import Caption as Caption
from .elements.tables import Col as Col
from .elements.tables import Colgroup as Colgroup
@@ -195,6 +195,7 @@ from .elements.tables import Tfoot as Tfoot
from .elements.tables import Th as Th
from .elements.tables import Thead as Thead
from .elements.tables import Tr as Tr
+from .elements.tables import Tbody as Tbody
from .elements.typography import blockquote as blockquote
from .elements.typography import dd as dd
from .elements.typography import div as div
diff --git a/reflex/components/el/elements/__init__.py b/reflex/components/el/elements/__init__.py
index 4a029e7dc..70a7dad4a 100644
--- a/reflex/components/el/elements/__init__.py
+++ b/reflex/components/el/elements/__init__.py
@@ -102,7 +102,7 @@ _MAPPING = {
"th",
"thead",
"tr",
- "Tbody",
+ "tbody",
],
"typography": [
"blockquote",
diff --git a/reflex/components/el/elements/__init__.pyi b/reflex/components/el/elements/__init__.pyi
index 9e812790a..adaf63049 100644
--- a/reflex/components/el/elements/__init__.pyi
+++ b/reflex/components/el/elements/__init__.pyi
@@ -183,7 +183,7 @@ from .tables import tfoot as tfoot
from .tables import th as th
from .tables import thead as thead
from .tables import tr as tr
-from .tables import Tbody as Tbody
+from .tables import tbody as tbody
from .tables import Caption as Caption
from .tables import Col as Col
from .tables import Colgroup as Colgroup
@@ -193,6 +193,7 @@ from .tables import Tfoot as Tfoot
from .tables import Th as Th
from .tables import Thead as Thead
from .tables import Tr as Tr
+from .tables import Tbody as Tbody
from .typography import blockquote as blockquote
from .typography import dd as dd
from .typography import div as div
@@ -316,7 +317,7 @@ _MAPPING = {
"th",
"thead",
"tr",
- "Tbody",
+ "tbody",
],
"typography": [
"blockquote",
diff --git a/reflex/utils/format.py b/reflex/utils/format.py
index 5a0d1b959..f3c2e63de 100644
--- a/reflex/utils/format.py
+++ b/reflex/utils/format.py
@@ -9,8 +9,7 @@ import re
from typing import TYPE_CHECKING, Any, Callable, List, Optional, Union
from reflex import constants
-from reflex.utils import exceptions, serializers, types
-from reflex.utils.serializers import serialize
+from reflex.utils import exceptions, types
from reflex.vars import BaseVar, Var
if TYPE_CHECKING:
@@ -400,6 +399,7 @@ def format_prop(
"""
# import here to avoid circular import.
from reflex.event import EventChain
+ from reflex.utils import serializers
try:
# Handle var props.
@@ -687,6 +687,8 @@ def format_state(value: Any, key: Optional[str] = None) -> Any:
Raises:
TypeError: If the given value is not a valid state.
"""
+ from reflex.utils import serializers
+
# Handle dicts.
if isinstance(value, dict):
return {k: format_state(v, k) for k, v in value.items()}
@@ -700,7 +702,7 @@ def format_state(value: Any, key: Optional[str] = None) -> Any:
return value
# Serialize the value.
- serialized = serialize(value)
+ serialized = serializers.serialize(value)
if serialized is not None:
return serialized
@@ -803,7 +805,9 @@ def json_dumps(obj: Any) -> str:
Returns:
A string
"""
- return json.dumps(obj, ensure_ascii=False, default=serialize)
+ from reflex.utils import serializers
+
+ return json.dumps(obj, ensure_ascii=False, default=serializers.serialize)
def unwrap_vars(value: str) -> str:
diff --git a/reflex/utils/serializers.py b/reflex/utils/serializers.py
index f3f9e635f..aa9b6e484 100644
--- a/reflex/utils/serializers.py
+++ b/reflex/utils/serializers.py
@@ -12,7 +12,7 @@ from typing import Any, Callable, Dict, List, Set, Tuple, Type, Union, get_type_
from reflex.base import Base
from reflex.constants.colors import Color, format_color
-from reflex.utils import exceptions, format, types
+from reflex.utils import exceptions, types
# Mapping from type to a serializer.
# The serializer should convert the type to a JSON object.
@@ -154,6 +154,8 @@ def serialize_primitive(value: Union[bool, int, float, None]) -> str:
Returns:
The serialized number/bool/None.
"""
+ from reflex.utils import format
+
return format.json_dumps(value)
@@ -180,6 +182,8 @@ def serialize_list(value: Union[List, Tuple, Set]) -> str:
Returns:
The serialized list.
"""
+ from reflex.utils import format
+
# Dump the list to a string.
fprop = format.json_dumps(list(value))
@@ -202,6 +206,7 @@ def serialize_dict(prop: Dict[str, Any]) -> str:
"""
# Import here to avoid circular imports.
from reflex.event import EventHandler
+ from reflex.utils import format
prop_dict = {}
diff --git a/reflex/utils/types.py b/reflex/utils/types.py
index 6dd120e3d..e26904385 100644
--- a/reflex/utils/types.py
+++ b/reflex/utils/types.py
@@ -42,7 +42,7 @@ from sqlalchemy.orm import (
from reflex import constants
from reflex.base import Base
-from reflex.utils import console, serializers
+from reflex.utils import console
if sys.version_info >= (3, 12):
from typing import override
@@ -392,6 +392,8 @@ def is_valid_var_type(type_: Type) -> bool:
Returns:
Whether the type is a valid prop type.
"""
+ from reflex.utils import serializers
+
if is_union(type_):
return all((is_valid_var_type(arg) for arg in get_args(type_)))
return _issubclass(type_, StateVar) or serializers.has_serializer(type_)
diff --git a/reflex/vars.py b/reflex/vars.py
index cf6f2eed6..cad3d735b 100644
--- a/reflex/vars.py
+++ b/reflex/vars.py
@@ -35,7 +35,7 @@ from typing import (
from reflex import constants
from reflex.base import Base
-from reflex.utils import console, format, imports, serializers, types
+from reflex.utils import console, imports, serializers, types
from reflex.utils.exceptions import VarAttributeError, VarTypeError, VarValueError
# This module used to export ImportVar itself, so we still import it for export here
@@ -364,6 +364,8 @@ class Var:
Raises:
VarTypeError: If the value is JSON-unserializable.
"""
+ from reflex.utils import format
+
# Check for none values.
if value is None:
return None
@@ -543,6 +545,8 @@ class Var:
Returns:
The wrapped var, i.e. {state.var}.
"""
+ from reflex.utils import format
+
out = (
self._var_full_name
if self._var_is_local
@@ -600,6 +604,8 @@ class Var:
Raises:
VarTypeError: If the var is not indexable.
"""
+ from reflex.utils import format
+
# Indexing is only supported for strings, lists, tuples, dicts, and dataframes.
if not (
types._issubclass(self._var_type, Union[List, Dict, Tuple, str])
@@ -793,6 +799,8 @@ class Var:
VarTypeError: If the operation between two operands is invalid.
VarValueError: If flip is set to true and value of operand is not provided
"""
+ from reflex.utils import format
+
if isinstance(other, str):
other = Var.create(json.dumps(other))
else:
@@ -1671,6 +1679,8 @@ class Var:
Returns:
The full name of the var.
"""
+ from reflex.utils import format
+
if not self._var_full_name_needs_state_prefix:
return self._var_name
return (
@@ -1690,6 +1700,8 @@ class Var:
Returns:
The var with the set state.
"""
+ from reflex.utils import format
+
state_name = state if isinstance(state, str) else state.get_full_name()
new_var_data = VarData(
state=state_name,