reflex 0.6.8a2__py3-none-any.whl → 0.7.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 (247) hide show
  1. reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +1 -1
  2. reflex/.templates/jinja/web/pages/_app.js.jinja2 +7 -7
  3. reflex/.templates/jinja/web/pages/utils.js.jinja2 +3 -3
  4. reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +1 -4
  5. reflex/.templates/web/utils/state.js +65 -36
  6. reflex/__init__.py +4 -17
  7. reflex/__init__.pyi +1 -2
  8. reflex/app.py +286 -129
  9. reflex/app_mixins/lifespan.py +9 -9
  10. reflex/app_mixins/middleware.py +6 -6
  11. reflex/app_module_for_backend.py +3 -7
  12. reflex/base.py +7 -7
  13. reflex/compiler/compiler.py +8 -0
  14. reflex/compiler/utils.py +57 -18
  15. reflex/components/base/app_wrap.pyi +16 -16
  16. reflex/components/base/bare.py +1 -1
  17. reflex/components/base/body.pyi +16 -16
  18. reflex/components/base/document.pyi +76 -76
  19. reflex/components/base/error_boundary.py +2 -1
  20. reflex/components/base/error_boundary.pyi +19 -22
  21. reflex/components/base/fragment.pyi +16 -16
  22. reflex/components/base/head.pyi +31 -31
  23. reflex/components/base/link.pyi +31 -31
  24. reflex/components/base/meta.py +2 -2
  25. reflex/components/base/meta.pyi +61 -61
  26. reflex/components/base/script.pyi +19 -19
  27. reflex/components/base/strict_mode.py +10 -0
  28. reflex/components/base/strict_mode.pyi +57 -0
  29. reflex/components/component.py +38 -77
  30. reflex/components/core/banner.py +159 -4
  31. reflex/components/core/banner.pyi +162 -76
  32. reflex/components/core/breakpoints.py +3 -1
  33. reflex/components/core/client_side_routing.py +1 -1
  34. reflex/components/core/client_side_routing.pyi +32 -32
  35. reflex/components/core/clipboard.pyi +17 -20
  36. reflex/components/core/cond.py +9 -10
  37. reflex/components/core/debounce.py +1 -1
  38. reflex/components/core/debounce.pyi +17 -17
  39. reflex/components/core/foreach.py +28 -3
  40. reflex/components/core/html.py +1 -1
  41. reflex/components/core/html.pyi +16 -16
  42. reflex/components/core/match.py +5 -5
  43. reflex/components/core/sticky.py +134 -0
  44. reflex/components/core/sticky.pyi +449 -0
  45. reflex/components/core/upload.py +2 -2
  46. reflex/components/core/upload.pyi +80 -88
  47. reflex/components/datadisplay/code.py +5 -14
  48. reflex/components/datadisplay/code.pyi +31 -31
  49. reflex/components/datadisplay/dataeditor.py +7 -4
  50. reflex/components/datadisplay/dataeditor.pyi +40 -54
  51. reflex/components/datadisplay/logo.py +13 -8
  52. reflex/components/datadisplay/shiki_code_block.py +14 -9
  53. reflex/components/datadisplay/shiki_code_block.pyi +46 -46
  54. reflex/components/dynamic.py +22 -3
  55. reflex/components/el/constants/reflex.py +1 -1
  56. reflex/components/el/element.py +1 -1
  57. reflex/components/el/element.pyi +16 -16
  58. reflex/components/el/elements/base.pyi +16 -16
  59. reflex/components/el/elements/forms.py +4 -4
  60. reflex/components/el/elements/forms.pyi +224 -258
  61. reflex/components/el/elements/inline.pyi +421 -421
  62. reflex/components/el/elements/media.pyi +376 -376
  63. reflex/components/el/elements/metadata.pyi +91 -91
  64. reflex/components/el/elements/other.pyi +106 -106
  65. reflex/components/el/elements/scripts.pyi +46 -46
  66. reflex/components/el/elements/sectioning.pyi +226 -226
  67. reflex/components/el/elements/tables.pyi +151 -151
  68. reflex/components/el/elements/typography.pyi +226 -226
  69. reflex/components/gridjs/datatable.pyi +31 -31
  70. reflex/components/lucide/icon.py +46 -8
  71. reflex/components/lucide/icon.pyi +85 -31
  72. reflex/components/markdown/markdown.py +10 -8
  73. reflex/components/markdown/markdown.pyi +16 -16
  74. reflex/components/moment/moment.py +2 -2
  75. reflex/components/moment/moment.pyi +17 -19
  76. reflex/components/next/base.pyi +16 -16
  77. reflex/components/next/image.py +16 -4
  78. reflex/components/next/image.pyi +22 -20
  79. reflex/components/next/link.py +1 -1
  80. reflex/components/next/link.pyi +16 -16
  81. reflex/components/next/video.pyi +16 -16
  82. reflex/components/plotly/__init__.py +29 -2
  83. reflex/components/plotly/plotly.py +240 -5
  84. reflex/components/plotly/plotly.pyi +799 -44
  85. reflex/components/props.py +3 -3
  86. reflex/components/radix/__init__.pyi +1 -1
  87. reflex/components/radix/primitives/accordion.py +9 -5
  88. reflex/components/radix/primitives/accordion.pyi +110 -108
  89. reflex/components/radix/primitives/base.pyi +31 -31
  90. reflex/components/radix/primitives/drawer.py +5 -2
  91. reflex/components/radix/primitives/drawer.pyi +179 -187
  92. reflex/components/radix/primitives/form.pyi +160 -172
  93. reflex/components/radix/primitives/progress.py +1 -1
  94. reflex/components/radix/primitives/progress.pyi +76 -76
  95. reflex/components/radix/primitives/slider.py +1 -1
  96. reflex/components/radix/primitives/slider.pyi +78 -82
  97. reflex/components/radix/themes/base.pyi +121 -121
  98. reflex/components/radix/themes/color_mode.py +11 -9
  99. reflex/components/radix/themes/color_mode.pyi +47 -49
  100. reflex/components/radix/themes/components/alert_dialog.py +3 -0
  101. reflex/components/radix/themes/components/alert_dialog.pyi +110 -112
  102. reflex/components/radix/themes/components/aspect_ratio.pyi +16 -16
  103. reflex/components/radix/themes/components/avatar.pyi +16 -16
  104. reflex/components/radix/themes/components/badge.pyi +16 -16
  105. reflex/components/radix/themes/components/button.pyi +16 -16
  106. reflex/components/radix/themes/components/callout.pyi +76 -76
  107. reflex/components/radix/themes/components/card.py +1 -1
  108. reflex/components/radix/themes/components/card.pyi +17 -17
  109. reflex/components/radix/themes/components/checkbox.pyi +49 -55
  110. reflex/components/radix/themes/components/checkbox_cards.pyi +31 -31
  111. reflex/components/radix/themes/components/checkbox_group.pyi +31 -31
  112. reflex/components/radix/themes/components/context_menu.py +5 -0
  113. reflex/components/radix/themes/components/context_menu.pyi +149 -155
  114. reflex/components/radix/themes/components/data_list.pyi +61 -61
  115. reflex/components/radix/themes/components/dialog.py +3 -0
  116. reflex/components/radix/themes/components/dialog.pyi +113 -117
  117. reflex/components/radix/themes/components/dropdown_menu.py +5 -0
  118. reflex/components/radix/themes/components/dropdown_menu.pyi +133 -137
  119. reflex/components/radix/themes/components/hover_card.py +3 -0
  120. reflex/components/radix/themes/components/hover_card.pyi +63 -67
  121. reflex/components/radix/themes/components/icon_button.py +2 -2
  122. reflex/components/radix/themes/components/icon_button.pyi +17 -16
  123. reflex/components/radix/themes/components/inset.pyi +16 -16
  124. reflex/components/radix/themes/components/popover.py +3 -0
  125. reflex/components/radix/themes/components/popover.pyi +68 -70
  126. reflex/components/radix/themes/components/progress.pyi +16 -16
  127. reflex/components/radix/themes/components/radio.pyi +16 -16
  128. reflex/components/radix/themes/components/radio_cards.py +2 -0
  129. reflex/components/radix/themes/components/radio_cards.pyi +32 -34
  130. reflex/components/radix/themes/components/radio_group.py +1 -1
  131. reflex/components/radix/themes/components/radio_group.pyi +62 -64
  132. reflex/components/radix/themes/components/scroll_area.pyi +16 -16
  133. reflex/components/radix/themes/components/segmented_control.pyi +32 -35
  134. reflex/components/radix/themes/components/select.py +4 -0
  135. reflex/components/radix/themes/components/select.pyi +145 -157
  136. reflex/components/radix/themes/components/separator.pyi +16 -16
  137. reflex/components/radix/themes/components/skeleton.py +3 -0
  138. reflex/components/radix/themes/components/skeleton.pyi +16 -16
  139. reflex/components/radix/themes/components/slider.pyi +22 -28
  140. reflex/components/radix/themes/components/spinner.pyi +16 -16
  141. reflex/components/radix/themes/components/switch.pyi +17 -19
  142. reflex/components/radix/themes/components/table.pyi +106 -106
  143. reflex/components/radix/themes/components/tabs.py +3 -0
  144. reflex/components/radix/themes/components/tabs.pyi +78 -82
  145. reflex/components/radix/themes/components/text_area.py +12 -0
  146. reflex/components/radix/themes/components/text_area.pyi +21 -33
  147. reflex/components/radix/themes/components/text_field.py +1 -1
  148. reflex/components/radix/themes/components/text_field.pyi +52 -80
  149. reflex/components/radix/themes/components/tooltip.py +6 -1
  150. reflex/components/radix/themes/components/tooltip.pyi +20 -21
  151. reflex/components/radix/themes/layout/__init__.pyi +1 -1
  152. reflex/components/radix/themes/layout/base.pyi +16 -16
  153. reflex/components/radix/themes/layout/box.pyi +16 -16
  154. reflex/components/radix/themes/layout/center.pyi +16 -16
  155. reflex/components/radix/themes/layout/container.pyi +16 -16
  156. reflex/components/radix/themes/layout/flex.pyi +16 -16
  157. reflex/components/radix/themes/layout/grid.pyi +16 -16
  158. reflex/components/radix/themes/layout/list.py +2 -2
  159. reflex/components/radix/themes/layout/list.pyi +76 -76
  160. reflex/components/radix/themes/layout/section.pyi +16 -16
  161. reflex/components/radix/themes/layout/spacer.pyi +16 -16
  162. reflex/components/radix/themes/layout/stack.py +2 -2
  163. reflex/components/radix/themes/layout/stack.pyi +46 -46
  164. reflex/components/radix/themes/typography/blockquote.pyi +16 -16
  165. reflex/components/radix/themes/typography/code.pyi +16 -16
  166. reflex/components/radix/themes/typography/heading.pyi +16 -16
  167. reflex/components/radix/themes/typography/link.py +1 -1
  168. reflex/components/radix/themes/typography/link.pyi +16 -16
  169. reflex/components/radix/themes/typography/text.py +2 -2
  170. reflex/components/radix/themes/typography/text.pyi +106 -106
  171. reflex/components/react_player/audio.pyi +33 -39
  172. reflex/components/react_player/react_player.py +1 -1
  173. reflex/components/react_player/react_player.pyi +32 -38
  174. reflex/components/react_player/video.pyi +33 -39
  175. reflex/components/recharts/__init__.py +2 -0
  176. reflex/components/recharts/__init__.pyi +2 -0
  177. reflex/components/recharts/cartesian.pyi +282 -282
  178. reflex/components/recharts/charts.py +15 -15
  179. reflex/components/recharts/charts.pyi +164 -164
  180. reflex/components/recharts/general.py +19 -4
  181. reflex/components/recharts/general.pyi +132 -81
  182. reflex/components/recharts/polar.py +2 -2
  183. reflex/components/recharts/polar.pyi +55 -55
  184. reflex/components/recharts/recharts.py +4 -4
  185. reflex/components/recharts/recharts.pyi +31 -31
  186. reflex/components/sonner/toast.py +15 -13
  187. reflex/components/sonner/toast.pyi +22 -22
  188. reflex/components/suneditor/editor.py +6 -4
  189. reflex/components/suneditor/editor.pyi +26 -40
  190. reflex/components/tags/iter_tag.py +3 -3
  191. reflex/components/tags/tag.py +25 -3
  192. reflex/config.py +48 -15
  193. reflex/constants/__init__.py +1 -0
  194. reflex/constants/base.py +4 -1
  195. reflex/constants/compiler.py +5 -2
  196. reflex/constants/config.py +8 -1
  197. reflex/constants/installer.py +9 -9
  198. reflex/constants/style.py +1 -1
  199. reflex/custom_components/custom_components.py +18 -10
  200. reflex/event.py +221 -231
  201. reflex/experimental/__init__.py +19 -11
  202. reflex/experimental/client_state.py +53 -28
  203. reflex/experimental/hooks.py +5 -5
  204. reflex/experimental/layout.py +8 -5
  205. reflex/experimental/layout.pyi +79 -83
  206. reflex/experimental/misc.py +3 -3
  207. reflex/istate/wrappers.py +1 -1
  208. reflex/middleware/hydrate_middleware.py +2 -2
  209. reflex/model.py +11 -6
  210. reflex/page.py +5 -5
  211. reflex/reflex.py +104 -26
  212. reflex/route.py +1 -1
  213. reflex/state.py +358 -401
  214. reflex/style.py +27 -3
  215. reflex/testing.py +29 -23
  216. reflex/utils/build.py +6 -2
  217. reflex/utils/codespaces.py +1 -4
  218. reflex/utils/compat.py +6 -5
  219. reflex/utils/console.py +71 -16
  220. reflex/utils/exceptions.py +89 -26
  221. reflex/utils/exec.py +69 -74
  222. reflex/utils/export.py +6 -1
  223. reflex/utils/format.py +8 -40
  224. reflex/utils/imports.py +5 -2
  225. reflex/utils/lazy_loader.py +7 -1
  226. reflex/utils/path_ops.py +74 -14
  227. reflex/utils/prerequisites.py +345 -68
  228. reflex/utils/processes.py +45 -32
  229. reflex/utils/pyi_generator.py +39 -33
  230. reflex/utils/registry.py +4 -4
  231. reflex/utils/serializers.py +1 -1
  232. reflex/utils/telemetry.py +5 -4
  233. reflex/utils/types.py +42 -18
  234. reflex/vars/base.py +695 -330
  235. reflex/vars/datetime.py +6 -7
  236. reflex/vars/dep_tracking.py +344 -0
  237. reflex/vars/function.py +11 -5
  238. reflex/vars/number.py +31 -43
  239. reflex/vars/object.py +74 -64
  240. reflex/vars/sequence.py +79 -67
  241. {reflex-0.6.8a2.dist-info → reflex-0.7.0.dist-info}/METADATA +7 -8
  242. reflex-0.7.0.dist-info/RECORD +401 -0
  243. {reflex-0.6.8a2.dist-info → reflex-0.7.0.dist-info}/WHEEL +1 -1
  244. reflex/experimental/assets.py +0 -37
  245. reflex-0.6.8a2.dist-info/RECORD +0 -397
  246. {reflex-0.6.8a2.dist-info → reflex-0.7.0.dist-info}/LICENSE +0 -0
  247. {reflex-0.6.8a2.dist-info → reflex-0.7.0.dist-info}/entry_points.txt +0 -0
