reflex 0.6.4a2__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 +252 -41
  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.4a2.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.4a2.dist-info/RECORD +0 -391
  226. {reflex-0.6.4a2.dist-info → reflex-0.6.5.dist-info}/LICENSE +0 -0
  227. {reflex-0.6.4a2.dist-info → reflex-0.6.5.dist-info}/WHEEL +0 -0
  228. {reflex-0.6.4a2.dist-info → reflex-0.6.5.dist-info}/entry_points.txt +0 -0
@@ -6,7 +6,7 @@
6
6
  from typing import Any, Dict, List, 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.utils.imports import ImportDict
12
12
  from reflex.vars.base import Var
@@ -22,22 +22,22 @@ class Gridjs(Component):
22
22
  id: Optional[Any] = None,
23
23
  class_name: Optional[Any] = None,
24
24
  autofocus: Optional[bool] = None,
25
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
26
- on_blur: Optional[EventType[[]]] = None,
27
- on_click: Optional[EventType[[]]] = None,
28
- on_context_menu: Optional[EventType[[]]] = None,
29
- on_double_click: Optional[EventType[[]]] = None,
30
- on_focus: Optional[EventType[[]]] = None,
31
- on_mount: Optional[EventType[[]]] = None,
32
- on_mouse_down: Optional[EventType[[]]] = None,
33
- on_mouse_enter: Optional[EventType[[]]] = None,
34
- on_mouse_leave: Optional[EventType[[]]] = None,
35
- on_mouse_move: Optional[EventType[[]]] = None,
36
- on_mouse_out: Optional[EventType[[]]] = None,
37
- on_mouse_over: Optional[EventType[[]]] = None,
38
- on_mouse_up: Optional[EventType[[]]] = None,
39
- on_scroll: Optional[EventType[[]]] = None,
40
- on_unmount: Optional[EventType[[]]] = None,
25
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
26
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
27
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
28
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
29
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
30
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
31
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
32
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
33
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
34
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
35
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
36
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
37
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
38
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
39
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
40
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
41
41
  **props,
42
42
  ) -> "Gridjs":
43
43
  """Create the component.
@@ -74,22 +74,22 @@ class DataTable(Gridjs):
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
  ) -> "DataTable":
95
95
  """Create a datatable component.
@@ -58,7 +58,7 @@ class Icon(LucideIconComponent):
58
58
 
59
59
  props["tag"] = format.to_title_case(format.to_snake_case(props["tag"])) + "Icon"
60
60
  props["alias"] = f"Lucide{props['tag']}"
61
- props.setdefault("color", f"var(--current-color)")
61
+ props.setdefault("color", "var(--current-color)")
62
62
  return super().create(*children, **props)
63
63
 
64
64
 
@@ -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
 
@@ -21,22 +21,22 @@ class LucideIconComponent(Component):
21
21
  id: Optional[Any] = None,
22
22
  class_name: Optional[Any] = None,
23
23
  autofocus: Optional[bool] = None,
24
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
25
- on_blur: Optional[EventType[[]]] = None,
26
- on_click: Optional[EventType[[]]] = None,
27
- on_context_menu: Optional[EventType[[]]] = None,
28
- on_double_click: Optional[EventType[[]]] = None,
29
- on_focus: Optional[EventType[[]]] = None,
30
- on_mount: Optional[EventType[[]]] = None,
31
- on_mouse_down: Optional[EventType[[]]] = None,
32
- on_mouse_enter: Optional[EventType[[]]] = None,
33
- on_mouse_leave: Optional[EventType[[]]] = None,
34
- on_mouse_move: Optional[EventType[[]]] = None,
35
- on_mouse_out: Optional[EventType[[]]] = None,
36
- on_mouse_over: Optional[EventType[[]]] = None,
37
- on_mouse_up: Optional[EventType[[]]] = None,
38
- on_scroll: Optional[EventType[[]]] = None,
39
- on_unmount: Optional[EventType[[]]] = None,
24
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
25
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
26
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
27
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
28
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
29
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
30
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
31
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
32
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
33
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
34
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
35
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
36
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
37
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
38
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
39
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
40
40
  **props,
