reflex 0.7.14a6__py3-none-any.whl → 0.8.0a1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

Files changed (206) hide show
  1. reflex/.templates/jinja/app/rxconfig.py.jinja2 +4 -1
  2. reflex/.templates/jinja/web/package.json.jinja2 +1 -1
  3. reflex/.templates/jinja/web/pages/_app.js.jinja2 +16 -10
  4. reflex/.templates/jinja/web/pages/_document.js.jinja2 +1 -1
  5. reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -1
  6. reflex/.templates/jinja/web/utils/context.js.jinja2 +25 -6
  7. reflex/.templates/web/app/entry.client.js +8 -0
  8. reflex/.templates/web/app/routes.js +10 -0
  9. reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +12 -32
  10. reflex/.templates/web/postcss.config.js +1 -1
  11. reflex/.templates/web/react-router.config.js +6 -0
  12. reflex/.templates/web/utils/client_side_routing.js +21 -19
  13. reflex/.templates/web/utils/react-theme.js +89 -0
  14. reflex/.templates/web/utils/state.js +155 -67
  15. reflex/.templates/web/vite.config.js +32 -0
  16. reflex/__init__.py +1 -6
  17. reflex/__init__.pyi +0 -4
  18. reflex/app.py +52 -115
  19. reflex/base.py +1 -87
  20. reflex/compiler/compiler.py +40 -3
  21. reflex/compiler/utils.py +54 -28
  22. reflex/components/__init__.py +0 -2
  23. reflex/components/__init__.pyi +0 -3
  24. reflex/components/base/__init__.py +1 -5
  25. reflex/components/base/__init__.pyi +4 -6
  26. reflex/components/base/app_wrap.pyi +5 -4
  27. reflex/components/base/body.pyi +5 -4
  28. reflex/components/base/document.py +18 -14
  29. reflex/components/base/document.pyi +83 -27
  30. reflex/components/base/error_boundary.pyi +5 -4
  31. reflex/components/base/fragment.pyi +5 -4
  32. reflex/components/base/link.pyi +9 -7
  33. reflex/components/base/meta.pyi +17 -13
  34. reflex/components/base/script.py +60 -58
  35. reflex/components/base/script.pyi +246 -31
  36. reflex/components/base/strict_mode.pyi +5 -4
  37. reflex/components/component.py +109 -194
  38. reflex/components/core/__init__.py +1 -0
  39. reflex/components/core/__init__.pyi +1 -0
  40. reflex/components/core/auto_scroll.pyi +5 -4
  41. reflex/components/core/banner.pyi +25 -19
  42. reflex/components/core/client_side_routing.py +7 -6
  43. reflex/components/core/client_side_routing.pyi +6 -56
  44. reflex/components/core/clipboard.pyi +5 -4
  45. reflex/components/core/debounce.py +1 -0
  46. reflex/components/core/debounce.pyi +5 -4
  47. reflex/components/core/foreach.py +3 -2
  48. reflex/components/core/helmet.py +14 -0
  49. reflex/components/{next/base.pyi → core/helmet.pyi} +10 -7
  50. reflex/components/core/html.pyi +5 -4
  51. reflex/components/core/sticky.pyi +17 -13
  52. reflex/components/core/upload.py +2 -1
  53. reflex/components/core/upload.pyi +21 -16
  54. reflex/components/datadisplay/code.pyi +9 -7
  55. reflex/components/datadisplay/dataeditor.pyi +5 -4
  56. reflex/components/datadisplay/shiki_code_block.pyi +13 -10
  57. reflex/components/dynamic.py +4 -5
  58. reflex/components/el/element.pyi +5 -4
  59. reflex/components/el/elements/base.pyi +5 -4
  60. reflex/components/el/elements/forms.pyi +69 -52
  61. reflex/components/el/elements/inline.pyi +113 -85
  62. reflex/components/el/elements/media.pyi +105 -79
  63. reflex/components/el/elements/metadata.pyi +25 -19
  64. reflex/components/el/elements/other.pyi +29 -22
  65. reflex/components/el/elements/scripts.pyi +13 -10
  66. reflex/components/el/elements/sectioning.pyi +61 -46
  67. reflex/components/el/elements/tables.pyi +41 -31
  68. reflex/components/el/elements/typography.pyi +61 -46
  69. reflex/components/field.py +175 -0
  70. reflex/components/gridjs/datatable.py +2 -2
  71. reflex/components/gridjs/datatable.pyi +11 -9
  72. reflex/components/lucide/icon.py +6 -2
  73. reflex/components/lucide/icon.pyi +15 -10
  74. reflex/components/markdown/markdown.pyi +5 -4
  75. reflex/components/moment/moment.pyi +5 -4
  76. reflex/components/plotly/plotly.pyi +19 -10
  77. reflex/components/props.py +376 -27
  78. reflex/components/radix/primitives/accordion.py +8 -1
  79. reflex/components/radix/primitives/accordion.pyi +29 -22
  80. reflex/components/radix/primitives/base.pyi +9 -7
  81. reflex/components/radix/primitives/drawer.pyi +45 -34
  82. reflex/components/radix/primitives/form.pyi +41 -31
  83. reflex/components/radix/primitives/progress.pyi +21 -16
  84. reflex/components/radix/primitives/slider.pyi +21 -16
  85. reflex/components/radix/themes/base.py +3 -3
  86. reflex/components/radix/themes/base.pyi +33 -25
  87. reflex/components/radix/themes/color_mode.pyi +13 -10
  88. reflex/components/radix/themes/components/alert_dialog.pyi +29 -22
  89. reflex/components/radix/themes/components/aspect_ratio.pyi +5 -4
  90. reflex/components/radix/themes/components/avatar.pyi +5 -4
  91. reflex/components/radix/themes/components/badge.pyi +5 -4
  92. reflex/components/radix/themes/components/button.pyi +5 -4
  93. reflex/components/radix/themes/components/callout.pyi +21 -16
  94. reflex/components/radix/themes/components/card.pyi +5 -4
  95. reflex/components/radix/themes/components/checkbox.pyi +13 -10
  96. reflex/components/radix/themes/components/checkbox_cards.pyi +9 -7
  97. reflex/components/radix/themes/components/checkbox_group.pyi +9 -7
  98. reflex/components/radix/themes/components/context_menu.pyi +53 -40
  99. reflex/components/radix/themes/components/data_list.pyi +17 -13
  100. reflex/components/radix/themes/components/dialog.pyi +29 -22
  101. reflex/components/radix/themes/components/dropdown_menu.pyi +33 -25
  102. reflex/components/radix/themes/components/hover_card.pyi +17 -13
  103. reflex/components/radix/themes/components/icon_button.pyi +5 -4
  104. reflex/components/radix/themes/components/inset.pyi +5 -4
  105. reflex/components/radix/themes/components/popover.pyi +17 -13
  106. reflex/components/radix/themes/components/progress.pyi +5 -4
  107. reflex/components/radix/themes/components/radio.pyi +5 -4
  108. reflex/components/radix/themes/components/radio_cards.pyi +9 -7
  109. reflex/components/radix/themes/components/radio_group.pyi +17 -13
  110. reflex/components/radix/themes/components/scroll_area.pyi +5 -4
  111. reflex/components/radix/themes/components/segmented_control.pyi +9 -7
  112. reflex/components/radix/themes/components/select.pyi +37 -28
  113. reflex/components/radix/themes/components/separator.pyi +5 -4
  114. reflex/components/radix/themes/components/skeleton.pyi +5 -4
  115. reflex/components/radix/themes/components/slider.pyi +5 -4
  116. reflex/components/radix/themes/components/spinner.pyi +5 -4
  117. reflex/components/radix/themes/components/switch.pyi +5 -4
  118. reflex/components/radix/themes/components/table.pyi +29 -22
  119. reflex/components/radix/themes/components/tabs.pyi +21 -16
  120. reflex/components/radix/themes/components/text_area.pyi +5 -4
  121. reflex/components/radix/themes/components/text_field.pyi +13 -10
  122. reflex/components/radix/themes/components/tooltip.pyi +5 -4
  123. reflex/components/radix/themes/layout/base.pyi +5 -4
  124. reflex/components/radix/themes/layout/box.pyi +5 -4
  125. reflex/components/radix/themes/layout/center.pyi +5 -4
  126. reflex/components/radix/themes/layout/container.pyi +5 -4
  127. reflex/components/radix/themes/layout/flex.pyi +5 -4
  128. reflex/components/radix/themes/layout/grid.pyi +5 -4
  129. reflex/components/radix/themes/layout/list.pyi +21 -16
  130. reflex/components/radix/themes/layout/section.pyi +5 -4
  131. reflex/components/radix/themes/layout/spacer.pyi +5 -4
  132. reflex/components/radix/themes/layout/stack.pyi +13 -10
  133. reflex/components/radix/themes/typography/blockquote.pyi +5 -4
  134. reflex/components/radix/themes/typography/code.pyi +5 -4
  135. reflex/components/radix/themes/typography/heading.pyi +5 -4
  136. reflex/components/radix/themes/typography/link.py +42 -9
  137. reflex/components/radix/themes/typography/link.pyi +311 -6
  138. reflex/components/radix/themes/typography/text.pyi +29 -22
  139. reflex/components/react_player/audio.pyi +5 -4
  140. reflex/components/react_player/react_player.pyi +5 -4
  141. reflex/components/react_player/video.pyi +5 -4
  142. reflex/components/recharts/cartesian.py +2 -1
  143. reflex/components/recharts/cartesian.pyi +65 -46
  144. reflex/components/recharts/charts.py +4 -2
  145. reflex/components/recharts/charts.pyi +36 -24
  146. reflex/components/recharts/general.pyi +24 -18
  147. reflex/components/recharts/polar.py +8 -4
  148. reflex/components/recharts/polar.pyi +16 -10
  149. reflex/components/recharts/recharts.pyi +9 -7
  150. reflex/components/sonner/toast.py +2 -2
  151. reflex/components/sonner/toast.pyi +7 -6
  152. reflex/config.py +3 -77
  153. reflex/constants/__init__.py +1 -0
  154. reflex/constants/base.py +38 -8
  155. reflex/constants/compiler.py +4 -2
  156. reflex/constants/event.py +1 -0
  157. reflex/constants/installer.py +23 -16
  158. reflex/constants/state.py +2 -0
  159. reflex/custom_components/custom_components.py +0 -14
  160. reflex/environment.py +1 -1
  161. reflex/event.py +178 -81
  162. reflex/experimental/__init__.py +0 -30
  163. reflex/istate/proxy.py +5 -3
  164. reflex/page.py +0 -27
  165. reflex/plugins/__init__.py +3 -2
  166. reflex/plugins/base.py +5 -1
  167. reflex/plugins/shared_tailwind.py +158 -0
  168. reflex/plugins/sitemap.py +206 -0
  169. reflex/plugins/tailwind_v3.py +13 -106
  170. reflex/plugins/tailwind_v4.py +15 -108
  171. reflex/reflex.py +1 -0
  172. reflex/state.py +134 -140
  173. reflex/testing.py +57 -9
  174. reflex/utils/build.py +9 -69
  175. reflex/utils/exec.py +59 -161
  176. reflex/utils/export.py +1 -1
  177. reflex/utils/imports.py +0 -4
  178. reflex/utils/misc.py +28 -0
  179. reflex/utils/prerequisites.py +62 -59
  180. reflex/utils/processes.py +6 -6
  181. reflex/utils/pyi_generator.py +21 -9
  182. reflex/utils/serializers.py +14 -1
  183. reflex/utils/types.py +196 -61
  184. reflex/vars/__init__.py +2 -0
  185. reflex/vars/base.py +367 -134
  186. {reflex-0.7.14a6.dist-info → reflex-0.8.0a1.dist-info}/METADATA +12 -5
  187. {reflex-0.7.14a6.dist-info → reflex-0.8.0a1.dist-info}/RECORD +190 -197
  188. reflex/.templates/web/next.config.js +0 -7
  189. reflex/components/base/head.py +0 -20
  190. reflex/components/base/head.pyi +0 -116
  191. reflex/components/next/__init__.py +0 -10
  192. reflex/components/next/base.py +0 -7
  193. reflex/components/next/image.py +0 -117
  194. reflex/components/next/image.pyi +0 -94
  195. reflex/components/next/link.py +0 -20
  196. reflex/components/next/link.pyi +0 -67
  197. reflex/components/next/video.py +0 -38
  198. reflex/components/next/video.pyi +0 -68
  199. reflex/components/suneditor/__init__.py +0 -5
  200. reflex/components/suneditor/editor.py +0 -269
  201. reflex/components/suneditor/editor.pyi +0 -199
  202. reflex/experimental/layout.py +0 -254
  203. reflex/experimental/layout.pyi +0 -814
  204. {reflex-0.7.14a6.dist-info → reflex-0.8.0a1.dist-info}/WHEEL +0 -0
  205. {reflex-0.7.14a6.dist-info → reflex-0.8.0a1.dist-info}/entry_points.txt +0 -0
  206. {reflex-0.7.14a6.dist-info → reflex-0.8.0a1.dist-info}/licenses/LICENSE +0 -0
