reflex 0.4.4a1__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.4a1 → reflex-0.4.5}/PKG-INFO +1 -1
  2. {reflex-0.4.4a1 → reflex-0.4.5}/pyproject.toml +1 -1
  3. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +5 -1
  4. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/utils/state.js +2 -1
  5. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/app.py +173 -108
  6. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/app_module_for_backend.py +4 -2
  7. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/compiler/compiler.py +103 -11
  8. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/compiler/utils.py +16 -6
  9. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/component.py +86 -14
  10. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/upload.py +2 -2
  11. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/upload.pyi +1 -1
  12. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/forms.py +1 -1
  13. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/markdown/markdown.py +4 -2
  14. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/radio_group.py +2 -1
  15. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/select.py +7 -2
  16. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/select.pyi +14 -0
  17. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/list.py +31 -4
  18. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/list.pyi +53 -9
  19. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/installer.py +1 -1
  20. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/route.py +2 -2
  21. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/event.py +4 -0
  22. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/model.py +88 -4
  23. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/state.py +20 -5
  24. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/testing.py +23 -1
  25. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/exec.py +9 -0
  26. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/format.py +46 -19
  27. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/prerequisites.py +31 -10
  28. {reflex-0.4.4a1 → 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.4a1 → reflex-0.4.5}/reflex/vars.py +5 -3
  31. reflex-0.4.4a1/reflex/utils/telemetry.py +0 -110
  32. {reflex-0.4.4a1 → reflex-0.4.5}/LICENSE +0 -0
  33. {reflex-0.4.4a1 → reflex-0.4.5}/README.md +0 -0
  34. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  35. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  36. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/blank/code/blank.py +0 -0
  37. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/.gitignore +0 -0
  38. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/favicon.ico +0 -0
  39. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/github.svg +0 -0
  40. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/icon.svg +0 -0
  41. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/logo.svg +0 -0
  42. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/assets/paneleft.svg +0 -0
  43. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/__init__.py +0 -0
  44. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/demo.py +0 -0
  45. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/__init__.py +0 -0
  46. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/chatapp.py +0 -0
  47. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/datatable.py +0 -0
  48. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/forms.py +0 -0
  49. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/graphing.py +0 -0
  50. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/pages/home.py +0 -0
  51. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/sidebar.py +0 -0
  52. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/state.py +0 -0
  53. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/states/form_state.py +0 -0
  54. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/states/pie_state.py +0 -0
  55. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/styles.py +0 -0
  56. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
  57. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -0
  58. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/chat.py +0 -0
  59. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -0
  60. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/modal.py +0 -0
  61. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -0
  62. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -0
  63. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/state.py +0 -0
  64. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/demo/code/webui/styles.py +0 -0
  65. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/README.md +0 -0
  66. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/favicon.ico +0 -0
  67. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/github.svg +0 -0
  68. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/logo.svg +0 -0
  69. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/paneleft.svg +0 -0
  70. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/reflex_black.svg +0 -0
  71. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/assets/reflex_white.svg +0 -0
  72. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/__init__.py +0 -0
  73. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/components/__init__.py +0 -0
  74. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/components/sidebar.py +0 -0
  75. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/__init__.py +0 -0
  76. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/dashboard.py +0 -0
  77. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/index.py +0 -0
  78. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/pages/settings.py +0 -0
  79. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/sidebar.py +0 -0
  80. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/styles.py +0 -0
  81. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/templates/__init__.py +0 -0
  82. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/apps/sidebar/code/templates/template.py +0 -0
  83. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
  84. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  85. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  86. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  87. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
  88. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  89. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  90. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
  91. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  92. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  93. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  94. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  95. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  96. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  97. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  98. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  99. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/tailwind.config.js.jinja2 +0 -0
  100. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  101. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  102. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/.gitignore +0 -0
  103. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +0 -0
  104. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  105. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/jsconfig.json +0 -0
  106. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/next.config.js +0 -0
  107. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/postcss.config.js +0 -0
  108. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/styles/tailwind.css +0 -0
  109. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  110. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  111. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/.templates/web/utils/helpers/range.js +0 -0
  112. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/__init__.py +0 -0
  113. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/__init__.pyi +0 -0
  114. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/__main__.py +0 -0
  115. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/admin.py +0 -0
  116. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/app.pyi +0 -0
  117. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/base.py +0 -0
  118. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/compiler/__init__.py +0 -0
  119. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/compiler/templates.py +0 -0
  120. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/__init__.py +0 -0
  121. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/__init__.py +0 -0
  122. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/app_wrap.py +0 -0
  123. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/app_wrap.pyi +0 -0
  124. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/bare.py +0 -0
  125. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/body.py +0 -0
  126. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/body.pyi +0 -0
  127. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/document.py +0 -0
  128. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/document.pyi +0 -0
  129. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/fragment.py +0 -0
  130. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/fragment.pyi +0 -0
  131. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/head.py +0 -0
  132. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/head.pyi +0 -0
  133. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/link.py +0 -0
  134. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/link.pyi +0 -0
  135. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/meta.py +0 -0
  136. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/meta.pyi +0 -0
  137. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/script.py +0 -0
  138. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/base/script.pyi +0 -0
  139. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/__init__.py +0 -0
  140. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/base.py +0 -0
  141. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/base.pyi +0 -0
  142. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/__init__.py +0 -0
  143. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/badge.py +0 -0
  144. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/badge.pyi +0 -0
  145. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/code.py +0 -0
  146. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/code.pyi +0 -0
  147. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/divider.py +0 -0
  148. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/divider.pyi +0 -0
  149. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/keyboard_key.py +0 -0
  150. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/keyboard_key.pyi +0 -0
  151. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/list.py +0 -0
  152. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/list.pyi +0 -0
  153. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/stat.py +0 -0
  154. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/stat.pyi +0 -0
  155. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/table.py +0 -0
  156. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/table.pyi +0 -0
  157. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/tag.py +0 -0
  158. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/datadisplay/tag.pyi +0 -0
  159. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/__init__.py +0 -0
  160. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/accordion.py +0 -0
  161. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/accordion.pyi +0 -0
  162. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/tabs.py +0 -0
  163. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/tabs.pyi +0 -0
  164. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/transition.py +0 -0
  165. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/transition.pyi +0 -0
  166. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/visuallyhidden.py +0 -0
  167. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/disclosure/visuallyhidden.pyi +0 -0
  168. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/__init__.py +0 -0
  169. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/alert.py +0 -0
  170. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/alert.pyi +0 -0
  171. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/circularprogress.py +0 -0
  172. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/circularprogress.pyi +0 -0
  173. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/progress.py +0 -0
  174. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/progress.pyi +0 -0
  175. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/skeleton.py +0 -0
  176. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/skeleton.pyi +0 -0
  177. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/spinner.py +0 -0
  178. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/feedback/spinner.pyi +0 -0
  179. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/__init__.py +0 -0
  180. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/button.py +0 -0
  181. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/button.pyi +0 -0
  182. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/checkbox.py +0 -0
  183. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/checkbox.pyi +0 -0
  184. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/colormodeswitch.py +0 -0
  185. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/colormodeswitch.pyi +0 -0
  186. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/date_picker.py +0 -0
  187. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/date_picker.pyi +0 -0
  188. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/date_time_picker.py +0 -0
  189. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/date_time_picker.pyi +0 -0
  190. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/editable.py +0 -0
  191. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/editable.pyi +0 -0
  192. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/email.py +0 -0
  193. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/email.pyi +0 -0
  194. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/form.py +0 -0
  195. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/form.pyi +0 -0
  196. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/iconbutton.py +0 -0
  197. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/iconbutton.pyi +0 -0
  198. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/input.py +0 -0
  199. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/input.pyi +0 -0
  200. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/multiselect.py +0 -0
  201. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/numberinput.py +0 -0
  202. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/numberinput.pyi +0 -0
  203. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/password.py +0 -0
  204. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/password.pyi +0 -0
  205. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/pininput.py +0 -0
  206. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/pininput.pyi +0 -0
  207. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/radio.py +0 -0
  208. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/radio.pyi +0 -0
  209. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/rangeslider.py +0 -0
  210. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/rangeslider.pyi +0 -0
  211. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/select.py +0 -0
  212. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/select.pyi +0 -0
  213. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/slider.py +0 -0
  214. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/slider.pyi +0 -0
  215. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/switch.py +0 -0
  216. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/switch.pyi +0 -0
  217. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/textarea.py +0 -0
  218. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/textarea.pyi +0 -0
  219. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/time_picker.py +0 -0
  220. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/forms/time_picker.pyi +0 -0
  221. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/__init__.py +0 -0
  222. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/aspect_ratio.py +0 -0
  223. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/aspect_ratio.pyi +0 -0
  224. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/box.py +0 -0
  225. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/box.pyi +0 -0
  226. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/card.py +0 -0
  227. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/card.pyi +0 -0
  228. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/center.py +0 -0
  229. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/center.pyi +0 -0
  230. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/container.py +0 -0
  231. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/container.pyi +0 -0
  232. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/flex.py +0 -0
  233. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/flex.pyi +0 -0
  234. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/grid.py +0 -0
  235. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/grid.pyi +0 -0
  236. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/spacer.py +0 -0
  237. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/spacer.pyi +0 -0
  238. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/stack.py +0 -0
  239. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/stack.pyi +0 -0
  240. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/wrap.py +0 -0
  241. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/layout/wrap.pyi +0 -0
  242. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/media/__init__.py +0 -0
  243. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/media/avatar.py +0 -0
  244. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/media/avatar.pyi +0 -0
  245. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/media/icon.py +0 -0
  246. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/media/icon.pyi +0 -0
  247. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/media/image.py +0 -0
  248. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/media/image.pyi +0 -0
  249. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/__init__.py +0 -0
  250. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/breadcrumb.py +0 -0
  251. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/breadcrumb.pyi +0 -0
  252. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/link.py +0 -0
  253. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/link.pyi +0 -0
  254. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/linkoverlay.py +0 -0
  255. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/linkoverlay.pyi +0 -0
  256. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/stepper.py +0 -0
  257. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/navigation/stepper.pyi +0 -0
  258. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/__init__.py +0 -0
  259. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/alertdialog.py +0 -0
  260. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/alertdialog.pyi +0 -0
  261. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/drawer.py +0 -0
  262. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/drawer.pyi +0 -0
  263. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/menu.py +0 -0
  264. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/menu.pyi +0 -0
  265. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/modal.py +0 -0
  266. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/modal.pyi +0 -0
  267. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/popover.py +0 -0
  268. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/popover.pyi +0 -0
  269. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/tooltip.py +0 -0
  270. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/overlay/tooltip.pyi +0 -0
  271. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/__init__.py +0 -0
  272. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/heading.py +0 -0
  273. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/heading.pyi +0 -0
  274. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/highlight.py +0 -0
  275. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/highlight.pyi +0 -0
  276. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/span.py +0 -0
  277. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/span.pyi +0 -0
  278. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/text.py +0 -0
  279. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/chakra/typography/text.pyi +0 -0
  280. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/__init__.py +0 -0
  281. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/banner.py +0 -0
  282. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/banner.pyi +0 -0
  283. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/client_side_routing.py +0 -0
  284. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/client_side_routing.pyi +0 -0
  285. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/colors.py +0 -0
  286. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/cond.py +0 -0
  287. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/debounce.py +0 -0
  288. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/debounce.pyi +0 -0
  289. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/foreach.py +0 -0
  290. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/html.py +0 -0
  291. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/html.pyi +0 -0
  292. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/layout/__init__.py +0 -0
  293. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/match.py +0 -0
  294. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/core/responsive.py +0 -0
  295. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/datadisplay/__init__.py +0 -0
  296. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/datadisplay/code.py +0 -0
  297. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/datadisplay/code.pyi +0 -0
  298. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/datadisplay/dataeditor.py +0 -0
  299. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  300. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/__init__.py +0 -0
  301. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/constants/__init__.py +0 -0
  302. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/constants/html.py +0 -0
  303. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/constants/react.py +0 -0
  304. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/constants/reflex.py +0 -0
  305. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/element.py +0 -0
  306. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/element.pyi +0 -0
  307. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/__init__.py +0 -0
  308. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/base.py +0 -0
  309. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/base.pyi +0 -0
  310. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/forms.pyi +0 -0
  311. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/inline.py +0 -0
  312. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/inline.pyi +0 -0
  313. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/media.py +0 -0
  314. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/media.pyi +0 -0
  315. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/metadata.py +0 -0
  316. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/metadata.pyi +0 -0
  317. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/other.py +0 -0
  318. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/other.pyi +0 -0
  319. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/scripts.py +0 -0
  320. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/scripts.pyi +0 -0
  321. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/sectioning.py +0 -0
  322. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/sectioning.pyi +0 -0
  323. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/tables.py +0 -0
  324. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/tables.pyi +0 -0
  325. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/typography.py +0 -0
  326. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/el/elements/typography.pyi +0 -0
  327. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/gridjs/__init__.py +0 -0
  328. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/gridjs/datatable.py +0 -0
  329. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/gridjs/datatable.pyi +0 -0
  330. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/literals.py +0 -0
  331. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/lucide/__init__.py +0 -0
  332. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/lucide/icon.py +0 -0
  333. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/lucide/icon.pyi +0 -0
  334. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/markdown/__init__.py +0 -0
  335. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/markdown/markdown.pyi +0 -0
  336. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/media/__init__.py +0 -0
  337. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/media/icon.py +0 -0
  338. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/moment/__init__.py +0 -0
  339. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/moment/moment.py +0 -0
  340. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/moment/moment.pyi +0 -0
  341. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/__init__.py +0 -0
  342. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/base.py +0 -0
  343. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/base.pyi +0 -0
  344. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/image.py +0 -0
  345. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/image.pyi +0 -0
  346. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/link.py +0 -0
  347. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/link.pyi +0 -0
  348. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/video.py +0 -0
  349. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/next/video.pyi +0 -0
  350. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/plotly/__init__.py +0 -0
  351. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/plotly/plotly.py +0 -0
  352. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/plotly/plotly.pyi +0 -0
  353. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/__init__.py +0 -0
  354. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/__init__.py +0 -0
  355. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/accordion.py +0 -0
  356. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/accordion.pyi +0 -0
  357. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/base.py +0 -0
  358. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/base.pyi +0 -0
  359. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/drawer.py +0 -0
  360. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/drawer.pyi +0 -0
  361. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/form.py +0 -0
  362. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/form.pyi +0 -0
  363. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/progress.py +0 -0
  364. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/progress.pyi +0 -0
  365. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/slider.py +0 -0
  366. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/primitives/slider.pyi +0 -0
  367. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/__init__.py +0 -0
  368. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/base.py +0 -0
  369. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/base.pyi +0 -0
  370. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/color_mode.py +0 -0
  371. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/color_mode.pyi +0 -0
  372. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/__init__.py +0 -0
  373. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  374. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  375. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/alertdialog.pyi +0 -0
  376. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  377. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  378. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/aspectratio.pyi +0 -0
  379. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/avatar.py +0 -0
  380. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  381. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/badge.py +0 -0
  382. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/badge.pyi +0 -0
  383. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/button.py +0 -0
  384. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/button.pyi +0 -0
  385. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/callout.py +0 -0
  386. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/callout.pyi +0 -0
  387. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/card.py +0 -0
  388. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/card.pyi +0 -0
  389. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/checkbox.py +0 -0
  390. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  391. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/context_menu.py +0 -0
  392. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  393. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/contextmenu.pyi +0 -0
  394. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/dialog.py +0 -0
  395. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  396. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  397. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  398. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/dropdownmenu.pyi +0 -0
  399. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/hover_card.py +0 -0
  400. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  401. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/hovercard.pyi +0 -0
  402. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/icon_button.py +0 -0
  403. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  404. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/iconbutton.pyi +0 -0
  405. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/inset.py +0 -0
  406. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/inset.pyi +0 -0
  407. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/popover.py +0 -0
  408. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/popover.pyi +0 -0
  409. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  410. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/radiogroup.pyi +0 -0
  411. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  412. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  413. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/scrollarea.pyi +0 -0
  414. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/separator.py +0 -0
  415. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/separator.pyi +0 -0
  416. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/slider.py +0 -0
  417. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/slider.pyi +0 -0
  418. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/switch.py +0 -0
  419. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/switch.pyi +0 -0
  420. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/table.py +0 -0
  421. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/table.pyi +0 -0
  422. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/tabs.py +0 -0
  423. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  424. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/text_area.py +0 -0
  425. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  426. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/text_field.py +0 -0
  427. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  428. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/textfield.pyi +0 -0
  429. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/tooltip.py +0 -0
  430. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  431. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/__init__.py +0 -0
  432. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/base.py +0 -0
  433. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/base.pyi +0 -0
  434. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/box.py +0 -0
  435. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/box.pyi +0 -0
  436. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/center.py +0 -0
  437. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/center.pyi +0 -0
  438. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/container.py +0 -0
  439. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/container.pyi +0 -0
  440. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/flex.py +0 -0
  441. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  442. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/grid.py +0 -0
  443. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  444. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/section.py +0 -0
  445. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/section.pyi +0 -0
  446. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/spacer.py +0 -0
  447. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  448. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/stack.py +0 -0
  449. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  450. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/__init__.py +0 -0
  451. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/base.py +0 -0
  452. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  453. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  454. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/code.py +0 -0
  455. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/code.pyi +0 -0
  456. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/em.pyi +0 -0
  457. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/heading.py +0 -0
  458. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  459. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/kbd.pyi +0 -0
  460. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/link.py +0 -0
  461. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/link.pyi +0 -0
  462. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/quote.pyi +0 -0
  463. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/strong.pyi +0 -0
  464. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/text.py +0 -0
  465. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/radix/themes/typography/text.pyi +0 -0
  466. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/react_player/__init__.py +0 -0
  467. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/react_player/audio.py +0 -0
  468. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/react_player/audio.pyi +0 -0
  469. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/react_player/react_player.py +0 -0
  470. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/react_player/react_player.pyi +0 -0
  471. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/react_player/video.py +0 -0
  472. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/react_player/video.pyi +0 -0
  473. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/__init__.py +0 -0
  474. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/cartesian.py +0 -0
  475. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/cartesian.pyi +0 -0
  476. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/charts.py +0 -0
  477. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/charts.pyi +0 -0
  478. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/general.py +0 -0
  479. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/general.pyi +0 -0
  480. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/polar.py +0 -0
  481. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/polar.pyi +0 -0
  482. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/recharts.py +0 -0
  483. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/recharts/recharts.pyi +0 -0
  484. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/suneditor/__init__.py +0 -0
  485. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/suneditor/editor.py +0 -0
  486. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/suneditor/editor.pyi +0 -0
  487. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/tags/__init__.py +0 -0
  488. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/tags/cond_tag.py +0 -0
  489. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/tags/iter_tag.py +0 -0
  490. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/tags/match_tag.py +0 -0
  491. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/tags/tag.py +0 -0
  492. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/components/tags/tagless.py +0 -0
  493. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/config.py +0 -0
  494. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/config.pyi +0 -0
  495. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/__init__.py +0 -0
  496. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/base.py +0 -0
  497. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/colors.py +0 -0
  498. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/compiler.py +0 -0
  499. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/config.py +0 -0
  500. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/custom_components.py +0 -0
  501. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/event.py +0 -0
  502. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/constants/style.py +0 -0
  503. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/custom_components/__init__.py +0 -0
  504. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/custom_components/custom_components.py +0 -0
  505. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/middleware/__init__.py +0 -0
  506. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/middleware/hydrate_middleware.py +0 -0
  507. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/middleware/middleware.py +0 -0
  508. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/page.py +0 -0
  509. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/page.pyi +0 -0
  510. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/reflex.py +0 -0
  511. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/route.py +0 -0
  512. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/style.py +0 -0
  513. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/__init__.py +0 -0
  514. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/build.py +0 -0
  515. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/console.py +0 -0
  516. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/exceptions.py +0 -0
  517. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/export.py +0 -0
  518. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/imports.py +0 -0
  519. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/path_ops.py +0 -0
  520. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/serializers.py +0 -0
  521. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/types.py +0 -0
  522. {reflex-0.4.4a1 → reflex-0.4.5}/reflex/utils/watch.py +0 -0
  523. {reflex-0.4.4a1 → 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.4a1
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.4a1"
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
@@ -453,24 +456,38 @@ class App(Base):
453
456
  # Generate the component if it is a callable.
454
457
  component = self._generate_component(component)
455
458
 
459
+ # Ensure state is enabled if this page uses state.
456
460
  if self.state is None:
457
- for var in component._get_vars(include_children=True):
458
- if not var._var_data:
459
- continue
460
- if not var._var_data.state:
461
- continue
461
+ if on_load or component._has_event_triggers():
462
462
  self.enable_state()
463
- break
463
+ else:
464
+ for var in component._get_vars(include_children=True):
465
+ if not var._var_data:
466
+ continue
467
+ if not var._var_data.state:
468
+ continue
469
+ self.enable_state()
470
+ break
464
471
 
465
472
  component = OverlayFragment.create(component)
466
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
+
467
487
  # Add meta information to the component.
468
488
  compiler_utils.add_meta(
469
489
  component,
470
- title=title,
471
- image=image,
472
- description=description,
473
- meta=meta,
490
+ **meta_args,
474
491
  )
475
492
 
476
493
  # Add script tags if given
@@ -655,7 +672,7 @@ class App(Base):
655
672
  Whether the app should be compiled.
656
673
  """
657
674
  # Check the environment variable.
658
- if os.environ.get(constants.SKIP_COMPILE_ENV_VAR) == "yes":
675
+ if should_skip_compile():
659
676
  return False
660
677
 
661
678
  # Check the nocompile file.
@@ -702,16 +719,25 @@ class App(Base):
702
719
  )
703
720
  return
704
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
+
705
735
  def compile_(self):
706
736
  """Compile the app and output it to the pages folder.
707
737
 
708
738
  Raises:
709
739
  RuntimeError: When any page uses state, but no rx.State subclass is defined.
710
740
  """
711
- # add the pages before the compile check so App know onload methods
712
- for render, kwargs in DECORATED_PAGES:
713
- self.add_page(render, **kwargs)
714
-
715
741
  # Render a default 404 page if the user didn't supply one
716
742
  if constants.Page404.SLUG not in self.pages:
717
743
  self.add_custom_404_page()
@@ -731,6 +757,17 @@ class App(Base):
731
757
  TimeElapsedColumn(),
732
758
  )
733
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
+
734
771
  # Get the env mode.
735
772
  config = get_config()
736
773
 
@@ -746,6 +783,8 @@ class App(Base):
746
783
  # If a theme component was provided, wrap the app with it
747
784
  app_wrappers[(20, "Theme")] = self.theme
748
785
 
786
+ progress.advance(task)
787
+
749
788
  # Fix up the style.
750
789
  self.style = evaluate_style_namespaces(self.style)
751
790
 
@@ -753,133 +792,156 @@ class App(Base):
753
792
  all_imports = {}
754
793
  custom_components = set()
755
794
 
756
- # Compile the pages in parallel.
757
- with progress, concurrent.futures.ThreadPoolExecutor() as thread_pool:
758
- fixed_pages = 7
759
- 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)
760
798
 
761
- def mark_complete(_=None):
762
- progress.advance(task)
799
+ component.apply_theme(self.theme)
763
800
 
764
- for _route, component in self.pages.items():
765
- # Merge the component style with the app style.
766
- component.add_style(self.style)
801
+ # Add component.get_imports() to all_imports.
802
+ all_imports.update(component.get_imports())
767
803
 
768
- component.apply_theme(self.theme)
804
+ # Add the app wrappers from this component.
805
+ app_wrappers.update(component.get_app_wrap_components())
769
806
 
770
- # Add component.get_imports() to all_imports.
771
- all_imports.update(component.get_imports())
807
+ # Add the custom components from the page to the set.
808
+ custom_components |= component.get_custom_components()
772
809
 
773
- # Add the app wrappers from this component.
774
- app_wrappers.update(component.get_app_wrap_components())
810
+ progress.advance(task)
775
811
 
776
- # Add the custom components from the page to the set.
777
- 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())
778
818
 
779
- # Perform auto-memoization of stateful components.
780
- (
781
- stateful_components_path,
782
- stateful_components_code,
783
- page_components,
784
- ) = compiler.compile_stateful_components(self.pages.values())
819
+ progress.advance(task)
785
820
 
786
- # Catch "static" apps (that do not define a rx.State subclass) which are trying to access rx.State.
787
- if (
788
- code_uses_state_contexts(stateful_components_code)
789
- and self.state is None
790
- ):
791
- raise RuntimeError(
792
- "To access rx.State in frontend components, at least one "
793
- "subclass of rx.State must be defined in the app."
794
- )
795
- 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))
796
828
 
797
- 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
+ )
798
842
 
799
- def submit_work(fn, *args, **kwargs):
800
- """Submit work to the thread pool and add a callback to mark the task as complete.
843
+ app_root = self._app_root(app_wrappers=app_wrappers)
801
844
 
802
- The Future will be added to the `result_futures` list.
845
+ progress.advance(task)
803
846
 
804
- Args:
805
- fn: The function to submit.
806
- *args: The args to submit.
807
- **kwargs: The kwargs to submit.
808
- """
809
- f = thread_pool.submit(fn, *args, **kwargs)
810
- f.add_done_callback(mark_complete)
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
+ )
855
+
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
+ )
875
+
876
+ with executor:
877
+ result_futures = []
878
+ custom_components_future = None
879
+
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)
811
886
  result_futures.append(f)
812
887
 
813
888
  # Compile all page components.
814
- for route, component in zip(self.pages, page_components):
815
- submit_work(
816
- compiler.compile_page,
817
- route,
818
- component,
819
- self.state,
820
- )
889
+ for route in self.pages:
890
+ _submit_work(ExecutorSafeFunctions.compile_page, route)
821
891
 
822
892
  # Compile the app wrapper.
823
- app_root = self._app_root(app_wrappers=app_wrappers)
824
- submit_work(compiler.compile_app, app_root)
893
+ _submit_work(ExecutorSafeFunctions.compile_app)
825
894
 
826
895
  # Compile the custom components.
827
- 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)
828
900
 
829
901
  # Compile the root stylesheet with base styles.
830
- submit_work(compiler.compile_root_stylesheet, self.stylesheets)
831
-
832
- # Compile the root document.
833
- submit_work(
834
- compiler.compile_document_root,
835
- self.head_components,
836
- html_lang=self.html_lang,
837
- html_custom_attrs=self.html_custom_attrs,
838
- )
902
+ _submit_work(compiler.compile_root_stylesheet, self.stylesheets)
839
903
 
840
904
  # Compile the theme.
841
- submit_work(compiler.compile_theme, style=self.style)
842
-
843
- # Compile the contexts.
844
- submit_work(compiler.compile_contexts, self.state, self.theme)
905
+ _submit_work(ExecutorSafeFunctions.compile_theme)
845
906
 
846
907
  # Compile the Tailwind config.
847
908
  if config.tailwind is not None:
848
909
  config.tailwind["content"] = config.tailwind.get(
849
910
  "content", constants.Tailwind.CONTENT
850
911
  )
851
- submit_work(compiler.compile_tailwind, config.tailwind)
912
+ _submit_work(compiler.compile_tailwind, config.tailwind)
852
913
  else:
853
- submit_work(compiler.remove_tailwind_from_postcss)
854
-
855
- # Get imports from AppWrap components.
856
- all_imports.update(app_root.get_imports())
857
-
858
- # Iterate through all the custom components and add their imports to the all_imports.
859
- for component in custom_components:
860
- all_imports.update(component.get_imports())
914
+ _submit_work(compiler.remove_tailwind_from_postcss)
861
915
 
862
916
  # Wait for all compilation tasks to complete.
863
917
  for future in concurrent.futures.as_completed(result_futures):
864
918
  compile_results.append(future.result())
865
919
 
866
- # Empty the .web pages directory.
867
- 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())
868
931
 
869
- # Avoid flickering when installing frontend packages
870
- progress.stop()
932
+ progress.advance(task)
871
933
 
872
- # Install frontend packages.
873
- self.get_frontend_packages(all_imports)
934
+ # Empty the .web pages directory.
935
+ compiler.purge_web_pages_dir()
874
936
 
875
- # Write the pages at the end to trigger the NextJS hot reload only once.
876
- write_page_futures = []
877
- for output_path, code in compile_results:
878
- write_page_futures.append(
879
- thread_pool.submit(compiler_utils.write_page, output_path, code)
880
- )
881
- for future in concurrent.futures.as_completed(write_page_futures):
882
- 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)
883
945
 
884
946
  @contextlib.asynccontextmanager
885
947
  async def modify_state(self, token: str) -> AsyncIterator[BaseState]:
@@ -1188,7 +1250,10 @@ class EventNamespace(AsyncNamespace):
1188
1250
  }
1189
1251
 
1190
1252
  # Get the client IP
1191
- 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")
1192
1257
 
1193
1258
  # Process the events.
1194
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)