reflex 0.6.0__py3-none-any.whl → 0.6.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

Files changed (253) hide show
  1. reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +2 -2
  2. reflex/.templates/jinja/web/pages/_app.js.jinja2 +1 -1
  3. reflex/.templates/jinja/web/pages/utils.js.jinja2 +2 -2
  4. reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +36 -0
  5. reflex/.templates/web/utils/state.js +1 -3
  6. reflex/__init__.py +2 -8
  7. reflex/__init__.pyi +1 -2
  8. reflex/app.py +2 -4
  9. reflex/app_module_for_backend.py +1 -1
  10. reflex/base.py +1 -1
  11. reflex/compiler/compiler.py +2 -2
  12. reflex/compiler/utils.py +3 -3
  13. reflex/components/base/app_wrap.py +2 -2
  14. reflex/components/base/app_wrap.pyi +27 -17
  15. reflex/components/base/bare.py +5 -4
  16. reflex/components/base/body.pyi +27 -17
  17. reflex/components/base/document.pyi +131 -81
  18. reflex/components/base/error_boundary.py +7 -6
  19. reflex/components/base/error_boundary.pyi +33 -20
  20. reflex/components/base/fragment.pyi +27 -17
  21. reflex/components/base/head.pyi +53 -33
  22. reflex/components/base/link.py +1 -1
  23. reflex/components/base/link.pyi +54 -33
  24. reflex/components/base/meta.pyi +105 -65
  25. reflex/components/base/script.py +2 -1
  26. reflex/components/base/script.pyi +38 -21
  27. reflex/components/component.py +47 -53
  28. reflex/components/core/banner.py +27 -23
  29. reflex/components/core/banner.pyi +171 -134
  30. reflex/components/core/client_side_routing.py +3 -2
  31. reflex/components/core/client_side_routing.pyi +54 -33
  32. reflex/components/core/clipboard.py +1 -2
  33. reflex/components/core/clipboard.pyi +33 -20
  34. reflex/components/core/cond.py +5 -5
  35. reflex/components/core/debounce.py +5 -5
  36. reflex/components/core/debounce.pyi +33 -20
  37. reflex/components/core/foreach.py +4 -3
  38. reflex/components/core/html.py +1 -1
  39. reflex/components/core/html.pyi +46 -35
  40. reflex/components/core/match.py +17 -17
  41. reflex/components/core/upload.py +23 -17
  42. reflex/components/core/upload.pyi +124 -78
  43. reflex/components/datadisplay/code.py +10 -9
  44. reflex/components/datadisplay/code.pyi +409 -299
  45. reflex/components/datadisplay/dataeditor.py +10 -8
  46. reflex/components/datadisplay/dataeditor.pyi +53 -40
  47. reflex/components/el/element.pyi +27 -17
  48. reflex/components/el/elements/base.py +1 -1
  49. reflex/components/el/elements/base.pyi +45 -34
  50. reflex/components/el/elements/forms.py +16 -16
  51. reflex/components/el/elements/forms.pyi +707 -554
  52. reflex/components/el/elements/inline.py +1 -1
  53. reflex/components/el/elements/inline.pyi +1218 -937
  54. reflex/components/el/elements/media.py +1 -1
  55. reflex/components/el/elements/media.pyi +997 -786
  56. reflex/components/el/elements/metadata.py +6 -3
  57. reflex/components/el/elements/metadata.pyi +242 -181
  58. reflex/components/el/elements/other.py +1 -1
  59. reflex/components/el/elements/other.pyi +306 -235
  60. reflex/components/el/elements/scripts.py +1 -1
  61. reflex/components/el/elements/scripts.pyi +140 -109
  62. reflex/components/el/elements/sectioning.py +2 -0
  63. reflex/components/el/elements/sectioning.pyi +647 -496
  64. reflex/components/el/elements/tables.py +1 -1
  65. reflex/components/el/elements/tables.pyi +452 -351
  66. reflex/components/el/elements/typography.py +1 -1
  67. reflex/components/el/elements/typography.pyi +657 -506
  68. reflex/components/gridjs/datatable.py +9 -6
  69. reflex/components/gridjs/datatable.pyi +56 -35
  70. reflex/components/lucide/icon.py +1 -1
  71. reflex/components/lucide/icon.pyi +54 -33
  72. reflex/components/markdown/markdown.py +31 -26
  73. reflex/components/markdown/markdown.pyi +37 -27
  74. reflex/components/moment/moment.py +12 -13
  75. reflex/components/moment/moment.pyi +35 -23
  76. reflex/components/next/base.pyi +27 -17
  77. reflex/components/next/image.py +1 -1
  78. reflex/components/next/image.pyi +37 -22
  79. reflex/components/next/link.py +1 -1
  80. reflex/components/next/link.pyi +28 -17
  81. reflex/components/next/video.py +1 -1
  82. reflex/components/next/video.pyi +28 -17
  83. reflex/components/plotly/plotly.py +13 -12
  84. reflex/components/plotly/plotly.pyi +54 -39
  85. reflex/components/props.py +1 -1
  86. reflex/components/radix/__init__.pyi +0 -1
  87. reflex/components/radix/primitives/__init__.pyi +0 -1
  88. reflex/components/radix/primitives/accordion.py +4 -4
  89. reflex/components/radix/primitives/accordion.pyi +495 -424
  90. reflex/components/radix/primitives/base.py +1 -1
  91. reflex/components/radix/primitives/base.pyi +54 -33
  92. reflex/components/radix/primitives/drawer.py +1 -1
  93. reflex/components/radix/primitives/drawer.pyi +273 -172
  94. reflex/components/radix/primitives/form.py +1 -1
  95. reflex/components/radix/primitives/form.pyi +364 -257
  96. reflex/components/radix/primitives/progress.py +1 -1
  97. reflex/components/radix/primitives/progress.pyi +282 -231
  98. reflex/components/radix/primitives/slider.py +1 -1
  99. reflex/components/radix/primitives/slider.pyi +138 -87
  100. reflex/components/radix/themes/base.py +24 -3
  101. reflex/components/radix/themes/base.pyi +250 -178
  102. reflex/components/radix/themes/color_mode.py +5 -5
  103. reflex/components/radix/themes/color_mode.pyi +220 -187
  104. reflex/components/radix/themes/components/alert_dialog.py +1 -1
  105. reflex/components/radix/themes/components/alert_dialog.pyi +207 -136
  106. reflex/components/radix/themes/components/aspect_ratio.py +1 -1
  107. reflex/components/radix/themes/components/aspect_ratio.pyi +28 -17
  108. reflex/components/radix/themes/components/avatar.py +1 -1
  109. reflex/components/radix/themes/components/avatar.pyi +81 -70
  110. reflex/components/radix/themes/components/badge.py +1 -1
  111. reflex/components/radix/themes/components/badge.pyi +99 -88
  112. reflex/components/radix/themes/components/button.py +1 -1
  113. reflex/components/radix/themes/components/button.pyi +109 -98
  114. reflex/components/radix/themes/components/callout.py +1 -1
  115. reflex/components/radix/themes/components/callout.pyi +373 -322
  116. reflex/components/radix/themes/components/card.py +1 -1
  117. reflex/components/radix/themes/components/card.pyi +49 -38
  118. reflex/components/radix/themes/components/checkbox.py +2 -1
  119. reflex/components/radix/themes/components/checkbox.pyi +245 -208
  120. reflex/components/radix/themes/components/checkbox_cards.py +1 -1
  121. reflex/components/radix/themes/components/checkbox_cards.pyi +115 -94
  122. reflex/components/radix/themes/components/checkbox_group.py +1 -1
  123. reflex/components/radix/themes/components/checkbox_group.pyi +107 -86
  124. reflex/components/radix/themes/components/context_menu.py +1 -1
  125. reflex/components/radix/themes/components/context_menu.pyi +319 -238
  126. reflex/components/radix/themes/components/data_list.py +1 -1
  127. reflex/components/radix/themes/components/data_list.pyi +171 -130
  128. reflex/components/radix/themes/components/dialog.py +1 -1
  129. reflex/components/radix/themes/components/dialog.pyi +210 -139
  130. reflex/components/radix/themes/components/dropdown_menu.py +1 -1
  131. reflex/components/radix/themes/components/dropdown_menu.pyi +332 -249
  132. reflex/components/radix/themes/components/hover_card.py +1 -1
  133. reflex/components/radix/themes/components/hover_card.pyi +131 -90
  134. reflex/components/radix/themes/components/icon_button.py +3 -2
  135. reflex/components/radix/themes/components/icon_button.pyi +109 -98
  136. reflex/components/radix/themes/components/inset.py +1 -1
  137. reflex/components/radix/themes/components/inset.pyi +58 -47
  138. reflex/components/radix/themes/components/popover.py +1 -1
  139. reflex/components/radix/themes/components/popover.pyi +136 -95
  140. reflex/components/radix/themes/components/progress.py +1 -1
  141. reflex/components/radix/themes/components/progress.pyi +82 -71
  142. reflex/components/radix/themes/components/radio.py +1 -1
  143. reflex/components/radix/themes/components/radio.pyi +80 -69
  144. reflex/components/radix/themes/components/radio_cards.py +1 -1
  145. reflex/components/radix/themes/components/radio_cards.pyi +119 -98
  146. reflex/components/radix/themes/components/radio_group.py +11 -8
  147. reflex/components/radix/themes/components/radio_group.pyi +271 -228
  148. reflex/components/radix/themes/components/scroll_area.py +1 -1
  149. reflex/components/radix/themes/components/scroll_area.pyi +32 -21
  150. reflex/components/radix/themes/components/segmented_control.py +1 -1
  151. reflex/components/radix/themes/components/segmented_control.pyi +113 -90
  152. reflex/components/radix/themes/components/select.py +3 -2
  153. reflex/components/radix/themes/components/select.pyi +471 -374
  154. reflex/components/radix/themes/components/separator.py +2 -1
  155. reflex/components/radix/themes/components/separator.pyi +80 -69
  156. reflex/components/radix/themes/components/skeleton.py +1 -1
  157. reflex/components/radix/themes/components/skeleton.pyi +34 -23
  158. reflex/components/radix/themes/components/slider.py +3 -2
  159. reflex/components/radix/themes/components/slider.pyi +88 -75
  160. reflex/components/radix/themes/components/spinner.py +1 -1
  161. reflex/components/radix/themes/components/spinner.pyi +30 -19
  162. reflex/components/radix/themes/components/switch.py +1 -1
  163. reflex/components/radix/themes/components/switch.pyi +84 -71
  164. reflex/components/radix/themes/components/table.py +1 -1
  165. reflex/components/radix/themes/components/table.pyi +332 -261
  166. reflex/components/radix/themes/components/tabs.py +1 -1
  167. reflex/components/radix/themes/components/tabs.pyi +194 -139
  168. reflex/components/radix/themes/components/text_area.py +1 -1
  169. reflex/components/radix/themes/components/text_area.pyi +111 -96
  170. reflex/components/radix/themes/components/text_field.py +1 -1
  171. reflex/components/radix/themes/components/text_field.pyi +286 -247
  172. reflex/components/radix/themes/components/tooltip.py +1 -1
  173. reflex/components/radix/themes/components/tooltip.pyi +37 -26
  174. reflex/components/radix/themes/layout/__init__.pyi +0 -1
  175. reflex/components/radix/themes/layout/base.py +1 -1
  176. reflex/components/radix/themes/layout/base.pyi +67 -56
  177. reflex/components/radix/themes/layout/box.pyi +45 -34
  178. reflex/components/radix/themes/layout/center.pyi +67 -56
  179. reflex/components/radix/themes/layout/container.py +2 -1
  180. reflex/components/radix/themes/layout/container.pyi +47 -36
  181. reflex/components/radix/themes/layout/flex.py +1 -1
  182. reflex/components/radix/themes/layout/flex.pyi +67 -56
  183. reflex/components/radix/themes/layout/grid.py +1 -1
  184. reflex/components/radix/themes/layout/grid.pyi +75 -64
  185. reflex/components/radix/themes/layout/list.py +6 -5
  186. reflex/components/radix/themes/layout/list.pyi +244 -193
  187. reflex/components/radix/themes/layout/section.py +2 -1
  188. reflex/components/radix/themes/layout/section.pyi +47 -36
  189. reflex/components/radix/themes/layout/spacer.pyi +67 -56
  190. reflex/components/radix/themes/layout/stack.py +1 -1
  191. reflex/components/radix/themes/layout/stack.pyi +159 -128
  192. reflex/components/radix/themes/typography/blockquote.py +1 -1
  193. reflex/components/radix/themes/typography/blockquote.pyi +100 -89
  194. reflex/components/radix/themes/typography/code.py +1 -1
  195. reflex/components/radix/themes/typography/code.pyi +101 -90
  196. reflex/components/radix/themes/typography/heading.py +1 -1
  197. reflex/components/radix/themes/typography/heading.pyi +107 -96
  198. reflex/components/radix/themes/typography/link.py +1 -1
  199. reflex/components/radix/themes/typography/link.pyi +113 -102
  200. reflex/components/radix/themes/typography/text.py +1 -1
  201. reflex/components/radix/themes/typography/text.pyi +572 -501
  202. reflex/components/react_player/audio.pyi +60 -33
  203. reflex/components/react_player/react_player.py +1 -1
  204. reflex/components/react_player/react_player.pyi +60 -33
  205. reflex/components/react_player/video.pyi +60 -33
  206. reflex/components/recharts/cartesian.py +3 -2
  207. reflex/components/recharts/cartesian.pyi +861 -678
  208. reflex/components/recharts/charts.py +5 -4
  209. reflex/components/recharts/charts.pyi +357 -252
  210. reflex/components/recharts/general.py +2 -1
  211. reflex/components/recharts/general.pyi +231 -180
  212. reflex/components/recharts/polar.py +5 -4
  213. reflex/components/recharts/polar.pyi +181 -144
  214. reflex/components/recharts/recharts.pyi +53 -33
  215. reflex/components/sonner/toast.py +17 -16
  216. reflex/components/sonner/toast.pyi +47 -36
  217. reflex/components/suneditor/editor.py +3 -2
  218. reflex/components/suneditor/editor.pyi +78 -55
  219. reflex/components/tags/cond_tag.py +4 -6
  220. reflex/components/tags/iter_tag.py +16 -28
  221. reflex/components/tags/match_tag.py +4 -6
  222. reflex/components/tags/tag.py +23 -40
  223. reflex/custom_components/custom_components.py +1 -3
  224. reflex/event.py +65 -113
  225. reflex/experimental/client_state.py +24 -25
  226. reflex/experimental/hooks.py +16 -16
  227. reflex/experimental/layout.py +5 -5
  228. reflex/experimental/layout.pyi +187 -136
  229. reflex/{vars → ivars}/__init__.py +2 -6
  230. reflex/{vars → ivars}/base.py +216 -599
  231. reflex/{vars → ivars}/function.py +19 -15
  232. reflex/{vars → ivars}/number.py +20 -41
  233. reflex/{vars → ivars}/object.py +30 -28
  234. reflex/{vars → ivars}/sequence.py +50 -53
  235. reflex/middleware/hydrate_middleware.py +0 -2
  236. reflex/middleware/middleware.py +3 -3
  237. reflex/state.py +82 -148
  238. reflex/style.py +22 -21
  239. reflex/utils/exceptions.py +0 -20
  240. reflex/utils/format.py +34 -54
  241. reflex/utils/imports.py +73 -16
  242. reflex/utils/prerequisites.py +15 -35
  243. reflex/utils/pyi_generator.py +8 -13
  244. reflex/utils/serializers.py +22 -12
  245. reflex/utils/telemetry.py +2 -3
  246. reflex/utils/types.py +5 -10
  247. reflex/vars.py +501 -0
  248. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/METADATA +5 -4
  249. reflex-0.6.0a1.dist-info/RECORD +384 -0
  250. reflex-0.6.0.dist-info/RECORD +0 -382
  251. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/LICENSE +0 -0
  252. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/WHEEL +0 -0
  253. {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/entry_points.txt +0 -0
@@ -7,8 +7,9 @@ from typing import Any, Callable, Dict, Literal, Optional, Union, overload
7
7
 
8
8
  from reflex.components.component import Component
9
9
  from reflex.event import EventHandler, EventSpec
10
+ from reflex.ivars.base import ImmutableVar
10
11
  from reflex.style import Style
11
- from reflex.vars.base import Var
12
+ from reflex.vars import Var
12
13
 
13
14
  class Script(Component):
14
15
  @overload
@@ -19,8 +20,8 @@ class Script(Component):
19
20
  src: Optional[Union[Var[str], str]] = None,
20
21
  strategy: Optional[
21
22
  Union[
22
- Literal["afterInteractive", "beforeInteractive", "lazyOnload"],
23
23
  Var[Literal["afterInteractive", "beforeInteractive", "lazyOnload"]],
24
+ Literal["afterInteractive", "beforeInteractive", "lazyOnload"],
24
25
  ]
25
26
  ] = None,
26
27
  style: Optional[Style] = None,
@@ -28,44 +29,60 @@ class Script(Component):
28
29
  id: Optional[Any] = None,
29
30
  class_name: Optional[Any] = None,
30
31
  autofocus: Optional[bool] = None,
31
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
32
- on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
33
- on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
32
+ custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
33
+ on_blur: Optional[
34
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
35
+ ] = None,
36
+ on_click: Optional[
37
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
38
+ ] = None,
34
39
  on_context_menu: Optional[
35
- Union[EventHandler, EventSpec, list, Callable, Var]
40
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
36
41
  ] = None,
37
42
  on_double_click: Optional[
38
- Union[EventHandler, EventSpec, list, Callable, Var]
43
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
44
+ ] = None,
45
+ on_error: Optional[
46
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
47
+ ] = None,
48
+ on_focus: Optional[
49
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
50
+ ] = None,
51
+ on_load: Optional[
52
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
53
+ ] = None,
54
+ on_mount: Optional[
55
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
39
56
  ] = None,
40
- on_error: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
41
- on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
42
- on_load: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
43
- on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
44
57
  on_mouse_down: Optional[
45
- Union[EventHandler, EventSpec, list, Callable, Var]
58
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
46
59
  ] = None,
47
60
  on_mouse_enter: Optional[
48
- Union[EventHandler, EventSpec, list, Callable, Var]
61
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
49
62
  ] = None,
50
63
  on_mouse_leave: Optional[
51
- Union[EventHandler, EventSpec, list, Callable, Var]
64
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
52
65
  ] = None,
53
66
  on_mouse_move: Optional[
54
- Union[EventHandler, EventSpec, list, Callable, Var]
67
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
55
68
  ] = None,
56
69
  on_mouse_out: Optional[
57
- Union[EventHandler, EventSpec, list, Callable, Var]
70
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
58
71
  ] = None,
59
72
  on_mouse_over: Optional[
60
- Union[EventHandler, EventSpec, list, Callable, Var]
73
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
61
74
  ] = None,
62
75
  on_mouse_up: Optional[
63
- Union[EventHandler, EventSpec, list, Callable, Var]
76
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
77
+ ] = None,
78
+ on_ready: Optional[
79
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
80
+ ] = None,
81
+ on_scroll: Optional[
82
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
64
83
  ] = None,
65
- on_ready: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
66
- on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
67
84
  on_unmount: Optional[
68
- Union[EventHandler, EventSpec, list, Callable, Var]
85
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
69
86
  ] = None,
70
87
  **props,
71
88
  ) -> "Script":