@@ -9,7 +9,7 @@ from typing import Any, Literal, overload
9
9
  from reflex.components.component import MemoizationLeaf
10
10
  from reflex.components.core.breakpoints import Breakpoints
11
11
  from reflex.constants.colors import Color
12
- from reflex.event import EventType
12
+ from reflex.event import EventType, PointerEventInfo
13
13
  from reflex.vars.base import Var
14
14
 
15
15
  from .recharts import Recharts
@@ -38,9 +38,9 @@ class ResponsiveContainer(Recharts, MemoizationLeaf):
38
38
  autofocus: bool | None = None,
39
39
  custom_attrs: dict[str, Var | Any] | None = None,
40
40
  on_blur: EventType[()] | None = None,
41
- on_click: EventType[()] | None = None,
42
- on_context_menu: EventType[()] | None = None,
43
- on_double_click: EventType[()] | None = None,
41
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
42
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
43
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
44
44
  on_focus: EventType[()] | None = None,
45
45
  on_mount: EventType[()] | None = None,
46
46
  on_mouse_down: EventType[()] | None = None,
@@ -52,6 +52,7 @@ class ResponsiveContainer(Recharts, MemoizationLeaf):
52
52
  on_mouse_up: EventType[()] | None = None,
53
53
  on_resize: EventType[()] | None = None,
