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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (228) hide show
  1. reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -14
  2. reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -8
  3. reflex/.templates/web/components/shiki/code.js +16 -11
  4. reflex/.templates/web/utils/state.js +29 -21
  5. reflex/__init__.py +4 -0
  6. reflex/__init__.pyi +4 -0
  7. reflex/app.py +148 -154
  8. reflex/app_mixins/lifespan.py +5 -1
  9. reflex/app_mixins/middleware.py +3 -1
  10. reflex/app_mixins/mixin.py +3 -2
  11. reflex/base.py +2 -4
  12. reflex/compiler/compiler.py +111 -37
  13. reflex/components/base/app_wrap.pyi +17 -17
  14. reflex/components/base/bare.py +72 -3
  15. reflex/components/base/body.pyi +17 -17
  16. reflex/components/base/document.pyi +81 -81
  17. reflex/components/base/error_boundary.pyi +25 -18
  18. reflex/components/base/fragment.pyi +17 -17
  19. reflex/components/base/head.pyi +33 -33
  20. reflex/components/base/link.pyi +33 -33
  21. reflex/components/base/meta.pyi +65 -65
  22. reflex/components/base/script.py +4 -4
  23. reflex/components/base/script.pyi +23 -20
  24. reflex/components/component.py +250 -31
  25. reflex/components/core/banner.py +1 -1
  26. reflex/components/core/banner.pyi +81 -81
  27. reflex/components/core/client_side_routing.pyi +33 -33
  28. reflex/components/core/clipboard.py +2 -2
  29. reflex/components/core/clipboard.pyi +24 -18
  30. reflex/components/core/debounce.py +2 -2
  31. reflex/components/core/debounce.pyi +18 -18
  32. reflex/components/core/html.pyi +17 -17
  33. reflex/components/core/upload.py +82 -28
  34. reflex/components/core/upload.pyi +77 -72
  35. reflex/components/datadisplay/code.py +55 -40
  36. reflex/components/datadisplay/code.pyi +46 -44
  37. reflex/components/datadisplay/dataeditor.py +21 -20
  38. reflex/components/datadisplay/dataeditor.pyi +103 -35
  39. reflex/components/datadisplay/shiki_code_block.py +60 -27
  40. reflex/components/datadisplay/shiki_code_block.pyi +86 -65
  41. reflex/components/dynamic.py +9 -5
  42. reflex/components/el/element.pyi +17 -17
  43. reflex/components/el/elements/base.pyi +17 -17
  44. reflex/components/el/elements/forms.py +12 -3
  45. reflex/components/el/elements/forms.pyi +293 -233
  46. reflex/components/el/elements/inline.pyi +449 -449
  47. reflex/components/el/elements/media.pyi +401 -401
  48. reflex/components/el/elements/metadata.pyi +97 -97
  49. reflex/components/el/elements/other.pyi +113 -113
  50. reflex/components/el/elements/scripts.pyi +49 -49
  51. reflex/components/el/elements/sectioning.pyi +241 -241
  52. reflex/components/el/elements/tables.pyi +161 -161
  53. reflex/components/el/elements/typography.pyi +241 -241
  54. reflex/components/gridjs/datatable.pyi +33 -33
  55. reflex/components/lucide/icon.py +1 -1
  56. reflex/components/lucide/icon.pyi +33 -33
  57. reflex/components/markdown/markdown.py +180 -49
  58. reflex/components/markdown/markdown.pyi +36 -19
  59. reflex/components/moment/moment.py +17 -21
  60. reflex/components/moment/moment.pyi +26 -21
  61. reflex/components/next/base.pyi +17 -17
  62. reflex/components/next/image.py +3 -3
  63. reflex/components/next/image.pyi +21 -19
  64. reflex/components/next/link.pyi +17 -17
  65. reflex/components/next/video.pyi +17 -17
  66. reflex/components/plotly/plotly.py +79 -78
  67. reflex/components/plotly/plotly.pyi +91 -41
  68. reflex/components/props.py +34 -0
  69. reflex/components/radix/primitives/accordion.py +15 -8
  70. reflex/components/radix/primitives/accordion.pyi +121 -118
  71. reflex/components/radix/primitives/base.pyi +33 -33
  72. reflex/components/radix/primitives/drawer.py +41 -20
  73. reflex/components/radix/primitives/drawer.pyi +279 -190
  74. reflex/components/radix/primitives/form.py +2 -2
  75. reflex/components/radix/primitives/form.pyi +200 -167
  76. reflex/components/radix/primitives/progress.pyi +81 -81
  77. reflex/components/radix/primitives/slider.pyi +89 -83
  78. reflex/components/radix/themes/base.py +27 -1
  79. reflex/components/radix/themes/base.pyi +286 -113
  80. reflex/components/radix/themes/color_mode.py +17 -9
  81. reflex/components/radix/themes/color_mode.pyi +68 -56
  82. reflex/components/radix/themes/components/alert_dialog.py +8 -5
  83. reflex/components/radix/themes/components/alert_dialog.pyi +125 -117
  84. reflex/components/radix/themes/components/aspect_ratio.pyi +17 -17
  85. reflex/components/radix/themes/components/avatar.py +1 -5
  86. reflex/components/radix/themes/components/avatar.pyi +17 -17
  87. reflex/components/radix/themes/components/badge.py +1 -5
  88. reflex/components/radix/themes/components/badge.pyi +17 -17
  89. reflex/components/radix/themes/components/button.pyi +18 -21
  90. reflex/components/radix/themes/components/callout.py +1 -4
  91. reflex/components/radix/themes/components/callout.pyi +81 -81
  92. reflex/components/radix/themes/components/card.py +1 -3
  93. reflex/components/radix/themes/components/card.pyi +17 -17
  94. reflex/components/radix/themes/components/checkbox.py +4 -8
  95. reflex/components/radix/themes/components/checkbox.pyi +61 -52
  96. reflex/components/radix/themes/components/checkbox_cards.pyi +33 -33
  97. reflex/components/radix/themes/components/checkbox_group.pyi +33 -33
  98. reflex/components/radix/themes/components/context_menu.py +121 -28
  99. reflex/components/radix/themes/components/context_menu.pyi +250 -147
  100. reflex/components/radix/themes/components/data_list.pyi +65 -65
  101. reflex/components/radix/themes/components/dialog.py +11 -11
  102. reflex/components/radix/themes/components/dialog.pyi +135 -120
  103. reflex/components/radix/themes/components/dropdown_menu.py +14 -25
  104. reflex/components/radix/themes/components/dropdown_menu.pyi +157 -145
  105. reflex/components/radix/themes/components/hover_card.py +19 -7
  106. reflex/components/radix/themes/components/hover_card.pyi +102 -67
  107. reflex/components/radix/themes/components/icon_button.pyi +18 -21
  108. reflex/components/radix/themes/components/inset.py +1 -3
  109. reflex/components/radix/themes/components/inset.pyi +17 -17
  110. reflex/components/radix/themes/components/popover.py +22 -13
  111. reflex/components/radix/themes/components/popover.pyi +98 -72
  112. reflex/components/radix/themes/components/progress.pyi +17 -17
  113. reflex/components/radix/themes/components/radio.pyi +17 -17
  114. reflex/components/radix/themes/components/radio_cards.py +2 -2
  115. reflex/components/radix/themes/components/radio_cards.pyi +37 -34
  116. reflex/components/radix/themes/components/radio_group.py +3 -7
  117. reflex/components/radix/themes/components/radio_group.pyi +69 -66
  118. reflex/components/radix/themes/components/scroll_area.py +1 -3
  119. reflex/components/radix/themes/components/scroll_area.pyi +17 -17
  120. reflex/components/radix/themes/components/segmented_control.pyi +37 -34
  121. reflex/components/radix/themes/components/select.py +7 -11
  122. reflex/components/radix/themes/components/select.pyi +175 -154
  123. reflex/components/radix/themes/components/separator.py +1 -4
  124. reflex/components/radix/themes/components/separator.pyi +17 -17
  125. reflex/components/radix/themes/components/skeleton.pyi +17 -17
  126. reflex/components/radix/themes/components/slider.py +12 -21
  127. reflex/components/radix/themes/components/slider.pyi +47 -25
  128. reflex/components/radix/themes/components/spinner.py +1 -4
  129. reflex/components/radix/themes/components/spinner.pyi +17 -17
  130. reflex/components/radix/themes/components/switch.py +3 -6
  131. reflex/components/radix/themes/components/switch.pyi +21 -18
  132. reflex/components/radix/themes/components/table.py +21 -5
  133. reflex/components/radix/themes/components/table.pyi +392 -116
  134. reflex/components/radix/themes/components/tabs.py +3 -6
  135. reflex/components/radix/themes/components/tabs.pyi +89 -83
  136. reflex/components/radix/themes/components/text_area.py +1 -5
  137. reflex/components/radix/themes/components/text_area.pyi +43 -20
  138. reflex/components/radix/themes/components/text_field.py +1 -5
  139. reflex/components/radix/themes/components/text_field.pyi +101 -55
  140. reflex/components/radix/themes/components/tooltip.py +5 -7
  141. reflex/components/radix/themes/components/tooltip.pyi +25 -22
  142. reflex/components/radix/themes/layout/base.py +2 -27
  143. reflex/components/radix/themes/layout/base.pyi +82 -82
  144. reflex/components/radix/themes/layout/box.pyi +17 -17
  145. reflex/components/radix/themes/layout/center.pyi +17 -17
  146. reflex/components/radix/themes/layout/container.pyi +17 -17
  147. reflex/components/radix/themes/layout/flex.py +1 -6
  148. reflex/components/radix/themes/layout/flex.pyi +17 -17
  149. reflex/components/radix/themes/layout/grid.py +1 -6
  150. reflex/components/radix/themes/layout/grid.pyi +17 -17
  151. reflex/components/radix/themes/layout/list.py +20 -15
  152. reflex/components/radix/themes/layout/list.pyi +175 -92
  153. reflex/components/radix/themes/layout/section.pyi +17 -17
  154. reflex/components/radix/themes/layout/spacer.pyi +17 -17
  155. reflex/components/radix/themes/layout/stack.py +6 -6
  156. reflex/components/radix/themes/layout/stack.pyi +91 -62
  157. reflex/components/radix/themes/typography/blockquote.py +2 -8
  158. reflex/components/radix/themes/typography/blockquote.pyi +17 -17
  159. reflex/components/radix/themes/typography/code.py +4 -10
  160. reflex/components/radix/themes/typography/code.pyi +19 -18
  161. reflex/components/radix/themes/typography/heading.py +4 -11
  162. reflex/components/radix/themes/typography/heading.pyi +19 -18
  163. reflex/components/radix/themes/typography/link.py +4 -10
  164. reflex/components/radix/themes/typography/link.pyi +19 -18
  165. reflex/components/radix/themes/typography/text.py +4 -11
  166. reflex/components/radix/themes/typography/text.pyi +115 -114
  167. reflex/components/react_player/audio.pyi +58 -33
  168. reflex/components/react_player/react_player.py +17 -17
  169. reflex/components/react_player/react_player.pyi +55 -33
  170. reflex/components/react_player/video.pyi +58 -33
  171. reflex/components/recharts/cartesian.py +45 -45
  172. reflex/components/recharts/cartesian.pyi +389 -304
  173. reflex/components/recharts/charts.py +22 -22
  174. reflex/components/recharts/charts.pyi +226 -179
  175. reflex/components/recharts/general.py +26 -27
  176. reflex/components/recharts/general.pyi +106 -99
  177. reflex/components/recharts/polar.py +33 -33
  178. reflex/components/recharts/polar.pyi +70 -64
  179. reflex/components/recharts/recharts.pyi +33 -33
  180. reflex/components/sonner/toast.py +9 -36
  181. reflex/components/sonner/toast.pyi +20 -24
  182. reflex/components/suneditor/editor.py +8 -8
  183. reflex/components/suneditor/editor.pyi +50 -25
  184. reflex/components/tags/iter_tag.py +1 -10
  185. reflex/components/tags/tag.py +1 -4
  186. reflex/config.py +198 -35
  187. reflex/constants/__init__.py +4 -16
  188. reflex/constants/base.py +7 -14
  189. reflex/constants/colors.py +0 -1
  190. reflex/constants/installer.py +12 -7
  191. reflex/constants/state.py +4 -0
  192. reflex/custom_components/custom_components.py +6 -6
  193. reflex/event.py +486 -241
  194. reflex/experimental/client_state.py +9 -9
  195. reflex/experimental/layout.py +2 -2
  196. reflex/experimental/layout.pyi +95 -87
  197. reflex/experimental/misc.py +1 -1
  198. reflex/istate/__init__.py +1 -0
  199. reflex/istate/proxy.py +33 -0
  200. reflex/istate/wrappers.py +27 -0
  201. reflex/model.py +7 -7
  202. reflex/page.py +2 -1
  203. reflex/reflex.py +142 -8
  204. reflex/state.py +127 -46
  205. reflex/testing.py +9 -7
  206. reflex/utils/console.py +0 -1
  207. reflex/utils/exceptions.py +31 -3
  208. reflex/utils/exec.py +33 -14
  209. reflex/utils/format.py +15 -12
  210. reflex/utils/net.py +1 -1
  211. reflex/utils/path_ops.py +2 -2
  212. reflex/utils/prerequisites.py +82 -46
  213. reflex/utils/pyi_generator.py +63 -20
  214. reflex/utils/registry.py +1 -1
  215. reflex/utils/serializers.py +75 -36
  216. reflex/utils/telemetry.py +3 -2
  217. reflex/utils/types.py +125 -10
  218. reflex/vars/base.py +131 -119
  219. reflex/vars/function.py +59 -12
  220. reflex/vars/number.py +3 -1
  221. reflex/vars/object.py +30 -24
  222. reflex/vars/sequence.py +7 -7
  223. {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/METADATA +3 -3
  224. reflex-0.6.5a1.dist-info/RECORD +394 -0
  225. reflex-0.6.4a3.dist-info/RECORD +0 -391
  226. {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/LICENSE +0 -0
  227. {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/WHEEL +0 -0
  228. {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/entry_points.txt +0 -0
@@ -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(