@@ -43,6 +43,7 @@ from reflex.event import (
43
43
  call_event_handler,
44
44
  get_handler_args,
45
45
  )
46
+ from reflex.ivars.base import ImmutableVar, LiteralVar
46
47
  from reflex.style import Style, format_as_emotion
47
48
  from reflex.utils import format, imports, types
48
49
  from reflex.utils.imports import (
@@ -53,8 +54,7 @@ from reflex.utils.imports import (
53
54
  parse_imports,
54
55
  )
55
56
  from reflex.utils.serializers import serializer
56
- from reflex.vars import VarData
57
- from reflex.vars.base import LiteralVar, Var
57
+ from reflex.vars import Var, VarData
58
58
 
59
59
 
60
60
  class BaseComponent(Base, ABC):
@@ -177,7 +177,7 @@ class Component(BaseComponent, ABC):
177
177
  style: Style = Style()
178
178
 
179
179
  # A mapping from event triggers to event chains.
180
- event_triggers: Dict[str, Union[EventChain, Var]] = {}
180
+ event_triggers: Dict[str, Union[EventChain, ImmutableVar]] = {}
181
181
 
182
182
  # The alias for the tag.
183
183
  alias: Optional[str] = None
@@ -195,7 +195,7 @@ class Component(BaseComponent, ABC):
195
195
  class_name: Any = None
196
196
 
197
197
  # Special component props.
198
- special_props: List[Var] = []
198
+ special_props: Set[ImmutableVar] = set()
199
199
 
200
200
  # Whether the component should take the focus once the page is loaded
201
201
  autofocus: bool = False
@@ -213,7 +213,7 @@ class Component(BaseComponent, ABC):
213
213
  _rename_props: Dict[str, str] = {}
214
214
 
215
215
  # custom attribute
216
- custom_attrs: Dict[str, Union[Var, str]] = {}
216
+ custom_attrs: Dict[str, Union[ImmutableVar, str]] = {}
217
217
 
218
218
  # When to memoize this component and its children.
219
219
  _memoization_mode: MemoizationMode = MemoizationMode()
@@ -249,7 +249,7 @@ class Component(BaseComponent, ABC):
249
249
  """
250
250
  return {}
251
251
 
252
- def add_hooks(self) -> list[str | Var]:
252
+ def add_hooks(self) -> list[str | ImmutableVar]:
253
253
  """Add hooks inside the component function.
254
254
 
255
255
  Hooks are pieces of literal Javascript code that is inserted inside the
@@ -404,7 +404,7 @@ class Component(BaseComponent, ABC):
404
404
  passed_types = None
405
405
  try:
406
406
  # Try to create a var from the value.
407
- if isinstance(value, Var):
407
+ if isinstance(value, ImmutableVar):
408
408
  kwargs[key] = value
409
409
  else:
410
410
  kwargs[key] = LiteralVar.create(value)
@@ -447,17 +447,11 @@ class Component(BaseComponent, ABC):
447
447
  not passed_types
448
448
  and not types._issubclass(passed_type, expected_type, value)
449
449
  ):
