reflex 0.4.4a2__tar.gz → 0.4.5__tar.gz

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 (523) hide show
  1. {reflex-0.4.4a2 → reflex-0.4.5}/PKG-INFO +1 -1
  2. {reflex-0.4.4a2 → reflex-0.4.5}/pyproject.toml +1 -1
  3. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +5 -1
  4. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/utils/state.js +2 -1
  5. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/app.py +163 -102
  6. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/app_module_for_backend.py +4 -2
  7. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/compiler/compiler.py +103 -11
  8. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/compiler/utils.py +16 -6
  9. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/component.py +72 -14
  10. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/upload.py +2 -2
  11. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/upload.pyi +1 -1
  12. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/forms.py +1 -1
  13. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/markdown/markdown.py +4 -2
  14. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/radio_group.py +2 -1
  15. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/select.py +7 -2
  16. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/select.pyi +14 -0
  17. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/list.py +31 -4
  18. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/list.pyi +53 -9
  19. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/installer.py +1 -1
  20. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/route.py +2 -2
  21. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/event.py +4 -0
  22. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/model.py +88 -4
  23. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/state.py +20 -5
  24. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/testing.py +21 -1
  25. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/exec.py +9 -0
  26. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/format.py +46 -19
  27. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/prerequisites.py +31 -10
  28. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/processes.py +9 -2
  29. reflex-0.4.5/reflex/utils/telemetry.py +150 -0
  30. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/vars.py +5 -3
  31. reflex-0.4.4a2/reflex/utils/telemetry.py +0 -110
  32. {reflex-0.4.4a2 → reflex-0.4.5}/LICENSE +0 -0
  33. {reflex-0.4.4a2 → reflex-0.4.5}/README.md +0 -0
  34. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  35. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  36. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/blank/code/blank.py +0 -0
  37. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/.gitignore +0 -0
  38. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/favicon.ico +0 -0
  39. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/github.svg +0 -0
  40. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/icon.svg +0 -0
  41. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/logo.svg +0 -0
  42. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/paneleft.svg +0 -0
  43. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/__init__.py +0 -0
  44. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/demo.py +0 -0
  45. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/__init__.py +0 -0
  46. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/chatapp.py +0 -0
  47. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/datatable.py +0 -0
  48. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/forms.py +0 -0
  49. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/graphing.py +0 -0
  50. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/home.py +0 -0
  51. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/sidebar.py +0 -0
  52. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/state.py +0 -0
  53. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/states/form_state.py +0 -0
  54. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/states/pie_state.py +0 -0
  55. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/styles.py +0 -0
  56. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
  57. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -0
  58. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/chat.py +0 -0
  59. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -0
  60. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/modal.py +0 -0
  61. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -0
  62. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -0
  63. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/state.py +0 -0
  64. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/styles.py +0 -0
  65. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/README.md +0 -0
  66. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/favicon.ico +0 -0
  67. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/github.svg +0 -0
  68. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/logo.svg +0 -0
  69. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/paneleft.svg +0 -0
  70. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/reflex_black.svg +0 -0
  71. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/reflex_white.svg +0 -0
  72. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/__init__.py +0 -0
  73. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/components/__init__.py +0 -0
  74. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/components/sidebar.py +0 -0
  75. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/__init__.py +0 -0
  76. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/dashboard.py +0 -0
  77. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/index.py +0 -0
  78. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/settings.py +0 -0
  79. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/sidebar.py +0 -0
  80. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/styles.py +0 -0
  81. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/templates/__init__.py +0 -0
  82. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/templates/template.py +0 -0
  83. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
  84. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  85. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  86. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  87. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
  88. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  89. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  90. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
  91. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  92. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  93. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  94. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  95. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  96. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  97. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  98. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  99. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/tailwind.config.js.jinja2 +0 -0
  100. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  101. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  102. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/.gitignore +0 -0
  103. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +0 -0
  104. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  105. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/jsconfig.json +0 -0
  106. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/next.config.js +0 -0
  107. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/postcss.config.js +0 -0
  108. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/styles/tailwind.css +0 -0
  109. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  110. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  111. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/.templates/web/utils/helpers/range.js +0 -0
  112. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/__init__.py +0 -0
  113. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/__init__.pyi +0 -0
  114. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/__main__.py +0 -0
  115. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/admin.py +0 -0
  116. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/app.pyi +0 -0
  117. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/base.py +0 -0
  118. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/compiler/__init__.py +0 -0
  119. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/compiler/templates.py +0 -0
  120. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/__init__.py +0 -0
  121. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/__init__.py +0 -0
  122. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/app_wrap.py +0 -0
  123. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/app_wrap.pyi +0 -0
  124. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/bare.py +0 -0
  125. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/body.py +0 -0
  126. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/body.pyi +0 -0
  127. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/document.py +0 -0
  128. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/document.pyi +0 -0
  129. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/fragment.py +0 -0
  130. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/fragment.pyi +0 -0
  131. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/head.py +0 -0
  132. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/head.pyi +0 -0
  133. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/link.py +0 -0
  134. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/link.pyi +0 -0
  135. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/meta.py +0 -0
  136. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/meta.pyi +0 -0
  137. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/script.py +0 -0
  138. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/base/script.pyi +0 -0
  139. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/__init__.py +0 -0
  140. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/base.py +0 -0
  141. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/base.pyi +0 -0
  142. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/__init__.py +0 -0
  143. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/badge.py +0 -0
  144. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/badge.pyi +0 -0
  145. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/code.py +0 -0
  146. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/code.pyi +0 -0
  147. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/divider.py +0 -0
  148. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/divider.pyi +0 -0
  149. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/keyboard_key.py +0 -0
  150. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/keyboard_key.pyi +0 -0
  151. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/list.py +0 -0
  152. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/list.pyi +0 -0
  153. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/stat.py +0 -0
  154. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/stat.pyi +0 -0
  155. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/table.py +0 -0
  156. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/table.pyi +0 -0
  157. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/tag.py +0 -0
  158. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/datadisplay/tag.pyi +0 -0
  159. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/__init__.py +0 -0
  160. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/accordion.py +0 -0
  161. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/accordion.pyi +0 -0
  162. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/tabs.py +0 -0
  163. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/tabs.pyi +0 -0
  164. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/transition.py +0 -0
  165. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/transition.pyi +0 -0
  166. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/visuallyhidden.py +0 -0
  167. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/disclosure/visuallyhidden.pyi +0 -0
  168. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/__init__.py +0 -0
  169. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/alert.py +0 -0
  170. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/alert.pyi +0 -0
  171. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/circularprogress.py +0 -0
  172. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/circularprogress.pyi +0 -0
  173. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/progress.py +0 -0
  174. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/progress.pyi +0 -0
  175. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/skeleton.py +0 -0
  176. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/skeleton.pyi +0 -0
  177. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/spinner.py +0 -0
  178. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/feedback/spinner.pyi +0 -0
  179. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/__init__.py +0 -0
  180. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/button.py +0 -0
  181. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/button.pyi +0 -0
  182. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/checkbox.py +0 -0
  183. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/checkbox.pyi +0 -0
  184. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/colormodeswitch.py +0 -0
  185. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/colormodeswitch.pyi +0 -0
  186. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/date_picker.py +0 -0
  187. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/date_picker.pyi +0 -0
  188. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/date_time_picker.py +0 -0
  189. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/date_time_picker.pyi +0 -0
  190. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/editable.py +0 -0
  191. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/editable.pyi +0 -0
  192. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/email.py +0 -0
  193. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/email.pyi +0 -0
  194. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/form.py +0 -0
  195. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/form.pyi +0 -0
  196. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/iconbutton.py +0 -0
  197. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/iconbutton.pyi +0 -0
  198. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/input.py +0 -0
  199. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/input.pyi +0 -0
  200. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/multiselect.py +0 -0
  201. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/numberinput.py +0 -0
  202. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/numberinput.pyi +0 -0
  203. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/password.py +0 -0
  204. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/password.pyi +0 -0
  205. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/pininput.py +0 -0
  206. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/pininput.pyi +0 -0
  207. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/radio.py +0 -0
  208. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/radio.pyi +0 -0
  209. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/rangeslider.py +0 -0
  210. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/rangeslider.pyi +0 -0
  211. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/select.py +0 -0
  212. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/select.pyi +0 -0
  213. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/slider.py +0 -0
  214. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/slider.pyi +0 -0
  215. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/switch.py +0 -0
  216. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/switch.pyi +0 -0
  217. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/textarea.py +0 -0
  218. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/textarea.pyi +0 -0
  219. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/time_picker.py +0 -0
  220. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/forms/time_picker.pyi +0 -0
  221. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/__init__.py +0 -0
  222. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/aspect_ratio.py +0 -0
  223. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/aspect_ratio.pyi +0 -0
  224. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/box.py +0 -0
  225. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/box.pyi +0 -0
  226. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/card.py +0 -0
  227. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/card.pyi +0 -0
  228. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/center.py +0 -0
  229. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/center.pyi +0 -0
  230. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/container.py +0 -0
  231. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/container.pyi +0 -0
  232. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/flex.py +0 -0
  233. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/flex.pyi +0 -0
  234. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/grid.py +0 -0
  235. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/grid.pyi +0 -0
  236. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/spacer.py +0 -0
  237. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/spacer.pyi +0 -0
  238. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/stack.py +0 -0
  239. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/stack.pyi +0 -0
  240. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/wrap.py +0 -0
  241. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/layout/wrap.pyi +0 -0
  242. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/media/__init__.py +0 -0
  243. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/media/avatar.py +0 -0
  244. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/media/avatar.pyi +0 -0
  245. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/media/icon.py +0 -0
  246. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/media/icon.pyi +0 -0
  247. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/media/image.py +0 -0
  248. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/media/image.pyi +0 -0
  249. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/__init__.py +0 -0
  250. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/breadcrumb.py +0 -0
  251. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/breadcrumb.pyi +0 -0
  252. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/link.py +0 -0
  253. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/link.pyi +0 -0
  254. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/linkoverlay.py +0 -0
  255. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/linkoverlay.pyi +0 -0
  256. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/stepper.py +0 -0
  257. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/navigation/stepper.pyi +0 -0
  258. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/__init__.py +0 -0
  259. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/alertdialog.py +0 -0
  260. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/alertdialog.pyi +0 -0
  261. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/drawer.py +0 -0
  262. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/drawer.pyi +0 -0
  263. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/menu.py +0 -0
  264. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/menu.pyi +0 -0
  265. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/modal.py +0 -0
  266. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/modal.pyi +0 -0
  267. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/popover.py +0 -0
  268. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/popover.pyi +0 -0
  269. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/tooltip.py +0 -0
  270. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/overlay/tooltip.pyi +0 -0
  271. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/__init__.py +0 -0
  272. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/heading.py +0 -0
  273. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/heading.pyi +0 -0
  274. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/highlight.py +0 -0
  275. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/highlight.pyi +0 -0
  276. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/span.py +0 -0
  277. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/span.pyi +0 -0
  278. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/text.py +0 -0
  279. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/chakra/typography/text.pyi +0 -0
  280. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/__init__.py +0 -0
  281. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/banner.py +0 -0
  282. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/banner.pyi +0 -0
  283. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/client_side_routing.py +0 -0
  284. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/client_side_routing.pyi +0 -0
  285. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/colors.py +0 -0
  286. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/cond.py +0 -0
  287. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/debounce.py +0 -0
  288. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/debounce.pyi +0 -0
  289. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/foreach.py +0 -0
  290. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/html.py +0 -0
  291. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/html.pyi +0 -0
  292. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/layout/__init__.py +0 -0
  293. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/match.py +0 -0
  294. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/core/responsive.py +0 -0
  295. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/datadisplay/__init__.py +0 -0
  296. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/datadisplay/code.py +0 -0
  297. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/datadisplay/code.pyi +0 -0
  298. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/datadisplay/dataeditor.py +0 -0
  299. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  300. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/__init__.py +0 -0
  301. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/constants/__init__.py +0 -0
  302. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/constants/html.py +0 -0
  303. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/constants/react.py +0 -0
  304. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/constants/reflex.py +0 -0
  305. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/element.py +0 -0
  306. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/element.pyi +0 -0
  307. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/__init__.py +0 -0
  308. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/base.py +0 -0
  309. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/base.pyi +0 -0
  310. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/forms.pyi +0 -0
  311. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/inline.py +0 -0
  312. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/inline.pyi +0 -0
  313. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/media.py +0 -0
  314. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/media.pyi +0 -0
  315. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/metadata.py +0 -0
  316. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/metadata.pyi +0 -0
  317. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/other.py +0 -0
  318. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/other.pyi +0 -0
  319. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/scripts.py +0 -0
  320. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/scripts.pyi +0 -0
  321. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/sectioning.py +0 -0
  322. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/sectioning.pyi +0 -0
  323. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/tables.py +0 -0
  324. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/tables.pyi +0 -0
  325. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/typography.py +0 -0
  326. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/el/elements/typography.pyi +0 -0
  327. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/gridjs/__init__.py +0 -0
  328. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/gridjs/datatable.py +0 -0
  329. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/gridjs/datatable.pyi +0 -0
  330. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/literals.py +0 -0
  331. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/lucide/__init__.py +0 -0
  332. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/lucide/icon.py +0 -0
  333. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/lucide/icon.pyi +0 -0
  334. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/markdown/__init__.py +0 -0
  335. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/markdown/markdown.pyi +0 -0
  336. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/media/__init__.py +0 -0
  337. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/media/icon.py +0 -0
  338. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/moment/__init__.py +0 -0
  339. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/moment/moment.py +0 -0
  340. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/moment/moment.pyi +0 -0
  341. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/__init__.py +0 -0
  342. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/base.py +0 -0
  343. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/base.pyi +0 -0
  344. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/image.py +0 -0
  345. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/image.pyi +0 -0
  346. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/link.py +0 -0
  347. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/link.pyi +0 -0
  348. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/video.py +0 -0
  349. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/next/video.pyi +0 -0
  350. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/plotly/__init__.py +0 -0
  351. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/plotly/plotly.py +0 -0
  352. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/plotly/plotly.pyi +0 -0
  353. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/__init__.py +0 -0
  354. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/__init__.py +0 -0
  355. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/accordion.py +0 -0
  356. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/accordion.pyi +0 -0
  357. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/base.py +0 -0
  358. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/base.pyi +0 -0
  359. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/drawer.py +0 -0
  360. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/drawer.pyi +0 -0
  361. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/form.py +0 -0
  362. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/form.pyi +0 -0
  363. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/progress.py +0 -0
  364. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/progress.pyi +0 -0
  365. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/slider.py +0 -0
  366. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/primitives/slider.pyi +0 -0
  367. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/__init__.py +0 -0
  368. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/base.py +0 -0
  369. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/base.pyi +0 -0
  370. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/color_mode.py +0 -0
  371. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/color_mode.pyi +0 -0
  372. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/__init__.py +0 -0
  373. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  374. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  375. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/alertdialog.pyi +0 -0
  376. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  377. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  378. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/aspectratio.pyi +0 -0
  379. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/avatar.py +0 -0
  380. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  381. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/badge.py +0 -0
  382. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/badge.pyi +0 -0
  383. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/button.py +0 -0
  384. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/button.pyi +0 -0
  385. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/callout.py +0 -0
  386. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/callout.pyi +0 -0
  387. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/card.py +0 -0
  388. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/card.pyi +0 -0
  389. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/checkbox.py +0 -0
  390. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  391. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/context_menu.py +0 -0
  392. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  393. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/contextmenu.pyi +0 -0
  394. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/dialog.py +0 -0
  395. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  396. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  397. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  398. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/dropdownmenu.pyi +0 -0
  399. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/hover_card.py +0 -0
  400. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  401. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/hovercard.pyi +0 -0
  402. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/icon_button.py +0 -0
  403. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  404. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/iconbutton.pyi +0 -0
  405. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/inset.py +0 -0
  406. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/inset.pyi +0 -0
  407. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/popover.py +0 -0
  408. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/popover.pyi +0 -0
  409. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  410. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/radiogroup.pyi +0 -0
  411. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  412. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  413. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/scrollarea.pyi +0 -0
  414. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/separator.py +0 -0
  415. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/separator.pyi +0 -0
  416. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/slider.py +0 -0
  417. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/slider.pyi +0 -0
  418. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/switch.py +0 -0
  419. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/switch.pyi +0 -0
  420. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/table.py +0 -0
  421. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/table.pyi +0 -0
  422. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/tabs.py +0 -0
  423. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  424. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/text_area.py +0 -0
  425. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  426. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/text_field.py +0 -0
  427. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  428. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/textfield.pyi +0 -0
  429. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/tooltip.py +0 -0
  430. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  431. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/__init__.py +0 -0
  432. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/base.py +0 -0
  433. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/base.pyi +0 -0
  434. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/box.py +0 -0
  435. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/box.pyi +0 -0
  436. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/center.py +0 -0
  437. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/center.pyi +0 -0
  438. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/container.py +0 -0
  439. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/container.pyi +0 -0
  440. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/flex.py +0 -0
  441. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  442. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/grid.py +0 -0
  443. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  444. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/section.py +0 -0
  445. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/section.pyi +0 -0
  446. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/spacer.py +0 -0
  447. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  448. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/stack.py +0 -0
  449. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  450. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/__init__.py +0 -0
  451. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/base.py +0 -0
  452. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  453. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  454. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/code.py +0 -0
  455. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/code.pyi +0 -0
  456. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/em.pyi +0 -0
  457. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/heading.py +0 -0
  458. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  459. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/kbd.pyi +0 -0
  460. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/link.py +0 -0
  461. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/link.pyi +0 -0
  462. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/quote.pyi +0 -0
  463. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/strong.pyi +0 -0
  464. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/text.py +0 -0
  465. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/radix/themes/typography/text.pyi +0 -0
  466. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/react_player/__init__.py +0 -0
  467. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/react_player/audio.py +0 -0
  468. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/react_player/audio.pyi +0 -0
  469. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/react_player/react_player.py +0 -0
  470. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/react_player/react_player.pyi +0 -0
  471. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/react_player/video.py +0 -0
  472. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/react_player/video.pyi +0 -0
  473. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/__init__.py +0 -0
  474. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/cartesian.py +0 -0
  475. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/cartesian.pyi +0 -0
  476. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/charts.py +0 -0
  477. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/charts.pyi +0 -0
  478. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/general.py +0 -0
  479. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/general.pyi +0 -0
  480. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/polar.py +0 -0
  481. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/polar.pyi +0 -0
  482. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/recharts.py +0 -0
  483. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/recharts/recharts.pyi +0 -0
  484. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/suneditor/__init__.py +0 -0
  485. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/suneditor/editor.py +0 -0
  486. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/suneditor/editor.pyi +0 -0
  487. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/tags/__init__.py +0 -0
  488. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/tags/cond_tag.py +0 -0
  489. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/tags/iter_tag.py +0 -0
  490. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/tags/match_tag.py +0 -0
  491. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/tags/tag.py +0 -0
  492. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/components/tags/tagless.py +0 -0
  493. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/config.py +0 -0
  494. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/config.pyi +0 -0
  495. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/__init__.py +0 -0
  496. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/base.py +0 -0
  497. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/colors.py +0 -0
  498. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/compiler.py +0 -0
  499. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/config.py +0 -0
  500. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/custom_components.py +0 -0
  501. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/event.py +0 -0
  502. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/constants/style.py +0 -0
  503. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/custom_components/__init__.py +0 -0
  504. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/custom_components/custom_components.py +0 -0
  505. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/middleware/__init__.py +0 -0
  506. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/middleware/hydrate_middleware.py +0 -0
  507. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/middleware/middleware.py +0 -0
  508. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/page.py +0 -0
  509. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/page.pyi +0 -0
  510. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/reflex.py +0 -0
  511. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/route.py +0 -0
  512. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/style.py +0 -0
  513. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/__init__.py +0 -0
  514. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/build.py +0 -0
  515. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/console.py +0 -0
  516. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/exceptions.py +0 -0
  517. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/export.py +0 -0
  518. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/imports.py +0 -0
  519. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/path_ops.py +0 -0
  520. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/serializers.py +0 -0
  521. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/types.py +0 -0
  522. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/utils/watch.py +0 -0
  523. {reflex-0.4.4a2 → reflex-0.4.5}/reflex/vars.pyi +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: reflex
