reflex 0.5.4a2__py3-none-any.whl → 0.5.5__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 (261) hide show
  1. reflex/.templates/apps/demo/code/demo.py +1 -0
  2. reflex/.templates/apps/demo/code/pages/__init__.py +1 -0
  3. reflex/.templates/apps/demo/code/pages/datatable.py +1 -0
  4. reflex/.templates/apps/demo/code/pages/forms.py +1 -0
  5. reflex/.templates/apps/demo/code/pages/graphing.py +1 -0
  6. reflex/.templates/apps/demo/code/pages/home.py +1 -0
  7. reflex/.templates/apps/demo/code/styles.py +1 -0
  8. reflex/.templates/apps/demo/code/webui/components/loading_icon.py +1 -8
  9. reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +27 -12
  10. reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +19 -5
  11. reflex/.templates/web/utils/state.js +73 -7
  12. reflex/__init__.py +3 -0
  13. reflex/__init__.pyi +3 -0
  14. reflex/admin.py +1 -0
  15. reflex/app.py +8 -6
  16. reflex/app_module_for_backend.py +2 -1
  17. reflex/base.py +4 -4
  18. reflex/compiler/compiler.py +4 -3
  19. reflex/compiler/templates.py +2 -0
  20. reflex/compiler/utils.py +58 -35
  21. reflex/components/__init__.py +1 -0
  22. reflex/components/base/__init__.py +1 -0
  23. reflex/components/base/app_wrap.py +1 -0
  24. reflex/components/base/fragment.py +1 -0
  25. reflex/components/base/link.py +0 -1
  26. reflex/components/base/script.py +11 -15
  27. reflex/components/base/script.pyi +1 -2
  28. reflex/components/chakra/base.py +15 -13
  29. reflex/components/chakra/base.pyi +3 -1
  30. reflex/components/chakra/datadisplay/code.py +1 -0
  31. reflex/components/chakra/datadisplay/divider.py +1 -0
  32. reflex/components/chakra/datadisplay/table.py +1 -0
  33. reflex/components/chakra/datadisplay/table.pyi +3 -0
  34. reflex/components/chakra/datadisplay/tag.py +1 -0
  35. reflex/components/chakra/disclosure/transition.py +1 -0
  36. reflex/components/chakra/feedback/circularprogress.py +1 -0
  37. reflex/components/chakra/forms/button.py +1 -0
  38. reflex/components/chakra/forms/checkbox.py +4 -13
  39. reflex/components/chakra/forms/checkbox.pyi +1 -3
  40. reflex/components/chakra/forms/colormodeswitch.py +1 -0
  41. reflex/components/chakra/forms/editable.py +13 -16
  42. reflex/components/chakra/forms/editable.pyi +1 -3
  43. reflex/components/chakra/forms/form.py +1 -0
  44. reflex/components/chakra/forms/input.py +22 -21
  45. reflex/components/chakra/forms/input.pyi +4 -4
  46. reflex/components/chakra/forms/multiselect.py +1 -0
  47. reflex/components/chakra/forms/numberinput.py +3 -12
  48. reflex/components/chakra/forms/numberinput.pyi +1 -3
  49. reflex/components/chakra/forms/pininput.py +8 -14
  50. reflex/components/chakra/forms/pininput.pyi +2 -3
  51. reflex/components/chakra/forms/radio.py +4 -13
  52. reflex/components/chakra/forms/radio.pyi +2 -3
  53. reflex/components/chakra/forms/rangeslider.py +10 -13
  54. reflex/components/chakra/forms/rangeslider.pyi +2 -3
  55. reflex/components/chakra/forms/select.py +4 -12
  56. reflex/components/chakra/forms/select.pyi +2 -3
  57. reflex/components/chakra/forms/slider.py +10 -13
  58. reflex/components/chakra/forms/slider.pyi +2 -3
  59. reflex/components/chakra/forms/switch.py +4 -13
  60. reflex/components/chakra/forms/switch.pyi +1 -3
  61. reflex/components/chakra/forms/textarea.py +16 -17
  62. reflex/components/chakra/forms/textarea.pyi +1 -3
  63. reflex/components/chakra/media/avatar.py +4 -12
  64. reflex/components/chakra/media/avatar.pyi +1 -2
  65. reflex/components/chakra/media/icon.py +1 -0
  66. reflex/components/chakra/media/image.py +7 -11
  67. reflex/components/chakra/media/image.pyi +2 -2
  68. reflex/components/chakra/navigation/link.py +8 -4
  69. reflex/components/chakra/navigation/link.pyi +2 -1
  70. reflex/components/chakra/overlay/alertdialog.py +12 -14
  71. reflex/components/chakra/overlay/alertdialog.pyi +1 -2
  72. reflex/components/chakra/overlay/drawer.py +12 -14
  73. reflex/components/chakra/overlay/drawer.pyi +1 -2
  74. reflex/components/chakra/overlay/menu.py +7 -11
  75. reflex/components/chakra/overlay/menu.pyi +2 -2
  76. reflex/components/chakra/overlay/modal.py +13 -13
  77. reflex/components/chakra/overlay/modal.pyi +2 -2
  78. reflex/components/chakra/overlay/popover.py +6 -12
  79. reflex/components/chakra/overlay/popover.pyi +1 -2
  80. reflex/components/chakra/overlay/tooltip.py +7 -13
  81. reflex/components/chakra/overlay/tooltip.pyi +1 -2
  82. reflex/components/chakra/typography/heading.py +0 -1
  83. reflex/components/chakra/typography/span.py +1 -0
  84. reflex/components/chakra/typography/text.py +1 -0
  85. reflex/components/component.py +70 -43
  86. reflex/components/core/__init__.py +1 -0
  87. reflex/components/core/banner.py +27 -24
  88. reflex/components/core/banner.pyi +6 -2
  89. reflex/components/core/client_side_routing.py +1 -0
  90. reflex/components/core/cond.py +19 -17
  91. reflex/components/core/debounce.py +4 -11
  92. reflex/components/core/debounce.pyi +1 -1
  93. reflex/components/core/foreach.py +1 -0
  94. reflex/components/core/html.py +1 -0
  95. reflex/components/core/match.py +9 -6
  96. reflex/components/core/upload.py +26 -25
  97. reflex/components/core/upload.pyi +3 -4
  98. reflex/components/datadisplay/__init__.py +1 -0
  99. reflex/components/datadisplay/code.py +27 -23
  100. reflex/components/datadisplay/code.pyi +4 -2
  101. reflex/components/datadisplay/dataeditor.py +73 -80
  102. reflex/components/datadisplay/dataeditor.pyi +52 -4
  103. reflex/components/datadisplay/logo.py +1 -0
  104. reflex/components/el/__init__.py +1 -0
  105. reflex/components/el/__init__.pyi +8 -0
  106. reflex/components/el/element.py +0 -1
  107. reflex/components/el/elements/__init__.py +5 -0
  108. reflex/components/el/elements/__init__.pyi +12 -1
  109. reflex/components/el/elements/base.py +1 -0
  110. reflex/components/el/elements/forms.py +44 -61
  111. reflex/components/el/elements/forms.pyi +4 -6
  112. reflex/components/el/elements/inline.py +1 -0
  113. reflex/components/el/elements/media.py +53 -0
  114. reflex/components/el/elements/media.pyi +428 -0
  115. reflex/components/el/elements/metadata.py +11 -0
  116. reflex/components/el/elements/metadata.pyi +80 -0
  117. reflex/components/el/elements/other.py +1 -0
  118. reflex/components/el/elements/scripts.py +1 -0
  119. reflex/components/el/elements/tables.py +1 -0
  120. reflex/components/el/elements/typography.py +1 -0
  121. reflex/components/gridjs/datatable.py +9 -6
  122. reflex/components/gridjs/datatable.pyi +4 -1
  123. reflex/components/markdown/markdown.py +36 -41
  124. reflex/components/markdown/markdown.pyi +4 -3
  125. reflex/components/media/icon.py +1 -0
  126. reflex/components/moment/moment.py +11 -17
  127. reflex/components/moment/moment.pyi +4 -3
  128. reflex/components/next/base.py +1 -0
  129. reflex/components/next/image.py +6 -11
  130. reflex/components/next/image.pyi +2 -2
  131. reflex/components/plotly/plotly.py +1 -0
  132. reflex/components/props.py +1 -0
  133. reflex/components/radix/__init__.py +1 -0
  134. reflex/components/radix/primitives/__init__.py +1 -0
  135. reflex/components/radix/primitives/accordion.py +7 -15
  136. reflex/components/radix/primitives/accordion.pyi +7 -4
  137. reflex/components/radix/primitives/base.py +1 -0
  138. reflex/components/radix/primitives/drawer.py +17 -27
  139. reflex/components/radix/primitives/drawer.pyi +2 -4
  140. reflex/components/radix/primitives/form.py +4 -12
  141. reflex/components/radix/primitives/form.pyi +2 -3
  142. reflex/components/radix/primitives/slider.py +6 -11
  143. reflex/components/radix/primitives/slider.pyi +2 -2
  144. reflex/components/radix/themes/__init__.py +1 -0
  145. reflex/components/radix/themes/base.py +3 -3
  146. reflex/components/radix/themes/base.pyi +3 -2
  147. reflex/components/radix/themes/color_mode.py +31 -2
  148. reflex/components/radix/themes/color_mode.pyi +10 -1
  149. reflex/components/radix/themes/components/__init__.py +1 -0
  150. reflex/components/radix/themes/components/alert_dialog.py +13 -24
  151. reflex/components/radix/themes/components/alert_dialog.pyi +2 -4
  152. reflex/components/radix/themes/components/aspect_ratio.py +1 -0
  153. reflex/components/radix/themes/components/card.py +1 -0
  154. reflex/components/radix/themes/components/checkbox.py +6 -22
  155. reflex/components/radix/themes/components/checkbox.pyi +2 -4
  156. reflex/components/radix/themes/components/checkbox_group.py +15 -3
  157. reflex/components/radix/themes/components/checkbox_group.pyi +10 -2
  158. reflex/components/radix/themes/components/context_menu.py +29 -38
  159. reflex/components/radix/themes/components/context_menu.pyi +2 -5
  160. reflex/components/radix/themes/components/dialog.py +18 -26
  161. reflex/components/radix/themes/components/dialog.pyi +2 -4
  162. reflex/components/radix/themes/components/dropdown_menu.py +32 -57
  163. reflex/components/radix/themes/components/dropdown_menu.pyi +2 -7
  164. reflex/components/radix/themes/components/hover_card.py +5 -12
  165. reflex/components/radix/themes/components/hover_card.pyi +2 -3
  166. reflex/components/radix/themes/components/icon_button.py +1 -0
  167. reflex/components/radix/themes/components/icon_button.pyi +1 -0
  168. reflex/components/radix/themes/components/inset.py +1 -0
  169. reflex/components/radix/themes/components/popover.py +22 -27
  170. reflex/components/radix/themes/components/popover.pyi +2 -4
  171. reflex/components/radix/themes/components/radio_group.py +25 -17
  172. reflex/components/radix/themes/components/radio_group.pyi +2 -3
  173. reflex/components/radix/themes/components/scroll_area.py +1 -0
  174. reflex/components/radix/themes/components/segmented_control.py +18 -5
  175. reflex/components/radix/themes/components/segmented_control.pyi +16 -7
  176. reflex/components/radix/themes/components/select.py +13 -23
  177. reflex/components/radix/themes/components/select.pyi +1 -4
  178. reflex/components/radix/themes/components/separator.py +1 -0
  179. reflex/components/radix/themes/components/slider.py +7 -12
  180. reflex/components/radix/themes/components/slider.pyi +2 -3
  181. reflex/components/radix/themes/components/switch.py +5 -12
  182. reflex/components/radix/themes/components/switch.pyi +2 -3
  183. reflex/components/radix/themes/components/table.py +1 -0
  184. reflex/components/radix/themes/components/tabs.py +4 -11
  185. reflex/components/radix/themes/components/tabs.pyi +2 -2
  186. reflex/components/radix/themes/components/text_area.py +19 -18
  187. reflex/components/radix/themes/components/text_area.pyi +2 -3
  188. reflex/components/radix/themes/components/text_field.py +19 -18
  189. reflex/components/radix/themes/components/text_field.pyi +3 -3
  190. reflex/components/radix/themes/components/tooltip.py +10 -13
  191. reflex/components/radix/themes/components/tooltip.pyi +2 -3
  192. reflex/components/radix/themes/layout/__init__.py +1 -0
  193. reflex/components/radix/themes/layout/box.py +1 -0
  194. reflex/components/radix/themes/layout/container.py +1 -0
  195. reflex/components/radix/themes/layout/list.py +1 -0
  196. reflex/components/radix/themes/layout/list.pyi +1 -0
  197. reflex/components/radix/themes/layout/section.py +1 -0
  198. reflex/components/radix/themes/typography/__init__.py +1 -0
  199. reflex/components/radix/themes/typography/base.py +1 -0
  200. reflex/components/radix/themes/typography/blockquote.py +1 -0
  201. reflex/components/radix/themes/typography/code.py +1 -0
  202. reflex/components/radix/themes/typography/heading.py +1 -0
  203. reflex/components/radix/themes/typography/link.py +8 -3
  204. reflex/components/radix/themes/typography/link.pyi +2 -1
  205. reflex/components/react_player/audio.py +1 -0
  206. reflex/components/react_player/audio.pyi +48 -0
  207. reflex/components/react_player/react_player.py +49 -0
  208. reflex/components/react_player/react_player.pyi +49 -0
  209. reflex/components/react_player/video.py +1 -0
  210. reflex/components/react_player/video.pyi +48 -0
  211. reflex/components/recharts/__init__.py +1 -0
  212. reflex/components/recharts/cartesian.py +264 -74
  213. reflex/components/recharts/cartesian.pyi +573 -58
  214. reflex/components/recharts/charts.py +68 -78
  215. reflex/components/recharts/charts.pyi +373 -156
  216. reflex/components/recharts/general.py +52 -20
  217. reflex/components/recharts/general.pyi +52 -6
  218. reflex/components/recharts/polar.py +30 -18
  219. reflex/components/recharts/polar.pyi +66 -5
  220. reflex/components/recharts/recharts.py +5 -3
  221. reflex/components/recharts/recharts.pyi +2 -1
  222. reflex/components/sonner/toast.py +2 -2
  223. reflex/components/sonner/toast.pyi +1 -1
  224. reflex/components/suneditor/editor.py +39 -26
  225. reflex/components/suneditor/editor.pyi +4 -4
  226. reflex/components/tags/iter_tag.py +1 -0
  227. reflex/constants/__init__.py +3 -2
  228. reflex/constants/base.py +20 -21
  229. reflex/constants/compiler.py +3 -1
  230. reflex/constants/config.py +1 -0
  231. reflex/constants/event.py +1 -0
  232. reflex/constants/installer.py +3 -2
  233. reflex/constants/style.py +2 -8
  234. reflex/event.py +36 -6
  235. reflex/experimental/assets.py +1 -0
  236. reflex/experimental/client_state.py +9 -3
  237. reflex/experimental/hooks.py +1 -0
  238. reflex/experimental/misc.py +12 -3
  239. reflex/middleware/hydrate_middleware.py +1 -0
  240. reflex/middleware/middleware.py +1 -0
  241. reflex/state.py +38 -1
  242. reflex/style.py +67 -20
  243. reflex/testing.py +6 -2
  244. reflex/utils/build.py +76 -72
  245. reflex/utils/compat.py +5 -0
  246. reflex/utils/exec.py +17 -9
  247. reflex/utils/export.py +13 -9
  248. reflex/utils/imports.py +34 -5
  249. reflex/utils/lazy_loader.py +1 -0
  250. reflex/utils/path_ops.py +39 -33
  251. reflex/utils/prerequisites.py +38 -29
  252. reflex/utils/processes.py +1 -1
  253. reflex/utils/serializers.py +3 -6
  254. reflex/utils/watch.py +3 -1
  255. reflex/vars.py +26 -10
  256. reflex/vars.pyi +3 -3
  257. {reflex-0.5.4a2.dist-info → reflex-0.5.5.dist-info}/METADATA +3 -3
  258. {reflex-0.5.4a2.dist-info → reflex-0.5.5.dist-info}/RECORD +261 -261
  259. {reflex-0.5.4a2.dist-info → reflex-0.5.5.dist-info}/LICENSE +0 -0
  260. {reflex-0.5.4a2.dist-info → reflex-0.5.5.dist-info}/WHEEL +0 -0
  261. {reflex-0.5.4a2.dist-info → reflex-0.5.5.dist-info}/entry_points.txt +0 -0
