reflex 0.7.14a5__py3-none-any.whl → 0.8.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/app/rxconfig.py.jinja2 +4 -1
- reflex/.templates/jinja/web/package.json.jinja2 +1 -1
- reflex/.templates/jinja/web/pages/_app.js.jinja2 +16 -10
- reflex/.templates/jinja/web/pages/_document.js.jinja2 +1 -1
- reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -1
- reflex/.templates/jinja/web/utils/context.js.jinja2 +25 -6
- reflex/.templates/web/app/entry.client.js +8 -0
- reflex/.templates/web/app/routes.js +10 -0
- reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +12 -32
- reflex/.templates/web/postcss.config.js +1 -1
- reflex/.templates/web/react-router.config.js +6 -0
- reflex/.templates/web/utils/client_side_routing.js +21 -19
- reflex/.templates/web/utils/react-theme.js +89 -0
- reflex/.templates/web/utils/state.js +155 -67
- reflex/.templates/web/vite.config.js +32 -0
- reflex/__init__.py +1 -6
- reflex/__init__.pyi +0 -4
- reflex/app.py +69 -132
- reflex/base.py +1 -87
- reflex/compiler/compiler.py +40 -3
- reflex/compiler/utils.py +54 -28
- reflex/components/__init__.py +0 -2
- reflex/components/__init__.pyi +0 -3
- reflex/components/base/__init__.py +1 -5
- reflex/components/base/__init__.pyi +4 -6
- reflex/components/base/app_wrap.pyi +5 -4
- reflex/components/base/body.pyi +5 -4
- reflex/components/base/document.py +18 -14
- reflex/components/base/document.pyi +83 -27
- reflex/components/base/error_boundary.pyi +5 -4
- reflex/components/base/fragment.pyi +5 -4
- reflex/components/base/link.pyi +9 -7
- reflex/components/base/meta.pyi +17 -13
- reflex/components/base/script.py +60 -58
- reflex/components/base/script.pyi +246 -31
- reflex/components/base/strict_mode.pyi +5 -4
- reflex/components/component.py +109 -194
- reflex/components/core/__init__.py +1 -0
- reflex/components/core/__init__.pyi +1 -0
- reflex/components/core/auto_scroll.pyi +5 -4
- reflex/components/core/banner.pyi +25 -19
- reflex/components/core/client_side_routing.py +7 -6
- reflex/components/core/client_side_routing.pyi +6 -56
- reflex/components/core/clipboard.pyi +5 -4
- reflex/components/core/debounce.py +1 -0
- reflex/components/core/debounce.pyi +5 -4
- reflex/components/core/foreach.py +3 -2
- reflex/components/core/helmet.py +14 -0
- reflex/components/{next/base.pyi → core/helmet.pyi} +10 -7
- reflex/components/core/html.pyi +5 -4
- reflex/components/core/sticky.pyi +17 -13
- reflex/components/core/upload.py +2 -1
- reflex/components/core/upload.pyi +21 -16
- reflex/components/datadisplay/code.pyi +9 -7
- reflex/components/datadisplay/dataeditor.pyi +5 -4
- reflex/components/datadisplay/shiki_code_block.pyi +13 -10
- reflex/components/dynamic.py +4 -5
- reflex/components/el/element.pyi +5 -4
- reflex/components/el/elements/base.pyi +5 -4
- reflex/components/el/elements/forms.pyi +69 -52
- reflex/components/el/elements/inline.pyi +113 -85
- reflex/components/el/elements/media.pyi +105 -79
- reflex/components/el/elements/metadata.pyi +25 -19
- reflex/components/el/elements/other.pyi +29 -22
- reflex/components/el/elements/scripts.pyi +13 -10
- reflex/components/el/elements/sectioning.pyi +61 -46
- reflex/components/el/elements/tables.pyi +41 -31
- reflex/components/el/elements/typography.pyi +61 -46
- reflex/components/field.py +175 -0
- reflex/components/gridjs/datatable.py +2 -2
- reflex/components/gridjs/datatable.pyi +11 -9
- reflex/components/lucide/icon.py +6 -2
- reflex/components/lucide/icon.pyi +15 -10
- reflex/components/markdown/markdown.pyi +5 -4
- reflex/components/moment/moment.pyi +5 -4
- reflex/components/plotly/plotly.pyi +19 -10
- reflex/components/props.py +376 -27
- reflex/components/radix/primitives/accordion.py +8 -1
- reflex/components/radix/primitives/accordion.pyi +29 -22
- reflex/components/radix/primitives/base.pyi +9 -7
- reflex/components/radix/primitives/drawer.pyi +45 -34
- reflex/components/radix/primitives/form.pyi +41 -31
- reflex/components/radix/primitives/progress.pyi +21 -16
- reflex/components/radix/primitives/slider.pyi +21 -16
- reflex/components/radix/themes/base.py +3 -3
- reflex/components/radix/themes/base.pyi +33 -25
- reflex/components/radix/themes/color_mode.pyi +13 -10
- reflex/components/radix/themes/components/alert_dialog.pyi +29 -22
- reflex/components/radix/themes/components/aspect_ratio.pyi +5 -4
- reflex/components/radix/themes/components/avatar.pyi +5 -4
- reflex/components/radix/themes/components/badge.pyi +5 -4
- reflex/components/radix/themes/components/button.pyi +5 -4
- reflex/components/radix/themes/components/callout.pyi +21 -16
- reflex/components/radix/themes/components/card.pyi +5 -4
- reflex/components/radix/themes/components/checkbox.pyi +13 -10
- reflex/components/radix/themes/components/checkbox_cards.pyi +9 -7
- reflex/components/radix/themes/components/checkbox_group.pyi +9 -7
- reflex/components/radix/themes/components/context_menu.pyi +53 -40
- reflex/components/radix/themes/components/data_list.pyi +17 -13
- reflex/components/radix/themes/components/dialog.pyi +29 -22
- reflex/components/radix/themes/components/dropdown_menu.pyi +33 -25
- reflex/components/radix/themes/components/hover_card.pyi +17 -13
- reflex/components/radix/themes/components/icon_button.pyi +5 -4
- reflex/components/radix/themes/components/inset.pyi +5 -4
- reflex/components/radix/themes/components/popover.pyi +17 -13
- reflex/components/radix/themes/components/progress.pyi +5 -4
- reflex/components/radix/themes/components/radio.pyi +5 -4
- reflex/components/radix/themes/components/radio_cards.pyi +9 -7
- reflex/components/radix/themes/components/radio_group.pyi +17 -13
- reflex/components/radix/themes/components/scroll_area.pyi +5 -4
- reflex/components/radix/themes/components/segmented_control.pyi +9 -7
- reflex/components/radix/themes/components/select.pyi +37 -28
- reflex/components/radix/themes/components/separator.pyi +5 -4
- reflex/components/radix/themes/components/skeleton.pyi +5 -4
- reflex/components/radix/themes/components/slider.pyi +5 -4
- reflex/components/radix/themes/components/spinner.pyi +5 -4
- reflex/components/radix/themes/components/switch.pyi +5 -4
- reflex/components/radix/themes/components/table.pyi +29 -22
- reflex/components/radix/themes/components/tabs.pyi +21 -16
- reflex/components/radix/themes/components/text_area.pyi +5 -4
- reflex/components/radix/themes/components/text_field.pyi +13 -10
- reflex/components/radix/themes/components/tooltip.pyi +5 -4
- reflex/components/radix/themes/layout/base.pyi +5 -4
- reflex/components/radix/themes/layout/box.pyi +5 -4
- reflex/components/radix/themes/layout/center.pyi +5 -4
- reflex/components/radix/themes/layout/container.pyi +5 -4
- reflex/components/radix/themes/layout/flex.pyi +5 -4
- reflex/components/radix/themes/layout/grid.pyi +5 -4
- reflex/components/radix/themes/layout/list.pyi +21 -16
- reflex/components/radix/themes/layout/section.pyi +5 -4
- reflex/components/radix/themes/layout/spacer.pyi +5 -4
- reflex/components/radix/themes/layout/stack.pyi +13 -10
- reflex/components/radix/themes/typography/blockquote.pyi +5 -4
- reflex/components/radix/themes/typography/code.pyi +5 -4
- reflex/components/radix/themes/typography/heading.pyi +5 -4
- reflex/components/radix/themes/typography/link.py +42 -9
- reflex/components/radix/themes/typography/link.pyi +311 -6
- reflex/components/radix/themes/typography/text.pyi +29 -22
- reflex/components/react_player/audio.pyi +5 -4
- reflex/components/react_player/react_player.pyi +5 -4
- reflex/components/react_player/video.pyi +5 -4
- reflex/components/recharts/cartesian.py +2 -1
- reflex/components/recharts/cartesian.pyi +65 -46
- reflex/components/recharts/charts.py +4 -2
- reflex/components/recharts/charts.pyi +36 -24
- reflex/components/recharts/general.pyi +24 -18
- reflex/components/recharts/polar.py +8 -4
- reflex/components/recharts/polar.pyi +16 -10
- reflex/components/recharts/recharts.pyi +9 -7
- reflex/components/sonner/toast.py +2 -2
- reflex/components/sonner/toast.pyi +7 -6
- reflex/config.py +3 -77
- reflex/constants/__init__.py +1 -0
- reflex/constants/base.py +38 -8
- reflex/constants/compiler.py +4 -2
- reflex/constants/event.py +1 -0
- reflex/constants/installer.py +23 -16
- reflex/constants/state.py +2 -0
- reflex/custom_components/custom_components.py +0 -14
- reflex/environment.py +1 -1
- reflex/event.py +178 -81
- reflex/experimental/__init__.py +0 -30
- reflex/istate/proxy.py +5 -3
- reflex/page.py +0 -27
- reflex/plugins/__init__.py +3 -2
- reflex/plugins/base.py +5 -1
- reflex/plugins/shared_tailwind.py +158 -0
- reflex/plugins/sitemap.py +206 -0
- reflex/plugins/tailwind_v3.py +13 -106
- reflex/plugins/tailwind_v4.py +15 -108
- reflex/reflex.py +1 -0
- reflex/state.py +134 -140
- reflex/testing.py +57 -9
- reflex/utils/build.py +9 -69
- reflex/utils/exec.py +59 -161
- reflex/utils/export.py +1 -1
- reflex/utils/imports.py +0 -4
- reflex/utils/misc.py +28 -0
- reflex/utils/prerequisites.py +62 -59
- reflex/utils/processes.py +6 -6
- reflex/utils/pyi_generator.py +21 -9
- reflex/utils/serializers.py +14 -1
- reflex/utils/types.py +196 -61
- reflex/vars/__init__.py +2 -0
- reflex/vars/base.py +367 -134
- {reflex-0.7.14a5.dist-info → reflex-0.8.0a1.dist-info}/METADATA +12 -5
- {reflex-0.7.14a5.dist-info → reflex-0.8.0a1.dist-info}/RECORD +190 -196
- reflex/.templates/web/next.config.js +0 -7
- reflex/components/base/head.py +0 -20
- reflex/components/base/head.pyi +0 -116
- reflex/components/next/__init__.py +0 -10
- reflex/components/next/base.py +0 -7
- reflex/components/next/image.py +0 -117
- reflex/components/next/image.pyi +0 -94
- reflex/components/next/link.py +0 -20
- reflex/components/next/link.pyi +0 -67
- reflex/components/next/video.py +0 -38
- reflex/components/next/video.pyi +0 -68
- reflex/components/suneditor/__init__.py +0 -5
- reflex/components/suneditor/editor.py +0 -269
- reflex/components/suneditor/editor.pyi +0 -199
- reflex/experimental/layout.py +0 -254
- {reflex-0.7.14a5.dist-info → reflex-0.8.0a1.dist-info}/WHEEL +0 -0
- {reflex-0.7.14a5.dist-info → reflex-0.8.0a1.dist-info}/entry_points.txt +0 -0
- {reflex-0.7.14a5.dist-info → reflex-0.8.0a1.dist-info}/licenses/LICENSE +0 -0
reflex/components/component.py
CHANGED
|
@@ -7,7 +7,6 @@ import copy
|
|
|
7
7
|
import dataclasses
|
|
8
8
|
import functools
|
|
9
9
|
import inspect
|
|
10
|
-
import sys
|
|
11
10
|
import typing
|
|
12
11
|
from abc import ABC, ABCMeta, abstractmethod
|
|
13
12
|
from collections.abc import Callable, Iterator, Mapping, Sequence
|
|
@@ -15,27 +14,17 @@ from dataclasses import _MISSING_TYPE, MISSING
|
|
|
15
14
|
from functools import wraps
|
|
16
15
|
from hashlib import md5
|
|
17
16
|
from types import SimpleNamespace
|
|
18
|
-
from typing import
|
|
19
|
-
TYPE_CHECKING,
|
|
20
|
-
Annotated,
|
|
21
|
-
Any,
|
|
22
|
-
ClassVar,
|
|
23
|
-
ForwardRef,
|
|
24
|
-
Generic,
|
|
25
|
-
TypeVar,
|
|
26
|
-
_eval_type, # pyright: ignore [reportAttributeAccessIssue]
|
|
27
|
-
cast,
|
|
28
|
-
get_args,
|
|
29
|
-
get_origin,
|
|
30
|
-
)
|
|
17
|
+
from typing import TYPE_CHECKING, Any, ClassVar, TypeVar, cast, get_args, get_origin
|
|
31
18
|
|
|
32
19
|
from rich.markup import escape
|
|
33
20
|
from typing_extensions import dataclass_transform
|
|
34
21
|
|
|
35
22
|
import reflex.state
|
|
23
|
+
from reflex import constants
|
|
36
24
|
from reflex.compiler.templates import STATEFUL_COMPONENT
|
|
37
25
|
from reflex.components.core.breakpoints import Breakpoints
|
|
38
26
|
from reflex.components.dynamic import load_dynamic_serializer
|
|
27
|
+
from reflex.components.field import BaseField, FieldBasedMeta
|
|
39
28
|
from reflex.components.tags import Tag
|
|
40
29
|
from reflex.constants import (
|
|
41
30
|
Dirs,
|
|
@@ -55,6 +44,7 @@ from reflex.event import (
|
|
|
55
44
|
EventSpec,
|
|
56
45
|
no_args_event_spec,
|
|
57
46
|
parse_args_spec,
|
|
47
|
+
pointer_event_spec,
|
|
58
48
|
run_script,
|
|
59
49
|
unwrap_var_annotation,
|
|
60
50
|
)
|
|
@@ -74,50 +64,10 @@ from reflex.vars.number import ternary_operation
|
|
|
74
64
|
from reflex.vars.object import ObjectVar
|
|
75
65
|
from reflex.vars.sequence import LiteralArrayVar, LiteralStringVar, StringVar
|
|
76
66
|
|
|
77
|
-
|
|
78
|
-
def resolve_annotations(
|
|
79
|
-
raw_annotations: Mapping[str, type[Any]], module_name: str | None
|
|
80
|
-
) -> dict[str, type[Any]]:
|
|
81
|
-
"""Partially taken from typing.get_type_hints.
|
|
82
|
-
|
|
83
|
-
Resolve string or ForwardRef annotations into type objects if possible.
|
|
84
|
-
|
|
85
|
-
Args:
|
|
86
|
-
raw_annotations: The raw annotations to resolve.
|
|
87
|
-
module_name: The name of the module.
|
|
88
|
-
|
|
89
|
-
Returns:
|
|
90
|
-
The resolved annotations.
|
|
91
|
-
"""
|
|
92
|
-
module = sys.modules.get(module_name, None) if module_name is not None else None
|
|
93
|
-
|
|
94
|
-
base_globals: dict[str, Any] | None = (
|
|
95
|
-
module.__dict__ if module is not None else None
|
|
96
|
-
)
|
|
97
|
-
|
|
98
|
-
annotations = {}
|
|
99
|
-
for name, value in raw_annotations.items():
|
|
100
|
-
if isinstance(value, str):
|
|
101
|
-
if sys.version_info == (3, 10, 0):
|
|
102
|
-
value = ForwardRef(value, is_argument=False)
|
|
103
|
-
else:
|
|
104
|
-
value = ForwardRef(value, is_argument=False, is_class=True)
|
|
105
|
-
try:
|
|
106
|
-
if sys.version_info >= (3, 13):
|
|
107
|
-
value = _eval_type(value, base_globals, None, type_params=())
|
|
108
|
-
else:
|
|
109
|
-
value = _eval_type(value, base_globals, None)
|
|
110
|
-
except NameError:
|
|
111
|
-
# this is ok, it can be fixed with update_forward_refs
|
|
112
|
-
pass
|
|
113
|
-
annotations[name] = value
|
|
114
|
-
return annotations
|
|
115
|
-
|
|
116
|
-
|
|
117
67
|
FIELD_TYPE = TypeVar("FIELD_TYPE")
|
|
118
68
|
|
|
119
69
|
|
|
120
|
-
class ComponentField(
|
|
70
|
+
class ComponentField(BaseField[FIELD_TYPE]):
|
|
121
71
|
"""A field for a component."""
|
|
122
72
|
|
|
123
73
|
def __init__(
|
|
@@ -135,30 +85,8 @@ class ComponentField(Generic[FIELD_TYPE]):
|
|
|
135
85
|
is_javascript: Whether the field is a javascript property.
|
|
136
86
|
annotated_type: The annotated type for the field.
|
|
137
87
|
"""
|
|
138
|
-
|
|
139
|
-
self.default_factory = default_factory
|
|
88
|
+
super().__init__(default, default_factory, annotated_type)
|
|
140
89
|
self.is_javascript = is_javascript
|
|
141
|
-
self.outer_type_ = self.annotated_type = annotated_type
|
|
142
|
-
type_origin = get_origin(annotated_type) or annotated_type
|
|
143
|
-
if type_origin is Annotated:
|
|
144
|
-
type_origin = annotated_type.__origin__ # pyright: ignore [reportAttributeAccessIssue]
|
|
145
|
-
self.type_ = self.type_origin = type_origin
|
|
146
|
-
|
|
147
|
-
def default_value(self) -> FIELD_TYPE:
|
|
148
|
-
"""Get the default value for the field.
|
|
149
|
-
|
|
150
|
-
Returns:
|
|
151
|
-
The default value for the field.
|
|
152
|
-
|
|
153
|
-
Raises:
|
|
154
|
-
ValueError: If no default value or factory is provided.
|
|
155
|
-
"""
|
|
156
|
-
if self.default is not MISSING:
|
|
157
|
-
return self.default
|
|
158
|
-
if self.default_factory is not None:
|
|
159
|
-
return self.default_factory()
|
|
160
|
-
msg = "No default value or factory provided."
|
|
161
|
-
raise ValueError(msg)
|
|
162
90
|
|
|
163
91
|
def __repr__(self) -> str:
|
|
164
92
|
"""Represent the field in a readable format.
|
|
@@ -205,7 +133,7 @@ def field(
|
|
|
205
133
|
|
|
206
134
|
|
|
207
135
|
@dataclass_transform(kw_only_default=True, field_specifiers=(field,))
|
|
208
|
-
class BaseComponentMeta(ABCMeta):
|
|
136
|
+
class BaseComponentMeta(FieldBasedMeta, ABCMeta):
|
|
209
137
|
"""Meta class for BaseComponent."""
|
|
210
138
|
|
|
211
139
|
if TYPE_CHECKING:
|
|
@@ -214,46 +142,24 @@ class BaseComponentMeta(ABCMeta):
|
|
|
214
142
|
_fields: Mapping[str, ComponentField]
|
|
215
143
|
_js_fields: Mapping[str, ComponentField]
|
|
216
144
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
bases: The bases of the class.
|
|
223
|
-
namespace: The namespace of the class.
|
|
224
|
-
|
|
225
|
-
Returns:
|
|
226
|
-
The new class.
|
|
227
|
-
"""
|
|
228
|
-
# Add the field to the class
|
|
229
|
-
inherited_fields: dict[str, ComponentField] = {}
|
|
230
|
-
own_fields: dict[str, ComponentField] = {}
|
|
231
|
-
resolved_annotations = resolve_annotations(
|
|
145
|
+
@classmethod
|
|
146
|
+
def _resolve_annotations(
|
|
147
|
+
cls, namespace: dict[str, Any], name: str
|
|
148
|
+
) -> dict[str, Any]:
|
|
149
|
+
return types.resolve_annotations(
|
|
232
150
|
namespace.get("__annotations__", {}), namespace["__module__"]
|
|
233
151
|
)
|
|
234
152
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
(key, value, inherited_field)
|
|
244
|
-
for key, value in namespace.items()
|
|
245
|
-
if key not in resolved_annotations
|
|
246
|
-
and ((inherited_field := inherited_fields.get(key)) is not None)
|
|
247
|
-
]:
|
|
248
|
-
new_value = ComponentField(
|
|
249
|
-
default=value,
|
|
250
|
-
is_javascript=inherited_field.is_javascript,
|
|
251
|
-
annotated_type=inherited_field.annotated_type,
|
|
252
|
-
)
|
|
253
|
-
|
|
254
|
-
own_fields[key] = new_value
|
|
153
|
+
@classmethod
|
|
154
|
+
def _process_annotated_fields(
|
|
155
|
+
cls,
|
|
156
|
+
namespace: dict[str, Any],
|
|
157
|
+
annotations: dict[str, Any],
|
|
158
|
+
inherited_fields: dict[str, ComponentField],
|
|
159
|
+
) -> dict[str, ComponentField]:
|
|
160
|
+
own_fields: dict[str, ComponentField] = {}
|
|
255
161
|
|
|
256
|
-
for key, annotation in
|
|
162
|
+
for key, annotation in annotations.items():
|
|
257
163
|
value = namespace.get(key, MISSING)
|
|
258
164
|
|
|
259
165
|
if types.is_classvar(annotation):
|
|
@@ -286,16 +192,63 @@ class BaseComponentMeta(ABCMeta):
|
|
|
286
192
|
|
|
287
193
|
own_fields[key] = value
|
|
288
194
|
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
195
|
+
return own_fields
|
|
196
|
+
|
|
197
|
+
@classmethod
|
|
198
|
+
def _create_field(
|
|
199
|
+
cls,
|
|
200
|
+
annotated_type: Any,
|
|
201
|
+
default: Any = MISSING,
|
|
202
|
+
default_factory: Callable[[], Any] | None = None,
|
|
203
|
+
) -> ComponentField:
|
|
204
|
+
return ComponentField(
|
|
205
|
+
annotated_type=annotated_type,
|
|
206
|
+
default=default,
|
|
207
|
+
default_factory=default_factory,
|
|
208
|
+
is_javascript=True, # Default for components
|
|
209
|
+
)
|
|
210
|
+
|
|
211
|
+
@classmethod
|
|
212
|
+
def _process_field_overrides(
|
|
213
|
+
cls,
|
|
214
|
+
namespace: dict[str, Any],
|
|
215
|
+
annotations: dict[str, Any],
|
|
216
|
+
inherited_fields: dict[str, Any],
|
|
217
|
+
) -> dict[str, ComponentField]:
|
|
218
|
+
own_fields: dict[str, ComponentField] = {}
|
|
219
|
+
|
|
220
|
+
for key, value, inherited_field in [
|
|
221
|
+
(key, value, inherited_field)
|
|
222
|
+
for key, value in namespace.items()
|
|
223
|
+
if key not in annotations
|
|
224
|
+
and ((inherited_field := inherited_fields.get(key)) is not None)
|
|
225
|
+
]:
|
|
226
|
+
new_field = ComponentField(
|
|
227
|
+
default=value,
|
|
228
|
+
is_javascript=inherited_field.is_javascript,
|
|
229
|
+
annotated_type=inherited_field.annotated_type,
|
|
230
|
+
)
|
|
231
|
+
own_fields[key] = new_field
|
|
232
|
+
|
|
233
|
+
return own_fields
|
|
234
|
+
|
|
235
|
+
@classmethod
|
|
236
|
+
def _finalize_fields(
|
|
237
|
+
cls,
|
|
238
|
+
namespace: dict[str, Any],
|
|
239
|
+
inherited_fields: dict[str, ComponentField],
|
|
240
|
+
own_fields: dict[str, ComponentField],
|
|
241
|
+
) -> None:
|
|
242
|
+
# Call parent implementation
|
|
243
|
+
super()._finalize_fields(namespace, inherited_fields, own_fields)
|
|
244
|
+
|
|
245
|
+
# Add JavaScript fields mapping
|
|
246
|
+
all_fields = namespace["_fields"]
|
|
293
247
|
namespace["_js_fields"] = {
|
|
294
248
|
key: value
|
|
295
249
|
for key, value in all_fields.items()
|
|
296
250
|
if value.is_javascript is True
|
|
297
251
|
}
|
|
298
|
-
return super().__new__(cls, name, bases, namespace)
|
|
299
252
|
|
|
300
253
|
|
|
301
254
|
class BaseComponent(metaclass=BaseComponentMeta):
|
|
@@ -317,11 +270,6 @@ class BaseComponent(metaclass=BaseComponentMeta):
|
|
|
317
270
|
default_factory=list, is_javascript_property=False
|
|
318
271
|
)
|
|
319
272
|
|
|
320
|
-
# List here the dependencies that need to be transpiled by Next.js
|
|
321
|
-
transpile_packages: list[str] = field(
|
|
322
|
-
default_factory=list, is_javascript_property=False
|
|
323
|
-
)
|
|
324
|
-
|
|
325
273
|
# The tag to use when rendering the component.
|
|
326
274
|
tag: str | None = field(default=None, is_javascript_property=False)
|
|
327
275
|
|
|
@@ -504,12 +452,9 @@ def satisfies_type_hint(obj: Any, type_hint: Any) -> bool:
|
|
|
504
452
|
if not isinstance(obj, Var)
|
|
505
453
|
else (obj._var_value if isinstance(obj, LiteralVar) else obj)
|
|
506
454
|
)
|
|
507
|
-
console.
|
|
508
|
-
"
|
|
509
|
-
|
|
510
|
-
+ f"Passed {obj!s} of type {escape(str(type(obj) if not isinstance(obj, Var) else obj._var_type))} to {escape(str(type_hint))}.",
|
|
511
|
-
deprecation_version="0.7.2",
|
|
512
|
-
removal_version="0.8.0",
|
|
455
|
+
console.warn(
|
|
456
|
+
"Passing None to a Var that is not explicitly marked as Optional (| None) is deprecated. "
|
|
457
|
+
f"Passed {obj!s} of type {escape(str(type(obj) if not isinstance(obj, Var) else obj._var_type))} to {escape(str(type_hint))}."
|
|
513
458
|
)
|
|
514
459
|
return True
|
|
515
460
|
return False
|
|
@@ -534,12 +479,12 @@ def _components_from(
|
|
|
534
479
|
return ()
|
|
535
480
|
|
|
536
481
|
|
|
537
|
-
DEFAULT_TRIGGERS:
|
|
482
|
+
DEFAULT_TRIGGERS: Mapping[str, types.ArgsSpec | Sequence[types.ArgsSpec]] = {
|
|
538
483
|
EventTriggers.ON_FOCUS: no_args_event_spec,
|
|
539
484
|
EventTriggers.ON_BLUR: no_args_event_spec,
|
|
540
|
-
EventTriggers.ON_CLICK:
|
|
541
|
-
EventTriggers.ON_CONTEXT_MENU:
|
|
542
|
-
EventTriggers.ON_DOUBLE_CLICK:
|
|
485
|
+
EventTriggers.ON_CLICK: pointer_event_spec, # pyright: ignore [reportAssignmentType]
|
|
486
|
+
EventTriggers.ON_CONTEXT_MENU: pointer_event_spec, # pyright: ignore [reportAssignmentType]
|
|
487
|
+
EventTriggers.ON_DOUBLE_CLICK: pointer_event_spec, # pyright: ignore [reportAssignmentType]
|
|
543
488
|
EventTriggers.ON_MOUSE_DOWN: no_args_event_spec,
|
|
544
489
|
EventTriggers.ON_MOUSE_ENTER: no_args_event_spec,
|
|
545
490
|
EventTriggers.ON_MOUSE_LEAVE: no_args_event_spec,
|
|
@@ -548,6 +493,7 @@ DEFAULT_TRIGGERS: dict[str, types.ArgsSpec | Sequence[types.ArgsSpec]] = {
|
|
|
548
493
|
EventTriggers.ON_MOUSE_OVER: no_args_event_spec,
|
|
549
494
|
EventTriggers.ON_MOUSE_UP: no_args_event_spec,
|
|
550
495
|
EventTriggers.ON_SCROLL: no_args_event_spec,
|
|
496
|
+
EventTriggers.ON_SCROLL_END: no_args_event_spec,
|
|
551
497
|
EventTriggers.ON_MOUNT: no_args_event_spec,
|
|
552
498
|
EventTriggers.ON_UNMOUNT: no_args_event_spec,
|
|
553
499
|
}
|
|
@@ -728,16 +674,10 @@ class Component(BaseComponent, ABC):
|
|
|
728
674
|
Args:
|
|
729
675
|
**kwargs: The kwargs to pass to the component.
|
|
730
676
|
"""
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
console.deprecate(
|
|
735
|
-
"component-direct-instantiation",
|
|
736
|
-
reason="Use the `create` method instead.",
|
|
737
|
-
deprecation_version="0.7.2",
|
|
738
|
-
removal_version="0.8.0",
|
|
677
|
+
console.error(
|
|
678
|
+
"Instantiating components directly is not supported."
|
|
679
|
+
f" Use `{self.__class__.__name__}.create` method instead."
|
|
739
680
|
)
|
|
740
|
-
self._post_init(**kwargs)
|
|
741
681
|
|
|
742
682
|
def _post_init(self, *args, **kwargs):
|
|
743
683
|
"""Initialize the component.
|
|
@@ -907,9 +847,8 @@ class Component(BaseComponent, ABC):
|
|
|
907
847
|
for key, value in kwargs.items():
|
|
908
848
|
setattr(self, key, value)
|
|
909
849
|
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
) -> dict[str, types.ArgsSpec | Sequence[types.ArgsSpec]]:
|
|
850
|
+
@classmethod
|
|
851
|
+
def get_event_triggers(cls) -> dict[str, types.ArgsSpec | Sequence[types.ArgsSpec]]:
|
|
913
852
|
"""Get the event triggers for the component.
|
|
914
853
|
|
|
915
854
|
Returns:
|
|
@@ -926,9 +865,9 @@ class Component(BaseComponent, ABC):
|
|
|
926
865
|
)
|
|
927
866
|
else no_args_event_spec
|
|
928
867
|
)
|
|
929
|
-
for name, field in
|
|
868
|
+
for name, field in cls.get_fields().items()
|
|
930
869
|
if field.type_origin is EventHandler
|
|
931
|
-
}
|
|
870
|
+
} # pyright: ignore [reportOperatorIssue]
|
|
932
871
|
|
|
933
872
|
def __repr__(self) -> str:
|
|
934
873
|
"""Represent the component in React.
|
|
@@ -1607,20 +1546,6 @@ class Component(BaseComponent, ABC):
|
|
|
1607
1546
|
# Return the dynamic imports
|
|
1608
1547
|
return dynamic_imports
|
|
1609
1548
|
|
|
1610
|
-
def _should_transpile(self, dep: str | None) -> bool:
|
|
1611
|
-
"""Check if a dependency should be transpiled.
|
|
1612
|
-
|
|
1613
|
-
Args:
|
|
1614
|
-
dep: The dependency to check.
|
|
1615
|
-
|
|
1616
|
-
Returns:
|
|
1617
|
-
True if the dependency should be transpiled.
|
|
1618
|
-
"""
|
|
1619
|
-
return bool(self.transpile_packages) and (
|
|
1620
|
-
dep in self.transpile_packages
|
|
1621
|
-
or format.format_library_name(dep or "") in self.transpile_packages
|
|
1622
|
-
)
|
|
1623
|
-
|
|
1624
1549
|
def _get_dependencies_imports(self) -> ParsedImportDict:
|
|
1625
1550
|
"""Get the imports from lib_dependencies for installing.
|
|
1626
1551
|
|
|
@@ -1628,14 +1553,7 @@ class Component(BaseComponent, ABC):
|
|
|
1628
1553
|
The dependencies imports of the component.
|
|
1629
1554
|
"""
|
|
1630
1555
|
return {
|
|
1631
|
-
dep: [
|
|
1632
|
-
ImportVar(
|
|
1633
|
-
tag=None,
|
|
1634
|
-
render=False,
|
|
1635
|
-
transpile=self._should_transpile(dep),
|
|
1636
|
-
)
|
|
1637
|
-
]
|
|
1638
|
-
for dep in self.lib_dependencies
|
|
1556
|
+
dep: [ImportVar(tag=None, render=False)] for dep in self.lib_dependencies
|
|
1639
1557
|
}
|
|
1640
1558
|
|
|
1641
1559
|
def _get_hooks_imports(self) -> ParsedImportDict:
|
|
@@ -1693,7 +1611,7 @@ class Component(BaseComponent, ABC):
|
|
|
1693
1611
|
|
|
1694
1612
|
# Import this component's tag from the main library.
|
|
1695
1613
|
if self.library is not None and self.tag is not None:
|
|
1696
|
-
_imports[self.library] =
|
|
1614
|
+
_imports[self.library] = self.import_var
|
|
1697
1615
|
|
|
1698
1616
|
# Get static imports required for event processing.
|
|
1699
1617
|
event_imports = Imports.EVENTS if self.event_triggers else {}
|
|
@@ -1719,7 +1637,7 @@ class Component(BaseComponent, ABC):
|
|
|
1719
1637
|
return imports.merge_imports(
|
|
1720
1638
|
self._get_dependencies_imports(),
|
|
1721
1639
|
self._get_hooks_imports(),
|
|
1722
|
-
_imports,
|
|
1640
|
+
{**_imports},
|
|
1723
1641
|
event_imports,
|
|
1724
1642
|
*var_imports,
|
|
1725
1643
|
*added_import_dicts,
|
|
@@ -1960,12 +1878,7 @@ class Component(BaseComponent, ABC):
|
|
|
1960
1878
|
# If the tag is dot-qualified, only import the left-most name.
|
|
1961
1879
|
tag = self.tag.partition(".")[0] if self.tag else None
|
|
1962
1880
|
alias = self.alias.partition(".")[0] if self.alias else None
|
|
1963
|
-
return ImportVar(
|
|
1964
|
-
tag=tag,
|
|
1965
|
-
is_default=self.is_default,
|
|
1966
|
-
alias=alias,
|
|
1967
|
-
transpile=self._should_transpile(self.library),
|
|
1968
|
-
)
|
|
1881
|
+
return ImportVar(tag=tag, is_default=self.is_default, alias=alias)
|
|
1969
1882
|
|
|
1970
1883
|
@staticmethod
|
|
1971
1884
|
def _get_app_wrap_components() -> dict[tuple[int, str], Component]:
|
|
@@ -2178,7 +2091,7 @@ class CustomComponent(Component):
|
|
|
2178
2091
|
annotation=arg._var_type,
|
|
2179
2092
|
)
|
|
2180
2093
|
for name, arg in zip(
|
|
2181
|
-
names, parse_args_spec(event.args_spec), strict=True
|
|
2094
|
+
names, parse_args_spec(event.args_spec)[0], strict=True
|
|
2182
2095
|
)
|
|
2183
2096
|
]
|
|
2184
2097
|
)
|
|
@@ -2320,8 +2233,11 @@ class NoSSRComponent(Component):
|
|
|
2320
2233
|
Returns:
|
|
2321
2234
|
The imports for dynamically importing the component at module load time.
|
|
2322
2235
|
"""
|
|
2323
|
-
#
|
|
2324
|
-
dynamic_import = {
|
|
2236
|
+
# React lazy import mechanism.
|
|
2237
|
+
dynamic_import = {
|
|
2238
|
+
"react": [ImportVar(tag="lazy")],
|
|
2239
|
+
f"$/{constants.Dirs.UTILS}/context": [ImportVar(tag="ClientSide")],
|
|
2240
|
+
}
|
|
2325
2241
|
|
|
2326
2242
|
# The normal imports for this component.
|
|
2327
2243
|
_imports = super()._get_imports()
|
|
@@ -2331,13 +2247,7 @@ class NoSSRComponent(Component):
|
|
|
2331
2247
|
if import_name is not None:
|
|
2332
2248
|
with contextlib.suppress(ValueError):
|
|
2333
2249
|
_imports[import_name].remove(self.import_var)
|
|
2334
|
-
_imports[import_name].append(
|
|
2335
|
-
imports.ImportVar(
|
|
2336
|
-
tag=None,
|
|
2337
|
-
render=False,
|
|
2338
|
-
transpile=self._should_transpile(self.library),
|
|
2339
|
-
)
|
|
2340
|
-
)
|
|
2250
|
+
_imports[import_name].append(ImportVar(tag=None, render=False))
|
|
2341
2251
|
|
|
2342
2252
|
return imports.merge_imports(
|
|
2343
2253
|
dynamic_import,
|
|
@@ -2346,8 +2256,6 @@ class NoSSRComponent(Component):
|
|
|
2346
2256
|
)
|
|
2347
2257
|
|
|
2348
2258
|
def _get_dynamic_imports(self) -> str:
|
|
2349
|
-
opts_fragment = ", { ssr: false });"
|
|
2350
|
-
|
|
2351
2259
|
# extract the correct import name from library name
|
|
2352
2260
|
base_import_name = self._get_import_name()
|
|
2353
2261
|
if base_import_name is None:
|
|
@@ -2355,12 +2263,19 @@ class NoSSRComponent(Component):
|
|
|
2355
2263
|
raise ValueError(msg)
|
|
2356
2264
|
import_name = format.format_library_name(base_import_name)
|
|
2357
2265
|
|
|
2358
|
-
library_import = f"
|
|
2266
|
+
library_import = f"import('{import_name}')"
|
|
2359
2267
|
mod_import = (
|
|
2360
2268
|
# https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#with-named-exports
|
|
2361
|
-
f".then((mod) => mod.{self.tag})"
|
|
2269
|
+
f".then((mod) => ({{default: mod.{self.tag}}}))"
|
|
2270
|
+
if not self.is_default
|
|
2271
|
+
else ""
|
|
2272
|
+
)
|
|
2273
|
+
return (
|
|
2274
|
+
f"const {self.alias if self.alias else self.tag} = ClientSide(lazy(() => "
|
|
2275
|
+
+ library_import
|
|
2276
|
+
+ mod_import
|
|
2277
|
+
+ "))"
|
|
2362
2278
|
)
|
|
2363
|
-
return library_import + mod_import + opts_fragment
|
|
2364
2279
|
|
|
2365
2280
|
|
|
2366
2281
|
class StatefulComponent(BaseComponent):
|
|
@@ -25,6 +25,7 @@ from .debounce import DebounceInput as DebounceInput
|
|
|
25
25
|
from .debounce import debounce_input as debounce_input
|
|
26
26
|
from .foreach import Foreach as Foreach
|
|
27
27
|
from .foreach import foreach as foreach
|
|
28
|
+
from .helmet import Helmet as Helmet
|
|
28
29
|
from .html import Html as Html
|
|
29
30
|
from .html import html as html
|
|
30
31
|
from .match import Match as Match
|
|
@@ -8,7 +8,7 @@ from typing import Any, Literal, overload
|
|
|
8
8
|
|
|
9
9
|
from reflex.components.core.breakpoints import Breakpoints
|
|
10
10
|
from reflex.components.el.elements.typography import Div
|
|
11
|
-
from reflex.event import EventType
|
|
11
|
+
from reflex.event import EventType, PointerEventInfo
|
|
12
12
|
from reflex.utils.imports import ImportDict
|
|
13
13
|
from reflex.vars.base import Var
|
|
14
14
|
|
|
@@ -208,9 +208,9 @@ class AutoScroll(Div):
|
|
|
208
208
|
autofocus: bool | None = None,
|
|
209
209
|
custom_attrs: dict[str, Var | Any] | None = None,
|
|
210
210
|
on_blur: EventType[()] | None = None,
|
|
211
|
-
on_click: EventType[()] | None = None,
|
|
212
|
-
on_context_menu: EventType[()] | None = None,
|
|
213
|
-
on_double_click: EventType[()] | None = None,
|
|
211
|
+
on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
212
|
+
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
213
|
+
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
214
214
|
on_focus: EventType[()] | None = None,
|
|
215
215
|
on_mount: EventType[()] | None = None,
|
|
216
216
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -221,6 +221,7 @@ class AutoScroll(Div):
|
|
|
221
221
|
on_mouse_over: EventType[()] | None = None,
|
|
222
222
|
on_mouse_up: EventType[()] | None = None,
|
|
223
223
|
on_scroll: EventType[()] | None = None,
|
|
224
|
+
on_scroll_end: EventType[()] | None = None,
|
|
224
225
|
on_unmount: EventType[()] | None = None,
|
|
225
226
|
**props,
|
|
226
227
|
) -> AutoScroll:
|
|
@@ -12,7 +12,7 @@ from reflex.components.core.breakpoints import Breakpoints
|
|
|
12
12
|
from reflex.components.el.elements.typography import Div
|
|
13
13
|
from reflex.components.lucide.icon import Icon
|
|
14
14
|
from reflex.constants.compiler import CompileVars
|
|
15
|
-
from reflex.event import EventType
|
|
15
|
+
from reflex.event import EventType, PointerEventInfo
|
|
16
16
|
from reflex.utils.imports import ImportVar
|
|
17
17
|
from reflex.vars import VarData
|
|
18
18
|
from reflex.vars.base import Var
|
|
@@ -61,9 +61,9 @@ class ConnectionToaster(Fragment):
|
|
|
61
61
|
autofocus: bool | None = None,
|
|
62
62
|
custom_attrs: dict[str, Var | Any] | None = None,
|
|
63
63
|
on_blur: EventType[()] | None = None,
|
|
64
|
-
on_click: EventType[()] | None = None,
|
|
65
|
-
on_context_menu: EventType[()] | None = None,
|
|
66
|
-
on_double_click: EventType[()] | None = None,
|
|
64
|
+
on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
65
|
+
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
66
|
+
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
67
67
|
on_focus: EventType[()] | None = None,
|
|
68
68
|
on_mount: EventType[()] | None = None,
|
|
69
69
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -74,6 +74,7 @@ class ConnectionToaster(Fragment):
|
|
|
74
74
|
on_mouse_over: EventType[()] | None = None,
|
|
75
75
|
on_mouse_up: EventType[()] | None = None,
|
|
76
76
|
on_scroll: EventType[()] | None = None,
|
|
77
|
+
on_scroll_end: EventType[()] | None = None,
|
|
77
78
|
on_unmount: EventType[()] | None = None,
|
|
78
79
|
**props,
|
|
79
80
|
) -> ConnectionToaster:
|
|
@@ -112,9 +113,9 @@ class ConnectionBanner(Component):
|
|
|
112
113
|
autofocus: bool | None = None,
|
|
113
114
|
custom_attrs: dict[str, Var | Any] | None = None,
|
|
114
115
|
on_blur: EventType[()] | None = None,
|
|
115
|
-
on_click: EventType[()] | None = None,
|
|
116
|
-
on_context_menu: EventType[()] | None = None,
|
|
117
|
-
on_double_click: EventType[()] | None = None,
|
|
116
|
+
on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
117
|
+
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
118
|
+
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
118
119
|
on_focus: EventType[()] | None = None,
|
|
119
120
|
on_mount: EventType[()] | None = None,
|
|
120
121
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -125,6 +126,7 @@ class ConnectionBanner(Component):
|
|
|
125
126
|
on_mouse_over: EventType[()] | None = None,
|
|
126
127
|
on_mouse_up: EventType[()] | None = None,
|
|
127
128
|
on_scroll: EventType[()] | None = None,
|
|
129
|
+
on_scroll_end: EventType[()] | None = None,
|
|
128
130
|
on_unmount: EventType[()] | None = None,
|
|
129
131
|
**props,
|
|
130
132
|
) -> ConnectionBanner:
|
|
@@ -155,9 +157,9 @@ class ConnectionModal(Component):
|
|
|
155
157
|
autofocus: bool | None = None,
|
|
156
158
|
custom_attrs: dict[str, Var | Any] | None = None,
|
|
157
159
|
on_blur: EventType[()] | None = None,
|
|
158
|
-
on_click: EventType[()] | None = None,
|
|
159
|
-
on_context_menu: EventType[()] | None = None,
|
|
160
|
-
on_double_click: EventType[()] | None = None,
|
|
160
|
+
on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
161
|
+
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
162
|
+
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
161
163
|
on_focus: EventType[()] | None = None,
|
|
162
164
|
on_mount: EventType[()] | None = None,
|
|
163
165
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -168,6 +170,7 @@ class ConnectionModal(Component):
|
|
|
168
170
|
on_mouse_over: EventType[()] | None = None,
|
|
169
171
|
on_mouse_up: EventType[()] | None = None,
|
|
170
172
|
on_scroll: EventType[()] | None = None,
|
|
173
|
+
on_scroll_end: EventType[()] | None = None,
|
|
171
174
|
on_unmount: EventType[()] | None = None,
|
|
172
175
|
**props,
|
|
173
176
|
) -> ConnectionModal:
|
|
@@ -199,9 +202,9 @@ class WifiOffPulse(Icon):
|
|
|
199
202
|
autofocus: bool | None = None,
|
|
200
203
|
custom_attrs: dict[str, Var | Any] | None = None,
|
|
201
204
|
on_blur: EventType[()] | None = None,
|
|
202
|
-
on_click: EventType[()] | None = None,
|
|
203
|
-
on_context_menu: EventType[()] | None = None,
|
|
204
|
-
on_double_click: EventType[()] | None = None,
|
|
205
|
+
on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
206
|
+
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
207
|
+
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
205
208
|
on_focus: EventType[()] | None = None,
|
|
206
209
|
on_mount: EventType[()] | None = None,
|
|
207
210
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -212,6 +215,7 @@ class WifiOffPulse(Icon):
|
|
|
212
215
|
on_mouse_over: EventType[()] | None = None,
|
|
213
216
|
on_mouse_up: EventType[()] | None = None,
|
|
214
217
|
on_scroll: EventType[()] | None = None,
|
|
218
|
+
on_scroll_end: EventType[()] | None = None,
|
|
215
219
|
on_unmount: EventType[()] | None = None,
|
|
216
220
|
**props,
|
|
217
221
|
) -> WifiOffPulse:
|
|
@@ -431,9 +435,9 @@ class ConnectionPulser(Div):
|
|
|
431
435
|
autofocus: bool | None = None,
|
|
432
436
|
custom_attrs: dict[str, Var | Any] | None = None,
|
|
433
437
|
on_blur: EventType[()] | None = None,
|
|
434
|
-
on_click: EventType[()] | None = None,
|
|
435
|
-
on_context_menu: EventType[()] | None = None,
|
|
436
|
-
on_double_click: EventType[()] | None = None,
|
|
438
|
+
on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
439
|
+
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
440
|
+
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
437
441
|
on_focus: EventType[()] | None = None,
|
|
438
442
|
on_mount: EventType[()] | None = None,
|
|
439
443
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -444,6 +448,7 @@ class ConnectionPulser(Div):
|
|
|
444
448
|
on_mouse_over: EventType[()] | None = None,
|
|
445
449
|
on_mouse_up: EventType[()] | None = None,
|
|
446
450
|
on_scroll: EventType[()] | None = None,
|
|
451
|
+
on_scroll_end: EventType[()] | None = None,
|
|
447
452
|
on_unmount: EventType[()] | None = None,
|
|
448
453
|
**props,
|
|
449
454
|
) -> ConnectionPulser:
|
|
@@ -675,9 +680,9 @@ class BackendDisabled(Div):
|
|
|
675
680
|
autofocus: bool | None = None,
|
|
676
681
|
custom_attrs: dict[str, Var | Any] | None = None,
|
|
677
682
|
on_blur: EventType[()] | None = None,
|
|
678
|
-
on_click: EventType[()] | None = None,
|
|
679
|
-
on_context_menu: EventType[()] | None = None,
|
|
680
|
-
on_double_click: EventType[()] | None = None,
|
|
683
|
+
on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
684
|
+
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
685
|
+
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
681
686
|
on_focus: EventType[()] | None = None,
|
|
682
687
|
on_mount: EventType[()] | None = None,
|
|
683
688
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -688,6 +693,7 @@ class BackendDisabled(Div):
|
|
|
688
693
|
on_mouse_over: EventType[()] | None = None,
|
|
689
694
|
on_mouse_up: EventType[()] | None = None,
|
|
690
695
|
on_scroll: EventType[()] | None = None,
|
|
696
|
+
on_scroll_end: EventType[()] | None = None,
|
|
691
697
|
on_unmount: EventType[()] | None = None,
|
|
692
698
|
**props,
|
|
693
699
|
) -> BackendDisabled:
|