reflex 0.6.4a3__py3-none-any.whl → 0.6.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 (228) hide show
  1. reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -14
  2. reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -8
  3. reflex/.templates/web/components/shiki/code.js +16 -11
  4. reflex/.templates/web/utils/state.js +29 -21
  5. reflex/__init__.py +4 -0
  6. reflex/__init__.pyi +4 -0
  7. reflex/app.py +148 -154
  8. reflex/app_mixins/lifespan.py +5 -1
  9. reflex/app_mixins/middleware.py +3 -1
  10. reflex/app_mixins/mixin.py +3 -2
  11. reflex/base.py +2 -4
  12. reflex/compiler/compiler.py +111 -37
  13. reflex/components/base/app_wrap.pyi +17 -17
  14. reflex/components/base/bare.py +72 -3
  15. reflex/components/base/body.pyi +17 -17
  16. reflex/components/base/document.pyi +81 -81
  17. reflex/components/base/error_boundary.pyi +25 -18
  18. reflex/components/base/fragment.pyi +17 -17
  19. reflex/components/base/head.pyi +33 -33
  20. reflex/components/base/link.pyi +33 -33
  21. reflex/components/base/meta.pyi +65 -65
  22. reflex/components/base/script.py +4 -4
  23. reflex/components/base/script.pyi +23 -20
  24. reflex/components/component.py +250 -31
  25. reflex/components/core/banner.py +1 -1
  26. reflex/components/core/banner.pyi +81 -81
  27. reflex/components/core/client_side_routing.pyi +33 -33
  28. reflex/components/core/clipboard.py +2 -2
  29. reflex/components/core/clipboard.pyi +24 -18
  30. reflex/components/core/debounce.py +2 -2
  31. reflex/components/core/debounce.pyi +18 -18
  32. reflex/components/core/html.pyi +17 -17
  33. reflex/components/core/upload.py +90 -28
  34. reflex/components/core/upload.pyi +128 -72
  35. reflex/components/datadisplay/code.py +55 -40
  36. reflex/components/datadisplay/code.pyi +46 -44
  37. reflex/components/datadisplay/dataeditor.py +21 -20
  38. reflex/components/datadisplay/dataeditor.pyi +103 -35
  39. reflex/components/datadisplay/shiki_code_block.py +60 -27
  40. reflex/components/datadisplay/shiki_code_block.pyi +86 -65
  41. reflex/components/dynamic.py +9 -5
  42. reflex/components/el/element.pyi +17 -17
  43. reflex/components/el/elements/base.pyi +17 -17
  44. reflex/components/el/elements/forms.py +12 -3
  45. reflex/components/el/elements/forms.pyi +293 -233
  46. reflex/components/el/elements/inline.pyi +449 -449
  47. reflex/components/el/elements/media.pyi +401 -401
  48. reflex/components/el/elements/metadata.pyi +97 -97
  49. reflex/components/el/elements/other.pyi +113 -113
  50. reflex/components/el/elements/scripts.pyi +49 -49
  51. reflex/components/el/elements/sectioning.pyi +241 -241
  52. reflex/components/el/elements/tables.pyi +161 -161
  53. reflex/components/el/elements/typography.pyi +241 -241
  54. reflex/components/gridjs/datatable.pyi +33 -33
  55. reflex/components/lucide/icon.py +1 -1
  56. reflex/components/lucide/icon.pyi +33 -33
  57. reflex/components/markdown/markdown.py +180 -49
  58. reflex/components/markdown/markdown.pyi +36 -19
  59. reflex/components/moment/moment.py +17 -21
  60. reflex/components/moment/moment.pyi +26 -21
  61. reflex/components/next/base.pyi +17 -17
  62. reflex/components/next/image.py +3 -3
  63. reflex/components/next/image.pyi +21 -19
  64. reflex/components/next/link.pyi +17 -17
  65. reflex/components/next/video.pyi +17 -17
  66. reflex/components/plotly/plotly.py +79 -78
  67. reflex/components/plotly/plotly.pyi +91 -41
  68. reflex/components/props.py +34 -0
  69. reflex/components/radix/primitives/accordion.py +15 -8
  70. reflex/components/radix/primitives/accordion.pyi +121 -118
  71. reflex/components/radix/primitives/base.pyi +33 -33
  72. reflex/components/radix/primitives/drawer.py +41 -20
  73. reflex/components/radix/primitives/drawer.pyi +279 -190
  74. reflex/components/radix/primitives/form.py +2 -2
  75. reflex/components/radix/primitives/form.pyi +200 -167
  76. reflex/components/radix/primitives/progress.pyi +81 -81
  77. reflex/components/radix/primitives/slider.pyi +89 -83
  78. reflex/components/radix/themes/base.py +30 -1
  79. reflex/components/radix/themes/base.pyi +286 -113
  80. reflex/components/radix/themes/color_mode.py +17 -9
  81. reflex/components/radix/themes/color_mode.pyi +68 -56
  82. reflex/components/radix/themes/components/alert_dialog.py +8 -5
  83. reflex/components/radix/themes/components/alert_dialog.pyi +125 -117
  84. reflex/components/radix/themes/components/aspect_ratio.pyi +17 -17
  85. reflex/components/radix/themes/components/avatar.py +1 -5
  86. reflex/components/radix/themes/components/avatar.pyi +17 -17
  87. reflex/components/radix/themes/components/badge.py +1 -5
  88. reflex/components/radix/themes/components/badge.pyi +17 -17
  89. reflex/components/radix/themes/components/button.pyi +18 -21
  90. reflex/components/radix/themes/components/callout.py +1 -4
  91. reflex/components/radix/themes/components/callout.pyi +81 -81
  92. reflex/components/radix/themes/components/card.py +1 -3
  93. reflex/components/radix/themes/components/card.pyi +17 -17
  94. reflex/components/radix/themes/components/checkbox.py +4 -8
  95. reflex/components/radix/themes/components/checkbox.pyi +61 -52
  96. reflex/components/radix/themes/components/checkbox_cards.pyi +33 -33
  97. reflex/components/radix/themes/components/checkbox_group.pyi +33 -33
  98. reflex/components/radix/themes/components/context_menu.py +121 -28
  99. reflex/components/radix/themes/components/context_menu.pyi +250 -147
  100. reflex/components/radix/themes/components/data_list.pyi +65 -65
  101. reflex/components/radix/themes/components/dialog.py +11 -11
  102. reflex/components/radix/themes/components/dialog.pyi +135 -120
  103. reflex/components/radix/themes/components/dropdown_menu.py +14 -25
  104. reflex/components/radix/themes/components/dropdown_menu.pyi +157 -145
  105. reflex/components/radix/themes/components/hover_card.py +19 -7
  106. reflex/components/radix/themes/components/hover_card.pyi +102 -67
  107. reflex/components/radix/themes/components/icon_button.pyi +18 -21
  108. reflex/components/radix/themes/components/inset.py +1 -3
  109. reflex/components/radix/themes/components/inset.pyi +17 -17
  110. reflex/components/radix/themes/components/popover.py +22 -13
  111. reflex/components/radix/themes/components/popover.pyi +98 -72
  112. reflex/components/radix/themes/components/progress.pyi +17 -17
  113. reflex/components/radix/themes/components/radio.pyi +17 -17
  114. reflex/components/radix/themes/components/radio_cards.py +2 -2
  115. reflex/components/radix/themes/components/radio_cards.pyi +37 -34
  116. reflex/components/radix/themes/components/radio_group.py +3 -7
  117. reflex/components/radix/themes/components/radio_group.pyi +69 -66
  118. reflex/components/radix/themes/components/scroll_area.py +1 -3
  119. reflex/components/radix/themes/components/scroll_area.pyi +17 -17
  120. reflex/components/radix/themes/components/segmented_control.pyi +37 -34
  121. reflex/components/radix/themes/components/select.py +7 -11
  122. reflex/components/radix/themes/components/select.pyi +175 -154
  123. reflex/components/radix/themes/components/separator.py +1 -4
  124. reflex/components/radix/themes/components/separator.pyi +17 -17
  125. reflex/components/radix/themes/components/skeleton.pyi +17 -17
  126. reflex/components/radix/themes/components/slider.py +12 -21
  127. reflex/components/radix/themes/components/slider.pyi +47 -25
  128. reflex/components/radix/themes/components/spinner.py +1 -4
  129. reflex/components/radix/themes/components/spinner.pyi +17 -17
  130. reflex/components/radix/themes/components/switch.py +3 -6
  131. reflex/components/radix/themes/components/switch.pyi +21 -18
  132. reflex/components/radix/themes/components/table.py +21 -5
  133. reflex/components/radix/themes/components/table.pyi +392 -116
  134. reflex/components/radix/themes/components/tabs.py +3 -6
  135. reflex/components/radix/themes/components/tabs.pyi +89 -83
  136. reflex/components/radix/themes/components/text_area.py +1 -5
  137. reflex/components/radix/themes/components/text_area.pyi +43 -20
  138. reflex/components/radix/themes/components/text_field.py +1 -5
  139. reflex/components/radix/themes/components/text_field.pyi +101 -55
  140. reflex/components/radix/themes/components/tooltip.py +5 -7
  141. reflex/components/radix/themes/components/tooltip.pyi +25 -22
  142. reflex/components/radix/themes/layout/base.py +2 -27
  143. reflex/components/radix/themes/layout/base.pyi +82 -82
  144. reflex/components/radix/themes/layout/box.pyi +17 -17
  145. reflex/components/radix/themes/layout/center.pyi +17 -17
  146. reflex/components/radix/themes/layout/container.pyi +17 -17
  147. reflex/components/radix/themes/layout/flex.py +1 -6
  148. reflex/components/radix/themes/layout/flex.pyi +17 -17
  149. reflex/components/radix/themes/layout/grid.py +1 -6
  150. reflex/components/radix/themes/layout/grid.pyi +17 -17
  151. reflex/components/radix/themes/layout/list.py +20 -15
  152. reflex/components/radix/themes/layout/list.pyi +175 -92
  153. reflex/components/radix/themes/layout/section.pyi +17 -17
  154. reflex/components/radix/themes/layout/spacer.pyi +17 -17
  155. reflex/components/radix/themes/layout/stack.py +6 -6
  156. reflex/components/radix/themes/layout/stack.pyi +91 -62
  157. reflex/components/radix/themes/typography/blockquote.py +2 -8
  158. reflex/components/radix/themes/typography/blockquote.pyi +17 -17
  159. reflex/components/radix/themes/typography/code.py +4 -10
  160. reflex/components/radix/themes/typography/code.pyi +19 -18
  161. reflex/components/radix/themes/typography/heading.py +4 -11
  162. reflex/components/radix/themes/typography/heading.pyi +19 -18
  163. reflex/components/radix/themes/typography/link.py +4 -10
  164. reflex/components/radix/themes/typography/link.pyi +19 -18
  165. reflex/components/radix/themes/typography/text.py +4 -11
  166. reflex/components/radix/themes/typography/text.pyi +115 -114
  167. reflex/components/react_player/audio.pyi +58 -33
  168. reflex/components/react_player/react_player.py +17 -17
  169. reflex/components/react_player/react_player.pyi +55 -33
  170. reflex/components/react_player/video.pyi +58 -33
  171. reflex/components/recharts/cartesian.py +45 -45
  172. reflex/components/recharts/cartesian.pyi +389 -304
  173. reflex/components/recharts/charts.py +22 -22
  174. reflex/components/recharts/charts.pyi +226 -179
  175. reflex/components/recharts/general.py +26 -27
  176. reflex/components/recharts/general.pyi +106 -99
  177. reflex/components/recharts/polar.py +33 -33
  178. reflex/components/recharts/polar.pyi +70 -64
  179. reflex/components/recharts/recharts.pyi +33 -33
  180. reflex/components/sonner/toast.py +9 -36
  181. reflex/components/sonner/toast.pyi +20 -24
  182. reflex/components/suneditor/editor.py +8 -8
  183. reflex/components/suneditor/editor.pyi +50 -25
  184. reflex/components/tags/iter_tag.py +1 -10
  185. reflex/components/tags/tag.py +1 -4
  186. reflex/config.py +198 -35
  187. reflex/constants/__init__.py +4 -16
  188. reflex/constants/base.py +7 -14
  189. reflex/constants/colors.py +0 -1
  190. reflex/constants/installer.py +12 -7
  191. reflex/constants/state.py +4 -0
  192. reflex/custom_components/custom_components.py +6 -6
  193. reflex/event.py +486 -241
  194. reflex/experimental/client_state.py +9 -9
  195. reflex/experimental/layout.py +2 -2
  196. reflex/experimental/layout.pyi +95 -87
  197. reflex/experimental/misc.py +1 -1
  198. reflex/istate/__init__.py +1 -0
  199. reflex/istate/proxy.py +33 -0
  200. reflex/istate/wrappers.py +27 -0
  201. reflex/model.py +7 -7
  202. reflex/page.py +2 -1
  203. reflex/reflex.py +142 -8
  204. reflex/state.py +133 -46
  205. reflex/testing.py +9 -7
  206. reflex/utils/console.py +0 -1
  207. reflex/utils/exceptions.py +31 -3
  208. reflex/utils/exec.py +33 -14
  209. reflex/utils/format.py +15 -12
  210. reflex/utils/net.py +1 -1
  211. reflex/utils/path_ops.py +2 -2
  212. reflex/utils/prerequisites.py +82 -46
  213. reflex/utils/pyi_generator.py +63 -20
  214. reflex/utils/registry.py +1 -1
  215. reflex/utils/serializers.py +75 -36
  216. reflex/utils/telemetry.py +3 -2
  217. reflex/utils/types.py +125 -10
  218. reflex/vars/base.py +131 -119
  219. reflex/vars/function.py +59 -12
  220. reflex/vars/number.py +3 -1
  221. reflex/vars/object.py +30 -24
  222. reflex/vars/sequence.py +7 -7
  223. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/METADATA +3 -3
  224. reflex-0.6.5.dist-info/RECORD +394 -0
  225. reflex-0.6.4a3.dist-info/RECORD +0 -391
  226. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/LICENSE +0 -0
  227. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/WHEEL +0 -0
  228. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/entry_points.txt +0 -0