@@ -9,21 +9,29 @@ from reflex.components.sonner.toast import toast as toast
9
9
 
10
10
  from ..utils.console import warn
11
11
  from . import hooks as hooks
12
- from .assets import asset as asset
13
12
  from .client_state import ClientStateVar as ClientStateVar
14
13
  from .layout import layout as layout
15
14
  from .misc import run_in_thread as run_in_thread
16
15
 
17
- warn(
18
- "`rx._x` contains experimental features and might be removed at any time in the future .",
19
- )
20
-
21
- _EMITTED_PROMOTION_WARNINGS = set()
22
-
23
16
 
24
17
  class ExperimentalNamespace(SimpleNamespace):
25
18
  """Namespace for experimental features."""
26
19
 
20
+ def __getattribute__(self, item: str):
21
+ """Get attribute from the namespace.
22
+
23
+ Args:
24
+ item: attribute name.
25
+
26
+ Returns:
27
+ The attribute.
28
+ """
29
+ warn(
30
+ "`rx._x` contains experimental features and might be removed at any time in the future.",
31
+ dedupe=True,
32
+ )
33
+ return super().__getattribute__(item)
34
+
27
35
  @property
28
36
  def toast(self):
29
37
  """Temporary property returning the toast namespace.
@@ -56,13 +64,13 @@ class ExperimentalNamespace(SimpleNamespace):
56
64
  Args:
57
65
  component_name: name of the component.
58
66
  """