41
41
  ) -> "LucideIconComponent":
42
42
  """Create the component.
@@ -68,22 +68,22 @@ class Icon(LucideIconComponent):
68
68
  id: Optional[Any] = None,
69
69
  class_name: Optional[Any] = None,
70
70
  autofocus: Optional[bool] = None,
71
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
72
- on_blur: Optional[EventType[[]]] = None,
73
- on_click: Optional[EventType[[]]] = None,
74
- on_context_menu: Optional[EventType[[]]] = None,
75
- on_double_click: Optional[EventType[[]]] = None,
76
- on_focus: Optional[EventType[[]]] = None,
77
- on_mount: Optional[EventType[[]]] = None,
78
- on_mouse_down: Optional[EventType[[]]] = None,
79
- on_mouse_enter: Optional[EventType[[]]] = None,
80
- on_mouse_leave: Optional[EventType[[]]] = None,
81
- on_mouse_move: Optional[EventType[[]]] = None,
82
- on_mouse_out: Optional[EventType[[]]] = None,
83
- on_mouse_over: Optional[EventType[[]]] = None,
84
- on_mouse_up: Optional[EventType[[]]] = None,
85
- on_scroll: Optional[EventType[[]]] = None,
86
- on_unmount: Optional[EventType[[]]] = None,
71
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
72
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
73
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
74
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
75
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
76
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
77
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
78
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
79
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
80
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
81
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
82
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
83
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
84
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
85
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
86
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
87
87
  **props,
88
88
  ) -> "Icon":
89
89
  """Initialize the Icon component.
@@ -2,25 +2,18 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import dataclasses
5
6
  import textwrap
6
7
  from functools import lru_cache
7
8
  from hashlib import md5
8
- from typing import Any, Callable, Dict, Union
9
+ from typing import Any, Callable, Dict, Sequence, Union
9
10
 
10
11
  from reflex.components.component import Component, CustomComponent
11
- from reflex.components.radix.themes.layout.list import (
12
- ListItem,
13
- OrderedList,
14
- UnorderedList,
15
- )
16
- from reflex.components.radix.themes.typography.heading import Heading
17
- from reflex.components.radix.themes.typography.link import Link
18
- from reflex.components.radix.themes.typography.text import Text
19
12
  from reflex.components.tags.tag import Tag
20
13
  from reflex.utils import types
21
14
  from reflex.utils.imports import ImportDict, ImportVar
22
15
  from reflex.vars.base import LiteralVar, Var
23
- from reflex.vars.function import ARRAY_ISARRAY
16
+ from reflex.vars.function import ARRAY_ISARRAY, ArgsFunctionOperation, DestructuredArg
24
17
  from reflex.vars.number import ternary_operation
25
18
 
26
19
  # Special vars used in the component map.
@@ -28,6 +21,7 @@ _CHILDREN = Var(_js_expr="children", _var_type=str)
28
21
  _PROPS = Var(_js_expr="...props")
29
22
  _PROPS_IN_TAG = Var(_js_expr="{...props}")
30
23
  _MOCK_ARG = Var(_js_expr="", _var_type=str)
24
+ _LANGUAGE = Var(_js_expr="_language", _var_type=str)
31
25
 
32
26
  # Special remark plugins.
33
27
  _REMARK_MATH = Var(_js_expr="remarkMath")
@@ -53,7 +47,15 @@ def get_base_component_map() -> dict[str, Callable]:
53
47
  The base component map.