@@ -6,7 +6,7 @@
6
6
  from typing import Any, Dict, Optional, Union, overload
7
7
 
8
8
  from reflex.components.component import Component
9
- from reflex.event import EventType
9
+ from reflex.event import BASE_STATE, EventType
10
10
  from reflex.style import Style
11
11
  from reflex.vars.base import Var
12
12
 
@@ -25,22 +25,22 @@ class ClientSideRouting(Component):
25
25
  id: Optional[Any] = None,
26
26
  class_name: Optional[Any] = None,
27
27
  autofocus: Optional[bool] = None,
28
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
29
- on_blur: Optional[EventType[[]]] = None,
30
- on_click: Optional[EventType[[]]] = None,
31
- on_context_menu: Optional[EventType[[]]] = None,
32
- on_double_click: Optional[EventType[[]]] = None,
33
- on_focus: Optional[EventType[[]]] = None,
34
- on_mount: Optional[EventType[[]]] = None,
35
- on_mouse_down: Optional[EventType[[]]] = None,
36
- on_mouse_enter: Optional[EventType[[]]] = None,
37
- on_mouse_leave: Optional[EventType[[]]] = None,
38
- on_mouse_move: Optional[EventType[[]]] = None,
39
- on_mouse_out: Optional[EventType[[]]] = None,
40
- on_mouse_over: Optional[EventType[[]]] = None,
41
- on_mouse_up: Optional[EventType[[]]] = None,
42
- on_scroll: Optional[EventType[[]]] = None,
43
- on_unmount: Optional[EventType[[]]] = None,
28
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
29
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
30
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
31
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
32
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
33
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
34
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
35
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
36
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
37
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
38
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
39
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
40
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
41
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
42
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
43
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
44
44
  **props,