450
- value_name = value._js_expr if isinstance(value, Var) else value
451
-
452
- additional_info = (
453
- " You can call `.bool()` on the value to convert it to a boolean."
454
- if expected_type is bool and isinstance(value, Var)
455
- else ""
450
+ value_name = (
451
+ value._var_name if isinstance(value, ImmutableVar) else value
456
452
  )
457
-
458
453
  raise TypeError(
459
- f"Invalid var passed for prop {type(self).__name__}.{key}, expected type {expected_type}, got value {value_name} of type {passed_type}."
460
- + additional_info
454
+ f"Invalid var passed for prop {type(self).__name__}.{key}, expected type {expected_type}, got value {value_name} of type {passed_types or passed_type}."
461
455
  )
462
456
  # Check if the key is an event trigger.
463
457
  if key in component_specific_triggers:
@@ -505,13 +499,9 @@ class Component(BaseComponent, ABC):
505
499
  self,
506
500
  args_spec: Any,
507
501
  value: Union[
508
- Var,
509
- EventHandler,
510
- EventSpec,
511
- List[Union[EventHandler, EventSpec]],
512
- Callable,
502
+ Var, EventHandler, EventSpec, List[Union[EventHandler, EventSpec]], Callable
513
503
  ],
514
- ) -> Union[EventChain, Var]:
504
+ ) -> Union[EventChain, ImmutableVar]:
515
505
  """Create an event chain from a variety of input types.
516
506
 
517
507
  Args:
@@ -525,7 +515,7 @@ class Component(BaseComponent, ABC):
525
515
  ValueError: If the value is not a valid event chain.
526
516
  """