54
48
  """
55
49
  from reflex.components.datadisplay.code import CodeBlock
50
+ from reflex.components.radix.themes.layout.list import (
51
+ ListItem,
52
+ OrderedList,
53
+ UnorderedList,
54
+ )
56
55
  from reflex.components.radix.themes.typography.code import Code
56
+ from reflex.components.radix.themes.typography.heading import Heading
57
+ from reflex.components.radix.themes.typography.link import Link
58
+ from reflex.components.radix.themes.typography.text import Text
57
59
 
58
60
  return {
59
61
  "h1": lambda value: Heading.create(value, as_="h1", size="6", margin_y="0.5em"),
@@ -74,6 +76,67 @@ def get_base_component_map() -> dict[str, Callable]:
74
76
  }
75
77
 
76
78
 
79
+ @dataclasses.dataclass()
80
+ class MarkdownComponentMap:
81
+ """Mixin class for handling custom component maps in Markdown components."""
82
+
83
+ _explicit_return: bool = dataclasses.field(default=False)
84
+
85
+ @classmethod
86
+ def get_component_map_custom_code(cls) -> str:
87
+ """Get the custom code for the component map.
88
+
89
+ Returns:
90
+ The custom code for the component map.
91
+ """
92
+ return ""
93
+
94
+ @classmethod
95
+ def create_map_fn_var(
96
+ cls,
97
+ fn_body: Var | None = None,
98
+ fn_args: Sequence[str] | None = None,
99
+ explicit_return: bool | None = None,
100
+ ) -> Var:
101
+ """Create a function Var for the component map.
102
+
103
+ Args:
104
+ fn_body: The formatted component as a string.
105
+ fn_args: The function arguments.
106
+ explicit_return: Whether to use explicit return syntax.
107
+
108
+ Returns:
109
+ The function Var for the component map.
110
+ """
111
+ fn_args = fn_args or cls.get_fn_args()
112
+ fn_body = fn_body if fn_body is not None else cls.get_fn_body()
113
+ explicit_return = explicit_return or cls._explicit_return
114
+
115
+ return ArgsFunctionOperation.create(
116
+ args_names=(DestructuredArg(fields=tuple(fn_args)),),
117
+ return_expr=fn_body,
118
+ explicit_return=explicit_return,
119
+ )
120
+
121
+ @classmethod
122
+ def get_fn_args(cls) -> Sequence[str]:
123
+ """Get the function arguments for the component map.
124
+
125
+ Returns:
126
+ The function arguments as a list of strings.
127
+ """
128
+ return ["node", _CHILDREN._js_expr, _PROPS._js_expr]
129
+
130
+ @classmethod
131
+ def get_fn_body(cls) -> Var:
132
+ """Get the function body for the component map.
133
+
134
+ Returns:
135
+ The function body as a string.
136
+ """
137
+ return Var(_js_expr="undefined", _var_type=None)
138
+
139
+
77
140
  class Markdown(Component):
78
141
  """A markdown component."""
79
142
 
@@ -153,9 +216,6 @@ class Markdown(Component):
153
216
  Returns:
154
217
  The imports for the markdown component.
155
218
  """
156
- from reflex.components.datadisplay.code import CodeBlock, Theme
157
- from reflex.components.radix.themes.typography.code import Code
158
-
159
219
  return [
160
220
  {
161
221
  "": "katex/dist/katex.min.css",
@@ -179,10 +239,71 @@ class Markdown(Component):
179
239
  component(_MOCK_ARG)._get_all_imports() # type: ignore
180
240
  for component in self.component_map.values()
181
241
  ],
182
- CodeBlock.create(theme=Theme.light)._get_imports(),
183
- Code.create()._get_imports(),
184
242
  ]
185
243
 
