From 0af4770180e24527e6808004d42f8868f5f6b446 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Thomas=20Brand=C3=A9ho?= <thomas.brandeho@gmail.com>
Date: Fri, 29 Mar 2024 17:54:21 +0100
Subject: [PATCH] generate pyi files when building/publishing 3rd party
 component (#2945)

* build pyi files when building/publishing 3rd party

* fix typo in workflow

* add future annotation

* add tests to pass coverage check

* add more unit tests

* omit pyi_generator from test coverage

* change black from dev deps to direct deps

* remake all pyi

* format pyi if black is present, return as if otherwise

* fix requested changes

---------

Co-authored-by: Masen Furer <m_github@0x26.net>
---
 .coveragerc                                   |   5 +
 .github/workflows/check_generated_pyi.yml     |   6 +-
 .pre-commit-config.yaml                       |   2 +-
 CONTRIBUTING.md                               |   2 +-
 reflex/components/base/app_wrap.pyi           |   2 +-
 reflex/components/base/bare.py                |   7 +-
 reflex/components/base/body.pyi               |   2 +-
 reflex/components/base/document.pyi           |   2 +-
 reflex/components/base/fragment.pyi           |   2 +-
 reflex/components/base/head.pyi               |   2 +-
 reflex/components/base/link.pyi               |   2 +-
 reflex/components/base/meta.pyi               |   2 +-
 reflex/components/base/script.pyi             |   2 +-
 reflex/components/chakra/base.pyi             |   2 +-
 .../components/chakra/datadisplay/badge.pyi   |   2 +-
 reflex/components/chakra/datadisplay/code.pyi |   2 +-
 .../components/chakra/datadisplay/divider.pyi |   2 +-
 .../chakra/datadisplay/keyboard_key.pyi       |   2 +-
 reflex/components/chakra/datadisplay/list.pyi |   2 +-
 reflex/components/chakra/datadisplay/stat.pyi |   2 +-
 .../components/chakra/datadisplay/table.pyi   |   2 +-
 reflex/components/chakra/datadisplay/tag.pyi  |   2 +-
 .../chakra/disclosure/accordion.pyi           |   2 +-
 reflex/components/chakra/disclosure/tabs.pyi  |   2 +-
 .../chakra/disclosure/transition.pyi          |   2 +-
 .../chakra/disclosure/visuallyhidden.pyi      |   2 +-
 reflex/components/chakra/feedback/alert.pyi   |   2 +-
 .../chakra/feedback/circularprogress.pyi      |   2 +-
 .../components/chakra/feedback/progress.pyi   |   2 +-
 .../components/chakra/feedback/skeleton.pyi   |   2 +-
 reflex/components/chakra/feedback/spinner.pyi |   2 +-
 reflex/components/chakra/forms/button.pyi     |   2 +-
 reflex/components/chakra/forms/checkbox.pyi   |   2 +-
 .../chakra/forms/colormodeswitch.pyi          |   2 +-
 .../components/chakra/forms/date_picker.pyi   |   2 +-
 .../chakra/forms/date_time_picker.pyi         |   2 +-
 reflex/components/chakra/forms/editable.pyi   |   2 +-
 reflex/components/chakra/forms/email.pyi      |   2 +-
 reflex/components/chakra/forms/form.pyi       |   2 +-
 reflex/components/chakra/forms/iconbutton.pyi |   2 +-
 reflex/components/chakra/forms/input.pyi      |   2 +-
 .../components/chakra/forms/numberinput.pyi   |   2 +-
 reflex/components/chakra/forms/password.pyi   |   2 +-
 reflex/components/chakra/forms/pininput.pyi   |   2 +-
 reflex/components/chakra/forms/radio.pyi      |   2 +-
 .../components/chakra/forms/rangeslider.pyi   |   2 +-
 reflex/components/chakra/forms/select.pyi     |   2 +-
 reflex/components/chakra/forms/slider.pyi     |   2 +-
 reflex/components/chakra/forms/switch.pyi     |   2 +-
 reflex/components/chakra/forms/textarea.pyi   |   2 +-
 .../components/chakra/forms/time_picker.pyi   |   2 +-
 .../components/chakra/layout/aspect_ratio.pyi |   2 +-
 reflex/components/chakra/layout/box.pyi       |   2 +-
 reflex/components/chakra/layout/card.pyi      |   2 +-
 reflex/components/chakra/layout/center.pyi    |   2 +-
 reflex/components/chakra/layout/container.pyi |   2 +-
 reflex/components/chakra/layout/flex.pyi      |   2 +-
 reflex/components/chakra/layout/grid.pyi      |   2 +-
 reflex/components/chakra/layout/spacer.pyi    |   2 +-
 reflex/components/chakra/layout/stack.pyi     |   2 +-
 reflex/components/chakra/layout/wrap.pyi      |   2 +-
 reflex/components/chakra/media/avatar.pyi     |   2 +-
 reflex/components/chakra/media/icon.pyi       |   2 +-
 reflex/components/chakra/media/image.pyi      |   2 +-
 .../chakra/navigation/breadcrumb.pyi          |   2 +-
 reflex/components/chakra/navigation/link.pyi  |   2 +-
 .../chakra/navigation/linkoverlay.pyi         |   2 +-
 .../components/chakra/navigation/stepper.pyi  |   2 +-
 .../components/chakra/overlay/alertdialog.pyi |   2 +-
 reflex/components/chakra/overlay/drawer.pyi   |   2 +-
 reflex/components/chakra/overlay/menu.pyi     |   2 +-
 reflex/components/chakra/overlay/modal.pyi    |   2 +-
 reflex/components/chakra/overlay/popover.pyi  |   2 +-
 reflex/components/chakra/overlay/tooltip.pyi  |   2 +-
 .../components/chakra/typography/heading.pyi  |   2 +-
 .../chakra/typography/highlight.pyi           |   2 +-
 reflex/components/chakra/typography/span.pyi  |   2 +-
 reflex/components/chakra/typography/text.pyi  |   2 +-
 reflex/components/component.py                |   8 +-
 reflex/components/core/banner.pyi             |   2 +-
 .../components/core/client_side_routing.pyi   |   2 +-
 reflex/components/core/debounce.pyi           |   2 +-
 reflex/components/core/html.pyi               |   2 +-
 reflex/components/core/upload.pyi             |   2 +-
 reflex/components/datadisplay/code.pyi        |   2 +-
 reflex/components/datadisplay/dataeditor.pyi  |   2 +-
 reflex/components/el/element.pyi              |   2 +-
 reflex/components/el/elements/base.pyi        |   2 +-
 reflex/components/el/elements/forms.pyi       |   2 +-
 reflex/components/el/elements/inline.pyi      |   2 +-
 reflex/components/el/elements/media.pyi       |   2 +-
 reflex/components/el/elements/metadata.pyi    |   2 +-
 reflex/components/el/elements/other.pyi       |   2 +-
 reflex/components/el/elements/scripts.pyi     |   2 +-
 reflex/components/el/elements/sectioning.pyi  |   2 +-
 reflex/components/el/elements/tables.pyi      |   2 +-
 reflex/components/el/elements/typography.pyi  |   2 +-
 reflex/components/gridjs/datatable.pyi        |   2 +-
 reflex/components/lucide/icon.pyi             |   2 +-
 reflex/components/markdown/markdown.pyi       |   2 +-
 reflex/components/moment/moment.pyi           |   2 +-
 reflex/components/next/base.pyi               |   2 +-
 reflex/components/next/image.pyi              |   2 +-
 reflex/components/next/link.pyi               |   2 +-
 reflex/components/next/video.pyi              |   2 +-
 reflex/components/plotly/plotly.pyi           |   2 +-
 .../components/radix/primitives/accordion.pyi |   2 +-
 reflex/components/radix/primitives/base.pyi   |   2 +-
 reflex/components/radix/primitives/drawer.pyi |   2 +-
 reflex/components/radix/primitives/form.pyi   |   2 +-
 .../components/radix/primitives/progress.pyi  |   2 +-
 reflex/components/radix/primitives/slider.pyi |   2 +-
 reflex/components/radix/themes/base.pyi       |   2 +-
 reflex/components/radix/themes/color_mode.pyi |   2 +-
 .../radix/themes/components/alert_dialog.pyi  |   2 +-
 .../radix/themes/components/aspect_ratio.pyi  |   2 +-
 .../radix/themes/components/avatar.pyi        |   2 +-
 .../radix/themes/components/badge.pyi         |   2 +-
 .../radix/themes/components/button.pyi        |   2 +-
 .../radix/themes/components/callout.pyi       |   2 +-
 .../radix/themes/components/card.pyi          |   2 +-
 .../radix/themes/components/checkbox.pyi      |   2 +-
 .../radix/themes/components/context_menu.pyi  |   2 +-
 .../radix/themes/components/dialog.pyi        |   2 +-
 .../radix/themes/components/dropdown_menu.pyi |   2 +-
 .../radix/themes/components/hover_card.pyi    |   2 +-
 .../radix/themes/components/icon_button.pyi   |   2 +-
 .../radix/themes/components/inset.pyi         |   2 +-
 .../radix/themes/components/popover.pyi       |   2 +-
 .../radix/themes/components/radio_group.pyi   |   2 +-
 .../radix/themes/components/scroll_area.pyi   |   2 +-
 .../radix/themes/components/select.pyi        |   2 +-
 .../radix/themes/components/separator.pyi     |   2 +-
 .../radix/themes/components/slider.pyi        |   2 +-
 .../radix/themes/components/switch.pyi        |   2 +-
 .../radix/themes/components/table.pyi         |   2 +-
 .../radix/themes/components/tabs.pyi          |   2 +-
 .../radix/themes/components/text_area.pyi     |   2 +-
 .../radix/themes/components/text_field.pyi    |   2 +-
 .../radix/themes/components/tooltip.pyi       |   2 +-
 .../components/radix/themes/layout/base.pyi   |   2 +-
 reflex/components/radix/themes/layout/box.pyi |   2 +-
 .../components/radix/themes/layout/center.pyi |   2 +-
 .../radix/themes/layout/container.pyi         |   2 +-
 .../components/radix/themes/layout/flex.pyi   |   2 +-
 .../components/radix/themes/layout/grid.pyi   |   2 +-
 .../components/radix/themes/layout/list.pyi   |   2 +-
 .../radix/themes/layout/section.pyi           |   2 +-
 .../components/radix/themes/layout/spacer.pyi |   2 +-
 .../components/radix/themes/layout/stack.pyi  |   2 +-
 .../radix/themes/typography/blockquote.pyi    |   2 +-
 .../radix/themes/typography/code.pyi          |   2 +-
 .../radix/themes/typography/heading.pyi       |   2 +-
 .../radix/themes/typography/link.pyi          |   2 +-
 .../radix/themes/typography/text.pyi          |   2 +-
 reflex/components/react_player/audio.pyi      |   2 +-
 .../components/react_player/react_player.pyi  |   2 +-
 reflex/components/react_player/video.pyi      |   2 +-
 reflex/components/recharts/cartesian.pyi      |   2 +-
 reflex/components/recharts/charts.pyi         |   2 +-
 reflex/components/recharts/general.pyi        |   2 +-
 reflex/components/recharts/polar.pyi          |   2 +-
 reflex/components/recharts/recharts.pyi       |   2 +-
 reflex/components/suneditor/editor.pyi        |   2 +-
 reflex/custom_components/custom_components.py |  15 ++
 {scripts => reflex/utils}/pyi_generator.py    | 149 +++---------------
 scripts/make_pyi.py                           | 112 +++++++++++++
 tests/components/base/test_bare.py            |   1 +
 tests/components/core/test_banner.py          |  51 ++++++
 .../components/{layout => core}/test_cond.py  |  54 ++-----
 .../{forms => core}/test_debounce.py          |  67 ++++++--
 .../{layout => core}/test_foreach.py          |  31 +++-
 tests/components/core/test_html.py            |  19 +++
 .../components/{layout => core}/test_match.py |   5 +
 tests/components/core/test_responsive.py      |  38 +++++
 tests/components/core/test_upload.py          |   0
 176 files changed, 542 insertions(+), 346 deletions(-)
 rename {scripts => reflex/utils}/pyi_generator.py (86%)
 create mode 100644 scripts/make_pyi.py
 create mode 100644 tests/components/core/test_banner.py
 rename tests/components/{layout => core}/test_cond.py (72%)
 rename tests/components/{forms => core}/test_debounce.py (68%)
 rename tests/components/{layout => core}/test_foreach.py (82%)
 create mode 100644 tests/components/core/test_html.py
 rename tests/components/{layout => core}/test_match.py (99%)
 create mode 100644 tests/components/core/test_responsive.py
 create mode 100644 tests/components/core/test_upload.py

diff --git a/.coveragerc b/.coveragerc
index 51d2ab615..2cda1b8f5 100644
--- a/.coveragerc
+++ b/.coveragerc
@@ -1,6 +1,8 @@
 [run]
 source = reflex
 branch = true
+omit =
+    */pyi_generator.py
 
 [report]
 show_missing = true
@@ -24,6 +26,9 @@ exclude_also =
 
     # Don't complain about abstract methods, they aren't run:
     @(abc\.)?abstractmethod
+    
+    # Don't complain about overloaded methods:
+    @overload
 
 ignore_errors = True
 
diff --git a/.github/workflows/check_generated_pyi.yml b/.github/workflows/check_generated_pyi.yml
index 0d283c8b0..7ce33c404 100644
--- a/.github/workflows/check_generated_pyi.yml
+++ b/.github/workflows/check_generated_pyi.yml
@@ -3,7 +3,7 @@ name: check-generated-pyi
 on:
   push:
     branches: [ "main" ]
-    # We don't just trigger on pyi_generator.py and the components dir, because
+    # We don't just trigger on make_pyi.py and the components dir, because
     # there are other things that can change the generator output
     # e.g. black version, reflex.Component, reflex.Var.
     paths-ignore:
@@ -25,11 +25,11 @@ jobs:
           run-poetry-install: true
           create-venv-at-path: .venv
       - run: |
-          poetry run python scripts/pyi_generator.py
+          poetry run python scripts/make_pyi.py
           if [[ $(git status --porcelain) ]]; then
             git status
             git diff
-            echo "ERROR: pyi_generator.py output is out of date. Please run scripts/pyi_generator.py and commit the changes."
+            echo "ERROR: make_pyi.py output is out of date. Please run scripts/make_pyi.py and commit the changes."
             exit 1
           else
             echo "No diffs - AOK!"
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index 13951736f..da6142dbc 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -32,4 +32,4 @@ repos:
         always_run: true
         language: system
         description: 'Update pyi files as needed'
-        entry: python scripts/pyi_generator.py
+        entry: python scripts/make_pyi.py
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 080901566..c2f4a1079 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -103,5 +103,5 @@ For some pull requests when adding new components you will have to generate a py
 (Please check in with the team before adding a new component to Reflex we are cautious about adding new components to Reflex's core.)
 
 ``` bash
-poetry run python scripts/pyi_generator.py 
+poetry run python scripts/make_pyi.py 
 ```
\ No newline at end of file
diff --git a/reflex/components/base/app_wrap.pyi b/reflex/components/base/app_wrap.pyi
index 63302bcc9..f394225df 100644
--- a/reflex/components/base/app_wrap.pyi
+++ b/reflex/components/base/app_wrap.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/app_wrap.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/base/bare.py b/reflex/components/base/bare.py
index 24bf83b36..0de7307db 100644
--- a/reflex/components/base/bare.py
+++ b/reflex/components/base/bare.py
@@ -1,4 +1,5 @@
 """A bare component."""
+
 from __future__ import annotations
 
 from typing import Any, Iterator
@@ -27,7 +28,7 @@ class Bare(Component):
         if isinstance(contents, Var) and contents._var_data:
             contents = contents.to(str)
         else:
-            contents = str(contents)
+            contents = str(contents) if contents is not None else ""
         return cls(contents=contents)  # type: ignore
 
     def _render(self) -> Tag:
@@ -42,6 +43,4 @@ class Bare(Component):
         Yields:
             The contents if it is a Var, otherwise nothing.
         """
-        if isinstance(self.contents, Var):
-            # Fast path for Bare text components.
-            yield self.contents
+        yield self.contents
diff --git a/reflex/components/base/body.pyi b/reflex/components/base/body.pyi
index 7ba105a0d..5f55df11b 100644
--- a/reflex/components/base/body.pyi
+++ b/reflex/components/base/body.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/body.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/base/document.pyi b/reflex/components/base/document.pyi
index 6e86badf0..e1e01d5ad 100644
--- a/reflex/components/base/document.pyi
+++ b/reflex/components/base/document.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/document.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/base/fragment.pyi b/reflex/components/base/fragment.pyi
index 83014e20a..c40a83637 100644
--- a/reflex/components/base/fragment.pyi
+++ b/reflex/components/base/fragment.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/fragment.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/base/head.pyi b/reflex/components/base/head.pyi
index dd975844e..4f258b72d 100644
--- a/reflex/components/base/head.pyi
+++ b/reflex/components/base/head.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/head.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/base/link.pyi b/reflex/components/base/link.pyi
index a7754ae9a..df8500304 100644
--- a/reflex/components/base/link.pyi
+++ b/reflex/components/base/link.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/link.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/base/meta.pyi b/reflex/components/base/meta.pyi
index 61f3e344a..7ddeae463 100644
--- a/reflex/components/base/meta.pyi
+++ b/reflex/components/base/meta.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/meta.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/base/script.pyi b/reflex/components/base/script.pyi
index 3a1e6f582..3bd824122 100644
--- a/reflex/components/base/script.pyi
+++ b/reflex/components/base/script.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/base/script.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/base.pyi b/reflex/components/chakra/base.pyi
index a21cd2951..b674b6a69 100644
--- a/reflex/components/chakra/base.pyi
+++ b/reflex/components/chakra/base.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/base.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/badge.pyi b/reflex/components/chakra/datadisplay/badge.pyi
index 8480b89de..d9b4bafe9 100644
--- a/reflex/components/chakra/datadisplay/badge.pyi
+++ b/reflex/components/chakra/datadisplay/badge.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/badge.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/code.pyi b/reflex/components/chakra/datadisplay/code.pyi
index 8702c162e..1efb96487 100644
--- a/reflex/components/chakra/datadisplay/code.pyi
+++ b/reflex/components/chakra/datadisplay/code.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/code.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/divider.pyi b/reflex/components/chakra/datadisplay/divider.pyi
index 174234e5a..fe1740eb4 100644
--- a/reflex/components/chakra/datadisplay/divider.pyi
+++ b/reflex/components/chakra/datadisplay/divider.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/divider.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/keyboard_key.pyi b/reflex/components/chakra/datadisplay/keyboard_key.pyi
index a3e7dcff0..531c92b07 100644
--- a/reflex/components/chakra/datadisplay/keyboard_key.pyi
+++ b/reflex/components/chakra/datadisplay/keyboard_key.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/keyboard_key.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/list.pyi b/reflex/components/chakra/datadisplay/list.pyi
index a246c3f02..a334f4d49 100644
--- a/reflex/components/chakra/datadisplay/list.pyi
+++ b/reflex/components/chakra/datadisplay/list.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/list.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/stat.pyi b/reflex/components/chakra/datadisplay/stat.pyi
index 09b123fac..64c1d4397 100644
--- a/reflex/components/chakra/datadisplay/stat.pyi
+++ b/reflex/components/chakra/datadisplay/stat.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/stat.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/table.pyi b/reflex/components/chakra/datadisplay/table.pyi
index bd9774b7e..fb48aa4b0 100644
--- a/reflex/components/chakra/datadisplay/table.pyi
+++ b/reflex/components/chakra/datadisplay/table.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/table.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/datadisplay/tag.pyi b/reflex/components/chakra/datadisplay/tag.pyi
index 3f4171958..e14c7533c 100644
--- a/reflex/components/chakra/datadisplay/tag.pyi
+++ b/reflex/components/chakra/datadisplay/tag.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/datadisplay/tag.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/disclosure/accordion.pyi b/reflex/components/chakra/disclosure/accordion.pyi
index c18f02a15..dbe6625ac 100644
--- a/reflex/components/chakra/disclosure/accordion.pyi
+++ b/reflex/components/chakra/disclosure/accordion.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/disclosure/accordion.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/disclosure/tabs.pyi b/reflex/components/chakra/disclosure/tabs.pyi
index 097185aa3..43df60516 100644
--- a/reflex/components/chakra/disclosure/tabs.pyi
+++ b/reflex/components/chakra/disclosure/tabs.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/disclosure/tabs.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/disclosure/transition.pyi b/reflex/components/chakra/disclosure/transition.pyi
index 52092e502..9d2a0a6ec 100644
--- a/reflex/components/chakra/disclosure/transition.pyi
+++ b/reflex/components/chakra/disclosure/transition.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/disclosure/transition.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/disclosure/visuallyhidden.pyi b/reflex/components/chakra/disclosure/visuallyhidden.pyi
index b8717da83..7c6445885 100644
--- a/reflex/components/chakra/disclosure/visuallyhidden.pyi
+++ b/reflex/components/chakra/disclosure/visuallyhidden.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/disclosure/visuallyhidden.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/feedback/alert.pyi b/reflex/components/chakra/feedback/alert.pyi
index aae57c1f7..ae905d788 100644
--- a/reflex/components/chakra/feedback/alert.pyi
+++ b/reflex/components/chakra/feedback/alert.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/feedback/alert.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/feedback/circularprogress.pyi b/reflex/components/chakra/feedback/circularprogress.pyi
index 4f1582041..46854b9c3 100644
--- a/reflex/components/chakra/feedback/circularprogress.pyi
+++ b/reflex/components/chakra/feedback/circularprogress.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/feedback/circularprogress.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/feedback/progress.pyi b/reflex/components/chakra/feedback/progress.pyi
index c6c7b1aa4..e85f8defa 100644
--- a/reflex/components/chakra/feedback/progress.pyi
+++ b/reflex/components/chakra/feedback/progress.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/feedback/progress.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/feedback/skeleton.pyi b/reflex/components/chakra/feedback/skeleton.pyi
index a393e5899..2780e8b9a 100644
--- a/reflex/components/chakra/feedback/skeleton.pyi
+++ b/reflex/components/chakra/feedback/skeleton.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/feedback/skeleton.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/feedback/spinner.pyi b/reflex/components/chakra/feedback/spinner.pyi
index 6bd414911..01c882eb3 100644
--- a/reflex/components/chakra/feedback/spinner.pyi
+++ b/reflex/components/chakra/feedback/spinner.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/feedback/spinner.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/button.pyi b/reflex/components/chakra/forms/button.pyi
index 47f2f9222..f6b6c34e6 100644
--- a/reflex/components/chakra/forms/button.pyi
+++ b/reflex/components/chakra/forms/button.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/button.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/checkbox.pyi b/reflex/components/chakra/forms/checkbox.pyi
index 024066d01..bdd93c0f5 100644
--- a/reflex/components/chakra/forms/checkbox.pyi
+++ b/reflex/components/chakra/forms/checkbox.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/checkbox.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/colormodeswitch.pyi b/reflex/components/chakra/forms/colormodeswitch.pyi
index ea273cc1f..31ddb9f1f 100644
--- a/reflex/components/chakra/forms/colormodeswitch.pyi
+++ b/reflex/components/chakra/forms/colormodeswitch.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/colormodeswitch.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/date_picker.pyi b/reflex/components/chakra/forms/date_picker.pyi
index e59fa43d4..0fdbbaafa 100644
--- a/reflex/components/chakra/forms/date_picker.pyi
+++ b/reflex/components/chakra/forms/date_picker.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/date_picker.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/date_time_picker.pyi b/reflex/components/chakra/forms/date_time_picker.pyi
index f205749c0..73ddea1af 100644
--- a/reflex/components/chakra/forms/date_time_picker.pyi
+++ b/reflex/components/chakra/forms/date_time_picker.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/date_time_picker.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/editable.pyi b/reflex/components/chakra/forms/editable.pyi
index 26bb23e5b..d53b1d0ad 100644
--- a/reflex/components/chakra/forms/editable.pyi
+++ b/reflex/components/chakra/forms/editable.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/editable.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/email.pyi b/reflex/components/chakra/forms/email.pyi
index 51f90957d..c616049b7 100644
--- a/reflex/components/chakra/forms/email.pyi
+++ b/reflex/components/chakra/forms/email.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/email.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/form.pyi b/reflex/components/chakra/forms/form.pyi
index 7db40d9e0..2b295a529 100644
--- a/reflex/components/chakra/forms/form.pyi
+++ b/reflex/components/chakra/forms/form.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/form.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/iconbutton.pyi b/reflex/components/chakra/forms/iconbutton.pyi
index 245f7b2f0..3b9cf9e64 100644
--- a/reflex/components/chakra/forms/iconbutton.pyi
+++ b/reflex/components/chakra/forms/iconbutton.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/iconbutton.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/input.pyi b/reflex/components/chakra/forms/input.pyi
index 3c7ee8826..ee6184aa1 100644
--- a/reflex/components/chakra/forms/input.pyi
+++ b/reflex/components/chakra/forms/input.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/input.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/numberinput.pyi b/reflex/components/chakra/forms/numberinput.pyi
index 017040989..bd8e37256 100644
--- a/reflex/components/chakra/forms/numberinput.pyi
+++ b/reflex/components/chakra/forms/numberinput.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/numberinput.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/password.pyi b/reflex/components/chakra/forms/password.pyi
index c9a4ec026..3f08d1ef0 100644
--- a/reflex/components/chakra/forms/password.pyi
+++ b/reflex/components/chakra/forms/password.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/password.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/pininput.pyi b/reflex/components/chakra/forms/pininput.pyi
index f255b7db1..d5abebd0d 100644
--- a/reflex/components/chakra/forms/pininput.pyi
+++ b/reflex/components/chakra/forms/pininput.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/pininput.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/radio.pyi b/reflex/components/chakra/forms/radio.pyi
index d48cb6c33..c392170d9 100644
--- a/reflex/components/chakra/forms/radio.pyi
+++ b/reflex/components/chakra/forms/radio.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/radio.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/rangeslider.pyi b/reflex/components/chakra/forms/rangeslider.pyi
index cb76cfbe8..8bd0b8cd1 100644
--- a/reflex/components/chakra/forms/rangeslider.pyi
+++ b/reflex/components/chakra/forms/rangeslider.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/rangeslider.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/select.pyi b/reflex/components/chakra/forms/select.pyi
index a443896e4..64f0f0fc0 100644
--- a/reflex/components/chakra/forms/select.pyi
+++ b/reflex/components/chakra/forms/select.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/select.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/slider.pyi b/reflex/components/chakra/forms/slider.pyi
index 5bc500930..ed22b13c6 100644
--- a/reflex/components/chakra/forms/slider.pyi
+++ b/reflex/components/chakra/forms/slider.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/slider.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/switch.pyi b/reflex/components/chakra/forms/switch.pyi
index 1af43b2f1..47098a6c2 100644
--- a/reflex/components/chakra/forms/switch.pyi
+++ b/reflex/components/chakra/forms/switch.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/switch.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/textarea.pyi b/reflex/components/chakra/forms/textarea.pyi
index 48358e2ad..572b92ed2 100644
--- a/reflex/components/chakra/forms/textarea.pyi
+++ b/reflex/components/chakra/forms/textarea.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/textarea.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/forms/time_picker.pyi b/reflex/components/chakra/forms/time_picker.pyi
index ac833e37b..7a8e3c1c1 100644
--- a/reflex/components/chakra/forms/time_picker.pyi
+++ b/reflex/components/chakra/forms/time_picker.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/forms/time_picker.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/aspect_ratio.pyi b/reflex/components/chakra/layout/aspect_ratio.pyi
index 1cd574abc..5c1ccf1d2 100644
--- a/reflex/components/chakra/layout/aspect_ratio.pyi
+++ b/reflex/components/chakra/layout/aspect_ratio.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/aspect_ratio.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/box.pyi b/reflex/components/chakra/layout/box.pyi
index ba1f769b8..dde4a2b1e 100644
--- a/reflex/components/chakra/layout/box.pyi
+++ b/reflex/components/chakra/layout/box.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/box.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/card.pyi b/reflex/components/chakra/layout/card.pyi
index 6ec404acd..280afe1fc 100644
--- a/reflex/components/chakra/layout/card.pyi
+++ b/reflex/components/chakra/layout/card.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/card.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/center.pyi b/reflex/components/chakra/layout/center.pyi
index 98fbbb84b..07d5797a5 100644
--- a/reflex/components/chakra/layout/center.pyi
+++ b/reflex/components/chakra/layout/center.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/center.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/container.pyi b/reflex/components/chakra/layout/container.pyi
index 22594f4af..4e93bdb6d 100644
--- a/reflex/components/chakra/layout/container.pyi
+++ b/reflex/components/chakra/layout/container.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/container.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/flex.pyi b/reflex/components/chakra/layout/flex.pyi
index dbb3b36dc..cfc337a67 100644
--- a/reflex/components/chakra/layout/flex.pyi
+++ b/reflex/components/chakra/layout/flex.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/flex.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/grid.pyi b/reflex/components/chakra/layout/grid.pyi
index 7195a1579..8a935bc61 100644
--- a/reflex/components/chakra/layout/grid.pyi
+++ b/reflex/components/chakra/layout/grid.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/grid.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/spacer.pyi b/reflex/components/chakra/layout/spacer.pyi
index 6a793ce19..39951d08f 100644
--- a/reflex/components/chakra/layout/spacer.pyi
+++ b/reflex/components/chakra/layout/spacer.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/spacer.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/stack.pyi b/reflex/components/chakra/layout/stack.pyi
index 28d110979..e725e53ab 100644
--- a/reflex/components/chakra/layout/stack.pyi
+++ b/reflex/components/chakra/layout/stack.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/stack.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/layout/wrap.pyi b/reflex/components/chakra/layout/wrap.pyi
index ba54d9431..494f4b4d3 100644
--- a/reflex/components/chakra/layout/wrap.pyi
+++ b/reflex/components/chakra/layout/wrap.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/layout/wrap.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/media/avatar.pyi b/reflex/components/chakra/media/avatar.pyi
index 69b017801..99e80f058 100644
--- a/reflex/components/chakra/media/avatar.pyi
+++ b/reflex/components/chakra/media/avatar.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/media/avatar.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/media/icon.pyi b/reflex/components/chakra/media/icon.pyi
index 987722c01..17fe9946c 100644
--- a/reflex/components/chakra/media/icon.pyi
+++ b/reflex/components/chakra/media/icon.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/media/icon.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/media/image.pyi b/reflex/components/chakra/media/image.pyi
index e20e3a871..a21ffad39 100644
--- a/reflex/components/chakra/media/image.pyi
+++ b/reflex/components/chakra/media/image.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/media/image.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/navigation/breadcrumb.pyi b/reflex/components/chakra/navigation/breadcrumb.pyi
index e7993cd52..c5884e71c 100644
--- a/reflex/components/chakra/navigation/breadcrumb.pyi
+++ b/reflex/components/chakra/navigation/breadcrumb.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/navigation/breadcrumb.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/navigation/link.pyi b/reflex/components/chakra/navigation/link.pyi
index a5b3db0e0..583ced1e1 100644
--- a/reflex/components/chakra/navigation/link.pyi
+++ b/reflex/components/chakra/navigation/link.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/navigation/link.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/navigation/linkoverlay.pyi b/reflex/components/chakra/navigation/linkoverlay.pyi
index 7daaf1924..6abef3f85 100644
--- a/reflex/components/chakra/navigation/linkoverlay.pyi
+++ b/reflex/components/chakra/navigation/linkoverlay.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/navigation/linkoverlay.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/navigation/stepper.pyi b/reflex/components/chakra/navigation/stepper.pyi
index a4020d1cf..cd5d83f53 100644
--- a/reflex/components/chakra/navigation/stepper.pyi
+++ b/reflex/components/chakra/navigation/stepper.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/navigation/stepper.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/overlay/alertdialog.pyi b/reflex/components/chakra/overlay/alertdialog.pyi
index 01fd6240e..5d6516f9d 100644
--- a/reflex/components/chakra/overlay/alertdialog.pyi
+++ b/reflex/components/chakra/overlay/alertdialog.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/overlay/alertdialog.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/overlay/drawer.pyi b/reflex/components/chakra/overlay/drawer.pyi
index be6c3830b..42aaaa078 100644
--- a/reflex/components/chakra/overlay/drawer.pyi
+++ b/reflex/components/chakra/overlay/drawer.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/overlay/drawer.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/overlay/menu.pyi b/reflex/components/chakra/overlay/menu.pyi
index 3450cfde9..eebb46c22 100644
--- a/reflex/components/chakra/overlay/menu.pyi
+++ b/reflex/components/chakra/overlay/menu.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/overlay/menu.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/overlay/modal.pyi b/reflex/components/chakra/overlay/modal.pyi
index 5550f6d42..77b2460d2 100644
--- a/reflex/components/chakra/overlay/modal.pyi
+++ b/reflex/components/chakra/overlay/modal.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/overlay/modal.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/overlay/popover.pyi b/reflex/components/chakra/overlay/popover.pyi
index 2f39860d3..50492d45f 100644
--- a/reflex/components/chakra/overlay/popover.pyi
+++ b/reflex/components/chakra/overlay/popover.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/overlay/popover.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/overlay/tooltip.pyi b/reflex/components/chakra/overlay/tooltip.pyi
index e7aad7f50..8d4461d63 100644
--- a/reflex/components/chakra/overlay/tooltip.pyi
+++ b/reflex/components/chakra/overlay/tooltip.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/overlay/tooltip.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/typography/heading.pyi b/reflex/components/chakra/typography/heading.pyi
index e6cfa6b11..c8b8c11d3 100644
--- a/reflex/components/chakra/typography/heading.pyi
+++ b/reflex/components/chakra/typography/heading.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/typography/heading.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/typography/highlight.pyi b/reflex/components/chakra/typography/highlight.pyi
index 0d935a7e8..10eb2bdf2 100644
--- a/reflex/components/chakra/typography/highlight.pyi
+++ b/reflex/components/chakra/typography/highlight.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/typography/highlight.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/typography/span.pyi b/reflex/components/chakra/typography/span.pyi
index 5cb16e319..85b63c318 100644
--- a/reflex/components/chakra/typography/span.pyi
+++ b/reflex/components/chakra/typography/span.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/typography/span.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/chakra/typography/text.pyi b/reflex/components/chakra/typography/text.pyi
index ca81acc24..9681a2bb1 100644
--- a/reflex/components/chakra/typography/text.pyi
+++ b/reflex/components/chakra/typography/text.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/chakra/typography/text.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/component.py b/reflex/components/component.py
index 6cb30186d..eea570a40 100644
--- a/reflex/components/component.py
+++ b/reflex/components/component.py
@@ -1085,15 +1085,19 @@ class Component(BaseComponent, ABC):
             *var_imports,
         )
 
-    def get_imports(self) -> imports.ImportDict:
+    def get_imports(self, collapse: bool = False) -> imports.ImportDict:
         """Get all the libraries and fields that are used by the component and its children.
 
+        Args:
+            collapse: Whether to collapse the imports by removing duplicates.
+
         Returns:
             The import dict with the required imports.
         """
-        return imports.merge_imports(
+        _imports = imports.merge_imports(
             self._get_imports(), *[child.get_imports() for child in self.children]
         )
+        return imports.collapse_imports(_imports) if collapse else _imports
 
     def _get_mount_lifecycle_hook(self) -> str | None:
         """Generate the component lifecycle hook.
diff --git a/reflex/components/core/banner.pyi b/reflex/components/core/banner.pyi
index 2972bd4d7..43fc53e29 100644
--- a/reflex/components/core/banner.pyi
+++ b/reflex/components/core/banner.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/core/banner.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/core/client_side_routing.pyi b/reflex/components/core/client_side_routing.pyi
index 53bf90043..c51f7870d 100644
--- a/reflex/components/core/client_side_routing.pyi
+++ b/reflex/components/core/client_side_routing.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/core/client_side_routing.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/core/debounce.pyi b/reflex/components/core/debounce.pyi
index a37d6c1ae..5e3848d09 100644
--- a/reflex/components/core/debounce.pyi
+++ b/reflex/components/core/debounce.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/core/debounce.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/core/html.pyi b/reflex/components/core/html.pyi
index e5246380c..e07f455bb 100644
--- a/reflex/components/core/html.pyi
+++ b/reflex/components/core/html.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/core/html.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/core/upload.pyi b/reflex/components/core/upload.pyi
index bb246f69b..b8387e696 100644
--- a/reflex/components/core/upload.pyi
+++ b/reflex/components/core/upload.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/core/upload.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/datadisplay/code.pyi b/reflex/components/datadisplay/code.pyi
index 2a32ad5e0..9c67f00de 100644
--- a/reflex/components/datadisplay/code.pyi
+++ b/reflex/components/datadisplay/code.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/datadisplay/code.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/datadisplay/dataeditor.pyi b/reflex/components/datadisplay/dataeditor.pyi
index fcc299926..fe8c52aad 100644
--- a/reflex/components/datadisplay/dataeditor.pyi
+++ b/reflex/components/datadisplay/dataeditor.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/datadisplay/dataeditor.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/element.pyi b/reflex/components/el/element.pyi
index 5b488d919..4ac56c0e8 100644
--- a/reflex/components/el/element.pyi
+++ b/reflex/components/el/element.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/element.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/base.pyi b/reflex/components/el/elements/base.pyi
index 5b58c88d6..c48688044 100644
--- a/reflex/components/el/elements/base.pyi
+++ b/reflex/components/el/elements/base.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/base.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/forms.pyi b/reflex/components/el/elements/forms.pyi
index 0916db76e..78f55c9a9 100644
--- a/reflex/components/el/elements/forms.pyi
+++ b/reflex/components/el/elements/forms.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/forms.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/inline.pyi b/reflex/components/el/elements/inline.pyi
index 971ec8d68..744b21981 100644
--- a/reflex/components/el/elements/inline.pyi
+++ b/reflex/components/el/elements/inline.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/inline.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/media.pyi b/reflex/components/el/elements/media.pyi
index 6003986bd..1fc5a4c23 100644
--- a/reflex/components/el/elements/media.pyi
+++ b/reflex/components/el/elements/media.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/media.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/metadata.pyi b/reflex/components/el/elements/metadata.pyi
index 8dd05ff96..1ca54b21d 100644
--- a/reflex/components/el/elements/metadata.pyi
+++ b/reflex/components/el/elements/metadata.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/metadata.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/other.pyi b/reflex/components/el/elements/other.pyi
index 1d939d5c2..f05965115 100644
--- a/reflex/components/el/elements/other.pyi
+++ b/reflex/components/el/elements/other.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/other.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/scripts.pyi b/reflex/components/el/elements/scripts.pyi
index ca2ec9fc6..9d8f5439f 100644
--- a/reflex/components/el/elements/scripts.pyi
+++ b/reflex/components/el/elements/scripts.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/scripts.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/sectioning.pyi b/reflex/components/el/elements/sectioning.pyi
index 8233d45d3..a3363a99c 100644
--- a/reflex/components/el/elements/sectioning.pyi
+++ b/reflex/components/el/elements/sectioning.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/sectioning.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/tables.pyi b/reflex/components/el/elements/tables.pyi
index 3d1ac50a3..56c03edea 100644
--- a/reflex/components/el/elements/tables.pyi
+++ b/reflex/components/el/elements/tables.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/tables.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/el/elements/typography.pyi b/reflex/components/el/elements/typography.pyi
index bb70908af..cad359b95 100644
--- a/reflex/components/el/elements/typography.pyi
+++ b/reflex/components/el/elements/typography.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/el/elements/typography.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/gridjs/datatable.pyi b/reflex/components/gridjs/datatable.pyi
index 691c3d4bd..522ac0451 100644
--- a/reflex/components/gridjs/datatable.pyi
+++ b/reflex/components/gridjs/datatable.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/gridjs/datatable.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/lucide/icon.pyi b/reflex/components/lucide/icon.pyi
index a035fbad1..c3ccf8806 100644
--- a/reflex/components/lucide/icon.pyi
+++ b/reflex/components/lucide/icon.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/lucide/icon.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/markdown/markdown.pyi b/reflex/components/markdown/markdown.pyi
index c9cbfd6db..7f7b7c4e5 100644
--- a/reflex/components/markdown/markdown.pyi
+++ b/reflex/components/markdown/markdown.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/markdown/markdown.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/moment/moment.pyi b/reflex/components/moment/moment.pyi
index 6eb780cda..73ad8ca5d 100644
--- a/reflex/components/moment/moment.pyi
+++ b/reflex/components/moment/moment.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/moment/moment.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/next/base.pyi b/reflex/components/next/base.pyi
index 57fab6a9a..9cc049fff 100644
--- a/reflex/components/next/base.pyi
+++ b/reflex/components/next/base.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/next/base.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/next/image.pyi b/reflex/components/next/image.pyi
index a8f7d8379..c1ee16374 100644
--- a/reflex/components/next/image.pyi
+++ b/reflex/components/next/image.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/next/image.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/next/link.pyi b/reflex/components/next/link.pyi
index 3d8809968..e8a98e0cc 100644
--- a/reflex/components/next/link.pyi
+++ b/reflex/components/next/link.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/next/link.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/next/video.pyi b/reflex/components/next/video.pyi
index cee5c4c9d..64abc76d0 100644
--- a/reflex/components/next/video.pyi
+++ b/reflex/components/next/video.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/next/video.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/plotly/plotly.pyi b/reflex/components/plotly/plotly.pyi
index f9d3336d7..fcd964b5a 100644
--- a/reflex/components/plotly/plotly.pyi
+++ b/reflex/components/plotly/plotly.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/plotly/plotly.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/primitives/accordion.pyi b/reflex/components/radix/primitives/accordion.pyi
index ec8fd1a91..3e8493142 100644
--- a/reflex/components/radix/primitives/accordion.pyi
+++ b/reflex/components/radix/primitives/accordion.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/primitives/accordion.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/primitives/base.pyi b/reflex/components/radix/primitives/base.pyi
index f31a66252..c8d98e9bd 100644
--- a/reflex/components/radix/primitives/base.pyi
+++ b/reflex/components/radix/primitives/base.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/primitives/base.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/primitives/drawer.pyi b/reflex/components/radix/primitives/drawer.pyi
index 42860dcb2..d4013ac8b 100644
--- a/reflex/components/radix/primitives/drawer.pyi
+++ b/reflex/components/radix/primitives/drawer.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/primitives/drawer.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/primitives/form.pyi b/reflex/components/radix/primitives/form.pyi
index b14af9ef2..9928dbfa7 100644
--- a/reflex/components/radix/primitives/form.pyi
+++ b/reflex/components/radix/primitives/form.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/primitives/form.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/primitives/progress.pyi b/reflex/components/radix/primitives/progress.pyi
index 98678588d..6af8a3bcc 100644
--- a/reflex/components/radix/primitives/progress.pyi
+++ b/reflex/components/radix/primitives/progress.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/primitives/progress.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/primitives/slider.pyi b/reflex/components/radix/primitives/slider.pyi
index 62940118f..bb30cb696 100644
--- a/reflex/components/radix/primitives/slider.pyi
+++ b/reflex/components/radix/primitives/slider.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/primitives/slider.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/base.pyi b/reflex/components/radix/themes/base.pyi
index 360e50b8e..969dca2ac 100644
--- a/reflex/components/radix/themes/base.pyi
+++ b/reflex/components/radix/themes/base.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/base.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/color_mode.pyi b/reflex/components/radix/themes/color_mode.pyi
index e8db4bb77..cb851ebde 100644
--- a/reflex/components/radix/themes/color_mode.pyi
+++ b/reflex/components/radix/themes/color_mode.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/color_mode.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/alert_dialog.pyi b/reflex/components/radix/themes/components/alert_dialog.pyi
index e35001c0b..a61a5bbbc 100644
--- a/reflex/components/radix/themes/components/alert_dialog.pyi
+++ b/reflex/components/radix/themes/components/alert_dialog.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/alert_dialog.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/aspect_ratio.pyi b/reflex/components/radix/themes/components/aspect_ratio.pyi
index d75105149..dc815991f 100644
--- a/reflex/components/radix/themes/components/aspect_ratio.pyi
+++ b/reflex/components/radix/themes/components/aspect_ratio.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/aspect_ratio.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/avatar.pyi b/reflex/components/radix/themes/components/avatar.pyi
index 8a61a64a2..544522e73 100644
--- a/reflex/components/radix/themes/components/avatar.pyi
+++ b/reflex/components/radix/themes/components/avatar.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/avatar.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/badge.pyi b/reflex/components/radix/themes/components/badge.pyi
index e4e4bdf64..eeaf4b835 100644
--- a/reflex/components/radix/themes/components/badge.pyi
+++ b/reflex/components/radix/themes/components/badge.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/badge.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/button.pyi b/reflex/components/radix/themes/components/button.pyi
index e2ec05ded..4f6e197ad 100644
--- a/reflex/components/radix/themes/components/button.pyi
+++ b/reflex/components/radix/themes/components/button.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/button.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/callout.pyi b/reflex/components/radix/themes/components/callout.pyi
index c96c59b64..ff7cf0b00 100644
--- a/reflex/components/radix/themes/components/callout.pyi
+++ b/reflex/components/radix/themes/components/callout.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/callout.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/card.pyi b/reflex/components/radix/themes/components/card.pyi
index 3a0b2ce63..b6df648cb 100644
--- a/reflex/components/radix/themes/components/card.pyi
+++ b/reflex/components/radix/themes/components/card.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/card.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/checkbox.pyi b/reflex/components/radix/themes/components/checkbox.pyi
index fe0c4d998..229fca26a 100644
--- a/reflex/components/radix/themes/components/checkbox.pyi
+++ b/reflex/components/radix/themes/components/checkbox.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/checkbox.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/context_menu.pyi b/reflex/components/radix/themes/components/context_menu.pyi
index 0f8a0b771..9e819f911 100644
--- a/reflex/components/radix/themes/components/context_menu.pyi
+++ b/reflex/components/radix/themes/components/context_menu.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/context_menu.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/dialog.pyi b/reflex/components/radix/themes/components/dialog.pyi
index 30a8647c2..f3d158418 100644
--- a/reflex/components/radix/themes/components/dialog.pyi
+++ b/reflex/components/radix/themes/components/dialog.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/dialog.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/dropdown_menu.pyi b/reflex/components/radix/themes/components/dropdown_menu.pyi
index 8f482baa8..a8fad6d86 100644
--- a/reflex/components/radix/themes/components/dropdown_menu.pyi
+++ b/reflex/components/radix/themes/components/dropdown_menu.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/dropdown_menu.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/hover_card.pyi b/reflex/components/radix/themes/components/hover_card.pyi
index 109c6092e..697ef2cdc 100644
--- a/reflex/components/radix/themes/components/hover_card.pyi
+++ b/reflex/components/radix/themes/components/hover_card.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/hover_card.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/icon_button.pyi b/reflex/components/radix/themes/components/icon_button.pyi
index 7abd29682..b26e7a576 100644
--- a/reflex/components/radix/themes/components/icon_button.pyi
+++ b/reflex/components/radix/themes/components/icon_button.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/icon_button.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/inset.pyi b/reflex/components/radix/themes/components/inset.pyi
index f4b1bc41f..23f212d09 100644
--- a/reflex/components/radix/themes/components/inset.pyi
+++ b/reflex/components/radix/themes/components/inset.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/inset.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/popover.pyi b/reflex/components/radix/themes/components/popover.pyi
index 6b8345775..04d705051 100644
--- a/reflex/components/radix/themes/components/popover.pyi
+++ b/reflex/components/radix/themes/components/popover.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/popover.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/radio_group.pyi b/reflex/components/radix/themes/components/radio_group.pyi
index 0fec881ba..ae6b73389 100644
--- a/reflex/components/radix/themes/components/radio_group.pyi
+++ b/reflex/components/radix/themes/components/radio_group.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/radio_group.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/scroll_area.pyi b/reflex/components/radix/themes/components/scroll_area.pyi
index 676cc41ae..721ec97ae 100644
--- a/reflex/components/radix/themes/components/scroll_area.pyi
+++ b/reflex/components/radix/themes/components/scroll_area.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/scroll_area.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/select.pyi b/reflex/components/radix/themes/components/select.pyi
index dc93aeb66..a8dfb869d 100644
--- a/reflex/components/radix/themes/components/select.pyi
+++ b/reflex/components/radix/themes/components/select.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/select.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/separator.pyi b/reflex/components/radix/themes/components/separator.pyi
index be46643c1..6e88bc4dd 100644
--- a/reflex/components/radix/themes/components/separator.pyi
+++ b/reflex/components/radix/themes/components/separator.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/separator.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/slider.pyi b/reflex/components/radix/themes/components/slider.pyi
index 1c1935f60..5a170c542 100644
--- a/reflex/components/radix/themes/components/slider.pyi
+++ b/reflex/components/radix/themes/components/slider.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/slider.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/switch.pyi b/reflex/components/radix/themes/components/switch.pyi
index cf2bf5ea8..0d40928ef 100644
--- a/reflex/components/radix/themes/components/switch.pyi
+++ b/reflex/components/radix/themes/components/switch.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/switch.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/table.pyi b/reflex/components/radix/themes/components/table.pyi
index 5220601ce..5669d717c 100644
--- a/reflex/components/radix/themes/components/table.pyi
+++ b/reflex/components/radix/themes/components/table.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/table.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/tabs.pyi b/reflex/components/radix/themes/components/tabs.pyi
index 87b8df31d..e05281f50 100644
--- a/reflex/components/radix/themes/components/tabs.pyi
+++ b/reflex/components/radix/themes/components/tabs.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/tabs.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/text_area.pyi b/reflex/components/radix/themes/components/text_area.pyi
index ab5dbd1d0..48220be54 100644
--- a/reflex/components/radix/themes/components/text_area.pyi
+++ b/reflex/components/radix/themes/components/text_area.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/text_area.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/text_field.pyi b/reflex/components/radix/themes/components/text_field.pyi
index 6cadcaa11..71662e0a0 100644
--- a/reflex/components/radix/themes/components/text_field.pyi
+++ b/reflex/components/radix/themes/components/text_field.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/text_field.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/components/tooltip.pyi b/reflex/components/radix/themes/components/tooltip.pyi
index 531569ae2..b9c0feca6 100644
--- a/reflex/components/radix/themes/components/tooltip.pyi
+++ b/reflex/components/radix/themes/components/tooltip.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/components/tooltip.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/base.pyi b/reflex/components/radix/themes/layout/base.pyi
index 11f1d1412..38c6f659a 100644
--- a/reflex/components/radix/themes/layout/base.pyi
+++ b/reflex/components/radix/themes/layout/base.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/base.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/box.pyi b/reflex/components/radix/themes/layout/box.pyi
index 65c2e81a8..323a88540 100644
--- a/reflex/components/radix/themes/layout/box.pyi
+++ b/reflex/components/radix/themes/layout/box.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/box.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/center.pyi b/reflex/components/radix/themes/layout/center.pyi
index 726a66f0a..ef764592a 100644
--- a/reflex/components/radix/themes/layout/center.pyi
+++ b/reflex/components/radix/themes/layout/center.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/center.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/container.pyi b/reflex/components/radix/themes/layout/container.pyi
index b45bfdae6..4e7bc275b 100644
--- a/reflex/components/radix/themes/layout/container.pyi
+++ b/reflex/components/radix/themes/layout/container.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/container.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/flex.pyi b/reflex/components/radix/themes/layout/flex.pyi
index fe8c6d6b2..115e1d1ae 100644
--- a/reflex/components/radix/themes/layout/flex.pyi
+++ b/reflex/components/radix/themes/layout/flex.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/flex.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/grid.pyi b/reflex/components/radix/themes/layout/grid.pyi
index e6107f7de..cfb9c447e 100644
--- a/reflex/components/radix/themes/layout/grid.pyi
+++ b/reflex/components/radix/themes/layout/grid.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/grid.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/list.pyi b/reflex/components/radix/themes/layout/list.pyi
index 382e5aaf5..df76a96a6 100644
--- a/reflex/components/radix/themes/layout/list.pyi
+++ b/reflex/components/radix/themes/layout/list.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/list.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/section.pyi b/reflex/components/radix/themes/layout/section.pyi
index 0236fda64..5b9ef9c5f 100644
--- a/reflex/components/radix/themes/layout/section.pyi
+++ b/reflex/components/radix/themes/layout/section.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/section.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/spacer.pyi b/reflex/components/radix/themes/layout/spacer.pyi
index 7d0a49d61..5f9d654a3 100644
--- a/reflex/components/radix/themes/layout/spacer.pyi
+++ b/reflex/components/radix/themes/layout/spacer.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/spacer.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/layout/stack.pyi b/reflex/components/radix/themes/layout/stack.pyi
index 743318d7a..f14cd684c 100644
--- a/reflex/components/radix/themes/layout/stack.pyi
+++ b/reflex/components/radix/themes/layout/stack.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/layout/stack.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/typography/blockquote.pyi b/reflex/components/radix/themes/typography/blockquote.pyi
index 435d76409..76855b287 100644
--- a/reflex/components/radix/themes/typography/blockquote.pyi
+++ b/reflex/components/radix/themes/typography/blockquote.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/typography/blockquote.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/typography/code.pyi b/reflex/components/radix/themes/typography/code.pyi
index 41fd781c0..354c31cd1 100644
--- a/reflex/components/radix/themes/typography/code.pyi
+++ b/reflex/components/radix/themes/typography/code.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/typography/code.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/typography/heading.pyi b/reflex/components/radix/themes/typography/heading.pyi
index 87e0c295a..b10ea01ca 100644
--- a/reflex/components/radix/themes/typography/heading.pyi
+++ b/reflex/components/radix/themes/typography/heading.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/typography/heading.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/typography/link.pyi b/reflex/components/radix/themes/typography/link.pyi
index 5e343f5fb..ea519d3e4 100644
--- a/reflex/components/radix/themes/typography/link.pyi
+++ b/reflex/components/radix/themes/typography/link.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/typography/link.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/radix/themes/typography/text.pyi b/reflex/components/radix/themes/typography/text.pyi
index 054b331d9..ea52eaca1 100644
--- a/reflex/components/radix/themes/typography/text.pyi
+++ b/reflex/components/radix/themes/typography/text.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/radix/themes/typography/text.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/react_player/audio.pyi b/reflex/components/react_player/audio.pyi
index d45dbcdaf..46c9573bd 100644
--- a/reflex/components/react_player/audio.pyi
+++ b/reflex/components/react_player/audio.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/react_player/audio.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/react_player/react_player.pyi b/reflex/components/react_player/react_player.pyi
index 49ab91ab1..7ceaec569 100644
--- a/reflex/components/react_player/react_player.pyi
+++ b/reflex/components/react_player/react_player.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/react_player/react_player.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/react_player/video.pyi b/reflex/components/react_player/video.pyi
index a3c447cb0..8dedde383 100644
--- a/reflex/components/react_player/video.pyi
+++ b/reflex/components/react_player/video.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/react_player/video.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/recharts/cartesian.pyi b/reflex/components/recharts/cartesian.pyi
index 3af7849a2..51f8f7160 100644
--- a/reflex/components/recharts/cartesian.pyi
+++ b/reflex/components/recharts/cartesian.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/recharts/cartesian.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/recharts/charts.pyi b/reflex/components/recharts/charts.pyi
index 2d133cba7..e8562ee4d 100644
--- a/reflex/components/recharts/charts.pyi
+++ b/reflex/components/recharts/charts.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/recharts/charts.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/recharts/general.pyi b/reflex/components/recharts/general.pyi
index 8b5cb5c62..fdc35019c 100644
--- a/reflex/components/recharts/general.pyi
+++ b/reflex/components/recharts/general.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/recharts/general.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/recharts/polar.pyi b/reflex/components/recharts/polar.pyi
index 8270f1cde..d593aae0e 100644
--- a/reflex/components/recharts/polar.pyi
+++ b/reflex/components/recharts/polar.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/recharts/polar.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/recharts/recharts.pyi b/reflex/components/recharts/recharts.pyi
index 1eb3a2203..46f763a7c 100644
--- a/reflex/components/recharts/recharts.pyi
+++ b/reflex/components/recharts/recharts.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/recharts/recharts.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/components/suneditor/editor.pyi b/reflex/components/suneditor/editor.pyi
index 867274434..f878ef538 100644
--- a/reflex/components/suneditor/editor.pyi
+++ b/reflex/components/suneditor/editor.pyi
@@ -1,6 +1,6 @@
 """Stub file for reflex/components/suneditor/editor.py"""
 # ------------------- DO NOT EDIT ----------------------
-# This file was generated by `scripts/pyi_generator.py`!
+# This file was generated by `reflex/utils/pyi_generator.py`!
 # ------------------------------------------------------
 
 from typing import Any, Dict, Literal, Optional, Union, overload
diff --git a/reflex/custom_components/custom_components.py b/reflex/custom_components/custom_components.py
index 981038c1c..6e84d13bc 100644
--- a/reflex/custom_components/custom_components.py
+++ b/reflex/custom_components/custom_components.py
@@ -20,6 +20,7 @@ from reflex import constants
 from reflex.config import get_config
 from reflex.constants import CustomComponents
 from reflex.utils import console
+from reflex.utils.pyi_generator import PyiGenerator
 
 config = get_config()
 custom_components_cli = typer.Typer()
@@ -413,6 +414,18 @@ def _run_commands_in_subprocess(cmds: list[str]) -> bool:
         return False
 
 
+def _make_pyi_files():
+    """Create pyi files for the custom component."""
+    from glob import glob
+
+    package_name = glob("custom_components/*.egg-info")[0].replace(".egg-info", "")
+
+    for dir, _, _ in os.walk(f"./{package_name}"):
+        if "__pycache__" in dir:
+            continue
+        PyiGenerator().scan_all([dir])
+
+
 def _run_build():
     """Run the build command.
 
@@ -421,6 +434,8 @@ def _run_build():
     """
     console.print("Building custom component...")
 
+    _make_pyi_files()
+
     cmds = [sys.executable, "-m", "build", "."]
     if _run_commands_in_subprocess(cmds):
         console.info("Custom component built successfully!")
diff --git a/scripts/pyi_generator.py b/reflex/utils/pyi_generator.py
similarity index 86%
rename from scripts/pyi_generator.py
rename to reflex/utils/pyi_generator.py
index 35ce6f50a..82eb7cb80 100644
--- a/scripts/pyi_generator.py
+++ b/reflex/utils/pyi_generator.py
@@ -1,5 +1,7 @@
 """The pyi generator module."""
 
+from __future__ import annotations
+
 import ast
 import contextlib
 import importlib
@@ -7,7 +9,6 @@ import inspect
 import logging
 import re
 import subprocess
-import sys
 import textwrap
 import typing
 from inspect import getfullargspec
@@ -16,8 +17,11 @@ from pathlib import Path
 from types import ModuleType, SimpleNamespace
 from typing import Any, Callable, Iterable, Type, get_args
 
-import black
-import black.mode
+try:
+    import black
+    import black.mode
+except ImportError:
+    black = None
 
 from reflex.components.component import Component
 from reflex.utils import types as rx_types
@@ -25,11 +29,8 @@ from reflex.vars import Var
 
 logger = logging.getLogger("pyi_generator")
 
-LAST_RUN_COMMIT_SHA_FILE = Path(".pyi_generator_last_run").resolve()
 INIT_FILE = Path("reflex/__init__.pyi").resolve()
 PWD = Path(".").resolve()
-GENERATOR_FILE = Path(__file__).resolve()
-GENERATOR_DIFF_FILE = Path(".pyi_generator_diff").resolve()
 
 EXCLUDED_FILES = [
     "__init__.py",
@@ -102,79 +103,6 @@ def _relative_to_pwd(path: Path) -> Path:
     return path
 
 
-def _git_diff(args: list[str]) -> str:
-    """Run a git diff command.
-
-    Args:
-        args: The args to pass to git diff.
-
-    Returns:
-        The output of the git diff command.
-    """
-    cmd = ["git", "diff", "--no-color", *args]
-    return subprocess.run(cmd, capture_output=True, encoding="utf-8").stdout
-
-
-def _git_changed_files(args: list[str] | None = None) -> list[Path]:
-    """Get the list of changed files for a git diff command.
-
-    Args:
-        args: The args to pass to git diff.
-
-    Returns:
-        The list of changed files.
-    """
-    if not args:
-        args = []
-
-    if "--name-only" not in args:
-        args.insert(0, "--name-only")
-
-    diff = _git_diff(args).splitlines()
-    return [Path(file.strip()) for file in diff]
-
-
-def _get_changed_files() -> list[Path] | None:
-    """Get the list of changed files since the last run of the generator.
-
-    Returns:
-        The list of changed files, or None if all files should be regenerated.
-    """
-    try:
-        last_run_commit_sha = LAST_RUN_COMMIT_SHA_FILE.read_text().strip()
-    except FileNotFoundError:
-        logger.info(
-            "pyi_generator.py last run could not be determined, regenerating all .pyi files"
-        )
-        return None
-    changed_files = _git_changed_files([f"{last_run_commit_sha}..HEAD"])
-    # get all unstaged changes
-    changed_files.extend(_git_changed_files())
-    if _relative_to_pwd(GENERATOR_FILE) not in changed_files:
-        return changed_files
-    logger.info("pyi_generator.py has changed, checking diff now")
-    diff = "".join(_git_diff([GENERATOR_FILE.as_posix()]).splitlines()[2:])
-
-    try:
-        last_diff = GENERATOR_DIFF_FILE.read_text()
-        if diff != last_diff:
-            logger.info("pyi_generator.py has changed, regenerating all .pyi files")
-            changed_files = None
-        else:
-            logger.info(
-                "pyi_generator.py has not changed, only regenerating changed files"
-            )
-    except FileNotFoundError:
-        logger.info(
-            "pyi_generator.py diff could not be determined, regenerating all .pyi files"
-        )
-        changed_files = None
-
-    GENERATOR_DIFF_FILE.write_text(diff)
-
-    return changed_files
-
-
 def _get_type_hint(value, type_hint_globals, is_optional=True) -> str:
     """Resolve the type hint for value.
 
@@ -798,24 +726,26 @@ class PyiGenerator:
         pyi_content = [
             f'"""Stub file for {relpath}"""',
             "# ------------------- DO NOT EDIT ----------------------",
-            "# This file was generated by `scripts/pyi_generator.py`!",
+            "# This file was generated by `reflex/utils/pyi_generator.py`!",
             "# ------------------------------------------------------",
             "",
         ]
-
-        for formatted_line in black.format_file_contents(
-            src_contents=source,
-            fast=True,
-            mode=black.mode.Mode(is_pyi=True),
-        ).splitlines():
-            # Bit of a hack here, since the AST cannot represent comments.
-            if "def create(" in formatted_line:
-                pyi_content.append(formatted_line + "  # type: ignore")
-            elif "Figure" in formatted_line:
-                pyi_content.append(formatted_line + "  # type: ignore")
-            else:
-                pyi_content.append(formatted_line)
-        pyi_content.append("")  # add empty line at the end for formatting
+        if black is not None:
+            for formatted_line in black.format_file_contents(
+                src_contents=source,
+                fast=True,
+                mode=black.mode.Mode(is_pyi=True),
+            ).splitlines():
+                # Bit of a hack here, since the AST cannot represent comments.
+                if "def create(" in formatted_line:
+                    pyi_content.append(formatted_line + "  # type: ignore")
+                elif "Figure" in formatted_line:
+                    pyi_content.append(formatted_line + "  # type: ignore")
+                else:
+                    pyi_content.append(formatted_line)
+            pyi_content.append("")  # add empty line at the end for formatting
+        else:
+            pyi_content = source.splitlines()
 
         pyi_path = module_path.with_suffix(".pyi")
         pyi_path.write_text("\n".join(pyi_content))
@@ -908,32 +838,5 @@ def generate_init():
         for mod, path in _MAPPING.items()
     ]
     imports.append("")
-
-    INIT_FILE.write_text("\n".join(imports))
-
-
-if __name__ == "__main__":
-    logging.basicConfig(level=logging.DEBUG)
-    logging.getLogger("blib2to3.pgen2.driver").setLevel(logging.INFO)
-
-    targets = (
-        [arg for arg in sys.argv[1:] if not arg.startswith("tests")]
-        if len(sys.argv) > 1
-        else ["reflex/components"]
-    )
-    logger.info(f"Running .pyi generator for {targets}")
-
-    changed_files = _get_changed_files()
-    if changed_files is None:
-        logger.info("Changed files could not be detected, regenerating all .pyi files")
-    else:
-        logger.info(f"Detected changed files: {changed_files}")
-
-    gen = PyiGenerator()
-    gen.scan_all(targets, changed_files)
-    generate_init()
-
-    current_commit_sha = subprocess.run(
-        ["git", "rev-parse", "HEAD"], capture_output=True, encoding="utf-8"
-    ).stdout.strip()
-    LAST_RUN_COMMIT_SHA_FILE.write_text(current_commit_sha)
+    with contextlib.suppress(Exception):
+        INIT_FILE.write_text("\n".join(imports))
diff --git a/scripts/make_pyi.py b/scripts/make_pyi.py
new file mode 100644
index 000000000..10a2e1acd
--- /dev/null
+++ b/scripts/make_pyi.py
@@ -0,0 +1,112 @@
+"""The pyi generator module."""
+
+import logging
+import subprocess
+import sys
+from pathlib import Path
+
+from reflex.utils.pyi_generator import PyiGenerator, _relative_to_pwd, generate_init
+
+logger = logging.getLogger("pyi_generator")
+
+LAST_RUN_COMMIT_SHA_FILE = Path(".pyi_generator_last_run").resolve()
+GENERATOR_FILE = Path(__file__).resolve()
+GENERATOR_DIFF_FILE = Path(".pyi_generator_diff").resolve()
+
+
+def _git_diff(args: list[str]) -> str:
+    """Run a git diff command.
+
+    Args:
+        args: The args to pass to git diff.
+
+    Returns:
+        The output of the git diff command.
+    """
+    cmd = ["git", "diff", "--no-color", *args]
+    return subprocess.run(cmd, capture_output=True, encoding="utf-8").stdout
+
+
+def _git_changed_files(args: list[str] | None = None) -> list[Path]:
+    """Get the list of changed files for a git diff command.
+
+    Args:
+        args: The args to pass to git diff.
+
+    Returns:
+        The list of changed files.
+    """
+    if not args:
+        args = []
+
+    if "--name-only" not in args:
+        args.insert(0, "--name-only")
+
+    diff = _git_diff(args).splitlines()
+    return [Path(file.strip()) for file in diff]
+
+
+def _get_changed_files() -> list[Path] | None:
+    """Get the list of changed files since the last run of the generator.
+
+    Returns:
+        The list of changed files, or None if all files should be regenerated.
+    """
+    try:
+        last_run_commit_sha = LAST_RUN_COMMIT_SHA_FILE.read_text().strip()
+    except FileNotFoundError:
+        logger.info(
+            "make_pyi.py last run could not be determined, regenerating all .pyi files"
+        )
+        return None
+    changed_files = _git_changed_files([f"{last_run_commit_sha}..HEAD"])
+    # get all unstaged changes
+    changed_files.extend(_git_changed_files())
+    if _relative_to_pwd(GENERATOR_FILE) not in changed_files:
+        return changed_files
+    logger.info("make_pyi.py has changed, checking diff now")
+    diff = "".join(_git_diff([GENERATOR_FILE.as_posix()]).splitlines()[2:])
+
+    try:
+        last_diff = GENERATOR_DIFF_FILE.read_text()
+        if diff != last_diff:
+            logger.info("make_pyi.py has changed, regenerating all .pyi files")
+            changed_files = None
+        else:
+            logger.info("make_pyi.py has not changed, only regenerating changed files")
+    except FileNotFoundError:
+        logger.info(
+            "make_pyi.py diff could not be determined, regenerating all .pyi files"
+        )
+        changed_files = None
+
+    GENERATOR_DIFF_FILE.write_text(diff)
+
+    return changed_files
+
+
+if __name__ == "__main__":
+    logging.basicConfig(level=logging.DEBUG)
+    logging.getLogger("blib2to3.pgen2.driver").setLevel(logging.INFO)
+
+    targets = (
+        [arg for arg in sys.argv[1:] if not arg.startswith("tests")]
+        if len(sys.argv) > 1
+        else ["reflex/components"]
+    )
+    logger.info(f"Running .pyi generator for {targets}")
+
+    changed_files = _get_changed_files()
+    if changed_files is None:
+        logger.info("Changed files could not be detected, regenerating all .pyi files")
+    else:
+        logger.info(f"Detected changed files: {changed_files}")
+
+    gen = PyiGenerator()
+    gen.scan_all(targets, changed_files)
+    generate_init()
+
+    current_commit_sha = subprocess.run(
+        ["git", "rev-parse", "HEAD"], capture_output=True, encoding="utf-8"
+    ).stdout.strip()
+    LAST_RUN_COMMIT_SHA_FILE.write_text(current_commit_sha)
diff --git a/tests/components/base/test_bare.py b/tests/components/base/test_bare.py
index 99ffef519..264d136cb 100644
--- a/tests/components/base/test_bare.py
+++ b/tests/components/base/test_bare.py
@@ -8,6 +8,7 @@ from reflex.components.base.bare import Bare
     [
         ("hello", "hello"),
         ("{}", "{}"),
+        (None, ""),
         ("${default_state.name}", "${default_state.name}"),
         ("{state.name}", "{state.name}"),
     ],
diff --git a/tests/components/core/test_banner.py b/tests/components/core/test_banner.py
new file mode 100644
index 000000000..66fa598c7
--- /dev/null
+++ b/tests/components/core/test_banner.py
@@ -0,0 +1,51 @@
+from reflex.components.core.banner import (
+    ConnectionBanner,
+    ConnectionModal,
+    ConnectionPulser,
+    WebsocketTargetURL,
+)
+from reflex.components.radix.themes.typography.text import Text
+
+
+def test_websocket_target_url():
+    url = WebsocketTargetURL.create()
+    _imports = url.get_imports(collapse=True)
+    assert list(_imports.keys()) == ["/utils/state", "/env.json"]
+
+
+def test_connection_banner():
+    banner = ConnectionBanner.create()
+    _imports = banner.get_imports(collapse=True)
+    assert list(_imports.keys()) == [
+        "react",
+        "/utils/context",
+        "/utils/state",
+        "@radix-ui/themes@^2.0.0",
+        "/env.json",
+    ]
+
+    msg = "Connection error"
+    custom_banner = ConnectionBanner.create(Text.create(msg))
+    assert msg in str(custom_banner.render())
+
+
+def test_connection_modal():
+    modal = ConnectionModal.create()
+    _imports = modal.get_imports(collapse=True)
+    assert list(_imports.keys()) == [
+        "react",
+        "/utils/context",
+        "/utils/state",
+        "@radix-ui/themes@^2.0.0",
+        "/env.json",
+    ]
+
+    msg = "Connection error"
+    custom_modal = ConnectionModal.create(Text.create(msg))
+    assert msg in str(custom_modal.render())
+
+
+def test_connection_pulser():
+    pulser = ConnectionPulser.create()
+    _custom_code = pulser.get_custom_code()
+    _imports = pulser.get_imports(collapse=True)
diff --git a/tests/components/layout/test_cond.py b/tests/components/core/test_cond.py
similarity index 72%
rename from tests/components/layout/test_cond.py
rename to tests/components/core/test_cond.py
index 74d25afbc..a7604fb9a 100644
--- a/tests/components/layout/test_cond.py
+++ b/tests/components/core/test_cond.py
@@ -3,17 +3,8 @@ from typing import Any
 
 import pytest
 
-import reflex as rx
 from reflex.components.base.fragment import Fragment
 from reflex.components.core.cond import Cond, cond
-from reflex.components.core.responsive import (
-    desktop_only,
-    mobile_and_tablet,
-    mobile_only,
-    tablet_and_desktop,
-    tablet_only,
-)
-from reflex.components.radix.themes.layout.box import Box
 from reflex.components.radix.themes.typography.text import Text
 from reflex.state import BaseState
 from reflex.vars import Var
@@ -42,7 +33,7 @@ def test_f_string_cond_interpolation():
     ],
     indirect=True,
 )
-def test_validate_cond(cond_state: rx.Var):
+def test_validate_cond(cond_state: Var):
     """Test if cond can be a rx.Var with any values.
 
     Args:
@@ -83,6 +74,7 @@ def test_validate_cond(cond_state: rx.Var):
         (32, 0),
         ("hello", ""),
         (2.3, 0.0),
+        (Var.create("a"), Var.create("b")),
     ],
 )
 def test_prop_cond(c1: Any, c2: Any):
@@ -99,11 +91,19 @@ def test_prop_cond(c1: Any, c2: Any):
     )
 
     assert isinstance(prop_cond, Var)
