reflex 0.6.4a3__py3-none-any.whl → 0.6.5__py3-none-any.whl

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

Potentially problematic release.


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

Files changed (228) hide show
  1. reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -14
  2. reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -8
  3. reflex/.templates/web/components/shiki/code.js +16 -11
  4. reflex/.templates/web/utils/state.js +29 -21
  5. reflex/__init__.py +4 -0
  6. reflex/__init__.pyi +4 -0
  7. reflex/app.py +148 -154
  8. reflex/app_mixins/lifespan.py +5 -1
  9. reflex/app_mixins/middleware.py +3 -1
  10. reflex/app_mixins/mixin.py +3 -2
  11. reflex/base.py +2 -4
  12. reflex/compiler/compiler.py +111 -37
  13. reflex/components/base/app_wrap.pyi +17 -17
  14. reflex/components/base/bare.py +72 -3
  15. reflex/components/base/body.pyi +17 -17
  16. reflex/components/base/document.pyi +81 -81
  17. reflex/components/base/error_boundary.pyi +25 -18
  18. reflex/components/base/fragment.pyi +17 -17
  19. reflex/components/base/head.pyi +33 -33
  20. reflex/components/base/link.pyi +33 -33
  21. reflex/components/base/meta.pyi +65 -65
  22. reflex/components/base/script.py +4 -4
  23. reflex/components/base/script.pyi +23 -20
  24. reflex/components/component.py +250 -31
  25. reflex/components/core/banner.py +1 -1
  26. reflex/components/core/banner.pyi +81 -81
  27. reflex/components/core/client_side_routing.pyi +33 -33
  28. reflex/components/core/clipboard.py +2 -2
  29. reflex/components/core/clipboard.pyi +24 -18
  30. reflex/components/core/debounce.py +2 -2
  31. reflex/components/core/debounce.pyi +18 -18
  32. reflex/components/core/html.pyi +17 -17
  33. reflex/components/core/upload.py +90 -28
  34. reflex/components/core/upload.pyi +128 -72
  35. reflex/components/datadisplay/code.py +55 -40
  36. reflex/components/datadisplay/code.pyi +46 -44
  37. reflex/components/datadisplay/dataeditor.py +21 -20
  38. reflex/components/datadisplay/dataeditor.pyi +103 -35
  39. reflex/components/datadisplay/shiki_code_block.py +60 -27
  40. reflex/components/datadisplay/shiki_code_block.pyi +86 -65
  41. reflex/components/dynamic.py +9 -5
  42. reflex/components/el/element.pyi +17 -17
  43. reflex/components/el/elements/base.pyi +17 -17
  44. reflex/components/el/elements/forms.py +12 -3
  45. reflex/components/el/elements/forms.pyi +293 -233
  46. reflex/components/el/elements/inline.pyi +449 -449
  47. reflex/components/el/elements/media.pyi +401 -401
  48. reflex/components/el/elements/metadata.pyi +97 -97
  49. reflex/components/el/elements/other.pyi +113 -113
  50. reflex/components/el/elements/scripts.pyi +49 -49
  51. reflex/components/el/elements/sectioning.pyi +241 -241
  52. reflex/components/el/elements/tables.pyi +161 -161
  53. reflex/components/el/elements/typography.pyi +241 -241
  54. reflex/components/gridjs/datatable.pyi +33 -33
  55. reflex/components/lucide/icon.py +1 -1
  56. reflex/components/lucide/icon.pyi +33 -33
  57. reflex/components/markdown/markdown.py +180 -49
  58. reflex/components/markdown/markdown.pyi +36 -19
  59. reflex/components/moment/moment.py +17 -21
  60. reflex/components/moment/moment.pyi +26 -21
  61. reflex/components/next/base.pyi +17 -17
  62. reflex/components/next/image.py +3 -3
  63. reflex/components/next/image.pyi +21 -19
  64. reflex/components/next/link.pyi +17 -17
  65. reflex/components/next/video.pyi +17 -17
  66. reflex/components/plotly/plotly.py +79 -78
  67. reflex/components/plotly/plotly.pyi +91 -41
  68. reflex/components/props.py +34 -0
  69. reflex/components/radix/primitives/accordion.py +15 -8
  70. reflex/components/radix/primitives/accordion.pyi +121 -118
  71. reflex/components/radix/primitives/base.pyi +33 -33
  72. reflex/components/radix/primitives/drawer.py +41 -20
  73. reflex/components/radix/primitives/drawer.pyi +279 -190
  74. reflex/components/radix/primitives/form.py +2 -2
  75. reflex/components/radix/primitives/form.pyi +200 -167
  76. reflex/components/radix/primitives/progress.pyi +81 -81
  77. reflex/components/radix/primitives/slider.pyi +89 -83
  78. reflex/components/radix/themes/base.py +30 -1
  79. reflex/components/radix/themes/base.pyi +286 -113
  80. reflex/components/radix/themes/color_mode.py +17 -9
  81. reflex/components/radix/themes/color_mode.pyi +68 -56
  82. reflex/components/radix/themes/components/alert_dialog.py +8 -5
  83. reflex/components/radix/themes/components/alert_dialog.pyi +125 -117
  84. reflex/components/radix/themes/components/aspect_ratio.pyi +17 -17
  85. reflex/components/radix/themes/components/avatar.py +1 -5
  86. reflex/components/radix/themes/components/avatar.pyi +17 -17
  87. reflex/components/radix/themes/components/badge.py +1 -5
  88. reflex/components/radix/themes/components/badge.pyi +17 -17
  89. reflex/components/radix/themes/components/button.pyi +18 -21
  90. reflex/components/radix/themes/components/callout.py +1 -4
  91. reflex/components/radix/themes/components/callout.pyi +81 -81
  92. reflex/components/radix/themes/components/card.py +1 -3
  93. reflex/components/radix/themes/components/card.pyi +17 -17
  94. reflex/components/radix/themes/components/checkbox.py +4 -8
  95. reflex/components/radix/themes/components/checkbox.pyi +61 -52
  96. reflex/components/radix/themes/components/checkbox_cards.pyi +33 -33
  97. reflex/components/radix/themes/components/checkbox_group.pyi +33 -33
  98. reflex/components/radix/themes/components/context_menu.py +121 -28
  99. reflex/components/radix/themes/components/context_menu.pyi +250 -147
  100. reflex/components/radix/themes/components/data_list.pyi +65 -65
  101. reflex/components/radix/themes/components/dialog.py +11 -11
  102. reflex/components/radix/themes/components/dialog.pyi +135 -120
  103. reflex/components/radix/themes/components/dropdown_menu.py +14 -25
  104. reflex/components/radix/themes/components/dropdown_menu.pyi +157 -145
  105. reflex/components/radix/themes/components/hover_card.py +19 -7
  106. reflex/components/radix/themes/components/hover_card.pyi +102 -67
  107. reflex/components/radix/themes/components/icon_button.pyi +18 -21
  108. reflex/components/radix/themes/components/inset.py +1 -3
  109. reflex/components/radix/themes/components/inset.pyi +17 -17
  110. reflex/components/radix/themes/components/popover.py +22 -13
  111. reflex/components/radix/themes/components/popover.pyi +98 -72
  112. reflex/components/radix/themes/components/progress.pyi +17 -17
  113. reflex/components/radix/themes/components/radio.pyi +17 -17
  114. reflex/components/radix/themes/components/radio_cards.py +2 -2
  115. reflex/components/radix/themes/components/radio_cards.pyi +37 -34
  116. reflex/components/radix/themes/components/radio_group.py +3 -7
  117. reflex/components/radix/themes/components/radio_group.pyi +69 -66
  118. reflex/components/radix/themes/components/scroll_area.py +1 -3
  119. reflex/components/radix/themes/components/scroll_area.pyi +17 -17
  120. reflex/components/radix/themes/components/segmented_control.pyi +37 -34
  121. reflex/components/radix/themes/components/select.py +7 -11
  122. reflex/components/radix/themes/components/select.pyi +175 -154
  123. reflex/components/radix/themes/components/separator.py +1 -4
  124. reflex/components/radix/themes/components/separator.pyi +17 -17
  125. reflex/components/radix/themes/components/skeleton.pyi +17 -17
  126. reflex/components/radix/themes/components/slider.py +12 -21
  127. reflex/components/radix/themes/components/slider.pyi +47 -25
  128. reflex/components/radix/themes/components/spinner.py +1 -4
  129. reflex/components/radix/themes/components/spinner.pyi +17 -17
  130. reflex/components/radix/themes/components/switch.py +3 -6
  131. reflex/components/radix/themes/components/switch.pyi +21 -18
  132. reflex/components/radix/themes/components/table.py +21 -5
  133. reflex/components/radix/themes/components/table.pyi +392 -116
  134. reflex/components/radix/themes/components/tabs.py +3 -6
  135. reflex/components/radix/themes/components/tabs.pyi +89 -83
  136. reflex/components/radix/themes/components/text_area.py +1 -5
  137. reflex/components/radix/themes/components/text_area.pyi +43 -20
  138. reflex/components/radix/themes/components/text_field.py +1 -5
  139. reflex/components/radix/themes/components/text_field.pyi +101 -55
  140. reflex/components/radix/themes/components/tooltip.py +5 -7
  141. reflex/components/radix/themes/components/tooltip.pyi +25 -22
  142. reflex/components/radix/themes/layout/base.py +2 -27
  143. reflex/components/radix/themes/layout/base.pyi +82 -82
  144. reflex/components/radix/themes/layout/box.pyi +17 -17
  145. reflex/components/radix/themes/layout/center.pyi +17 -17
  146. reflex/components/radix/themes/layout/container.pyi +17 -17
  147. reflex/components/radix/themes/layout/flex.py +1 -6
  148. reflex/components/radix/themes/layout/flex.pyi +17 -17
  149. reflex/components/radix/themes/layout/grid.py +1 -6
  150. reflex/components/radix/themes/layout/grid.pyi +17 -17
  151. reflex/components/radix/themes/layout/list.py +20 -15
  152. reflex/components/radix/themes/layout/list.pyi +175 -92
  153. reflex/components/radix/themes/layout/section.pyi +17 -17
  154. reflex/components/radix/themes/layout/spacer.pyi +17 -17
  155. reflex/components/radix/themes/layout/stack.py +6 -6
  156. reflex/components/radix/themes/layout/stack.pyi +91 -62
  157. reflex/components/radix/themes/typography/blockquote.py +2 -8
  158. reflex/components/radix/themes/typography/blockquote.pyi +17 -17
  159. reflex/components/radix/themes/typography/code.py +4 -10
  160. reflex/components/radix/themes/typography/code.pyi +19 -18
  161. reflex/components/radix/themes/typography/heading.py +4 -11
  162. reflex/components/radix/themes/typography/heading.pyi +19 -18
  163. reflex/components/radix/themes/typography/link.py +4 -10
  164. reflex/components/radix/themes/typography/link.pyi +19 -18
  165. reflex/components/radix/themes/typography/text.py +4 -11
  166. reflex/components/radix/themes/typography/text.pyi +115 -114
  167. reflex/components/react_player/audio.pyi +58 -33
  168. reflex/components/react_player/react_player.py +17 -17
  169. reflex/components/react_player/react_player.pyi +55 -33
  170. reflex/components/react_player/video.pyi +58 -33
  171. reflex/components/recharts/cartesian.py +45 -45
  172. reflex/components/recharts/cartesian.pyi +389 -304
  173. reflex/components/recharts/charts.py +22 -22
  174. reflex/components/recharts/charts.pyi +226 -179
  175. reflex/components/recharts/general.py +26 -27
  176. reflex/components/recharts/general.pyi +106 -99
  177. reflex/components/recharts/polar.py +33 -33
  178. reflex/components/recharts/polar.pyi +70 -64
  179. reflex/components/recharts/recharts.pyi +33 -33
  180. reflex/components/sonner/toast.py +9 -36
  181. reflex/components/sonner/toast.pyi +20 -24
  182. reflex/components/suneditor/editor.py +8 -8
  183. reflex/components/suneditor/editor.pyi +50 -25
  184. reflex/components/tags/iter_tag.py +1 -10
  185. reflex/components/tags/tag.py +1 -4
  186. reflex/config.py +198 -35
  187. reflex/constants/__init__.py +4 -16
  188. reflex/constants/base.py +7 -14
  189. reflex/constants/colors.py +0 -1
  190. reflex/constants/installer.py +12 -7
  191. reflex/constants/state.py +4 -0
  192. reflex/custom_components/custom_components.py +6 -6
  193. reflex/event.py +486 -241
  194. reflex/experimental/client_state.py +9 -9
  195. reflex/experimental/layout.py +2 -2
  196. reflex/experimental/layout.pyi +95 -87
  197. reflex/experimental/misc.py +1 -1
  198. reflex/istate/__init__.py +1 -0
  199. reflex/istate/proxy.py +33 -0
  200. reflex/istate/wrappers.py +27 -0
  201. reflex/model.py +7 -7
  202. reflex/page.py +2 -1
  203. reflex/reflex.py +142 -8
  204. reflex/state.py +133 -46
  205. reflex/testing.py +9 -7
  206. reflex/utils/console.py +0 -1
  207. reflex/utils/exceptions.py +31 -3
  208. reflex/utils/exec.py +33 -14
  209. reflex/utils/format.py +15 -12
  210. reflex/utils/net.py +1 -1
  211. reflex/utils/path_ops.py +2 -2
  212. reflex/utils/prerequisites.py +82 -46
  213. reflex/utils/pyi_generator.py +63 -20
  214. reflex/utils/registry.py +1 -1
  215. reflex/utils/serializers.py +75 -36
  216. reflex/utils/telemetry.py +3 -2
  217. reflex/utils/types.py +125 -10
  218. reflex/vars/base.py +131 -119
  219. reflex/vars/function.py +59 -12
  220. reflex/vars/number.py +3 -1
  221. reflex/vars/object.py +30 -24
  222. reflex/vars/sequence.py +7 -7
  223. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/METADATA +3 -3
  224. reflex-0.6.5.dist-info/RECORD +394 -0
  225. reflex-0.6.4a3.dist-info/RECORD +0 -391
  226. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/LICENSE +0 -0
  227. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/WHEEL +0 -0
  228. {reflex-0.6.4a3.dist-info → reflex-0.6.5.dist-info}/entry_points.txt +0 -0
