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