reflex 0.5.10a3__py3-none-any.whl → 0.6.0__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 (303) 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 +4 -4
  4. reflex/.templates/jinja/web/utils/context.js.jinja2 +1 -1
  5. reflex/.templates/jinja/web/utils/theme.js.jinja2 +1 -1
  6. reflex/.templates/web/utils/state.js +3 -1
  7. reflex/__init__.py +10 -3
  8. reflex/__init__.pyi +3 -2
  9. reflex/app.py +47 -11
  10. reflex/app_module_for_backend.py +1 -1
  11. reflex/base.py +3 -2
  12. reflex/compiler/compiler.py +5 -5
  13. reflex/compiler/utils.py +5 -3
  14. reflex/components/base/app_wrap.py +2 -4
  15. reflex/components/base/app_wrap.pyi +16 -26
  16. reflex/components/base/bare.py +6 -4
  17. reflex/components/base/body.pyi +16 -26
  18. reflex/components/base/document.pyi +76 -126
  19. reflex/components/base/error_boundary.py +9 -8
  20. reflex/components/base/error_boundary.pyi +18 -30
  21. reflex/components/base/fragment.pyi +16 -26
  22. reflex/components/base/head.pyi +31 -51
  23. reflex/components/base/link.py +1 -1
  24. reflex/components/base/link.pyi +31 -51
  25. reflex/components/base/meta.pyi +61 -101
  26. reflex/components/base/script.py +2 -2
  27. reflex/components/base/script.pyi +20 -36
  28. reflex/components/component.py +107 -130
  29. reflex/components/core/banner.py +61 -66
  30. reflex/components/core/banner.pyi +129 -230
  31. reflex/components/core/client_side_routing.py +2 -2
  32. reflex/components/core/client_side_routing.pyi +31 -51
  33. reflex/components/core/clipboard.py +4 -3
  34. reflex/components/core/clipboard.pyi +19 -31
  35. reflex/components/core/cond.py +21 -44
  36. reflex/components/core/debounce.py +7 -9
  37. reflex/components/core/debounce.pyi +19 -31
  38. reflex/components/core/foreach.py +4 -14
  39. reflex/components/core/html.py +1 -1
  40. reflex/components/core/html.pyi +34 -44
  41. reflex/components/core/match.py +36 -43
  42. reflex/components/core/upload.py +27 -26
  43. reflex/components/core/upload.pyi +81 -116
  44. reflex/components/datadisplay/code.py +55 -29
  45. reflex/components/datadisplay/code.pyi +303 -410
  46. reflex/components/datadisplay/dataeditor.py +13 -9
  47. reflex/components/datadisplay/dataeditor.pyi +39 -51
  48. reflex/components/el/__init__.py +0 -1
  49. reflex/components/el/__init__.pyi +0 -11
  50. reflex/components/el/element.pyi +16 -26
  51. reflex/components/el/elements/__init__.py +1 -7
  52. reflex/components/el/elements/__init__.pyi +1 -15
  53. reflex/components/el/elements/base.py +1 -1
  54. reflex/components/el/elements/base.pyi +33 -43
  55. reflex/components/el/elements/forms.py +26 -33
  56. reflex/components/el/elements/forms.pyi +542 -694
  57. reflex/components/el/elements/inline.py +1 -1
  58. reflex/components/el/elements/inline.pyi +909 -1189
  59. reflex/components/el/elements/media.py +1 -22
  60. reflex/components/el/elements/media.pyi +765 -975
  61. reflex/components/el/elements/metadata.py +3 -5
  62. reflex/components/el/elements/metadata.pyi +175 -235
  63. reflex/components/el/elements/other.py +1 -1
  64. reflex/components/el/elements/other.pyi +228 -298
  65. reflex/components/el/elements/scripts.py +1 -1
  66. reflex/components/el/elements/scripts.pyi +106 -136
  67. reflex/components/el/elements/sectioning.py +0 -2
  68. reflex/components/el/elements/sectioning.pyi +481 -631
  69. reflex/components/el/elements/tables.py +1 -1
  70. reflex/components/el/elements/tables.pyi +341 -441
  71. reflex/components/el/elements/typography.py +1 -1
  72. reflex/components/el/elements/typography.pyi +491 -641
  73. reflex/components/gridjs/datatable.py +9 -13
  74. reflex/components/gridjs/datatable.pyi +33 -53
  75. reflex/components/lucide/icon.py +3 -127
  76. reflex/components/lucide/icon.pyi +31 -160
  77. reflex/components/markdown/markdown.py +32 -42
  78. reflex/components/markdown/markdown.pyi +28 -41
  79. reflex/components/moment/moment.py +13 -12
  80. reflex/components/moment/moment.pyi +22 -33
  81. reflex/components/next/base.pyi +16 -26
  82. reflex/components/next/image.py +1 -5
  83. reflex/components/next/image.pyi +21 -35
  84. reflex/components/next/link.py +1 -1
  85. reflex/components/next/link.pyi +16 -26
  86. reflex/components/next/video.py +1 -1
  87. reflex/components/next/video.pyi +16 -26
  88. reflex/components/plotly/plotly.py +17 -30
  89. reflex/components/plotly/plotly.pyi +38 -52
  90. reflex/components/props.py +21 -10
  91. reflex/components/radix/__init__.pyi +2 -1
  92. reflex/components/radix/primitives/accordion.py +6 -7
  93. reflex/components/radix/primitives/accordion.pyi +415 -485
  94. reflex/components/radix/primitives/base.py +1 -1
  95. reflex/components/radix/primitives/base.pyi +31 -51
  96. reflex/components/radix/primitives/drawer.py +1 -1
  97. reflex/components/radix/primitives/drawer.pyi +162 -262
  98. reflex/components/radix/primitives/form.py +1 -1
  99. reflex/components/radix/primitives/form.pyi +247 -353
  100. reflex/components/radix/primitives/progress.py +1 -1
  101. reflex/components/radix/primitives/progress.pyi +226 -276
  102. reflex/components/radix/primitives/slider.py +1 -1
  103. reflex/components/radix/primitives/slider.pyi +82 -132
  104. reflex/components/radix/themes/base.py +8 -25
  105. reflex/components/radix/themes/base.pyi +171 -242
  106. reflex/components/radix/themes/color_mode.py +11 -20
  107. reflex/components/radix/themes/color_mode.pyi +198 -231
  108. reflex/components/radix/themes/components/__init__.pyi +1 -0
  109. reflex/components/radix/themes/components/alert_dialog.py +1 -1
  110. reflex/components/radix/themes/components/alert_dialog.pyi +129 -199
  111. reflex/components/radix/themes/components/aspect_ratio.py +1 -1
  112. reflex/components/radix/themes/components/aspect_ratio.pyi +16 -26
  113. reflex/components/radix/themes/components/avatar.py +1 -1
  114. reflex/components/radix/themes/components/avatar.pyi +69 -79
  115. reflex/components/radix/themes/components/badge.py +1 -1
  116. reflex/components/radix/themes/components/badge.pyi +87 -97
  117. reflex/components/radix/themes/components/button.py +1 -1
  118. reflex/components/radix/themes/components/button.pyi +97 -107
  119. reflex/components/radix/themes/components/callout.py +1 -1
  120. reflex/components/radix/themes/components/callout.pyi +317 -367
  121. reflex/components/radix/themes/components/card.py +1 -1
  122. reflex/components/radix/themes/components/card.pyi +37 -47
  123. reflex/components/radix/themes/components/checkbox.py +2 -4
  124. reflex/components/radix/themes/components/checkbox.pyi +205 -241
  125. reflex/components/radix/themes/components/checkbox_cards.py +1 -1
  126. reflex/components/radix/themes/components/checkbox_cards.pyi +92 -112
  127. reflex/components/radix/themes/components/checkbox_group.py +1 -1
  128. reflex/components/radix/themes/components/checkbox_group.pyi +84 -104
  129. reflex/components/radix/themes/components/context_menu.py +1 -1
  130. reflex/components/radix/themes/components/context_menu.pyi +230 -310
  131. reflex/components/radix/themes/components/data_list.py +6 -1
  132. reflex/components/radix/themes/components/data_list.pyi +131 -166
  133. reflex/components/radix/themes/components/dialog.py +1 -1
  134. reflex/components/radix/themes/components/dialog.pyi +132 -202
  135. reflex/components/radix/themes/components/dropdown_menu.py +1 -1
  136. reflex/components/radix/themes/components/dropdown_menu.pyi +241 -323
  137. reflex/components/radix/themes/components/hover_card.py +1 -1
  138. reflex/components/radix/themes/components/hover_card.pyi +86 -126
  139. reflex/components/radix/themes/components/icon_button.py +1 -1
  140. reflex/components/radix/themes/components/icon_button.pyi +97 -107
  141. reflex/components/radix/themes/components/inset.py +1 -1
  142. reflex/components/radix/themes/components/inset.pyi +46 -56
  143. reflex/components/radix/themes/components/popover.py +1 -1
  144. reflex/components/radix/themes/components/popover.pyi +91 -131
  145. reflex/components/radix/themes/components/progress.py +1 -1
  146. reflex/components/radix/themes/components/progress.pyi +70 -80
  147. reflex/components/radix/themes/components/radio.py +1 -1
  148. reflex/components/radix/themes/components/radio.pyi +68 -78
  149. reflex/components/radix/themes/components/radio_cards.py +1 -1
  150. reflex/components/radix/themes/components/radio_cards.pyi +96 -116
  151. reflex/components/radix/themes/components/radio_group.py +32 -31
  152. reflex/components/radix/themes/components/radio_group.pyi +230 -266
  153. reflex/components/radix/themes/components/scroll_area.py +1 -1
  154. reflex/components/radix/themes/components/scroll_area.pyi +20 -30
  155. reflex/components/radix/themes/components/segmented_control.py +1 -1
  156. reflex/components/radix/themes/components/segmented_control.pyi +88 -110
  157. reflex/components/radix/themes/components/select.py +1 -1
  158. reflex/components/radix/themes/components/select.pyi +365 -461
  159. reflex/components/radix/themes/components/separator.py +2 -4
  160. reflex/components/radix/themes/components/separator.pyi +68 -78
  161. reflex/components/radix/themes/components/skeleton.py +1 -1
  162. reflex/components/radix/themes/components/skeleton.pyi +22 -32
  163. reflex/components/radix/themes/components/slider.py +1 -1
  164. reflex/components/radix/themes/components/slider.pyi +74 -86
  165. reflex/components/radix/themes/components/spinner.py +1 -1
  166. reflex/components/radix/themes/components/spinner.pyi +18 -28
  167. reflex/components/radix/themes/components/switch.py +1 -1
  168. reflex/components/radix/themes/components/switch.pyi +70 -82
  169. reflex/components/radix/themes/components/table.py +1 -1
  170. reflex/components/radix/themes/components/table.pyi +254 -324
  171. reflex/components/radix/themes/components/tabs.py +1 -1
  172. reflex/components/radix/themes/components/tabs.pyi +134 -188
  173. reflex/components/radix/themes/components/text_area.py +1 -1
  174. reflex/components/radix/themes/components/text_area.pyi +95 -109
  175. reflex/components/radix/themes/components/text_field.py +1 -80
  176. reflex/components/radix/themes/components/text_field.pyi +245 -290
  177. reflex/components/radix/themes/components/tooltip.py +1 -1
  178. reflex/components/radix/themes/components/tooltip.pyi +25 -35
  179. reflex/components/radix/themes/layout/__init__.pyi +1 -0
  180. reflex/components/radix/themes/layout/base.py +1 -1
  181. reflex/components/radix/themes/layout/base.pyi +55 -65
  182. reflex/components/radix/themes/layout/box.pyi +33 -43
  183. reflex/components/radix/themes/layout/center.pyi +55 -65
  184. reflex/components/radix/themes/layout/container.py +2 -4
  185. reflex/components/radix/themes/layout/container.pyi +35 -45
  186. reflex/components/radix/themes/layout/flex.py +1 -1
  187. reflex/components/radix/themes/layout/flex.pyi +55 -65
  188. reflex/components/radix/themes/layout/grid.py +1 -1
  189. reflex/components/radix/themes/layout/grid.pyi +63 -73
  190. reflex/components/radix/themes/layout/list.py +1 -1
  191. reflex/components/radix/themes/layout/list.pyi +188 -238
  192. reflex/components/radix/themes/layout/section.py +2 -4
  193. reflex/components/radix/themes/layout/section.pyi +35 -45
  194. reflex/components/radix/themes/layout/spacer.pyi +55 -65
  195. reflex/components/radix/themes/layout/stack.py +1 -1
  196. reflex/components/radix/themes/layout/stack.pyi +125 -155
  197. reflex/components/radix/themes/typography/blockquote.py +1 -1
  198. reflex/components/radix/themes/typography/blockquote.pyi +88 -98
  199. reflex/components/radix/themes/typography/code.py +1 -1
  200. reflex/components/radix/themes/typography/code.pyi +89 -99
  201. reflex/components/radix/themes/typography/heading.py +1 -1
  202. reflex/components/radix/themes/typography/heading.pyi +95 -105
  203. reflex/components/radix/themes/typography/link.py +1 -1
  204. reflex/components/radix/themes/typography/link.pyi +101 -111
  205. reflex/components/radix/themes/typography/text.py +1 -1
  206. reflex/components/radix/themes/typography/text.pyi +494 -564
  207. reflex/components/react_player/audio.pyi +32 -58
  208. reflex/components/react_player/react_player.py +1 -1
  209. reflex/components/react_player/react_player.pyi +32 -58
  210. reflex/components/react_player/video.pyi +32 -58
  211. reflex/components/recharts/cartesian.py +22 -19
  212. reflex/components/recharts/cartesian.pyi +658 -840
  213. reflex/components/recharts/charts.py +3 -3
  214. reflex/components/recharts/charts.pyi +238 -342
  215. reflex/components/recharts/general.py +8 -8
  216. reflex/components/recharts/general.pyi +175 -225
  217. reflex/components/recharts/polar.py +11 -11
  218. reflex/components/recharts/polar.pyi +135 -171
  219. reflex/components/recharts/recharts.pyi +31 -51
  220. reflex/components/sonner/toast.py +27 -31
  221. reflex/components/sonner/toast.pyi +36 -45
  222. reflex/components/suneditor/editor.py +1 -1
  223. reflex/components/suneditor/editor.pyi +54 -76
  224. reflex/components/tags/cond_tag.py +6 -4
  225. reflex/components/tags/iter_tag.py +37 -25
  226. reflex/components/tags/match_tag.py +6 -4
  227. reflex/components/tags/tag.py +43 -28
  228. reflex/constants/base.py +3 -1
  229. reflex/constants/event.py +1 -0
  230. reflex/custom_components/custom_components.py +3 -1
  231. reflex/event.py +166 -108
  232. reflex/experimental/__init__.py +25 -6
  233. reflex/experimental/client_state.py +34 -57
  234. reflex/experimental/hooks.py +12 -17
  235. reflex/experimental/layout.py +4 -4
  236. reflex/experimental/layout.pyi +130 -180
  237. reflex/middleware/hydrate_middleware.py +2 -0
  238. reflex/middleware/middleware.py +3 -3
  239. reflex/model.py +22 -0
  240. reflex/reflex.py +4 -0
  241. reflex/state.py +491 -110
  242. reflex/style.py +56 -39
  243. reflex/testing.py +8 -3
  244. reflex/utils/exceptions.py +32 -0
  245. reflex/utils/exec.py +0 -14
  246. reflex/utils/format.py +80 -209
  247. reflex/utils/imports.py +16 -73
  248. reflex/utils/net.py +43 -0
  249. reflex/utils/path_ops.py +13 -1
  250. reflex/utils/prerequisites.py +81 -41
  251. reflex/utils/pyi_generator.py +12 -6
  252. reflex/utils/serializers.py +13 -41
  253. reflex/utils/telemetry.py +3 -2
  254. reflex/utils/types.py +47 -7
  255. reflex/{experimental/vars → vars}/__init__.py +6 -3
  256. reflex/vars/base.py +2563 -0
  257. reflex/vars/function.py +196 -0
  258. reflex/vars/number.py +1158 -0
  259. reflex/vars/object.py +562 -0
  260. reflex/vars/sequence.py +1604 -0
  261. {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/METADATA +6 -9
  262. reflex-0.6.0.dist-info/RECORD +382 -0
  263. reflex/.templates/apps/demo/.gitignore +0 -4
  264. reflex/.templates/apps/demo/assets/favicon.ico +0 -0
  265. reflex/.templates/apps/demo/assets/github.svg +0 -10
  266. reflex/.templates/apps/demo/assets/icon.svg +0 -37
  267. reflex/.templates/apps/demo/assets/logo.svg +0 -68
  268. reflex/.templates/apps/demo/assets/paneleft.svg +0 -13
  269. reflex/.templates/apps/demo/code/__init__.py +0 -1
  270. reflex/.templates/apps/demo/code/demo.py +0 -127
  271. reflex/.templates/apps/demo/code/pages/__init__.py +0 -7
  272. reflex/.templates/apps/demo/code/pages/chatapp.py +0 -31
  273. reflex/.templates/apps/demo/code/pages/datatable.py +0 -360
  274. reflex/.templates/apps/demo/code/pages/forms.py +0 -257
  275. reflex/.templates/apps/demo/code/pages/graphing.py +0 -253
  276. reflex/.templates/apps/demo/code/pages/home.py +0 -56
  277. reflex/.templates/apps/demo/code/sidebar.py +0 -178
  278. reflex/.templates/apps/demo/code/state.py +0 -22
  279. reflex/.templates/apps/demo/code/states/form_state.py +0 -40
  280. reflex/.templates/apps/demo/code/states/pie_state.py +0 -47
  281. reflex/.templates/apps/demo/code/styles.py +0 -68
  282. reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
  283. reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -4
  284. reflex/.templates/apps/demo/code/webui/components/chat.py +0 -118
  285. reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -19
  286. reflex/.templates/apps/demo/code/webui/components/modal.py +0 -56
  287. reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -70
  288. reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -66
  289. reflex/.templates/apps/demo/code/webui/state.py +0 -146
  290. reflex/.templates/apps/demo/code/webui/styles.py +0 -88
  291. reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +0 -36
  292. reflex/experimental/vars/base.py +0 -583
  293. reflex/experimental/vars/function.py +0 -290
  294. reflex/experimental/vars/number.py +0 -1458
  295. reflex/experimental/vars/object.py +0 -804
  296. reflex/experimental/vars/sequence.py +0 -1764
  297. reflex/utils/watch.py +0 -96
  298. reflex/vars.py +0 -2604
  299. reflex/vars.pyi +0 -218
  300. reflex-0.5.10a3.dist-info/RECORD +0 -413
  301. {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/LICENSE +0 -0
  302. {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/WHEEL +0 -0
  303. {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/entry_points.txt +0 -0
@@ -8,7 +8,7 @@ from typing import Any, Callable, Dict, Literal, Optional, Union, overload
8
8
  from reflex.components.component import Component
9
9
  from reflex.event import EventHandler, EventSpec
10
10
  from reflex.style import Style
11
- from reflex.vars import BaseVar, Var
11
+ from reflex.vars.base import Var
12
12
 
13
13
  class Script(Component):
14
14
  @overload
@@ -19,8 +19,8 @@ class Script(Component):
19
19
  src: Optional[Union[Var[str], str]] = None,
20
20
  strategy: Optional[
21
21
  Union[
22
- Var[Literal["afterInteractive", "beforeInteractive", "lazyOnload"]],
23
22
  Literal["afterInteractive", "beforeInteractive", "lazyOnload"],
23
+ Var[Literal["afterInteractive", "beforeInteractive", "lazyOnload"]],
24
24
  ]
25
25
  ] = None,
26
26
  style: Optional[Style] = None,
@@ -29,59 +29,43 @@ class Script(Component):
29
29
  class_name: Optional[Any] = None,
30
30
  autofocus: Optional[bool] = None,
31
31
  custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
32
- on_blur: Optional[
33
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
34
- ] = None,
35
- on_click: Optional[
36
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
37
- ] = None,
32
+ on_blur: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
33
+ on_click: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
38
34
  on_context_menu: Optional[
39
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
35
+ Union[EventHandler, EventSpec, list, Callable, Var]
40
36
  ] = None,
41
37
  on_double_click: Optional[
42
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
43
- ] = None,
44
- on_error: Optional[
45
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
46
- ] = None,
47
- on_focus: Optional[
48
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
49
- ] = None,
50
- on_load: Optional[
51
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
52
- ] = None,
53
- on_mount: Optional[
54
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
38
+ Union[EventHandler, EventSpec, list, Callable, Var]
55
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,
56
44
  on_mouse_down: Optional[
57
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
45
+ Union[EventHandler, EventSpec, list, Callable, Var]
58
46
  ] = None,
59
47
  on_mouse_enter: Optional[
60
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
48
+ Union[EventHandler, EventSpec, list, Callable, Var]
61
49
  ] = None,
62
50
  on_mouse_leave: Optional[
63
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
51
+ Union[EventHandler, EventSpec, list, Callable, Var]
64
52
  ] = None,
65
53
  on_mouse_move: Optional[
66
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
54
+ Union[EventHandler, EventSpec, list, Callable, Var]
67
55
  ] = None,
68
56
  on_mouse_out: Optional[
69
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
57
+ Union[EventHandler, EventSpec, list, Callable, Var]
70
58
  ] = None,
71
59
  on_mouse_over: Optional[
72
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
60
+ Union[EventHandler, EventSpec, list, Callable, Var]
73
61
  ] = None,
74
62
  on_mouse_up: Optional[
75
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
76
- ] = None,
77
- on_ready: Optional[
78
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
79
- ] = None,
80
- on_scroll: Optional[
81
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
63
+ Union[EventHandler, EventSpec, list, Callable, Var]
82
64
  ] = None,
65
+ on_ready: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
66
+ on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
83
67
  on_unmount: Optional[
84
- Union[EventHandler, EventSpec, list, Callable, BaseVar]
68
+ Union[EventHandler, EventSpec, list, Callable, Var]
85
69
  ] = None,
86
70
  **props,
87
71
  ) -> "Script":
@@ -44,10 +44,17 @@ from reflex.event import (
44
44
  get_handler_args,
45
45
  )
46
46
  from reflex.style import Style, format_as_emotion
47
- from reflex.utils import console, format, imports, types
48
- from reflex.utils.imports import ImportDict, ImportVar, ParsedImportDict, parse_imports
47
+ from reflex.utils import format, imports, types
48
+ from reflex.utils.imports import (
49
+ ImmutableParsedImportDict,
50
+ ImportDict,
51
+ ImportVar,
52
+ ParsedImportDict,
53
+ parse_imports,
54
+ )
49
55
  from reflex.utils.serializers import serializer
50
- from reflex.vars import BaseVar, Var, VarData
56
+ from reflex.vars import VarData
57
+ from reflex.vars.base import LiteralVar, Var
51
58
 
52
59
 
53
60
  class BaseComponent(Base, ABC):
@@ -188,7 +195,7 @@ class Component(BaseComponent, ABC):
188
195
  class_name: Any = None
189
196
 
190
197
  # Special component props.
191
- special_props: Set[Var] = set()
198
+ special_props: List[Var] = []
192
199
 
193
200
  # Whether the component should take the focus once the page is loaded
194
201
  autofocus: bool = False
@@ -320,9 +327,8 @@ class Component(BaseComponent, ABC):
320
327
  # Set default values for any props.
321
328
  if types._issubclass(field.type_, Var):
322
329
  field.required = False
323
- field.default = Var.create(
324
- field.default, _var_is_string=isinstance(field.default, str)
325
- )
330
+ if field.default is not None:
331
+ field.default = LiteralVar.create(field.default)
326
332
  elif types._issubclass(field.type_, EventHandler):
327
333
  field.required = False
328
334
 
@@ -351,10 +357,7 @@ class Component(BaseComponent, ABC):
351
357
  "id": kwargs.get("id"),
352
358
  "children": children,
353
359
  **{
354
- prop: Var.create(
355
- kwargs[prop],
356
- _var_is_string=False if isinstance(kwargs[prop], str) else None,
357
- )
360
+ prop: LiteralVar.create(kwargs[prop])
358
361
  for prop in self.get_initial_props()
359
362
  if prop in kwargs
360
363
  },
@@ -401,10 +404,10 @@ class Component(BaseComponent, ABC):
401
404
  passed_types = None
402
405
  try:
403
406
  # Try to create a var from the value.
404
- kwargs[key] = Var.create(
405
- value,
406
- _var_is_string=False if isinstance(value, str) else None,
407
- )
407
+ if isinstance(value, Var):
408
+ kwargs[key] = value
409
+ else:
410
+ kwargs[key] = LiteralVar.create(value)
408
411
 
409
412
  # Check that the var type is not None.
410
413
  if kwargs[key] is None:
@@ -444,11 +447,18 @@ class Component(BaseComponent, ABC):
444
447
  not passed_types
445
448
  and not types._issubclass(passed_type, expected_type, value)
446
449
  ):
447
- value_name = value._var_name if isinstance(value, Var) else value
448
- raise TypeError(
449
- 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}."
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
456
  )
451
457
 
458
+ 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
461
+ )
452
462
  # Check if the key is an event trigger.
453
463
  if key in component_specific_triggers:
454
464
  # Temporarily disable full control for event triggers.
@@ -495,7 +505,11 @@ class Component(BaseComponent, ABC):
495
505
  self,
496
506
  args_spec: Any,
497
507
  value: Union[
498
- Var, EventHandler, EventSpec, List[Union[EventHandler, EventSpec]], Callable
508
+ Var,
509
+ EventHandler,
510
+ EventSpec,
511
+ List[Union[EventHandler, EventSpec]],
512
+ Callable,
499
513
  ],
500
514
  ) -> Union[EventChain, Var]:
501
515
  """Create an event chain from a variety of input types.
@@ -513,7 +527,9 @@ class Component(BaseComponent, ABC):
513
527
  # If it's an event chain var, return it.
514
528
  if isinstance(value, Var):
515
529
  if value._var_type is not EventChain:
516
- raise ValueError(f"Invalid event chain: {value}")
530
+ raise ValueError(
531
+ f"Invalid event chain: {repr(value)} of type {type(value)}"
532
+ )
517
533
  return value
518
534
  elif isinstance(value, EventChain):
519
535
  # Trust that the caller knows what they're doing passing an EventChain directly
@@ -529,15 +545,7 @@ class Component(BaseComponent, ABC):
529
545
  for v in value:
530
546
  if isinstance(v, (EventHandler, EventSpec)):
531
547
  # Call the event handler to get the event.
532
- try:
533
- event = call_event_handler(v, args_spec)
534
- except ValueError as err:
535
- raise ValueError(
536
- f" {err} defined in the `{type(self).__name__}` component"
537
- ) from err
538
-
539
- # Add the event to the chain.
540
- events.append(event)
548
+ events.append(call_event_handler(v, args_spec))
541
549
  elif isinstance(v, Callable):
542
550
  # Call the lambda to get the event chain.
543
551
  result = call_event_fn(v, args_spec)
@@ -638,27 +646,6 @@ class Component(BaseComponent, ABC):
638
646
 
639
647
  return _compile_component(self)
640
648
 
641
- def _apply_theme(self, theme: Optional[Component]):
642
- """Apply the theme to this component.
643
-
644
- Deprecated. Use add_style instead.
645
-
646
- Args:
647
- theme: The theme to apply.
648
- """
649
- pass
650
-
651
- def apply_theme(self, theme: Optional[Component]):
652
- """Apply a theme to the component and its children.
653
-
654
- Args:
655
- theme: The theme to apply.
656
- """
657
- self._apply_theme(theme)
658
- for child in self.children:
659
- if isinstance(child, Component):
660
- child.apply_theme(theme)
661
-
662
649
  def _exclude_props(self) -> list[str]:
663
650
  """Props to exclude when adding the component props to the Tag.