45
45
  ) -> "ClientSideRouting":
46
46
  """Create the component.
@@ -74,22 +74,22 @@ class Default404Page(Component):
74
74
  id: Optional[Any] = None,
75
75
  class_name: Optional[Any] = None,
76
76
  autofocus: Optional[bool] = None,
77
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
78
- on_blur: Optional[EventType[[]]] = None,
79
- on_click: Optional[EventType[[]]] = None,
80
- on_context_menu: Optional[EventType[[]]] = None,
81
- on_double_click: Optional[EventType[[]]] = None,
82
- on_focus: Optional[EventType[[]]] = None,
83
- on_mount: Optional[EventType[[]]] = None,
84
- on_mouse_down: Optional[EventType[[]]] = None,
85
- on_mouse_enter: Optional[EventType[[]]] = None,
86
- on_mouse_leave: Optional[EventType[[]]] = None,
87
- on_mouse_move: Optional[EventType[[]]] = None,
88
- on_mouse_out: Optional[EventType[[]]] = None,
89
- on_mouse_over: Optional[EventType[[]]] = None,
90
- on_mouse_up: Optional[EventType[[]]] = None,
91
- on_scroll: Optional[EventType[[]]] = None,
92
- on_unmount: Optional[EventType[[]]] = None,
77
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
78
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
79
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
80
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
81
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
82
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
83
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
84
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
85
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
86
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
87
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
88
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
89
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
90
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
91
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
92
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
93
93
  **props,
94
94
  ) -> "Default404Page":
95
95
  """Create the component.
