reflex 0.6.4a2__py3-none-any.whl → 0.6.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- 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 +90 -28
- reflex/components/core/upload.pyi +128 -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 +30 -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 +252 -41
- 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 +133 -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.4a2.dist-info → reflex-0.6.5.dist-info}/METADATA +3 -3
- reflex-0.6.5.dist-info/RECORD +394 -0
- reflex-0.6.4a2.dist-info/RECORD +0 -391
- {reflex-0.6.4a2.dist-info → reflex-0.6.5.dist-info}/LICENSE +0 -0
- {reflex-0.6.4a2.dist-info → reflex-0.6.5.dist-info}/WHEEL +0 -0
- {reflex-0.6.4a2.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,
|
|
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
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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
|
-
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
323
|
+
on_delete: EventHandler[passthrough_event_spec(GridSelection)]
|
|
323
324
|
|
|
324
325
|
# Fired when editing is finished.
|
|
325
326
|
on_finished_editing: EventHandler[
|
|
326
|
-
|
|
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[
|
|
331
|
+
on_row_appended: EventHandler[no_args_event_spec]
|
|
331
332
|
|
|
332
333
|
# Fired when the selection is cleared.
|
|
333
|
-
on_selection_cleared: EventHandler[
|
|
334
|
+
on_selection_cleared: EventHandler[no_args_event_spec]
|
|
334
335
|
|
|
335
336
|
# Fired when a column is resized.
|
|
336
|
-
on_column_resize: EventHandler[
|
|
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("
|
|
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
|
-
|
|
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(
|