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,9 +7,10 @@ from typing import Any, Callable, Dict, List, Optional, Union, overload
7
7
 
8
8
  from reflex.components.base.fragment import Fragment
9
9
  from reflex.event import EventHandler, EventSpec
10
+ from reflex.ivars.base import ImmutableVar
10
11
  from reflex.style import Style
11
12
  from reflex.utils.imports import ImportVar
12
- from reflex.vars.base import Var
13
+ from reflex.vars import Var
13
14
 
14
15
  class Clipboard(Fragment):
15
16
  @overload
@@ -17,51 +18,63 @@ class Clipboard(Fragment):
17
18
  def create( # type: ignore
18
19
  cls,
19
20
  *children,
20
- targets: Optional[Union[List[str], Var[List[str]]]] = None,
21
+ targets: Optional[Union[Var[List[str]], List[str]]] = None,
21
22
  on_paste_event_actions: Optional[
22
- Union[Dict[str, Union[bool, int]], Var[Dict[str, Union[bool, int]]]]
23
+ Union[Var[Dict[str, Union[bool, int]]], Dict[str, Union[bool, int]]]
23
24
  ] = None,
24
25
  style: Optional[Style] = None,
25
26
  key: Optional[Any] = None,
26
27
  id: Optional[Any] = None,
27
28
  class_name: Optional[Any] = None,
28
29
  autofocus: Optional[bool] = None,
29
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
30
- on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
31
- on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
30
+ custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
31
+ on_blur: Optional[
32
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
33
+ ] = None,
34
+ on_click: Optional[
35
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
36
+ ] = None,
32
37
  on_context_menu: Optional[
33
- Union[EventHandler, EventSpec, list, Callable, Var]
38
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
34
39
  ] = None,
35
40
  on_double_click: Optional[
36
- Union[EventHandler, EventSpec, list, Callable, Var]
41
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
42
+ ] = None,
43
+ on_focus: Optional[
44
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
45
+ ] = None,
46
+ on_mount: Optional[
47
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
37
48
  ] = None,
38
- on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
39
- on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
40
49
  on_mouse_down: Optional[
41
- Union[EventHandler, EventSpec, list, Callable, Var]
50
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
42
51
  ] = None,
43
52
  on_mouse_enter: Optional[
44
- Union[EventHandler, EventSpec, list, Callable, Var]
53
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
45
54
  ] = None,
46
55
  on_mouse_leave: Optional[
47
- Union[EventHandler, EventSpec, list, Callable, Var]
56
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
48
57
  ] = None,
49
58
  on_mouse_move: Optional[
50
- Union[EventHandler, EventSpec, list, Callable, Var]
59
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
51
60
  ] = None,
52
61
  on_mouse_out: Optional[
53
- Union[EventHandler, EventSpec, list, Callable, Var]
62
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
54
63
  ] = None,
55
64
  on_mouse_over: Optional[
56
- Union[EventHandler, EventSpec, list, Callable, Var]
65
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
57
66
  ] = None,
58
67
  on_mouse_up: Optional[
59
- Union[EventHandler, EventSpec, list, Callable, Var]
68
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
69
+ ] = None,
70
+ on_paste: Optional[
71
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
72
+ ] = None,
73
+ on_scroll: Optional[
74
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
60
75
  ] = None,
61
- on_paste: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
62
- on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
63
76
  on_unmount: Optional[
64
- Union[EventHandler, EventSpec, list, Callable, Var]
77
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
65
78
  ] = None,
66
79
  **props,
67
80
  ) -> "Clipboard":
@@ -8,11 +8,11 @@ from reflex.components.base.fragment import Fragment
8
8
  from reflex.components.component import BaseComponent, Component, MemoizationLeaf
9
9
  from reflex.components.tags import CondTag, Tag
10
10
  from reflex.constants import Dirs
11
+ from reflex.ivars.base import ImmutableVar, LiteralVar
12
+ from reflex.ivars.number import ternary_operation
11
13
  from reflex.style import LIGHT_COLOR_MODE, resolved_color_mode
12
14
  from reflex.utils.imports import ImportDict, ImportVar
13
- from reflex.vars import VarData
14
- from reflex.vars.base import LiteralVar, Var
15
- from reflex.vars.number import ternary_operation
15
+ from reflex.vars import Var, VarData
16
16
 
