reflex 0.5.10a3__py3-none-any.whl → 0.6.0__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 +4 -4
- reflex/.templates/jinja/web/utils/context.js.jinja2 +1 -1
- reflex/.templates/jinja/web/utils/theme.js.jinja2 +1 -1
- reflex/.templates/web/utils/state.js +3 -1
- reflex/__init__.py +10 -3
- reflex/__init__.pyi +3 -2
- reflex/app.py +47 -11
- reflex/app_module_for_backend.py +1 -1
- reflex/base.py +3 -2
- reflex/compiler/compiler.py +5 -5
- reflex/compiler/utils.py +5 -3
- reflex/components/base/app_wrap.py +2 -4
- reflex/components/base/app_wrap.pyi +16 -26
- reflex/components/base/bare.py +6 -4
- reflex/components/base/body.pyi +16 -26
- reflex/components/base/document.pyi +76 -126
- reflex/components/base/error_boundary.py +9 -8
- reflex/components/base/error_boundary.pyi +18 -30
- reflex/components/base/fragment.pyi +16 -26
- reflex/components/base/head.pyi +31 -51
- reflex/components/base/link.py +1 -1
- reflex/components/base/link.pyi +31 -51
- reflex/components/base/meta.pyi +61 -101
- reflex/components/base/script.py +2 -2
- reflex/components/base/script.pyi +20 -36
- reflex/components/component.py +107 -130
- reflex/components/core/banner.py +61 -66
- reflex/components/core/banner.pyi +129 -230
- reflex/components/core/client_side_routing.py +2 -2
- reflex/components/core/client_side_routing.pyi +31 -51
- reflex/components/core/clipboard.py +4 -3
- reflex/components/core/clipboard.pyi +19 -31
- reflex/components/core/cond.py +21 -44
- reflex/components/core/debounce.py +7 -9
- reflex/components/core/debounce.pyi +19 -31
- reflex/components/core/foreach.py +4 -14
- reflex/components/core/html.py +1 -1
- reflex/components/core/html.pyi +34 -44
- reflex/components/core/match.py +36 -43
- reflex/components/core/upload.py +27 -26
- reflex/components/core/upload.pyi +81 -116
- reflex/components/datadisplay/code.py +55 -29
- reflex/components/datadisplay/code.pyi +303 -410
- reflex/components/datadisplay/dataeditor.py +13 -9
- reflex/components/datadisplay/dataeditor.pyi +39 -51
- reflex/components/el/__init__.py +0 -1
- reflex/components/el/__init__.pyi +0 -11
- reflex/components/el/element.pyi +16 -26
- reflex/components/el/elements/__init__.py +1 -7
- reflex/components/el/elements/__init__.pyi +1 -15
- reflex/components/el/elements/base.py +1 -1
- reflex/components/el/elements/base.pyi +33 -43
- reflex/components/el/elements/forms.py +26 -33
- reflex/components/el/elements/forms.pyi +542 -694
- reflex/components/el/elements/inline.py +1 -1
- reflex/components/el/elements/inline.pyi +909 -1189
- reflex/components/el/elements/media.py +1 -22
- reflex/components/el/elements/media.pyi +765 -975
- reflex/components/el/elements/metadata.py +3 -5
- reflex/components/el/elements/metadata.pyi +175 -235
- reflex/components/el/elements/other.py +1 -1
- reflex/components/el/elements/other.pyi +228 -298
- reflex/components/el/elements/scripts.py +1 -1
- reflex/components/el/elements/scripts.pyi +106 -136
- reflex/components/el/elements/sectioning.py +0 -2
- reflex/components/el/elements/sectioning.pyi +481 -631
- reflex/components/el/elements/tables.py +1 -1
- reflex/components/el/elements/tables.pyi +341 -441
- reflex/components/el/elements/typography.py +1 -1
- reflex/components/el/elements/typography.pyi +491 -641
- reflex/components/gridjs/datatable.py +9 -13
- reflex/components/gridjs/datatable.pyi +33 -53
- reflex/components/lucide/icon.py +3 -127
- reflex/components/lucide/icon.pyi +31 -160
- reflex/components/markdown/markdown.py +32 -42
- reflex/components/markdown/markdown.pyi +28 -41
- reflex/components/moment/moment.py +13 -12
- reflex/components/moment/moment.pyi +22 -33
- reflex/components/next/base.pyi +16 -26
- reflex/components/next/image.py +1 -5
- reflex/components/next/image.pyi +21 -35
- reflex/components/next/link.py +1 -1
- reflex/components/next/link.pyi +16 -26
- reflex/components/next/video.py +1 -1
- reflex/components/next/video.pyi +16 -26
- reflex/components/plotly/plotly.py +17 -30
- reflex/components/plotly/plotly.pyi +38 -52
- reflex/components/props.py +21 -10
- reflex/components/radix/__init__.pyi +2 -1
- reflex/components/radix/primitives/accordion.py +6 -7
- reflex/components/radix/primitives/accordion.pyi +415 -485
- reflex/components/radix/primitives/base.py +1 -1
- reflex/components/radix/primitives/base.pyi +31 -51
- reflex/components/radix/primitives/drawer.py +1 -1
- reflex/components/radix/primitives/drawer.pyi +162 -262
- reflex/components/radix/primitives/form.py +1 -1
- reflex/components/radix/primitives/form.pyi +247 -353
- reflex/components/radix/primitives/progress.py +1 -1
- reflex/components/radix/primitives/progress.pyi +226 -276
- reflex/components/radix/primitives/slider.py +1 -1
- reflex/components/radix/primitives/slider.pyi +82 -132
- reflex/components/radix/themes/base.py +8 -25
- reflex/components/radix/themes/base.pyi +171 -242
- reflex/components/radix/themes/color_mode.py +11 -20
- reflex/components/radix/themes/color_mode.pyi +198 -231
- reflex/components/radix/themes/components/__init__.pyi +1 -0
- reflex/components/radix/themes/components/alert_dialog.py +1 -1
- reflex/components/radix/themes/components/alert_dialog.pyi +129 -199
- reflex/components/radix/themes/components/aspect_ratio.py +1 -1
- reflex/components/radix/themes/components/aspect_ratio.pyi +16 -26
- reflex/components/radix/themes/components/avatar.py +1 -1
- reflex/components/radix/themes/components/avatar.pyi +69 -79
- reflex/components/radix/themes/components/badge.py +1 -1
- reflex/components/radix/themes/components/badge.pyi +87 -97
- reflex/components/radix/themes/components/button.py +1 -1
- reflex/components/radix/themes/components/button.pyi +97 -107
- reflex/components/radix/themes/components/callout.py +1 -1
- reflex/components/radix/themes/components/callout.pyi +317 -367
- reflex/components/radix/themes/components/card.py +1 -1
- reflex/components/radix/themes/components/card.pyi +37 -47
- reflex/components/radix/themes/components/checkbox.py +2 -4
- reflex/components/radix/themes/components/checkbox.pyi +205 -241
- reflex/components/radix/themes/components/checkbox_cards.py +1 -1
- reflex/components/radix/themes/components/checkbox_cards.pyi +92 -112
- reflex/components/radix/themes/components/checkbox_group.py +1 -1
- reflex/components/radix/themes/components/checkbox_group.pyi +84 -104
- reflex/components/radix/themes/components/context_menu.py +1 -1
- reflex/components/radix/themes/components/context_menu.pyi +230 -310
- reflex/components/radix/themes/components/data_list.py +6 -1
- reflex/components/radix/themes/components/data_list.pyi +131 -166
- reflex/components/radix/themes/components/dialog.py +1 -1
- reflex/components/radix/themes/components/dialog.pyi +132 -202
- reflex/components/radix/themes/components/dropdown_menu.py +1 -1
- reflex/components/radix/themes/components/dropdown_menu.pyi +241 -323
- reflex/components/radix/themes/components/hover_card.py +1 -1
- reflex/components/radix/themes/components/hover_card.pyi +86 -126
- reflex/components/radix/themes/components/icon_button.py +1 -1
- reflex/components/radix/themes/components/icon_button.pyi +97 -107
- reflex/components/radix/themes/components/inset.py +1 -1
- reflex/components/radix/themes/components/inset.pyi +46 -56
- reflex/components/radix/themes/components/popover.py +1 -1
- reflex/components/radix/themes/components/popover.pyi +91 -131
- reflex/components/radix/themes/components/progress.py +1 -1
- reflex/components/radix/themes/components/progress.pyi +70 -80
- reflex/components/radix/themes/components/radio.py +1 -1
- reflex/components/radix/themes/components/radio.pyi +68 -78
- reflex/components/radix/themes/components/radio_cards.py +1 -1
- reflex/components/radix/themes/components/radio_cards.pyi +96 -116
- reflex/components/radix/themes/components/radio_group.py +32 -31
- reflex/components/radix/themes/components/radio_group.pyi +230 -266
- reflex/components/radix/themes/components/scroll_area.py +1 -1
- reflex/components/radix/themes/components/scroll_area.pyi +20 -30
- reflex/components/radix/themes/components/segmented_control.py +1 -1
- reflex/components/radix/themes/components/segmented_control.pyi +88 -110
- reflex/components/radix/themes/components/select.py +1 -1
- reflex/components/radix/themes/components/select.pyi +365 -461
- reflex/components/radix/themes/components/separator.py +2 -4
- reflex/components/radix/themes/components/separator.pyi +68 -78
- reflex/components/radix/themes/components/skeleton.py +1 -1
- reflex/components/radix/themes/components/skeleton.pyi +22 -32
- reflex/components/radix/themes/components/slider.py +1 -1
- reflex/components/radix/themes/components/slider.pyi +74 -86
- reflex/components/radix/themes/components/spinner.py +1 -1
- reflex/components/radix/themes/components/spinner.pyi +18 -28
- reflex/components/radix/themes/components/switch.py +1 -1
- reflex/components/radix/themes/components/switch.pyi +70 -82
- reflex/components/radix/themes/components/table.py +1 -1
- reflex/components/radix/themes/components/table.pyi +254 -324
- reflex/components/radix/themes/components/tabs.py +1 -1
- reflex/components/radix/themes/components/tabs.pyi +134 -188
- reflex/components/radix/themes/components/text_area.py +1 -1
- reflex/components/radix/themes/components/text_area.pyi +95 -109
- reflex/components/radix/themes/components/text_field.py +1 -80
- reflex/components/radix/themes/components/text_field.pyi +245 -290
- reflex/components/radix/themes/components/tooltip.py +1 -1
- reflex/components/radix/themes/components/tooltip.pyi +25 -35
- 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 +55 -65
- reflex/components/radix/themes/layout/box.pyi +33 -43
- reflex/components/radix/themes/layout/center.pyi +55 -65
- reflex/components/radix/themes/layout/container.py +2 -4
- reflex/components/radix/themes/layout/container.pyi +35 -45
- reflex/components/radix/themes/layout/flex.py +1 -1
- reflex/components/radix/themes/layout/flex.pyi +55 -65
- reflex/components/radix/themes/layout/grid.py +1 -1
- reflex/components/radix/themes/layout/grid.pyi +63 -73
- reflex/components/radix/themes/layout/list.py +1 -1
- reflex/components/radix/themes/layout/list.pyi +188 -238
- reflex/components/radix/themes/layout/section.py +2 -4
- reflex/components/radix/themes/layout/section.pyi +35 -45
- reflex/components/radix/themes/layout/spacer.pyi +55 -65
- reflex/components/radix/themes/layout/stack.py +1 -1
- reflex/components/radix/themes/layout/stack.pyi +125 -155
- reflex/components/radix/themes/typography/blockquote.py +1 -1
- reflex/components/radix/themes/typography/blockquote.pyi +88 -98
- reflex/components/radix/themes/typography/code.py +1 -1
- reflex/components/radix/themes/typography/code.pyi +89 -99
- reflex/components/radix/themes/typography/heading.py +1 -1
- reflex/components/radix/themes/typography/heading.pyi +95 -105
- reflex/components/radix/themes/typography/link.py +1 -1
- reflex/components/radix/themes/typography/link.pyi +101 -111
- reflex/components/radix/themes/typography/text.py +1 -1
- reflex/components/radix/themes/typography/text.pyi +494 -564
- reflex/components/react_player/audio.pyi +32 -58
- reflex/components/react_player/react_player.py +1 -1
- reflex/components/react_player/react_player.pyi +32 -58
- reflex/components/react_player/video.pyi +32 -58
- reflex/components/recharts/cartesian.py +22 -19
- reflex/components/recharts/cartesian.pyi +658 -840
- reflex/components/recharts/charts.py +3 -3
- reflex/components/recharts/charts.pyi +238 -342
- reflex/components/recharts/general.py +8 -8
- reflex/components/recharts/general.pyi +175 -225
- reflex/components/recharts/polar.py +11 -11
- reflex/components/recharts/polar.pyi +135 -171
- reflex/components/recharts/recharts.pyi +31 -51
- reflex/components/sonner/toast.py +27 -31
- reflex/components/sonner/toast.pyi +36 -45
- reflex/components/suneditor/editor.py +1 -1
- reflex/components/suneditor/editor.pyi +54 -76
- reflex/components/tags/cond_tag.py +6 -4
- reflex/components/tags/iter_tag.py +37 -25
- reflex/components/tags/match_tag.py +6 -4
- reflex/components/tags/tag.py +43 -28
- reflex/constants/base.py +3 -1
- reflex/constants/event.py +1 -0
- reflex/custom_components/custom_components.py +3 -1
- reflex/event.py +166 -108
- reflex/experimental/__init__.py +25 -6
- reflex/experimental/client_state.py +34 -57
- reflex/experimental/hooks.py +12 -17
- reflex/experimental/layout.py +4 -4
- reflex/experimental/layout.pyi +130 -180
- reflex/middleware/hydrate_middleware.py +2 -0
- reflex/middleware/middleware.py +3 -3
- reflex/model.py +22 -0
- reflex/reflex.py +4 -0
- reflex/state.py +491 -110
- reflex/style.py +56 -39
- reflex/testing.py +8 -3
- reflex/utils/exceptions.py +32 -0
- reflex/utils/exec.py +0 -14
- reflex/utils/format.py +80 -209
- reflex/utils/imports.py +16 -73
- reflex/utils/net.py +43 -0
- reflex/utils/path_ops.py +13 -1
- reflex/utils/prerequisites.py +81 -41
- reflex/utils/pyi_generator.py +12 -6
- reflex/utils/serializers.py +13 -41
- reflex/utils/telemetry.py +3 -2
- reflex/utils/types.py +47 -7
- reflex/{experimental/vars → vars}/__init__.py +6 -3
- reflex/vars/base.py +2563 -0
- reflex/vars/function.py +196 -0
- reflex/vars/number.py +1158 -0
- reflex/vars/object.py +562 -0
- reflex/vars/sequence.py +1604 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/METADATA +6 -9
- reflex-0.6.0.dist-info/RECORD +382 -0
- reflex/.templates/apps/demo/.gitignore +0 -4
- reflex/.templates/apps/demo/assets/favicon.ico +0 -0
- reflex/.templates/apps/demo/assets/github.svg +0 -10
- reflex/.templates/apps/demo/assets/icon.svg +0 -37
- reflex/.templates/apps/demo/assets/logo.svg +0 -68
- reflex/.templates/apps/demo/assets/paneleft.svg +0 -13
- reflex/.templates/apps/demo/code/__init__.py +0 -1
- reflex/.templates/apps/demo/code/demo.py +0 -127
- reflex/.templates/apps/demo/code/pages/__init__.py +0 -7
- reflex/.templates/apps/demo/code/pages/chatapp.py +0 -31
- reflex/.templates/apps/demo/code/pages/datatable.py +0 -360
- reflex/.templates/apps/demo/code/pages/forms.py +0 -257
- reflex/.templates/apps/demo/code/pages/graphing.py +0 -253
- reflex/.templates/apps/demo/code/pages/home.py +0 -56
- reflex/.templates/apps/demo/code/sidebar.py +0 -178
- reflex/.templates/apps/demo/code/state.py +0 -22
- reflex/.templates/apps/demo/code/states/form_state.py +0 -40
- reflex/.templates/apps/demo/code/states/pie_state.py +0 -47
- reflex/.templates/apps/demo/code/styles.py +0 -68
- reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
- reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -4
- reflex/.templates/apps/demo/code/webui/components/chat.py +0 -118
- reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -19
- reflex/.templates/apps/demo/code/webui/components/modal.py +0 -56
- reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -70
- reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -66
- reflex/.templates/apps/demo/code/webui/state.py +0 -146
- reflex/.templates/apps/demo/code/webui/styles.py +0 -88
- reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +0 -36
- reflex/experimental/vars/base.py +0 -583
- reflex/experimental/vars/function.py +0 -290
- reflex/experimental/vars/number.py +0 -1458
- reflex/experimental/vars/object.py +0 -804
- reflex/experimental/vars/sequence.py +0 -1764
- reflex/utils/watch.py +0 -96
- reflex/vars.py +0 -2604
- reflex/vars.pyi +0 -218
- reflex-0.5.10a3.dist-info/RECORD +0 -413
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/LICENSE +0 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/WHEEL +0 -0
- {reflex-0.5.10a3.dist-info → reflex-0.6.0.dist-info}/entry_points.txt +0 -0
reflex/style.py
CHANGED
|
@@ -6,12 +6,13 @@ from typing import Any, Literal, Tuple, Type
|
|
|
6
6
|
|
|
7
7
|
from reflex import constants
|
|
8
8
|
from reflex.components.core.breakpoints import Breakpoints, breakpoints_values
|
|
9
|
-
from reflex.event import EventChain
|
|
9
|
+
from reflex.event import EventChain, EventHandler
|
|
10
10
|
from reflex.utils import format
|
|
11
|
+
from reflex.utils.exceptions import ReflexError
|
|
11
12
|
from reflex.utils.imports import ImportVar
|
|
12
|
-
from reflex.vars import
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
from reflex.vars import VarData
|
|
14
|
+
from reflex.vars.base import CallableVar, LiteralVar, Var
|
|
15
|
+
from reflex.vars.function import FunctionVar
|
|
15
16
|
|
|
16
17
|
SYSTEM_COLOR_MODE: str = "system"
|
|
17
18
|
LIGHT_COLOR_MODE: str = "light"
|
|
@@ -25,32 +26,30 @@ color_mode_imports = {
|
|
|
25
26
|
}
|
|
26
27
|
|
|
27
28
|
|
|
28
|
-
def _color_mode_var(
|
|
29
|
-
"""Create a Var that destructs the
|
|
29
|
+
def _color_mode_var(_js_expr: str, _var_type: Type = str) -> Var:
|
|
30
|
+
"""Create a Var that destructs the _js_expr from ColorModeContext.
|
|
30
31
|
|
|
31
32
|
Args:
|
|
32
|
-
|
|
33
|
+
_js_expr: The name of the variable to get from ColorModeContext.
|
|
33
34
|
_var_type: The type of the Var.
|
|
34
35
|
|
|
35
36
|
Returns:
|
|
36
|
-
The
|
|
37
|
+
The Var that resolves to the color mode.
|
|
37
38
|
"""
|
|
38
|
-
return
|
|
39
|
-
|
|
39
|
+
return Var(
|
|
40
|
+
_js_expr=_js_expr,
|
|
40
41
|
_var_type=_var_type,
|
|
41
|
-
_var_is_local=False,
|
|
42
|
-
_var_is_string=False,
|
|
43
42
|
_var_data=VarData(
|
|
44
43
|
imports=color_mode_imports,
|
|
45
|
-
hooks={f"const {{ {
|
|
44
|
+
hooks={f"const {{ {_js_expr} }} = useContext(ColorModeContext)": None},
|
|
46
45
|
),
|
|
47
|
-
)
|
|
46
|
+
).guess_type()
|
|
48
47
|
|
|
49
48
|
|
|
50
49
|
@CallableVar
|
|
51
50
|
def set_color_mode(
|
|
52
51
|
new_color_mode: LiteralColorMode | Var[LiteralColorMode] | None = None,
|
|
53
|
-
) ->
|
|
52
|
+
) -> Var[EventChain]:
|
|
54
53
|
"""Create an EventChain Var that sets the color mode to a specific value.
|
|
55
54
|
|
|
56
55
|
Note: `set_color_mode` is not a real event and cannot be triggered from a
|
|
@@ -63,27 +62,30 @@ def set_color_mode(
|
|
|
63
62
|
The EventChain Var that can be passed to an event trigger.
|
|
64
63
|
"""
|
|
65
64
|
base_setter = _color_mode_var(
|
|
66
|
-
|
|
65
|
+
_js_expr=constants.ColorMode.SET,
|
|
67
66
|
_var_type=EventChain,
|
|
68
67
|
)
|
|
69
68
|
if new_color_mode is None:
|
|
70
69
|
return base_setter
|
|
71
70
|
|
|
72
71
|
if not isinstance(new_color_mode, Var):
|
|
73
|
-
new_color_mode =
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
72
|
+
new_color_mode = LiteralVar.create(new_color_mode)
|
|
73
|
+
|
|
74
|
+
return Var(
|
|
75
|
+
f"() => {str(base_setter)}({str(new_color_mode)})",
|
|
76
|
+
_var_data=VarData.merge(
|
|
77
|
+
base_setter._get_all_var_data(), new_color_mode._get_all_var_data()
|
|
78
|
+
),
|
|
79
|
+
).to(FunctionVar, EventChain) # type: ignore
|
|
78
80
|
|
|
79
81
|
|
|
80
82
|
# Var resolves to the current color mode for the app ("light", "dark" or "system")
|
|
81
|
-
color_mode = _color_mode_var(
|
|
83
|
+
color_mode = _color_mode_var(_js_expr=constants.ColorMode.NAME)
|
|
82
84
|
# Var resolves to the resolved color mode for the app ("light" or "dark")
|
|
83
|
-
resolved_color_mode = _color_mode_var(
|
|
85
|
+
resolved_color_mode = _color_mode_var(_js_expr=constants.ColorMode.RESOLVED_NAME)
|
|
84
86
|
# Var resolves to a function invocation that toggles the color mode
|
|
85
87
|
toggle_color_mode = _color_mode_var(
|
|
86
|
-
|
|
88
|
+
_js_expr=constants.ColorMode.TOGGLE,
|
|
87
89
|
_var_type=EventChain,
|
|
88
90
|
)
|
|
89
91
|
|
|
@@ -111,7 +113,9 @@ def media_query(breakpoint_expr: str):
|
|
|
111
113
|
return f"@media screen and (min-width: {breakpoint_expr})"
|
|
112
114
|
|
|
113
115
|
|
|
114
|
-
def convert_item(
|
|
116
|
+
def convert_item(
|
|
117
|
+
style_item: int | str | Var,
|
|
118
|
+
) -> tuple[str | Var, VarData | None]:
|
|
115
119
|
"""Format a single value in a style dictionary.
|
|
116
120
|
|
|
117
121
|
Args:
|
|
@@ -119,23 +123,31 @@ def convert_item(style_item: str | Var) -> tuple[str, VarData | None]:
|
|
|
119
123
|
|
|
120
124
|
Returns:
|
|
121
125
|
The formatted style item and any associated VarData.
|
|
126
|
+
|
|
127
|
+
Raises:
|
|
128
|
+
ReflexError: If an EventHandler is used as a style value
|
|
122
129
|
"""
|
|
130
|
+
if isinstance(style_item, EventHandler):
|
|
131
|
+
raise ReflexError(
|
|
132
|
+
"EventHandlers cannot be used as style values. "
|
|
133
|
+
"Please use a Var or a literal value."
|
|
134
|
+
)
|
|
135
|
+
|
|
123
136
|
if isinstance(style_item, Var):
|
|
124
|
-
|
|
125
|
-
return str(style_item), style_item._var_data
|
|
137
|
+
return style_item, style_item._get_all_var_data()
|
|
126
138
|
|
|
127
|
-
#
|
|
128
|
-
|
|
129
|
-
if new_var is not None and new_var._var_data:
|
|
130
|
-
# The wrapped backtick is used to identify the Var for interpolation.
|
|
131
|
-
return f"`{str(new_var)}`", new_var._var_data
|
|
139
|
+
# if isinstance(style_item, str) and REFLEX_VAR_OPENING_TAG not in style_item:
|
|
140
|
+
# return style_item, None
|
|
132
141
|
|
|
133
|
-
|
|
142
|
+
# Otherwise, convert to Var to collapse VarData encoded in f-string.
|
|
143
|
+
new_var = LiteralVar.create(style_item)
|
|
144
|
+
var_data = new_var._get_all_var_data() if new_var is not None else None
|
|
145
|
+
return new_var, var_data
|
|
134
146
|
|
|
135
147
|
|
|
136
148
|
def convert_list(
|
|
137
149
|
responsive_list: list[str | dict | Var],
|
|
138
|
-
) -> tuple[list[str | dict], VarData | None]:
|
|
150
|
+
) -> tuple[list[str | dict[str, Var | list | dict]], VarData | None]:
|
|
139
151
|
"""Format a responsive value list.
|
|
140
152
|
|
|
141
153
|
Args:
|
|
@@ -157,7 +169,9 @@ def convert_list(
|
|
|
157
169
|
return converted_value, VarData.merge(*item_var_datas)
|
|
158
170
|
|
|
159
171
|
|
|
160
|
-
def convert(
|
|
172
|
+
def convert(
|
|
173
|
+
style_dict: dict[str, Var | dict | list | str],
|
|
174
|
+
) -> tuple[dict[str, str | list | dict], VarData | None]:
|
|
161
175
|
"""Format a style dictionary.
|
|
162
176
|
|
|
163
177
|
Args:
|
|
@@ -175,7 +189,11 @@ def convert(style_dict):
|
|
|
175
189
|
|
|
176
190
|
for key, value in style_dict.items():
|
|
177
191
|
keys = format_style_key(key)
|
|
178
|
-
if isinstance(value,
|
|
192
|
+
if isinstance(value, Var):
|
|
193
|
+
return_val = value
|
|
194
|
+
new_var_data = value._get_all_var_data()
|
|
195
|
+
update_out_dict(return_val, keys)
|
|
196
|
+
elif isinstance(value, dict):
|
|
179
197
|
# Recursively format nested style dictionaries.
|
|
180
198
|
return_val, new_var_data = convert(value)
|
|
181
199
|
update_out_dict(return_val, keys)
|
|
@@ -254,10 +272,10 @@ class Style(dict):
|
|
|
254
272
|
value: The value to set.
|
|
255
273
|
"""
|
|
256
274
|
# Create a Var to collapse VarData encoded in f-string.
|
|
257
|
-
_var =
|
|
275
|
+
_var = LiteralVar.create(value)
|
|
258
276
|
if _var is not None:
|
|
259
277
|
# Carry the imports/hooks when setting a Var as a value.
|
|
260
|
-
self._var_data = VarData.merge(self._var_data, _var.
|
|
278
|
+
self._var_data = VarData.merge(self._var_data, _var._get_all_var_data())
|
|
261
279
|
super().__setitem__(key, value)
|
|
262
280
|
|
|
263
281
|
|
|
@@ -272,7 +290,6 @@ def _format_emotion_style_pseudo_selector(key: str) -> str:
|
|
|
272
290
|
"""
|
|
273
291
|
prefix = None
|
|
274
292
|
if key.startswith("_"):
|
|
275
|
-
# Handle pseudo selectors in chakra style format.
|
|
276
293
|
prefix = "&:"
|
|
277
294
|
key = key[1:]
|
|
278
295
|
if key.startswith(":"):
|
reflex/testing.py
CHANGED
|
@@ -45,6 +45,8 @@ import reflex.utils.prerequisites
|
|
|
45
45
|
import reflex.utils.processes
|
|
46
46
|
from reflex.state import (
|
|
47
47
|
BaseState,
|
|
48
|
+
StateManager,
|
|
49
|
+
StateManagerDisk,
|
|
48
50
|
StateManagerMemory,
|
|
49
51
|
StateManagerRedis,
|
|
50
52
|
reload_state_module,
|
|
@@ -126,7 +128,7 @@ class AppHarness:
|
|
|
126
128
|
frontend_output_thread: Optional[threading.Thread] = None
|
|
127
129
|
backend_thread: Optional[threading.Thread] = None
|
|
128
130
|
backend: Optional[uvicorn.Server] = None
|
|
129
|
-
state_manager: Optional[
|
|
131
|
+
state_manager: Optional[StateManager] = None
|
|
130
132
|
_frontends: list["WebDriver"] = dataclasses.field(default_factory=list)
|
|
131
133
|
_decorated_pages: list = dataclasses.field(default_factory=list)
|
|
132
134
|
|
|
@@ -290,6 +292,8 @@ class AppHarness:
|
|
|
290
292
|
if isinstance(self.app_instance._state_manager, StateManagerRedis):
|
|
291
293
|
# Create our own redis connection for testing.
|
|
292
294
|
self.state_manager = StateManagerRedis.create(self.app_instance.state)
|
|
295
|
+
elif isinstance(self.app_instance._state_manager, StateManagerDisk):
|
|
296
|
+
self.state_manager = StateManagerDisk.create(self.app_instance.state)
|
|
293
297
|
else:
|
|
294
298
|
self.state_manager = self.app_instance._state_manager
|
|
295
299
|
|
|
@@ -327,7 +331,8 @@ class AppHarness:
|
|
|
327
331
|
)
|
|
328
332
|
)
|
|
329
333
|
self.backend.shutdown = self._get_backend_shutdown_handler()
|
|
330
|
-
|
|
334
|
+
with chdir(self.app_path):
|
|
335
|
+
self.backend_thread = threading.Thread(target=self.backend.run)
|
|
331
336
|
self.backend_thread.start()
|
|
332
337
|
|
|
333
338
|
async def _reset_backend_state_manager(self):
|
|
@@ -787,7 +792,7 @@ class AppHarness:
|
|
|
787
792
|
raise RuntimeError("App is not running.")
|
|
788
793
|
state_manager = self.app_instance.state_manager
|
|
789
794
|
assert isinstance(
|
|
790
|
-
state_manager, StateManagerMemory
|
|
795
|
+
state_manager, (StateManagerMemory, StateManagerDisk)
|
|
791
796
|
), "Only works with memory state manager"
|
|
792
797
|
if not self._poll_for(
|
|
793
798
|
target=lambda: state_manager.states,
|
reflex/utils/exceptions.py
CHANGED
|
@@ -79,3 +79,35 @@ class LockExpiredError(ReflexError):
|
|
|
79
79
|
|
|
80
80
|
class MatchTypeError(ReflexError, TypeError):
|
|
81
81
|
"""Raised when the return types of match cases are different."""
|
|
82
|
+
|
|
83
|
+
|
|
84
|
+
class EventHandlerArgMismatch(ReflexError, TypeError):
|
|
85
|
+
"""Raised when the number of args accepted by an EventHandler is differs from that provided by the event trigger."""
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
class EventFnArgMismatch(ReflexError, TypeError):
|
|
89
|
+
"""Raised when the number of args accepted by a lambda differs from that provided by the event trigger."""
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
class DynamicRouteArgShadowsStateVar(ReflexError, NameError):
|
|
93
|
+
"""Raised when a dynamic route arg shadows a state var."""
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
class ComputedVarShadowsStateVar(ReflexError, NameError):
|
|
97
|
+
"""Raised when a computed var shadows a state var."""
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
class ComputedVarShadowsBaseVars(ReflexError, NameError):
|
|
101
|
+
"""Raised when a computed var shadows a base var."""
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class EventHandlerShadowsBuiltInStateMethod(ReflexError, NameError):
|
|
105
|
+
"""Raised when an event handler shadows a built-in state method."""
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class GeneratedCodeHasNoFunctionDefs(ReflexError):
|
|
109
|
+
"""Raised when refactored code generated with flexgen has no functions defined."""
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class PrimitiveUnserializableToJSON(ReflexError, ValueError):
|
|
113
|
+
"""Raised when a primitive type is unserializable to JSON. Usually with NaN and Infinity."""
|
reflex/utils/exec.py
CHANGED
|
@@ -18,22 +18,11 @@ from reflex import constants
|
|
|
18
18
|
from reflex.config import get_config
|
|
19
19
|
from reflex.utils import console, path_ops
|
|
20
20
|
from reflex.utils.prerequisites import get_web_dir
|
|
21
|
-
from reflex.utils.watch import AssetFolderWatch
|
|
22
21
|
|
|
23
22
|
# For uvicorn windows bug fix (#2335)
|
|
24
23
|
frontend_process = None
|
|
25
24
|
|
|
26
25
|
|
|
27
|
-
def start_watching_assets_folder(root):
|
|
28
|
-
"""Start watching assets folder.
|
|
29
|
-
|
|
30
|
-
Args:
|
|
31
|
-
root: root path of the project.
|
|
32
|
-
"""
|
|
33
|
-
asset_watch = AssetFolderWatch(root)
|
|
34
|
-
asset_watch.start()
|
|
35
|
-
|
|
36
|
-
|
|
37
26
|
def detect_package_change(json_file_path: str) -> str:
|
|
38
27
|
"""Calculates the SHA-256 hash of a JSON file and returns it as a hexadecimal string.
|
|
39
28
|
|
|
@@ -149,8 +138,6 @@ def run_frontend(root: Path, port: str, backend_present=True):
|
|
|
149
138
|
"""
|
|
150
139
|
from reflex.utils import prerequisites
|
|
151
140
|
|
|
152
|
-
# Start watching asset folder.
|
|
153
|
-
start_watching_assets_folder(root)
|
|
154
141
|
# validate dependencies before run
|
|
155
142
|
prerequisites.validate_frontend_dependencies(init=False)
|
|
156
143
|
|
|
@@ -215,7 +202,6 @@ def run_backend(
|
|
|
215
202
|
log_level=loglevel.value,
|
|
216
203
|
reload=True,
|
|
217
204
|
reload_dirs=[config.app_name],
|
|
218
|
-
reload_excludes=[str(web_dir)],
|
|
219
205
|
)
|
|
220
206
|
|
|
221
207
|
|