244
+ def _get_tag_map_fn_var(self, tag: str) -> Var:
245
+ return self._get_map_fn_var_from_children(self.get_component(tag), tag)
246
+
247
+ def format_component_map(self) -> dict[str, Var]:
248
+ """Format the component map for rendering.
249
+
250
+ Returns:
251
+ The formatted component map.
252
+ """
253
+ components = {
254
+ tag: self._get_tag_map_fn_var(tag)
255
+ for tag in self.component_map
256
+ if tag not in ("code", "codeblock")
257
+ }
258
+
259
+ # Separate out inline code and code blocks.
260
+ components["code"] = self._get_inline_code_fn_var()
261
+
262
+ return components
263
+
264
+ def _get_inline_code_fn_var(self) -> Var:
265
+ """Get the function variable for inline code.
266
+
267
+ This function creates a Var that represents a function to handle
268
+ both inline code and code blocks in markdown.
269
+
270
+ Returns:
271
+ The Var for inline code.
272
+ """
273
+ # Get any custom code from the codeblock and code components.
274
+ custom_code_list = self._get_map_fn_custom_code_from_children(
275
+ self.get_component("codeblock")
276
+ )
277
+ custom_code_list.extend(
278
+ self._get_map_fn_custom_code_from_children(self.get_component("code"))
279
+ )
280
+
281
+ codeblock_custom_code = "\n".join(custom_code_list)
282
+
283
+ # Format the code to handle inline and block code.
284
+ formatted_code = f"""
285
+ const match = (className || '').match(/language-(?<lang>.*)/);
286
+ const {str(_LANGUAGE)} = match ? match[1] : '';
287
+ {codeblock_custom_code};
288
+ return inline ? (
289
+ {self.format_component("code")}
290
+ ) : (
291
+ {self.format_component("codeblock", language=_LANGUAGE)}
292
+ );
293
+ """.replace("\n", " ")
294
+
295
+ return MarkdownComponentMap.create_map_fn_var(
296
+ fn_args=(
297
+ "node",
298
+ "inline",
299
+ "className",
300
+ _CHILDREN._js_expr,
301
+ _PROPS._js_expr,
302
+ ),
303
+ fn_body=Var(_js_expr=formatted_code),
304
+ explicit_return=True,
305
+ )
306
+
186
307
  def get_component(self, tag: str, **props) -> Component:
187
308
  """Get the component for a tag and props.
188
309
 
@@ -239,43 +360,53 @@ class Markdown(Component):
239
360
  """
240
361
  return str(self.get_component(tag, **props)).replace("\n", "")
241
362
 
242
- def format_component_map(self) -> dict[str, Var]:
243
- """Format the component map for rendering.
363
+ def _get_map_fn_var_from_children(self, component: Component, tag: str) -> Var:
364
+ """Create a function Var for the component map for the specified tag.
365
+
366
+ Args:
367
+ component: The component to check for custom code.
368
+ tag: The tag of the component.
244
369
 
245
370
  Returns:
246
- The formatted component map.
371
+ The function Var for the component map.
247
372
  """
248
- components = {
249
- tag: Var(
250
- _js_expr=f"(({{node, {_CHILDREN._js_expr}, {_PROPS._js_expr}}}) => ({self.format_component(tag)}))"
251
- )
252
- for tag in self.component_map
253
- }
254
-
255
- # Separate out inline code and code blocks.
256
- components["code"] = Var(
257
- _js_expr=f"""(({{node, inline, className, {_CHILDREN._js_expr}, {_PROPS._js_expr}}}) => {{
258
- const match = (className || '').match(/language-(?<lang>.*)/);
259
- const language = match ? match[1] : '';
260
- if (language) {{
261
- (async () => {{
262
- try {{
263
- const module = await import(`react-syntax-highlighter/dist/cjs/languages/prism/${{language}}`);
264
- SyntaxHighlighter.registerLanguage(language, module.default);
265
- }} catch (error) {{
266
- console.error(`Error importing language module for ${{language}}:`, error);
267
- }}
268
- }})();
269
- }}
270
- return inline ? (
271
- {self.format_component("code")}
272
- ) : (
273
- {self.format_component("codeblock", language=Var(_js_expr="language", _var_type=str))}
274
- );
275
- }})""".replace("\n", " ")
373
+ formatted_component = Var(
374
+ _js_expr=f"({self.format_component(tag)})", _var_type=str
276
375
  )
376
+ if isinstance(component, MarkdownComponentMap):
377
+ return component.create_map_fn_var(fn_body=formatted_component)
277
378
 
278
- return components
379
+ # fallback to the default fn Var creation if the component is not a MarkdownComponentMap.
380
+ return MarkdownComponentMap.create_map_fn_var(fn_body=formatted_component)
381
+
382
+ def _get_map_fn_custom_code_from_children(self, component) -> list[str]:
383
+ """Recursively get markdown custom code from children components.
384
+
385
+ Args:
386
+ component: The component to check for custom code.
387
+
388
+ Returns:
389
+ A list of markdown custom code strings.
390
+ """
391
+ custom_code_list = []
392
+ if isinstance(component, MarkdownComponentMap):
393
+ custom_code_list.append(component.get_component_map_custom_code())
394
+
395
+ # If the component is a custom component(rx.memo), obtain the underlining
396
+ # component and get the custom code from the children.
397
+ if isinstance(component, CustomComponent):
398
+ custom_code_list.extend(
399
+ self._get_map_fn_custom_code_from_children(
400
+ component.component_fn(*component.get_prop_vars())
401
+ )
402
+ )
403
+ elif isinstance(component, Component):
404
+ for child in component.children:
405
+ custom_code_list.extend(
406
+ self._get_map_fn_custom_code_from_children(child)
407
+ )
408
+
409
+ return custom_code_list
279
410
 
280
411
  @staticmethod
281
412
  def _component_map_hash(component_map) -> str:
@@ -288,12 +419,12 @@ class Markdown(Component):
288
419
  return f"ComponentMap_{self.component_map_hash}"
289
420
 
290
421
  def _get_custom_code(self) -> str | None:
291
- hooks = set()
422
+ hooks = {}
292
423
  for _component in self.component_map.values():
293
424
  comp = _component(_MOCK_ARG)
294
425
  hooks.update(comp._get_all_hooks_internal())
295
426
  hooks.update(comp._get_all_hooks())
296
- formatted_hooks = "\n".join(hooks)
427
+ formatted_hooks = "\n".join(hooks.keys())
297
428
  return f"""