@@ -6,7 +6,7 @@ from typing import Dict, List, Tuple, Union
6
6
 
7
7
  from reflex.components.base.fragment import Fragment
8
8
  from reflex.components.tags.tag import Tag
9
- from reflex.event import EventChain, EventHandler, identity_event
9
+ from reflex.event import EventChain, EventHandler, passthrough_event_spec
10
10
  from reflex.utils.format import format_prop, wrap
11
11
  from reflex.utils.imports import ImportVar
12
12
  from reflex.vars import get_unique_variable_name
@@ -20,7 +20,7 @@ class Clipboard(Fragment):
20
20
  targets: Var[List[str]]
21
21
 
22
22
  # Called when the user pastes data into the document. Data is a list of tuples of (mime_type, data). Binary types will be base64 encoded as a data uri.
23
- on_paste: EventHandler[identity_event(List[Tuple[str, str]])]
23
+ on_paste: EventHandler[passthrough_event_spec(List[Tuple[str, str]])]
24
24
 
25
25
  # Save the original event actions for the on_paste event.
26
26
  on_paste_event_actions: Var[Dict[str, Union[bool, int]]]
@@ -6,7 +6,7 @@
6
6
  from typing import Any, Dict, List, Optional, Union, overload
7
7
 
8
8
  from reflex.components.base.fragment import Fragment