reflex/compiler/utils.py CHANGED
@@ -3,9 +3,12 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  import os
6
+ from pathlib import Path
6
7
  from typing import Any, Callable, Dict, Optional, Type, Union
7
8
  from urllib.parse import urlparse
8
9
 
10
+ from reflex.utils.prerequisites import get_web_dir
11
+
9
12
  try:
10
13
  from pydantic.v1.fields import ModelField
11
14
  except ModuleNotFoundError:
@@ -25,16 +28,17 @@ from reflex.components.base import (
25
28
  Title,
26
29
  )
27
30
  from reflex.components.component import Component, ComponentStyle, CustomComponent
28
- from reflex.state import BaseState, Cookie, LocalStorage
31
+ from reflex.state import BaseState, Cookie, LocalStorage, SessionStorage
29
32
  from reflex.style import Style
30
33
  from reflex.utils import console, format, imports, path_ops
34
+ from reflex.utils.imports import ImportVar, ParsedImportDict
31
35
  from reflex.vars import Var
32
36
 
33
37
  # To re-export this function.
34
38
  merge_imports = imports.merge_imports
35
39
 
36
40
 
37
- def compile_import_statement(fields: list[imports.ImportVar]) -> tuple[str, list[str]]:
41
+ def compile_import_statement(fields: list[ImportVar]) -> tuple[str, list[str]]:
38
42
  """Compile an import statement.
39
43
 
40
44
  Args:
@@ -59,7 +63,7 @@ def compile_import_statement(fields: list[imports.ImportVar]) -> tuple[str, list
59
63
  return default, list(rest)
60
64
 
61
65
 
62
- def validate_imports(import_dict: imports.ImportDict):
66
+ def validate_imports(import_dict: ParsedImportDict):
63
67
  """Verify that the same Tag is not used in multiple import.