59
- if component_name not in _EMITTED_PROMOTION_WARNINGS:
60
- _EMITTED_PROMOTION_WARNINGS.add(component_name)
61
- warn(f"`rx._x.{component_name}` was promoted to `rx.{component_name}`.")
67
+ warn(
68
+ f"`rx._x.{component_name}` was promoted to `rx.{component_name}`.",
69
+ dedupe=True,
70
+ )
62
71
 
63
72
 
64
73
  _x = ExperimentalNamespace(
65
- asset=asset,
66
74
  client_state=ClientStateVar.create,
67
75
  hooks=hooks,
68
76
  layout=layout,
@@ -4,7 +4,6 @@ from __future__ import annotations
4
4
 
5
5
  import dataclasses
6
6
  import re
7
- import sys
8
7
  from typing import Any, Callable, Union
9
8
 
10
9
  from reflex import constants
@@ -34,10 +33,22 @@ def _client_state_ref(var_name: str) -> str:
34
33
  return f"refs['_client_state_{var_name}']"
35
34
 
36
35
 
36
+ def _client_state_ref_dict(var_name: str) -> str:
37
+ """Get the ref path for a ClientStateVar.
38
+
39
+ Args:
40
+ var_name: The name of the variable.
41
+
42
+ Returns:
43
+ An accessor for ClientStateVar ref as a string.
44
+ """
45
+ return f"refs['_client_state_dict_{var_name}']"
46
+
47
+
37
48
  @dataclasses.dataclass(
38
49
  eq=False,
39
50
  frozen=True,
40
- **{"slots": True} if sys.version_info >= (3, 10) else {},
51
+ slots=True,
41
52
  )
42
53
  class ClientStateVar(Var):
43
54
  """A Var that exists on the client via useState."""
@@ -115,10 +126,41 @@ class ClientStateVar(Var):
115
126
  "react": [ImportVar(tag="useState"), ImportVar(tag="useId")],
116
127
  }