664
651
 
@@ -678,7 +665,7 @@ class Component(BaseComponent, ABC):
678
665
  """
679
666
  # Create the base tag.
680
667
  tag = Tag(
681
- name=self.tag if not self.alias else self.alias,
668
+ name=(self.tag if not self.alias else self.alias) or "",
682
669
  special_props=self.special_props,
683
670
  )
684
671
 
@@ -692,9 +679,7 @@ class Component(BaseComponent, ABC):
692
679
  # Add ref to element if `id` is not None.
693
680
  ref = self.get_ref()
694
681
  if ref is not None:
695
- props["ref"] = Var.create(
696
- ref, _var_is_local=False, _var_is_string=False
697
- )
682
+ props["ref"] = Var(_js_expr=ref)
698
683
  else:
699
684
  props = props.copy()
700
685
 
@@ -768,22 +753,6 @@ class Component(BaseComponent, ABC):
768
753
  from reflex.components.base.fragment import Fragment
769
754
  from reflex.utils.exceptions import ComponentTypeError
770
755
 
771
- # Translate deprecated props to new names.
772
- new_prop_names = [
773
- prop for prop in cls.get_props() if prop in ["type", "min", "max"]
774
- ]
775
- for prop in new_prop_names:
776
- under_prop = f"{prop}_"
777
- if under_prop in props:
778
- console.deprecate(
779
- f"Underscore suffix for prop `{under_prop}`",
780
- reason=f"for consistency. Use `{prop}` instead.",
781
- deprecation_version="0.4.0",
782
- removal_version="0.6.0",
783
- dedupe=False,
784
- )
785
- props[prop] = props.pop(under_prop)
786
-
787
756
  # Filter out None props
788
757
  props = {key: value for key, value in props.items() if value is not None}
789
758
 
@@ -809,7 +778,7 @@ class Component(BaseComponent, ABC):
809
778
  else (
810
779
  Fragment.create(*child)
811
780
  if isinstance(child, tuple)
812
- else Bare.create(contents=Var.create(child, _var_is_string=True))
781
+ else Bare.create(contents=LiteralVar.create(child))
813
782
  )
814
783
  )
815
784
  for child in children
@@ -900,17 +869,6 @@ class Component(BaseComponent, ABC):
900
869
  new_style.update(component_style)
901
870
  style_vars.append(component_style._var_data)
902
871
 
903
- # 3. User-defined style from `Component.style`.
904
- # Apply theme for retro-compatibility with deprecated _apply_theme API
905
- if type(self)._apply_theme != Component._apply_theme:
906
- console.deprecate(
907
- f"{self.__class__.__name__}._apply_theme",
908
- reason="use add_style instead",
909
- deprecation_version="0.5.0",
910
- removal_version="0.6.0",
911
- )
912
- self._apply_theme(theme)
913
-
914
872
  # 4. style dict and css props passed to the component instance.
915
873
  new_style.update(self.style)
916
874
  style_vars.append(self.style._var_data)
@@ -936,7 +894,12 @@ class Component(BaseComponent, ABC):
936
894
  """