@@ -10,7 +10,7 @@ from typing_extensions import TypedDict
10
10
  from reflex.base import Base
11
11
  from reflex.components.component import Component, NoSSRComponent
12
12
  from reflex.components.literals import LiteralRowMarker
13
- from reflex.event import EventHandler, empty_event, identity_event
13
+ from reflex.event import EventHandler, no_args_event_spec, passthrough_event_spec
14
14
  from reflex.utils import console, format, types
15
15
  from reflex.utils.imports import ImportDict, ImportVar
16
16
  from reflex.utils.serializers import serializer
@@ -189,7 +189,6 @@ class DataEditor(NoSSRComponent):
189
189
  library: str = "@glideapps/glide-data-grid@^6.0.3"
190
190
  lib_dependencies: List[str] = [
191
191
  "lodash@^4.17.21",
192
- "marked@^14.1.2",
193
192
  "react-responsive-carousel@^3.2.7",
194
193
  ]
195
194
 
@@ -206,7 +205,7 @@ class DataEditor(NoSSRComponent):
206
205
  get_cell_content: Var[str]
207
206
 
208
207
  # Allow selection for copying.
209
- get_cell_for_selection: Var[bool]
208
+ get_cells_for_selection: Var[bool]
210
209
 
211
210
  # Allow paste.