-    c1 = json.dumps(c1).replace('"', "`")
-    c2 = json.dumps(c2).replace('"', "`")
+    if not isinstance(c1, Var):
+        c1 = json.dumps(c1).replace('"', "`")
+    if not isinstance(c2, Var):
+        c2 = json.dumps(c2).replace('"', "`")
     assert str(prop_cond) == f"{{isTrue(true) ? {c1} : {c2}}}"
 
 
+def test_cond_no_mix():
+    """Test if cond can't mix components and props."""
+    with pytest.raises(ValueError):
+        cond(True, Var.create("hello"), Text.create("world"))
+
+
 def test_cond_no_else():
     """Test if cond can be used without else."""
     # Components should support the use of cond without else
@@ -118,33 +118,3 @@ def test_cond_no_else():
     # Props do not support the use of cond without else
     with pytest.raises(ValueError):
         cond(True, "hello")  # type: ignore
-
-
-def test_mobile_only():
-    """Test the mobile_only responsive component."""
-    component = mobile_only("Content")
-    assert isinstance(component, Box)
-
-
-def test_tablet_only():
-    """Test the tablet_only responsive component."""
-    component = tablet_only("Content")
-    assert isinstance(component, Box)
-
-
-def test_desktop_only():
-    """Test the desktop_only responsive component."""
-    component = desktop_only("Content")
-    assert isinstance(component, Box)
-
-
-def test_tablet_and_desktop():
-    """Test the tablet_and_desktop responsive component."""
-    component = tablet_and_desktop("Content")
-    assert isinstance(component, Box)
-
-
-def test_mobile_and_tablet():
-    """Test the mobile_and_tablet responsive component."""
-    component = mobile_and_tablet("Content")
-    assert isinstance(component, Box)
diff --git a/tests/components/forms/test_debounce.py b/tests/components/core/test_debounce.py
similarity index 68%
rename from tests/components/forms/test_debounce.py
rename to tests/components/core/test_debounce.py
index a63604ca8..8a8ec394c 100644
--- a/tests/components/forms/test_debounce.py
+++ b/tests/components/core/test_debounce.py
@@ -8,22 +8,28 @@ from reflex.state import BaseState
 from reflex.vars import BaseVar
 
 