9
- from reflex.event import EventType
9
+ from reflex.event import BASE_STATE, EventType
10
10
  from reflex.style import Style
11
11
  from reflex.utils.imports import ImportVar
12
12
  from reflex.vars.base import Var
@@ -26,23 +26,28 @@ class Clipboard(Fragment):
26
26
  id: Optional[Any] = None,
27
27
  class_name: Optional[Any] = None,
28
28
  autofocus: Optional[bool] = None,
29
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
30
- on_blur: Optional[EventType[[]]] = None,
31
- on_click: Optional[EventType[[]]] = None,
32
- on_context_menu: Optional[EventType[[]]] = None,
33
- on_double_click: Optional[EventType[[]]] = None,
34
- on_focus: Optional[EventType[[]]] = None,
35
- on_mount: Optional[EventType[[]]] = None,
36
- on_mouse_down: Optional[EventType[[]]] = None,
37
- on_mouse_enter: Optional[EventType[[]]] = None,
38
- on_mouse_leave: Optional[EventType[[]]] = None,
39
- on_mouse_move: Optional[EventType[[]]] = None,
40
- on_mouse_out: Optional[EventType[[]]] = None,
41
- on_mouse_over: Optional[EventType[[]]] = None,
42
- on_mouse_up: Optional[EventType[[]]] = None,
43
- on_paste: Optional[EventType[list[tuple[str, str]]]] = None,
44
- on_scroll: Optional[EventType[[]]] = None,
45
- on_unmount: Optional[EventType[[]]] = None,
29
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
30
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
31
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
32
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
33
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
34
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
35
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
36
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
37
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
38
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
39
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
40
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
41
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
42
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
43
+ on_paste: Optional[
44
+ Union[
45
+ EventType[[], BASE_STATE],
46
+ EventType[[list[tuple[str, str]]], BASE_STATE],
47
+ ]
48
+ ] = None,
49
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
50
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
46
51
  **props,
47
52
  ) -> "Clipboard":