17
17
  _IS_TRUE_IMPORT: ImportDict = {
18
18
  f"/{Dirs.STATE_PATH}": [ImportVar(tag="isTrue")],
@@ -119,10 +119,10 @@ def cond(condition: Any, c1: Component) -> Component: ...
119
119
 
120
120
 
121
121
  @overload
122
- def cond(condition: Any, c1: Any, c2: Any) -> Var: ...
122
+ def cond(condition: Any, c1: Any, c2: Any) -> ImmutableVar: ...
123
123
 
124
124
 
125
- def cond(condition: Any, c1: Any, c2: Any = None) -> Component | Var:
125
+ def cond(condition: Any, c1: Any, c2: Any = None) -> Component | ImmutableVar:
126
126
  """Create a conditional component or Prop.
127
127
 
128
128
  Args:
@@ -7,8 +7,8 @@ from typing import Any, Type, Union
7
7
  from reflex.components.component import Component
8
8
  from reflex.constants import EventTriggers
9
9
  from reflex.event import EventHandler
10
- from reflex.vars import VarData
11
- from reflex.vars.base import Var
10
+ from reflex.ivars.base import ImmutableVar
11
+ from reflex.vars import Var, VarData
12
12
 
13
13
  DEFAULT_DEBOUNCE_TIMEOUT = 300
14
14
 
@@ -107,14 +107,14 @@ class DebounceInput(Component):
107
107
  props[field] = getattr(child, field)
108
108
  child_ref = child.get_ref()
109
109
  if props.get("input_ref") is None and child_ref:
110
- props["input_ref"] = Var(_js_expr=child_ref, _var_type=str)
110
+ props["input_ref"] = ImmutableVar.create_safe(child_ref)
111
111
  props["id"] = child.id
112
112
 
113
113
  # Set the child element to wrap, including any imports/hooks from the child.
114
114
  props.setdefault(
115
115
  "element",
116
- Var(
117
- _js_expr=str(child.alias or child.tag),
116
+ ImmutableVar(
117
+ _var_name=str(child.alias or child.tag),
118
118
  _var_type=Type[Component],
119
119
  _var_data=VarData(
120
120
  imports=child._get_imports(),
@@ -7,8 +7,9 @@ from typing import Any, Callable, Dict, Optional, Type, 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
  DEFAULT_DEBOUNCE_TIMEOUT = 300
14
15
 
@@ -22,50 +23,62 @@ class DebounceInput(Component):
22
23
  debounce_timeout: Optional[Union[Var[int], int]] = None,
23
24
  force_notify_by_enter: Optional[Union[Var[bool], bool]] = None,
24
25
  force_notify_on_blur: Optional[Union[Var[bool], bool]] = None,
25
- value: Optional[Union[Var[Union[float, int, str]], float, int, str]] = None,
26
+ value: Optional[Union[Var[Union[float, int, str]], str, int, float]] = None,
26
27
  input_ref: Optional[Union[Var[str], str]] = None,
27
- element: Optional[Union[Type[Component], Var[Type[Component]]]] = None,
28
+ element: Optional[Union[Var[Type[Component]], Type[Component]]] = None,
28
29
  style: Optional[Style] = None,
29
30
  key: Optional[Any] = None,
30
31
  id: Optional[Any] = None,
31
32
  class_name: Optional[Any] = None,
32
33
  autofocus: Optional[bool] = None,
33
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
34
- on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
35
- on_change: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
36
- on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
34
+ custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
35
+ on_blur: Optional[
36
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
37
+ ] = None,
38
+ on_change: Optional[
39
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
40
+ ] = None,
41
+ on_click: Optional[
42
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
43
+ ] = None,
37
44
  on_context_menu: Optional[
38
- Union[EventHandler, EventSpec, list, Callable, Var]
45
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
39
46
  ] = None,
40
47
  on_double_click: Optional[
41
- Union[EventHandler, EventSpec, list, Callable, Var]
48
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
49
+ ] = None,
50
+ on_focus: Optional[
51
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
52
+ ] = None,
53
+ on_mount: Optional[
54
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
42
55
  ] = None,
43
- on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
44
- on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
45
56
  on_mouse_down: Optional[
46
- Union[EventHandler, EventSpec, list, Callable, Var]
57
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
47
58
  ] = None,
48
59
  on_mouse_enter: Optional[
49
- Union[EventHandler, EventSpec, list, Callable, Var]
60
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
50
61
  ] = None,
51
62
  on_mouse_leave: Optional[
52
- Union[EventHandler, EventSpec, list, Callable, Var]
63
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
53
64
  ] = None,
54
65
  on_mouse_move: Optional[
55
- Union[EventHandler, EventSpec, list, Callable, Var]
66
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
56
67
  ] = None,
57
68
  on_mouse_out: Optional[
58
- Union[EventHandler, EventSpec, list, Callable, Var]
69
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
59
70
  ] = None,
60
71
  on_mouse_over: Optional[
61
- Union[EventHandler, EventSpec, list, Callable, Var]
72
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
62
73
  ] = None,
63
74
  on_mouse_up: Optional[
64
- Union[EventHandler, EventSpec, list, Callable, Var]
75
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
76
+ ] = None,
77
+ on_scroll: Optional[
78
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
65
79
  ] = None,
66
- on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
67
80
  on_unmount: Optional[
68
- Union[EventHandler, EventSpec, list, Callable, Var]
81
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
69
82
  ] = None,
70
83
  **props,
71
84
  ) -> "DebounceInput":
@@ -9,8 +9,9 @@ from reflex.components.base.fragment import Fragment
9
9
  from reflex.components.component import Component
10
10
  from reflex.components.tags import IterTag
11
11
  from reflex.constants import MemoizationMode
12
+ from reflex.ivars.base import ImmutableVar
12
13
  from reflex.state import ComponentState
13
- from reflex.vars.base import LiteralVar, Var
14
+ from reflex.vars import Var
14
15
 
15
16
 
16
17
  class ForeachVarError(TypeError):
@@ -51,7 +52,7 @@ class Foreach(Component):
51
52
  ForeachVarError: If the iterable is of type Any.
52
53
  TypeError: If the render function is a ComponentState.
53
54
  """
54
- iterable = LiteralVar.create(iterable)
55
+ iterable = ImmutableVar.create_safe(iterable)
55
56
  if iterable._var_type == Any:
56
57
  raise ForeachVarError(
57
58
  f"Could not foreach over var `{str(iterable)}` of type Any. "
@@ -129,7 +130,7 @@ class Foreach(Component):
129
130
  iterable_state=str(tag.iterable),
130
131
  arg_name=tag.arg_var_name,
131
132
  arg_index=tag.get_index_var_arg(),
132
- iterable_type=tag.iterable._var_type.mro()[0].__name__,
133
+ iterable_type=tag.iterable.upcast()._var_type.mro()[0].__name__,
133
134
  )
134
135
 
135
136
 
@@ -3,7 +3,7 @@
3
3
  from typing import Dict
4
4
 
5
5
  from reflex.components.el.elements.typography import Div
6
- from reflex.vars.base import Var
6
+ from reflex.vars import Var
7
7
 
8
8
 
9
9
  class Html(Div):
@@ -7,8 +7,9 @@ from typing import Any, Callable, Dict, Optional, Union, overload
7
7
 
8
8
  from reflex.components.el.elements.typography import Div
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 Html(Div):
14
15
  @overload
@@ -17,72 +18,82 @@ class Html(Div):
17
18
  cls,
18
19
  *children,
19
20
  dangerouslySetInnerHTML: Optional[
20
- Union[Dict[str, str], Var[Dict[str, str]]]
21
+ Union[Var[Dict[str, str]], Dict[str, str]]
21
22
  ] = None,
22
- access_key: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
23
+ access_key: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
23
24
  auto_capitalize: Optional[
24
- Union[Var[Union[bool, int, str]], bool, int, str]
25
+ Union[Var[Union[bool, int, str]], str, int, bool]
25
26
  ] = None,
26
27
  content_editable: Optional[
27
- Union[Var[Union[bool, int, str]], bool, int, str]
28
+ Union[Var[Union[bool, int, str]], str, int, bool]
28
29
  ] = None,
29
30
  context_menu: Optional[
30
- Union[Var[Union[bool, int, str]], bool, int, str]
31
+ Union[Var[Union[bool, int, str]], str, int, bool]
31
32
  ] = None,
32
- dir: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
33
- draggable: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
33
+ dir: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
34
+ draggable: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
34
35
  enter_key_hint: Optional[
35
- Union[Var[Union[bool, int, str]], bool, int, str]
36
- ] = None,
37
- hidden: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
38
- input_mode: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
39
- item_prop: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
40
- lang: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
41
- role: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
42
- slot: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
43
- spell_check: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
44
- tab_index: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
45
- title: Optional[Union[Var[Union[bool, int, str]], bool, int, str]] = None,
36
+ Union[Var[Union[bool, int, str]], str, int, bool]
37
+ ] = None,
38
+ hidden: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
39
+ input_mode: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
40
+ item_prop: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
41
+ lang: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
42
+ role: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
43
+ slot: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
44
+ spell_check: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
45
+ tab_index: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
46
+ title: Optional[Union[Var[Union[bool, int, str]], str, int, bool]] = None,
46
47
  style: Optional[Style] = None,
