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.
- reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -14
- reflex/.templates/jinja/web/pages/utils.js.jinja2 +4 -8
- reflex/.templates/web/components/shiki/code.js +16 -11
- reflex/.templates/web/utils/state.js +29 -21
- reflex/__init__.py +4 -0
- reflex/__init__.pyi +4 -0
- reflex/app.py +148 -154
- reflex/app_mixins/lifespan.py +5 -1
- reflex/app_mixins/middleware.py +3 -1
- reflex/app_mixins/mixin.py +3 -2
- reflex/base.py +2 -4
- reflex/compiler/compiler.py +111 -37
- reflex/components/base/app_wrap.pyi +17 -17
- reflex/components/base/bare.py +72 -3
- reflex/components/base/body.pyi +17 -17
- reflex/components/base/document.pyi +81 -81
- reflex/components/base/error_boundary.pyi +25 -18
- reflex/components/base/fragment.pyi +17 -17
- reflex/components/base/head.pyi +33 -33
- reflex/components/base/link.pyi +33 -33
- reflex/components/base/meta.pyi +65 -65
- reflex/components/base/script.py +4 -4
- reflex/components/base/script.pyi +23 -20
- reflex/components/component.py +250 -31
- reflex/components/core/banner.py +1 -1
- reflex/components/core/banner.pyi +81 -81
- reflex/components/core/client_side_routing.pyi +33 -33
- reflex/components/core/clipboard.py +2 -2
- reflex/components/core/clipboard.pyi +24 -18
- reflex/components/core/debounce.py +2 -2
- reflex/components/core/debounce.pyi +18 -18
- reflex/components/core/html.pyi +17 -17
- reflex/components/core/upload.py +82 -28
- reflex/components/core/upload.pyi +77 -72
- reflex/components/datadisplay/code.py +55 -40
- reflex/components/datadisplay/code.pyi +46 -44
- reflex/components/datadisplay/dataeditor.py +21 -20
- reflex/components/datadisplay/dataeditor.pyi +103 -35
- reflex/components/datadisplay/shiki_code_block.py +60 -27
- reflex/components/datadisplay/shiki_code_block.pyi +86 -65
- reflex/components/dynamic.py +9 -5
- reflex/components/el/element.pyi +17 -17
- reflex/components/el/elements/base.pyi +17 -17
- reflex/components/el/elements/forms.py +12 -3
- reflex/components/el/elements/forms.pyi +293 -233
- reflex/components/el/elements/inline.pyi +449 -449
- reflex/components/el/elements/media.pyi +401 -401
- reflex/components/el/elements/metadata.pyi +97 -97
- reflex/components/el/elements/other.pyi +113 -113
- reflex/components/el/elements/scripts.pyi +49 -49
- reflex/components/el/elements/sectioning.pyi +241 -241
- reflex/components/el/elements/tables.pyi +161 -161
- reflex/components/el/elements/typography.pyi +241 -241
- reflex/components/gridjs/datatable.pyi +33 -33
- reflex/components/lucide/icon.py +1 -1
- reflex/components/lucide/icon.pyi +33 -33
- reflex/components/markdown/markdown.py +180 -49
- reflex/components/markdown/markdown.pyi +36 -19
- reflex/components/moment/moment.py +17 -21
- reflex/components/moment/moment.pyi +26 -21
- reflex/components/next/base.pyi +17 -17
- reflex/components/next/image.py +3 -3
- reflex/components/next/image.pyi +21 -19
- reflex/components/next/link.pyi +17 -17
- reflex/components/next/video.pyi +17 -17
- reflex/components/plotly/plotly.py +79 -78
- reflex/components/plotly/plotly.pyi +91 -41
- reflex/components/props.py +34 -0
- reflex/components/radix/primitives/accordion.py +15 -8
- reflex/components/radix/primitives/accordion.pyi +121 -118
- reflex/components/radix/primitives/base.pyi +33 -33
- reflex/components/radix/primitives/drawer.py +41 -20
- reflex/components/radix/primitives/drawer.pyi +279 -190
- reflex/components/radix/primitives/form.py +2 -2
- reflex/components/radix/primitives/form.pyi +200 -167
- reflex/components/radix/primitives/progress.pyi +81 -81
- reflex/components/radix/primitives/slider.pyi +89 -83
- reflex/components/radix/themes/base.py +27 -1
- reflex/components/radix/themes/base.pyi +286 -113
- reflex/components/radix/themes/color_mode.py +17 -9
- reflex/components/radix/themes/color_mode.pyi +68 -56
- reflex/components/radix/themes/components/alert_dialog.py +8 -5
- reflex/components/radix/themes/components/alert_dialog.pyi +125 -117
- reflex/components/radix/themes/components/aspect_ratio.pyi +17 -17
- reflex/components/radix/themes/components/avatar.py +1 -5
- reflex/components/radix/themes/components/avatar.pyi +17 -17
- reflex/components/radix/themes/components/badge.py +1 -5
- reflex/components/radix/themes/components/badge.pyi +17 -17
- reflex/components/radix/themes/components/button.pyi +18 -21
- reflex/components/radix/themes/components/callout.py +1 -4
- reflex/components/radix/themes/components/callout.pyi +81 -81
- reflex/components/radix/themes/components/card.py +1 -3
- reflex/components/radix/themes/components/card.pyi +17 -17
- reflex/components/radix/themes/components/checkbox.py +4 -8
- reflex/components/radix/themes/components/checkbox.pyi +61 -52
- reflex/components/radix/themes/components/checkbox_cards.pyi +33 -33
- reflex/components/radix/themes/components/checkbox_group.pyi +33 -33
- reflex/components/radix/themes/components/context_menu.py +121 -28
- reflex/components/radix/themes/components/context_menu.pyi +250 -147
- reflex/components/radix/themes/components/data_list.pyi +65 -65
- reflex/components/radix/themes/components/dialog.py +11 -11
- reflex/components/radix/themes/components/dialog.pyi +135 -120
- reflex/components/radix/themes/components/dropdown_menu.py +14 -25
- reflex/components/radix/themes/components/dropdown_menu.pyi +157 -145
- reflex/components/radix/themes/components/hover_card.py +19 -7
- reflex/components/radix/themes/components/hover_card.pyi +102 -67
- reflex/components/radix/themes/components/icon_button.pyi +18 -21
- reflex/components/radix/themes/components/inset.py +1 -3
- reflex/components/radix/themes/components/inset.pyi +17 -17
- reflex/components/radix/themes/components/popover.py +22 -13
- reflex/components/radix/themes/components/popover.pyi +98 -72
- reflex/components/radix/themes/components/progress.pyi +17 -17
- reflex/components/radix/themes/components/radio.pyi +17 -17
- reflex/components/radix/themes/components/radio_cards.py +2 -2
- reflex/components/radix/themes/components/radio_cards.pyi +37 -34
- reflex/components/radix/themes/components/radio_group.py +3 -7
- reflex/components/radix/themes/components/radio_group.pyi +69 -66
- reflex/components/radix/themes/components/scroll_area.py +1 -3
- reflex/components/radix/themes/components/scroll_area.pyi +17 -17
- reflex/components/radix/themes/components/segmented_control.pyi +37 -34
- reflex/components/radix/themes/components/select.py +7 -11
- reflex/components/radix/themes/components/select.pyi +175 -154
- reflex/components/radix/themes/components/separator.py +1 -4
- reflex/components/radix/themes/components/separator.pyi +17 -17
- reflex/components/radix/themes/components/skeleton.pyi +17 -17
- reflex/components/radix/themes/components/slider.py +12 -21
- reflex/components/radix/themes/components/slider.pyi +47 -25
- reflex/components/radix/themes/components/spinner.py +1 -4
- reflex/components/radix/themes/components/spinner.pyi +17 -17
- reflex/components/radix/themes/components/switch.py +3 -6
- reflex/components/radix/themes/components/switch.pyi +21 -18
- reflex/components/radix/themes/components/table.py +21 -5
- reflex/components/radix/themes/components/table.pyi +392 -116
- reflex/components/radix/themes/components/tabs.py +3 -6
- reflex/components/radix/themes/components/tabs.pyi +89 -83
- reflex/components/radix/themes/components/text_area.py +1 -5
- reflex/components/radix/themes/components/text_area.pyi +43 -20
- reflex/components/radix/themes/components/text_field.py +1 -5
- reflex/components/radix/themes/components/text_field.pyi +101 -55
- reflex/components/radix/themes/components/tooltip.py +5 -7
- reflex/components/radix/themes/components/tooltip.pyi +25 -22
- reflex/components/radix/themes/layout/base.py +2 -27
- reflex/components/radix/themes/layout/base.pyi +82 -82
- reflex/components/radix/themes/layout/box.pyi +17 -17
- reflex/components/radix/themes/layout/center.pyi +17 -17
- reflex/components/radix/themes/layout/container.pyi +17 -17
- reflex/components/radix/themes/layout/flex.py +1 -6
- reflex/components/radix/themes/layout/flex.pyi +17 -17
- reflex/components/radix/themes/layout/grid.py +1 -6
- reflex/components/radix/themes/layout/grid.pyi +17 -17
- reflex/components/radix/themes/layout/list.py +20 -15
- reflex/components/radix/themes/layout/list.pyi +175 -92
- reflex/components/radix/themes/layout/section.pyi +17 -17
- reflex/components/radix/themes/layout/spacer.pyi +17 -17
- reflex/components/radix/themes/layout/stack.py +6 -6
- reflex/components/radix/themes/layout/stack.pyi +91 -62
- reflex/components/radix/themes/typography/blockquote.py +2 -8
- reflex/components/radix/themes/typography/blockquote.pyi +17 -17
- reflex/components/radix/themes/typography/code.py +4 -10
- reflex/components/radix/themes/typography/code.pyi +19 -18
- reflex/components/radix/themes/typography/heading.py +4 -11
- reflex/components/radix/themes/typography/heading.pyi +19 -18
- reflex/components/radix/themes/typography/link.py +4 -10
- reflex/components/radix/themes/typography/link.pyi +19 -18
- reflex/components/radix/themes/typography/text.py +4 -11
- reflex/components/radix/themes/typography/text.pyi +115 -114
- reflex/components/react_player/audio.pyi +58 -33
- reflex/components/react_player/react_player.py +17 -17
- reflex/components/react_player/react_player.pyi +55 -33
- reflex/components/react_player/video.pyi +58 -33
- reflex/components/recharts/cartesian.py +45 -45
- reflex/components/recharts/cartesian.pyi +389 -304
- reflex/components/recharts/charts.py +22 -22
- reflex/components/recharts/charts.pyi +226 -179
- reflex/components/recharts/general.py +26 -27
- reflex/components/recharts/general.pyi +106 -99
- reflex/components/recharts/polar.py +33 -33
- reflex/components/recharts/polar.pyi +70 -64
- reflex/components/recharts/recharts.pyi +33 -33
- reflex/components/sonner/toast.py +9 -36
- reflex/components/sonner/toast.pyi +20 -24
- reflex/components/suneditor/editor.py +8 -8
- reflex/components/suneditor/editor.pyi +50 -25
- reflex/components/tags/iter_tag.py +1 -10
- reflex/components/tags/tag.py +1 -4
- reflex/config.py +198 -35
- reflex/constants/__init__.py +4 -16
- reflex/constants/base.py +7 -14
- reflex/constants/colors.py +0 -1
- reflex/constants/installer.py +12 -7
- reflex/constants/state.py +4 -0
- reflex/custom_components/custom_components.py +6 -6
- reflex/event.py +486 -241
- reflex/experimental/client_state.py +9 -9
- reflex/experimental/layout.py +2 -2
- reflex/experimental/layout.pyi +95 -87
- reflex/experimental/misc.py +1 -1
- reflex/istate/__init__.py +1 -0
- reflex/istate/proxy.py +33 -0
- reflex/istate/wrappers.py +27 -0
- reflex/model.py +7 -7
- reflex/page.py +2 -1
- reflex/reflex.py +142 -8
- reflex/state.py +127 -46
- reflex/testing.py +9 -7
- reflex/utils/console.py +0 -1
- reflex/utils/exceptions.py +31 -3
- reflex/utils/exec.py +33 -14
- reflex/utils/format.py +15 -12
- reflex/utils/net.py +1 -1
- reflex/utils/path_ops.py +2 -2
- reflex/utils/prerequisites.py +82 -46
- reflex/utils/pyi_generator.py +63 -20
- reflex/utils/registry.py +1 -1
- reflex/utils/serializers.py +75 -36
- reflex/utils/telemetry.py +3 -2
- reflex/utils/types.py +125 -10
- reflex/vars/base.py +131 -119
- reflex/vars/function.py +59 -12
- reflex/vars/number.py +3 -1
- reflex/vars/object.py +30 -24
- reflex/vars/sequence.py +7 -7
- {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/METADATA +3 -3
- reflex-0.6.5a1.dist-info/RECORD +394 -0
- reflex-0.6.4a3.dist-info/RECORD +0 -391
- {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/LICENSE +0 -0
- {reflex-0.6.4a3.dist-info → reflex-0.6.5a1.dist-info}/WHEEL +0 -0
- {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
|
-
|
|
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,
|
|
186
|
-
on_blur: Optional[EventType[[]]] = None,
|
|
187
|
-
on_cell_activated: Optional[
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
33
|
-
|
|
33
|
+
return run_script(
|
|
34
|
+
"""
|
|
34
35
|
// Event listener for the parent click
|
|
35
|
-
document.addEventListener('click', function(event) {
|
|
36
|
-
// Find the closest
|
|
37
|
-
const parent = event.target.closest('
|
|
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(${
|
|
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
|
-
}
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
}
|
|
62
|
+
}, 125);
|
|
63
|
+
}, 600);
|
|
64
|
+
}, 125);
|
|
65
|
+
} else {
|
|
65
66
|
// console.error('SVG element not found within the parent.');
|
|
66
|
-
}
|
|
67
|
-
}
|
|
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:
|
|
712
|
+
can_copy: bool = False
|
|
680
713
|
|
|
681
714
|
# copy_button: A custom copy button to override the default one.
|
|
682
|
-
copy_button:
|
|
715
|
+
copy_button: Optional[Union[Component, bool]] = None
|
|
683
716
|
|
|
684
717
|
@classmethod
|
|
685
718
|
def create(
|