298
429
  function {self._get_component_map_name()} () {{
299
430
  {formatted_hooks}
@@ -3,11 +3,12 @@
3
3
  # ------------------- DO NOT EDIT ----------------------
4
4
  # This file was generated by `reflex/utils/pyi_generator.py`!
5
5
  # ------------------------------------------------------
6
+ import dataclasses
6
7
  from functools import lru_cache
7
- from typing import Any, Callable, Dict, Optional, Union, overload
8
+ from typing import Any, Callable, Dict, Optional, Sequence, Union, overload
8
9
 
9
10
  from reflex.components.component import Component
10
- from reflex.event import EventType
11
+ from reflex.event import BASE_STATE, EventType
11
12
  from reflex.style import Style
12
13
  from reflex.utils.imports import ImportDict
13
14
  from reflex.vars.base import LiteralVar, Var
@@ -16,6 +17,7 @@ _CHILDREN = Var(_js_expr="children", _var_type=str)
16
17
  _PROPS = Var(_js_expr="...props")
17
18
  _PROPS_IN_TAG = Var(_js_expr="{...props}")
18
19
  _MOCK_ARG = Var(_js_expr="", _var_type=str)
20
+ _LANGUAGE = Var(_js_expr="_language", _var_type=str)
19
21
  _REMARK_MATH = Var(_js_expr="remarkMath")
20
22
  _REMARK_GFM = Var(_js_expr="remarkGfm")
21
23
  _REMARK_UNWRAP_IMAGES = Var(_js_expr="remarkUnwrapImages")
@@ -27,6 +29,21 @@ NO_PROPS_TAGS = ("ul", "ol", "li")
27
29
 
28
30
  @lru_cache
29
31
  def get_base_component_map() -> dict[str, Callable]: ...
32
+ @dataclasses.dataclass()
33
+ class MarkdownComponentMap:
34
+ @classmethod
35
+ def get_component_map_custom_code(cls) -> str: ...
36
+ @classmethod
37
+ def create_map_fn_var(
38
+ cls,
39
+ fn_body: Var | None = None,
40
+ fn_args: Sequence[str] | None = None,
41
+ explicit_return: bool | None = None,
42
+ ) -> Var: ...
43
+ @classmethod
44
+ def get_fn_args(cls) -> Sequence[str]: ...
45
+ @classmethod
46
+ def get_fn_body(cls) -> Var: ...
30
47
 
31
48
  class Markdown(Component):
32
49
  @overload
@@ -41,22 +58,22 @@ class Markdown(Component):
41
58
  id: Optional[Any] = None,
42
59
  class_name: Optional[Any] = None,
43
60
  autofocus: Optional[bool] = None,
44
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
45
- on_blur: Optional[EventType[[]]] = None,
46
- on_click: Optional[EventType[[]]] = None,
47
- on_context_menu: Optional[EventType[[]]] = None,
48
- on_double_click: Optional[EventType[[]]] = None,
49
- on_focus: Optional[EventType[[]]] = None,
50
- on_mount: Optional[EventType[[]]] = None,
51
- on_mouse_down: Optional[EventType[[]]] = None,
52
- on_mouse_enter: Optional[EventType[[]]] = None,
53
- on_mouse_leave: Optional[EventType[[]]] = None,
54
- on_mouse_move: Optional[EventType[[]]] = None,
55
- on_mouse_out: Optional[EventType[[]]] = None,
56
- on_mouse_over: Optional[EventType[[]]] = None,
57
- on_mouse_up: Optional[EventType[[]]] = None,
58
- on_scroll: Optional[EventType[[]]] = None,
59
- on_unmount: Optional[EventType[[]]] = None,
61
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
62
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
63
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
64
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
65
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
66
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
67
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
68
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
69
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
70
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
71
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
72
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
73
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
74
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
75
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
76
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
60
77
  **props,
61
78
  ) -> "Markdown":
62
79
  """Create a markdown component.
@@ -82,6 +99,6 @@ class Markdown(Component):
82
99
  ...
83
100
 
84
101
  def add_imports(self) -> ImportDict | list[ImportDict]: ...
102
+ def format_component_map(self) -> dict[str, Var]: ...
85
103
  def get_component(self, tag: str, **props) -> Component: ...
86
104
  def format_component(self, tag: str, **props) -> str: ...
87
- def format_component_map(self) -> dict[str, Var]: ...
@@ -3,10 +3,10 @@
3
3
  import dataclasses
4
4
  from typing import List, Optional
5
5
 
6
- from reflex.components.component import Component, NoSSRComponent
7
- from reflex.event import EventHandler, identity_event
6
+ from reflex.components.component import NoSSRComponent
7
+ from reflex.event import EventHandler, passthrough_event_spec
8
8
  from reflex.utils.imports import ImportDict
9
- from reflex.vars.base import Var
9
+ from reflex.vars.base import LiteralVar, Var
10
10
 
11
11
 
12
12
  @dataclasses.dataclass(frozen=True)
@@ -92,8 +92,11 @@ class Moment(NoSSRComponent):
92
92
  # Display the date in the given timezone.
93
93
  tz: Var[str]
94
94
 
95
+ # The locale to use when rendering.
96
+ locale: Var[str]
97
+
95
98
  # Fires when the date changes.
96
- on_change: EventHandler[identity_event(str)]
99
+ on_change: EventHandler[passthrough_event_spec(str)]
97
100
 
98
101
  def add_imports(self) -> ImportDict:
99
102
  """Add the imports for the Moment component.
@@ -101,22 +104,15 @@ class Moment(NoSSRComponent):
101
104
  Returns:
102
105
  The import dict for the component.
103
106
  """
107
+ imports = {}
108
+
109
+ if isinstance(self.locale, LiteralVar):
110
+ imports[""] = f"moment/locale/{self.locale._var_value}"
111
+ elif self.locale is not None:
112
+ # If the user is using a variable for the locale, we can't know the
113
+ # value at compile time so import all locales available.
114
+ imports[""] = "moment/min/locales"
104
115
  if self.tz is not None:
105
- return {"moment-timezone": ""}
106
- return {}
107
-
108
- @classmethod
109
- def create(cls, *children, **props) -> Component:
110
- """Create a Moment component.
111
-
112
- Args:
113
- *children: The children of the component.
114
- **props: The properties of the component.
116
+ imports["moment-timezone"] = ""
115
117
 
116
- Returns:
117
- The Moment Component.
118
- """
119
- comp = super().create(*children, **props)
120
- if "tz" in props:
121
- comp.lib_dependencies.append("moment-timezone")
122
- return comp
118
+ return imports