937
895
  if isinstance(self.style, Var):
938
896
  return {"css": self.style}
939
- return {"css": Var.create(format_as_emotion(self.style))}
897
+ emotion_style = format_as_emotion(self.style)
898
+ return (
899
+ {"css": LiteralVar.create(emotion_style)}
900
+ if emotion_style is not None
901
+ else {}
902
+ )
940
903
 
941
904
  def render(self) -> Dict:
942
905
  """Render the component.
@@ -1091,10 +1054,10 @@ class Component(BaseComponent, ABC):
1091
1054
  # Style keeps track of its own VarData instance, so embed in a temp Var that is yielded.
1092
1055
  if isinstance(self.style, dict) and self.style or isinstance(self.style, Var):
1093
1056
  vars.append(
1094
- BaseVar(
1095
- _var_name="style",
1057
+ Var(
1058
+ _js_expr="style",
1096
1059
  _var_type=str,
1097
- _var_data=self.style._var_data,
1060
+ _var_data=VarData.merge(self.style._var_data),
1098
1061
  )
1099
1062
  )
1100
1063
 
@@ -1113,10 +1076,8 @@ class Component(BaseComponent, ABC):
1113
1076
  vars.append(comp_prop)
1114
1077
  elif isinstance(comp_prop, str):
1115
1078
  # Collapse VarData encoded in f-strings.
1116
- var = Var.create_safe(
1117
- comp_prop, _var_is_string=isinstance(comp_prop, str)
1118
- )
1119
- if var._var_data is not None:
1079
+ var = LiteralVar.create(comp_prop)
1080
+ if var._get_all_var_data() is not None:
1120
1081
  vars.append(var)
1121
1082
 
1122
1083
  # Get Vars associated with children.
@@ -1124,7 +1085,8 @@ class Component(BaseComponent, ABC):
1124
1085
  for child in self.children:
1125
1086
  if not isinstance(child, Component):
1126
1087
  continue
1127
- vars.extend(child._get_vars(include_children=include_children))
1088
+ child_vars = child._get_vars(include_children=include_children)
1089
+ vars.extend(child_vars)
1128
1090
 
1129
1091
  return vars
1130
1092
 
@@ -1329,13 +1291,13 @@ class Component(BaseComponent, ABC):
1329
1291
 
1330
1292
  other_imports = []
1331
1293
  user_hooks = self._get_hooks()
1332
- if (
1333
- user_hooks is not None
1334
- and isinstance(user_hooks, Var)
1335
- and user_hooks._var_data is not None
1336
- and user_hooks._var_data.imports
1337
- ):
1338
- other_imports.append(user_hooks._var_data.imports)
1294
+ user_hooks_data = (
1295
+ VarData.merge(user_hooks._get_all_var_data())
1296
+ if user_hooks is not None and isinstance(user_hooks, Var)
1297
+ else None
1298
+ )
1299
+ if user_hooks_data is not None:
1300
+ other_imports.append(user_hooks_data.imports)
1339
1301
  other_imports.extend(
1340
1302
  hook_imports for hook_imports in self._get_added_hooks().values()
1341
1303
  )
@@ -1358,9 +1320,16 @@ class Component(BaseComponent, ABC):
1358
1320
  event_imports = Imports.EVENTS if self.event_triggers else {}
1359
1321
 
1360
1322
  # Collect imports from Vars used directly by this component.
1361
- var_imports = [
1362
- var._var_data.imports for var in self._get_vars() if var._var_data
1363
- ]
1323
+ var_datas = [var._get_all_var_data() for var in self._get_vars()]
1324
+ var_imports: List[ImmutableParsedImportDict] = list(
1325
+ map(
1326
+ lambda var_data: var_data.imports,
1327
+ filter(
1328
+ None,
1329
+ var_datas,
1330
+ ),
1331
+ )
1332
+ )
1364
1333
 
1365
1334
  added_import_dicts: list[ParsedImportDict] = []
1366
1335
  for clz in self._iter_parent_classes_with_method("add_imports"):
@@ -1407,9 +1376,9 @@ class Component(BaseComponent, ABC):
1407
1376
  on_mount = self.event_triggers.get(EventTriggers.ON_MOUNT, None)
1408
1377
  on_unmount = self.event_triggers.get(EventTriggers.ON_UNMOUNT, None)
1409
1378
  if on_mount is not None:
1410
- on_mount = format.format_event_chain(on_mount)
1379
+ on_mount = str(LiteralVar.create(on_mount)) + "()"
1411
1380
  if on_unmount is not None:
1412
- on_unmount = format.format_event_chain(on_unmount)
1381
+ on_unmount = str(LiteralVar.create(on_unmount)) + "()"
1413
1382
  if on_mount is not None or on_unmount is not None:
1414
1383
  return f"""
