reflex 0.6.0__py3-none-any.whl → 0.6.0a1__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/custom_components/pyproject.toml.jinja2 +2 -2
- reflex/.templates/jinja/web/pages/_app.js.jinja2 +1 -1
- reflex/.templates/jinja/web/pages/utils.js.jinja2 +2 -2
- reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +36 -0
- reflex/.templates/web/utils/state.js +1 -3
- reflex/__init__.py +2 -8
- reflex/__init__.pyi +1 -2
- reflex/app.py +2 -4
- reflex/app_module_for_backend.py +1 -1
- reflex/base.py +1 -1
- reflex/compiler/compiler.py +2 -2
- reflex/compiler/utils.py +3 -3
- reflex/components/base/app_wrap.py +2 -2
- reflex/components/base/app_wrap.pyi +27 -17
- reflex/components/base/bare.py +5 -4
- reflex/components/base/body.pyi +27 -17
- reflex/components/base/document.pyi +131 -81
- reflex/components/base/error_boundary.py +7 -6
- reflex/components/base/error_boundary.pyi +33 -20
- reflex/components/base/fragment.pyi +27 -17
- reflex/components/base/head.pyi +53 -33
- reflex/components/base/link.py +1 -1
- reflex/components/base/link.pyi +54 -33
- reflex/components/base/meta.pyi +105 -65
- reflex/components/base/script.py +2 -1
- reflex/components/base/script.pyi +38 -21
- reflex/components/component.py +47 -53
- reflex/components/core/banner.py +27 -23
- reflex/components/core/banner.pyi +171 -134
- reflex/components/core/client_side_routing.py +3 -2
- reflex/components/core/client_side_routing.pyi +54 -33
- reflex/components/core/clipboard.py +1 -2
- reflex/components/core/clipboard.pyi +33 -20
- reflex/components/core/cond.py +5 -5
- reflex/components/core/debounce.py +5 -5
- reflex/components/core/debounce.pyi +33 -20
- reflex/components/core/foreach.py +4 -3
- reflex/components/core/html.py +1 -1
- reflex/components/core/html.pyi +46 -35
- reflex/components/core/match.py +17 -17
- reflex/components/core/upload.py +23 -17
- reflex/components/core/upload.pyi +124 -78
- reflex/components/datadisplay/code.py +10 -9
- reflex/components/datadisplay/code.pyi +409 -299
- reflex/components/datadisplay/dataeditor.py +10 -8
- reflex/components/datadisplay/dataeditor.pyi +53 -40
- reflex/components/el/element.pyi +27 -17
- reflex/components/el/elements/base.py +1 -1
- reflex/components/el/elements/base.pyi +45 -34
- reflex/components/el/elements/forms.py +16 -16
- reflex/components/el/elements/forms.pyi +707 -554
- reflex/components/el/elements/inline.py +1 -1
- reflex/components/el/elements/inline.pyi +1218 -937
- reflex/components/el/elements/media.py +1 -1
- reflex/components/el/elements/media.pyi +997 -786
- reflex/components/el/elements/metadata.py +6 -3
- reflex/components/el/elements/metadata.pyi +242 -181
- reflex/components/el/elements/other.py +1 -1
- reflex/components/el/elements/other.pyi +306 -235
- reflex/components/el/elements/scripts.py +1 -1
- reflex/components/el/elements/scripts.pyi +140 -109
- reflex/components/el/elements/sectioning.py +2 -0
- reflex/components/el/elements/sectioning.pyi +647 -496
- reflex/components/el/elements/tables.py +1 -1
- reflex/components/el/elements/tables.pyi +452 -351
- reflex/components/el/elements/typography.py +1 -1
- reflex/components/el/elements/typography.pyi +657 -506
- reflex/components/gridjs/datatable.py +9 -6
- reflex/components/gridjs/datatable.pyi +56 -35
- reflex/components/lucide/icon.py +1 -1
- reflex/components/lucide/icon.pyi +54 -33
- reflex/components/markdown/markdown.py +31 -26
- reflex/components/markdown/markdown.pyi +37 -27
- reflex/components/moment/moment.py +12 -13
- reflex/components/moment/moment.pyi +35 -23
- reflex/components/next/base.pyi +27 -17
- reflex/components/next/image.py +1 -1
- reflex/components/next/image.pyi +37 -22
- reflex/components/next/link.py +1 -1
- reflex/components/next/link.pyi +28 -17
- reflex/components/next/video.py +1 -1
- reflex/components/next/video.pyi +28 -17
- reflex/components/plotly/plotly.py +13 -12
- reflex/components/plotly/plotly.pyi +54 -39
- reflex/components/props.py +1 -1
- reflex/components/radix/__init__.pyi +0 -1
- reflex/components/radix/primitives/__init__.pyi +0 -1
- reflex/components/radix/primitives/accordion.py +4 -4
- reflex/components/radix/primitives/accordion.pyi +495 -424
- reflex/components/radix/primitives/base.py +1 -1
- reflex/components/radix/primitives/base.pyi +54 -33
- reflex/components/radix/primitives/drawer.py +1 -1
- reflex/components/radix/primitives/drawer.pyi +273 -172
- reflex/components/radix/primitives/form.py +1 -1
- reflex/components/radix/primitives/form.pyi +364 -257
- reflex/components/radix/primitives/progress.py +1 -1
- reflex/components/radix/primitives/progress.pyi +282 -231
- reflex/components/radix/primitives/slider.py +1 -1
- reflex/components/radix/primitives/slider.pyi +138 -87
- reflex/components/radix/themes/base.py +24 -3
- reflex/components/radix/themes/base.pyi +250 -178
- reflex/components/radix/themes/color_mode.py +5 -5
- reflex/components/radix/themes/color_mode.pyi +220 -187
- reflex/components/radix/themes/components/alert_dialog.py +1 -1
- reflex/components/radix/themes/components/alert_dialog.pyi +207 -136
- reflex/components/radix/themes/components/aspect_ratio.py +1 -1
- reflex/components/radix/themes/components/aspect_ratio.pyi +28 -17
- reflex/components/radix/themes/components/avatar.py +1 -1
- reflex/components/radix/themes/components/avatar.pyi +81 -70
- reflex/components/radix/themes/components/badge.py +1 -1
- reflex/components/radix/themes/components/badge.pyi +99 -88
- reflex/components/radix/themes/components/button.py +1 -1
- reflex/components/radix/themes/components/button.pyi +109 -98
- reflex/components/radix/themes/components/callout.py +1 -1
- reflex/components/radix/themes/components/callout.pyi +373 -322
- reflex/components/radix/themes/components/card.py +1 -1
- reflex/components/radix/themes/components/card.pyi +49 -38
- reflex/components/radix/themes/components/checkbox.py +2 -1
- reflex/components/radix/themes/components/checkbox.pyi +245 -208
- reflex/components/radix/themes/components/checkbox_cards.py +1 -1
- reflex/components/radix/themes/components/checkbox_cards.pyi +115 -94
- reflex/components/radix/themes/components/checkbox_group.py +1 -1
- reflex/components/radix/themes/components/checkbox_group.pyi +107 -86
- reflex/components/radix/themes/components/context_menu.py +1 -1
- reflex/components/radix/themes/components/context_menu.pyi +319 -238
- reflex/components/radix/themes/components/data_list.py +1 -1
- reflex/components/radix/themes/components/data_list.pyi +171 -130
- reflex/components/radix/themes/components/dialog.py +1 -1
- reflex/components/radix/themes/components/dialog.pyi +210 -139
- reflex/components/radix/themes/components/dropdown_menu.py +1 -1
- reflex/components/radix/themes/components/dropdown_menu.pyi +332 -249
- reflex/components/radix/themes/components/hover_card.py +1 -1
- reflex/components/radix/themes/components/hover_card.pyi +131 -90
- reflex/components/radix/themes/components/icon_button.py +3 -2
- reflex/components/radix/themes/components/icon_button.pyi +109 -98
- reflex/components/radix/themes/components/inset.py +1 -1
- reflex/components/radix/themes/components/inset.pyi +58 -47
- reflex/components/radix/themes/components/popover.py +1 -1
- reflex/components/radix/themes/components/popover.pyi +136 -95
- reflex/components/radix/themes/components/progress.py +1 -1
- reflex/components/radix/themes/components/progress.pyi +82 -71
- reflex/components/radix/themes/components/radio.py +1 -1
- reflex/components/radix/themes/components/radio.pyi +80 -69
- reflex/components/radix/themes/components/radio_cards.py +1 -1
- reflex/components/radix/themes/components/radio_cards.pyi +119 -98
- reflex/components/radix/themes/components/radio_group.py +11 -8
- reflex/components/radix/themes/components/radio_group.pyi +271 -228
- reflex/components/radix/themes/components/scroll_area.py +1 -1
- reflex/components/radix/themes/components/scroll_area.pyi +32 -21
- reflex/components/radix/themes/components/segmented_control.py +1 -1
- reflex/components/radix/themes/components/segmented_control.pyi +113 -90
- reflex/components/radix/themes/components/select.py +3 -2
- reflex/components/radix/themes/components/select.pyi +471 -374
- reflex/components/radix/themes/components/separator.py +2 -1
- reflex/components/radix/themes/components/separator.pyi +80 -69
- reflex/components/radix/themes/components/skeleton.py +1 -1
- reflex/components/radix/themes/components/skeleton.pyi +34 -23
- reflex/components/radix/themes/components/slider.py +3 -2
- reflex/components/radix/themes/components/slider.pyi +88 -75
- reflex/components/radix/themes/components/spinner.py +1 -1
- reflex/components/radix/themes/components/spinner.pyi +30 -19
- reflex/components/radix/themes/components/switch.py +1 -1
- reflex/components/radix/themes/components/switch.pyi +84 -71
- reflex/components/radix/themes/components/table.py +1 -1
- reflex/components/radix/themes/components/table.pyi +332 -261
- reflex/components/radix/themes/components/tabs.py +1 -1
- reflex/components/radix/themes/components/tabs.pyi +194 -139
- reflex/components/radix/themes/components/text_area.py +1 -1
- reflex/components/radix/themes/components/text_area.pyi +111 -96
- reflex/components/radix/themes/components/text_field.py +1 -1
- reflex/components/radix/themes/components/text_field.pyi +286 -247
- reflex/components/radix/themes/components/tooltip.py +1 -1
- reflex/components/radix/themes/components/tooltip.pyi +37 -26
- reflex/components/radix/themes/layout/__init__.pyi +0 -1
- reflex/components/radix/themes/layout/base.py +1 -1
- reflex/components/radix/themes/layout/base.pyi +67 -56
- reflex/components/radix/themes/layout/box.pyi +45 -34
- reflex/components/radix/themes/layout/center.pyi +67 -56
- reflex/components/radix/themes/layout/container.py +2 -1
- reflex/components/radix/themes/layout/container.pyi +47 -36
- reflex/components/radix/themes/layout/flex.py +1 -1
- reflex/components/radix/themes/layout/flex.pyi +67 -56
- reflex/components/radix/themes/layout/grid.py +1 -1
- reflex/components/radix/themes/layout/grid.pyi +75 -64
- reflex/components/radix/themes/layout/list.py +6 -5
- reflex/components/radix/themes/layout/list.pyi +244 -193
- reflex/components/radix/themes/layout/section.py +2 -1
- reflex/components/radix/themes/layout/section.pyi +47 -36
- reflex/components/radix/themes/layout/spacer.pyi +67 -56
- reflex/components/radix/themes/layout/stack.py +1 -1
- reflex/components/radix/themes/layout/stack.pyi +159 -128
- reflex/components/radix/themes/typography/blockquote.py +1 -1
- reflex/components/radix/themes/typography/blockquote.pyi +100 -89
- reflex/components/radix/themes/typography/code.py +1 -1
- reflex/components/radix/themes/typography/code.pyi +101 -90
- reflex/components/radix/themes/typography/heading.py +1 -1
- reflex/components/radix/themes/typography/heading.pyi +107 -96
- reflex/components/radix/themes/typography/link.py +1 -1
- reflex/components/radix/themes/typography/link.pyi +113 -102
- reflex/components/radix/themes/typography/text.py +1 -1
- reflex/components/radix/themes/typography/text.pyi +572 -501
- reflex/components/react_player/audio.pyi +60 -33
- reflex/components/react_player/react_player.py +1 -1
- reflex/components/react_player/react_player.pyi +60 -33
- reflex/components/react_player/video.pyi +60 -33
- reflex/components/recharts/cartesian.py +3 -2
- reflex/components/recharts/cartesian.pyi +861 -678
- reflex/components/recharts/charts.py +5 -4
- reflex/components/recharts/charts.pyi +357 -252
- reflex/components/recharts/general.py +2 -1
- reflex/components/recharts/general.pyi +231 -180
- reflex/components/recharts/polar.py +5 -4
- reflex/components/recharts/polar.pyi +181 -144
- reflex/components/recharts/recharts.pyi +53 -33
- reflex/components/sonner/toast.py +17 -16
- reflex/components/sonner/toast.pyi +47 -36
- reflex/components/suneditor/editor.py +3 -2
- reflex/components/suneditor/editor.pyi +78 -55
- reflex/components/tags/cond_tag.py +4 -6
- reflex/components/tags/iter_tag.py +16 -28
- reflex/components/tags/match_tag.py +4 -6
- reflex/components/tags/tag.py +23 -40
- reflex/custom_components/custom_components.py +1 -3
- reflex/event.py +65 -113
- reflex/experimental/client_state.py +24 -25
- reflex/experimental/hooks.py +16 -16
- reflex/experimental/layout.py +5 -5
- reflex/experimental/layout.pyi +187 -136
- reflex/{vars → ivars}/__init__.py +2 -6
- reflex/{vars → ivars}/base.py +216 -599
- reflex/{vars → ivars}/function.py +19 -15
- reflex/{vars → ivars}/number.py +20 -41
- reflex/{vars → ivars}/object.py +30 -28
- reflex/{vars → ivars}/sequence.py +50 -53
- reflex/middleware/hydrate_middleware.py +0 -2
- reflex/middleware/middleware.py +3 -3
- reflex/state.py +82 -148
- reflex/style.py +22 -21
- reflex/utils/exceptions.py +0 -20
- reflex/utils/format.py +34 -54
- reflex/utils/imports.py +73 -16
- reflex/utils/prerequisites.py +15 -35
- reflex/utils/pyi_generator.py +8 -13
- reflex/utils/serializers.py +22 -12
- reflex/utils/telemetry.py +2 -3
- reflex/utils/types.py +5 -10
- reflex/vars.py +501 -0
- {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/METADATA +5 -4
- reflex-0.6.0a1.dist-info/RECORD +384 -0
- reflex-0.6.0.dist-info/RECORD +0 -382
- {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/LICENSE +0 -0
- {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/WHEEL +0 -0
- {reflex-0.6.0.dist-info → reflex-0.6.0a1.dist-info}/entry_points.txt +0 -0
|
@@ -7,8 +7,9 @@ from typing import Any, Callable, Dict, Literal, Optional, Union, overload
|
|
|
7
7
|
|
|
8
8
|
from reflex.components.component import Component
|
|
9
9
|
from reflex.event import EventHandler, EventSpec
|
|
10
|
+
from reflex.ivars.base import ImmutableVar
|
|
10
11
|
from reflex.style import Style
|
|
11
|
-
from reflex.vars
|
|
12
|
+
from reflex.vars import Var
|
|
12
13
|
|
|
13
14
|
class Script(Component):
|
|
14
15
|
@overload
|
|
@@ -19,8 +20,8 @@ class Script(Component):
|
|
|
19
20
|
src: Optional[Union[Var[str], str]] = None,
|
|
20
21
|
strategy: Optional[
|
|
21
22
|
Union[
|
|
22
|
-
Literal["afterInteractive", "beforeInteractive", "lazyOnload"],
|
|
23
23
|
Var[Literal["afterInteractive", "beforeInteractive", "lazyOnload"]],
|
|
24
|
+
Literal["afterInteractive", "beforeInteractive", "lazyOnload"],
|
|
24
25
|
]
|
|
25
26
|
] = None,
|
|
26
27
|
style: Optional[Style] = None,
|
|
@@ -28,44 +29,60 @@ class Script(Component):
|
|
|
28
29
|
id: Optional[Any] = None,
|
|
29
30
|
class_name: Optional[Any] = None,
|
|
30
31
|
autofocus: Optional[bool] = None,
|
|
31
|
-
custom_attrs: Optional[Dict[str, Union[
|
|
32
|
-
on_blur: Optional[
|
|
33
|
-
|
|
32
|
+
custom_attrs: Optional[Dict[str, Union[ImmutableVar, str]]] = None,
|
|
33
|
+
on_blur: Optional[
|
|
34
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
35
|
+
] = None,
|
|
36
|
+
on_click: Optional[
|
|
37
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
38
|
+
] = None,
|
|
34
39
|
on_context_menu: Optional[
|
|
35
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
40
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
36
41
|
] = None,
|
|
37
42
|
on_double_click: Optional[
|
|
38
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
43
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
44
|
+
] = None,
|
|
45
|
+
on_error: Optional[
|
|
46
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
47
|
+
] = None,
|
|
48
|
+
on_focus: Optional[
|
|
49
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
50
|
+
] = None,
|
|
51
|
+
on_load: Optional[
|
|
52
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
53
|
+
] = None,
|
|
54
|
+
on_mount: Optional[
|
|
55
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
39
56
|
] = None,
|
|
40
|
-
on_error: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
41
|
-
on_focus: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
42
|
-
on_load: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
43
|
-
on_mount: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
44
57
|
on_mouse_down: Optional[
|
|
45
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
58
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
46
59
|
] = None,
|
|
47
60
|
on_mouse_enter: Optional[
|
|
48
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
61
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
49
62
|
] = None,
|
|
50
63
|
on_mouse_leave: Optional[
|
|
51
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
64
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
52
65
|
] = None,
|
|
53
66
|
on_mouse_move: Optional[
|
|
54
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
67
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
55
68
|
] = None,
|
|
56
69
|
on_mouse_out: Optional[
|
|
57
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
70
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
58
71
|
] = None,
|
|
59
72
|
on_mouse_over: Optional[
|
|
60
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
73
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
61
74
|
] = None,
|
|
62
75
|
on_mouse_up: Optional[
|
|
63
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
76
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
77
|
+
] = None,
|
|
78
|
+
on_ready: Optional[
|
|
79
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
80
|
+
] = None,
|
|
81
|
+
on_scroll: Optional[
|
|
82
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
64
83
|
] = None,
|
|
65
|
-
on_ready: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
66
|
-
on_scroll: Optional[Union[EventHandler, EventSpec, list, Callable, Var]] = None,
|
|
67
84
|
on_unmount: Optional[
|
|
68
|
-
Union[EventHandler, EventSpec, list, Callable,
|
|
85
|
+
Union[EventHandler, EventSpec, list, Callable, ImmutableVar]
|
|
69
86
|
] = None,
|
|
70
87
|
**props,
|
|
71
88
|
) -> "Script":
|
reflex/components/component.py
CHANGED
|
@@ -43,6 +43,7 @@ from reflex.event import (
|
|
|
43
43
|
call_event_handler,
|
|
44
44
|
get_handler_args,
|
|
45
45
|
)
|
|
46
|
+
from reflex.ivars.base import ImmutableVar, LiteralVar
|
|
46
47
|
from reflex.style import Style, format_as_emotion
|
|
47
48
|
from reflex.utils import format, imports, types
|
|
48
49
|
from reflex.utils.imports import (
|
|
@@ -53,8 +54,7 @@ from reflex.utils.imports import (
|
|
|
53
54
|
parse_imports,
|
|
54
55
|
)
|
|
55
56
|
from reflex.utils.serializers import serializer
|
|
56
|
-
from reflex.vars import VarData
|
|
57
|
-
from reflex.vars.base import LiteralVar, Var
|
|
57
|
+
from reflex.vars import Var, VarData
|
|
58
58
|
|
|
59
59
|
|
|
60
60
|
class BaseComponent(Base, ABC):
|
|
@@ -177,7 +177,7 @@ class Component(BaseComponent, ABC):
|
|
|
177
177
|
style: Style = Style()
|
|
178
178
|
|
|
179
179
|
# A mapping from event triggers to event chains.
|
|
180
|
-
event_triggers: Dict[str, Union[EventChain,
|
|
180
|
+
event_triggers: Dict[str, Union[EventChain, ImmutableVar]] = {}
|
|
181
181
|
|
|
182
182
|
# The alias for the tag.
|
|
183
183
|
alias: Optional[str] = None
|
|
@@ -195,7 +195,7 @@ class Component(BaseComponent, ABC):
|
|
|
195
195
|
class_name: Any = None
|
|
196
196
|
|
|
197
197
|
# Special component props.
|
|
198
|
-
special_props:
|
|
198
|
+
special_props: Set[ImmutableVar] = set()
|
|
199
199
|
|
|
200
200
|
# Whether the component should take the focus once the page is loaded
|
|
201
201
|
autofocus: bool = False
|
|
@@ -213,7 +213,7 @@ class Component(BaseComponent, ABC):
|
|
|
213
213
|
_rename_props: Dict[str, str] = {}
|
|
214
214
|
|
|
215
215
|
# custom attribute
|
|
216
|
-
custom_attrs: Dict[str, Union[
|
|
216
|
+
custom_attrs: Dict[str, Union[ImmutableVar, str]] = {}
|
|
217
217
|
|
|
218
218
|
# When to memoize this component and its children.
|
|
219
219
|
_memoization_mode: MemoizationMode = MemoizationMode()
|
|
@@ -249,7 +249,7 @@ class Component(BaseComponent, ABC):
|
|
|
249
249
|
"""
|
|
250
250
|
return {}
|
|
251
251
|
|
|
252
|
-
def add_hooks(self) -> list[str |
|
|
252
|
+
def add_hooks(self) -> list[str | ImmutableVar]:
|
|
253
253
|
"""Add hooks inside the component function.
|
|
254
254
|
|
|
255
255
|
Hooks are pieces of literal Javascript code that is inserted inside the
|
|
@@ -404,7 +404,7 @@ class Component(BaseComponent, ABC):
|
|
|
404
404
|
passed_types = None
|
|
405
405
|
try:
|
|
406
406
|
# Try to create a var from the value.
|
|
407
|
-
if isinstance(value,
|
|
407
|
+
if isinstance(value, ImmutableVar):
|
|
408
408
|
kwargs[key] = value
|
|
409
409
|
else:
|
|
410
410
|
kwargs[key] = LiteralVar.create(value)
|
|
@@ -447,17 +447,11 @@ class Component(BaseComponent, ABC):
|
|
|
447
447
|
not passed_types
|
|
448
448
|
and not types._issubclass(passed_type, expected_type, value)
|
|
449
449
|
):
|
|
450
|
-
value_name =
|
|
451
|
-
|
|
452
|
-
additional_info = (
|
|
453
|
-
" You can call `.bool()` on the value to convert it to a boolean."
|
|
454
|
-
if expected_type is bool and isinstance(value, Var)
|
|
455
|
-
else ""
|
|
450
|
+
value_name = (
|
|
451
|
+
value._var_name if isinstance(value, ImmutableVar) else value
|
|
456
452
|
)
|
|
457
|
-
|
|
458
453
|
raise TypeError(
|
|
459
|
-
f"Invalid var passed for prop {type(self).__name__}.{key}, expected type {expected_type}, got value {value_name} of type {passed_type}."
|
|
460
|
-
+ additional_info
|
|
454
|
+
f"Invalid var passed for prop {type(self).__name__}.{key}, expected type {expected_type}, got value {value_name} of type {passed_types or passed_type}."
|
|
461
455
|
)
|
|
462
456
|
# Check if the key is an event trigger.
|
|
463
457
|
if key in component_specific_triggers:
|
|
@@ -505,13 +499,9 @@ class Component(BaseComponent, ABC):
|
|
|
505
499
|
self,
|
|
506
500
|
args_spec: Any,
|
|
507
501
|
value: Union[
|
|
508
|
-
Var,
|
|
509
|
-
EventHandler,
|
|
510
|
-
EventSpec,
|
|
511
|
-
List[Union[EventHandler, EventSpec]],
|
|
512
|
-
Callable,
|
|
502
|
+
Var, EventHandler, EventSpec, List[Union[EventHandler, EventSpec]], Callable
|
|
513
503
|
],
|
|
514
|
-
) -> Union[EventChain,
|
|
504
|
+
) -> Union[EventChain, ImmutableVar]:
|
|
515
505
|
"""Create an event chain from a variety of input types.
|
|
516
506
|
|
|
517
507
|
Args:
|
|
@@ -525,7 +515,7 @@ class Component(BaseComponent, ABC):
|
|
|
525
515
|
ValueError: If the value is not a valid event chain.
|
|
526
516
|
"""
|
|
527
517
|
# If it's an event chain var, return it.
|
|
528
|
-
if isinstance(value,
|
|
518
|
+
if isinstance(value, ImmutableVar):
|
|
529
519
|
if value._var_type is not EventChain:
|
|
530
520
|
raise ValueError(
|
|
531
521
|
f"Invalid event chain: {repr(value)} of type {type(value)}"
|
|
@@ -549,7 +539,7 @@ class Component(BaseComponent, ABC):
|
|
|
549
539
|
elif isinstance(v, Callable):
|
|
550
540
|
# Call the lambda to get the event chain.
|
|
551
541
|
result = call_event_fn(v, args_spec)
|
|
552
|
-
if isinstance(result,
|
|
542
|
+
if isinstance(result, ImmutableVar):
|
|
553
543
|
raise ValueError(
|
|
554
544
|
f"Invalid event chain: {v}. Cannot use a Var-returning "
|
|
555
545
|
"lambda inside an EventChain list."
|
|
@@ -561,7 +551,7 @@ class Component(BaseComponent, ABC):
|
|
|
561
551
|
# If the input is a callable, create an event chain.
|
|
562
552
|
elif isinstance(value, Callable):
|
|
563
553
|
result = call_event_fn(value, args_spec)
|
|
564
|
-
if isinstance(result,
|
|
554
|
+
if isinstance(result, ImmutableVar):
|
|
565
555
|
# Recursively call this function if the lambda returned an EventChain Var.
|
|
566
556
|
return self._create_event_chain(args_spec, result)
|
|
567
557
|
events = result
|
|
@@ -579,7 +569,7 @@ class Component(BaseComponent, ABC):
|
|
|
579
569
|
event_actions.update(e.event_actions)
|
|
580
570
|
|
|
581
571
|
# Return the event chain.
|
|
582
|
-
if isinstance(args_spec,
|
|
572
|
+
if isinstance(args_spec, ImmutableVar):
|
|
583
573
|
return EventChain(
|
|
584
574
|
events=events,
|
|
585
575
|
args_spec=None,
|
|
@@ -665,7 +655,7 @@ class Component(BaseComponent, ABC):
|
|
|
665
655
|
"""
|
|
666
656
|
# Create the base tag.
|
|
667
657
|
tag = Tag(
|
|
668
|
-
name=
|
|
658
|
+
name=self.tag if not self.alias else self.alias,
|
|
669
659
|
special_props=self.special_props,
|
|
670
660
|
)
|
|
671
661
|
|
|
@@ -679,7 +669,7 @@ class Component(BaseComponent, ABC):
|
|
|
679
669
|
# Add ref to element if `id` is not None.
|
|
680
670
|
ref = self.get_ref()
|
|
681
671
|
if ref is not None:
|
|
682
|
-
props["ref"] =
|
|
672
|
+
props["ref"] = ImmutableVar.create(ref)
|
|
683
673
|
else:
|
|
684
674
|
props = props.copy()
|
|
685
675
|
|
|
@@ -892,7 +882,7 @@ class Component(BaseComponent, ABC):
|
|
|
892
882
|
Returns:
|
|
893
883
|
The dictionary of the component style as value and the style notation as key.
|
|
894
884
|
"""
|
|
895
|
-
if isinstance(self.style,
|
|
885
|
+
if isinstance(self.style, ImmutableVar):
|
|
896
886
|
return {"css": self.style}
|
|
897
887
|
emotion_style = format_as_emotion(self.style)
|
|
898
888
|
return (
|
|
@@ -1008,8 +998,8 @@ class Component(BaseComponent, ABC):
|
|
|
1008
998
|
|
|
1009
999
|
@staticmethod
|
|
1010
1000
|
def _get_vars_from_event_triggers(
|
|
1011
|
-
event_triggers: dict[str, EventChain |
|
|
1012
|
-
) -> Iterator[tuple[str, list[
|
|
1001
|
+
event_triggers: dict[str, EventChain | ImmutableVar],
|
|
1002
|
+
) -> Iterator[tuple[str, list[ImmutableVar]]]:
|
|
1013
1003
|
"""Get the Vars associated with each event trigger.
|
|
1014
1004
|
|
|
1015
1005
|
Args:
|
|
@@ -1019,7 +1009,7 @@ class Component(BaseComponent, ABC):
|
|
|
1019
1009
|
tuple of (event_name, event_vars)
|
|
1020
1010
|
"""
|
|
1021
1011
|
for event_trigger, event in event_triggers.items():
|
|
1022
|
-
if isinstance(event,
|
|
1012
|
+
if isinstance(event, ImmutableVar):
|
|
1023
1013
|
yield event_trigger, [event]
|
|
1024
1014
|
elif isinstance(event, EventChain):
|
|
1025
1015
|
event_args = []
|
|
@@ -1028,7 +1018,7 @@ class Component(BaseComponent, ABC):
|
|
|
1028
1018
|
event_args.extend(args)
|
|
1029
1019
|
yield event_trigger, event_args
|
|
1030
1020
|
|
|
1031
|
-
def _get_vars(self, include_children: bool = False) -> list[
|
|
1021
|
+
def _get_vars(self, include_children: bool = False) -> list[ImmutableVar]:
|
|
1032
1022
|
"""Walk all Vars used in this component.
|
|
1033
1023
|
|
|
1034
1024
|
Args:
|
|
@@ -1048,14 +1038,18 @@ class Component(BaseComponent, ABC):
|
|
|
1048
1038
|
# Get Vars associated with component props.
|
|
1049
1039
|
for prop in self.get_props():
|
|
1050
1040
|
prop_var = getattr(self, prop)
|
|
1051
|
-
if isinstance(prop_var,
|
|
1041
|
+
if isinstance(prop_var, ImmutableVar):
|
|
1052
1042
|
vars.append(prop_var)
|
|
1053
1043
|
|
|
1054
1044
|
# Style keeps track of its own VarData instance, so embed in a temp Var that is yielded.
|
|
1055
|
-
if
|
|
1045
|
+
if (
|
|
1046
|
+
isinstance(self.style, dict)
|
|
1047
|
+
and self.style
|
|
1048
|
+
or isinstance(self.style, ImmutableVar)
|
|
1049
|
+
):
|
|
1056
1050
|
vars.append(
|
|
1057
|
-
|
|
1058
|
-
|
|
1051
|
+
ImmutableVar(
|
|
1052
|
+
_var_name="style",
|
|
1059
1053
|
_var_type=str,
|
|
1060
1054
|
_var_data=VarData.merge(self.style._var_data),
|
|
1061
1055
|
)
|
|
@@ -1072,7 +1066,7 @@ class Component(BaseComponent, ABC):
|
|
|
1072
1066
|
self.autofocus,
|
|
1073
1067
|
*self.custom_attrs.values(),
|
|
1074
1068
|
):
|
|
1075
|
-
if isinstance(comp_prop,
|
|
1069
|
+
if isinstance(comp_prop, ImmutableVar):
|
|
1076
1070
|
vars.append(comp_prop)
|
|
1077
1071
|
elif isinstance(comp_prop, str):
|
|
1078
1072
|
# Collapse VarData encoded in f-strings.
|
|
@@ -1101,7 +1095,7 @@ class Component(BaseComponent, ABC):
|
|
|
1101
1095
|
for event in trigger.events:
|
|
1102
1096
|
if event.handler.state_full_name:
|
|
1103
1097
|
return True
|
|
1104
|
-
elif isinstance(trigger,
|
|
1098
|
+
elif isinstance(trigger, ImmutableVar) and trigger._var_state:
|
|
1105
1099
|
return True
|
|
1106
1100
|
return False
|
|
1107
1101
|
|
|
@@ -1293,7 +1287,7 @@ class Component(BaseComponent, ABC):
|
|
|
1293
1287
|
user_hooks = self._get_hooks()
|
|
1294
1288
|
user_hooks_data = (
|
|
1295
1289
|
VarData.merge(user_hooks._get_all_var_data())
|
|
1296
|
-
if user_hooks is not None and isinstance(user_hooks,
|
|
1290
|
+
if user_hooks is not None and isinstance(user_hooks, ImmutableVar)
|
|
1297
1291
|
else None
|
|
1298
1292
|
)
|
|
1299
1293
|
if user_hooks_data is not None:
|
|
@@ -1396,7 +1390,7 @@ class Component(BaseComponent, ABC):
|
|
|
1396
1390
|
"""
|
|
1397
1391
|
ref = self.get_ref()
|
|
1398
1392
|
if ref is not None:
|
|
1399
|
-
return f"const {ref} = useRef(null); {str(
|
|
1393
|
+
return f"const {ref} = useRef(null); {str(ImmutableVar.create_safe(ref).as_ref())} = {ref};"
|
|
1400
1394
|
|
|
1401
1395
|
def _get_vars_hooks(self) -> dict[str, None]:
|
|
1402
1396
|
"""Get the hooks required by vars referenced in this component.
|
|
@@ -1459,7 +1453,7 @@ class Component(BaseComponent, ABC):
|
|
|
1459
1453
|
"""
|
|
1460
1454
|
code = {}
|
|
1461
1455
|
|
|
1462
|
-
def extract_var_hooks(hook:
|
|
1456
|
+
def extract_var_hooks(hook: ImmutableVar):
|
|
1463
1457
|
_imports = {}
|
|
1464
1458
|
var_data = VarData.merge(hook._get_all_var_data())
|
|
1465
1459
|
if var_data is not None:
|
|
@@ -1476,7 +1470,7 @@ class Component(BaseComponent, ABC):
|
|
|
1476
1470
|
# the order of the hooks in the final output)
|
|
1477
1471
|
for clz in reversed(tuple(self._iter_parent_classes_with_method("add_hooks"))):
|
|
1478
1472
|
for hook in clz.add_hooks(self):
|
|
1479
|
-
if isinstance(hook,
|
|
1473
|
+
if isinstance(hook, ImmutableVar):
|
|
1480
1474
|
extract_var_hooks(hook)
|
|
1481
1475
|
else:
|
|
1482
1476
|
code[hook] = {}
|
|
@@ -1537,7 +1531,7 @@ class Component(BaseComponent, ABC):
|
|
|
1537
1531
|
The ref name.
|
|
1538
1532
|
"""
|
|
1539
1533
|
# do not create a ref if the id is dynamic or unspecified
|
|
1540
|
-
if self.id is None or isinstance(self.id,
|
|
1534
|
+
if self.id is None or isinstance(self.id, ImmutableVar):
|
|
1541
1535
|
return None
|
|
1542
1536
|
return format.format_ref(self.id)
|
|
1543
1537
|
|
|
@@ -1776,15 +1770,15 @@ class CustomComponent(Component):
|
|
|
1776
1770
|
"""
|
|
1777
1771
|
return super()._render(props=self.props)
|
|
1778
1772
|
|
|
1779
|
-
def get_prop_vars(self) -> List[
|
|
1773
|
+
def get_prop_vars(self) -> List[ImmutableVar]:
|
|
1780
1774
|
"""Get the prop vars.
|
|
1781
1775
|
|
|
1782
1776
|
Returns:
|
|
1783
1777
|
The prop vars.
|
|
1784
1778
|
"""
|
|
1785
1779
|
return [
|
|
1786
|
-
|
|
1787
|
-
|
|
1780
|
+
ImmutableVar(
|
|
1781
|
+
_var_name=name,
|
|
1788
1782
|
_var_type=(
|
|
1789
1783
|
prop._var_type if types._isinstance(prop, Var) else type(prop)
|
|
1790
1784
|
),
|
|
@@ -1792,7 +1786,7 @@ class CustomComponent(Component):
|
|
|
1792
1786
|
for name, prop in self.props.items()
|
|
1793
1787
|
]
|
|
1794
1788
|
|
|
1795
|
-
def _get_vars(self, include_children: bool = False) -> list[
|
|
1789
|
+
def _get_vars(self, include_children: bool = False) -> list[ImmutableVar]:
|
|
1796
1790
|
"""Walk all Vars used in this component.
|
|
1797
1791
|
|
|
1798
1792
|
Args:
|
|
@@ -1803,7 +1797,7 @@ class CustomComponent(Component):
|
|
|
1803
1797
|
"""
|
|
1804
1798
|
return (
|
|
1805
1799
|
super()._get_vars(include_children=include_children)
|
|
1806
|
-
+ [prop for prop in self.props.values() if isinstance(prop,
|
|
1800
|
+
+ [prop for prop in self.props.values() if isinstance(prop, ImmutableVar)]
|
|
1807
1801
|
+ self.get_component(self)._get_vars(include_children=include_children)
|
|
1808
1802
|
)
|
|
1809
1803
|
|
|
@@ -1974,7 +1968,7 @@ class StatefulComponent(BaseComponent):
|
|
|
1974
1968
|
should_memoize = True
|
|
1975
1969
|
break
|
|
1976
1970
|
child = cls._child_var(child)
|
|
1977
|
-
if isinstance(child,
|
|
1971
|
+
if isinstance(child, ImmutableVar) and child._get_all_var_data():
|
|
1978
1972
|
should_memoize = True
|
|
1979
1973
|
break
|
|
1980
1974
|
|
|
@@ -2130,7 +2124,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2130
2124
|
def _get_memoized_event_triggers(
|
|
2131
2125
|
cls,
|
|
2132
2126
|
component: Component,
|
|
2133
|
-
) -> dict[str, tuple[
|
|
2127
|
+
) -> dict[str, tuple[ImmutableVar, str]]:
|
|
2134
2128
|
"""Memoize event handler functions with useCallback to avoid unnecessary re-renders.
|
|
2135
2129
|
|
|
2136
2130
|
Args:
|
|
@@ -2177,7 +2171,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2177
2171
|
|
|
2178
2172
|
# Store the memoized function name and hook code for this event trigger.
|
|
2179
2173
|
trigger_memo[event_trigger] = (
|
|
2180
|
-
|
|
2174
|
+
ImmutableVar.create_safe(memo_name)._replace(
|
|
2181
2175
|
_var_type=EventChain, merge_var_data=memo_var_data
|
|
2182
2176
|
),
|
|
2183
2177
|
f"const {memo_name} = useCallback({rendered_chain}, [{', '.join(var_deps)}])",
|
|
@@ -2250,7 +2244,7 @@ class StatefulComponent(BaseComponent):
|
|
|
2250
2244
|
Returns:
|
|
2251
2245
|
The tag to render.
|
|
2252
2246
|
"""
|
|
2253
|
-
return dict(Tag(name=self.tag
|
|
2247
|
+
return dict(Tag(name=self.tag))
|
|
2254
2248
|
|
|
2255
2249
|
def __str__(self) -> str:
|
|
2256
2250
|
"""Represent the component in React.
|
reflex/components/core/banner.py
CHANGED
|
@@ -18,52 +18,56 @@ from reflex.components.radix.themes.typography.text import Text
|
|
|
18
18
|
from reflex.components.sonner.toast import Toaster, ToastProps
|
|
19
19
|
from reflex.constants import Dirs, Hooks, Imports
|
|
20
20
|
from reflex.constants.compiler import CompileVars
|
|
21
|
+
from reflex.ivars.base import ImmutableVar, LiteralVar
|
|
22
|
+
from reflex.ivars.function import FunctionStringVar
|
|
23
|
+
from reflex.ivars.number import BooleanVar
|
|
24
|
+
from reflex.ivars.sequence import LiteralArrayVar
|
|
21
25
|
from reflex.utils.imports import ImportVar
|
|
22
|
-
from reflex.vars import VarData
|
|
23
|
-
from reflex.vars.base import LiteralVar, Var
|
|
24
|
-
from reflex.vars.function import FunctionStringVar
|
|
25
|
-
from reflex.vars.number import BooleanVar
|
|
26
|
-
from reflex.vars.sequence import LiteralArrayVar
|
|
26
|
+
from reflex.vars import Var, VarData
|
|
27
27
|
|
|
28
28
|
connect_error_var_data: VarData = VarData( # type: ignore
|
|
29
29
|
imports=Imports.EVENTS,
|
|
30
30
|
hooks={Hooks.EVENTS: None},
|
|
31
31
|
)
|
|
32
32
|
|
|
33
|
-
connect_errors =
|
|
34
|
-
|
|
33
|
+
connect_errors: Var = ImmutableVar.create_safe(
|
|
34
|
+
value=CompileVars.CONNECT_ERROR,
|
|
35
|
+
_var_data=connect_error_var_data,
|
|
35
36
|
)
|
|
36
37
|
|
|
37
|
-
connection_error =
|
|
38
|
-
|
|
38
|
+
connection_error: Var = ImmutableVar.create_safe(
|
|
39
|
+
value="((connectErrors.length > 0) ? connectErrors[connectErrors.length - 1].message : '')",
|
|
39
40
|
_var_data=connect_error_var_data,
|
|
40
41
|
)
|
|
41
42
|
|
|
42
|
-
connection_errors_count =
|
|
43
|
-
|
|
43
|
+
connection_errors_count: Var = ImmutableVar.create_safe(
|
|
44
|
+
value="connectErrors.length",
|
|
45
|
+
_var_data=connect_error_var_data,
|
|
44
46
|
)
|
|
45
47
|
|
|
46
|
-
has_connection_errors =
|
|
47
|
-
|
|
48
|
+
has_connection_errors: Var = ImmutableVar.create_safe(
|
|
49
|
+
value="(connectErrors.length > 0)",
|
|
50
|
+
_var_data=connect_error_var_data,
|
|
48
51
|
).to(BooleanVar)
|
|
49
52
|
|
|
50
|
-
has_too_many_connection_errors =
|
|
51
|
-
|
|
53
|
+
has_too_many_connection_errors: Var = ImmutableVar.create_safe(
|
|
54
|
+
value="(connectErrors.length >= 2)",
|
|
55
|
+
_var_data=connect_error_var_data,
|
|
52
56
|
).to(BooleanVar)
|
|
53
57
|
|
|
54
58
|
|
|
55
|
-
class WebsocketTargetURL(
|
|
59
|
+
class WebsocketTargetURL(ImmutableVar):
|
|
56
60
|
"""A component that renders the websocket target URL."""
|
|
57
61
|
|
|
58
62
|
@classmethod
|
|
59
|
-
def create(cls) ->
|
|
63
|
+
def create(cls) -> ImmutableVar:
|
|
60
64
|
"""Create a websocket target URL component.
|
|
61
65
|
|
|
62
66
|
Returns:
|
|
63
67
|
The websocket target URL component.
|
|
64
68
|
"""
|
|
65
|
-
return
|
|
66
|
-
|
|
69
|
+
return ImmutableVar(
|
|
70
|
+
_var_name="getBackendURL(env.EVENT).href",
|
|
67
71
|
_var_data=VarData(
|
|
68
72
|
imports={
|
|
69
73
|
"/env.json": [ImportVar(tag="env", is_default=True)],
|
|
@@ -91,7 +95,7 @@ def default_connection_error() -> list[str | Var | Component]:
|
|
|
91
95
|
class ConnectionToaster(Toaster):
|
|
92
96
|
"""A connection toaster component."""
|
|
93
97
|
|
|
94
|
-
def add_hooks(self) -> list[str |
|
|
98
|
+
def add_hooks(self) -> list[str | ImmutableVar]:
|
|
95
99
|
"""Add the hooks for the connection toaster.
|
|
96
100
|
|
|
97
101
|
Returns:
|
|
@@ -121,8 +125,8 @@ class ConnectionToaster(Toaster):
|
|
|
121
125
|
),
|
|
122
126
|
).call(
|
|
123
127
|
# TODO: This breaks the assumption that Vars are JS expressions
|
|
124
|
-
|
|
125
|
-
|
|
128
|
+
ImmutableVar.create_safe(
|
|
129
|
+
f"""
|
|
126
130
|
() => {{
|
|
127
131
|
if ({str(has_too_many_connection_errors)}) {{
|
|
128
132
|
if (!userDismissed) {{
|
|
@@ -234,7 +238,7 @@ class WifiOffPulse(Icon):
|
|
|
234
238
|
Returns:
|
|
235
239
|
The icon component with default props applied.
|
|
236
240
|
"""
|
|
237
|
-
pulse_var =
|
|
241
|
+
pulse_var = ImmutableVar.create("pulse")
|
|
238
242
|
return super().create(
|
|
239
243
|
"wifi_off",
|
|
240
244
|
color=props.pop("color", "crimson"),
|