212
211
  on_paste: Var[bool]
@@ -284,56 +283,58 @@ class DataEditor(NoSSRComponent):
284
283
  theme: Var[Union[DataEditorTheme, Dict]]
285
284
 
286
285
  # Fired when a cell is activated.
287
- on_cell_activated: EventHandler[identity_event(Tuple[int, int])]
286
+ on_cell_activated: EventHandler[passthrough_event_spec(Tuple[int, int])]
288
287
 
289
288
  # Fired when a cell is clicked.
290
- on_cell_clicked: EventHandler[identity_event(Tuple[int, int])]
289
+ on_cell_clicked: EventHandler[passthrough_event_spec(Tuple[int, int])]
291
290
 
292
291
  # Fired when a cell is right-clicked.
293
- on_cell_context_menu: EventHandler[identity_event(Tuple[int, int])]
292
+ on_cell_context_menu: EventHandler[passthrough_event_spec(Tuple[int, int])]
294
293
 
295
294
  # Fired when a cell is edited.
296
- on_cell_edited: EventHandler[identity_event(Tuple[int, int], GridCell)]
295
+ on_cell_edited: EventHandler[passthrough_event_spec(Tuple[int, int], GridCell)]
297
296
 
298
297
  # Fired when a group header is clicked.
299
- on_group_header_clicked: EventHandler[identity_event(Tuple[int, int], GridCell)]
298
+ on_group_header_clicked: EventHandler[
299
+ passthrough_event_spec(Tuple[int, int], GridCell)
300
+ ]
300
301
 
