reflex 0.8.2__py3-none-any.whl → 0.8.3__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.

Files changed (41) hide show
  1. reflex/.templates/web/utils/state.js +7 -2
  2. reflex/__init__.py +1 -0
  3. reflex/__init__.pyi +2 -0
  4. reflex/app.py +8 -11
  5. reflex/compiler/compiler.py +10 -38
  6. reflex/components/base/error_boundary.py +6 -5
  7. reflex/components/base/meta.pyi +4 -256
  8. reflex/components/core/__init__.py +1 -0
  9. reflex/components/core/__init__.pyi +3 -0
  10. reflex/components/core/window_events.py +104 -0
  11. reflex/components/core/window_events.pyi +84 -0
  12. reflex/components/el/__init__.pyi +4 -0
  13. reflex/components/el/elements/__init__.py +1 -0
  14. reflex/components/el/elements/__init__.pyi +5 -0
  15. reflex/components/el/elements/forms.py +4 -2
  16. reflex/components/el/elements/metadata.pyi +2 -0
  17. reflex/components/el/elements/typography.py +7 -0
  18. reflex/components/el/elements/typography.pyi +246 -0
  19. reflex/components/lucide/icon.py +303 -292
  20. reflex/components/lucide/icon.pyi +303 -292
  21. reflex/components/radix/themes/components/separator.py +4 -4
  22. reflex/components/radix/themes/components/separator.pyi +3 -3
  23. reflex/components/recharts/recharts.py +2 -2
  24. reflex/components/sonner/toast.py +1 -1
  25. reflex/constants/installer.py +1 -1
  26. reflex/event.py +71 -10
  27. reflex/model.py +55 -0
  28. reflex/plugins/base.py +2 -2
  29. reflex/reflex.py +33 -0
  30. reflex/route.py +4 -4
  31. reflex/state.py +9 -4
  32. reflex/utils/console.py +3 -3
  33. reflex/utils/exec.py +22 -6
  34. reflex/utils/format.py +1 -1
  35. reflex/utils/processes.py +28 -38
  36. reflex/utils/types.py +1 -1
  37. {reflex-0.8.2.dist-info → reflex-0.8.3.dist-info}/METADATA +1 -1
  38. {reflex-0.8.2.dist-info → reflex-0.8.3.dist-info}/RECORD +41 -39
  39. {reflex-0.8.2.dist-info → reflex-0.8.3.dist-info}/WHEEL +0 -0
  40. {reflex-0.8.2.dist-info → reflex-0.8.3.dist-info}/entry_points.txt +0 -0
  41. {reflex-0.8.2.dist-info → reflex-0.8.3.dist-info}/licenses/LICENSE +0 -0