1415
1384
  useEffect(() => {{
@@ -1427,7 +1396,7 @@ class Component(BaseComponent, ABC):
1427
1396
  """
1428
1397
  ref = self.get_ref()
1429
1398
  if ref is not None:
1430
- return f"const {ref} = useRef(null); {str(Var.create_safe(ref, _var_is_string=False).as_ref())} = {ref};"
1399
+ return f"const {ref} = useRef(null); {str(Var(_js_expr=ref).as_ref())} = {ref};"
1431
1400
 
1432
1401
  def _get_vars_hooks(self) -> dict[str, None]:
1433
1402
  """Get the hooks required by vars referenced in this component.
@@ -1437,8 +1406,13 @@ class Component(BaseComponent, ABC):
1437
1406
  """
1438
1407
  vars_hooks = {}
1439
1408
  for var in self._get_vars():
1440
- if var._var_data:
1441
- vars_hooks.update(var._var_data.hooks)
1409
+ var_data = var._get_all_var_data()
1410
+ if var_data is not None:
1411
+ vars_hooks.update(
1412
+ var_data.hooks
1413
+ if isinstance(var_data.hooks, dict)
1414
+ else {k: None for k in var_data.hooks}
1415
+ )
1442
1416
  return vars_hooks
1443
1417
 
1444
1418
  def _get_events_hooks(self) -> dict[str, None]:
@@ -1487,11 +1461,12 @@ class Component(BaseComponent, ABC):
1487
1461
 
1488
1462
  def extract_var_hooks(hook: Var):
1489
1463
  _imports = {}
1490
- if hook._var_data is not None:
1491
- for sub_hook in hook._var_data.hooks:
1464
+ var_data = VarData.merge(hook._get_all_var_data())
1465
+ if var_data is not None:
1466
+ for sub_hook in var_data.hooks:
1492
1467
  code[sub_hook] = {}
1493
- if hook._var_data.imports:
1494
- _imports = hook._var_data.imports
1468
+ if var_data.imports:
1469
+ _imports = var_data.imports
1495
1470
  if str(hook) in code:
1496
1471
  code[str(hook)] = imports.merge_imports(code[str(hook)], _imports)
1497
1472
  else:
@@ -1505,6 +1480,7 @@ class Component(BaseComponent, ABC):
1505
1480
  extract_var_hooks(hook)
1506
1481
  else:
1507
1482
  code[hook] = {}
1483
+
1508
1484
  return code
1509
1485
 
1510
1486
  def _get_hooks(self) -> str | None:
@@ -1561,7 +1537,7 @@ class Component(BaseComponent, ABC):
1561
1537
  The ref name.
1562
1538
  """
1563
1539
  # do not create a ref if the id is dynamic or unspecified
1564
- if self.id is None or isinstance(self.id, BaseVar):
1540
+ if self.id is None or isinstance(self.id, Var):
1565
1541
  return None
1566
1542
  return format.format_ref(self.id)
1567
1543
 
@@ -1707,7 +1683,7 @@ class CustomComponent(Component):
1707
1683
 
1708
1684
  # Handle subclasses of Base.
1709
1685
  if isinstance(value, Base):
1710
- base_value = Var.create(value)
1686
+ base_value = LiteralVar.create(value)
1711
1687
 
1712
1688
  # Track hooks and imports associated with Component instances.
1713
1689
  if base_value is not None and isinstance(value, Component):
@@ -1721,7 +1697,7 @@ class CustomComponent(Component):
1721
1697
  else:
1722
1698
  value = base_value
1723
1699
  else:
1724
- value = Var.create(value, _var_is_string=isinstance(value, str))
1700
+ value = LiteralVar.create(value)
1725
1701
 
1726
1702
  # Set the prop.
1727
1703
  self.props[format.to_camel_case(key)] = value
@@ -1800,19 +1776,19 @@ class CustomComponent(Component):
1800
1776
  """
1801
1777
  return super()._render(props=self.props)
1802
1778
 
1803
- def get_prop_vars(self) -> List[BaseVar]:
1779
+ def get_prop_vars(self) -> List[Var]:
1804
1780
  """Get the prop vars.
1805
1781
 
1806
1782
  Returns:
1807
1783
  The prop vars.
1808
1784
  """
1809
1785
  return [
1810
- BaseVar(
1811
- _var_name=name,
1786
+ Var(
1787
+ _js_expr=name,
1812
1788
  _var_type=(
1813
1789
  prop._var_type if types._isinstance(prop, Var) else type(prop)
1814
1790
  ),
1815
- )
1791
+ ).guess_type()
1816
1792
  for name, prop in self.props.items()
1817
1793
  ]
1818
1794
 
@@ -1825,9 +1801,11 @@ class CustomComponent(Component):
1825
1801
  Returns:
1826
1802
  Each var referenced by the component (props, styles, event handlers).
1827
1803
  """
1828
- return super()._get_vars(include_children=include_children) + [
1829
- prop for prop in self.props.values() if isinstance(prop, Var)
1830
- ]
1804
+ return (
1805
+ super()._get_vars(include_children=include_children)
1806
+ + [prop for prop in self.props.values() if isinstance(prop, Var)]
1807
+ + self.get_component(self)._get_vars(include_children=include_children)
1808
+ )
1831
1809
 
1832
1810
  @lru_cache(maxsize=None) # noqa
1833
1811
  def get_component(self) -> Component:
@@ -1981,7 +1959,7 @@ class StatefulComponent(BaseComponent):
1981
1959
  if not should_memoize:
1982
1960
  # Determine if any Vars have associated data.
1983
1961
  for prop_var in component._get_vars():
1984
- if prop_var._var_data:
1962
+ if prop_var._get_all_var_data():
1985
1963
  should_memoize = True
1986
1964
  break
1987
1965
 
@@ -1996,7 +1974,7 @@ class StatefulComponent(BaseComponent):
1996
1974
  should_memoize = True
1997
1975
  break
1998
1976
  child = cls._child_var(child)
1999
- if isinstance(child, Var) and child._var_data:
1977
+ if isinstance(child, Var) and child._get_all_var_data():
2000
1978
  should_memoize = True
2001
1979
  break
2002
1980
 
@@ -2176,9 +2154,7 @@ class StatefulComponent(BaseComponent):
2176
2154
 
2177
2155
  # Get the actual EventSpec and render it.
2178
2156
  event = component.event_triggers[event_trigger]
2179
- rendered_chain = format.format_prop(event)
2180
- if isinstance(rendered_chain, str):
2181
- rendered_chain = rendered_chain.strip("{}")
2157
+ rendered_chain = str(LiteralVar.create(event))
2182
2158
 
2183
2159
  # Hash the rendered EventChain to get a deterministic function name.
2184
2160
  chain_hash = md5(str(rendered_chain).encode("utf-8")).hexdigest()
@@ -2187,12 +2163,13 @@ class StatefulComponent(BaseComponent):
2187
2163
  # Calculate Var dependencies accessed by the handler for useCallback dep array.
2188
2164
  var_deps = ["addEvents", "Event"]
2189
2165
  for arg in event_args:
2190
- if arg._var_data is None:
2166
+ var_data = arg._get_all_var_data()
2167
+ if var_data is None:
2191
2168
  continue
2192
- for hook in arg._var_data.hooks:
2169
+ for hook in var_data.hooks:
2193
2170
  var_deps.extend(cls._get_hook_deps(hook))
2194
2171
  memo_var_data = VarData.merge(
2195
- *[var._var_data for var in event_args],
2172
+ *[var._get_all_var_data() for var in event_args],
2196
2173
  VarData(
2197
2174
  imports={"react": [ImportVar(tag="useCallback")]},
2198
2175
  ),
@@ -2200,7 +2177,7 @@ class StatefulComponent(BaseComponent):
2200
2177
 
2201
2178
  # Store the memoized function name and hook code for this event trigger.
2202
2179
  trigger_memo[event_trigger] = (
2203
- Var.create_safe(memo_name, _var_is_string=False)._replace(
2180
+ Var(_js_expr=memo_name)._replace(
2204
2181
  _var_type=EventChain, merge_var_data=memo_var_data
2205
2182
  ),
2206
2183
  f"const {memo_name} = useCallback({rendered_chain}, [{', '.join(var_deps)}])",
@@ -2273,7 +2250,7 @@ class StatefulComponent(BaseComponent):
2273
2250
  Returns:
2274
2251
  The tag to render.
2275
2252
  """
2276
- return dict(Tag(name=self.tag))
2253
+ return dict(Tag(name=self.tag or ""))
2277
2254
 
2278
2255
  def __str__(self) -> str:
2279
2256
  """Represent the component in React.