301
302
  # Fired when a group header is right-clicked.
302
303
  on_group_header_context_menu: EventHandler[
303
- identity_event(int, GroupHeaderClickedEventArgs)
304
+ passthrough_event_spec(int, GroupHeaderClickedEventArgs)
304
305
  ]
305
306
 
306
307
  # Fired when a group header is renamed.
307
- on_group_header_renamed: EventHandler[identity_event(str, str)]
308
+ on_group_header_renamed: EventHandler[passthrough_event_spec(str, str)]
308
309
 
309
310
  # Fired when a header is clicked.
310
- on_header_clicked: EventHandler[identity_event(Tuple[int, int])]
311
+ on_header_clicked: EventHandler[passthrough_event_spec(Tuple[int, int])]
311
312
 
312
313
  # Fired when a header is right-clicked.
313
- on_header_context_menu: EventHandler[identity_event(Tuple[int, int])]
314
+ on_header_context_menu: EventHandler[passthrough_event_spec(Tuple[int, int])]
314
315
 
315
316
  # Fired when a header menu item is clicked.
316
- on_header_menu_click: EventHandler[identity_event(int, Rectangle)]
317
+ on_header_menu_click: EventHandler[passthrough_event_spec(int, Rectangle)]
317
318
 
318
319
  # Fired when an item is hovered.
319
- on_item_hovered: EventHandler[identity_event(Tuple[int, int])]
320
+ on_item_hovered: EventHandler[passthrough_event_spec(Tuple[int, int])]
320
321
 