47
48
  key: Optional[Any] = None,
48
49
  id: Optional[Any] = None,
49
50
  class_name: Optional[Any] = None,
50
51
  autofocus: Optional[bool] = None,
51
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
52
- on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
53
- on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
52
+ custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
53
+ on_blur: Optional[
54
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
55
+ ] = None,
56
+ on_click: Optional[
57
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
58
+ ] = None,
54
59
  on_context_menu: Optional[
55
- Union[EventHandler, EventSpec, list, Callable, Var]
60
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
56
61
  ] = None,
57
62
  on_double_click: Optional[
58
- Union[EventHandler, EventSpec, list, Callable, Var]
63
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
64
+ ] = None,
65
+ on_focus: Optional[
66
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
67
+ ] = None,
68
+ on_mount: Optional[
69
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
59
70
  ] = None,
60
- on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
61
- on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
62
71
  on_mouse_down: Optional[
63
- Union[EventHandler, EventSpec, list, Callable, Var]
72
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
64
73
  ] = None,
65
74
  on_mouse_enter: Optional[
66
- Union[EventHandler, EventSpec, list, Callable, Var]
75
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
67
76
  ] = None,
68
77
  on_mouse_leave: Optional[
69
- Union[EventHandler, EventSpec, list, Callable, Var]
78
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
70
79
  ] = None,