117
128
  if global_ref:
118
- hooks[f"{_client_state_ref(var_name)} ??= {{}}"] = None
119
- hooks[f"{_client_state_ref(setter_name)} ??= {{}}"] = None
120
- hooks[f"{_client_state_ref(var_name)}[{id_name}] = {var_name}"] = None
121
- hooks[f"{_client_state_ref(setter_name)}[{id_name}] = {setter_name}"] = None
129
+ arg_name = get_unique_variable_name()
130
+ func = ArgsFunctionOperationBuilder.create(
131
+ args_names=(arg_name,),
132
+ return_expr=Var("Array.prototype.forEach.call")
133
+ .to(FunctionVar)
134
+ .call(
135
+ (
136
+ Var("Object.values")
137
+ .to(FunctionVar)
138
+ .call(Var(_client_state_ref_dict(setter_name)))
139
+ .to(list)
140
+ .to(list)
141
+ )
142
+ + Var.create(
143
+ [
144
+ Var(
145
+ f"(value) => {{ {_client_state_ref(var_name)} = value; }}"
146
+ )
147
+ ]
148
+ ).to(list),
149
+ ArgsFunctionOperationBuilder.create(
150
+ args_names=("setter",),
151
+ return_expr=Var("setter").to(FunctionVar).call(Var(arg_name)),
152
+ ),
153
+ ),
154
+ )
155
+
156
+ hooks[f"{_client_state_ref(setter_name)} = {func!s}"] = None
157
+ hooks[f"{_client_state_ref(var_name)} ??= {var_name!s}"] = None
158
+ hooks[f"{_client_state_ref_dict(var_name)} ??= {{}}"] = None
159
+ hooks[f"{_client_state_ref_dict(setter_name)} ??= {{}}"] = None
160
+ hooks[f"{_client_state_ref_dict(var_name)}[{id_name}] = {var_name}"] = None
161
+ hooks[
162
+ f"{_client_state_ref_dict(setter_name)}[{id_name}] = {setter_name}"
163
+ ] = None
122
164
  imports.update(_refs_import)
123
165
  return cls(
124
166
  _js_expr="",
@@ -150,7 +192,7 @@ class ClientStateVar(Var):
150
192
  return (
151
193
  Var(
152
194
  _js_expr=(
153
- _client_state_ref(self._getter_name) + f"[{self._id_name}]"
195
+ _client_state_ref_dict(self._getter_name) + f"[{self._id_name}]"
154
196
  if self._global_ref
155
197
  else self._getter_name
156
198
  ),
@@ -158,9 +200,7 @@ class ClientStateVar(Var):
158
200
  )
159
201
  .to(self._var_type)
160
202
  ._replace(
161
- merge_var_data=VarData( # type: ignore
162
- imports=_refs_import if self._global_ref else {}
163
- )
203
+ merge_var_data=VarData(imports=_refs_import if self._global_ref else {})
164
204
  )
165
205
  )
166
206
 
@@ -179,26 +219,11 @@ class ClientStateVar(Var):
179
219
  """
180
220
  _var_data = VarData(imports=_refs_import if self._global_ref else {})
181
221
 
182
- arg_name = get_unique_variable_name()
183
222
  setter = (
184
- ArgsFunctionOperationBuilder.create(
185
- args_names=(arg_name,),
186
- return_expr=Var("Array.prototype.forEach.call")
187
- .to(FunctionVar)
188
- .call(
189
- Var("Object.values")
190
- .to(FunctionVar)
191
- .call(Var(_client_state_ref(self._setter_name))),
192
- ArgsFunctionOperationBuilder.create(
193
- args_names=("setter",),
194
- return_expr=Var("setter").to(FunctionVar).call(Var(arg_name)),
195
- ),
196
- ),
197
- _var_data=_var_data,
198
- )
223
+ Var(_client_state_ref(self._setter_name))
199
224
  if self._global_ref
200
- else Var(self._setter_name, _var_data=_var_data).to(FunctionVar)
201
- )
225
+ else Var(self._setter_name, _var_data=_var_data)
226
+ ).to(FunctionVar)
202
227
 
203
228
  if value is not NoValue:
204
229
  # This is a hack to make it work like an EventSpec taking an arg
@@ -11,7 +11,7 @@ def _compose_react_imports(tags: list[str]) -> dict[str, list[ImportVar]]:
11
11
  return {"react": [ImportVar(tag=tag) for tag in tags]}
12
12
 
13
13
 
14
- def const(name, value) -> Var:
14
+ def const(name: str | list[str], value: str | Var) -> Var:
15
15
  """Create a constant Var.
16
16
 
17
17
  Args:
@@ -26,7 +26,7 @@ def const(name, value) -> Var:
26
26
  return Var(_js_expr=f"const {name} = {value}")
27
27
 
28
28
 
29
- def useCallback(func, deps) -> Var:
29
+ def useCallback(func: str, deps: list) -> Var: # noqa: N802
30
30
  """Create a useCallback hook with a function and dependencies.
31
31
 
32
32
  Args:
@@ -42,7 +42,7 @@ def useCallback(func, deps) -> Var:
42
42
  )
43
43
 
44
44
 
45
- def useContext(context) -> Var:
45
+ def useContext(context: str) -> Var: # noqa: N802
46
46
  """Create a useContext hook with a context.
47
47
 
48
48
  Args:
@@ -57,7 +57,7 @@ def useContext(context) -> Var:
57
57
  )