321
322
  # Fired when a selection is deleted.
322
- on_delete: EventHandler[identity_event(GridSelection)]
323
+ on_delete: EventHandler[passthrough_event_spec(GridSelection)]
323
324
 
324
325
  # Fired when editing is finished.
325
326
  on_finished_editing: EventHandler[
326
- identity_event(Union[GridCell, None], tuple[int, int])
327
+ passthrough_event_spec(Union[GridCell, None], tuple[int, int])
327
328
  ]
328
329
 
329
330
  # Fired when a row is appended.
330
- on_row_appended: EventHandler[empty_event]
331
+ on_row_appended: EventHandler[no_args_event_spec]
331
332
 
332
333
  # Fired when the selection is cleared.
333
- on_selection_cleared: EventHandler[empty_event]
334
+ on_selection_cleared: EventHandler[no_args_event_spec]
334
335
 
335
336
  # Fired when a column is resized.
336
- on_column_resize: EventHandler[identity_event(GridColumn, int)]
337
+ on_column_resize: EventHandler[passthrough_event_spec(GridColumn, int)]
337
338
 
338
339
  def add_imports(self) -> ImportDict:
339
340
  """Add imports for the component.
@@ -424,7 +425,7 @@ class DataEditor(NoSSRComponent):
424
425
  props["theme"] = DataEditorTheme(**theme)
425
426
 
426
427
  # Allow by default to select a region of cells in the grid.
427
- props.setdefault("get_cell_for_selection", True)
428
+ props.setdefault("get_cells_for_selection", True)
428
429
 
429
430
  # Disable on_paste by default if not provided.
430
431
  props.setdefault("on_paste", False)
@@ -10,7 +10,7 @@ from typing_extensions import TypedDict
10
10
 
11
11
  from reflex.base import Base
12
12
  from reflex.components.component import NoSSRComponent
13
- from reflex.event import EventType
13
+ from reflex.event import BASE_STATE, EventType
14
14
  from reflex.style import Style
15
15
  from reflex.utils.imports import ImportDict
16
16
  from reflex.utils.serializers import serializer
@@ -140,7 +140,7 @@ class DataEditor(NoSSRComponent):
140
140
  ] = None,
141
141
  data: Optional[Union[List[List[Any]], Var[List[List[Any]]]]] = None,
142
142
  get_cell_content: Optional[Union[Var[str], str]] = None,
143
- get_cell_for_selection: Optional[Union[Var[bool], bool]] = None,
143
+ get_cells_for_selection: Optional[Union[Var[bool], bool]] = None,
144
144
  on_paste: Optional[Union[Var[bool], bool]] = None,
145
145
  draw_focus_ring: Optional[Union[Var[bool], bool]] = None,
146
146
  fixed_shadow_x: Optional[Union[Var[bool], bool]] = None,
@@ -182,42 +182,94 @@ class DataEditor(NoSSRComponent):
182
182
  id: Optional[Any] = None,
183
183
  class_name: Optional[Any] = None,
184
184
  autofocus: Optional[bool] = None,
185
- custom_attrs: Optional[Dict[str, Union[Var, str]]] = None,
186
- on_blur: Optional[EventType[[]]] = None,
187
- on_cell_activated: Optional[EventType[tuple[int, int]]] = None,
188
- on_cell_clicked: Optional[EventType[tuple[int, int]]] = None,
189
- on_cell_context_menu: Optional[EventType[tuple[int, int]]] = None,
190
- on_cell_edited: Optional[EventType[tuple[int, int], GridCell]] = None,
191
- on_click: Optional[EventType[[]]] = None,
192
- on_column_resize: Optional[EventType[GridColumn, int]] = None,
193
- on_context_menu: Optional[EventType[[]]] = None,
194
- on_delete: Optional[EventType[GridSelection]] = None,
195
- on_double_click: Optional[EventType[[]]] = None,
185
+ custom_attrs: Optional[Dict[str, Union[Var, Any]]] = None,
186
+ on_blur: Optional[EventType[[], BASE_STATE]] = None,
187
+ on_cell_activated: Optional[
188
+ Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]]
189
+ ] = None,
190
+ on_cell_clicked: Optional[
191
+ Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]]
192
+ ] = None,
193
+ on_cell_context_menu: Optional[
194
+ Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]]
195
+ ] = None,
196
+ on_cell_edited: Optional[
197
+ Union[
198
+ EventType[[], BASE_STATE],
199
+ EventType[[tuple[int, int]], BASE_STATE],
200
+ EventType[[tuple[int, int], GridCell], BASE_STATE],
201
+ ]
202
+ ] = None,
203
+ on_click: Optional[EventType[[], BASE_STATE]] = None,
204
+ on_column_resize: Optional[
205
+ Union[
206
+ EventType[[], BASE_STATE],
207
+ EventType[[GridColumn], BASE_STATE],
208
+ EventType[[GridColumn, int], BASE_STATE],
209
+ ]
210
+ ] = None,
211
+ on_context_menu: Optional[EventType[[], BASE_STATE]] = None,
212
+ on_delete: Optional[
213
+ Union[EventType[[], BASE_STATE], EventType[[GridSelection], BASE_STATE]]
214
+ ] = None,
215
+ on_double_click: Optional[EventType[[], BASE_STATE]] = None,
196
216
  on_finished_editing: Optional[
197
- EventType[Union[GridCell, None], tuple[int, int]]
217
+ Union[
218
+ EventType[[], BASE_STATE],
219
+ EventType[[Union[GridCell, None]], BASE_STATE],
220
+ EventType[[Union[GridCell, None], tuple[int, int]], BASE_STATE],
221
+ ]
222
+ ] = None,
223
+ on_focus: Optional[EventType[[], BASE_STATE]] = None,
224
+ on_group_header_clicked: Optional[
225
+ Union[
226
+ EventType[[], BASE_STATE],
227
+ EventType[[tuple[int, int]], BASE_STATE],
228
+ EventType[[tuple[int, int], GridCell], BASE_STATE],
229
+ ]
198
230
  ] = None,
199
- on_focus: Optional[EventType[[]]] = None,
200
- on_group_header_clicked: Optional[EventType[tuple[int, int], GridCell]] = None,
201
231
  on_group_header_context_menu: Optional[
202
- EventType[int, GroupHeaderClickedEventArgs]
232
+ Union[
233
+ EventType[[], BASE_STATE],
234
+ EventType[[int], BASE_STATE],
235
+ EventType[[int, GroupHeaderClickedEventArgs], BASE_STATE],
236
+ ]
237
+ ] = None,
238
+ on_group_header_renamed: Optional[
239
+ Union[
240
+ EventType[[], BASE_STATE],
241
+ EventType[[str], BASE_STATE],
242
+ EventType[[str, str], BASE_STATE],
243
+ ]
244
+ ] = None,
245
+ on_header_clicked: Optional[
246
+ Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]]
247
+ ] = None,
248
+ on_header_context_menu: Optional[
249
+ Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]]
250
+ ] = None,
251
+ on_header_menu_click: Optional[
252
+ Union[
253
+ EventType[[], BASE_STATE],
254
+ EventType[[int], BASE_STATE],
255
+ EventType[[int, Rectangle], BASE_STATE],
256
+ ]
257
+ ] = None,
258
+ on_item_hovered: Optional[
259
+ Union[EventType[[], BASE_STATE], EventType[[tuple[int, int]], BASE_STATE]]
203
260
  ] = None,
204
- on_group_header_renamed: Optional[EventType[str, str]] = None,
205
- on_header_clicked: Optional[EventType[tuple[int, int]]] = None,
206
- on_header_context_menu: Optional[EventType[tuple[int, int]]] = None,
207
- on_header_menu_click: Optional[EventType[int, Rectangle]] = None,
208
- on_item_hovered: Optional[EventType[tuple[int, int]]] = None,
209
- on_mount: Optional[EventType[[]]] = None,
210
- on_mouse_down: Optional[EventType[[]]] = None,
211
- on_mouse_enter: Optional[EventType[[]]] = None,
212
- on_mouse_leave: Optional[EventType[[]]] = None,
213
- on_mouse_move: Optional[EventType[[]]] = None,
214
- on_mouse_out: Optional[EventType[[]]] = None,
215
- on_mouse_over: Optional[EventType[[]]] = None,
216
- on_mouse_up: Optional[EventType[[]]] = None,
217
- on_row_appended: Optional[EventType[[]]] = None,
218
- on_scroll: Optional[EventType[[]]] = None,
219
- on_selection_cleared: Optional[EventType[[]]] = None,
220
- on_unmount: Optional[EventType[[]]] = None,
261
+ on_mount: Optional[EventType[[], BASE_STATE]] = None,
262
+ on_mouse_down: Optional[EventType[[], BASE_STATE]] = None,
263
+ on_mouse_enter: Optional[EventType[[], BASE_STATE]] = None,
264
+ on_mouse_leave: Optional[EventType[[], BASE_STATE]] = None,
265
+ on_mouse_move: Optional[EventType[[], BASE_STATE]] = None,
266
+ on_mouse_out: Optional[EventType[[], BASE_STATE]] = None,
267
+ on_mouse_over: Optional[EventType[[], BASE_STATE]] = None,
268
+ on_mouse_up: Optional[EventType[[], BASE_STATE]] = None,
269
+ on_row_appended: Optional[EventType[[], BASE_STATE]] = None,
270
+ on_scroll: Optional[EventType[[], BASE_STATE]] = None,
271
+ on_selection_cleared: Optional[EventType[[], BASE_STATE]] = None,
272
+ on_unmount: Optional[EventType[[], BASE_STATE]] = None,
221
273
  **props,
222
274
  ) -> "DataEditor":
223
275
  """Create the DataEditor component.