527
517
  # If it's an event chain var, return it.
528
- if isinstance(value, Var):
518
+ if isinstance(value, ImmutableVar):
529
519
  if value._var_type is not EventChain:
530
520
  raise ValueError(
531
521
  f"Invalid event chain: {repr(value)} of type {type(value)}"
@@ -549,7 +539,7 @@ class Component(BaseComponent, ABC):
549
539
  elif isinstance(v, Callable):
550
540
  # Call the lambda to get the event chain.
551
541
  result = call_event_fn(v, args_spec)
552
- if isinstance(result, Var):
542
+ if isinstance(result, ImmutableVar):
553
543
  raise ValueError(
554
544
  f"Invalid event chain: {v}. Cannot use a Var-returning "
555
545
  "lambda inside an EventChain list."
@@ -561,7 +551,7 @@ class Component(BaseComponent, ABC):
561
551
  # If the input is a callable, create an event chain.
562
552
  elif isinstance(value, Callable):
563
553
  result = call_event_fn(value, args_spec)
564
- if isinstance(result, Var):
554
+ if isinstance(result, ImmutableVar):
565
555
  # Recursively call this function if the lambda returned an EventChain Var.
566
556
  return self._create_event_chain(args_spec, result)
567
557
  events = result
@@ -579,7 +569,7 @@ class Component(BaseComponent, ABC):
579
569
  event_actions.update(e.event_actions)
580
570
 
581
571
  # Return the event chain.
582
- if isinstance(args_spec, Var):
572
+ if isinstance(args_spec, ImmutableVar):
583
573
  return EventChain(
584
574
  events=events,
585
575
  args_spec=None,
@@ -665,7 +655,7 @@ class Component(BaseComponent, ABC):
665
655
  """
666
656
  # Create the base tag.
667
657
  tag = Tag(
668
- name=(self.tag if not self.alias else self.alias) or "",
658
+ name=self.tag if not self.alias else self.alias,
669
659
  special_props=self.special_props,
670
660
  )
671
661
 
@@ -679,7 +669,7 @@ class Component(BaseComponent, ABC):
679
669
  # Add ref to element if `id` is not None.
680
670
  ref = self.get_ref()
681
671
  if ref is not None:
682
- props["ref"] = Var(_js_expr=ref)
672
+ props["ref"] = ImmutableVar.create(ref)
683
673
  else:
684
674
  props = props.copy()
685
675
 
@@ -892,7 +882,7 @@ class Component(BaseComponent, ABC):
892
882
  Returns:
893
883
  The dictionary of the component style as value and the style notation as key.
894
884
  """
895
- if isinstance(self.style, Var):
885
+ if isinstance(self.style, ImmutableVar):
896
886
  return {"css": self.style}
897
887
  emotion_style = format_as_emotion(self.style)
898
888
  return (
@@ -1008,8 +998,8 @@ class Component(BaseComponent, ABC):
1008
998
 
1009
999
  @staticmethod
1010
1000
  def _get_vars_from_event_triggers(
1011
- event_triggers: dict[str, EventChain | Var],
1012
- ) -> Iterator[tuple[str, list[Var]]]:
1001
+ event_triggers: dict[str, EventChain | ImmutableVar],
1002
+ ) -> Iterator[tuple[str, list[ImmutableVar]]]:
1013
1003
  """Get the Vars associated with each event trigger.
1014
1004
 
1015
1005
  Args:
@@ -1019,7 +1009,7 @@ class Component(BaseComponent, ABC):
1019
1009
  tuple of (event_name, event_vars)
1020
1010
  """
1021
1011
  for event_trigger, event in event_triggers.items():
1022
- if isinstance(event, Var):
1012
+ if isinstance(event, ImmutableVar):
1023
1013
  yield event_trigger, [event]
1024
1014
  elif isinstance(event, EventChain):
1025
1015
  event_args = []
@@ -1028,7 +1018,7 @@ class Component(BaseComponent, ABC):
1028
1018
  event_args.extend(args)
1029
1019
  yield event_trigger, event_args
1030
1020
 
1031
- def _get_vars(self, include_children: bool = False) -> list[Var]:
1021
+ def _get_vars(self, include_children: bool = False) -> list[ImmutableVar]:
1032
1022
  """Walk all Vars used in this component.
1033
1023
 
1034
1024
  Args:
@@ -1048,14 +1038,18 @@ class Component(BaseComponent, ABC):
1048
1038
  # Get Vars associated with component props.
1049
1039
  for prop in self.get_props():
1050
1040
  prop_var = getattr(self, prop)
1051
- if isinstance(prop_var, Var):
1041
+ if isinstance(prop_var, ImmutableVar):
1052
1042
  vars.append(prop_var)
1053
1043
 
1054
1044
  # Style keeps track of its own VarData instance, so embed in a temp Var that is yielded.
1055
- if isinstance(self.style, dict) and self.style or isinstance(self.style, Var):
1045
+ if (
1046
+ isinstance(self.style, dict)
1047
+ and self.style
1048
+ or isinstance(self.style, ImmutableVar)
1049
+ ):
1056
1050
  vars.append(
1057
- Var(
1058
- _js_expr="style",
1051
+ ImmutableVar(
1052
+ _var_name="style",
1059
1053
  _var_type=str,
1060
1054
  _var_data=VarData.merge(self.style._var_data),
1061
1055
  )
@@ -1072,7 +1066,7 @@ class Component(BaseComponent, ABC):
1072
1066
  self.autofocus,
1073
1067
  *self.custom_attrs.values(),
1074
1068
  ):
1075
- if isinstance(comp_prop, Var):
1069
+ if isinstance(comp_prop, ImmutableVar):
1076
1070
  vars.append(comp_prop)
1077
1071
  elif isinstance(comp_prop, str):
1078
1072
  # Collapse VarData encoded in f-strings.
@@ -1101,7 +1095,7 @@ class Component(BaseComponent, ABC):
1101
1095
  for event in trigger.events:
1102
1096
  if event.handler.state_full_name:
1103
1097
  return True
1104
- elif isinstance(trigger, Var) and trigger._var_state:
1098
+ elif isinstance(trigger, ImmutableVar) and trigger._var_state:
1105
1099
  return True
1106
1100
  return False
1107
1101
 
@@ -1293,7 +1287,7 @@ class Component(BaseComponent, ABC):
1293
1287
  user_hooks = self._get_hooks()
1294
1288
  user_hooks_data = (
1295
1289
  VarData.merge(user_hooks._get_all_var_data())
1296
- if user_hooks is not None and isinstance(user_hooks, Var)
1290
+ if user_hooks is not None and isinstance(user_hooks, ImmutableVar)
1297
1291
  else None
1298
1292
  )
1299
1293
  if user_hooks_data is not None:
@@ -1396,7 +1390,7 @@ class Component(BaseComponent, ABC):
1396
1390
  """
1397
1391
  ref = self.get_ref()
1398
1392
  if ref is not None:
1399
- return f"const {ref} = useRef(null); {str(Var(_js_expr=ref).as_ref())} = {ref};"
1393
+ return f"const {ref} = useRef(null); {str(ImmutableVar.create_safe(ref).as_ref())} = {ref};"
1400
1394
 
1401
1395
  def _get_vars_hooks(self) -> dict[str, None]:
1402
1396
  """Get the hooks required by vars referenced in this component.
@@ -1459,7 +1453,7 @@ class Component(BaseComponent, ABC):
1459
1453
  """
1460
1454
  code = {}
1461
1455
 
1462
- def extract_var_hooks(hook: Var):
1456
+ def extract_var_hooks(hook: ImmutableVar):
1463
1457
  _imports = {}
1464
1458
  var_data = VarData.merge(hook._get_all_var_data())
1465
1459
  if var_data is not None:
@@ -1476,7 +1470,7 @@ class Component(BaseComponent, ABC):
1476
1470
  # the order of the hooks in the final output)
1477
1471
  for clz in reversed(tuple(self._iter_parent_classes_with_method("add_hooks"))):
1478
1472
  for hook in clz.add_hooks(self):
1479
- if isinstance(hook, Var):
1473
+ if isinstance(hook, ImmutableVar):
1480
1474
  extract_var_hooks(hook)
1481
1475
  else:
1482
1476
  code[hook] = {}
@@ -1537,7 +1531,7 @@ class Component(BaseComponent, ABC):
1537
1531
  The ref name.
1538
1532
  """
1539
1533
  # do not create a ref if the id is dynamic or unspecified
1540
- if self.id is None or isinstance(self.id, Var):
1534
+ if self.id is None or isinstance(self.id, ImmutableVar):
1541
1535
  return None
1542
1536
  return format.format_ref(self.id)
1543
1537
 
@@ -1776,15 +1770,15 @@ class CustomComponent(Component):
1776
1770
  """
1777
1771
  return super()._render(props=self.props)
1778
1772
 
1779
- def get_prop_vars(self) -> List[Var]:
1773
+ def get_prop_vars(self) -> List[ImmutableVar]:
1780
1774
  """Get the prop vars.
1781
1775
 
1782
1776
  Returns:
1783
1777
  The prop vars.
1784
1778
  """
1785
1779
  return [
1786
- Var(
1787
- _js_expr=name,
1780
+ ImmutableVar(
1781
+ _var_name=name,
1788
1782
  _var_type=(
1789
1783
  prop._var_type if types._isinstance(prop, Var) else type(prop)
1790
1784
  ),
@@ -1792,7 +1786,7 @@ class CustomComponent(Component):
1792
1786
  for name, prop in self.props.items()
1793
1787
  ]
1794
1788
 
1795
- def _get_vars(self, include_children: bool = False) -> list[Var]:
1789
+ def _get_vars(self, include_children: bool = False) -> list[ImmutableVar]:
1796
1790
  """Walk all Vars used in this component.
1797
1791
 
1798
1792
  Args:
@@ -1803,7 +1797,7 @@ class CustomComponent(Component):
1803
1797
  """
1804
1798
  return (
1805
1799
  super()._get_vars(include_children=include_children)
1806
- + [prop for prop in self.props.values() if isinstance(prop, Var)]
1800
+ + [prop for prop in self.props.values() if isinstance(prop, ImmutableVar)]
1807
1801
  + self.get_component(self)._get_vars(include_children=include_children)
1808
1802
  )
1809
1803
 
@@ -1974,7 +1968,7 @@ class StatefulComponent(BaseComponent):
1974
1968
  should_memoize = True
1975
1969
  break
1976
1970
  child = cls._child_var(child)
1977
- if isinstance(child, Var) and child._get_all_var_data():
1971
+ if isinstance(child, ImmutableVar) and child._get_all_var_data():
1978
1972
  should_memoize = True
1979
1973
  break
1980
1974
 
@@ -2130,7 +2124,7 @@ class StatefulComponent(BaseComponent):
2130
2124
  def _get_memoized_event_triggers(
2131
2125
  cls,
2132
2126
  component: Component,
2133
- ) -> dict[str, tuple[Var, str]]:
2127
+ ) -> dict[str, tuple[ImmutableVar, str]]:
2134
2128
  """Memoize event handler functions with useCallback to avoid unnecessary re-renders.
2135
2129
 
2136
2130
  Args:
@@ -2177,7 +2171,7 @@ class StatefulComponent(BaseComponent):
2177
2171
 
2178
2172
  # Store the memoized function name and hook code for this event trigger.
2179
2173
  trigger_memo[event_trigger] = (
2180
- Var(_js_expr=memo_name)._replace(
2174
+ ImmutableVar.create_safe(memo_name)._replace(
2181
2175
  _var_type=EventChain, merge_var_data=memo_var_data
2182
2176
  ),
2183
2177
  f"const {memo_name} = useCallback({rendered_chain}, [{', '.join(var_deps)}])",
@@ -2250,7 +2244,7 @@ class StatefulComponent(BaseComponent):
2250
2244
  Returns:
2251
2245
  The tag to render.
2252
2246
  """
2253
- return dict(Tag(name=self.tag or ""))
2247
+ return dict(Tag(name=self.tag))
2254
2248
 
2255
2249
  def __str__(self) -> str:
2256
2250
  """Represent the component in React.
@@ -18,52 +18,56 @@ from reflex.components.radix.themes.typography.text import Text
18
18
  from reflex.components.sonner.toast import Toaster, ToastProps
19
19
  from reflex.constants import Dirs, Hooks, Imports
20
20
  from reflex.constants.compiler import CompileVars
21
+ from reflex.ivars.base import ImmutableVar, LiteralVar
22
+ from reflex.ivars.function import FunctionStringVar
23
+ from reflex.ivars.number import BooleanVar
24
+ from reflex.ivars.sequence import LiteralArrayVar
21
25
  from reflex.utils.imports import ImportVar
22
- from reflex.vars import VarData
23
- from reflex.vars.base import LiteralVar, Var
24
- from reflex.vars.function import FunctionStringVar
25
- from reflex.vars.number import BooleanVar
26
- from reflex.vars.sequence import LiteralArrayVar
26
+ from reflex.vars import Var, VarData
27
27
 
28
28
  connect_error_var_data: VarData = VarData( # type: ignore
29
29
  imports=Imports.EVENTS,
30
30
  hooks={Hooks.EVENTS: None},
31
31
  )
32
32
 
33
- connect_errors = Var(
34
- _js_expr=CompileVars.CONNECT_ERROR, _var_data=connect_error_var_data
33
+ connect_errors: Var = ImmutableVar.create_safe(
34
+ value=CompileVars.CONNECT_ERROR,
35
+ _var_data=connect_error_var_data,
35
36
  )
36
37
 
37
- connection_error = Var(
38
- _js_expr="((connectErrors.length > 0) ? connectErrors[connectErrors.length - 1].message : '')",
38
+ connection_error: Var = ImmutableVar.create_safe(
39
+ value="((connectErrors.length > 0) ? connectErrors[connectErrors.length - 1].message : '')",
39
40
  _var_data=connect_error_var_data,
40
41
  )
41
42
 
42
- connection_errors_count = Var(
43
- _js_expr="connectErrors.length", _var_data=connect_error_var_data
43
+ connection_errors_count: Var = ImmutableVar.create_safe(
44
+ value="connectErrors.length",
45
+ _var_data=connect_error_var_data,
44
46
  )
45
47
 
46
- has_connection_errors = Var(
47
- _js_expr="(connectErrors.length > 0)", _var_data=connect_error_var_data
48
+ has_connection_errors: Var = ImmutableVar.create_safe(
49
+ value="(connectErrors.length > 0)",
50
+ _var_data=connect_error_var_data,
48
51
  ).to(BooleanVar)
49
52
 
50
- has_too_many_connection_errors = Var(
51
- _js_expr="(connectErrors.length >= 2)", _var_data=connect_error_var_data
53
+ has_too_many_connection_errors: Var = ImmutableVar.create_safe(
54
+ value="(connectErrors.length >= 2)",
55
+ _var_data=connect_error_var_data,
52
56
  ).to(BooleanVar)
53
57
 
54
58
 
55
- class WebsocketTargetURL(Var):
59
+ class WebsocketTargetURL(ImmutableVar):
56
60
  """A component that renders the websocket target URL."""
57
61
 
58
62
  @classmethod
59
- def create(cls) -> Var:
63
+ def create(cls) -> ImmutableVar:
60
64
  """Create a websocket target URL component.
61
65
 
62
66
  Returns:
63
67
  The websocket target URL component.
64
68
  """
65
- return Var(
66
- _js_expr="getBackendURL(env.EVENT).href",
69
+ return ImmutableVar(
70
+ _var_name="getBackendURL(env.EVENT).href",
67
71
  _var_data=VarData(
68
72
  imports={
69
73
  "/env.json": [ImportVar(tag="env", is_default=True)],
@@ -91,7 +95,7 @@ def default_connection_error() -> list[str | Var | Component]:
91
95
  class ConnectionToaster(Toaster):
92
96
  """A connection toaster component."""
93
97
 
94
- def add_hooks(self) -> list[str | Var]:
98
+ def add_hooks(self) -> list[str | ImmutableVar]:
95
99
  """Add the hooks for the connection toaster.
96
100
 
97
101
  Returns:
@@ -121,8 +125,8 @@ class ConnectionToaster(Toaster):
121
125
  ),
122
126
  ).call(
123
127
  # TODO: This breaks the assumption that Vars are JS expressions
124
- Var(
125
- _js_expr=f"""
128
+ ImmutableVar.create_safe(
129
+ f"""
126
130
  () => {{
127
131
  if ({str(has_too_many_connection_errors)}) {{
128
132
  if (!userDismissed) {{
@@ -234,7 +238,7 @@ class WifiOffPulse(Icon):
234
238
  Returns:
235
239
  The icon component with default props applied.
236
240
  """
237
- pulse_var = Var(_js_expr="pulse")
241
+ pulse_var = ImmutableVar.create("pulse")
238
242
  return super().create(
239
243
  "wifi_off",
240
244
  color=props.pop("color", "crimson"),