64
68
 
65
69
  Args:
@@ -82,7 +86,7 @@ def validate_imports(import_dict: imports.ImportDict):
82
86
  used_tags[import_name] = lib
83
87
 
84
88
 
85
- def compile_imports(import_dict: imports.ImportDict) -> list[dict]:
89
+ def compile_imports(import_dict: ParsedImportDict) -> list[dict]:
86
90
  """Compile an import dict.
87
91
 
88
92
  Args:
@@ -91,7 +95,7 @@ def compile_imports(import_dict: imports.ImportDict) -> list[dict]:
91
95
  Returns:
92
96
  The list of import dict.
93
97
  """
94
- collapsed_import_dict = imports.collapse_imports(import_dict)
98
+ collapsed_import_dict: ParsedImportDict = imports.collapse_imports(import_dict)
95
99
  validate_imports(collapsed_import_dict)
96
100
  import_dicts = []
97
101
  for lib, fields in collapsed_import_dict.items():
@@ -154,8 +158,11 @@ def compile_state(state: Type[BaseState]) -> dict:
154
158
 
155
159
  def _compile_client_storage_field(
156
160
  field: ModelField,
157
- ) -> tuple[Type[Cookie] | Type[LocalStorage] | None, dict[str, Any] | None]:
158
- """Compile the given cookie or local_storage field.
161
+ ) -> tuple[
162
+ Type[Cookie] | Type[LocalStorage] | Type[SessionStorage] | None,
163
+ dict[str, Any] | None,
164
+ ]:
165
+ """Compile the given cookie, local_storage or session_storage field.
159
166
 