48
53
  """Create a Clipboard component.
@@ -50,6 +55,7 @@ class Clipboard(Fragment):
50
55
  Args:
51
56
  *children: The children of the component.
52
57
  targets: The element ids to attach the event listener to. Defaults to all child components or the document.
58
+ on_paste: Called when the user pastes data into the document. Data is a list of tuples of (mime_type, data). Binary types will be base64 encoded as a data uri.
53
59
  on_paste_event_actions: Save the original event actions for the on_paste event.
54
60
  style: The style of the component.
55
61
  key: A unique key for the component.
@@ -6,7 +6,7 @@ from typing import Any, Type, Union
6
6
 
7
7
  from reflex.components.component import Component
8
8
  from reflex.constants import EventTriggers
9
- from reflex.event import EventHandler, empty_event
9
+ from reflex.event import EventHandler, no_args_event_spec
10
10
  from reflex.vars import VarData
11
11
  from reflex.vars.base import Var
12
12
 
@@ -46,7 +46,7 @@ class DebounceInput(Component):
46
46
  element: Var[Type[Component]]
47
47
 
48
48
  # Fired when the input value changes
49
- on_change: EventHandler[empty_event]
49
+ on_change: EventHandler[no_args_event_spec]
50
50
 
51
51
  @classmethod
52
52
  def create(cls, *children: Component, **props: Any) -> Component:
@@ -6,7 +6,7 @@
6
6
  from typing import Any, Dict, Optional, Type, Union, overload
7
7
 
8
8
  from reflex.components.component import Component
9
- from reflex.event import EventType
9
+ from reflex.event import BASE_STATE, EventType
10
10
  from reflex.style import Style
11
11
  from reflex.vars.base import Var
12
12
 
@@ -30,23 +30,23 @@ class DebounceInput(Component):
30
30
  id: Optional[Any] = None,
31
31
  class_name: Optional[Any] = None,
32
32
  autofocus: Optional[bool] = None,
33
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
34
- on_blur: Optional[EventType[[]]] = None,
35
- on_change: Optional[EventType[[]]] = None,
36
- on_click: Optional[EventType[[]]] = None,
37
- on_context_menu: Optional[EventType[[]]] = None,
38
- on_double_click: Optional[EventType[[]]] = None,
39
- on_focus: Optional[EventType[[]]] = None,
40
- on_mount: Optional[EventType[[]]] = None,
41
- on_mouse_down: Optional[EventType[[]]] = None,
42
- on_mouse_enter: Optional[EventType[[]]] = None,
43
- on_mouse_leave: Optional[EventType[[]]] = None,
44
- on_mouse_move: Optional[EventType[[]]] = None,
45
- on_mouse_out: Optional[EventType[[]]] = None,
46
- on_mouse_over: Optional[EventType[[]]] = None,
47
- on_mouse_up: Optional[EventType[[]]] = None,
48
- on_scroll: Optional[EventType[[]]] = None,
49
- on_unmount: Optional[EventType[[]]] = None,
33
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
34
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
35
+ on_change: Optional[EventType[[], BASE_STATE]] = None,
36
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
37
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
38
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
39
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
40
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
41
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
42
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
43
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
44
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
45
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
46
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
47
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
48
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
49
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
50
50
  **props,
51
51
  ) -> "DebounceInput":
52
52
  """Create a DebounceInput component.
@@ -6,7 +6,7 @@
6
6
  from typing import Any, Dict, Optional, Union, overload
7
7
 
8
8
  from reflex.components.el.elements.typography import Div
9
- from reflex.event import EventType
9
+ from reflex.event import BASE_STATE, EventType
10
10
  from reflex.style import Style
11
11
  from reflex.vars.base import Var
12
12
 
@@ -48,22 +48,22 @@ class Html(Div):
48
48
  id: Optional[Any] = None,
49
49
  class_name: Optional[Any] = None,
50
50
  autofocus: Optional[bool] = None,
51
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
52
- on_blur: Optional[EventType[[]]] = None,
53
- on_click: Optional[EventType[[]]] = None,
54
- on_context_menu: Optional[EventType[[]]] = None,
55
- on_double_click: Optional[EventType[[]]] = None,
56
- on_focus: Optional[EventType[[]]] = None,
57
- on_mount: Optional[EventType[[]]] = None,
58
- on_mouse_down: Optional[EventType[[]]] = None,
59
- on_mouse_enter: Optional[EventType[[]]] = None,
60
- on_mouse_leave: Optional[EventType[[]]] = None,
61
- on_mouse_move: Optional[EventType[[]]] = None,
62
- on_mouse_out: Optional[EventType[[]]] = None,
63
- on_mouse_over: Optional[EventType[[]]] = None,
64
- on_mouse_up: Optional[EventType[[]]] = None,
65
- on_scroll: Optional[EventType[[]]] = None,
66
- on_unmount: Optional[EventType[[]]] = None,
51
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
52
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
53
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
54
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
55
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
56
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
57
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
58
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
59
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
60
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
61
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
62
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
63
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
64
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
65
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
66
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
67
67
  **props,
