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
reflex/style.py CHANGED
@@ -6,12 +6,13 @@ from typing import Any, Literal, Tuple, Type
6
6
 
7
7
  from reflex import constants
8
8
  from reflex.components.core.breakpoints import Breakpoints, breakpoints_values
9
- from reflex.event import EventChain
9
+ from reflex.event import EventChain, EventHandler
10
10
  from reflex.utils import format
11
+ from reflex.utils.exceptions import ReflexError
11
12
  from reflex.utils.imports import ImportVar
12
- from reflex.vars import BaseVar, CallableVar, Var, VarData
13
-
14
- VarData.update_forward_refs() # Ensure all type definitions are resolved
13
+ from reflex.vars import VarData
14
+ from reflex.vars.base import CallableVar, LiteralVar, Var
15
+ from reflex.vars.function import FunctionVar
15
16
 
16
17
  SYSTEM_COLOR_MODE: str = "system"
17
18
  LIGHT_COLOR_MODE: str = "light"
@@ -25,32 +26,30 @@ color_mode_imports = {
25
26
  }
26
27
 
27
28
 
28
- def _color_mode_var(_var_name: str, _var_type: Type = str) -> BaseVar:
29
- """Create a Var that destructs the _var_name from ColorModeContext.
29
+ def _color_mode_var(_js_expr: str, _var_type: Type = str) -> Var:
30
+ """Create a Var that destructs the _js_expr from ColorModeContext.
30
31
 
31
32
  Args:
32
- _var_name: The name of the variable to get from ColorModeContext.
33
+ _js_expr: The name of the variable to get from ColorModeContext.
33
34
  _var_type: The type of the Var.
34
35
 
35
36
  Returns:
36
- The BaseVar for accessing _var_name from ColorModeContext.
37
+ The Var that resolves to the color mode.
37
38
  """
38
- return BaseVar(
39
- _var_name=_var_name,
39
+ return Var(
40
+ _js_expr=_js_expr,
40
41
  _var_type=_var_type,
41
- _var_is_local=False,
42
- _var_is_string=False,
43
42
  _var_data=VarData(
44
43
  imports=color_mode_imports,
45
- hooks={f"const {{ {_var_name} }} = useContext(ColorModeContext)": None},
44
+ hooks={f"const {{ {_js_expr} }} = useContext(ColorModeContext)": None},
46
45
  ),
47
- )
46
+ ).guess_type()
48
47
 
49
48
 
50
49
  @CallableVar
51
50
  def set_color_mode(
52
51
  new_color_mode: LiteralColorMode | Var[LiteralColorMode] | None = None,
53
- ) -> BaseVar[EventChain]:
52
+ ) -> Var[EventChain]:
54
53
  """Create an EventChain Var that sets the color mode to a specific value.
55
54
 
56
55
  Note: `set_color_mode` is not a real event and cannot be triggered from a