160
167
  Args:
161
168
  field: The possible cookie field to compile.
@@ -163,7 +170,7 @@ def _compile_client_storage_field(
163
170
  Returns:
164
171
  A dictionary of the compiled cookie or None if the field is not cookie-like.
165
172
  """
166
- for field_type in (Cookie, LocalStorage):
173
+ for field_type in (Cookie, LocalStorage, SessionStorage):
167
174
  if isinstance(field.default, field_type):
168
175
  cs_obj = field.default
169
176
  elif isinstance(field.type_, type) and issubclass(field.type_, field_type):
@@ -176,7 +183,7 @@ def _compile_client_storage_field(
176
183
 
177
184
  def _compile_client_storage_recursive(
178
185
  state: Type[BaseState],
179
- ) -> tuple[dict[str, dict], dict[str, dict[str, str]]]:
186
+ ) -> tuple[dict[str, dict], dict[str, dict], dict[str, dict]]:
180
187
  """Compile the client-side storage for the given state recursively.
181
188
 
182
189
  Args:
@@ -187,10 +194,12 @@ def _compile_client_storage_recursive(
187
194
  (
188
195
  cookies: dict[str, dict],
189
196
  local_storage: dict[str, dict[str, str]]
190
- )
197
+ session_storage: dict[str, dict[str, str]]
198
+ ).
191
199
  """
192
200
  cookies = {}
193
201
  local_storage = {}
202
+ session_storage = {}
194
203
  state_name = state.get_full_name()
195
204
  for name, field in state.__fields__.items():
196
205
  if name in state.inherited_vars:
@@ -202,15 +211,20 @@ def _compile_client_storage_recursive(
202
211
  cookies[state_key] = options
203
212
  elif field_type is LocalStorage:
204
213
  local_storage[state_key] = options
214
+ elif field_type is SessionStorage:
215
+ session_storage[state_key] = options
205
216
  else:
206
217
  continue
207
218
  for substate in state.get_substates():
208
- substate_cookies, substate_local_storage = _compile_client_storage_recursive(
209
- substate
210
- )
219
+ (
220
+ substate_cookies,
221
+ substate_local_storage,
222
+ substate_session_storage,
223
+ ) = _compile_client_storage_recursive(substate)
211
224
  cookies.update(substate_cookies)
212
225
  local_storage.update(substate_local_storage)
213
- return cookies, local_storage
226
+ session_storage.update(substate_session_storage)
227
+ return cookies, local_storage, session_storage
214
228
 
215
229
 
216
230
  def compile_client_storage(state: Type[BaseState]) -> dict[str, dict]:
@@ -222,16 +236,17 @@ def compile_client_storage(state: Type[BaseState]) -> dict[str, dict]:
222
236
  Returns:
223
237
  A dictionary of the compiled client-side storage info.
224
238
  """
225
- cookies, local_storage = _compile_client_storage_recursive(state)
239
+ cookies, local_storage, session_storage = _compile_client_storage_recursive(state)
226
240
  return {
227
241
  constants.COOKIES: cookies,
228
242
  constants.LOCAL_STORAGE: local_storage,
243
+ constants.SESSION_STORAGE: session_storage,
229
244
  }
230
245
 
231
246
 
232
247
  def compile_custom_component(
233
248
  component: CustomComponent,
234
- ) -> tuple[dict, imports.ImportDict]:
249
+ ) -> tuple[dict, ParsedImportDict]:
235
250
  """Compile a custom component.
236
251
 
237
252
  Args:
@@ -244,7 +259,7 @@ def compile_custom_component(
244
259
  render = component.get_component(component)
245
260
 
246
261
  # Get the imports.
247
- imports = {
262
+ imports: ParsedImportDict = {
248
263
  lib: fields
249
264
  for lib, fields in render._get_all_imports().items()
250
265
  if lib != component.library
@@ -329,7 +344,7 @@ def get_page_path(path: str) -> str:
329
344
  Returns:
330
345
  The path of the compiled JS file.
331
346
  """