@@ -228,7 +280,7 @@ class DataEditor(NoSSRComponent):
228
280
  columns: Headers of the columns for the data grid.
229
281
  data: The data.
230
282
  get_cell_content: The name of the callback used to find the data to display.
231
- get_cell_for_selection: Allow selection for copying.
283
+ get_cells_for_selection: Allow selection for copying.
232
284
  on_paste: Allow paste.
233
285
  draw_focus_ring: Controls the drawing of the focus ring.
234
286
  fixed_shadow_x: Enables or disables the overlay shadow when scrolling horizontally.
@@ -253,6 +305,22 @@ class DataEditor(NoSSRComponent):
253
305
  scroll_offset_x: Initial scroll offset on the horizontal axis.
254
306
  scroll_offset_y: Initial scroll offset on the vertical axis.
255
307
  theme: global theme
308
+ on_cell_activated: Fired when a cell is activated.
309
+ on_cell_clicked: Fired when a cell is clicked.
310
+ on_cell_context_menu: Fired when a cell is right-clicked.
311
+ on_cell_edited: Fired when a cell is edited.
312
+ on_group_header_clicked: Fired when a group header is clicked.
313
+ on_group_header_context_menu: Fired when a group header is right-clicked.
314
+ on_group_header_renamed: Fired when a group header is renamed.
315
+ on_header_clicked: Fired when a header is clicked.
316
+ on_header_context_menu: Fired when a header is right-clicked.
317
+ on_header_menu_click: Fired when a header menu item is clicked.
318
+ on_item_hovered: Fired when an item is hovered.
319
+ on_delete: Fired when a selection is deleted.
320
+ on_finished_editing: Fired when editing is finished.
321
+ on_row_appended: Fired when a row is appended.
322
+ on_selection_cleared: Fired when the selection is cleared.
323
+ on_column_resize: Fired when a column is resized.
256
324
  style: The style of the component.