-def test_render_no_child():
+def test_create_no_child():
     """DebounceInput raises RuntimeError if no child is provided."""
     with pytest.raises(RuntimeError):
-        _ = rx.debounce_input().render()
+        _ = rx.debounce_input()
 
 
-def test_render_no_child_recursive():
+def test_create_no_child_recursive():
     """DebounceInput raises RuntimeError if no child is provided."""
     with pytest.raises(RuntimeError):
-        _ = rx.debounce_input(rx.debounce_input(rx.debounce_input())).render()
+        _ = rx.debounce_input(rx.debounce_input(rx.debounce_input()))
 
 
-def test_render_many_child():
+def test_create_many_child():
     """DebounceInput raises RuntimeError if more than 1 child is provided."""
     with pytest.raises(RuntimeError):
-        _ = rx.debounce_input("foo", "bar").render()
+        _ = rx.debounce_input("foo", "bar")
+
+
+def test_create_no_on_change():
+    """DebounceInput raises ValueError if child has no on_change handler."""
+    with pytest.raises(ValueError):
+        _ = rx.debounce_input(rx.input())
 
 
 class S(BaseState):
@@ -44,14 +50,16 @@ class S(BaseState):
 def test_render_child_props():
     """DebounceInput should render props from child component."""
     tag = rx.debounce_input(
-        rx.chakra.input(
+        rx.input(
             foo="bar",
             baz="quuc",
             value="real",
             on_change=S.on_change,
         )
     )._render()
-    assert tag.props["sx"] == {"foo": "bar", "baz": "quuc"}
+    assert "css" in tag.props and isinstance(tag.props["css"], rx.Var)
+    for prop in ["foo", "bar", "baz", "quuc"]:
+        assert prop in str(tag.props["css"])
     assert tag.props["value"].equals(
         BaseVar(
             _var_name="real", _var_type=str, _var_is_local=True, _var_is_string=False
@@ -62,6 +70,41 @@ def test_render_child_props():
     assert tag.contents == ""
 
 
+def test_render_with_class_name():
+    tag = rx.debounce_input(
+        rx.input(
+            on_change=S.on_change,
+            class_name="foo baz",
+        )
+    )._render()
+    assert isinstance(tag.props["className"], rx.Var)
+    assert "foo baz" in str(tag.props["className"])
+
+
+def test_render_with_ref():
+    tag = rx.debounce_input(
+        rx.input(
+            on_change=S.on_change,
+            id="foo_bar",
+        )
+    )._render()
+    assert isinstance(tag.props["inputRef"], rx.Var)
+    assert "foo_bar" in str(tag.props["inputRef"])
+
+
+def test_event_triggers():
+    debounced_input = rx.debounce_input(
+        rx.input(
+            on_change=S.on_change,
+        )
+    )
+    default_event_triggers = list(rx.Component().get_event_triggers().keys())
+    assert list(debounced_input.get_event_triggers().keys()) == [
+        *default_event_triggers,
+        "on_change",
+    ]
+
+
 def test_render_child_props_recursive():
     """DebounceInput should render props from child component.
 
@@ -72,7 +115,7 @@ def test_render_child_props_recursive():
         rx.debounce_input(
             rx.debounce_input(
                 rx.debounce_input(
-                    rx.chakra.input(
+                    rx.input(
                         foo="bar",
                         baz="quuc",
                         value="real",
@@ -88,7 +131,9 @@ def test_render_child_props_recursive():
         ),
         force_notify_by_enter=False,
     )._render()
-    assert tag.props["sx"] == {"foo": "bar", "baz": "quuc"}
+    assert "css" in tag.props and isinstance(tag.props["css"], rx.Var)
+    for prop in ["foo", "bar", "baz", "quuc"]:
+        assert prop in str(tag.props["css"])
     assert tag.props["value"].equals(
         BaseVar(
             _var_name="outer", _var_type=str, _var_is_local=True, _var_is_string=False
@@ -104,7 +149,7 @@ def test_render_child_props_recursive():
 
 def test_full_control_implicit_debounce():
     """DebounceInput is used when value and on_change are used together."""
-    tag = rx.chakra.input(
+    tag = rx.input(
         value=S.value,
         on_change=S.on_change,
     )._render()
diff --git a/tests/components/layout/test_foreach.py b/tests/components/core/test_foreach.py
similarity index 82%
rename from tests/components/layout/test_foreach.py
rename to tests/components/core/test_foreach.py
index 60ccd7660..c87d08b25 100644
--- a/tests/components/layout/test_foreach.py
+++ b/tests/components/core/test_foreach.py
@@ -1,8 +1,9 @@
 from typing import Dict, List, Set, Tuple
 
 import pytest
+from pydantic import ValidationError
 
-from reflex.components import box, foreach, text
+from reflex.components import box, foreach, text, theme
 from reflex.components.core import Foreach
 from reflex.state import BaseState
 
@@ -32,6 +33,7 @@ class ForEachState(BaseState):
         "yellow",
     )
     colors_set: Set[str] = {"red", "green"}
+    bad_annotation_list: list = [["red", "orange"], ["yellow", "blue"]]
 
 
 def display_color(color):
@@ -185,3 +187,30 @@ def test_foreach_render(state_var, render_fn, render_dict):
     assert arg_index._var_name not in seen_index_vars
     assert arg_index._var_type == int
     seen_index_vars.add(arg_index._var_name)
+
+
+def test_foreach_apply_theme():
+    """Test that the foreach component applies the theme."""
+    tag = Foreach.create(ForEachState.colors_list, display_color)  # type: ignore
+    _theme = theme()
+    tag.apply_theme(_theme)
+    assert tag.theme == _theme
+    tag.render()
+
+
+def test_foreach_bad_annotations():
+    """Test that the foreach component raises a TypeError if the iterable is of type Any."""
+    with pytest.raises(TypeError):
+        Foreach.create(
+            ForEachState.bad_annotation_list,  # type: ignore
+            lambda sublist: Foreach.create(sublist, lambda color: text(color)),
+        )
+
+
+def test_foreach_no_param_in_signature():
+    """Test that the foreach component raises a TypeError if no parameters are passed."""
+    with pytest.raises(ValidationError):
+        Foreach.create(
+            ForEachState.colors_list,  # type: ignore
+            lambda: text("color"),
+        )
diff --git a/tests/components/core/test_html.py b/tests/components/core/test_html.py
new file mode 100644
index 000000000..4800437f0
--- /dev/null
+++ b/tests/components/core/test_html.py
@@ -0,0 +1,19 @@
+import pytest
+
+from reflex.components.core.html import Html
+
+
+def test_html_no_children():
+    with pytest.raises(ValueError):
+        _ = Html.create()
+
+
+def test_html_many_children():
+    with pytest.raises(ValueError):
+        _ = Html.create("foo", "bar")
+
+
+def test_html_create():
+    html = Html.create("<p>Hello !</p>")
+    assert str(html.dangerouslySetInnerHTML) == '{"__html": "<p>Hello !</p>"}'  # type: ignore
+    assert str(html) == '<div dangerouslySetInnerHTML={{"__html": "<p>Hello !</p>"}}/>'
diff --git a/tests/components/layout/test_match.py b/tests/components/core/test_match.py
similarity index 99%
rename from tests/components/layout/test_match.py
rename to tests/components/core/test_match.py
index ad9e7cb4e..5a0e46e9e 100644
--- a/tests/components/layout/test_match.py
+++ b/tests/components/core/test_match.py
@@ -306,3 +306,8 @@ def test_match_multiple_default_cases(match_case):
     """
     with pytest.raises(ValueError, match="rx.match can only have one default case."):
         Match.create(MatchState.value, *match_case)
+
+
+def test_match_no_cond():
+    with pytest.raises(ValueError):
+        _ = Match.create(None)
diff --git a/tests/components/core/test_responsive.py b/tests/components/core/test_responsive.py
new file mode 100644
index 000000000..6424ed3c3
--- /dev/null
+++ b/tests/components/core/test_responsive.py
@@ -0,0 +1,38 @@
+from reflex.components.core.responsive import (
+    desktop_only,
+    mobile_and_tablet,
+    mobile_only,
+    tablet_and_desktop,
+    tablet_only,
+)
+from reflex.components.radix.themes.layout.box import Box
+
+
+def test_mobile_only():
+    """Test the mobile_only responsive component."""
+    component = mobile_only("Content")
+    assert isinstance(component, Box)
+
+
+def test_tablet_only():
+    """Test the tablet_only responsive component."""
+    component = tablet_only("Content")
+    assert isinstance(component, Box)
+
+
+def test_desktop_only():
+    """Test the desktop_only responsive component."""
+    component = desktop_only("Content")
+    assert isinstance(component, Box)
+
+
+def test_tablet_and_desktop():
+    """Test the tablet_and_desktop responsive component."""
+    component = tablet_and_desktop("Content")
+    assert isinstance(component, Box)
+
+
+def test_mobile_and_tablet():
+    """Test the mobile_and_tablet responsive component."""
+    component = mobile_and_tablet("Content")
+    assert isinstance(component, Box)
diff --git a/tests/components/core/test_upload.py b/tests/components/core/test_upload.py
new file mode 100644
index 000000000..e69de29bb