332
- return os.path.join(constants.Dirs.WEB_PAGES, path + constants.Ext.JS)
347
+ return str(get_web_dir() / constants.Dirs.PAGES / (path + constants.Ext.JS))
333
348
 
334
349
 
335
350
  def get_theme_path() -> str:
@@ -338,8 +353,10 @@ def get_theme_path() -> str:
338
353
  Returns:
339
354
  The path of the theme style.
340
355
  """
341
- return os.path.join(
342
- constants.Dirs.WEB_UTILS, constants.PageNames.THEME + constants.Ext.JS
356
+ return str(
357
+ get_web_dir()
358
+ / constants.Dirs.UTILS
359
+ / (constants.PageNames.THEME + constants.Ext.JS)
343
360
  )
344
361
 
345
362
 
@@ -349,8 +366,10 @@ def get_root_stylesheet_path() -> str:
349
366
  Returns:
350
367
  The path of the app root file.
351
368
  """
352
- return os.path.join(
353
- constants.STYLES_DIR, constants.PageNames.STYLESHEET_ROOT + constants.Ext.CSS
369
+ return str(
370
+ get_web_dir()
371
+ / constants.Dirs.STYLES
372
+ / (constants.PageNames.STYLESHEET_ROOT + constants.Ext.CSS)
354
373
  )
355
374
 
356
375
 
@@ -360,9 +379,7 @@ def get_context_path() -> str:
360
379
  Returns:
361
380
  The path of the context module.
362
381
  """
363
- return os.path.join(
364
- constants.Dirs.WEB, constants.Dirs.CONTEXTS_PATH + constants.Ext.JS
365
- )
382
+ return str(get_web_dir() / (constants.Dirs.CONTEXTS_PATH + constants.Ext.JS))
366
383
 
367
384
 
368
385
  def get_components_path() -> str:
@@ -371,7 +388,11 @@ def get_components_path() -> str:
371
388
  Returns:
372
389
  The path of the compiled components.
373
390
  """
374
- return os.path.join(constants.Dirs.WEB_UTILS, "components" + constants.Ext.JS)
391
+ return str(
392
+ get_web_dir()
393
+ / constants.Dirs.UTILS
394
+ / (constants.PageNames.COMPONENTS + constants.Ext.JS),
395
+ )
375
396
 
376
397
 
377
398
  def get_stateful_components_path() -> str:
@@ -380,9 +401,10 @@ def get_stateful_components_path() -> str:
380
401
  Returns:
381
402
  The path of the compiled stateful components.
382
403
  """
383
- return os.path.join(
384
- constants.Dirs.WEB_UTILS,
385
- constants.PageNames.STATEFUL_COMPONENTS + constants.Ext.JS,
404
+ return str(
405
+ get_web_dir()
406
+ / constants.Dirs.UTILS
407
+ / (constants.PageNames.STATEFUL_COMPONENTS + constants.Ext.JS)
386
408
  )
387
409
 
388
410
 
@@ -436,23 +458,24 @@ def write_page(path: str, code: str):
436
458
  f.write(code)
437
459
 
438
460
 
439
- def empty_dir(path: str, keep_files: list[str] | None = None):
461
+ def empty_dir(path: str | Path, keep_files: list[str] | None = None):
440
462
  """Remove all files and folders in a directory except for the keep_files.
441
463
 
442
464
  Args:
443
465
  path: The path to the directory that will be emptied
444
466
  keep_files: List of filenames or foldernames that will not be deleted.
445
467
  """
468
+ path = Path(path)
469
+
446
470
  # If the directory does not exist, return.
447
- if not os.path.exists(path):
471
+ if not path.exists():
448
472
  return
449
473
 
450
474
  # Remove all files and folders in the directory.
451
475
  keep_files = keep_files or []
452
- directory_contents = os.listdir(path)
453
- for element in directory_contents:
454
- if element not in keep_files:
455
- path_ops.rm(os.path.join(path, element))
476
+ for element in path.iterdir():
477
+ if element.name not in keep_files:
478
+ path_ops.rm(element)
456
479
 
457
480
 
458
481
  def is_valid_url(url) -> bool:
@@ -1,4 +1,5 @@
1
1
  """Import all the components."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from reflex.utils import lazy_loader
@@ -1,4 +1,5 @@
1
1
  """Base components."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from reflex.utils import lazy_loader
@@ -1,4 +1,5 @@
1
1
  """Top-level component that wraps the entire app."""
2
+
2
3
  from reflex.components.base.fragment import Fragment
3
4
  from reflex.components.component import Component
4
5
  from reflex.vars import Var
@@ -1,4 +1,5 @@
1
1
  """React fragments to enable bare returns of component trees from functions."""
2
+
2
3
  from reflex.components.component import Component
3
4
 
4
5
 
@@ -1,6 +1,5 @@
1
1
  """Display the title of the current page."""
2
2
 
3
-
4
3
  from reflex.components.component import Component
5
4
  from reflex.vars import Var
6
5
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  https://nextjs.org/docs/app/api-reference/components/script
4
4
  """
5
- from __future__ import annotations
6
5
 
7
- from typing import Any, Union
6
+ from __future__ import annotations
8
7
 
9
8
  from reflex.components.component import Component
9
+ from reflex.event import EventHandler
10
10
  from reflex.vars import Var
11
11
 
12
12
 
@@ -30,6 +30,15 @@ class Script(Component):
30
30
  # When the script will execute: afterInteractive | beforeInteractive | lazyOnload
31
31
  strategy: Var[str] = "afterInteractive" # type: ignore
32
32
 
33
+ # Triggered when the script is loading
34
+ on_load: EventHandler[lambda: []]
35
+
36
+ # Triggered when the script has loaded
37
+ on_ready: EventHandler[lambda: []]
38
+
39
+ # Triggered when the script has errored
40
+ on_error: EventHandler[lambda: []]
41
+
33
42
  @classmethod
34
43
  def create(cls, *children, **props) -> Component:
35
44
  """Create an inline or user-defined script.
@@ -58,18 +67,5 @@ class Script(Component):
58
67
  raise ValueError("Must provide inline script or `src` prop.")
59
68
  return super().create(*children, **props)
60
69
 
61
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]:
62
- """Get the event triggers for the component.
63
-
64
- Returns:
65
- The event triggers.
66
- """
67
- return {
68
- **super().get_event_triggers(),
69
- "on_load": lambda: [],
70
- "on_ready": lambda: [],
71
- "on_error": lambda: [],
72
- }
73
-
74
70
 
75
71
  script = Script.create
@@ -7,8 +7,8 @@ from typing import Any, Dict, Literal, Optional, Union, overload
7
7
  from reflex.vars import Var, BaseVar, ComputedVar
8
8
  from reflex.event import EventChain, EventHandler, EventSpec
9
9
  from reflex.style import Style
10
- from typing import Any, Union
11
10
  from reflex.components.component import Component
11
+ from reflex.event import EventHandler
12
12
  from reflex.vars import Var
13
13
 
14
14
  class Script(Component):
@@ -112,6 +112,5 @@ class Script(Component):
112
112
  ValueError: when neither children nor `src` are specified.
113
113
  """
114
114
  ...
115
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]: ...
116
115
 
