reflex 0.8.0a4__py3-none-any.whl → 0.8.0a6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of reflex might be problematic. Click here for more details.

Files changed (163) hide show
  1. reflex/.templates/jinja/web/pages/_app.js.jinja2 +1 -1
  2. reflex/.templates/jinja/web/styles/styles.css.jinja2 +1 -0
  3. reflex/.templates/web/app/routes.js +3 -3
  4. reflex/.templates/web/utils/client_side_routing.js +1 -1
  5. reflex/.templates/web/utils/state.js +110 -52
  6. reflex/__init__.pyi +327 -188
  7. reflex/app.py +50 -48
  8. reflex/compiler/compiler.py +6 -2
  9. reflex/compiler/utils.py +32 -14
  10. reflex/components/__init__.pyi +34 -15
  11. reflex/components/base/__init__.pyi +30 -19
  12. reflex/components/base/app_wrap.pyi +2 -3
  13. reflex/components/base/body.pyi +2 -3
  14. reflex/components/base/document.pyi +7 -13
  15. reflex/components/base/error_boundary.pyi +2 -3
  16. reflex/components/base/fragment.pyi +2 -3
  17. reflex/components/base/link.pyi +3 -5
  18. reflex/components/base/meta.py +4 -15
  19. reflex/components/base/meta.pyi +14 -18
  20. reflex/components/base/script.pyi +2 -3
  21. reflex/components/base/strict_mode.pyi +2 -3
  22. reflex/components/core/__init__.pyi +77 -38
  23. reflex/components/core/auto_scroll.pyi +2 -3
  24. reflex/components/core/banner.pyi +8 -14
  25. reflex/components/core/client_side_routing.pyi +2 -3
  26. reflex/components/core/clipboard.pyi +2 -3
  27. reflex/components/core/debounce.pyi +2 -3
  28. reflex/components/core/foreach.py +2 -2
  29. reflex/components/core/helmet.pyi +2 -3
  30. reflex/components/core/html.pyi +2 -3
  31. reflex/components/core/match.py +3 -3
  32. reflex/components/core/sticky.pyi +4 -7
  33. reflex/components/core/upload.py +2 -1
  34. reflex/components/core/upload.pyi +5 -9
  35. reflex/components/datadisplay/__init__.pyi +13 -7
  36. reflex/components/datadisplay/code.py +12 -7
  37. reflex/components/datadisplay/code.pyi +2 -3
  38. reflex/components/datadisplay/dataeditor.pyi +33 -11
  39. reflex/components/datadisplay/shiki_code_block.py +5 -3
  40. reflex/components/datadisplay/shiki_code_block.pyi +3 -5
  41. reflex/components/el/__init__.pyi +506 -246
  42. reflex/components/el/element.pyi +2 -3
  43. reflex/components/el/elements/__init__.pyi +504 -245
  44. reflex/components/el/elements/base.pyi +2 -3
  45. reflex/components/el/elements/forms.pyi +77 -49
  46. reflex/components/el/elements/inline.pyi +29 -57
  47. reflex/components/el/elements/media.pyi +26 -51
  48. reflex/components/el/elements/metadata.pyi +7 -13
  49. reflex/components/el/elements/other.pyi +8 -15
  50. reflex/components/el/elements/scripts.pyi +4 -7
  51. reflex/components/el/elements/sectioning.pyi +16 -31
  52. reflex/components/el/elements/tables.pyi +11 -21
  53. reflex/components/el/elements/typography.pyi +16 -31
  54. reflex/components/gridjs/datatable.pyi +3 -5
  55. reflex/components/lucide/icon.pyi +4 -7
  56. reflex/components/markdown/markdown.py +5 -3
  57. reflex/components/markdown/markdown.pyi +2 -3
  58. reflex/components/moment/moment.py +1 -1
  59. reflex/components/moment/moment.pyi +2 -3
  60. reflex/components/plotly/plotly.py +12 -6
  61. reflex/components/plotly/plotly.pyi +31 -39
  62. reflex/components/radix/__init__.pyi +123 -65
  63. reflex/components/radix/primitives/__init__.pyi +6 -4
  64. reflex/components/radix/primitives/accordion.pyi +8 -15
  65. reflex/components/radix/primitives/base.pyi +3 -5
  66. reflex/components/radix/primitives/drawer.pyi +11 -21
  67. reflex/components/radix/primitives/form.pyi +22 -22
  68. reflex/components/radix/primitives/progress.pyi +5 -9
  69. reflex/components/radix/primitives/slider.pyi +6 -11
  70. reflex/components/radix/themes/__init__.pyi +5 -6
  71. reflex/components/radix/themes/base.pyi +9 -17
  72. reflex/components/radix/themes/color_mode.py +5 -6
  73. reflex/components/radix/themes/color_mode.pyi +4 -7
  74. reflex/components/radix/themes/components/__init__.pyi +75 -38
  75. reflex/components/radix/themes/components/alert_dialog.pyi +8 -15
  76. reflex/components/radix/themes/components/aspect_ratio.pyi +2 -3
  77. reflex/components/radix/themes/components/avatar.pyi +2 -3
  78. reflex/components/radix/themes/components/badge.pyi +2 -3
  79. reflex/components/radix/themes/components/button.pyi +2 -3
  80. reflex/components/radix/themes/components/callout.pyi +5 -9
  81. reflex/components/radix/themes/components/card.pyi +2 -3
  82. reflex/components/radix/themes/components/checkbox.pyi +3 -5
  83. reflex/components/radix/themes/components/checkbox_cards.pyi +3 -5
  84. reflex/components/radix/themes/components/checkbox_group.pyi +3 -5
  85. reflex/components/radix/themes/components/context_menu.pyi +14 -27
  86. reflex/components/radix/themes/components/data_list.pyi +5 -9
  87. reflex/components/radix/themes/components/dialog.pyi +7 -13
  88. reflex/components/radix/themes/components/dropdown_menu.pyi +9 -17
  89. reflex/components/radix/themes/components/hover_card.pyi +4 -7
  90. reflex/components/radix/themes/components/icon_button.pyi +2 -3
  91. reflex/components/radix/themes/components/inset.pyi +2 -3
  92. reflex/components/radix/themes/components/popover.pyi +5 -9
  93. reflex/components/radix/themes/components/progress.pyi +2 -3
  94. reflex/components/radix/themes/components/radio.pyi +2 -3
  95. reflex/components/radix/themes/components/radio_cards.pyi +3 -5
  96. reflex/components/radix/themes/components/radio_group.pyi +4 -7
  97. reflex/components/radix/themes/components/scroll_area.pyi +2 -3
  98. reflex/components/radix/themes/components/segmented_control.pyi +3 -5
  99. reflex/components/radix/themes/components/select.pyi +9 -17
  100. reflex/components/radix/themes/components/separator.pyi +2 -3
  101. reflex/components/radix/themes/components/skeleton.pyi +2 -3
  102. reflex/components/radix/themes/components/slider.pyi +12 -5
  103. reflex/components/radix/themes/components/spinner.pyi +2 -3
  104. reflex/components/radix/themes/components/switch.pyi +2 -3
  105. reflex/components/radix/themes/components/table.pyi +8 -15
  106. reflex/components/radix/themes/components/tabs.pyi +5 -9
  107. reflex/components/radix/themes/components/text_area.pyi +10 -5
  108. reflex/components/radix/themes/components/text_field.pyi +19 -9
  109. reflex/components/radix/themes/components/tooltip.pyi +2 -3
  110. reflex/components/radix/themes/layout/__init__.pyi +27 -14
  111. reflex/components/radix/themes/layout/base.pyi +2 -3
  112. reflex/components/radix/themes/layout/box.pyi +2 -3
  113. reflex/components/radix/themes/layout/center.pyi +2 -3
  114. reflex/components/radix/themes/layout/container.pyi +2 -3
  115. reflex/components/radix/themes/layout/flex.pyi +2 -3
  116. reflex/components/radix/themes/layout/grid.pyi +2 -3
  117. reflex/components/radix/themes/layout/list.pyi +5 -9
  118. reflex/components/radix/themes/layout/section.pyi +2 -3
  119. reflex/components/radix/themes/layout/spacer.pyi +2 -3
  120. reflex/components/radix/themes/layout/stack.pyi +4 -7
  121. reflex/components/radix/themes/typography/__init__.pyi +7 -5
  122. reflex/components/radix/themes/typography/blockquote.pyi +2 -3
  123. reflex/components/radix/themes/typography/code.pyi +2 -3
  124. reflex/components/radix/themes/typography/heading.pyi +2 -3
  125. reflex/components/radix/themes/typography/link.pyi +3 -5
  126. reflex/components/radix/themes/typography/text.pyi +7 -13
  127. reflex/components/react_player/audio.pyi +5 -4
  128. reflex/components/react_player/react_player.pyi +2 -3
  129. reflex/components/react_player/video.pyi +5 -4
  130. reflex/components/recharts/__init__.pyi +208 -100
  131. reflex/components/recharts/cartesian.py +8 -7
  132. reflex/components/recharts/cartesian.pyi +25 -48
  133. reflex/components/recharts/charts.pyi +13 -25
  134. reflex/components/recharts/general.pyi +7 -13
  135. reflex/components/recharts/polar.pyi +7 -13
  136. reflex/components/recharts/recharts.py +2 -2
  137. reflex/components/recharts/recharts.pyi +3 -5
  138. reflex/components/sonner/toast.py +1 -1
  139. reflex/components/sonner/toast.pyi +2 -3
  140. reflex/constants/installer.py +7 -8
  141. reflex/constants/route.py +13 -6
  142. reflex/istate/__init__.py +69 -0
  143. reflex/istate/manager.py +1 -0
  144. reflex/plugins/shared_tailwind.py +58 -1
  145. reflex/plugins/tailwind_v3.py +4 -4
  146. reflex/plugins/tailwind_v4.py +6 -5
  147. reflex/route.py +159 -71
  148. reflex/state.py +38 -16
  149. reflex/testing.py +2 -1
  150. reflex/utils/exec.py +18 -13
  151. reflex/utils/format.py +1 -5
  152. reflex/utils/imports.py +5 -12
  153. reflex/utils/misc.py +40 -0
  154. reflex/utils/prerequisites.py +7 -12
  155. reflex/utils/processes.py +8 -41
  156. reflex/utils/pyi_generator.py +23 -40
  157. reflex/utils/telemetry.py +0 -15
  158. reflex/utils/types.py +1 -1
  159. {reflex-0.8.0a4.dist-info → reflex-0.8.0a6.dist-info}/METADATA +3 -3
  160. {reflex-0.8.0a4.dist-info → reflex-0.8.0a6.dist-info}/RECORD +163 -163
  161. {reflex-0.8.0a4.dist-info → reflex-0.8.0a6.dist-info}/WHEEL +0 -0
  162. {reflex-0.8.0a4.dist-info → reflex-0.8.0a6.dist-info}/entry_points.txt +0 -0
  163. {reflex-0.8.0a4.dist-info → reflex-0.8.0a6.dist-info}/licenses/LICENSE +0 -0