68
68
  ) -> "Html":
69
69
  """Create a html component.
@@ -5,23 +5,31 @@ from __future__ import annotations
5
5
  from pathlib import Path
6
6
  from typing import Any, Callable, ClassVar, Dict, List, Optional, Tuple
7
7
 
8
- from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf
8
+ from reflex.components.base.fragment import Fragment
9
+ from reflex.components.component import (
10
+ Component,
11
+ ComponentNamespace,
12
+ MemoizationLeaf,
13
+ StatefulComponent,
14
+ )
9
15
  from reflex.components.el.elements.forms import Input
10
16
  from reflex.components.radix.themes.layout.box import Box
11
17
  from reflex.config import environment
12
18
  from reflex.constants import Dirs
19
+ from reflex.constants.compiler import Hooks, Imports
13
20
  from reflex.event import (
14
21
  CallableEventSpec,
15
22
  EventChain,
16
23
  EventHandler,
17
24
  EventSpec,
18
25
  call_event_fn,
19
- call_script,
20
26
  parse_args_spec,
27
+ run_script,
21
28
  )
29
+ from reflex.utils import format
22
30
  from reflex.utils.imports import ImportVar
23
31
  from reflex.vars import VarData
24
- from reflex.vars.base import CallableVar, LiteralVar, Var
32
+ from reflex.vars.base import CallableVar, LiteralVar, Var, get_unique_variable_name
25
33
  from reflex.vars.sequence import LiteralStringVar
26
34
 
27
35
  DEFAULT_UPLOAD_ID: str = "default"
@@ -99,8 +107,8 @@ def clear_selected_files(id_: str = DEFAULT_UPLOAD_ID) -> EventSpec:
99
107
  """
100
108
  # UploadFilesProvider assigns a special function to clear selected files
101
109
  # into the shared global refs object to make it accessible outside a React
102
- # component via `call_script` (otherwise backend could never clear files).
103
- return call_script(f"refs['__clear_selected_files']({id_!r})")
110
+ # component via `run_script` (otherwise backend could never clear files).
111
+ return run_script(f"refs['__clear_selected_files']({id_!r})")
104
112
 
105
113
 
106
114
  def cancel_upload(upload_id: str) -> EventSpec:
@@ -112,7 +120,7 @@ def cancel_upload(upload_id: str) -> EventSpec:
112
120
  Returns:
113
121
  An event spec that cancels the upload when triggered.
114
122
  """
115
- return call_script(
123
+ return run_script(
116
124
  f"upload_controllers[{str(LiteralVar.create(upload_id))}]?.abort()"
117
125
  )
118
126
 
@@ -125,7 +133,7 @@ def get_upload_dir() -> Path:
125
133
  """
126
134
  Upload.is_used = True
127
135
 
128
- uploaded_files_dir = environment.REFLEX_UPLOADED_FILES_DIR
136
+ uploaded_files_dir = environment.REFLEX_UPLOADED_FILES_DIR.get()
129
137
  uploaded_files_dir.mkdir(parents=True, exist_ok=True)
130
138
  return uploaded_files_dir
131
139
 
@@ -174,14 +182,19 @@ class UploadFilesProvider(Component):
174
182
  tag = "UploadFilesProvider"
175
183
 
176
184
 
185
+ class GhostUpload(Fragment):
186
+ """A ghost upload component."""
187
+
188
+ # Fired when files are dropped.
189
+ on_drop: EventHandler[_on_drop_spec]
190
+
191
+
177
192
  class Upload(MemoizationLeaf):
178
193
  """A file upload component."""
179
194
 
180
195
  library = "react-dropzone@14.2.10"
181
196
 
182
- tag = "ReactDropzone"
183
-
184
- is_default = True
197
+ tag = ""
185
198
 
186
199
  # The list of accepted file types. This should be a dictionary of MIME types as keys and array of file formats as
187
200
  # values.
@@ -201,7 +214,7 @@ class Upload(MemoizationLeaf):
201
214
  min_size: Var[int]
202
215
 
