reflex 0.5.4a3__py3-none-any.whl → 0.5.5__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (260) hide show
  1. reflex/.templates/apps/demo/code/demo.py +1 -0
  2. reflex/.templates/apps/demo/code/pages/__init__.py +1 -0
  3. reflex/.templates/apps/demo/code/pages/datatable.py +1 -0
  4. reflex/.templates/apps/demo/code/pages/forms.py +1 -0
  5. reflex/.templates/apps/demo/code/pages/graphing.py +1 -0
  6. reflex/.templates/apps/demo/code/pages/home.py +1 -0
  7. reflex/.templates/apps/demo/code/styles.py +1 -0
  8. reflex/.templates/apps/demo/code/webui/components/loading_icon.py +1 -8
  9. reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +27 -12
  10. reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +19 -5
  11. reflex/.templates/web/utils/state.js +73 -7
  12. reflex/__init__.py +3 -0
  13. reflex/__init__.pyi +3 -0
  14. reflex/admin.py +1 -0
  15. reflex/app.py +8 -6
  16. reflex/app_module_for_backend.py +2 -1
  17. reflex/base.py +4 -4
  18. reflex/compiler/compiler.py +4 -3
  19. reflex/compiler/templates.py +2 -0
  20. reflex/compiler/utils.py +58 -35
  21. reflex/components/__init__.py +1 -0
  22. reflex/components/base/__init__.py +1 -0
  23. reflex/components/base/app_wrap.py +1 -0
  24. reflex/components/base/fragment.py +1 -0
  25. reflex/components/base/link.py +0 -1
  26. reflex/components/base/script.py +11 -15
  27. reflex/components/base/script.pyi +1 -2
  28. reflex/components/chakra/base.py +15 -13
  29. reflex/components/chakra/base.pyi +3 -1
  30. reflex/components/chakra/datadisplay/code.py +1 -0
  31. reflex/components/chakra/datadisplay/divider.py +1 -0
  32. reflex/components/chakra/datadisplay/table.py +1 -0
  33. reflex/components/chakra/datadisplay/table.pyi +3 -0
  34. reflex/components/chakra/datadisplay/tag.py +1 -0
  35. reflex/components/chakra/disclosure/transition.py +1 -0
  36. reflex/components/chakra/feedback/circularprogress.py +1 -0
  37. reflex/components/chakra/forms/button.py +1 -0
  38. reflex/components/chakra/forms/checkbox.py +4 -13
  39. reflex/components/chakra/forms/checkbox.pyi +1 -3
  40. reflex/components/chakra/forms/colormodeswitch.py +1 -0
  41. reflex/components/chakra/forms/editable.py +13 -16
  42. reflex/components/chakra/forms/editable.pyi +1 -3
  43. reflex/components/chakra/forms/form.py +1 -0
  44. reflex/components/chakra/forms/input.py +22 -21
  45. reflex/components/chakra/forms/input.pyi +4 -4
  46. reflex/components/chakra/forms/multiselect.py +1 -0
  47. reflex/components/chakra/forms/numberinput.py +3 -12
  48. reflex/components/chakra/forms/numberinput.pyi +1 -3
  49. reflex/components/chakra/forms/pininput.py +8 -14
  50. reflex/components/chakra/forms/pininput.pyi +2 -3
  51. reflex/components/chakra/forms/radio.py +4 -13
  52. reflex/components/chakra/forms/radio.pyi +2 -3
  53. reflex/components/chakra/forms/rangeslider.py +10 -13
  54. reflex/components/chakra/forms/rangeslider.pyi +2 -3
  55. reflex/components/chakra/forms/select.py +4 -12
  56. reflex/components/chakra/forms/select.pyi +2 -3
  57. reflex/components/chakra/forms/slider.py +10 -13
  58. reflex/components/chakra/forms/slider.pyi +2 -3
  59. reflex/components/chakra/forms/switch.py +4 -13
  60. reflex/components/chakra/forms/switch.pyi +1 -3
  61. reflex/components/chakra/forms/textarea.py +16 -17
  62. reflex/components/chakra/forms/textarea.pyi +1 -3
  63. reflex/components/chakra/media/avatar.py +4 -12
  64. reflex/components/chakra/media/avatar.pyi +1 -2
  65. reflex/components/chakra/media/icon.py +1 -0
  66. reflex/components/chakra/media/image.py +7 -11
  67. reflex/components/chakra/media/image.pyi +2 -2
  68. reflex/components/chakra/navigation/link.py +8 -4
  69. reflex/components/chakra/navigation/link.pyi +2 -1
  70. reflex/components/chakra/overlay/alertdialog.py +12 -14
  71. reflex/components/chakra/overlay/alertdialog.pyi +1 -2
  72. reflex/components/chakra/overlay/drawer.py +12 -14
  73. reflex/components/chakra/overlay/drawer.pyi +1 -2
  74. reflex/components/chakra/overlay/menu.py +7 -11
  75. reflex/components/chakra/overlay/menu.pyi +2 -2
  76. reflex/components/chakra/overlay/modal.py +13 -13
  77. reflex/components/chakra/overlay/modal.pyi +2 -2
  78. reflex/components/chakra/overlay/popover.py +6 -12
  79. reflex/components/chakra/overlay/popover.pyi +1 -2
  80. reflex/components/chakra/overlay/tooltip.py +7 -13
  81. reflex/components/chakra/overlay/tooltip.pyi +1 -2
  82. reflex/components/chakra/typography/heading.py +0 -1
  83. reflex/components/chakra/typography/span.py +1 -0
  84. reflex/components/chakra/typography/text.py +1 -0
  85. reflex/components/component.py +70 -43
  86. reflex/components/core/__init__.py +1 -0
  87. reflex/components/core/banner.py +27 -24
  88. reflex/components/core/banner.pyi +6 -2
  89. reflex/components/core/client_side_routing.py +1 -0
  90. reflex/components/core/cond.py +19 -17
  91. reflex/components/core/debounce.py +4 -11
  92. reflex/components/core/debounce.pyi +1 -1
  93. reflex/components/core/foreach.py +1 -0
  94. reflex/components/core/html.py +1 -0
  95. reflex/components/core/match.py +9 -6
  96. reflex/components/core/upload.py +26 -25
  97. reflex/components/core/upload.pyi +3 -4
  98. reflex/components/datadisplay/__init__.py +1 -0
  99. reflex/components/datadisplay/code.py +27 -23
  100. reflex/components/datadisplay/code.pyi +4 -2
  101. reflex/components/datadisplay/dataeditor.py +73 -80
  102. reflex/components/datadisplay/dataeditor.pyi +52 -4
  103. reflex/components/datadisplay/logo.py +1 -0
  104. reflex/components/el/__init__.py +1 -0
  105. reflex/components/el/__init__.pyi +8 -0
  106. reflex/components/el/element.py +0 -1
  107. reflex/components/el/elements/__init__.py +5 -0
  108. reflex/components/el/elements/__init__.pyi +12 -1
  109. reflex/components/el/elements/base.py +1 -0
  110. reflex/components/el/elements/forms.py +44 -61
  111. reflex/components/el/elements/forms.pyi +4 -6
  112. reflex/components/el/elements/inline.py +1 -0
  113. reflex/components/el/elements/media.py +53 -0
  114. reflex/components/el/elements/media.pyi +428 -0
  115. reflex/components/el/elements/metadata.py +11 -0
  116. reflex/components/el/elements/metadata.pyi +80 -0
  117. reflex/components/el/elements/other.py +1 -0
  118. reflex/components/el/elements/scripts.py +1 -0
  119. reflex/components/el/elements/tables.py +1 -0
  120. reflex/components/el/elements/typography.py +1 -0
  121. reflex/components/gridjs/datatable.py +9 -6
  122. reflex/components/gridjs/datatable.pyi +4 -1
  123. reflex/components/markdown/markdown.py +36 -41
  124. reflex/components/markdown/markdown.pyi +4 -3
  125. reflex/components/media/icon.py +1 -0
  126. reflex/components/moment/moment.py +11 -17
  127. reflex/components/moment/moment.pyi +4 -3
  128. reflex/components/next/base.py +1 -0
  129. reflex/components/next/image.py +6 -11
  130. reflex/components/next/image.pyi +2 -2
  131. reflex/components/plotly/plotly.py +1 -0
  132. reflex/components/props.py +1 -0
  133. reflex/components/radix/__init__.py +1 -0
  134. reflex/components/radix/primitives/__init__.py +1 -0
  135. reflex/components/radix/primitives/accordion.py +7 -15
  136. reflex/components/radix/primitives/accordion.pyi +7 -4
  137. reflex/components/radix/primitives/base.py +1 -0
  138. reflex/components/radix/primitives/drawer.py +17 -27
  139. reflex/components/radix/primitives/drawer.pyi +2 -4
  140. reflex/components/radix/primitives/form.py +4 -12
  141. reflex/components/radix/primitives/form.pyi +2 -3
  142. reflex/components/radix/primitives/slider.py +6 -11
  143. reflex/components/radix/primitives/slider.pyi +2 -2
  144. reflex/components/radix/themes/__init__.py +1 -0
  145. reflex/components/radix/themes/base.py +3 -3
  146. reflex/components/radix/themes/base.pyi +3 -2
  147. reflex/components/radix/themes/color_mode.py +31 -2
  148. reflex/components/radix/themes/color_mode.pyi +10 -1
  149. reflex/components/radix/themes/components/__init__.py +1 -0
  150. reflex/components/radix/themes/components/alert_dialog.py +13 -24
  151. reflex/components/radix/themes/components/alert_dialog.pyi +2 -4
  152. reflex/components/radix/themes/components/aspect_ratio.py +1 -0
  153. reflex/components/radix/themes/components/card.py +1 -0
  154. reflex/components/radix/themes/components/checkbox.py +6 -22
  155. reflex/components/radix/themes/components/checkbox.pyi +2 -4
  156. reflex/components/radix/themes/components/checkbox_group.py +15 -3
  157. reflex/components/radix/themes/components/checkbox_group.pyi +10 -2
  158. reflex/components/radix/themes/components/context_menu.py +29 -38
  159. reflex/components/radix/themes/components/context_menu.pyi +2 -5
  160. reflex/components/radix/themes/components/dialog.py +18 -26
  161. reflex/components/radix/themes/components/dialog.pyi +2 -4
  162. reflex/components/radix/themes/components/dropdown_menu.py +32 -57
  163. reflex/components/radix/themes/components/dropdown_menu.pyi +2 -7
  164. reflex/components/radix/themes/components/hover_card.py +5 -12
  165. reflex/components/radix/themes/components/hover_card.pyi +2 -3
  166. reflex/components/radix/themes/components/icon_button.py +1 -0
  167. reflex/components/radix/themes/components/icon_button.pyi +1 -0
  168. reflex/components/radix/themes/components/inset.py +1 -0
  169. reflex/components/radix/themes/components/popover.py +22 -27
  170. reflex/components/radix/themes/components/popover.pyi +2 -4
  171. reflex/components/radix/themes/components/radio_group.py +25 -17
  172. reflex/components/radix/themes/components/radio_group.pyi +2 -3
  173. reflex/components/radix/themes/components/scroll_area.py +1 -0
  174. reflex/components/radix/themes/components/segmented_control.py +18 -5
  175. reflex/components/radix/themes/components/segmented_control.pyi +16 -7
  176. reflex/components/radix/themes/components/select.py +13 -23
  177. reflex/components/radix/themes/components/select.pyi +1 -4
  178. reflex/components/radix/themes/components/separator.py +1 -0
  179. reflex/components/radix/themes/components/slider.py +7 -12
  180. reflex/components/radix/themes/components/slider.pyi +2 -3
  181. reflex/components/radix/themes/components/switch.py +5 -12
  182. reflex/components/radix/themes/components/switch.pyi +2 -3
  183. reflex/components/radix/themes/components/table.py +1 -0
  184. reflex/components/radix/themes/components/tabs.py +4 -11
  185. reflex/components/radix/themes/components/tabs.pyi +2 -2
  186. reflex/components/radix/themes/components/text_area.py +19 -18
  187. reflex/components/radix/themes/components/text_area.pyi +2 -3
  188. reflex/components/radix/themes/components/text_field.py +19 -18
  189. reflex/components/radix/themes/components/text_field.pyi +3 -3
  190. reflex/components/radix/themes/components/tooltip.py +10 -13
  191. reflex/components/radix/themes/components/tooltip.pyi +2 -3
  192. reflex/components/radix/themes/layout/__init__.py +1 -0
  193. reflex/components/radix/themes/layout/box.py +1 -0
  194. reflex/components/radix/themes/layout/container.py +1 -0
  195. reflex/components/radix/themes/layout/list.py +1 -0
  196. reflex/components/radix/themes/layout/list.pyi +1 -0
  197. reflex/components/radix/themes/layout/section.py +1 -0
  198. reflex/components/radix/themes/typography/__init__.py +1 -0
  199. reflex/components/radix/themes/typography/base.py +1 -0
  200. reflex/components/radix/themes/typography/blockquote.py +1 -0
  201. reflex/components/radix/themes/typography/code.py +1 -0
  202. reflex/components/radix/themes/typography/heading.py +1 -0
  203. reflex/components/radix/themes/typography/link.py +8 -3
  204. reflex/components/radix/themes/typography/link.pyi +2 -1
  205. reflex/components/react_player/audio.py +1 -0
  206. reflex/components/react_player/audio.pyi +48 -0
  207. reflex/components/react_player/react_player.py +49 -0
  208. reflex/components/react_player/react_player.pyi +49 -0
  209. reflex/components/react_player/video.py +1 -0
  210. reflex/components/react_player/video.pyi +48 -0
  211. reflex/components/recharts/__init__.py +1 -0
  212. reflex/components/recharts/cartesian.py +264 -74
  213. reflex/components/recharts/cartesian.pyi +573 -58
  214. reflex/components/recharts/charts.py +68 -78
  215. reflex/components/recharts/charts.pyi +373 -156
  216. reflex/components/recharts/general.py +52 -20
  217. reflex/components/recharts/general.pyi +52 -6
  218. reflex/components/recharts/polar.py +30 -18
  219. reflex/components/recharts/polar.pyi +66 -5
  220. reflex/components/recharts/recharts.py +5 -3
  221. reflex/components/recharts/recharts.pyi +2 -1
  222. reflex/components/sonner/toast.py +2 -2
  223. reflex/components/sonner/toast.pyi +1 -1
  224. reflex/components/suneditor/editor.py +39 -26
  225. reflex/components/suneditor/editor.pyi +4 -4
  226. reflex/components/tags/iter_tag.py +1 -0
  227. reflex/constants/__init__.py +3 -2
  228. reflex/constants/base.py +20 -21
  229. reflex/constants/compiler.py +3 -1
  230. reflex/constants/config.py +1 -0
  231. reflex/constants/event.py +1 -0
  232. reflex/constants/installer.py +3 -2
  233. reflex/constants/style.py +2 -8
  234. reflex/event.py +36 -6
  235. reflex/experimental/assets.py +1 -0
  236. reflex/experimental/client_state.py +9 -3
  237. reflex/experimental/hooks.py +1 -0
  238. reflex/experimental/misc.py +12 -3
  239. reflex/middleware/hydrate_middleware.py +1 -0
  240. reflex/middleware/middleware.py +1 -0
  241. reflex/state.py +38 -1
  242. reflex/style.py +67 -20
  243. reflex/testing.py +6 -2
  244. reflex/utils/build.py +76 -72
  245. reflex/utils/exec.py +17 -9
  246. reflex/utils/export.py +13 -9
  247. reflex/utils/imports.py +34 -5
  248. reflex/utils/lazy_loader.py +1 -0
  249. reflex/utils/path_ops.py +39 -33
  250. reflex/utils/prerequisites.py +38 -29
  251. reflex/utils/processes.py +1 -1
  252. reflex/utils/serializers.py +3 -6
  253. reflex/utils/watch.py +3 -1
  254. reflex/vars.py +26 -10
  255. reflex/vars.pyi +3 -3
  256. {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/METADATA +3 -3
  257. {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/RECORD +260 -260
  258. {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/LICENSE +0 -0
  259. {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/WHEEL +0 -0
  260. {reflex-0.5.4a3.dist-info → reflex-0.5.5.dist-info}/entry_points.txt +0 -0
@@ -4,9 +4,8 @@ from __future__ import annotations
4
4
 
5
5
  import os
6
6
  from pathlib import Path
7
- from typing import Any, Callable, ClassVar, Dict, List, Optional, Union
7
+ from typing import Callable, ClassVar, Dict, List, Optional
8
8
 
9
- from reflex import constants
10
9
  from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf
11
10
  from reflex.components.el.elements.forms import Input
12
11
  from reflex.components.radix.themes.layout.box import Box
@@ -14,22 +13,21 @@ from reflex.constants import Dirs
14
13
  from reflex.event import (
15
14
  CallableEventSpec,
16
15
  EventChain,
16
+ EventHandler,
17
17
  EventSpec,
18
18
  call_event_fn,
19
19
  call_script,
20
20
  parse_args_spec,
21
21
  )
22
- from reflex.utils import imports
22
+ from reflex.utils.imports import ImportVar
23
23
  from reflex.vars import BaseVar, CallableVar, Var, VarData
24
24
 
25
25
  DEFAULT_UPLOAD_ID: str = "default"
26
26
 
27
27
  upload_files_context_var_data: VarData = VarData(
28
28
  imports={
29
- "react": [imports.ImportVar(tag="useContext")],
30
- f"/{Dirs.CONTEXTS_PATH}": [
31
- imports.ImportVar(tag="UploadFilesContext"),
32
- ],
29
+ "react": "useContext",
30
+ f"/{Dirs.CONTEXTS_PATH}": "UploadFilesContext",
33
31
  },
34
32
  hooks={
35
33
  "const [filesById, setFilesById] = useContext(UploadFilesContext);": None,
@@ -50,10 +48,18 @@ def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> BaseVar:
50
48
  Returns:
51
49
  A var referencing the file upload drop trigger.
52
50
  """
51
+ id_var = Var.create_safe(id_, _var_is_string=True)
52
+ var_name = f"""e => setFilesById(filesById => {{
53
+ const updatedFilesById = Object.assign({{}}, filesById);
54
+ updatedFilesById[{id_var._var_name_unwrapped}] = e;
55
+ return updatedFilesById;
56
+ }})
57
+ """
58
+
53
59
  return BaseVar(
54
- _var_name=f"e => setFilesById(filesById => ({{...filesById, {id_}: e}}))",
60
+ _var_name=var_name,
55
61
  _var_type=EventChain,
56
- _var_data=upload_files_context_var_data,
62
+ _var_data=VarData.merge(upload_files_context_var_data, id_var._var_data),
57
63
  )
58
64
 
59
65
 
@@ -67,10 +73,11 @@ def selected_files(id_: str = DEFAULT_UPLOAD_ID) -> BaseVar:
67
73
  Returns:
68
74
  A var referencing the list of selected file paths.
69
75
  """
76
+ id_var = Var.create_safe(id_, _var_is_string=True)
70
77
  return BaseVar(
71
- _var_name=f"(filesById.{id_} ? filesById.{id_}.map((f) => (f.path || f.name)) : [])",
78
+ _var_name=f"(filesById[{id_var._var_name_unwrapped}] ? filesById[{id_var._var_name_unwrapped}].map((f) => (f.path || f.name)) : [])",
72
79
  _var_type=List[str],
73
- _var_data=upload_files_context_var_data,
80
+ _var_data=VarData.merge(upload_files_context_var_data, id_var._var_data),
74
81
  )
75
82
 
76
83
 
@@ -99,7 +106,9 @@ def cancel_upload(upload_id: str) -> EventSpec:
99
106
  Returns:
100
107
  An event spec that cancels the upload when triggered.
101
108
  """
102
- return call_script(f"upload_controllers[{upload_id!r}]?.abort()")
109
+ return call_script(
110
+ f"upload_controllers[{Var.create_safe(upload_id, _var_is_string=True)._var_name_unwrapped!r}]?.abort()"
111
+ )
103
112
 
104
113
 
105
114
  def get_upload_dir() -> Path:
@@ -122,8 +131,8 @@ uploaded_files_url_prefix: Var = Var.create_safe(
122
131
  _var_is_string=False,
123
132
  _var_data=VarData(
124
133
  imports={
125
- f"/{Dirs.STATE_PATH}": [imports.ImportVar(tag="getBackendURL")],
126
- "/env.json": [imports.ImportVar(tag="env", is_default=True)],
134
+ f"/{Dirs.STATE_PATH}": "getBackendURL",
135
+ "/env.json": ImportVar(tag="env", is_default=True),
127
136
  }
128
137
  ),
129
138
  )
@@ -205,6 +214,9 @@ class Upload(MemoizationLeaf):
205
214
  # Marked True when any Upload component is created.
206
215
  is_used: ClassVar[bool] = False
207
216
 
217
+ # Fired when files are dropped.
218
+ on_drop: EventHandler[_on_drop_spec]
219
+
208
220
  @classmethod
209
221
  def create(cls, *children, **props) -> Component:
210
222
  """Create an upload component.
@@ -269,17 +281,6 @@ class Upload(MemoizationLeaf):
269
281
  **upload_props,
270
282
  )
271
283
 
272
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]:
273
- """Get the event triggers that pass the component's value to the handler.
274
-
275
- Returns:
276
- A dict mapping the event trigger to the var that is passed to the handler.
277
- """
278
- return {
279
- **super().get_event_triggers(),
280
- constants.EventTriggers.ON_DROP: _on_drop_spec,
281
- }
282
-
283
284
  @classmethod
284
285
  def _update_arg_tuple_for_on_drop(cls, arg_value: tuple[Var, Var]):
285
286
  """Helper to update caller-provided EventSpec args for direct use with on_drop.
@@ -9,8 +9,7 @@ from reflex.event import EventChain, EventHandler, EventSpec
9
9
  from reflex.style import Style
10
10
  import os
11
11
  from pathlib import Path
12
- from typing import Any, Callable, ClassVar, Dict, List, Optional, Union
13
- from reflex import constants
12
+ from typing import Callable, ClassVar, Dict, List, Optional
14
13
  from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf
15
14
  from reflex.components.el.elements.forms import Input
16
15
  from reflex.components.radix.themes.layout.box import Box
@@ -18,12 +17,13 @@ from reflex.constants import Dirs
18
17
  from reflex.event import (
19
18
  CallableEventSpec,
20
19
  EventChain,
20
+ EventHandler,
21
21
  EventSpec,
22
22
  call_event_fn,
23
23
  call_script,
24
24
  parse_args_spec,
25
25
  )
26
- from reflex.utils import imports
26
+ from reflex.utils.imports import ImportVar
27
27
  from reflex.vars import BaseVar, CallableVar, Var, VarData
28
28
 
29
29
  DEFAULT_UPLOAD_ID: str
@@ -218,7 +218,6 @@ class Upload(MemoizationLeaf):
218
218
  The upload component.
219
219
  """
220
220
  ...
221
- def get_event_triggers(self) -> dict[str, Union[Var, Any]]: ...
222
221
 
223
222
  class StyledUpload(Upload):
224
223
  @overload
@@ -1,4 +1,5 @@
1
1
  """Data grid components."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from reflex.utils import lazy_loader
@@ -1,4 +1,5 @@
1
1
  """A code component."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  import re
@@ -12,8 +13,8 @@ from reflex.components.core.cond import color_mode_cond
12
13
  from reflex.constants.colors import Color
13
14
  from reflex.event import set_clipboard
14
15
  from reflex.style import Style
15
- from reflex.utils import format, imports
16
- from reflex.utils.imports import ImportVar
16
+ from reflex.utils import format
17
+ from reflex.utils.imports import ImportDict, ImportVar
17
18
  from reflex.vars import Var
18
19
 
19
20
  LiteralCodeBlockTheme = Literal[
@@ -381,42 +382,45 @@ class CodeBlock(Component):
381
382
  # Props passed down to the code tag.
382
383
  code_tag_props: Var[Dict[str, str]]
383
384
 
384
- def _get_imports(self) -> imports.ImportDict:
385
- merged_imports = super()._get_imports()
386
- # Get all themes from a cond literal
385
+ def add_imports(self) -> ImportDict:
386
+ """Add imports for the CodeBlock component.
387
+
388
+ Returns:
389
+ The import dict.
390
+ """
391
+ imports_: ImportDict = {}
387
392
  themes = re.findall(r"`(.*?)`", self.theme._var_name)
388
393
  if not themes:
389
394
  themes = [self.theme._var_name]
390
- merged_imports = imports.merge_imports(
391
- merged_imports,
395
+
396
+ imports_.update(
392
397
  {
393
- f"react-syntax-highlighter/dist/cjs/styles/prism/{self.convert_theme_name(theme)}": {
398
+ f"react-syntax-highlighter/dist/cjs/styles/prism/{self.convert_theme_name(theme)}": [
394
399
  ImportVar(
395
400
  tag=format.to_camel_case(self.convert_theme_name(theme)),
396
401
  is_default=True,
397
402
  install=False,
398
403
  )
399
- }
404
+ ]
400
405
  for theme in themes
401
- },
406
+ }
402
407
  )
408
+
403
409
  if (
404
410
  self.language is not None
405
411
  and self.language._var_name in LiteralCodeLanguage.__args__ # type: ignore
406
412
  ):
407
- merged_imports = imports.merge_imports(
408
- merged_imports,
409
- {
410
- f"react-syntax-highlighter/dist/cjs/languages/prism/{self.language._var_name}": {
411
- ImportVar(
412
- tag=format.to_camel_case(self.language._var_name),
413
- is_default=True,
414
- install=False,
415
- )
416
- }
417
- },
418
- )
419
- return merged_imports
413
+ imports_[
414
+ f"react-syntax-highlighter/dist/cjs/languages/prism/{self.language._var_name}"
415
+ ] = [
416
+ ImportVar(
417
+ tag=format.to_camel_case(self.language._var_name),
418
+ is_default=True,
419
+ install=False,
420
+ )
421
+ ]
422
+
423
+ return imports_
420
424
 
421
425
  def _get_custom_code(self) -> Optional[str]:
422
426
  if (
@@ -17,8 +17,8 @@ from reflex.components.core.cond import color_mode_cond
17
17
  from reflex.constants.colors import Color
18
18
  from reflex.event import set_clipboard
19
19
  from reflex.style import Style
20
- from reflex.utils import format, imports
21
- from reflex.utils.imports import ImportVar
20
+ from reflex.utils import format
21
+ from reflex.utils.imports import ImportDict, ImportVar
22
22
  from reflex.vars import Var
23
23
 
24
24
  LiteralCodeBlockTheme = Literal[
@@ -351,6 +351,7 @@ LiteralCodeLanguage = Literal[
351
351
  ]
352
352
 
353
353
  class CodeBlock(Component):
354
+ def add_imports(self) -> ImportDict: ...
354
355
  @overload
355
356
  @classmethod
356
357
  def create( # type: ignore
@@ -1111,6 +1112,7 @@ class CodeBlock(Component):
1111
1112
  The text component.
1112
1113
  """
1113
1114
  ...
1115
+
1114
1116
  def add_style(self): ...
1115
1117
  @staticmethod
1116
1118
  def convert_theme_name(theme) -> str: ...
@@ -1,14 +1,16 @@
1
1
  """Data Editor component from glide-data-grid."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from enum import Enum
5
- from typing import Any, Callable, Dict, List, Literal, Optional, Union
6
+ from typing import Any, Dict, List, Literal, Optional, Union
6
7
 
7
8
  from reflex.base import Base
8
9
  from reflex.components.component import Component, NoSSRComponent
9
10
  from reflex.components.literals import LiteralRowMarker
10
- from reflex.utils import console, format, imports, types
11
- from reflex.utils.imports import ImportVar
11
+ from reflex.event import EventHandler
12
+ from reflex.utils import console, format, types
13
+ from reflex.utils.imports import ImportDict, ImportVar
12
14
  from reflex.utils.serializers import serializer
13
15
  from reflex.vars import Var, get_unique_variable_name
14
16
 
@@ -103,6 +105,19 @@ class DataEditorTheme(Base):
103
105
  text_medium: Optional[str] = None
104
106
 
105
107
 
108
+ def on_edit_spec(pos, data: dict[str, Any]):
109
+ """The on edit spec function.
110
+
111
+ Args:
112
+ pos: The position of the edit event.
113
+ data: The data of the edit event.
114
+
115
+ Returns:
116
+ The position and data.
117
+ """
118
+ return [pos, data]
119
+
120
+
106
121
  class DataEditor(NoSSRComponent):
107
122
  """The DataEditor Component."""
108
123
 
@@ -205,51 +220,66 @@ class DataEditor(NoSSRComponent):
205
220
  # global theme
206
221
  theme: Var[Union[DataEditorTheme, Dict]]
207
222
 
208
- def _get_imports(self):
209
- return imports.merge_imports(
210
- super()._get_imports(),
211
- {
212
- "": {
213
- ImportVar(
214
- tag=f"{format.format_library_name(self.library)}/dist/index.css"
215
- )
216
- },
217
- self.library: {ImportVar(tag="GridCellKind")},
218
- "/utils/helpers/dataeditor.js": {
219
- ImportVar(
220
- tag=f"formatDataEditorCells", is_default=False, install=False
221
- ),
222
- },
223
- },
224
- )
223
+ # Fired when a cell is activated.
224
+ on_cell_activated: EventHandler[lambda pos: [pos]]
225
225
 
226
- def get_event_triggers(self) -> Dict[str, Callable]:
227
- """The event triggers of the component.
226
+ # Fired when a cell is clicked.
227
+ on_cell_clicked: EventHandler[lambda pos: [pos]]
228
228
 
229
- Returns:
230
- The dict describing the event triggers.
231
- """
229
+ # Fired when a cell is right-clicked.
230
+ on_cell_context_menu: EventHandler[lambda pos: [pos]]
231
+
232
+ # Fired when a cell is edited.
233
+ on_cell_edited: EventHandler[on_edit_spec]
234
+
235
+ # Fired when a group header is clicked.
236
+ on_group_header_clicked: EventHandler[on_edit_spec]
237
+
238
+ # Fired when a group header is right-clicked.
239
+ on_group_header_context_menu: EventHandler[lambda grp_idx, data: [grp_idx, data]]
240
+
241
+ # Fired when a group header is renamed.
242
+ on_group_header_renamed: EventHandler[lambda idx, val: [idx, val]]
243
+
244
+ # Fired when a header is clicked.
245
+ on_header_clicked: EventHandler[lambda pos: [pos]]
246
+
247
+ # Fired when a header is right-clicked.
248
+ on_header_context_menu: EventHandler[lambda pos: [pos]]
249
+
250
+ # Fired when a header menu item is clicked.
251
+ on_header_menu_click: EventHandler[lambda col, pos: [col, pos]]
232
252
 
233
- def edit_sig(pos, data: dict[str, Any]):
234
- return [pos, data]
253
+ # Fired when an item is hovered.
254
+ on_item_hovered: EventHandler[lambda pos: [pos]]
235
255
 
256
+ # Fired when a selection is deleted.
257
+ on_delete: EventHandler[lambda selection: [selection]]
258
+
259
+ # Fired when editing is finished.
260
+ on_finished_editing: EventHandler[lambda new_value, movement: [new_value, movement]]
261
+
262
+ # Fired when a row is appended.
263
+ on_row_appended: EventHandler[lambda: []]
264
+
265
+ # Fired when the selection is cleared.
266
+ on_selection_cleared: EventHandler[lambda: []]
267
+
268
+ # Fired when a column is resized.
269
+ on_column_resize: EventHandler[lambda col, width: [col, width]]
270
+
271
+ def add_imports(self) -> ImportDict:
272
+ """Add imports for the component.
273
+
274
+ Returns:
275
+ The import dict.
276
+ """
236
277
  return {
237
- "on_cell_activated": lambda pos: [pos],
238
- "on_cell_clicked": lambda pos: [pos],
239
- "on_cell_context_menu": lambda pos: [pos],
240
- "on_cell_edited": edit_sig,
241
- "on_group_header_clicked": edit_sig,
242
- "on_group_header_context_menu": lambda grp_idx, data: [grp_idx, data],
243
- "on_group_header_renamed": lambda idx, val: [idx, val],
244
- "on_header_clicked": lambda pos: [pos],
245
- "on_header_context_menu": lambda pos: [pos],
246
- "on_header_menu_click": lambda col, pos: [col, pos],
247
- "on_item_hovered": lambda pos: [pos],
248
- "on_delete": lambda selection: [selection],
249
- "on_finished_editing": lambda new_value, movement: [new_value, movement],
250
- "on_row_appended": lambda: [],
251
- "on_selection_cleared": lambda: [],
252
- "on_column_resize": lambda col, width: [col, width],
278
+ "": f"{format.format_library_name(self.library)}/dist/index.css",
279
+ self.library: "GridCellKind",
280
+ "/utils/helpers/dataeditor.js": ImportVar(
281
+ tag="formatDataEditorCells", is_default=False, install=False
282
+ ),
253
283
  }
254
284
 
255
285
  def add_hooks(self) -> list[str]:
@@ -363,43 +393,6 @@ class DataEditor(NoSSRComponent):
363
393
  }
364
394
 
365
395
 
366
- # try:
367
- # pass
368
-
369
- # # def format_dataframe_values(df: DataFrame) -> list[list[Any]]:
370
- # # """Format dataframe values to a list of lists.
371
-
372
- # # Args:
373
- # # df: The dataframe to format.
374
-
375
- # # Returns:
376
- # # The dataframe as a list of lists.
377
- # # """
378
- # # return [
379
- # # [str(d) if isinstance(d, (list, tuple)) else d for d in data]
380
- # # for data in list(df.values.tolist())
381
- # # ]
382
- # # ...
383
-
384
- # # @serializer
385
- # # def serialize_dataframe(df: DataFrame) -> dict:
386
- # # """Serialize a pandas dataframe.
387
-
388
- # # Args:
389
- # # df: The dataframe to serialize.
390
-
391
- # # Returns:
392
- # # The serialized dataframe.
393
- # # """
394
- # # return {
395
- # # "columns": df.columns.tolist(),
396
- # # "data": format_dataframe_values(df),
397
- # # }
398
-
399
- # except ImportError:
400
- # pass
401
-
402
-
403
396
  @serializer
404
397
  def serialize_dataeditortheme(theme: DataEditorTheme):
405
398
  """The serializer for the data editor theme.
@@ -8,12 +8,13 @@ from reflex.vars import Var, BaseVar, ComputedVar
8
8
  from reflex.event import EventChain, EventHandler, EventSpec
9
9
  from reflex.style import Style
10
10
  from enum import Enum
11
- from typing import Any, Callable, Dict, List, Literal, Optional, Union
11
+ from typing import Any, Dict, List, Literal, Optional, Union
12
12
  from reflex.base import Base
13
13
  from reflex.components.component import Component, NoSSRComponent
14
14
  from reflex.components.literals import LiteralRowMarker
15
- from reflex.utils import console, format, imports, types
16
- from reflex.utils.imports import ImportVar
15
+ from reflex.event import EventHandler
16
+ from reflex.utils import console, format, types
17
+ from reflex.utils.imports import ImportDict, ImportVar
17
18
  from reflex.utils.serializers import serializer
18
19
  from reflex.vars import Var, get_unique_variable_name
19
20
 
@@ -79,8 +80,10 @@ class DataEditorTheme(Base):
79
80
  text_light: Optional[str]
80
81
  text_medium: Optional[str]
81
82
 
83
+ def on_edit_spec(pos, data: dict[str, Any]): ...
84
+
82
85
  class DataEditor(NoSSRComponent):
83
- def get_event_triggers(self) -> Dict[str, Callable]: ...
86
+ def add_imports(self) -> ImportDict: ...
84
87
  def add_hooks(self) -> list[str]: ...
85
88
  @overload
86
89
  @classmethod
@@ -136,6 +139,9 @@ class DataEditor(NoSSRComponent):
136
139
  class_name: Optional[Any] = None,
137
140
  autofocus: Optional[bool] = None,
138
141
  custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
142
+ on_blur: Optional[
143
+ Union[EventHandler, EventSpec, list, function, BaseVar]
144
+ ] = None,
139
145
  on_cell_activated: Optional[
140
146
  Union[EventHandler, EventSpec, list, function, BaseVar]
141
147
  ] = None,
@@ -148,15 +154,27 @@ class DataEditor(NoSSRComponent):
148
154
  on_cell_edited: Optional[
149
155
  Union[EventHandler, EventSpec, list, function, BaseVar]
150
156
  ] = None,
157
+ on_click: Optional[
158
+ Union[EventHandler, EventSpec, list, function, BaseVar]
159
+ ] = None,
151
160
  on_column_resize: Optional[
152
161
  Union[EventHandler, EventSpec, list, function, BaseVar]
153
162
  ] = None,
163
+ on_context_menu: Optional[
164
+ Union[EventHandler, EventSpec, list, function, BaseVar]
165
+ ] = None,
154
166
  on_delete: Optional[
155
167
  Union[EventHandler, EventSpec, list, function, BaseVar]
156
168
  ] = None,
169
+ on_double_click: Optional[
170
+ Union[EventHandler, EventSpec, list, function, BaseVar]
171
+ ] = None,
157
172
  on_finished_editing: Optional[
158
173
  Union[EventHandler, EventSpec, list, function, BaseVar]
159
174
  ] = None,
175
+ on_focus: Optional[
176
+ Union[EventHandler, EventSpec, list, function, BaseVar]
177
+ ] = None,
160
178
  on_group_header_clicked: Optional[
161
179
  Union[EventHandler, EventSpec, list, function, BaseVar]
162
180
  ] = None,
@@ -178,12 +196,42 @@ class DataEditor(NoSSRComponent):
178
196
  on_item_hovered: Optional[
179
197
  Union[EventHandler, EventSpec, list, function, BaseVar]
180
198
  ] = None,
199
+ on_mount: Optional[
200
+ Union[EventHandler, EventSpec, list, function, BaseVar]
201
+ ] = None,
202
+ on_mouse_down: Optional[
203
+ Union[EventHandler, EventSpec, list, function, BaseVar]
204
+ ] = None,
205
+ on_mouse_enter: Optional[
206
+ Union[EventHandler, EventSpec, list, function, BaseVar]
207
+ ] = None,
208
+ on_mouse_leave: Optional[
209
+ Union[EventHandler, EventSpec, list, function, BaseVar]
210
+ ] = None,
211
+ on_mouse_move: Optional[
212
+ Union[EventHandler, EventSpec, list, function, BaseVar]
213
+ ] = None,
214
+ on_mouse_out: Optional[
215
+ Union[EventHandler, EventSpec, list, function, BaseVar]
216
+ ] = None,
217
+ on_mouse_over: Optional[
218
+ Union[EventHandler, EventSpec, list, function, BaseVar]
219
+ ] = None,
220
+ on_mouse_up: Optional[
221
+ Union[EventHandler, EventSpec, list, function, BaseVar]
222
+ ] = None,
181
223
  on_row_appended: Optional[
182
224
  Union[EventHandler, EventSpec, list, function, BaseVar]
183
225
  ] = None,
226
+ on_scroll: Optional[
227
+ Union[EventHandler, EventSpec, list, function, BaseVar]
228
+ ] = None,
184
229
  on_selection_cleared: Optional[
185
230
  Union[EventHandler, EventSpec, list, function, BaseVar]
186
231
  ] = None,
232
+ on_unmount: Optional[
233
+ Union[EventHandler, EventSpec, list, function, BaseVar]
234
+ ] = None,
187
235
  **props
188
236
  ) -> "DataEditor":
189
237
  """Create the DataEditor component.
@@ -1,4 +1,5 @@
1
1
  """A Reflex logo component."""
2
+
2
3
  import reflex as rx
3
4
 
4
5
 
@@ -1,4 +1,5 @@
1
1
  """The el package exports raw HTML elements."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from reflex.utils import lazy_loader
@@ -101,6 +101,9 @@ from .elements.media import picture as picture
101
101
  from .elements.media import portal as portal
102
102
  from .elements.media import source as source
103
103
  from .elements.media import svg as svg
104
+ from .elements.media import defs as defs
105
+ from .elements.media import lineargradient as lineargradient
106
+ from .elements.media import stop as stop
104
107
  from .elements.media import path as path
105
108
  from .elements.media import Area as Area
106
109
  from .elements.media import Audio as Audio
@@ -115,17 +118,22 @@ from .elements.media import Picture as Picture
115
118
  from .elements.media import Portal as Portal
116
119
  from .elements.media import Source as Source
117
120
  from .elements.media import Svg as Svg
121
+ from .elements.media import Defs as Defs
122
+ from .elements.media import Lineargradient as Lineargradient
123
+ from .elements.media import Stop as Stop
118
124
  from .elements.media import Path as Path
119
125
  from .elements.metadata import base as base
120
126
  from .elements.metadata import head as head
121
127
  from .elements.metadata import link as link
122
128
  from .elements.metadata import meta as meta
123
129
  from .elements.metadata import title as title
130
+ from .elements.metadata import style as style
124
131
  from .elements.metadata import Base as Base
125
132
  from .elements.metadata import Head as Head
126
133
  from .elements.metadata import Link as Link
127
134
  from .elements.metadata import Meta as Meta
128
135
  from .elements.metadata import Title as Title
136
+ from .elements.metadata import Style as Style
129
137
  from .elements.other import details as details
130
138
  from .elements.other import dialog as dialog
131
139
  from .elements.other import summary as summary
@@ -1,6 +1,5 @@
1
1
  """Base class definition for raw HTML elements."""
2
2
 
3
-
4
3
  from reflex.components.component import Component
5
4
 
6
5
 
@@ -1,4 +1,5 @@
1
1
  """Element classes."""
2
+
2
3
  from __future__ import annotations
3
4
 
4
5
  from reflex.utils import lazy_loader
@@ -64,6 +65,9 @@ _MAPPING = {
64
65
  "portal",
65
66
  "source",
66
67
  "svg",
68
+ "defs",
69
+ "lineargradient",
70
+ "stop",
67
71
  "path",
68
72
  ],
69
73
  "metadata": [
@@ -72,6 +76,7 @@ _MAPPING = {
72
76
  "link",
73
77
  "meta",
74
78
  "title",
79
+ "style",
75
80
  ],
76
81
  "other": ["details", "dialog", "summary", "slot", "template", "math", "html"],
77
82
  "scripts": ["canvas", "noscript", "script"],