71
80
  on_mouse_move: Optional[
72
- Union[EventHandler, EventSpec, list, Callable, Var]
81
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
73
82
  ] = None,
74
83
  on_mouse_out: Optional[
75
- Union[EventHandler, EventSpec, list, Callable, Var]
84
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
76
85
  ] = None,
77
86
  on_mouse_over: Optional[
78
- Union[EventHandler, EventSpec, list, Callable, Var]
87
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
79
88
  ] = None,
80
89
  on_mouse_up: Optional[
81
- Union[EventHandler, EventSpec, list, Callable, Var]
90
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
91
+ ] = None,
92
+ on_scroll: Optional[
93
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
82
94
  ] = None,
83
- on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
84
95
  on_unmount: Optional[
85
- Union[EventHandler, EventSpec, list, Callable, Var]
96
+ Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
86
97
  ] = None,
87
98
  **props,
88
99
  ) -> "Html":
@@ -6,12 +6,12 @@ from typing import Any, Dict, List, Optional, Tuple, Union
6
6
  from reflex.components.base import Fragment
7
7
  from reflex.components.component import BaseComponent, Component, MemoizationLeaf
8
8
  from reflex.components.tags import MatchTag, Tag
9
+ from reflex.ivars.base import ImmutableVar, LiteralVar
9
10
  from reflex.style import Style
10
11
  from reflex.utils import format, types
11
12
  from reflex.utils.exceptions import MatchTypeError
12
13
  from reflex.utils.imports import ImportDict
13
- from reflex.vars import VarData
14
- from reflex.vars.base import LiteralVar, Var
14
+ from reflex.vars import Var, VarData
15
15
 
16
16
 
17
17
  class Match(MemoizationLeaf):
@@ -27,7 +27,7 @@ class Match(MemoizationLeaf):
27
27
  default: Any
28
28
 
29
29
  @classmethod
30
- def create(cls, cond: Any, *cases) -> Union[Component, Var]:
30
+ def create(cls, cond: Any, *cases) -> Union[Component, ImmutableVar]:
31
31
  """Create a Match Component.
32
32
 
33
33
  Args:
@@ -56,7 +56,7 @@ class Match(MemoizationLeaf):
56
56
  )
57
57
 
58
58
  @classmethod
59
- def _create_condition_var(cls, cond: Any) -> Var:
59
+ def _create_condition_var(cls, cond: Any) -> ImmutableVar:
60
60
  """Convert the condition to a Var.
61
61
 
62
62
  Args:
@@ -77,7 +77,7 @@ class Match(MemoizationLeaf):
77
77
  @classmethod