54
54
  on_scroll: EventType[()] | None = None,
55
+ on_scroll_end: EventType[()] | None = None,
55
56
  on_unmount: EventType[()] | None = None,
56
57
  **props,
57
58
  ) -> ResponsiveContainer:
@@ -141,8 +142,8 @@ class Legend(Recharts):
141
142
  custom_attrs: dict[str, Var | Any] | None = None,
142
143
  on_blur: EventType[()] | None = None,
143
144
  on_click: EventType[()] | None = None,
144
- on_context_menu: EventType[()] | None = None,
145
- on_double_click: EventType[()] | None = None,
145
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
146
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
146
147
  on_focus: EventType[()] | None = None,
147
148
  on_mount: EventType[()] | None = None,
148
149
  on_mouse_down: EventType[()] | None = None,
@@ -153,6 +154,7 @@ class Legend(Recharts):
153
154
  on_mouse_over: EventType[()] | None = None,
154
155
  on_mouse_up: EventType[()] | None = None,
155
156
  on_scroll: EventType[()] | None = None,
157
+ on_scroll_end: EventType[()] | None = None,
156
158
  on_unmount: EventType[()] | None = None,
157
159
  **props,
158
160
  ) -> Legend:
@@ -230,9 +232,9 @@ class GraphingTooltip(Recharts):
230
232
  autofocus: bool | None = None,
231
233
  custom_attrs: dict[str, Var | Any] | None = None,
232
234
  on_blur: EventType[()] | None = None,