reflex/__init__.pyi CHANGED
@@ -5,200 +5,158 @@
5
5
 
6
6
  from reflex.utils import compat
7
7
 
8
- from . import admin as admin
9
- from . import app as app
10
- from . import base as base
11
- from . import compiler as compiler
12
- from . import components as components
13
- from . import config as config
14
- from . import model as model
15
- from . import plugins as plugins
16
- from . import style as style
17
- from . import testing as testing
18
- from . import utils as utils
19
- from . import vars as vars
20
- from .admin import AdminDash as AdminDash
21
- from .app import App as App
22
- from .app import UploadFile as UploadFile
23
- from .assets import asset as asset
24
- from .base import Base as Base
25
- from .components import el as el
26
- from .components import lucide as lucide
27
- from .components import radix as radix
28
- from .components import recharts as recharts
29
- from .components.base.fragment import Fragment as Fragment
30
- from .components.base.fragment import fragment as fragment
31
- from .components.base.script import Script as Script
32
- from .components.base.script import script as script
33
- from .components.component import Component as Component
34
- from .components.component import ComponentNamespace as ComponentNamespace
35
- from .components.component import NoSSRComponent as NoSSRComponent
36
- from .components.component import memo as memo
37
- from .components.core.auto_scroll import auto_scroll as auto_scroll
38
- from .components.core.banner import connection_banner as connection_banner
39
- from .components.core.banner import connection_modal as connection_modal
40
- from .components.core.breakpoints import breakpoints as breakpoints
41
- from .components.core.clipboard import clipboard as clipboard
42
- from .components.core.colors import color as color
43
- from .components.core.cond import color_mode_cond as color_mode_cond
44
- from .components.core.cond import cond as cond
45
- from .components.core.debounce import debounce_input as debounce_input
46
- from .components.core.foreach import foreach as foreach
47
- from .components.core.html import html as html
48
- from .components.core.match import match as match
49
- from .components.core.responsive import desktop_only as desktop_only
50
- from .components.core.responsive import mobile_and_tablet as mobile_and_tablet
51
- from .components.core.responsive import mobile_only as mobile_only
52
- from .components.core.responsive import tablet_and_desktop as tablet_and_desktop
53
- from .components.core.responsive import tablet_only as tablet_only
54
- from .components.core.upload import cancel_upload as cancel_upload
55
- from .components.core.upload import clear_selected_files as clear_selected_files
56
- from .components.core.upload import get_upload_dir as get_upload_dir
57
- from .components.core.upload import get_upload_url as get_upload_url
58
- from .components.core.upload import selected_files as selected_files
59
- from .components.core.upload import upload as upload
60
- from .components.datadisplay.code import code_block as code_block
61
- from .components.datadisplay.dataeditor import data_editor as data_editor
62
- from .components.datadisplay.dataeditor import data_editor_theme as data_editor_theme
63
- from .components.datadisplay.logo import logo as logo
64
- from .components.el.elements.media import image as image
65
- from .components.gridjs import data_table as data_table
66
- from .components.lucide import icon as icon
67
- from .components.markdown import markdown as markdown
68
- from .components.moment import MomentDelta as MomentDelta
69
- from .components.moment import moment as moment
70
- from .components.plotly import plotly as plotly
71
- from .components.radix.primitives.accordion import accordion as accordion
72
- from .components.radix.primitives.drawer import drawer as drawer
73
- from .components.radix.primitives.form import form as form
74
- from .components.radix.themes.base import theme as theme
75
- from .components.radix.themes.base import theme_panel as theme_panel
76
- from .components.radix.themes.color_mode import color_mode as color_mode
77
- from .components.radix.themes.components.alert_dialog import (
78
- alert_dialog as alert_dialog,
8
+ from . import (
9
+ admin,
10
+ app,
11
+ base,
12
+ compiler,
13
+ components,
14
+ config,
15
+ model,
16
+ plugins,
17
+ style,
18
+ testing,
19
+ utils,
20
+ vars,
79
21
  )
80
- from .components.radix.themes.components.aspect_ratio import (
81
- aspect_ratio as aspect_ratio,
22
+ from .admin import AdminDash
23
+ from .app import App, UploadFile
24
+ from .assets import asset
25
+ from .base import Base
26
+ from .components import el, lucide, radix, recharts
27
+ from .components.base.fragment import Fragment, fragment
28
+ from .components.base.script import Script, script
29
+ from .components.component import Component, ComponentNamespace, NoSSRComponent, memo
30
+ from .components.core.auto_scroll import auto_scroll
31
+ from .components.core.banner import connection_banner, connection_modal
32
+ from .components.core.breakpoints import breakpoints
33
+ from .components.core.clipboard import clipboard
34
+ from .components.core.colors import color
35
+ from .components.core.cond import color_mode_cond, cond
36
+ from .components.core.debounce import debounce_input
37
+ from .components.core.foreach import foreach
38
+ from .components.core.html import html
39
+ from .components.core.match import match
40
+ from .components.core.responsive import (
41
+ desktop_only,
42
+ mobile_and_tablet,
43
+ mobile_only,
44
+ tablet_and_desktop,
45
+ tablet_only,
82
46
  )
83
- from .components.radix.themes.components.avatar import avatar as avatar
84
- from .components.radix.themes.components.badge import badge as badge
85
- from .components.radix.themes.components.button import button as button
86
- from .components.radix.themes.components.callout import callout as callout
87
- from .components.radix.themes.components.card import card as card
88
- from .components.radix.themes.components.checkbox import checkbox as checkbox
89
- from .components.radix.themes.components.checkbox_cards import (
90
- checkbox_cards as checkbox_cards,
47
+ from .components.core.upload import (
48
+ cancel_upload,
49
+ clear_selected_files,
50
+ get_upload_dir,
51
+ get_upload_url,
52
+ selected_files,
53
+ upload,
91
54
  )
92
- from .components.radix.themes.components.checkbox_group import (
93
- checkbox_group as checkbox_group,
55
+ from .components.datadisplay.code import code_block
56
+ from .components.datadisplay.dataeditor import data_editor, data_editor_theme
57
+ from .components.datadisplay.logo import logo
58
+ from .components.el.elements.media import image
59
+ from .components.gridjs import data_table
60
+ from .components.lucide import icon
61
+ from .components.markdown import markdown
62
+ from .components.moment import MomentDelta, moment
63
+ from .components.plotly import plotly
64
+ from .components.radix.primitives.accordion import accordion
65
+ from .components.radix.primitives.drawer import drawer
66
+ from .components.radix.primitives.form import form
67
+ from .components.radix.themes.base import theme, theme_panel
68
+ from .components.radix.themes.color_mode import color_mode
69
+ from .components.radix.themes.components.alert_dialog import alert_dialog
70
+ from .components.radix.themes.components.aspect_ratio import aspect_ratio
71
+ from .components.radix.themes.components.avatar import avatar
72
+ from .components.radix.themes.components.badge import badge
73
+ from .components.radix.themes.components.button import button
74
+ from .components.radix.themes.components.callout import callout
75
+ from .components.radix.themes.components.card import card
76
+ from .components.radix.themes.components.checkbox import checkbox
77
+ from .components.radix.themes.components.checkbox_cards import checkbox_cards
78
+ from .components.radix.themes.components.checkbox_group import checkbox_group
79
+ from .components.radix.themes.components.context_menu import context_menu
80
+ from .components.radix.themes.components.data_list import data_list
81
+ from .components.radix.themes.components.dialog import dialog
82
+ from .components.radix.themes.components.dropdown_menu import dropdown_menu, menu
83
+ from .components.radix.themes.components.hover_card import hover_card
84
+ from .components.radix.themes.components.icon_button import icon_button
85
+ from .components.radix.themes.components.inset import inset
86
+ from .components.radix.themes.components.popover import popover
87
+ from .components.radix.themes.components.progress import progress
88
+ from .components.radix.themes.components.radio_cards import radio_cards
89
+ from .components.radix.themes.components.radio_group import radio, radio_group
90
+ from .components.radix.themes.components.scroll_area import scroll_area
91
+ from .components.radix.themes.components.segmented_control import segmented_control
92
+ from .components.radix.themes.components.select import select
93
+ from .components.radix.themes.components.separator import divider, separator
94
+ from .components.radix.themes.components.skeleton import skeleton
95
+ from .components.radix.themes.components.slider import slider
96
+ from .components.radix.themes.components.spinner import spinner
97
+ from .components.radix.themes.components.switch import switch
98
+ from .components.radix.themes.components.table import table
99
+ from .components.radix.themes.components.tabs import tabs
100
+ from .components.radix.themes.components.text_area import text_area
101
+ from .components.radix.themes.components.text_field import input, text_field
102
+ from .components.radix.themes.components.tooltip import tooltip
103
+ from .components.radix.themes.layout.box import box
104
+ from .components.radix.themes.layout.center import center
105
+ from .components.radix.themes.layout.container import container
106
+ from .components.radix.themes.layout.flex import flex
107
+ from .components.radix.themes.layout.grid import grid
108
+ from .components.radix.themes.layout.list import list_item, ordered_list, unordered_list
109
+ from .components.radix.themes.layout.list import list_ns as list
110
+ from .components.radix.themes.layout.section import section
111
+ from .components.radix.themes.layout.spacer import spacer
112
+ from .components.radix.themes.layout.stack import hstack, stack, vstack
113
+ from .components.radix.themes.typography.blockquote import blockquote
114
+ from .components.radix.themes.typography.code import code
115
+ from .components.radix.themes.typography.heading import heading
116
+ from .components.radix.themes.typography.link import link
117
+ from .components.radix.themes.typography.text import text
118
+ from .components.react_player import audio, video
119
+ from .components.sonner.toast import toast
120
+ from .config import Config, DBConfig
121
+ from .constants import Env
122
+ from .constants.colors import Color
123
+ from .event import (
124
+ EventChain,
125
+ EventHandler,
126
+ call_function,
127
+ call_script,
128
+ clear_local_storage,
129
+ clear_session_storage,
130
+ console_log,
131
+ download,
132
+ noop,
133
+ prevent_default,
134
+ redirect,
135
+ remove_cookie,
136
+ remove_local_storage,
137
+ remove_session_storage,
138
+ run_script,
139
+ scroll_to,
140
+ set_clipboard,
141
+ set_focus,
142
+ set_value,
143
+ stop_propagation,
144
+ upload_files,
145
+ window_alert,
94
146
  )
95
- from .components.radix.themes.components.context_menu import (
96
- context_menu as context_menu,
97
- )
98
- from .components.radix.themes.components.data_list import data_list as data_list
99
- from .components.radix.themes.components.dialog import dialog as dialog
100
- from .components.radix.themes.components.dropdown_menu import (
101
- dropdown_menu as dropdown_menu,
102
- )
103
- from .components.radix.themes.components.dropdown_menu import menu as menu
104
- from .components.radix.themes.components.hover_card import hover_card as hover_card
105
- from .components.radix.themes.components.icon_button import icon_button as icon_button
106
- from .components.radix.themes.components.inset import inset as inset
107
- from .components.radix.themes.components.popover import popover as popover
108
- from .components.radix.themes.components.progress import progress as progress
109
- from .components.radix.themes.components.radio_cards import radio_cards as radio_cards
110
- from .components.radix.themes.components.radio_group import radio as radio
111
- from .components.radix.themes.components.radio_group import radio_group as radio_group
112
- from .components.radix.themes.components.scroll_area import scroll_area as scroll_area
113
- from .components.radix.themes.components.segmented_control import (
114
- segmented_control as segmented_control,
115
- )
116
- from .components.radix.themes.components.select import select as select
117
- from .components.radix.themes.components.separator import divider as divider
118
- from .components.radix.themes.components.separator import separator as separator
119
- from .components.radix.themes.components.skeleton import skeleton as skeleton
120
- from .components.radix.themes.components.slider import slider as slider
121
- from .components.radix.themes.components.spinner import spinner as spinner
122
- from .components.radix.themes.components.switch import switch as switch
123
- from .components.radix.themes.components.table import table as table
124
- from .components.radix.themes.components.tabs import tabs as tabs
125
- from .components.radix.themes.components.text_area import text_area as text_area
126
- from .components.radix.themes.components.text_field import input as input
127
- from .components.radix.themes.components.text_field import text_field as text_field
128
- from .components.radix.themes.components.tooltip import tooltip as tooltip
129
- from .components.radix.themes.layout.box import box as box
130
- from .components.radix.themes.layout.center import center as center
131
- from .components.radix.themes.layout.container import container as container
132
- from .components.radix.themes.layout.flex import flex as flex
133
- from .components.radix.themes.layout.grid import grid as grid
134
- from .components.radix.themes.layout.list import list_item as list_item
135
- from .components.radix.themes.layout.list import list_ns as list # noqa: F401
136
- from .components.radix.themes.layout.list import ordered_list as ordered_list
137
- from .components.radix.themes.layout.list import unordered_list as unordered_list
138
- from .components.radix.themes.layout.section import section as section
139
- from .components.radix.themes.layout.spacer import spacer as spacer
140
- from .components.radix.themes.layout.stack import hstack as hstack
141
- from .components.radix.themes.layout.stack import stack as stack
142
- from .components.radix.themes.layout.stack import vstack as vstack
143
- from .components.radix.themes.typography.blockquote import blockquote as blockquote
144
- from .components.radix.themes.typography.code import code as code
145
- from .components.radix.themes.typography.heading import heading as heading
146
- from .components.radix.themes.typography.link import link as link
147
- from .components.radix.themes.typography.text import text as text
148
- from .components.react_player import audio as audio
149
- from .components.react_player import video as video
150
- from .components.sonner.toast import toast as toast
151
- from .config import Config as Config
152
- from .config import DBConfig as DBConfig
153
- from .constants import Env as Env
154
- from .constants.colors import Color as Color
155
- from .event import EventChain as EventChain
156
- from .event import EventHandler as EventHandler
157
- from .event import call_function as call_function
158
- from .event import call_script as call_script
159
- from .event import clear_local_storage as clear_local_storage
160
- from .event import clear_session_storage as clear_session_storage
161
- from .event import console_log as console_log
162
- from .event import download as download
163
147
  from .event import event as event
164
- from .event import noop as noop
165
- from .event import prevent_default as prevent_default
166
- from .event import redirect as redirect
167
- from .event import remove_cookie as remove_cookie
168
- from .event import remove_local_storage as remove_local_storage
169
- from .event import remove_session_storage as remove_session_storage
170
- from .event import run_script as run_script
171
- from .event import scroll_to as scroll_to
172
- from .event import set_clipboard as set_clipboard
173
- from .event import set_focus as set_focus
174
- from .event import set_value as set_value
175
- from .event import stop_propagation as stop_propagation
176
- from .event import upload_files as upload_files
177
- from .event import window_alert as window_alert
178
- from .experimental import _x as _x
179
- from .istate.storage import Cookie as Cookie
180
- from .istate.storage import LocalStorage as LocalStorage
181
- from .istate.storage import SessionStorage as SessionStorage
182
- from .istate.wrappers import get_state as get_state
183
- from .middleware import Middleware as Middleware
184
- from .middleware import middleware as middleware
185
- from .model import Model as Model
186
- from .model import asession as asession
187
- from .model import session as session
148
+ from .experimental import _x
149
+ from .istate.storage import Cookie, LocalStorage, SessionStorage
150
+ from .istate.wrappers import get_state
151
+ from .middleware import Middleware, middleware
152
+ from .model import Model, asession, session
188
153
  from .page import page as page
189
- from .state import ComponentState as ComponentState
190
- from .state import State as State
191
- from .state import dynamic as dynamic
192
- from .state import var as var
193
- from .style import Style as Style
194
- from .style import toggle_color_mode as toggle_color_mode
195
- from .utils.imports import ImportDict as ImportDict
196
- from .utils.imports import ImportVar as ImportVar
197
- from .utils.misc import run_in_thread as run_in_thread
198
- from .utils.serializers import serializer as serializer
199
- from .vars import Field as Field
200
- from .vars import Var as Var
201
- from .vars import field as field
154
+ from .state import ComponentState, State, dynamic, var
155
+ from .style import Style, toggle_color_mode
156
+ from .utils.imports import ImportDict, ImportVar
157
+ from .utils.misc import run_in_thread
158
+ from .utils.serializers import serializer
159
+ from .vars import Field, Var, field
202
160
 
203
161
  del compat
204
162
  RADIX_THEMES_MAPPING: dict
@@ -210,3 +168,184 @@ RADIX_PRIMITIVES_SHORTCUT_MAPPING: dict
210
168
  COMPONENTS_CORE_MAPPING: dict
211
169
  COMPONENTS_BASE_MAPPING: dict
212
170
  RADIX_MAPPING: dict
171
+
172
+ __all__ = [
173
+ "AdminDash",
174
+ "App",
175
+ "Base",
176
+ "Color",
177
+ "Component",
178
+ "ComponentNamespace",
179
+ "ComponentState",
180
+ "Config",
181
+ "Cookie",
182
+ "DBConfig",
183
+ "Env",
184
+ "EventChain",
185
+ "EventHandler",
186
+ "Field",
187
+ "Fragment",
188
+ "ImportDict",
189
+ "ImportVar",
190
+ "LocalStorage",
191
+ "Middleware",
192
+ "Model",
193
+ "MomentDelta",
194
+ "NoSSRComponent",
195
+ "Script",
196
+ "SessionStorage",
197
+ "State",
198
+ "Style",
199
+ "UploadFile",
200
+ "Var",
201
+ "_x",
202
+ "accordion",
203
+ "admin",
204
+ "alert_dialog",
205
+ "app",
206
+ "asession",
207
+ "aspect_ratio",
208
+ "asset",
209
+ "audio",
210
+ "auto_scroll",
211
+ "avatar",
212
+ "badge",
213
+ "base",
214
+ "blockquote",
215
+ "box",
216
+ "breakpoints",
217
+ "button",
218
+ "call_function",
219
+ "call_script",
220
+ "callout",
221
+ "cancel_upload",
222
+ "card",
223
+ "center",
224
+ "checkbox",
225
+ "checkbox_cards",
226
+ "checkbox_group",
227
+ "clear_local_storage",
228
+ "clear_selected_files",
229
+ "clear_session_storage",
230
+ "clipboard",
231
+ "code",
232
+ "code_block",
233
+ "color",
234
+ "color_mode",
235
+ "color_mode_cond",
236
+ "compiler",
237
+ "components",
238
+ "cond",
239
+ "config",
240
+ "connection_banner",
241
+ "connection_modal",
242
+ "console_log",
243
+ "container",
244
+ "context_menu",
245
+ "data_editor",
246
+ "data_editor_theme",
247
+ "data_list",
248
+ "data_table",
249
+ "debounce_input",
250
+ "desktop_only",
251
+ "dialog",
252
+ "divider",
253
+ "download",
254
+ "drawer",
255
+ "dropdown_menu",
256
+ "dynamic",
257
+ "el",
258
+ "field",
259
+ "flex",
260
+ "foreach",
261
+ "form",
262
+ "fragment",
263
+ "get_state",
264
+ "get_upload_dir",
265
+ "get_upload_url",
266
+ "grid",
267
+ "heading",
268
+ "hover_card",
269
+ "hstack",
270
+ "html",
271
+ "icon",
272
+ "icon_button",
273
+ "image",
274
+ "input",
275
+ "inset",
276
+ "link",
277
+ "list",
278
+ "list_item",
279
+ "logo",
280
+ "lucide",
281
+ "markdown",
282
+ "match",
283
+ "memo",
284
+ "menu",
285
+ "middleware",
286
+ "mobile_and_tablet",
287
+ "mobile_only",
288
+ "model",
289
+ "moment",
290
+ "noop",
291
+ "ordered_list",
292
+ "plotly",
293
+ "plugins",
294
+ "popover",
295
+ "prevent_default",
296
+ "progress",
297
+ "radio",
298
+ "radio_cards",
299
+ "radio_group",
300
+ "radix",
301
+ "recharts",
302
+ "redirect",
303
+ "remove_cookie",
304
+ "remove_local_storage",
305
+ "remove_session_storage",
306
+ "run_in_thread",
307
+ "run_script",
308
+ "script",
309
+ "scroll_area",
310
+ "scroll_to",
311
+ "section",
312
+ "segmented_control",
313
+ "select",
314
+ "selected_files",
315
+ "separator",
316
+ "serializer",
317
+ "session",
318
+ "set_clipboard",
319
+ "set_focus",
320
+ "set_value",
321
+ "skeleton",
322
+ "slider",
323
+ "spacer",
324
+ "spinner",
325
+ "stack",
326
+ "stop_propagation",
327
+ "style",
328
+ "switch",
329
+ "table",
330
+ "tablet_and_desktop",
331
+ "tablet_only",
332
+ "tabs",
333
+ "testing",
334
+ "text",
335
+ "text_area",
336
+ "text_field",
337
+ "theme",
338
+ "theme_panel",
339
+ "toast",
340
+ "toggle_color_mode",
341
+ "tooltip",
342
+ "unordered_list",
343
+ "upload",
344
+ "upload_files",
345
+ "utils",
346
+ "var",
347
+ "vars",
348
+ "video",
349
+ "vstack",
350
+ "window_alert",
351
+ ]
reflex/app.py CHANGED
@@ -13,7 +13,14 @@ import io
13
13
  import json
14
14
  import sys
15
15
  import traceback
16
- from collections.abc import AsyncIterator, Callable, Coroutine, Mapping, Sequence
16
+ from collections.abc import (
17
+ AsyncGenerator,
18
+ AsyncIterator,
19
+ Callable,
20
+ Coroutine,
21
+ Mapping,
22
+ Sequence,
23
+ )
17
24
  from datetime import datetime
18
25
  from pathlib import Path
19
26
  from timeit import default_timer as timer
@@ -765,9 +772,9 @@ class App(MiddlewareMixin, LifespanMixin):
765
772
  msg = "Route must be set if component is not a callable."
766
773
  raise exceptions.RouteValueError(msg)
767
774
  # Format the route.
768
- route = format.format_route(component.__name__)
775
+ route = format.format_route(format.to_kebab_case(component.__name__))
769
776
  else:
770
- route = format.format_route(route, format_case=False)
777
+ route = format.format_route(route)
771
778
 
772
779
  if route == constants.Page404.SLUG:
773
780
  if component is None:
@@ -822,10 +829,11 @@ class App(MiddlewareMixin, LifespanMixin):
822
829
  state = self._state if self._state else State
823
830
  state.setup_dynamic_args(get_route_args(route))
824
831
 
825
- if on_load:
826
- self._load_events[route] = (
827
- on_load if isinstance(on_load, list) else [on_load]
828
- )
832
+ self._load_events[route] = (
833
+ (on_load if isinstance(on_load, list) else [on_load])
834
+ if on_load is not None
835
+ else []
836
+ )
829
837
 
830
838
  self._unevaluated_pages[route] = unevaluated_page
831
839
 
@@ -854,48 +862,35 @@ class App(MiddlewareMixin, LifespanMixin):
854
862
  if save_page:
855
863
  self._pages[route] = component
856
864
 
857
- def get_load_events(self, route: str) -> list[IndividualEventType[()]]:
865
+ @functools.cached_property
866
+ def router(self) -> Callable[[str], str | None]:
867
+ """Get the route computer function.
868
+
869
+ Returns:
870
+ The route computer function.
871
+ """
872
+ from reflex.route import get_router
873
+
874
+ return get_router(list(self._unevaluated_pages))
875
+
876
+ def get_load_events(self, path: str) -> list[IndividualEventType[()]]:
858
877
  """Get the load events for a route.
859
878
 
860
879
  Args:
861
- route: The route to get the load events for.
880
+ path: The route to get the load events for.
862
881
 
863
882
  Returns:
864
883
  The load events for the route.
865
884
  """
866
- route = route.lstrip("/").rstrip("/")
867
- if route == "":
868
- return self._load_events.get(constants.PageNames.INDEX_ROUTE, [])
869
-
870
- # Separate the pages by route type.
871
- static_page_paths_to_page_route = {}
872
- dynamic_page_paths_to_page_route = {}
873
- for page_route in list(self._pages) + list(self._unevaluated_pages):
874
- page_path = page_route.lstrip("/").rstrip("/")
875
- if "[" in page_path and "]" in page_path:
876
- dynamic_page_paths_to_page_route[page_path] = page_route
877
- else:
878
- static_page_paths_to_page_route[page_path] = page_route
879
-
880
- # Check for static routes.
881
- if (page_route := static_page_paths_to_page_route.get(route)) is not None:
882
- return self._load_events.get(page_route, [])
883
-
884
- # Check for dynamic routes.
885
- parts = route.split("/")
886
- for page_path, page_route in dynamic_page_paths_to_page_route.items():
887
- page_parts = page_path.split("/")
888
- if len(page_parts) != len(parts):
889
- continue
890
- if all(
891
- part == page_part
892
- or (page_part.startswith("[") and page_part.endswith("]"))
893
- for part, page_part in zip(parts, page_parts, strict=False)
894
- ):
895
- return self._load_events.get(page_route, [])
896
-
897
- # Default to 404 page load events if no match found.
898
- return self._load_events.get("404", [])
885
+ four_oh_four_load_events = self._load_events.get("404", [])
886
+ route = self.router(path)
887
+ if not route:
888
+ # If the path is not a valid route, return the 404 page load events.
889
+ return four_oh_four_load_events
890
+ return self._load_events.get(
891
+ route,
892
+ four_oh_four_load_events,
893
+ )
899
894
 
900
895
  def _check_routes_conflict(self, new_route: str):
901
896
  """Verify if there is any conflict between the new route and any existing route.
@@ -916,7 +911,6 @@ class App(MiddlewareMixin, LifespanMixin):
916
911
  segments = (
917
912
  constants.RouteRegex.SINGLE_SEGMENT,
918
913
  constants.RouteRegex.DOUBLE_SEGMENT,
919
- constants.RouteRegex.SINGLE_CATCHALL_SEGMENT,
920
914
  constants.RouteRegex.DOUBLE_CATCHALL_SEGMENT,
921
915
  )
922
916
  for route in self._pages:
@@ -1690,7 +1684,7 @@ class App(MiddlewareMixin, LifespanMixin):
1690
1684
 
1691
1685
  async def process(
1692
1686
  app: App, event: Event, sid: str, headers: dict, client_ip: str
1693
- ) -> AsyncIterator[StateUpdate]:
1687
+ ) -> AsyncGenerator[StateUpdate]:
1694
1688
  """Process an event.
1695
1689
 
1696
1690
  Args:
@@ -1742,6 +1736,11 @@ async def process(
1742
1736
  # assignment will recurse into substates and force recalculation of
1743
1737
  # dependent ComputedVar (dynamic route variables)
1744
1738
  state.router_data = router_data
1739
+ router_data[constants.RouteVar.PATH] = "/" + (
1740
+ app.router(path) or "404"
1741
+ if (path := router_data.get(constants.RouteVar.PATH))
1742
+ else "404"
1743
+ ).removeprefix("/")
1745
1744
  state.router = RouterData(router_data)
1746
1745
 
1747
1746
  # Preprocess the event.
@@ -2080,10 +2079,13 @@ class EventNamespace(AsyncNamespace):
2080
2079
  except (KeyError, IndexError):
2081
2080
  client_ip = environ.get("REMOTE_ADDR", "0.0.0.0")
2082
2081
 
2083
- # Process the events.
2084
- async for update in process(self.app, event, sid, headers, client_ip):
2085
- # Emit the update from processing the event.
2086
- await self.emit_update(update=update, sid=sid)
2082
+ async with contextlib.aclosing(
2083
+ process(self.app, event, sid, headers, client_ip)
2084
+ ) as updates_gen:
2085
+ # Process the events.
2086
+ async for update in updates_gen:
2087
+ # Emit the update from processing the event.
2088
+ await self.emit_update(update=update, sid=sid)
2087
2089
 
2088
2090
  async def on_ping(self, sid: str):
2089
2091
  """Event for testing the API endpoint.