78
78
  def _process_cases(
79
79
  cls, cases: List
80
- ) -> Tuple[List, Optional[Union[Var, BaseComponent]]]:
80
+ ) -> Tuple[List, Optional[Union[ImmutableVar, BaseComponent]]]:
81
81
  """Process the list of match cases and the catchall default case.
82
82
 
83
83
  Args:
@@ -125,7 +125,7 @@ class Match(MemoizationLeaf):
125
125
  return case_element
126
126
 
127
127
  @classmethod
128
- def _process_match_cases(cls, cases: List) -> List[List[Var]]:
128
+ def _process_match_cases(cls, cases: List) -> List[List[ImmutableVar]]:
129
129
  """Process the individual match cases.
130
130
 
131
131
  Args:
@@ -157,7 +157,7 @@ class Match(MemoizationLeaf):
157
157
  if not isinstance(element, BaseComponent)
158
158
  else element
159
159
  )
160
- if not isinstance(el, (Var, BaseComponent)):
160
+ if not isinstance(el, (ImmutableVar, BaseComponent)):
161
161
  raise ValueError("Case element must be a var or component")
162
162
  case_list.append(el)
163
163
 
@@ -166,7 +166,7 @@ class Match(MemoizationLeaf):
166
166
  return match_cases
167
167
 
168
168
  @classmethod
169
- def _validate_return_types(cls, match_cases: List[List[Var]]) -> None:
169
+ def _validate_return_types(cls, match_cases: List[List[ImmutableVar]]) -> None:
170
170
  """Validate that match cases have the same return types.
171
171
 
172
172
  Args:
@@ -180,24 +180,24 @@ class Match(MemoizationLeaf):
180
180
 
181
181
  if types._isinstance(first_case_return, BaseComponent):
182
182
  return_type = BaseComponent
183
- elif types._isinstance(first_case_return, Var):
184
- return_type = Var
183
+ elif types._isinstance(first_case_return, ImmutableVar):
184
+ return_type = ImmutableVar
185
185
 
186
186
  for index, case in enumerate(match_cases):
187
187
  if not types._issubclass(type(case[-1]), return_type):
188
188
  raise MatchTypeError(
189
189
  f"Match cases should have the same return types. Case {index} with return "
190
- f"value `{case[-1]._js_expr if isinstance(case[-1], Var) else textwrap.shorten(str(case[-1]), width=250)}`"
190
+ f"value `{case[-1]._var_name if isinstance(case[-1], ImmutableVar) else textwrap.shorten(str(case[-1]), width=250)}`"
191
191
  f" of type {type(case[-1])!r} is not {return_type}"
192
192
  )
193
193
 
194
194
  @classmethod
195
195
  def _create_match_cond_var_or_component(
196
196
  cls,
197
- match_cond_var: Var,
198
- match_cases: List[List[Var]],
199
- default: Optional[Union[Var, BaseComponent]],
200
- ) -> Union[Component, Var]:
197
+ match_cond_var: ImmutableVar,
198
+ match_cases: List[List[ImmutableVar]],
199
+ default: Optional[Union[ImmutableVar, BaseComponent]],
200
+ ) -> Union[Component, ImmutableVar]:
201
201
  """Create and return the match condition var or component.
202
202
 
203
203
  Args:
@@ -232,8 +232,8 @@ class Match(MemoizationLeaf):
232
232
  ) or not types._isinstance(default, Var):
233
233
  raise ValueError("Return types of match cases should be Vars.")
234
234
 