257
325
  key: A unique key for the component.
258
326
  id: The id for the component.
@@ -12,8 +12,10 @@ from reflex.components.core.colors import color
12
12
  from reflex.components.core.cond import color_mode_cond
13
13
  from reflex.components.el.elements.forms import Button
14
14
  from reflex.components.lucide.icon import Icon
15
+ from reflex.components.markdown.markdown import MarkdownComponentMap
16
+ from reflex.components.props import NoExtrasAllowedProps
15
17
  from reflex.components.radix.themes.layout.box import Box
16
- from reflex.event import call_script, set_clipboard
18
+ from reflex.event import run_script, set_clipboard
17
19
  from reflex.style import Style
18
20
  from reflex.utils.exceptions import VarTypeError
19
21
  from reflex.utils.imports import ImportVar
@@ -25,49 +27,48 @@ from reflex.vars.sequence import StringVar, string_replace_operation
25
27
  def copy_script() -> Any:
26
28
  """Copy script for the code block and modify the child SVG element.
27
29
 
28
-
29
30
  Returns:
30
31
  Any: The result of calling the script.
31
32
  """
32
- return call_script(
33
- f"""
33
+ return run_script(
34
+ """
34
35
  // Event listener for the parent click
35
- document.addEventListener('click', function(event) {{
36
- // Find the closest div (parent element)
37
- const parent = event.target.closest('div');
36
+ document.addEventListener('click', function(event) {
37
+ // Find the closest button (parent element)
38
+ const parent = event.target.closest('button');
38
39
  // If the parent is found
39
- if (parent) {{
40
+ if (parent) {
40
41
  // Find the SVG element within the parent
41
42
  const svgIcon = parent.querySelector('svg');
42
43
  // If the SVG exists, proceed with the script
43
- if (svgIcon) {{
44
+ if (svgIcon) {
44
45
  const originalPath = svgIcon.innerHTML;
45
46
  const checkmarkPath = '<polyline points="20 6 9 17 4 12"></polyline>'; // Checkmark SVG path
46
- function transition(element, scale, opacity) {{
47
- element.style.transform = `scale(${{scale}})`;
47
+ function transition(element, scale, opacity) {
48
+ element.style.transform = `scale(${scale})`;
48
49
  element.style.opacity = opacity;
49
- }}
50
+ }
50
51
  // Animate the SVG
51
52
  transition(svgIcon, 0, '0');
52
- setTimeout(() => {{
53
+ setTimeout(() => {
53
54
  svgIcon.innerHTML = checkmarkPath; // Replace content with checkmark
54
55
  svgIcon.setAttribute('viewBox', '0 0 24 24'); // Adjust viewBox if necessary
55
56
  transition(svgIcon, 1, '1');
56
- setTimeout(() => {{
57
+ setTimeout(() => {
57
58
  transition(svgIcon, 0, '0');
58
- setTimeout(() => {{
59
+ setTimeout(() => {
59
60
  svgIcon.innerHTML = originalPath; // Restore original SVG content
60
61
  transition(svgIcon, 1, '1');
61
- }}, 125);
62
- }}, 600);
63
- }}, 125);
64
- }} else {{
62
+ }, 125);
63
+ }, 600);
64
+ }, 125);
65
+ } else {
65
66
  // console.error('SVG element not found within the parent.');
66
- }}
67
- }} else {{
67
+ }
68
+ } else {
68
69
  // console.error('Parent element not found.');
69
- }}
70
- }});
70
+ }
71
+ })
71
72
  """
72
73
  )
73
74
 
@@ -253,6 +254,7 @@ LiteralCodeLanguage = Literal[
253
254
  "pascal",
254
255
  "perl",
255
256
  "php",
257
+ "plain",
256
258
  "plsql",
257
259
  "po",
258
260
  "postcss",
@@ -369,10 +371,11 @@ LiteralCodeTheme = Literal[
369
371
  "nord",
370
372
  "one-dark-pro",
371
373
  "one-light",
372
- "plain",
373
374
  "plastic",
374
375
  "poimandres",
375
376
  "red",
377
+ # rose-pine themes dont work with the current version of shikijs transformers
378
+ # https://github.com/shikijs/shiki/issues/730
376
379
  "rose-pine",
377
380
  "rose-pine-dawn",
378
381
  "rose-pine-moon",
@@ -390,6 +393,23 @@ LiteralCodeTheme = Literal[
390
393
  ]
391
394
 
392
395
 
396
+ class Position(NoExtrasAllowedProps):
397
+ """Position of the decoration."""
398
+
399
+ line: int
400
+ character: int
401
+
402
+
403
+ class ShikiDecorations(NoExtrasAllowedProps):
404
+ """Decorations for the code block."""
405
+
406
+ start: Union[int, Position]
407
+ end: Union[int, Position]
408
+ tag_name: str = "span"
409
+ properties: dict[str, Any] = {}
410
+ always_wrap: bool = False
411
+
412
+
393
413
  class ShikiBaseTransformers(Base):
394
414
  """Base for creating transformers."""
395
415
 
@@ -509,7 +529,7 @@ class ShikiJsTransformer(ShikiBaseTransformers):
509
529
  super().__init__(**kwargs)
510
530
 
511
531
 
512
- class ShikiCodeBlock(Component):
532
+ class ShikiCodeBlock(Component, MarkdownComponentMap):
513
533
  """A Code block."""
514
534
 
515
535
  library = "/components/shiki/code"
@@ -537,6 +557,9 @@ class ShikiCodeBlock(Component):
537
557
  []
538
558
  )
539
559
 
560
+ # The decorations to use for the syntax highlighter.
561
+ decorations: Var[list[ShikiDecorations]] = Var.create([])
562
+
540
563
  @classmethod
541
564
  def create(
542
565
  cls,
@@ -555,6 +578,7 @@ class ShikiCodeBlock(Component):
555
578
  # Separate props for the code block and the wrapper
556
579
  code_block_props = {}
557
580
  code_wrapper_props = {}
581
+ decorations = props.pop("decorations", [])
558
582
 
559
583
  class_props = cls.get_props()
560
584
 
@@ -564,6 +588,15 @@ class ShikiCodeBlock(Component):
564
588
  value
565
589
  )
566
590
 
591
+ # cast decorations into ShikiDecorations.
592
+ decorations = [
593
+ ShikiDecorations(**decoration)
594
+ if not isinstance(decoration, ShikiDecorations)
595
+ else decoration
596
+ for decoration in decorations
597
+ ]
598
+ code_block_props["decorations"] = decorations
599
+
567
600
  code_block_props["code"] = children[0]
568
601
  code_block = super().create(**code_block_props)
569
602
 
@@ -676,10 +709,10 @@ class ShikiHighLevelCodeBlock(ShikiCodeBlock):
676
709
  show_line_numbers: Var[bool]
677
710
 
678
711
  # Whether a copy button should appear.
679
- can_copy: Var[bool] = Var.create(False)
712
+ can_copy: bool = False
680
713
 
681
714
  # copy_button: A custom copy button to override the default one.
682
- copy_button: Var[Optional[Union[Component, bool]]] = Var.create(None)
715
+ copy_button: Optional[Union[Component, bool]] = None
683
716
 
684
717
  @classmethod
685
718
  def create(