117
116
  script = Script.create
@@ -1,18 +1,19 @@
1
1
  """Components that are based on Chakra-UI."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from functools import lru_cache
5
6
  from typing import List, Literal
6
7
 
7
8
  from reflex.components.component import Component
8
- from reflex.utils import imports
9
+ from reflex.utils.imports import ImportDict, ImportVar
9
10
  from reflex.vars import Var
10
11
 
11
12
 
12
13
  class ChakraComponent(Component):
13
14
  """A component that wraps a Chakra component."""
14
15
 
15
- library = "@chakra-ui/react@2.6.1"
16
+ library: str = "@chakra-ui/react@2.6.1" # type: ignore
16
17
  lib_dependencies: List[str] = [
17
18
  "@chakra-ui/system@2.5.7",
18
19
  "framer-motion@10.16.4",
@@ -35,14 +36,14 @@ class ChakraComponent(Component):
35
36
 
36
37
  @classmethod
37
38
  @lru_cache(maxsize=None)
38
- def _get_dependencies_imports(cls) -> imports.ImportDict:
39
+ def _get_dependencies_imports(cls) -> ImportDict:
39
40
  """Get the imports from lib_dependencies for installing.
40
41
 
41
42
  Returns:
42
43
  The dependencies imports of the component.
43
44
  """
44
45
  return {
45
- dep: [imports.ImportVar(tag=None, render=False)]
46
+ dep: [ImportVar(tag=None, render=False)]
46
47
  for dep in [
47
48
  "@chakra-ui/system@2.5.7",
48
49
  "framer-motion@10.16.4",
@@ -70,15 +71,16 @@ class ChakraProvider(ChakraComponent):
70
71
  ),
71
72
  )
72
73
 
73
- def _get_imports(self) -> imports.ImportDict:
74
- _imports = super()._get_imports()
75
- _imports.setdefault(self.__fields__["library"].default, []).append(
76
- imports.ImportVar(tag="extendTheme", is_default=False),
77
- )
78
- _imports.setdefault("/utils/theme.js", []).append(
79
- imports.ImportVar(tag="theme", is_default=True),
80
- )
81
- return _imports
74
+ def add_imports(self) -> ImportDict:
75
+ """Add imports for the ChakraProvider component.
76
+
77
+ Returns:
78
+ The import dict for the component.
79
+ """
80
+ return {
81
+ self.library: ImportVar(tag="extendTheme", is_default=False),
82
+ "/utils/theme.js": ImportVar(tag="theme", is_default=True),
83
+ }
82
84
 
83
85
  @staticmethod
84
86
  @lru_cache(maxsize=None)
@@ -10,7 +10,7 @@ from reflex.style import Style
10
10
  from functools import lru_cache
11
11
  from typing import List, Literal
12
12
  from reflex.components.component import Component
13
- from reflex.utils import imports
13
+ from reflex.utils.imports import ImportDict, ImportVar
14
14
  from reflex.vars import Var
15
15
 
16
16
  class ChakraComponent(Component):
@@ -156,6 +156,8 @@ class ChakraProvider(ChakraComponent):
156
156
  """