235
- return Var(
236
- _js_expr=format.format_match(
235
+ return ImmutableVar(
236
+ _var_name=format.format_match(
237
237
  cond=str(match_cond_var),
238
238
  match_cases=match_cases,
239
239
  default=default, # type: ignore
@@ -19,10 +19,10 @@ from reflex.event import (
19
19
  call_script,
20
20
  parse_args_spec,
21
21
  )
22
+ from reflex.ivars.base import ImmutableCallableVar, ImmutableVar, LiteralVar
23
+ from reflex.ivars.sequence import LiteralStringVar
22
24
  from reflex.utils.imports import ImportVar
23
- from reflex.vars import VarData
24
- from reflex.vars.base import CallableVar, LiteralVar, Var
25
- from reflex.vars.sequence import LiteralStringVar
25
+ from reflex.vars import Var, VarData
26
26
 
27
27
  DEFAULT_UPLOAD_ID: str = "default"
28
28
 
@@ -37,8 +37,8 @@ upload_files_context_var_data: VarData = VarData(
37
37
  )
38
38
 
39
39
 
40
- @CallableVar
41
- def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> Var:
40
+ @ImmutableCallableVar
41
+ def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> ImmutableVar:
42
42
  """Get the file upload drop trigger.
43
43
 
44
44
  This var is passed to the dropzone component to update the file list when a
@@ -58,8 +58,8 @@ def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> Var:
58
58
  }})
59
59
  """
60
60
 
61
- return Var(
62
- _js_expr=var_name,
61
+ return ImmutableVar(
62
+ _var_name=var_name,
63
63
  _var_type=EventChain,
64
64
  _var_data=VarData.merge(
65
65
  upload_files_context_var_data, id_var._get_all_var_data()
@@ -67,8 +67,8 @@ def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> Var:
67
67
  )
68
68
 
69
69
 
70
- @CallableVar
71
- def selected_files(id_: str = DEFAULT_UPLOAD_ID) -> Var:
70
+ @ImmutableCallableVar
71
+ def selected_files(id_: str = DEFAULT_UPLOAD_ID) -> ImmutableVar:
72
72
  """Get the list of selected files.
73
73
 
74
74
  Args:
@@ -78,8 +78,8 @@ def selected_files(id_: str = DEFAULT_UPLOAD_ID) -> Var:
78
78
  A var referencing the list of selected file paths.
79
79
  """
80
80
  id_var = LiteralStringVar.create(id_)
81
- return Var(
82
- _js_expr=f"(filesById[{str(id_var)}] ? filesById[{str(id_var)}].map((f) => (f.path || f.name)) : [])",
81
+ return ImmutableVar(
82
+ _var_name=f"(filesById[{str(id_var)}] ? filesById[{str(id_var)}].map((f) => (f.path || f.name)) : [])",
83
83
  _var_type=List[str],
84
84
  _var_data=VarData.merge(
85
85
  upload_files_context_var_data, id_var._get_all_var_data()
@@ -132,8 +132,8 @@ def get_upload_dir() -> Path:
132
132
  return uploaded_files_dir
133
133
 
134
134
 
135
- uploaded_files_url_prefix = Var(
136
- _js_expr="getBackendURL(env.UPLOAD)",
135
+ uploaded_files_url_prefix = ImmutableVar(
136
+ _var_name="getBackendURL(env.UPLOAD)",
137
137
  _var_data=VarData(
138
138
  imports={
139
139
  f"/{Dirs.STATE_PATH}": "getBackendURL",
@@ -247,7 +247,9 @@ class Upload(MemoizationLeaf):
247
247
  }
248
248
  # The file input to use.
249
249
  upload = Input.create(type="file")
250
- upload.special_props = [Var(_js_expr="{...getInputProps()}", _var_type=None)]
250
+ upload.special_props = {
251
+ ImmutableVar(_var_name="{...getInputProps()}", _var_type=None)
252
+ }
251
253
 
252
254
  # The dropzone to use.
253
255
  zone = Box.create(
@@ -255,7 +257,9 @@ class Upload(MemoizationLeaf):
255
257
  *children,
256
258
  **{k: v for k, v in props.items() if k not in supported_props},
257
259
  )
258
- zone.special_props = [Var(_js_expr="{...getRootProps()}", _var_type=None)]
260
+ zone.special_props = {
261
+ ImmutableVar(_var_name="{...getRootProps()}", _var_type=None)
262
+ }
259
263
 
260
264
  # Create the component.
261
265
  upload_props["id"] = props.get("id", DEFAULT_UPLOAD_ID)
@@ -283,7 +287,9 @@ class Upload(MemoizationLeaf):
283
287
  )
284
288
 
285
289
  @classmethod
286
- def _update_arg_tuple_for_on_drop(cls, arg_value: tuple[Var, Var]):
290
+ def _update_arg_tuple_for_on_drop(
291
+ cls, arg_value: tuple[ImmutableVar, ImmutableVar]
292
+ ):
287
293
  """Helper to update caller-provided EventSpec args for direct use with on_drop.
288
294
 
289
295
  Args:
@@ -292,7 +298,7 @@ class Upload(MemoizationLeaf):
292
298
  Returns:
293
299
  The updated arg_value tuple when arg is "files", otherwise the original arg_value.
294
300
  """
295
- if arg_value[0]._js_expr == "files":
301
+ if arg_value[0]._var_name == "files":
296
302
  placeholder = parse_args_spec(_on_drop_spec)[0]
297
303
  return (arg_value[0], placeholder)
298
304
  return arg_value