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