157
157
  ...
158
158
 
159
+ def add_imports(self) -> ImportDict: ...
160
+
159
161
  chakra_provider = ChakraProvider.create()
160
162
 
161
163
  class ChakraColorModeProvider(Component):
@@ -1,4 +1,5 @@
1
1
  """A code component."""
2
+
2
3
  from reflex.components.chakra import (
3
4
  ChakraComponent,
4
5
  )
@@ -1,4 +1,5 @@
1
1
  """A line to divide parts of the layout."""
2
+
2
3
  from typing import Literal
3
4
 
4
5
  from reflex.components.chakra import ChakraComponent, LiteralDividerVariant
@@ -1,4 +1,5 @@
1
1
  """Table components."""
2
+
2
3
  from typing import List, Tuple
3
4
 
4
5
  from reflex.components.chakra import ChakraComponent
@@ -184,6 +184,7 @@ class Thead(ChakraComponent):
184
184
 
185
185
  """
186
186
  ...
187
+
187
188
  @staticmethod
188
189
  def validate_headers(headers): ...
189
190
 
@@ -264,6 +265,7 @@ class Tbody(ChakraComponent):
264
265
  Component: The table body component
265
266
  """
266
267
  ...
268
+
267
269
  @staticmethod
268
270
  def validate_rows(rows): ...
269
271
 
@@ -344,6 +346,7 @@ class Tfoot(ChakraComponent):
344
346
  The table footer component.