233
- on_click: EventType[()] | None = None,
234
- on_context_menu: EventType[()] | None = None,
235
- on_double_click: EventType[()] | None = None,
235
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
236
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
237
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
236
238
  on_focus: EventType[()] | None = None,
237
239
  on_mount: EventType[()] | None = None,
238
240
  on_mouse_down: EventType[()] | None = None,
@@ -243,6 +245,7 @@ class GraphingTooltip(Recharts):
243
245
  on_mouse_over: EventType[()] | None = None,
244
246
  on_mouse_up: EventType[()] | None = None,
245
247
  on_scroll: EventType[()] | None = None,
248
+ on_scroll_end: EventType[()] | None = None,
246
249
  on_unmount: EventType[()] | None = None,
247
250
  **props,
248
251
  ) -> GraphingTooltip:
@@ -343,9 +346,9 @@ class Label(Recharts):
343
346
  autofocus: bool | None = None,
344
347
  custom_attrs: dict[str, Var | Any] | None = None,
345
348
  on_blur: EventType[()] | None = None,
346
- on_click: EventType[()] | None = None,
347
- on_context_menu: EventType[()] | None = None,
348
- on_double_click: EventType[()] | None = None,
349
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
350
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
351
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
349
352
  on_focus: EventType[()] | None = None,
350
353
  on_mount: EventType[()] | None = None,
351
354
  on_mouse_down: EventType[()] | None = None,
@@ -356,6 +359,7 @@ class Label(Recharts):
356
359
  on_mouse_over: EventType[()] | None = None,
357
360
  on_mouse_up: EventType[()] | None = None,
358
361
  on_scroll: EventType[()] | None = None,
362
+ on_scroll_end: EventType[()] | None = None,
359
363
  on_unmount: EventType[()] | None = None,
360
364
  **props,
361
365
  ) -> Label:
@@ -445,9 +449,9 @@ class LabelList(Recharts):
445
449
  autofocus: bool | None = None,
446
450
  custom_attrs: dict[str, Var | Any] | None = None,
447
451
  on_blur: EventType[()] | None = None,
448
- on_click: EventType[()] | None = None,
449
- on_context_menu: EventType[()] | None = None,
450
- on_double_click: EventType[()] | None = None,
452
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
453
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
454
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
451
455
  on_focus: EventType[()] | None = None,
452
456
  on_mount: EventType[()] | None = None,
453
457
  on_mouse_down: EventType[()] | None = None,
@@ -458,6 +462,7 @@ class LabelList(Recharts):
458
462
  on_mouse_over: EventType[()] | None = None,
459
463
  on_mouse_up: EventType[()] | None = None,
460
464
  on_scroll: EventType[()] | None = None,
465
+ on_scroll_end: EventType[()] | None = None,
461
466
  on_unmount: EventType[()] | None = None,
462
467
  **props,
463
468
  ) -> LabelList:
@@ -503,9 +508,9 @@ class Cell(Recharts):
503
508
  autofocus: bool | None = None,
504
509
  custom_attrs: dict[str, Var | Any] | None = None,
505
510
  on_blur: EventType[()] | None = None,
506
- on_click: EventType[()] | None = None,
507
- on_context_menu: EventType[()] | None = None,
508
- on_double_click: EventType[()] | None = None,
511
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
512
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
513
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
509
514
  on_focus: EventType[()] | None = None,
510
515
  on_mount: EventType[()] | None = None,
511
516
  on_mouse_down: EventType[()] | None = None,
@@ -516,6 +521,7 @@ class Cell(Recharts):
516
521
  on_mouse_over: EventType[()] | None = None,
517
522
  on_mouse_up: EventType[()] | None = None,
518
523
  on_scroll: EventType[()] | None = None,
524
+ on_scroll_end: EventType[()] | None = None,
519
525
  on_unmount: EventType[()] | None = None,
520
526
  **props,
521
527
  ) -> Cell:
@@ -95,7 +95,8 @@ class Pie(Recharts):
95
95
  # The tabindex of wrapper surrounding the cells. Default: 0
96
96
  root_tab_index: Var[int]
97
97
 
98
- def get_event_triggers(self) -> dict[str, Var | Any]:
98
+ @classmethod
99
+ def get_event_triggers(cls) -> dict[str, Var | Any]:
99
100
  """Get the event triggers that pass the component's value to the handler.
100
101
 
101
102
  Returns:
@@ -159,7 +160,8 @@ class Radar(Recharts):
159
160
  # Valid children components
160
161
  _valid_children: ClassVar[list[str]] = ["LabelList"]
161
162
 
162
- def get_event_triggers(self) -> dict[str, Var | Any]:
163
+ @classmethod
164
+ def get_event_triggers(cls) -> dict[str, Var | Any]:
163
165
  """Get the event triggers that pass the component's value to the handler.
164
166
 
165
167
  Returns:
@@ -211,7 +213,8 @@ class RadialBar(Recharts):
211
213
  # Valid children components
212
214
  _valid_children: ClassVar[list[str]] = ["Cell", "LabelList"]
213
215
 
