reflex 0.6.4a3__py3-none-any.whl → 0.6.5a1__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.
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 +82 -28
  34. reflex/components/core/upload.pyi +77 -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 +27 -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 +127 -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.5a1.dist-info}/METADATA +3 -3
  224. reflex-0.6.5a1.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.5a1.dist-info}/LICENSE +0 -0
  227. {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/WHEEL +0 -0
  228. {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.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,30 @@ 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.component import (
9
+ Component,
10
+ ComponentNamespace,
11
+ MemoizationLeaf,
12
+ StatefulComponent,
13
+ )
9
14
  from reflex.components.el.elements.forms import Input
10
15
  from reflex.components.radix.themes.layout.box import Box
11
16
  from reflex.config import environment
12
17
  from reflex.constants import Dirs
18
+ from reflex.constants.compiler import Hooks, Imports
13
19
  from reflex.event import (
14
20
  CallableEventSpec,
15
21
  EventChain,
16
22
  EventHandler,
17
23
  EventSpec,
18
24
  call_event_fn,
19
- call_script,
20
25
  parse_args_spec,
26
+ run_script,
21
27
  )
28
+ from reflex.utils import format
22
29
  from reflex.utils.imports import ImportVar
23
30
  from reflex.vars import VarData
24
- from reflex.vars.base import CallableVar, LiteralVar, Var
31
+ from reflex.vars.base import CallableVar, LiteralVar, Var, get_unique_variable_name
25
32
  from reflex.vars.sequence import LiteralStringVar
26
33
 
27
34
  DEFAULT_UPLOAD_ID: str = "default"
@@ -99,8 +106,8 @@ def clear_selected_files(id_: str = DEFAULT_UPLOAD_ID) -> EventSpec:
99
106
  """
100
107
  # UploadFilesProvider assigns a special function to clear selected files
101
108
  # 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})")
109
+ # component via `run_script` (otherwise backend could never clear files).
110
+ return run_script(f"refs['__clear_selected_files']({id_!r})")
104
111
 
105
112
 
106
113
  def cancel_upload(upload_id: str) -> EventSpec:
@@ -112,7 +119,7 @@ def cancel_upload(upload_id: str) -> EventSpec:
112
119
  Returns:
113
120
  An event spec that cancels the upload when triggered.
114
121
  """
115
- return call_script(
122
+ return run_script(
116
123
  f"upload_controllers[{str(LiteralVar.create(upload_id))}]?.abort()"
117
124
  )
118
125
 
@@ -125,7 +132,7 @@ def get_upload_dir() -> Path:
125
132
  """
126
133
  Upload.is_used = True
127
134
 
128
- uploaded_files_dir = environment.REFLEX_UPLOADED_FILES_DIR
135
+ uploaded_files_dir = environment.REFLEX_UPLOADED_FILES_DIR.get()
129
136
  uploaded_files_dir.mkdir(parents=True, exist_ok=True)
130
137
  return uploaded_files_dir
131
138
 
@@ -179,9 +186,7 @@ class Upload(MemoizationLeaf):
179
186
 
180
187
  library = "react-dropzone@14.2.10"
181
188
 
182
- tag = "ReactDropzone"
183
-
184
- is_default = True
189
+ tag = ""
185
190
 
186
191
  # The list of accepted file types. This should be a dictionary of MIME types as keys and array of file formats as
187
192
  # values.
@@ -201,7 +206,7 @@ class Upload(MemoizationLeaf):
201
206
  min_size: Var[int]
202
207
 
203
208
  # Whether to allow multiple files to be uploaded.
204
- multiple: Var[bool] = True # type: ignore
209
+ multiple: Var[bool]
205
210
 
206
211
  # Whether to disable click to upload.
207
212
  no_click: Var[bool]
@@ -232,6 +237,8 @@ class Upload(MemoizationLeaf):
232
237
  # Mark the Upload component as used in the app.
233
238
  cls.is_used = True
234
239
 
240
+ props.setdefault("multiple", True)
241
+
235
242
  # Apply the default classname
236
243
  given_class_name = props.pop("class_name", [])
237
244
  if isinstance(given_class_name, str):
@@ -243,17 +250,6 @@ class Upload(MemoizationLeaf):
243
250
  upload_props = {
244
251
  key: value for key, value in props.items() if key in supported_props
245
252
  }
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
253
 
258
254
  # Create the component.
259
255
  upload_props["id"] = props.get("id", DEFAULT_UPLOAD_ID)
@@ -275,9 +271,72 @@ class Upload(MemoizationLeaf):
275
271
  ),
276
272
  )
277
273
  upload_props["on_drop"] = on_drop
274
+
275
+ input_props_unique_name = get_unique_variable_name()
276
+ root_props_unique_name = get_unique_variable_name()
277
+
278
+ event_var, callback_str = StatefulComponent._get_memoized_event_triggers(
279
+ Box.create(on_click=upload_props["on_drop"]) # type: ignore
280
+ )["on_click"]
281
+
282
+ upload_props["on_drop"] = event_var
283
+
284
+ upload_props = {
285
+ format.to_camel_case(key): value for key, value in upload_props.items()
286
+ }
287
+
288
+ use_dropzone_arguments = {
289
+ "onDrop": event_var,
290
+ **upload_props,
291
+ }
292
+
293
+ left_side = f"const {{getRootProps: {root_props_unique_name}, getInputProps: {input_props_unique_name}}} "
294
+ right_side = f"useDropzone({str(Var.create(use_dropzone_arguments))})"
295
+
296
+ var_data = VarData.merge(
297
+ VarData(
298
+ imports=Imports.EVENTS,
299
+ hooks={Hooks.EVENTS: None},
300
+ ),
301
+ event_var._get_all_var_data(),
302
+ VarData(
303
+ hooks={
304
+ callback_str: None,
305
+ f"{left_side} = {right_side};": None,
306
+ },
307
+ imports={
308
+ "react-dropzone": "useDropzone",
309
+ **Imports.EVENTS,
310
+ },
311
+ ),
312
+ )
313
+
314
+ # The file input to use.
315
+ upload = Input.create(type="file")
316
+ upload.special_props = [
317
+ Var(
318
+ _js_expr=f"{{...{input_props_unique_name}()}}",
319
+ _var_type=None,
320
+ _var_data=var_data,
321
+ )
322
+ ]
323
+
324
+ # The dropzone to use.
325
+ zone = Box.create(
326
+ upload,
327
+ *children,
328
+ **{k: v for k, v in props.items() if k not in supported_props},
329
+ )
330
+ zone.special_props = [
331
+ Var(
332
+ _js_expr=f"{{...{root_props_unique_name}()}}",
333
+ _var_type=None,
334
+ _var_data=var_data,
335
+ )
336
+ ]
337
+
278
338
  return super().create(
279
339
  zone,
280
- **upload_props,
281
340
  )
282
341
 
283
342
  @classmethod
@@ -295,11 +354,6 @@ class Upload(MemoizationLeaf):
295
354
  return (arg_value[0], placeholder)
296
355
  return arg_value
297
356
 
298
- def _render(self):
299
- out = super()._render()
300
- out.args = ("getRootProps", "getInputProps")
301
- return out
302
-
303
357
  @staticmethod
304
358
  def _get_app_wrap_components() -> dict[tuple[int, str], Component]:
305
359
  return {