203
216
  # Whether to allow multiple files to be uploaded.
204
- multiple: Var[bool] = True # type: ignore
217
+ multiple: Var[bool]
205
218
 
206
219
  # Whether to disable click to upload.
207
220
  no_click: Var[bool]
@@ -232,6 +245,8 @@ class Upload(MemoizationLeaf):
232
245
  # Mark the Upload component as used in the app.
233
246
  cls.is_used = True
234
247
 
248
+ props.setdefault("multiple", True)
249
+
235
250
  # Apply the default classname
236
251
  given_class_name = props.pop("class_name", [])
237
252
  if isinstance(given_class_name, str):
@@ -243,17 +258,6 @@ class Upload(MemoizationLeaf):
243
258
  upload_props = {
244
259
  key: value for key, value in props.items() if key in supported_props
245
260
  }
246
- # The file input to use.
247
- upload = Input.create(type="file")
248
- upload.special_props = [Var(_js_expr="{...getInputProps()}", _var_type=None)]
249
-
250
- # The dropzone to use.
251
- zone = Box.create(
252
- upload,
253
- *children,
254
- **{k: v for k, v in props.items() if k not in supported_props},
255
- )
256
- zone.special_props = [Var(_js_expr="{...getRootProps()}", _var_type=None)]
257
261
 
258
262
  # Create the component.
259
263
  upload_props["id"] = props.get("id", DEFAULT_UPLOAD_ID)
@@ -275,9 +279,72 @@ class Upload(MemoizationLeaf):
275
279
  ),
276
280
  )
277
281
  upload_props["on_drop"] = on_drop
282
+
283
+ input_props_unique_name = get_unique_variable_name()
284
+ root_props_unique_name = get_unique_variable_name()
285
+
286
+ event_var, callback_str = StatefulComponent._get_memoized_event_triggers(
287
+ GhostUpload.create(on_drop=upload_props["on_drop"])
288
+ )["on_drop"]
289
+
290
+ upload_props["on_drop"] = event_var
291
+
292
+ upload_props = {
293
+ format.to_camel_case(key): value for key, value in upload_props.items()
294
+ }
295
+
296
+ use_dropzone_arguments = {
297
+ "onDrop": event_var,
298
+ **upload_props,
299
+ }
300
+
301
+ left_side = f"const {{getRootProps: {root_props_unique_name}, getInputProps: {input_props_unique_name}}} "
302
+ right_side = f"useDropzone({str(Var.create(use_dropzone_arguments))})"
303
+
304
+ var_data = VarData.merge(
305
+ VarData(
306
+ imports=Imports.EVENTS,
307
+ hooks={Hooks.EVENTS: None},
308
+ ),
309
+ event_var._get_all_var_data(),
310
+ VarData(
311
+ hooks={
312
+ callback_str: None,
313
+ f"{left_side} = {right_side};": None,
314
+ },
315
+ imports={
316
+ "react-dropzone": "useDropzone",
317
+ **Imports.EVENTS,
318
+ },
319
+ ),
320
+ )
321
+
322
+ # The file input to use.
323
+ upload = Input.create(type="file")
324
+ upload.special_props = [
325
+ Var(
326
+ _js_expr=f"{{...{input_props_unique_name}()}}",
327
+ _var_type=None,
328
+ _var_data=var_data,
329
+ )
330
+ ]
331
+
332
+ # The dropzone to use.
333
+ zone = Box.create(
334
+ upload,
335
+ *children,
336
+ **{k: v for k, v in props.items() if k not in supported_props},
337
+ )
338
+ zone.special_props = [
339
+ Var(
340
+ _js_expr=f"{{...{root_props_unique_name}()}}",
341
+ _var_type=None,
342
+ _var_data=var_data,
343
+ )
344
+ ]
345
+
278
346
  return super().create(
279
347
  zone,
280
- **upload_props,
281
348
  )
282
349
 
283
350
  @classmethod
@@ -295,11 +362,6 @@ class Upload(MemoizationLeaf):
295
362
  return (arg_value[0], placeholder)
296
363
  return arg_value
297
364
 
298
- def _render(self):
299
- out = super()._render()
300
- out.args = ("getRootProps", "getInputProps")
301
- return out
302
-
303
365
  @staticmethod
304
366
  def _get_app_wrap_components() -> dict[tuple[int, str], Component]:
305
367
  return {