214
- def get_event_triggers(self) -> dict[str, Var | Any]:
216
+ @classmethod
217
+ def get_event_triggers(cls) -> dict[str, Var | Any]:
215
218
  """Get the event triggers that pass the component's value to the handler.
216
219
 
217
220
  Returns:
@@ -384,7 +387,8 @@ class PolarRadiusAxis(Recharts):
384
387
  # The stroke color of axis. Default: rx.color("gray", 10)
385
388
  stroke: Var[str | Color] = LiteralVar.create(Color("gray", 10))
386
389
 
387
- def get_event_triggers(self) -> dict[str, Var | Any]:
390
+ @classmethod
391
+ def get_event_triggers(cls) -> dict[str, Var | Any]:
388
392
  """Get the event triggers that pass the component's value to the handler.
389
393
 
390
394
  Returns:
@@ -8,13 +8,14 @@ from typing import Any, Literal, overload
8
8
 
9
9
  from reflex.components.core.breakpoints import Breakpoints
10
10
  from reflex.constants.colors import Color
11
- from reflex.event import EventType
11
+ from reflex.event import EventType, PointerEventInfo
12
12
  from reflex.vars.base import Var
13
13
 
14
14
  from .recharts import Recharts
15
15
 
16
16
  class Pie(Recharts):
17
- def get_event_triggers(self) -> dict[str, Var | Any]: ...
17
+ @classmethod
18
+ def get_event_triggers(cls) -> dict[str, Var | Any]: ...
18
19
  @overload
19
20
  @classmethod
20
21
  def create( # type: ignore
@@ -133,7 +134,8 @@ class Pie(Recharts):
133
134
  """
134
135
 
135
136
  class Radar(Recharts):
136
- def get_event_triggers(self) -> dict[str, Var | Any]: ...
137
+ @classmethod
138
+ def get_event_triggers(cls) -> dict[str, Var | Any]: ...
137
139
  @overload
138
140
  @classmethod
139
141
  def create( # type: ignore
@@ -228,7 +230,8 @@ class Radar(Recharts):
228
230
  """
229
231
 
230
232
  class RadialBar(Recharts):
231
- def get_event_triggers(self) -> dict[str, Var | Any]: ...
233
+ @classmethod
234
+ def get_event_triggers(cls) -> dict[str, Var | Any]: ...
232
235
  @overload
233
236
  @classmethod
234
237
  def create( # type: ignore
@@ -357,8 +360,8 @@ class PolarAngleAxis(Recharts):
357
360
  custom_attrs: dict[str, Var | Any] | None = None,
358
361
  on_blur: EventType[()] | None = None,
359
362
  on_click: EventType[()] | None = None,
360
- on_context_menu: EventType[()] | None = None,
361
- on_double_click: EventType[()] | None = None,
363
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
364
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
362
365
  on_focus: EventType[()] | None = None,
363
366
  on_mount: EventType[()] | None = None,
364
367
  on_mouse_down: EventType[()] | None = None,
@@ -369,6 +372,7 @@ class PolarAngleAxis(Recharts):
369
372
  on_mouse_over: EventType[()] | None = None,
370
373
  on_mouse_up: EventType[()] | None = None,
371
374
  on_scroll: EventType[()] | None = None,
375
+ on_scroll_end: EventType[()] | None = None,
372
376
  on_unmount: EventType[()] | None = None,
373
377
  **props,
374
378
  ) -> PolarAngleAxis:
@@ -437,9 +441,9 @@ class PolarGrid(Recharts):
437
441
  autofocus: bool | None = None,
438
442
  custom_attrs: dict[str, Var | Any] | None = None,
439
443
  on_blur: EventType[()] | None = None,
440
- on_click: EventType[()] | None = None,
441
- on_context_menu: EventType[()] | None = None,
442
- on_double_click: EventType[()] | None = None,
444
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
445
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
446
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
443
447
  on_focus: EventType[()] | None = None,
444
448
  on_mount: EventType[()] | None = None,
445
449
  on_mouse_down: EventType[()] | None = None,
@@ -450,6 +454,7 @@ class PolarGrid(Recharts):
450
454
  on_mouse_over: EventType[()] | None = None,
451
455
  on_mouse_up: EventType[()] | None = None,
452
456
  on_scroll: EventType[()] | None = None,
457
+ on_scroll_end: EventType[()] | None = None,
453
458
  on_unmount: EventType[()] | None = None,
454
459
  **props,
455
460
  ) -> PolarGrid:
@@ -479,7 +484,8 @@ class PolarGrid(Recharts):
479
484
  """
480
485
 
481
486
  class PolarRadiusAxis(Recharts):
482
- def get_event_triggers(self) -> dict[str, Var | Any]: ...
487
+ @classmethod
488
+ def get_event_triggers(cls) -> dict[str, Var | Any]: ...
483
489
  @overload
484
490
  @classmethod
485
491
  def create( # type: ignore
@@ -8,7 +8,7 @@ from typing import Any, Literal, overload
8
8
 
9
9
  from reflex.components.component import Component, MemoizationLeaf, NoSSRComponent
10
10
  from reflex.components.core.breakpoints import Breakpoints
11
- from reflex.event import EventType
11
+ from reflex.event import EventType, PointerEventInfo
12
12
  from reflex.vars.base import Var
13
13
 
14
14
  class Recharts(Component):
@@ -29,9 +29,9 @@ class Recharts(Component):
29
29
  autofocus: bool | None = None,
30
30
  custom_attrs: dict[str, Var | Any] | None = None,
31
31
  on_blur: EventType[()] | None = None,
32
- on_click: EventType[()] | None = None,
33
- on_context_menu: EventType[()] | None = None,
34
- on_double_click: EventType[()] | None = None,
32
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
33
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
34
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
35
35
  on_focus: EventType[()] | None = None,
36
36
  on_mount: EventType[()] | None = None,
37
37
  on_mouse_down: EventType[()] | None = None,
@@ -42,6 +42,7 @@ class Recharts(Component):
42
42
  on_mouse_over: EventType[()] | None = None,
43
43
  on_mouse_up: EventType[()] | None = None,
44
44
  on_scroll: EventType[()] | None = None,
45
+ on_scroll_end: EventType[()] | None = None,
45
46
  on_unmount: EventType[()] | None = None,
46
47
  **props,
47
48
  ) -> Recharts:
@@ -80,9 +81,9 @@ class RechartsCharts(NoSSRComponent, MemoizationLeaf):
80
81
  autofocus: bool | None = None,
81
82
  custom_attrs: dict[str, Var | Any] | None = None,
82
83
  on_blur: EventType[()] | None = None,
83
- on_click: EventType[()] | None = None,
84
- on_context_menu: EventType[()] | None = None,
85
- on_double_click: EventType[()] | None = None,
84
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
85
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
86
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
86
87
  on_focus: EventType[()] | None = None,
87
88
  on_mount: EventType[()] | None = None,
88
89
  on_mouse_down: EventType[()] | None = None,
@@ -93,6 +94,7 @@ class RechartsCharts(NoSSRComponent, MemoizationLeaf):
93
94
  on_mouse_over: EventType[()] | None = None,
94
95
  on_mouse_up: EventType[()] | None = None,
95
96
  on_scroll: EventType[()] | None = None,
97
+ on_scroll_end: EventType[()] | None = None,
96
98
  on_unmount: EventType[()] | None = None,
97
99
  **props,
98
100
  ) -> RechartsCharts:
@@ -7,7 +7,7 @@ from typing import Any, Literal
7
7
  from reflex.base import Base
8
8
  from reflex.components.component import Component, ComponentNamespace
9
9
  from reflex.components.lucide.icon import Icon
10
- from reflex.components.props import NoExtrasAllowedProps, PropsBase
10
+ from reflex.components.props import NoExtrasAllowedProps
11
11
  from reflex.constants.base import Dirs
12
12
  from reflex.event import EventSpec, run_script
13
13
  from reflex.style import Style, resolved_color_mode
@@ -74,7 +74,7 @@ def _toast_callback_signature(toast: Var) -> list[Var]:
74
74
  ]
75
75
 
76
76
 
77
- class ToastProps(PropsBase, NoExtrasAllowedProps):
77
+ class ToastProps(NoExtrasAllowedProps):
78
78
  """Props for the toast component."""
79
79
 
80
80
  # Toast's title, renders above the description.
@@ -10,9 +10,9 @@ from reflex.base import Base
10
10
  from reflex.components.component import Component, ComponentNamespace
11
11
  from reflex.components.core.breakpoints import Breakpoints
12
12
  from reflex.components.lucide.icon import Icon
13
- from reflex.components.props import NoExtrasAllowedProps, PropsBase
13
+ from reflex.components.props import NoExtrasAllowedProps
14
14
  from reflex.constants.base import Dirs
15
- from reflex.event import EventSpec, EventType
15
+ from reflex.event import EventSpec, EventType, PointerEventInfo
16
16
  from reflex.style import Style
17
17
  from reflex.utils.imports import ImportVar
18
18
  from reflex.utils.serializers import serializer
@@ -39,7 +39,7 @@ class ToastAction(Base):
39
39
  @serializer
40
40
  def serialize_action(action: ToastAction) -> dict: ...
41
41
 
42
- class ToastProps(PropsBase, NoExtrasAllowedProps):
42
+ class ToastProps(NoExtrasAllowedProps):
43
43
  title: str | Var | None
44
44
  description: str | Var | None
45
45
  close_button: bool | None
@@ -131,9 +131,9 @@ class Toaster(Component):
131
131
  autofocus: bool | None = None,
132
132
  custom_attrs: dict[str, Var | Any] | None = None,
133
133
  on_blur: EventType[()] | None = None,
134
- on_click: EventType[()] | None = None,
135
- on_context_menu: EventType[()] | None = None,
136
- on_double_click: EventType[()] | None = None,
134
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
135
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
136
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
137
137
  on_focus: EventType[()] | None = None,
138
138
  on_mount: EventType[()] | None = None,
139
139
  on_mouse_down: EventType[()] | None = None,
@@ -144,6 +144,7 @@ class Toaster(Component):
144
144
  on_mouse_over: EventType[()] | None = None,
145
145
  on_mouse_up: EventType[()] | None = None,
146
146
  on_scroll: EventType[()] | None = None,
147
+ on_scroll_end: EventType[()] | None = None,
147
148
  on_unmount: EventType[()] | None = None,
148
149
  **props,
149
150
  ) -> Toaster:
reflex/config.py CHANGED
@@ -22,7 +22,7 @@ from reflex.environment import EnvVar as EnvVar
22
22
  from reflex.environment import ExistingPath, interpret_env_var_value
23
23
  from reflex.environment import env_var as env_var
24
24
  from reflex.environment import environment as environment
25
- from reflex.plugins import Plugin, TailwindV3Plugin, TailwindV4Plugin
25
+ from reflex.plugins import Plugin
26
26
  from reflex.utils import console
27
27
  from reflex.utils.exceptions import ConfigError
28
28
  from reflex.utils.types import true_type_for_pydantic_field
@@ -53,19 +53,7 @@ def _load_dotenv_from_str(env_files: str) -> None:
53
53
 
54
54
  def _load_dotenv_from_env():
55
55
  """Load environment variables from paths specified in REFLEX_ENV_FILE."""
56
- show_deprecation = False
57
56
  env_env_file = os.environ.get("REFLEX_ENV_FILE")
58
- if not env_env_file:
59
- env_env_file = os.environ.get("ENV_FILE")
60
- if env_env_file:
61
- show_deprecation = True
62
- if show_deprecation:
63
- console.deprecate(
64
- "Usage of deprecated ENV_FILE env var detected.",
65
- reason="Prefer `REFLEX_` prefix when setting env vars.",
66
- deprecation_version="0.7.13",
67
- removal_version="0.8.0",
68
- )
69
57
  if env_env_file:
70
58
  _load_dotenv_from_str(env_env_file)
71
59
 
@@ -261,36 +249,12 @@ class Config(Base):
261
249
  # List of origins that are allowed to connect to the backend API.
262
250
  cors_allowed_origins: list[str] = ["*"]
263
251
 
264
- # Tailwind config.
265
- tailwind: dict[str, Any] | None = {"plugins": ["@tailwindcss/typography"]}
266
-
267
- # DEPRECATED. Timeout when launching the gunicorn server.
268
- timeout: int | None = None
269
-
270
- # Whether to enable or disable nextJS gzip compression.
271
- next_compression: bool = True
272
-
273
- # Whether to enable or disable NextJS dev indicator.
274
- next_dev_indicators: bool = False
275
-
276
- # Whether to use React strict mode in nextJS
252
+ # Whether to use React strict mode.
277
253
  react_strict_mode: bool = True
278
254
 
279
255
  # Additional frontend packages to install.
280
256
  frontend_packages: list[str] = []
281
257
 
282
- # DEPRECATED. The worker class used in production mode
283
- gunicorn_worker_class: str = "uvicorn.workers.UvicornH11Worker"
284
-
285
- # DEPRECATED. Number of gunicorn workers from user
286
- gunicorn_workers: int | None = None
287
-
288
- # DEPRECATED. Number of requests before a worker is restarted; set to 0 to disable
289
- gunicorn_max_requests: int | None = None
290
-
291
- # DEPRECATED. Variance limit for max requests; gunicorn only
292
- gunicorn_max_requests_jitter: int | None = None
293
-
294
258
  # Indicate which type of state manager to use
295
259
  state_manager_mode: constants.StateManagerMode = constants.StateManagerMode.DISK
296
260
 
@@ -339,25 +303,12 @@ class Config(Base):
339
303
  super().__init__(*args, **kwargs)
340
304
 
341
305
  # Clean up this code when we remove plain envvar in 0.8.0
342
- show_deprecation = False
343
306
  env_loglevel = os.environ.get("REFLEX_LOGLEVEL")
344
- if not env_loglevel:
345
- env_loglevel = os.environ.get("LOGLEVEL")
346
- if env_loglevel:
347
- show_deprecation = True
348
307
  if env_loglevel is not None:
349
308
  env_loglevel = LogLevel(env_loglevel.lower())
350
309
  if env_loglevel or self.loglevel != LogLevel.DEFAULT:
351
310
  console.set_log_level(env_loglevel or self.loglevel)
352
311
 
353
- if show_deprecation:
354
- console.deprecate(
355
- "Usage of deprecated LOGLEVEL env var detected.",
356
- reason="Prefer `REFLEX_` prefix when setting env vars.",
357
- deprecation_version="0.7.13",
358
- removal_version="0.8.0",
359
- )
360
-
361
312
  # Update the config from environment variables.
362
313
  env_kwargs = self.update_from_env()
363
314
  for key, env_value in env_kwargs.items():
@@ -368,23 +319,6 @@ class Config(Base):
368
319
  self._non_default_attributes.update(kwargs)
369
320
  self._replace_defaults(**kwargs)
370
321
 
371
- if self.tailwind is not None and not any(
372
- isinstance(plugin, (TailwindV3Plugin, TailwindV4Plugin))
373
- for plugin in self.plugins
374
- ):
375
- console.deprecate(
376
- "Inferring tailwind usage",
377
- reason="""
378
-
379
- If you are using tailwind, add `rx.plugins.TailwindV3Plugin()` to the `plugins=[]` in rxconfig.py.
380
-
381
- If you are not using tailwind, set `tailwind` to `None` in rxconfig.py.""",
382
- deprecation_version="0.7.13",
383
- removal_version="0.8.0",
384
- dedupe=True,
385
- )
386
- self.plugins.append(TailwindV3Plugin())
387
-
388
322
  if (
389
323
  self.state_manager_mode == constants.StateManagerMode.REDIS
390
324
  and not self.redis_url
@@ -430,18 +364,10 @@ If you are not using tailwind, set `tailwind` to `None` in rxconfig.py.""",
430
364
  # Iterate over the fields.