@@ -993,7 +993,7 @@ export const useEventLoop = (
993
993
  window.onerror = function (msg, url, lineNo, columnNo, error) {
994
994
  addEvents([
995
995
  Event(`${exception_state_name}.handle_frontend_exception`, {
996
- stack: error.stack,
996
+ info: error.name + ": " + error.message + "\n" + error.stack,
997
997
  component_stack: "",
998
998
  }),
999
999
  ]);
@@ -1005,7 +1005,12 @@ export const useEventLoop = (
1005
1005
  window.onunhandledrejection = function (event) {
1006
1006
  addEvents([
1007
1007
  Event(`${exception_state_name}.handle_frontend_exception`, {
1008
- stack: event.reason?.stack,
1008
+ info:
1009
+ event.reason?.name +
1010
+ ": " +
1011
+ event.reason?.message +
1012
+ "\n" +
1013
+ event.reason?.stack,
1009
1014
  component_stack: "",
1010
1015
  }),
1011
1016
  ]);
reflex/__init__.py CHANGED
@@ -249,6 +249,7 @@ COMPONENTS_CORE_MAPPING: dict = {
249
249
  "upload",
250
250
  ],
251
251
  "components.core.auto_scroll": ["auto_scroll"],
252
+ "components.core.window_events": ["window_event_listener"],
252
253
  }
253
254
 
254
255
  COMPONENTS_BASE_MAPPING: dict = {
reflex/__init__.pyi CHANGED
@@ -52,6 +52,7 @@ from .components.core.upload import (
52
52
  selected_files,
53
53
  upload,
54
54
  )
55
+ from .components.core.window_events import window_event_listener
55
56
  from .components.datadisplay.code import code_block
56
57
  from .components.datadisplay.dataeditor import data_editor, data_editor_theme
57
58
  from .components.datadisplay.logo import logo
@@ -348,4 +349,5 @@ __all__ = [
348
349
  "video",
349
350
  "vstack",
350
351
  "window_alert",
352
+ "window_event_listener",
351
353
  ]
reflex/app.py CHANGED
@@ -400,6 +400,9 @@ class App(MiddlewareMixin, LifespanMixin):
400
400
  # The state class to use for the app.
401
401
  _state: type[BaseState] | None = None
402
402
 
403
+ # Whether to enable state for the app. If False, the app will not use state.
404
+ enable_state: bool = True
405
+
403
406
  # Class to manage many client states.
404
407
  _state_manager: StateManager | None = None
405
408
 
@@ -480,7 +483,8 @@ class App(MiddlewareMixin, LifespanMixin):
480
483
  if issubclass(clz, AppMixin):
481
484
  clz._init_mixin(self)
482
485
 
483
- self._setup_state()
486
+ if self.enable_state:
487
+ self._enable_state()
484
488
 
485
489
  # Set up the admin dash.
486
490
  self._setup_admin_dash()
@@ -495,7 +499,7 @@ class App(MiddlewareMixin, LifespanMixin):
495
499
  """Enable state for the app."""
496
500
  if not self._state:
497
501
  self._state = State
498
- self._setup_state()
502
+ self._setup_state()
499
503
 
500
504
  def _setup_state(self) -> None:
501
505
  """Set up the state for the app.
@@ -847,14 +851,10 @@ class App(MiddlewareMixin, LifespanMixin):
847
851
  save_page: If True, the compiled page is saved to self._pages.
848
852
  """
849
853
  n_states_before = len(all_base_state_classes)
850
- component, enable_state = compiler.compile_unevaluated_page(
851
- route, self._unevaluated_pages[route], self._state, self.style, self.theme
854
+ component = compiler.compile_unevaluated_page(
855
+ route, self._unevaluated_pages[route], self.style, self.theme
852
856
  )
853
857
 
854
- # Indicate that the app should use state.
855
- if enable_state:
856
- self._enable_state()
857
-
858
858
  # Indicate that evaluating this page creates one or more state classes.
859
859
  if len(all_base_state_classes) > n_states_before:
860
860
  self._stateful_pages[route] = None
@@ -1146,7 +1146,6 @@ class App(MiddlewareMixin, LifespanMixin):
1146
1146
  for route in stateful_pages:
1147
1147
  console.debug(f"BE Evaluating stateful page: {route}")
1148
1148
  self._compile_page(route, save_page=False)
1149
- self._enable_state()
1150
1149
  self._add_optional_endpoints()
1151
1150
  return
1152
1151
 
@@ -1345,8 +1344,6 @@ class App(MiddlewareMixin, LifespanMixin):
1345
1344
  for route, component in zip(self._pages, page_components, strict=True):
1346
1345
  ExecutorSafeFunctions.COMPONENTS[route] = component
1347
1346
 
1348
- ExecutorSafeFunctions.STATE = self._state
1349
-
1350
1347
  modify_files_tasks: list[tuple[str, str, Callable[[str], str]]] = []
1351
1348
 
1352
1349
  with console.timing("Compile to Javascript"), executor as executor:
@@ -145,15 +145,11 @@ def _compile_contexts(state: type[BaseState] | None, theme: Component | None) ->
145
145
  )
146
146
 
147
147
 
148
- def _compile_page(
149
- component: BaseComponent,
150
- state: type[BaseState] | None,
151
- ) -> str:
152
- """Compile the component given the app state.
148
+ def _compile_page(component: BaseComponent) -> str:
149
+ """Compile the component.
153
150
 
154
151
  Args:
155
152
  component: The component to compile.
156
- state: The app state.
157
153
 
158
154
  Returns:
159
155
  The compiled component.
@@ -163,15 +159,12 @@ def _compile_page(
163
159
  imports = utils.compile_imports(imports)
164
160
 
165
161
  # Compile the code to render the component.
166
- kwargs = {"state_name": state.get_name()} if state is not None else {}
167
-
168
162
  return templates.PAGE.render(
169
163
  imports=imports,
170
164
  dynamic_imports=component._get_all_dynamic_imports(),
171
165
  custom_codes=component._get_all_custom_code(),
172
166
  hooks=component._get_all_hooks(),
173
167
  render=component.render(),
174
- **kwargs,
175
168
  )
176
169
 
177
170
 
@@ -556,15 +549,12 @@ def compile_contexts(
556
549
  return output_path, _compile_contexts(state, theme)
557
550
 
558
551
 
559
- def compile_page(
560
- path: str, component: BaseComponent, state: type[BaseState] | None
561
- ) -> tuple[str, str]:
552
+ def compile_page(path: str, component: BaseComponent) -> tuple[str, str]:
562
553
  """Compile a single page.
563
554
 
564
555
  Args:
565
556
  path: The path to compile the page to.
566
557
  component: The component to compile.
567
- state: The app state.
568
558
 
569
559
  Returns:
570
560
  The path and code of the compiled page.
@@ -573,7 +563,7 @@ def compile_page(
573
563
  output_path = utils.get_page_path(path)
574
564
 
575
565
  # Add the style to the component.
576
- code = _compile_page(component, state)
566
+ code = _compile_page(component)
577
567
  return output_path, code
578
568
 
579
569
 
@@ -788,16 +778,14 @@ def into_component(component: Component | ComponentCallable) -> Component:
788
778
  def compile_unevaluated_page(
789
779
  route: str,
790
780
  page: UnevaluatedPage,
791
- state: type[BaseState] | None = None,
792
781
  style: ComponentStyle | None = None,
793
782
  theme: Component | None = None,
794
- ) -> tuple[Component, bool]:
783
+ ) -> Component:
795
784
  """Compiles an uncompiled page into a component and adds meta information.
796
785
 
797
786
  Args:
798
787
  route: The route of the page.
799
788
  page: The uncompiled page object.
800
- state: The state of the app.
801
789
  style: The style of the page.
802
790
  theme: The theme of the page.
803
791
 
@@ -813,21 +801,6 @@ def compile_unevaluated_page(
813
801
 
814
802
  component._add_style_recursive(style or {}, theme)
815
803
 
816
- enable_state = False
817
- # Ensure state is enabled if this page uses state.
818
- if state is None:
819
- if page.on_load or component._has_stateful_event_triggers():
820
- enable_state = True
821
- else:
822
- for var in component._get_vars(include_children=True):
823
- var_data = var._get_all_var_data()
824
- if not var_data:
825
- continue
826
- if not var_data.state:
827
- continue
828
- enable_state = True
829
- break
830
-
831
804
  from reflex.utils.format import make_default_page_title
832
805
 
833
806
  component = Fragment.create(component)
@@ -856,7 +829,7 @@ def compile_unevaluated_page(
856
829
  e.add_note(f"Happened while evaluating page {route!r}")
857
830
  raise
858
831
  else:
859
- return component, enable_state
832
+ return component
860
833
 
861
834
 
862
835
  class ExecutorSafeFunctions:
@@ -886,7 +859,6 @@ class ExecutorSafeFunctions:
886
859
 
887
860
  COMPONENTS: dict[str, BaseComponent] = {}
888
861
  UNCOMPILED_PAGES: dict[str, UnevaluatedPage] = {}
889
- STATE: type[BaseState] | None = None
890
862
 
891
863
  @classmethod
892
864
  def compile_page(cls, route: str) -> tuple[str, str]:
@@ -898,7 +870,7 @@ class ExecutorSafeFunctions:
898
870
  Returns:
899
871
  The path and code of the compiled page.
900
872
  """
901
- return compile_page(route, cls.COMPONENTS[route], cls.STATE)
873
+ return compile_page(route, cls.COMPONENTS[route])
902
874
 
903
875
  @classmethod
904
876
  def compile_unevaluated_page(
@@ -917,10 +889,10 @@ class ExecutorSafeFunctions:
917
889
  Returns:
918
890
  The route, compiled component, and compiled page.
919
891
  """
920
- component, enable_state = compile_unevaluated_page(
921
- route, cls.UNCOMPILED_PAGES[route], cls.STATE, style, theme
892
+ component = compile_unevaluated_page(
893
+ route, cls.UNCOMPILED_PAGES[route], style, theme
922
894
  )
923
- return route, component, compile_page(route, component, cls.STATE)
895
+ return route, component, compile_page(route, component)
924
896
 
925
897
  @classmethod
926
898
  def compile_theme(cls, style: ComponentStyle | None) -> tuple[str, str]:
@@ -25,11 +25,14 @@ def on_error_spec(
25
25
  The arguments for the event handler.
26
26
  """
27
27
  return (
28
- error.stack,
28
+ error.name.to(str) + ": " + error.message.to(str) + "\n" + error.stack.to(str),
29
29
  info.componentStack,
30
30
  )
31
31
 
32
32
 
33
+ _ERROR_DISPLAY: str = r"""event_args.error.name + ': ' + event_args.error.message + '\n' + event_args.error.stack"""
34
+
35
+
33
36
  class ErrorBoundary(Component):
34
37
  """A React Error Boundary component that catches unhandled frontend exceptions."""
35
38
 
@@ -76,9 +79,7 @@ class ErrorBoundary(Component):
76
79
  div(
77
80
  div(
78
81
  pre(
79
- Var(
80
- _js_expr="event_args.error.stack",
81
- ),
82
+ Var(_js_expr=_ERROR_DISPLAY),
82
83
  ),
83
84
  padding="0.5rem",
84
85
  width="fit-content",
@@ -93,7 +94,7 @@ class ErrorBoundary(Component):
93
94
  button(
94
95
  "Copy",
95
96
  on_click=set_clipboard(
96
- Var(_js_expr="event_args.error.stack"),
97
+ Var(_js_expr=_ERROR_DISPLAY)
97
98
  ),
98
99
  padding="0.35rem 0.75rem",
99
100
  margin="0.5rem",
@@ -8,6 +8,7 @@ from typing import Any, Literal
8
8
 
9
9
  from reflex.components.core.breakpoints import Breakpoints
10
10
  from reflex.components.el import elements
11
+ from reflex.components.el.elements.metadata import Meta as Meta
11
12
  from reflex.event import EventType, PointerEventInfo
12
13
  from reflex.vars.base import Var
13
14
 
@@ -63,261 +64,6 @@ class Title(elements.Title):
63
64
  The component.
64
65
  """
65
66
 
66
- class Meta(elements.Meta):
67
- @classmethod
68
- def create(
69
- cls,
70
- *children,
71
- property: Var[str] | str | None = None,
72
- char_set: Var[str] | str | None = None,
73
- content: Var[str] | str | None = None,
74
- http_equiv: Var[str] | str | None = None,
75
- name: Var[str] | str | None = None,
76
- access_key: Var[str] | str | None = None,
77
- auto_capitalize: Literal[
78
- "characters", "none", "off", "on", "sentences", "words"
79
- ]
80
- | Var[Literal["characters", "none", "off", "on", "sentences", "words"]]
81
- | None = None,
82
- content_editable: Literal["inherit", "plaintext-only", False, True]
83
- | Var[Literal["inherit", "plaintext-only", False, True]]
84
- | None = None,
85
- context_menu: Var[str] | str | None = None,
86
- dir: Var[str] | str | None = None,
87
- draggable: Var[bool] | bool | None = None,
88
- enter_key_hint: Literal[
89
- "done", "enter", "go", "next", "previous", "search", "send"
90
- ]
91
- | Var[Literal["done", "enter", "go", "next", "previous", "search", "send"]]
92
- | None = None,
93
- hidden: Var[bool] | bool | None = None,
94
- input_mode: Literal[
95
- "decimal", "email", "none", "numeric", "search", "tel", "text", "url"
96
- ]
97
- | Var[
98
- Literal[
99
- "decimal", "email", "none", "numeric", "search", "tel", "text", "url"
100
- ]
101
- ]
102
- | None = None,
103
- item_prop: Var[str] | str | None = None,
104
- lang: Var[str] | str | None = None,
105
- role: Literal[
106
- "alert",
107
- "alertdialog",
108
- "application",
109
- "article",
110
- "banner",
111
- "button",
112
- "cell",
113
- "checkbox",
114
- "columnheader",
115
- "combobox",
116
- "complementary",
117
- "contentinfo",
118
- "definition",
119
- "dialog",
120
- "directory",
121
- "document",
122
- "feed",
123
- "figure",
124
- "form",
125
- "grid",
126
- "gridcell",
127
- "group",
128
- "heading",
129
- "img",
130
- "link",
131
- "list",
132
- "listbox",
133
- "listitem",
134
- "log",
135
- "main",
136
- "marquee",
137
- "math",
138
- "menu",
139
- "menubar",
140
- "menuitem",
141
- "menuitemcheckbox",
142
- "menuitemradio",
143
- "navigation",
144
- "none",
145
- "note",
146
- "option",
147
- "presentation",
148
- "progressbar",
149
- "radio",
150
- "radiogroup",
151
- "region",
152
- "row",
153
- "rowgroup",
154
- "rowheader",
155
- "scrollbar",
156
- "search",
157
- "searchbox",
158
- "separator",
159
- "slider",
160
- "spinbutton",
161
- "status",
162
- "switch",
163
- "tab",
164
- "table",
165
- "tablist",
166
- "tabpanel",
167
- "term",
168
- "textbox",
169
- "timer",
170
- "toolbar",
171
- "tooltip",
172
- "tree",
173
- "treegrid",
174
- "treeitem",
175
- ]
176
- | Var[
177
- Literal[
178
- "alert",
179
- "alertdialog",
180
- "application",
181
- "article",
182
- "banner",
183
- "button",
184
- "cell",
185
- "checkbox",
186
- "columnheader",
187
- "combobox",
188
- "complementary",
189
- "contentinfo",
190
- "definition",
191
- "dialog",
192
- "directory",
193
- "document",
194
- "feed",
195
- "figure",
196
- "form",
197
- "grid",
198
- "gridcell",
199
- "group",
200
- "heading",
201
- "img",
202
- "link",
203
- "list",
204
- "listbox",
205
- "listitem",
206
- "log",
207
- "main",
208
- "marquee",
209
- "math",
210
- "menu",
211
- "menubar",
212
- "menuitem",
213
- "menuitemcheckbox",
214
- "menuitemradio",
215
- "navigation",
216
- "none",
217
- "note",
218
- "option",
219
- "presentation",
220
- "progressbar",
221
- "radio",
222
- "radiogroup",
223
- "region",
224
- "row",
225
- "rowgroup",
226
- "rowheader",
227
- "scrollbar",
228
- "search",
229
- "searchbox",
230
- "separator",
231
- "slider",
232
- "spinbutton",
233
- "status",
234
- "switch",
235
- "tab",
236
- "table",
237
- "tablist",
238
- "tabpanel",
239
- "term",
240
- "textbox",
241
- "timer",
242
- "toolbar",
243
- "tooltip",
244
- "tree",
245
- "treegrid",
246
- "treeitem",
247
- ]
248
- ]
249
- | None = None,
250
- slot: Var[str] | str | None = None,
251
- spell_check: Var[bool] | bool | None = None,
252
- tab_index: Var[int] | int | None = None,
253
- title: Var[str] | str | None = None,
254
- style: Sequence[Mapping[str, Any]]
255
- | Mapping[str, Any]
256
- | Var[Mapping[str, Any]]
257
- | Breakpoints
258
- | None = None,
259
- key: Any | None = None,
260
- id: Any | None = None,
261
- ref: Var | None = None,
262
- class_name: Any | None = None,
263
- autofocus: bool | None = None,
264
- custom_attrs: dict[str, Var | Any] | None = None,
265
- on_blur: EventType[()] | None = None,
266
- on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
267
- on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
268
- on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
269
- on_focus: EventType[()] | None = None,
270
- on_mount: EventType[()] | None = None,
271
- on_mouse_down: EventType[()] | None = None,
272
- on_mouse_enter: EventType[()] | None = None,
273
- on_mouse_leave: EventType[()] | None = None,
274
- on_mouse_move: EventType[()] | None = None,
275
- on_mouse_out: EventType[()] | None = None,
276
- on_mouse_over: EventType[()] | None = None,
277
- on_mouse_up: EventType[()] | None = None,
278
- on_scroll: EventType[()] | None = None,
279
- on_scroll_end: EventType[()] | None = None,
280
- on_unmount: EventType[()] | None = None,
281
- **props,
282
- ) -> Meta:
283
- """Create the component.
284
-
285
- Args:
286
- *children: The children of the component.
287
- property: The type of metadata value.
288
- char_set: Specifies the character encoding for the HTML document
289
- content: Defines the content of the metadata
290
- http_equiv: Provides an HTTP header for the information/value of the content attribute
291
- name: Specifies a name for the metadata
292
- access_key: Provides a hint for generating a keyboard shortcut for the current element.
293
- auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
294
- content_editable: Indicates whether the element's content is editable.
295
- context_menu: Defines the ID of a <menu> element which will serve as the element's context menu.
296
- dir: Defines the text direction. Allowed values are ltr (Left-To-Right) or rtl (Right-To-Left)
297
- draggable: Defines whether the element can be dragged.
298
- enter_key_hint: Hints what media types the media element is able to play.
299
- hidden: Defines whether the element is hidden.
300
- input_mode: Defines the type of the element.
301
- item_prop: Defines the name of the element for metadata purposes.
302
- lang: Defines the language used in the element.
303
- role: Defines the role of the element.
304
- slot: Assigns a slot in a shadow DOM shadow tree to an element.
305
- spell_check: Defines whether the element may be checked for spelling errors.
306
- tab_index: Defines the position of the current element in the tabbing order.
307
- title: Defines a tooltip for the element.
308
- style: The style of the component.
309
- key: A unique key for the component.
310
- id: The id for the component.
311
- ref: The Var to pass as the ref to the component.
312
- class_name: The class name for the component.
313
- autofocus: Whether the component should take the focus once the page is loaded
314
- custom_attrs: custom attribute
315
- **props: The props of the component.
316
-
317
- Returns:
318
- The component.
319
- """
320
-
321
67
  class Description(elements.Meta):
322
68
  @classmethod
323
69
  def create(
@@ -327,6 +73,7 @@ class Description(elements.Meta):
327
73
  char_set: Var[str] | str | None = None,
328
74
  content: Var[str] | str | None = None,
329
75
  http_equiv: Var[str] | str | None = None,
76
+ property: Var[str] | str | None = None,
330
77
  access_key: Var[str] | str | None = None,
331
78
  auto_capitalize: Literal[
332
79
  "characters", "none", "off", "on", "sentences", "words"
@@ -542,6 +289,7 @@ class Description(elements.Meta):
542
289
  char_set: Specifies the character encoding for the HTML document
543
290
  content: Defines the content of the metadata
544
291
  http_equiv: Provides an HTTP header for the information/value of the content attribute
292
+ property: The type of metadata value.
545
293
  access_key: Provides a hint for generating a keyboard shortcut for the current element.
546
294
  auto_capitalize: Controls whether and how text input is automatically capitalized as it is entered/edited by the user.
547
295
  content_editable: Indicates whether the element's content is editable.
@@ -792,7 +540,7 @@ class Image(elements.Meta):
792
540
 
793
541
  Args:
794
542
  *children: The children of the component.
795
- property: The type of the image.
543
+ property: The type of metadata value.
796
544
  char_set: Specifies the character encoding for the HTML document
797
545
  content: Defines the content of the metadata
798
546
  http_equiv: Provides an HTTP header for the information/value of the content attribute
@@ -50,6 +50,7 @@ _SUBMOD_ATTRS: dict[str, list[str]] = {
50
50
  "selected_files",
51
51
  ],
52
52
  "auto_scroll": ["auto_scroll"],
53
+ "window_events": ["WindowEventListener", "window_event_listener"],
53
54
  }
54
55
 
55
56
  __getattr__, __dir__, __all__ = lazy_loader.attach(
@@ -39,6 +39,7 @@ from .upload import (
39
39
  selected_files,
40
40
  upload,
41
41
  )
42
+ from .window_events import WindowEventListener, window_event_listener
42
43
 
43
44
  __all__ = [
44
45
  "Clipboard",
@@ -52,6 +53,7 @@ __all__ = [
52
53
  "Helmet",
53
54
  "Html",
54
55
  "Match",
56
+ "WindowEventListener",
55
57
  "auto_scroll",
56
58
  "breakpoints",
57
59
  "cancel_upload",
@@ -79,4 +81,5 @@ __all__ = [
79
81
  "tablet_and_desktop",
80
82
  "tablet_only",
81
83
  "upload",
84
+ "window_event_listener",
82
85
  ]