58
58
 
59
59
 
60
- def useRef(default) -> Var:
60
+ def useRef(default: str) -> Var: # noqa: N802
61
61
  """Create a useRef hook with a default value.
62
62
 
63
63
  Args:
@@ -72,7 +72,7 @@ def useRef(default) -> Var:
72
72
  )
73
73
 
74
74
 
75
- def useState(var_name, default=None) -> Var:
75
+ def useState(var_name: str, default: str | None = None) -> Var: # noqa: N802
76
76
  """Create a useState hook with a variable name and setter name.
77
77
 
78
78
  Args:
@@ -12,6 +12,7 @@ from reflex.components.radix.themes.components.icon_button import IconButton
12
12
  from reflex.components.radix.themes.layout.box import Box
13
13
  from reflex.components.radix.themes.layout.container import Container
14
14
  from reflex.components.radix.themes.layout.stack import HStack
15
+ from reflex.constants.compiler import MemoizationMode
15
16
  from reflex.event import run_script
16
17
  from reflex.experimental import hooks
17
18
  from reflex.state import ComponentState
@@ -44,10 +45,10 @@ class Sidebar(Box, MemoizationLeaf):
44
45
  Returns:
45
46
  The style of the component.
46
47
  """
47
- sidebar: Component = self.children[-2] # type: ignore
48
- spacer: Component = self.children[-1] # type: ignore
48
+ sidebar: Component = self.children[-2] # pyright: ignore [reportAssignmentType]
49
+ spacer: Component = self.children[-1] # pyright: ignore [reportAssignmentType]
49
50
  open = (
50
- self.State.open # type: ignore
51
+ self.State.open # pyright: ignore [reportAttributeAccessIssue]
51
52
  if self.State
52
53
  else Var(_js_expr="open")
53
54
  )
@@ -146,6 +147,8 @@ sidebar_trigger_style = {
146
147
  class SidebarTrigger(Fragment):
147
148
  """A component that renders the sidebar trigger."""
148
149
 
150
+ _memoization_mode = MemoizationMode(recursive=False)
151
+
149
152
  @classmethod
150
153
  def create(cls, sidebar: Component, **props):
151
154
  """Create the sidebar trigger component.
@@ -159,11 +162,11 @@ class SidebarTrigger(Fragment):
159
162
  """
160
163
  trigger_props = {**props, **sidebar_trigger_style}
161
164
 
162
- inner_sidebar: Component = sidebar.children[0] # type: ignore
165
+ inner_sidebar: Component = sidebar.children[0] # pyright: ignore [reportAssignmentType]
163
166
  sidebar_width = inner_sidebar.style.get("width")
164
167
 
165
168
  if sidebar.State:
166
- open, toggle = sidebar.State.open, sidebar.State.toggle # type: ignore
169
+ open, toggle = sidebar.State.open, sidebar.State.toggle # pyright: ignore [reportAttributeAccessIssue]
167
170
  else:
168
171
  open, toggle = (
169
172
  Var(_js_expr="open"),
@@ -10,7 +10,7 @@ from reflex.components.base.fragment import Fragment
10
10
  from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf
11
11
  from reflex.components.radix.primitives.drawer import DrawerRoot
12
12
  from reflex.components.radix.themes.layout.box import Box
13
- from reflex.event import BASE_STATE, EventType
13
+ from reflex.event import EventType
14
14
  from reflex.state import ComponentState
15
15
  from reflex.style import Style
16
16
  from reflex.vars.base import Var
@@ -51,21 +51,21 @@ class Sidebar(Box, MemoizationLeaf):
51
51
  class_name: Optional[Any] = None,
52
52
  autofocus: Optional[bool] = None,
53
53
  custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
54
- on_blur: Optional[EventType[[], BASE_STATE]] = None,
55
- on_click: Optional[EventType[[], BASE_STATE]] = None,
56
- on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
57
- on_double_click: Optional[EventType[[], BASE_STATE]] = None,
58
- on_focus: Optional[EventType[[], BASE_STATE]] = None,
59
- on_mount: Optional[EventType[[], BASE_STATE]] = None,
60
- on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
61
- on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
62
- on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
63
- on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
64
- on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
65
- on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
66
- on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
67
- on_scroll: Optional[EventType[[], BASE_STATE]] = None,
68
- on_unmount: Optional[EventType[[], BASE_STATE]] = None,
54
+ on_blur: Optional[EventType[()]] = None,
55
+ on_click: Optional[EventType[()]] = None,
56
+ on_context_menu: Optional[EventType[()]] = None,
57
+ on_double_click: Optional[EventType[()]] = None,
58
+ on_focus: Optional[EventType[()]] = None,
59
+ on_mount: Optional[EventType[()]] = None,
60
+ on_mouse_down: Optional[EventType[()]] = None,
61
+ on_mouse_enter: Optional[EventType[()]] = None,
62
+ on_mouse_leave: Optional[EventType[()]] = None,
63
+ on_mouse_move: Optional[EventType[()]] = None,
64
+ on_mouse_out: Optional[EventType[()]] = None,
65
+ on_mouse_over: Optional[EventType[()]] = None,
66
+ on_mouse_up: Optional[EventType[()]] = None,
67
+ on_scroll: Optional[EventType[()]] = None,
68
+ on_unmount: Optional[EventType[()]] = None,
69
69
  **props,
70
70
  ) -> "Sidebar":
71
71
  """Create the sidebar component.