431
365
  for key, field in self.__fields__.items():
432
366
  # The env var name is the key in uppercase.
367
+ environment_variable = None
433
368
  for prefix in self._prefixes:
434
369
  if environment_variable := os.environ.get(f"{prefix}{key.upper()}"):
435
370
  break
436
- else:
437
- # Default to non-prefixed env var if other are not found.
438
- if environment_variable := os.environ.get(key.upper()):
439
- console.deprecate(
440
- f"Usage of deprecated {key.upper()} env var detected.",
441
- reason=f"Prefer `{self._prefixes[0]}` prefix when setting env vars.",
442
- deprecation_version="0.7.13",
443
- removal_version="0.8.0",
444
- )
445
371
 
446
372
  # If the env var is set, override the config value.
447
373
  if environment_variable and environment_variable.strip():
@@ -18,6 +18,7 @@ from .base import (
18
18
  LogLevel,
19
19
  Next,
20
20
  Ping,
21
+ ReactRouter,
21
22
  Reflex,
22
23
  ReflexHostingCLI,
23
24
  Templates,
reflex/constants/base.py CHANGED
@@ -38,14 +38,18 @@ class Dirs(SimpleNamespace):
38
38
  COMPONENTS_PATH = UTILS + "/components"
39
39
  # The name of the contexts file.
40
40
  CONTEXTS_PATH = UTILS + "/context"
41
- # The name of the output static directory.
42
- STATIC = "_static"
41
+ # The name of the output directory.
42
+ BUILD_DIR = "build"
43
+ # The name of the static files directory.
44
+ STATIC = BUILD_DIR + "/client"
43
45
  # The name of the public html directory served at "/"
44
46
  PUBLIC = "public"
45
47
  # The directory where styles are located.
46
48
  STYLES = "styles"
47
49
  # The name of the pages directory.
48
- PAGES = "pages"
50
+ PAGES = "app"
51
+ # The name of the routes directory.
52
+ ROUTES = "routes"
49
53
  # The name of the env json file.
50
54
  ENV_JSON = "env.json"
51
55
  # The name of the reflex json file.
@@ -194,21 +198,47 @@ class Templates(SimpleNamespace):
194
198
  CODE = "code"
195
199
 
196
200
 
197
- class Next(SimpleNamespace):
201
+ class Javascript(SimpleNamespace):
202
+ """Constants related to Javascript."""
203
+
204
+ # The node modules directory.
205
+ NODE_MODULES = "node_modules"
206
+
207
+ # The package lock file.
208
+ PACKAGE_LOCK = "package-lock.json"
209
+
210
+
211
+ class Next(Javascript):
198
212
  """Constants related to NextJS."""
199
213
 
200
214
  # The NextJS config file
201
215
  CONFIG_FILE = "next.config.js"
216
+
202
217
  # The sitemap config file.
203
218
  SITEMAP_CONFIG_FILE = "next-sitemap.config.js"
204
- # The node modules directory.
205
- NODE_MODULES = "node_modules"
206
- # The package lock file.
207
- PACKAGE_LOCK = "package-lock.json"
219
+
208
220
  # Regex to check for message displayed when frontend comes up
209
221
  FRONTEND_LISTENING_REGEX = "Local:[\\s]+(.*)"
210
222
 
211
223
 
224
+ class ReactRouter(Javascript):
225
+ """Constants related to React Router."""
226
+
227
+ # The react router config file
228
+ CONFIG_FILE = "react-router.config.js"
229
+
230
+ # Regex to check for message displayed when frontend comes up
231
+ DEV_FRONTEND_LISTENING_REGEX = r"Local:[\s]+"
232
+
233
+ # Regex to pattern the route path in the config file
234
+ # INFO Accepting connections at http://localhost:3000
235
+ PROD_FRONTEND_LISTENING_REGEX = r"Accepting connections at[\s]+"
236
+
237
+ FRONTEND_LISTENING_REGEX = (
238
+ rf"(?:{DEV_FRONTEND_LISTENING_REGEX}|{PROD_FRONTEND_LISTENING_REGEX})(.*)"
239
+ )
240
+
241
+
212
242
  # Color mode variables
213
243
  class ColorMode(SimpleNamespace):
214
244
  """Constants related to ColorMode."""
@@ -20,6 +20,8 @@ class Ext(SimpleNamespace):
20
20
 
21
21
  # The extension for JS files.
22
22
  JS = ".js"
23
+ # The extension for JSX files.
24
+ JSX = ".jsx"
23
25
  # The extension for python files.
24
26
  PY = ".py"
25
27
  # The extension for css files.
@@ -83,11 +85,11 @@ class PageNames(SimpleNamespace):
83
85
  # The name of the index page.
84
86
  INDEX_ROUTE = "index"
85
87
  # The name of the app root page.
86
- APP_ROOT = "_app"
88
+ APP_ROOT = "root.js"
87
89
  # The root stylesheet filename.
88
90
  STYLESHEET_ROOT = "__reflex_global_styles"
89
91
  # The name of the document root page.
90
- DOCUMENT_ROOT = "_document"
92
+ DOCUMENT_ROOT = "_document.js"
91
93
  # The name of the theme page.
92
94
  THEME = "theme"
93
95
  # The module containing components.
reflex/constants/event.py CHANGED
@@ -91,6 +91,7 @@ class EventTriggers(SimpleNamespace):
91
91
  ON_POINTER_DOWN_OUTSIDE = "on_pointer_down_outside"
92
92
  ON_INTERACT_OUTSIDE = "on_interact_outside"
93
93
  ON_SCROLL = "on_scroll"
94
+ ON_SCROLL_END = "on_scroll_end"
94
95
  ON_SUBMIT = "on_submit"
95
96
  ON_MOUNT = "on_mount"
96
97
  ON_UNMOUNT = "on_unmount"