3
- Version: 0.4.4a2
3
+ Version: 0.4.5
4
4
  Summary: Web apps in pure Python.
5
5
  Home-page: https://reflex.dev
6
6
  License: Apache-2.0
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "reflex"
3
- version = "0.4.4a2"
3
+ version = "0.4.5"
4
4
  description = "Web apps in pure Python."
5
5
  license = "Apache-2.0"
6
6
  authors = [
@@ -1,7 +1,7 @@
1
1
  {% import 'web/pages/utils.js.jinja2' as utils %}
2
2
 
3
3
  export function {{tag_name}} () {
4
- {% for hook in component.get_hooks() %}
4
+ {% for hook in component.get_hooks_internal() %}
5
5
  {{ hook }}
6
6
  {% endfor %}
7
7
 
@@ -9,6 +9,10 @@ export function {{tag_name}} () {
9
9
  {{ hook }}
10
10
  {% endfor %}
11
11
 
12
+ {% for hook in component.get_hooks() %}
13
+ {{ hook }}
14
+ {% endfor %}
15
+
12
16
  return (
13
17
  {{utils.render(component.render(), indent_width=0)}}
14
18
  )
@@ -161,7 +161,8 @@ export const applyEvent = async (event, socket) => {
161
161
  if (event.name == "_download") {
162
162
  const a = document.createElement("a");
163
163
  a.hidden = true;
164
- a.href = event.payload.url;
164
+ // Special case when linking to uploaded files
165
+ a.href = event.payload.url.replace("${getBackendURL(env.UPLOAD)}", getBackendURL(env.UPLOAD))
165
166
  a.download = event.payload.filename;
166
167
  a.click();
167
168
  a.remove();
@@ -7,7 +7,9 @@ import concurrent.futures
7
7
  import contextlib
8
8
  import copy
9
9
  import functools
10
+ import multiprocessing
10
11
  import os
12
+ import platform
11
13
  from typing import (
12
14
  Any,
13
15
  AsyncIterator,
@@ -37,6 +39,7 @@ from reflex.admin import AdminDash
37
39
  from reflex.base import Base
38
40
  from reflex.compiler import compiler
39
41
  from reflex.compiler import utils as compiler_utils
42
+ from reflex.compiler.compiler import ExecutorSafeFunctions
40
43
  from reflex.components import connection_modal, connection_pulser
41
44
  from reflex.components.base.app_wrap import AppWrap
42
45
  from reflex.components.base.fragment import Fragment
@@ -74,7 +77,7 @@ from reflex.state import (
74
77
  code_uses_state_contexts,
75
78
  )
76
79
  from reflex.utils import console, exceptions, format, prerequisites, types
77
- from reflex.utils.exec import is_testing_env
80
+ from reflex.utils.exec import is_testing_env, should_skip_compile
78
81
  from reflex.utils.imports import ImportVar
79
82
 
80
83
  # Define custom types.
@@ -408,8 +411,8 @@ class App(Base):
408
411
  self,
409
412
  component: Component | ComponentCallable,
410
413
  route: str | None = None,
411
- title: str = constants.DefaultPage.TITLE,
412
- description: str = constants.DefaultPage.DESCRIPTION,
414
+ title: str | None = None,
415
+ description: str | None = None,
413
416
  image: str = constants.DefaultPage.IMAGE,
414
417
  on_load: (
415
418
  EventHandler | EventSpec | list[EventHandler | EventSpec] | None
@@ -468,13 +471,23 @@ class App(Base):
468
471
 
469
472
  component = OverlayFragment.create(component)
470
473
 
474
+ meta_args = {
475
+ "title": (
476
+ title
477
+ if title is not None
478
+ else format.make_default_page_title(get_config().app_name, route)
479
+ ),
480
+ "image": image,
481
+ "meta": meta,
482
+ }
483
+
484
+ if description is not None:
485
+ meta_args["description"] = description
486
+
471
487
  # Add meta information to the component.
472
488
  compiler_utils.add_meta(
473
489
  component,
474
- title=title,
475
- image=image,
476
- description=description,
477
- meta=meta,
490
+ **meta_args,
478
491
  )
479
492
 
480
493
  # Add script tags if given
@@ -659,7 +672,7 @@ class App(Base):
659
672
  Whether the app should be compiled.
660
673
  """
661
674
  # Check the environment variable.
662
- if os.environ.get(constants.SKIP_COMPILE_ENV_VAR) == "yes":
675
+ if should_skip_compile():
663
676
  return False
664
677
 
665
678
  # Check the nocompile file.
@@ -706,16 +719,25 @@ class App(Base):
706
719
  )
707
720
  return
708
721
 
722
+ def _apply_decorated_pages(self):
723
+ """Add @rx.page decorated pages to the app.
724
+
725
+ This has to be done in the MainThread for py38 and py39 compatibility, so the
726
+ decorated pages are added to the app before the app is compiled (in a thread)
727
+ to workaround REF-2172.
728
+
729
+ This can move back into `compile_` when py39 support is dropped.
730
+ """
731
+ # Add the @rx.page decorated pages to collect on_load events.
732
+ for render, kwargs in DECORATED_PAGES:
733
+ self.add_page(render, **kwargs)
734
+
709
735
  def compile_(self):
710
736
  """Compile the app and output it to the pages folder.
711
737
 
712
738
  Raises:
713
739
  RuntimeError: When any page uses state, but no rx.State subclass is defined.
714
740
  """
715
- # add the pages before the compile check so App know onload methods
716
- for render, kwargs in DECORATED_PAGES:
717
- self.add_page(render, **kwargs)
718
-
719
741
  # Render a default 404 page if the user didn't supply one
720
742
  if constants.Page404.SLUG not in self.pages:
721
743
  self.add_custom_404_page()
@@ -735,6 +757,17 @@ class App(Base):
735
757
  TimeElapsedColumn(),
736
758
  )
737
759
 
760
+ # try to be somewhat accurate - but still not 100%
761
+ adhoc_steps_without_executor = 6
762
+ fixed_pages_within_executor = 5
763
+ progress.start()
764
+ task = progress.add_task(
765
+ "Compiling:",
766
+ total=len(self.pages)
767
+ + fixed_pages_within_executor
768
+ + adhoc_steps_without_executor,
769
+ )
770
+
738
771
  # Get the env mode.
739
772
  config = get_config()
740
773
 
@@ -750,6 +783,8 @@ class App(Base):
750
783
  # If a theme component was provided, wrap the app with it
751
784
  app_wrappers[(20, "Theme")] = self.theme
752
785
 
786
+ progress.advance(task)
787
+
753
788
  # Fix up the style.
754
789
  self.style = evaluate_style_namespaces(self.style)
755
790
 
@@ -757,133 +792,156 @@ class App(Base):
757
792
  all_imports = {}
758
793
  custom_components = set()
759
794
 
760
- # Compile the pages in parallel.
761
- with progress, concurrent.futures.ThreadPoolExecutor() as thread_pool:
762
- fixed_pages = 7
763
- task = progress.add_task("Compiling:", total=len(self.pages) + fixed_pages)
795
+ for _route, component in self.pages.items():
796
+ # Merge the component style with the app style.
797
+ component.add_style(self.style)
764
798
 
765
- def mark_complete(_=None):
766
- progress.advance(task)
799
+ component.apply_theme(self.theme)
767
800
 
768
- for _route, component in self.pages.items():
769
- # Merge the component style with the app style.
770
- component.add_style(self.style)
801
+ # Add component.get_imports() to all_imports.
802
+ all_imports.update(component.get_imports())
771
803
 
772
- component.apply_theme(self.theme)
804
+ # Add the app wrappers from this component.
805
+ app_wrappers.update(component.get_app_wrap_components())
773
806
 
774
- # Add component.get_imports() to all_imports.
775
- all_imports.update(component.get_imports())
807
+ # Add the custom components from the page to the set.
808
+ custom_components |= component.get_custom_components()
776
809
 
777
- # Add the app wrappers from this component.
778
- app_wrappers.update(component.get_app_wrap_components())
810
+ progress.advance(task)
779
811
 
780
- # Add the custom components from the page to the set.
781
- custom_components |= component.get_custom_components()
812
+ # Perform auto-memoization of stateful components.
813
+ (
814
+ stateful_components_path,
815
+ stateful_components_code,
816
+ page_components,
817
+ ) = compiler.compile_stateful_components(self.pages.values())
782
818
 
783
- # Perform auto-memoization of stateful components.
784
- (
785
- stateful_components_path,
786
- stateful_components_code,
787
- page_components,
788
- ) = compiler.compile_stateful_components(self.pages.values())
819
+ progress.advance(task)
789
820
 
790
- # Catch "static" apps (that do not define a rx.State subclass) which are trying to access rx.State.
791
- if (
792
- code_uses_state_contexts(stateful_components_code)
793
- and self.state is None
794
- ):
795
- raise RuntimeError(
796
- "To access rx.State in frontend components, at least one "
797
- "subclass of rx.State must be defined in the app."
798
- )
799
- compile_results.append((stateful_components_path, stateful_components_code))
821
+ # Catch "static" apps (that do not define a rx.State subclass) which are trying to access rx.State.
822
+ if code_uses_state_contexts(stateful_components_code) and self.state is None:
823
+ raise RuntimeError(
824
+ "To access rx.State in frontend components, at least one "
825
+ "subclass of rx.State must be defined in the app."
826
+ )
827
+ compile_results.append((stateful_components_path, stateful_components_code))
800
828
 
801
- result_futures = []
829
+ # Compile the root document before fork.
830
+ compile_results.append(
831
+ compiler.compile_document_root(
832
+ self.head_components,
833
+ html_lang=self.html_lang,
834
+ html_custom_attrs=self.html_custom_attrs, # type: ignore
835
+ )
836
+ )
837
+
838
+ # Compile the contexts before fork.
839
+ compile_results.append(
840
+ compiler.compile_contexts(self.state, self.theme),
841
+ )
842
+
843
+ app_root = self._app_root(app_wrappers=app_wrappers)
844
+
845
+ progress.advance(task)
846
+
847
+ # Prepopulate the global ExecutorSafeFunctions class with input data required by the compile functions.
848
+ # This is required for multiprocessing to work, in presence of non-picklable inputs.
849
+ for route, component in zip(self.pages, page_components):
850
+ ExecutorSafeFunctions.COMPILE_PAGE_ARGS_BY_ROUTE[route] = (
851
+ route,
852
+ component,
853
+ self.state,
854
+ )
802
855
 
803
- def submit_work(fn, *args, **kwargs):
804
- """Submit work to the thread pool and add a callback to mark the task as complete.
856
+ ExecutorSafeFunctions.COMPILE_APP_APP_ROOT = app_root
857
+ ExecutorSafeFunctions.CUSTOM_COMPONENTS = custom_components
858
+ ExecutorSafeFunctions.STYLE = self.style
859
+
860
+ # Use a forking process pool, if possible. Much faster, especially for large sites.
861
+ # Fallback to ThreadPoolExecutor as something that will always work.
862
+ executor = None
863
+ if (
864
+ platform.system() in ("Linux", "Darwin")
865
+ and os.environ.get("REFLEX_COMPILE_PROCESSES") is not None
866
+ ):
867
+ executor = concurrent.futures.ProcessPoolExecutor(
868
+ max_workers=int(os.environ.get("REFLEX_COMPILE_PROCESSES", 0)) or None,
869
+ mp_context=multiprocessing.get_context("fork"),
870
+ )
871
+ else:
872
+ executor = concurrent.futures.ThreadPoolExecutor(
873
+ max_workers=int(os.environ.get("REFLEX_COMPILE_THREADS", 0)) or None,
874
+ )
805
875
 
806
- The Future will be added to the `result_futures` list.
876
+ with executor:
877
+ result_futures = []
878
+ custom_components_future = None
807
879
 
808
- Args:
809
- fn: The function to submit.
810
- *args: The args to submit.
811
- **kwargs: The kwargs to submit.
812
- """
813
- f = thread_pool.submit(fn, *args, **kwargs)
814
- f.add_done_callback(mark_complete)
880
+ def _mark_complete(_=None):
881
+ progress.advance(task)
882
+
883
+ def _submit_work(fn, *args, **kwargs):
884
+ f = executor.submit(fn, *args, **kwargs)
885
+ f.add_done_callback(_mark_complete)
815
886
  result_futures.append(f)
816
887
 
817
888
  # Compile all page components.
818
- for route, component in zip(self.pages, page_components):
819
- submit_work(
820
- compiler.compile_page,
821
- route,
822
- component,
823
- self.state,
824
- )
889
+ for route in self.pages:
890
+ _submit_work(ExecutorSafeFunctions.compile_page, route)
825
891
 
826
892
  # Compile the app wrapper.
827
- app_root = self._app_root(app_wrappers=app_wrappers)
828
- submit_work(compiler.compile_app, app_root)
893
+ _submit_work(ExecutorSafeFunctions.compile_app)
829
894
 
830
895
  # Compile the custom components.
831
- submit_work(compiler.compile_components, custom_components)
896
+ custom_components_future = executor.submit(
897
+ ExecutorSafeFunctions.compile_custom_components,
898
+ )
899
+ custom_components_future.add_done_callback(_mark_complete)
832
900
 
833
901
  # Compile the root stylesheet with base styles.
834
- submit_work(compiler.compile_root_stylesheet, self.stylesheets)
835
-
836
- # Compile the root document.
837
- submit_work(
838
- compiler.compile_document_root,
839
- self.head_components,
840
- html_lang=self.html_lang,
841
- html_custom_attrs=self.html_custom_attrs,
842
- )
902
+ _submit_work(compiler.compile_root_stylesheet, self.stylesheets)
843
903
 
844
904
  # Compile the theme.
845
- submit_work(compiler.compile_theme, style=self.style)
846
-
847
- # Compile the contexts.
848
- submit_work(compiler.compile_contexts, self.state, self.theme)
905
+ _submit_work(ExecutorSafeFunctions.compile_theme)
849
906
 
850
907
  # Compile the Tailwind config.
851
908
  if config.tailwind is not None:
852
909
  config.tailwind["content"] = config.tailwind.get(
853
910
  "content", constants.Tailwind.CONTENT
854
911
  )
855
- submit_work(compiler.compile_tailwind, config.tailwind)
912
+ _submit_work(compiler.compile_tailwind, config.tailwind)
856
913
  else:
857
- submit_work(compiler.remove_tailwind_from_postcss)
858
-
859
- # Get imports from AppWrap components.
860
- all_imports.update(app_root.get_imports())
861
-
862
- # Iterate through all the custom components and add their imports to the all_imports.
863
- for component in custom_components:
864
- all_imports.update(component.get_imports())
914
+ _submit_work(compiler.remove_tailwind_from_postcss)
865
915
 
866
916
  # Wait for all compilation tasks to complete.
867
917
  for future in concurrent.futures.as_completed(result_futures):
868
918
  compile_results.append(future.result())
869
919
 
870
- # Empty the .web pages directory.
871
- compiler.purge_web_pages_dir()
920
+ # Special case for custom_components, since we need the compiled imports
921
+ # to install proper frontend packages.
922
+ (
923
+ *custom_components_result,
924
+ custom_components_imports,
925
+ ) = custom_components_future.result()
926
+ compile_results.append(custom_components_result)
927
+ all_imports.update(custom_components_imports)
928
+
929
+ # Get imports from AppWrap components.
930
+ all_imports.update(app_root.get_imports())
872
931
 
873
- # Avoid flickering when installing frontend packages
874
- progress.stop()
932
+ progress.advance(task)
875
933
 
876
- # Install frontend packages.
877
- self.get_frontend_packages(all_imports)
934
+ # Empty the .web pages directory.
935
+ compiler.purge_web_pages_dir()
878
936
 
879
- # Write the pages at the end to trigger the NextJS hot reload only once.
880
- write_page_futures = []
881
- for output_path, code in compile_results:
882
- write_page_futures.append(
883
- thread_pool.submit(compiler_utils.write_page, output_path, code)
884
- )
885
- for future in concurrent.futures.as_completed(write_page_futures):
886
- future.result()
937
+ progress.advance(task)
938
+ progress.stop()
939
+
940
+ # Install frontend packages.
941
+ self.get_frontend_packages(all_imports)
942
+
943
+ for output_path, code in compile_results:
944
+ compiler_utils.write_page(output_path, code)
887
945
 
888
946
  @contextlib.asynccontextmanager
889
947
  async def modify_state(self, token: str) -> AsyncIterator[BaseState]:
@@ -1192,7 +1250,10 @@ class EventNamespace(AsyncNamespace):
1192
1250
  }
1193
1251
 
1194
1252
  # Get the client IP
1195
- client_ip = environ["REMOTE_ADDR"]
1253
+ try:
1254
+ client_ip = environ["asgi.scope"]["client"][0]
1255
+ except (KeyError, IndexError):
1256
+ client_ip = environ.get("REMOTE_ADDR", "0.0.0.0")
1196
1257
 
1197
1258
  # Process the events.
1198
1259
  async for update in process(self.app, event, sid, headers, client_ip):
@@ -5,13 +5,16 @@ from concurrent.futures import ThreadPoolExecutor
5
5
 
6
6
  from reflex import constants
7
7
  from reflex.utils.exec import is_prod_mode
8
- from reflex.utils.prerequisites import get_app, get_compiled_app
8
+ from reflex.utils.prerequisites import get_app
9
9
 
10
10
  if "app" != constants.CompileVars.APP:
11
11
  raise AssertionError("unexpected variable name for 'app'")
12
12
 
13
13
  app_module = get_app(reload=False)
14
14
  app = getattr(app_module, constants.CompileVars.APP)
15
+ # For py3.8 and py3.9 compatibility when redis is used, we MUST add any decorator pages
16
+ # before compiling the app in a thread to avoid event loop error (REF-2172).
17
+ app._apply_decorated_pages()
15
18
  compile_future = ThreadPoolExecutor(max_workers=1).submit(app.compile_)
16
19
  compile_future.add_done_callback(
17
20
  # Force background compile errors to print eagerly
@@ -25,7 +28,6 @@ if is_prod_mode():
25
28
  del app_module
26
29
  del compile_future
27
30
  del get_app
28
- del get_compiled_app
29
31
  del is_prod_mode
30
32
  del constants
31
33
  del ThreadPoolExecutor
@@ -50,7 +50,7 @@ def _compile_app(app_root: Component) -> str:
50
50
  return templates.APP_ROOT.render(
51
51
  imports=utils.compile_imports(app_root.get_imports()),
52
52
  custom_codes=app_root.get_custom_code(),
53
- hooks=app_root.get_hooks(),
53
+ hooks=app_root.get_hooks_internal() | app_root.get_hooks(),
54
54
  render=app_root.render(),
55
55
  )
56
56
 
@@ -67,7 +67,7 @@ def _compile_theme(theme: dict) -> str:
67
67
  return templates.THEME.render(theme=theme)
68
68
 
69
69
 
70
- def _compile_contexts(state: Optional[Type[BaseState]], theme: Component) -> str:
70
+ def _compile_contexts(state: Optional[Type[BaseState]], theme: Component | None) -> str:
71
71
  """Compile the initial state and contexts.
72
72
 
73
73
  Args:
@@ -119,7 +119,7 @@ def _compile_page(
119
119
  imports=imports,
120
120
  dynamic_imports=component.get_dynamic_imports(),
121
121
  custom_codes=component.get_custom_code(),
122
- hooks=component.get_hooks(),
122
+ hooks=component.get_hooks_internal() | component.get_hooks(),
123
123
  render=component.render(),
124
124
  **kwargs,
125
125
  )
@@ -186,7 +186,9 @@ def _compile_component(component: Component) -> str:
186
186
  return templates.COMPONENT.render(component=component)
187
187
 
188
188
 
189
- def _compile_components(components: set[CustomComponent]) -> str:
189
+ def _compile_components(
190
+ components: set[CustomComponent],
191
+ ) -> tuple[str, Dict[str, list[ImportVar]]]:
190
192
  """Compile the components.
191
193
 
192
194
  Args:
@@ -208,9 +210,12 @@ def _compile_components(components: set[CustomComponent]) -> str:
208
210
  imports = utils.merge_imports(imports, component_imports)
209
211
 
210
212
  # Compile the components page.
211
- return templates.COMPONENTS.render(
212
- imports=utils.compile_imports(imports),
213
- components=component_renders,
213
+ return (
214
+ templates.COMPONENTS.render(
215
+ imports=utils.compile_imports(imports),
216
+ components=component_renders,
217
+ ),
218
+ imports,
214
219
  )
215
220
 
216
221
 
@@ -363,7 +368,7 @@ def compile_theme(style: ComponentStyle) -> tuple[str, str]:
363
368
 
364
369
  def compile_contexts(
365
370
  state: Optional[Type[BaseState]],
366
- theme: Component,
371
+ theme: Component | None,
367
372
  ) -> tuple[str, str]:
368
373
  """Compile the initial state / context.
369
374
 
@@ -401,7 +406,9 @@ def compile_page(
401
406
  return output_path, code
402
407
 
403
408
 
404
- def compile_components(components: set[CustomComponent]):
409
+ def compile_components(
410
+ components: set[CustomComponent],
411
+ ) -> tuple[str, str, Dict[str, list[ImportVar]]]:
405
412
  """Compile the custom components.
406
413
 
407
414
  Args:
@@ -414,8 +421,8 @@ def compile_components(components: set[CustomComponent]):
414
421
  output_path = utils.get_components_path()
415
422
 
416
423
  # Compile the components.
417
- code = _compile_components(components)
418
- return output_path, code
424
+ code, imports = _compile_components(components)
425
+ return output_path, code, imports
419
426
 
420
427
 
421
428
  def compile_stateful_components(
@@ -487,3 +494,88 @@ def purge_web_pages_dir():
487
494
 
488
495
  # Empty out the web pages directory.
489
496
  utils.empty_dir(constants.Dirs.WEB_PAGES, keep_files=["_app.js"])
497
+
498
+
499
+ class ExecutorSafeFunctions:
500
+ """Helper class to allow parallelisation of parts of the compilation process.
501
+
502
+ This class (and its class attributes) are available at global scope.
503
+
504
+ In a multiprocessing context (like when using a ProcessPoolExecutor), the content of this
505
+ global class is logically replicated to any FORKED process.
506
+
507
+ How it works:
508
+ * Before the child process is forked, ensure that we stash any input data required by any future
509
+ function call in the child process.
510
+ * After the child process is forked, the child process will have a copy of the global class, which
511
+ includes the previously stashed input data.
512
+ * Any task submitted to the child process simply needs a way to communicate which input data the
513
+ requested function call requires.
514
+
515
+ Why do we need this? Passing input data directly to child process often not possible because the input data is not picklable.
516
+ The mechanic described here removes the need to pickle the input data at all.
517
+
518
+ Limitations:
519
+ * This can never support returning unpicklable OUTPUT data.
520
+ * Any object mutations done by the child process will not propagate back to the parent process (fork goes one way!).
521
+
522
+ """
523
+
524
+ COMPILE_PAGE_ARGS_BY_ROUTE = {}
525
+ COMPILE_APP_APP_ROOT: Component | None = None
526
+ CUSTOM_COMPONENTS: set[CustomComponent] | None = None
527
+ STYLE: ComponentStyle | None = None
528
+
529
+ @classmethod
530
+ def compile_page(cls, route: str):
531
+ """Compile a page.
532
+
533
+ Args:
534
+ route: The route of the page to compile.
535
+
536
+ Returns:
537
+ The path and code of the compiled page.
538
+ """
539
+ return compile_page(*cls.COMPILE_PAGE_ARGS_BY_ROUTE[route])
540
+
541
+ @classmethod
542
+ def compile_app(cls):
543
+ """Compile the app.
544
+
545
+ Returns:
546
+ The path and code of the compiled app.
547
+
548
+ Raises:
549
+ ValueError: If the app root is not set.
550
+ """
551
+ if cls.COMPILE_APP_APP_ROOT is None:
552
+ raise ValueError("COMPILE_APP_APP_ROOT should be set")
553
+ return compile_app(cls.COMPILE_APP_APP_ROOT)
554
+
555
+ @classmethod
556
+ def compile_custom_components(cls):
557
+ """Compile the custom components.
558
+
559
+ Returns:
560
+ The path and code of the compiled custom components.
561
+
562
+ Raises:
563
+ ValueError: If the custom components are not set.
564
+ """
565
+ if cls.CUSTOM_COMPONENTS is None:
566
+ raise ValueError("CUSTOM_COMPONENTS should be set")
567
+ return compile_components(cls.CUSTOM_COMPONENTS)
568
+
569
+ @classmethod
570
+ def compile_theme(cls):
571
+ """Compile the theme.
572
+
573
+ Returns:
574
+ The path and code of the compiled theme.
575
+
576
+ Raises:
577
+ ValueError: If the style is not set.
578
+ """
579
+ if cls.STYLE is None:
580
+ raise ValueError("STYLE should be set")
581
+ return compile_theme(cls.STYLE)