@@ -109,7 +109,7 @@ class DrawerSidebar(DrawerRoot):
109
109
  snap_points: Optional[List[Union[float, str]]] = None,
110
110
  fade_from_index: Optional[Union[Var[int], int]] = None,
111
111
  scroll_lock_timeout: Optional[Union[Var[int], int]] = None,
112
- preventScrollRestoration: Optional[Union[Var[bool], bool]] = None,
112
+ prevent_scroll_restoration: Optional[Union[Var[bool], bool]] = None,
113
113
  should_scale_background: Optional[Union[Var[bool], bool]] = None,
114
114
  close_threshold: Optional[Union[Var[float], float]] = None,
115
115
  as_child: Optional[Union[Var[bool], bool]] = None,
@@ -119,27 +119,23 @@ class DrawerSidebar(DrawerRoot):
119
119
  class_name: Optional[Any] = None,
120
120
  autofocus: Optional[bool] = None,
121
121
  custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
122
- on_animation_end: Optional[
123
- Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]]
124
- ] = None,
125
- on_blur: Optional[EventType[[], BASE_STATE]] = None,
126
- on_click: Optional[EventType[[], BASE_STATE]] = None,
127
- on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
128
- on_double_click: Optional[EventType[[], BASE_STATE]] = None,
129
- on_focus: Optional[EventType[[], BASE_STATE]] = None,
130
- on_mount: Optional[EventType[[], BASE_STATE]] = None,
131
- on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
132
- on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
133
- on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
134
- on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
135
- on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
136
- on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
137
- on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
138
- on_open_change: Optional[
139
- Union[EventType[[], BASE_STATE], EventType[[bool], BASE_STATE]]
140
- ] = None,
141
- on_scroll: Optional[EventType[[], BASE_STATE]] = None,
142
- on_unmount: Optional[EventType[[], BASE_STATE]] = None,
122
+ on_animation_end: Optional[Union[EventType[()], EventType[bool]]] = None,
123
+ on_blur: Optional[EventType[()]] = None,
124
+ on_click: Optional[EventType[()]] = None,
125
+ on_context_menu: Optional[EventType[()]] = None,
126
+ on_double_click: Optional[EventType[()]] = None,
127
+ on_focus: Optional[EventType[()]] = None,
128
+ on_mount: Optional[EventType[()]] = None,
129
+ on_mouse_down: Optional[EventType[()]] = None,
130
+ on_mouse_enter: Optional[EventType[()]] = None,
131
+ on_mouse_leave: Optional[EventType[()]] = None,
132
+ on_mouse_move: Optional[EventType[()]] = None,
133
+ on_mouse_out: Optional[EventType[()]] = None,
134
+ on_mouse_over: Optional[EventType[()]] = None,
135
+ on_mouse_up: Optional[EventType[()]] = None,
136
+ on_open_change: Optional[Union[EventType[()], EventType[bool]]] = None,
137
+ on_scroll: Optional[EventType[()]] = None,
138
+ on_unmount: Optional[EventType[()]] = None,
143
139
  **props,
144
140
  ) -> "DrawerSidebar":
145
141
  """Create the sidebar component.
@@ -173,21 +169,21 @@ class SidebarTrigger(Fragment):
173
169
  class_name: Optional[Any] = None,
174
170
  autofocus: Optional[bool] = None,
175
171
  custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
176
- on_blur: Optional[EventType[[], BASE_STATE]] = None,
177
- on_click: Optional[EventType[[], BASE_STATE]] = None,
178
- on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
179
- on_double_click: Optional[EventType[[], BASE_STATE]] = None,
180
- on_focus: Optional[EventType[[], BASE_STATE]] = None,
181
- on_mount: Optional[EventType[[], BASE_STATE]] = None,
182
- on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
183
- on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
184
- on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
185
- on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
186
- on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
187
- on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
188
- on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
189
- on_scroll: Optional[EventType[[], BASE_STATE]] = None,
190
- on_unmount: Optional[EventType[[], BASE_STATE]] = None,
172
+ on_blur: Optional[EventType[()]] = None,
173
+ on_click: Optional[EventType[()]] = None,
174
+ on_context_menu: Optional[EventType[()]] = None,
175
+ on_double_click: Optional[EventType[()]] = None,
176
+ on_focus: Optional[EventType[()]] = None,
177
+ on_mount: Optional[EventType[()]] = None,
178
+ on_mouse_down: Optional[EventType[()]] = None,
179
+ on_mouse_enter: Optional[EventType[()]] = None,
180
+ on_mouse_leave: Optional[EventType[()]] = None,
181
+ on_mouse_move: Optional[EventType[()]] = None,
182
+ on_mouse_out: Optional[EventType[()]] = None,
183
+ on_mouse_over: Optional[EventType[()]] = None,
184
+ on_mouse_up: Optional[EventType[()]] = None,
185
+ on_scroll: Optional[EventType[()]] = None,
186
+ on_unmount: Optional[EventType[()]] = None,
191
187
  **props,
192
188
  ) -> "SidebarTrigger":
193
189
  """Create the sidebar trigger component.