345
347
  """
346
348
  ...
349
+
347
350
  @staticmethod
348
351
  def validate_footers(footers): ...
349
352
 
@@ -1,4 +1,5 @@
1
1
  """Chakra Tag Component."""
2
+
2
3
  from typing import Optional
3
4
 
4
5
  from reflex.components.chakra import (
@@ -1,4 +1,5 @@
1
1
  """A transition Component."""
2
+
2
3
  from typing import Union
3
4
 
4
5
  from reflex.components.chakra import ChakraComponent
@@ -1,4 +1,5 @@
1
1
  """Container to stack elements with spacing."""
2
+
2
3
  from typing import Union
3
4
 
4
5
  from reflex.components.chakra import ChakraComponent
@@ -1,4 +1,5 @@
1
1
  """A button component."""
2
+
2
3
  from typing import List
3
4
 
4
5
  from reflex.components.chakra import (
@@ -1,14 +1,13 @@
1
1
  """A checkbox component."""
2
- from __future__ import annotations
3
2
 
4
- from typing import Any, Union
3
+ from __future__ import annotations
5
4
 
6
5
  from reflex.components.chakra import (
7
6
  ChakraComponent,
8
7
  LiteralColorScheme,
9
8
  LiteralTagSize,
10
9
  )
11
- from reflex.constants import EventTriggers
10
+ from reflex.event import EventHandler
12
11
  from reflex.vars import Var
13
12
 
14
13
 
@@ -56,16 +55,8 @@ class Checkbox(ChakraComponent):
56
55
  # The spacing between the checkbox and its label text (0.5rem)
57
56
  spacing: Var[str]
58
57
 
59
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]:
60
- """Get the event triggers that pass the component's value to the handler.
61
-
62
- Returns:
63
- A dict mapping the event trigger to the var that is passed to the handler.
64
- """
65
- return {
66
- **super().get_event_triggers(),
67
- EventTriggers.ON_CHANGE: lambda e0: [e0.target.checked],
68
- }
58
+ # Fired when the checkbox is checked or unchecked
59
+ on_change: EventHandler[lambda e0: [e0.target.checked]]
69
60
 
70
61
 
71
62
  class CheckboxGroup(ChakraComponent):
@@ -7,13 +7,11 @@ from typing import Any, Dict, Literal, Optional, Union, overload
7
7
  from reflex.vars import Var, BaseVar, ComputedVar
8
8
  from reflex.event import EventChain, EventHandler, EventSpec
9
9
  from reflex.style import Style
10
- from typing import Any, Union
11
10
  from reflex.components.chakra import ChakraComponent, LiteralColorScheme, LiteralTagSize
12
- from reflex.constants import EventTriggers
11
+ from reflex.event import EventHandler
13
12
  from reflex.vars import Var
14
13
 
15
14
  class Checkbox(ChakraComponent):
16
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]: ...
17
15
  @overload
18
16
  @classmethod
19
17
  def create( # type: ignore
@@ -14,6 +14,7 @@ rx.text(
14
14
  )
15
15
  ```
16
16
  """
17
+
17
18
  from __future__ import annotations
18
19
 
19
20
  from reflex.components.chakra import ChakraComponent
@@ -1,10 +1,9 @@
1
1
  """An editable component."""
2
- from __future__ import annotations
3
2
 
4
- from typing import Any, Union
3
+ from __future__ import annotations
5
4
 
6
5
  from reflex.components.chakra import ChakraComponent
7
- from reflex.constants import EventTriggers
6
+ from reflex.event import EventHandler
8
7
  from reflex.vars import Var
9
8
 
10
9
 
@@ -37,19 +36,17 @@ class Editable(ChakraComponent):
37
36
  # The initial value of the Editable in both edit and preview mode.
38
37
  default_value: Var[str]
39
38
 
40
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]:
41
- """Get the event triggers that pass the component's value to the handler.
42
-
43
- Returns:
44
- A dict mapping the event trigger to the var that is passed to the handler.
45
- """
46
- return {
47
- **super().get_event_triggers(),
48
- EventTriggers.ON_CHANGE: lambda e0: [e0],
49
- EventTriggers.ON_EDIT: lambda e0: [e0],
50
- EventTriggers.ON_SUBMIT: lambda e0: [e0],
51
- EventTriggers.ON_CANCEL: lambda e0: [e0],
52
- }
39
+ # Fired when the Editable is changed.
40
+ on_change: EventHandler[lambda e0: [e0]]
41
+
42
+ # Fired when the Editable is in edit mode.
43
+ on_edit: EventHandler[lambda e0: [e0]]
44
+
45
+ # Fired when the Editable is submitted.
46
+ on_submit: EventHandler[lambda e0: [e0]]
47
+
48
+ # Fired when the Editable is canceled.
49
+ on_cancel: EventHandler[lambda e0: [e0]]
53
50
 
54
51
 
55
52
  class EditableInput(ChakraComponent):
@@ -7,13 +7,11 @@ from typing import Any, Dict, Literal, Optional, Union, overload
7
7
  from reflex.vars import Var, BaseVar, ComputedVar
8
8
  from reflex.event import EventChain, EventHandler, EventSpec
9
9
  from reflex.style import Style
10
- from typing import Any, Union
11
10
  from reflex.components.chakra import ChakraComponent
12
- from reflex.constants import EventTriggers
11
+ from reflex.event import EventHandler
13
12
  from reflex.vars import Var
14
13
 
15
14
  class Editable(ChakraComponent):
16
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]: ...
17
15
  @overload
18
16
  @classmethod
19
17
  def create( # type: ignore
@@ -1,4 +1,5 @@
1
1
  """Form components."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from reflex.components.chakra import ChakraComponent