@@ -63,27 +62,30 @@ def set_color_mode(
63
62
  The EventChain Var that can be passed to an event trigger.
64
63
  """
65
64
  base_setter = _color_mode_var(
66
- _var_name=constants.ColorMode.SET,
65
+ _js_expr=constants.ColorMode.SET,
67
66
  _var_type=EventChain,
68
67
  )
69
68
  if new_color_mode is None:
70
69
  return base_setter
71
70
 
72
71
  if not isinstance(new_color_mode, Var):
73
- new_color_mode = Var.create_safe(new_color_mode, _var_is_string=True)
74
- return base_setter._replace(
75
- _var_name=f"() => {base_setter._var_name}({new_color_mode._var_name_unwrapped})",
76
- merge_var_data=new_color_mode._var_data,
77
- )
72
+ new_color_mode = LiteralVar.create(new_color_mode)
73
+
74
+ return Var(
75
+ f"() => {str(base_setter)}({str(new_color_mode)})",
76
+ _var_data=VarData.merge(
77
+ base_setter._get_all_var_data(), new_color_mode._get_all_var_data()
78
+ ),
79
+ ).to(FunctionVar, EventChain) # type: ignore
78
80
 
79
81
 
80
82
  # Var resolves to the current color mode for the app ("light", "dark" or "system")
81
- color_mode = _color_mode_var(_var_name=constants.ColorMode.NAME)
83
+ color_mode = _color_mode_var(_js_expr=constants.ColorMode.NAME)
82
84
  # Var resolves to the resolved color mode for the app ("light" or "dark")
83
- resolved_color_mode = _color_mode_var(_var_name=constants.ColorMode.RESOLVED_NAME)
85
+ resolved_color_mode = _color_mode_var(_js_expr=constants.ColorMode.RESOLVED_NAME)
84
86
  # Var resolves to a function invocation that toggles the color mode
85
87
  toggle_color_mode = _color_mode_var(
86
- _var_name=constants.ColorMode.TOGGLE,
88
+ _js_expr=constants.ColorMode.TOGGLE,
87
89
  _var_type=EventChain,
88
90
  )
89
91
 
@@ -111,7 +113,9 @@ def media_query(breakpoint_expr: str):
111
113
  return f"@media screen and (min-width: {breakpoint_expr})"
112
114
 
113
115
 
114
- def convert_item(style_item: str | Var) -> tuple[str, VarData | None]:
116
+ def convert_item(
117
+ style_item: int | str | Var,
118
+ ) -> tuple[str | Var, VarData | None]:
115
119
  """Format a single value in a style dictionary.
116
120
 
117
121
  Args:
@@ -119,23 +123,31 @@ def convert_item(style_item: str | Var) -> tuple[str, VarData | None]:
119
123
 
120
124
  Returns:
121
125
  The formatted style item and any associated VarData.
126
+
127
+ Raises:
128
+ ReflexError: If an EventHandler is used as a style value
122
129
  """
130
+ if isinstance(style_item, EventHandler):
131
+ raise ReflexError(
132
+ "EventHandlers cannot be used as style values. "
133
+ "Please use a Var or a literal value."
134
+ )
135
+
123
136
  if isinstance(style_item, Var):
124
- # If the value is a Var, extract the var_data and cast as str.
125
- return str(style_item), style_item._var_data
137
+ return style_item, style_item._get_all_var_data()
126
138
 
127
- # Otherwise, convert to Var to collapse VarData encoded in f-string.
128
- new_var = Var.create(style_item, _var_is_string=False)
129
- if new_var is not None and new_var._var_data:
130
- # The wrapped backtick is used to identify the Var for interpolation.
131
- return f"`{str(new_var)}`", new_var._var_data
139
+ # if isinstance(style_item, str) and REFLEX_VAR_OPENING_TAG not in style_item:
140
+ # return style_item, None
132
141
 
133
- return style_item, None
142
+ # Otherwise, convert to Var to collapse VarData encoded in f-string.
143
+ new_var = LiteralVar.create(style_item)
144
+ var_data = new_var._get_all_var_data() if new_var is not None else None
145
+ return new_var, var_data
134
146
 
135
147
 
136
148
  def convert_list(
137
149
  responsive_list: list[str | dict | Var],
138
- ) -> tuple[list[str | dict], VarData | None]:
150
+ ) -> tuple[list[str | dict[str, Var | list | dict]], VarData | None]:
139
151
  """Format a responsive value list.
140
152
 
141
153
  Args:
@@ -157,7 +169,9 @@ def convert_list(
157
169
  return converted_value, VarData.merge(*item_var_datas)
158
170
 
159
171
 
160
- def convert(style_dict):
172
+ def convert(
173
+ style_dict: dict[str, Var | dict | list | str],
174
+ ) -> tuple[dict[str, str | list | dict], VarData | None]:
161
175
  """Format a style dictionary.
162
176
 
163
177
  Args:
@@ -175,7 +189,11 @@ def convert(style_dict):
175
189
 
176
190
  for key, value in style_dict.items():
177
191
  keys = format_style_key(key)
178
- if isinstance(value, dict):
192
+ if isinstance(value, Var):
193
+ return_val = value
194
+ new_var_data = value._get_all_var_data()
195
+ update_out_dict(return_val, keys)
196
+ elif isinstance(value, dict):
179
197
  # Recursively format nested style dictionaries.
180
198
  return_val, new_var_data = convert(value)
181
199
  update_out_dict(return_val, keys)
@@ -254,10 +272,10 @@ class Style(dict):
254
272
  value: The value to set.
255
273
  """
256
274
  # Create a Var to collapse VarData encoded in f-string.
257
- _var = Var.create(value, _var_is_string=False)
275
+ _var = LiteralVar.create(value)
258
276
  if _var is not None:
259
277
  # Carry the imports/hooks when setting a Var as a value.
260
- self._var_data = VarData.merge(self._var_data, _var._var_data)
278
+ self._var_data = VarData.merge(self._var_data, _var._get_all_var_data())
261
279
  super().__setitem__(key, value)
262
280
 
263
281
 
@@ -272,7 +290,6 @@ def _format_emotion_style_pseudo_selector(key: str) -> str:
272
290
  """
273
291
  prefix = None
274
292
  if key.startswith("_"):
275
- # Handle pseudo selectors in chakra style format.
276
293
  prefix = "&:"
277
294
  key = key[1:]
278
295
  if key.startswith(":"):
reflex/testing.py CHANGED
@@ -45,6 +45,8 @@ import reflex.utils.prerequisites
45
45
  import reflex.utils.processes
46
46
  from reflex.state import (
47
47
  BaseState,
48
+ StateManager,
49
+ StateManagerDisk,
48
50
  StateManagerMemory,
49
51
  StateManagerRedis,
50
52
  reload_state_module,
@@ -126,7 +128,7 @@ class AppHarness:
126
128
  frontend_output_thread: Optional[threading.Thread] = None
127
129
  backend_thread: Optional[threading.Thread] = None
128
130
  backend: Optional[uvicorn.Server] = None
129
- state_manager: Optional[StateManagerMemory | StateManagerRedis] = None
131
+ state_manager: Optional[StateManager] = None
130
132
  _frontends: list["WebDriver"] = dataclasses.field(default_factory=list)
131
133
  _decorated_pages: list = dataclasses.field(default_factory=list)
132
134
 
@@ -290,6 +292,8 @@ class AppHarness:
290
292
  if isinstance(self.app_instance._state_manager, StateManagerRedis):
291
293
  # Create our own redis connection for testing.
292
294
  self.state_manager = StateManagerRedis.create(self.app_instance.state)
295
+ elif isinstance(self.app_instance._state_manager, StateManagerDisk):
296
+ self.state_manager = StateManagerDisk.create(self.app_instance.state)
293
297
  else:
294
298
  self.state_manager = self.app_instance._state_manager
295
299
 
@@ -327,7 +331,8 @@ class AppHarness:
327
331
  )
328
332
  )
329
333
  self.backend.shutdown = self._get_backend_shutdown_handler()
330
- self.backend_thread = threading.Thread(target=self.backend.run)
334
+ with chdir(self.app_path):
335
+ self.backend_thread = threading.Thread(target=self.backend.run)
331
336
  self.backend_thread.start()
332
337
 
333
338
  async def _reset_backend_state_manager(self):
@@ -787,7 +792,7 @@ class AppHarness:
787
792
  raise RuntimeError("App is not running.")
788
793
  state_manager = self.app_instance.state_manager
789
794
  assert isinstance(
790
- state_manager, StateManagerMemory
795
+ state_manager, (StateManagerMemory, StateManagerDisk)
791
796
  ), "Only works with memory state manager"
792
797
  if not self._poll_for(
793
798
  target=lambda: state_manager.states,
@@ -79,3 +79,35 @@ class LockExpiredError(ReflexError):
79
79
 
80
80
  class MatchTypeError(ReflexError, TypeError):
81
81
  """Raised when the return types of match cases are different."""
82
+
83
+
84
+ class EventHandlerArgMismatch(ReflexError, TypeError):
85
+ """Raised when the number of args accepted by an EventHandler is differs from that provided by the event trigger."""
86
+
87
+
88
+ class EventFnArgMismatch(ReflexError, TypeError):
89
+ """Raised when the number of args accepted by a lambda differs from that provided by the event trigger."""
90
+
91
+
92
+ class DynamicRouteArgShadowsStateVar(ReflexError, NameError):
93
+ """Raised when a dynamic route arg shadows a state var."""
94
+
95
+
96
+ class ComputedVarShadowsStateVar(ReflexError, NameError):
97
+ """Raised when a computed var shadows a state var."""
98
+
99
+
100
+ class ComputedVarShadowsBaseVars(ReflexError, NameError):
101
+ """Raised when a computed var shadows a base var."""
102
+
103
+
104
+ class EventHandlerShadowsBuiltInStateMethod(ReflexError, NameError):
105
+ """Raised when an event handler shadows a built-in state method."""
106
+
107
+
108
+ class GeneratedCodeHasNoFunctionDefs(ReflexError):
109
+ """Raised when refactored code generated with flexgen has no functions defined."""
110
+
111
+
112
+ class PrimitiveUnserializableToJSON(ReflexError, ValueError):
113
+ """Raised when a primitive type is unserializable to JSON. Usually with NaN and Infinity."""
reflex/utils/exec.py CHANGED
@@ -18,22 +18,11 @@ from reflex import constants
18
18
  from reflex.config import get_config
19
19
  from reflex.utils import console, path_ops
20
20
  from reflex.utils.prerequisites import get_web_dir
21
- from reflex.utils.watch import AssetFolderWatch
22
21
 
23
22
  # For uvicorn windows bug fix (#2335)
24
23
  frontend_process = None
25
24
 
26
25
 
27
- def start_watching_assets_folder(root):
28
- """Start watching assets folder.
29
-
30
- Args:
31
- root: root path of the project.
32
- """
33
- asset_watch = AssetFolderWatch(root)
34
- asset_watch.start()
35
-
36
-
37
26
  def detect_package_change(json_file_path: str) -> str:
38
27
  """Calculates the SHA-256 hash of a JSON file and returns it as a hexadecimal string.
39
28
 
@@ -149,8 +138,6 @@ def run_frontend(root: Path, port: str, backend_present=True):
149
138
  """
150
139
  from reflex.utils import prerequisites
151
140
 
152
- # Start watching asset folder.
153
- start_watching_assets_folder(root)
154
141
  # validate dependencies before run
155
142
  prerequisites.validate_frontend_dependencies(init=False)
156
143
 
@@ -215,7 +202,6 @@ def run_backend(
215
202
  log_level=loglevel.value,
216
203
  reload=True,
217
204
  reload_dirs=[config.app_name],
218
- reload_excludes=[str(web_dir)],
219
205
  )
220
206
 
221
207