@@ -238,21 +234,21 @@ class Layout(Box):
238
234
  class_name: Optional[Any] = None,
239
235
  autofocus: Optional[bool] = None,
240
236
  custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
241
- on_blur: Optional[EventType[[], BASE_STATE]] = None,
242
- on_click: Optional[EventType[[], BASE_STATE]] = None,
243
- on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
244
- on_double_click: Optional[EventType[[], BASE_STATE]] = None,
245
- on_focus: Optional[EventType[[], BASE_STATE]] = None,
246
- on_mount: Optional[EventType[[], BASE_STATE]] = None,
247
- on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
248
- on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
249
- on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
250
- on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
251
- on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
252
- on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
253
- on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
254
- on_scroll: Optional[EventType[[], BASE_STATE]] = None,
255
- on_unmount: Optional[EventType[[], BASE_STATE]] = None,
237
+ on_blur: Optional[EventType[()]] = None,
238
+ on_click: Optional[EventType[()]] = None,
239
+ on_context_menu: Optional[EventType[()]] = None,
240
+ on_double_click: Optional[EventType[()]] = None,
241
+ on_focus: Optional[EventType[()]] = None,
242
+ on_mount: Optional[EventType[()]] = None,
243
+ on_mouse_down: Optional[EventType[()]] = None,
244
+ on_mouse_enter: Optional[EventType[()]] = None,
245
+ on_mouse_leave: Optional[EventType[()]] = None,
246
+ on_mouse_move: Optional[EventType[()]] = None,
247
+ on_mouse_out: Optional[EventType[()]] = None,
248
+ on_mouse_over: Optional[EventType[()]] = None,
249
+ on_mouse_up: Optional[EventType[()]] = None,
250
+ on_scroll: Optional[EventType[()]] = None,
251
+ on_unmount: Optional[EventType[()]] = None,
256
252
  **props,
257
253
  ) -> "Layout":
258
254
  """Create the layout component.
@@ -306,21 +302,21 @@ class LayoutNamespace(ComponentNamespace):
306
302
  class_name: Optional[Any] = None,
307
303
  autofocus: Optional[bool] = None,
308
304
  custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
309
- on_blur: Optional[EventType[[], BASE_STATE]] = None,
310
- on_click: Optional[EventType[[], BASE_STATE]] = None,
311
- on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
312
- on_double_click: Optional[EventType[[], BASE_STATE]] = None,
313
- on_focus: Optional[EventType[[], BASE_STATE]] = None,
314
- on_mount: Optional[EventType[[], BASE_STATE]] = None,
315
- on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
316
- on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
317
- on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
318
- on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
319
- on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
320
- on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
321
- on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
322
- on_scroll: Optional[EventType[[], BASE_STATE]] = None,
323
- on_unmount: Optional[EventType[[], BASE_STATE]] = None,
305
+ on_blur: Optional[EventType[()]] = None,
306
+ on_click: Optional[EventType[()]] = None,
307
+ on_context_menu: Optional[EventType[()]] = None,
308
+ on_double_click: Optional[EventType[()]] = None,
309
+ on_focus: Optional[EventType[()]] = None,
310
+ on_mount: Optional[EventType[()]] = None,
311
+ on_mouse_down: Optional[EventType[()]] = None,
312
+ on_mouse_enter: Optional[EventType[()]] = None,
313
+ on_mouse_leave: Optional[EventType[()]] = None,
314
+ on_mouse_move: Optional[EventType[()]] = None,
315
+ on_mouse_out: Optional[EventType[()]] = None,
316
+ on_mouse_over: Optional[EventType[()]] = None,
317
+ on_mouse_up: Optional[EventType[()]] = None,
318
+ on_scroll: Optional[EventType[()]] = None,
319
+ on_unmount: Optional[EventType[()]] = None,
324
320
  **props,
325
321
  ) -> "Layout":
326
322
  """Create the layout component.
@@ -1,16 +1,16 @@
1
1
  """Miscellaneous functions for the experimental package."""
2
2
 
3
3
  import asyncio
4
- from typing import Any
4
+ from typing import Any, Callable
5
5
 
6
6
 
7
- async def run_in_thread(func) -> Any:
7
+ async def run_in_thread(func: Callable) -> Any:
8
8
  """Run a function in a separate thread.
9
9
 
10
10
  To not block the UI event queue, run_in_thread must be inside inside a rx.event(background=True) decorated method.
11
11
 
12
12
  Args:
13
- func (callable): The non-async function to run.
13
+ func: The non-async function to run.
14
14
 
15
15
  Raises:
16
16
  ValueError: If the function is an async function.
reflex/istate/wrappers.py CHANGED
@@ -6,7 +6,7 @@ from reflex.istate.proxy import ReadOnlyStateProxy
6
6
  from reflex.state import _split_substate_key, _substate_key, get_state_manager
7
7
 
8
8
 
9
- async def get_state(token, state_cls: Any | None = None) -> ReadOnlyStateProxy:
9
+ async def get_state(token: str, state_cls: Any | None = None) -> ReadOnlyStateProxy:
10
10
  """Get the instance of a state for a token.
11
11
 
12
12
  Args:
@@ -8,7 +8,7 @@ from typing import TYPE_CHECKING, Optional
8
8
  from reflex import constants
9
9
  from reflex.event import Event, get_hydrate_event
10
10
  from reflex.middleware.middleware import Middleware
11
- from reflex.state import BaseState, StateUpdate
11
+ from reflex.state import BaseState, StateUpdate, _resolve_delta
12
12
 
13
13
  if TYPE_CHECKING:
14
14
  from reflex.app import App
@@ -42,7 +42,7 @@ class HydrateMiddleware(Middleware):
42
42
  setattr(state, constants.CompileVars.IS_HYDRATED, False)
43
43
 
44
44
  # Get the initial state.
45
- delta = state.dict()
45
+ delta = await _resolve_delta(state.dict())
46
46
  # since a full dict was captured, clean any dirtiness
47
47
  state._clean()
48
48
 
reflex/model.py CHANGED
@@ -18,6 +18,7 @@ import sqlalchemy
18
18
  import sqlalchemy.exc
19
19
  import sqlalchemy.ext.asyncio
20
20
  import sqlalchemy.orm
21
+ from alembic.runtime.migration import MigrationContext
21
22
 
22
23
  from reflex.base import Base
23
24
  from reflex.config import environment, get_config
@@ -242,7 +243,7 @@ class ModelRegistry:
242
243
  return metadata
243
244
 
244
245
 
245
- class Model(Base, sqlmodel.SQLModel): # pyright: ignore [reportGeneralTypeIssues]
246
+ class Model(Base, sqlmodel.SQLModel): # pyright: ignore [reportGeneralTypeIssues,reportIncompatibleVariableOverride]
246
247
  """Base class to define a table in the database."""
247
248
 
248
249
  # The primary key for the table.
@@ -261,7 +262,7 @@ class Model(Base, sqlmodel.SQLModel): # pyright: ignore [reportGeneralTypeIssue
261
262
  super().__init_subclass__()
262
263
 
263
264
  @classmethod
264
- def _dict_recursive(cls, value):
265
+ def _dict_recursive(cls, value: Any):
265
266
  """Recursively serialize the relationship object(s).
266
267
 
267
268
  Args:
@@ -393,7 +394,11 @@ class Model(Base, sqlmodel.SQLModel): # pyright: ignore [reportGeneralTypeIssue
393
394
  writer = alembic.autogenerate.rewriter.Rewriter()
394
395
 
395
396
  @writer.rewrites(alembic.operations.ops.AddColumnOp)
396
- def render_add_column_with_server_default(context, revision, op):
397
+ def render_add_column_with_server_default(
398
+ context: MigrationContext,
399
+ revision: str | None,
400
+ op: Any,
401
+ ):
397
402
  # Carry the sqlmodel default as server_default so that newly added
398
403
  # columns get the desired default value in existing rows.
399
404
  if op.column.default is not None and op.column.server_default is None:
@@ -402,7 +407,7 @@ class Model(Base, sqlmodel.SQLModel): # pyright: ignore [reportGeneralTypeIssue
402
407
  )
403
408
  return op
404
409
 
405
- def run_autogenerate(rev, context):
410
+ def run_autogenerate(rev: str, context: MigrationContext):
406
411
  revision_context.run_autogenerate(rev, context)
407
412
  return []
408
413
 
@@ -415,7 +420,7 @@ class Model(Base, sqlmodel.SQLModel): # pyright: ignore [reportGeneralTypeIssue
415
420
  connection=connection,
416
421
  target_metadata=ModelRegistry.get_metadata(),
417
422
  render_item=cls._alembic_render_item,
418
- process_revision_directives=writer, # type: ignore
423
+ process_revision_directives=writer,
419
424
  compare_type=False,
420
425
  render_as_batch=True, # for sqlite compatibility
421
426
  )
@@ -444,7 +449,7 @@ class Model(Base, sqlmodel.SQLModel): # pyright: ignore [reportGeneralTypeIssue
444
449
  """
445
450
  config, script_directory = cls._alembic_config()
446
451
 
447
- def run_upgrade(rev, context):
452
+ def run_upgrade(rev: str, context: MigrationContext):
448
453
  return script_directory._upgrade_revs(to_rev, rev)
449
454
 
450
455
  with alembic.runtime.environment.EnvironmentContext(
reflex/page.py CHANGED
@@ -3,10 +3,10 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from collections import defaultdict
6
- from typing import Any, Dict, List
6
+ from typing import Any, Callable, Dict, List
7
7
 
8
8
  from reflex.config import get_config
9
- from reflex.event import BASE_STATE, EventType
9
+ from reflex.event import EventType
10
10
 
11
11
  DECORATED_PAGES: Dict[str, List] = defaultdict(list)
12
12
 
@@ -18,7 +18,7 @@ def page(
18
18
  description: str | None = None,
19
19
  meta: list[Any] | None = None,
20
20
  script_tags: list[Any] | None = None,
21
- on_load: EventType[[], BASE_STATE] | None = None,
21
+ on_load: EventType[()] | None = None,
22
22
  ):
23
23
  """Decorate a function as a page.
24
24
 
@@ -42,7 +42,7 @@ def page(
42
42
  The decorated function.
43
43
  """
44
44
 
45
- def decorator(render_fn):
45
+ def decorator(render_fn: Callable):
46
46
  kwargs = {}
47
47
  if route:
48
48
  kwargs["route"] = route
@@ -66,7 +66,7 @@ def page(
66
66
  return decorator
67
67
 
68
68
 
69
- def get_decorated_pages(omit_implicit_routes=True) -> list[dict[str, Any]]:
69
+ def get_decorated_pages(omit_implicit_routes: bool = True) -> list[dict[str, Any]]:
70
70
  """Get the decorated pages.
71
71
 
72
72
  Args: