reflex 0.4.8a1__tar.gz → 0.4.9__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 (511) hide show
  1. {reflex-0.4.8a1 → reflex-0.4.9}/PKG-INFO +1 -1
  2. {reflex-0.4.8a1 → reflex-0.4.9}/pyproject.toml +1 -1
  3. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/app.py +3 -0
  4. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/component.py +10 -3
  5. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/debounce.py +4 -1
  6. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/installer.py +1 -0
  7. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/experimental/__init__.py +2 -0
  8. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/experimental/hooks.py +19 -1
  9. reflex-0.4.9/reflex/experimental/layout.py +223 -0
  10. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/testing.py +23 -6
  11. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/prerequisites.py +11 -7
  12. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/processes.py +51 -30
  13. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/pyi_generator.py +6 -1
  14. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/serializers.py +14 -0
  15. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/vars.py +1 -1
  16. reflex-0.4.8a1/reflex/components/radix/themes/components/alertdialog.pyi +0 -1128
  17. reflex-0.4.8a1/reflex/components/radix/themes/components/aspectratio.pyi +0 -162
  18. reflex-0.4.8a1/reflex/components/radix/themes/components/contextmenu.pyi +0 -1249
  19. reflex-0.4.8a1/reflex/components/radix/themes/components/dropdownmenu.pyi +0 -1350
  20. reflex-0.4.8a1/reflex/components/radix/themes/components/hovercard.pyi +0 -700
  21. reflex-0.4.8a1/reflex/components/radix/themes/components/iconbutton.pyi +0 -284
  22. reflex-0.4.8a1/reflex/components/radix/themes/components/radiogroup.pyi +0 -701
  23. reflex-0.4.8a1/reflex/components/radix/themes/components/scrollarea.pyi +0 -176
  24. reflex-0.4.8a1/reflex/components/radix/themes/components/textfield.pyi +0 -1092
  25. reflex-0.4.8a1/reflex/components/radix/themes/typography/em.pyi +0 -213
  26. reflex-0.4.8a1/reflex/components/radix/themes/typography/kbd.pyi +0 -222
  27. reflex-0.4.8a1/reflex/components/radix/themes/typography/quote.pyi +0 -215
  28. reflex-0.4.8a1/reflex/components/radix/themes/typography/strong.pyi +0 -213
  29. {reflex-0.4.8a1 → reflex-0.4.9}/LICENSE +0 -0
  30. {reflex-0.4.8a1 → reflex-0.4.9}/README.md +0 -0
  31. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  32. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  33. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/blank/code/blank.py +0 -0
  34. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/.gitignore +0 -0
  35. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/assets/favicon.ico +0 -0
  36. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/assets/github.svg +0 -0
  37. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/assets/icon.svg +0 -0
  38. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/assets/logo.svg +0 -0
  39. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/assets/paneleft.svg +0 -0
  40. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/__init__.py +0 -0
  41. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/demo.py +0 -0
  42. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/pages/__init__.py +0 -0
  43. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/pages/chatapp.py +0 -0
  44. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/pages/datatable.py +0 -0
  45. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/pages/forms.py +0 -0
  46. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/pages/graphing.py +0 -0
  47. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/pages/home.py +0 -0
  48. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/sidebar.py +0 -0
  49. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/state.py +0 -0
  50. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/states/form_state.py +0 -0
  51. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/states/pie_state.py +0 -0
  52. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/styles.py +0 -0
  53. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/__init__.py +0 -0
  54. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/components/__init__.py +0 -0
  55. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/components/chat.py +0 -0
  56. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/components/loading_icon.py +0 -0
  57. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/components/modal.py +0 -0
  58. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/components/navbar.py +0 -0
  59. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/components/sidebar.py +0 -0
  60. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/state.py +0 -0
  61. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/apps/demo/code/webui/styles.py +0 -0
  62. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
  63. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  64. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  65. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  66. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
  67. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  68. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  69. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
  70. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  71. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  72. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  73. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  74. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  75. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
  76. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  77. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  78. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  79. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/tailwind.config.js.jinja2 +0 -0
  80. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  81. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  82. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/.gitignore +0 -0
  83. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/components/reflex/chakra_color_mode_provider.js +0 -0
  84. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  85. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/jsconfig.json +0 -0
  86. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/next.config.js +0 -0
  87. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/postcss.config.js +0 -0
  88. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/styles/tailwind.css +0 -0
  89. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  90. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  91. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/utils/helpers/range.js +0 -0
  92. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/.templates/web/utils/state.js +0 -0
  93. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/__init__.py +0 -0
  94. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/__init__.pyi +0 -0
  95. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/__main__.py +0 -0
  96. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/admin.py +0 -0
  97. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/app.pyi +0 -0
  98. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/app_module_for_backend.py +0 -0
  99. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/base.py +0 -0
  100. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/compiler/__init__.py +0 -0
  101. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/compiler/compiler.py +0 -0
  102. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/compiler/templates.py +0 -0
  103. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/compiler/utils.py +0 -0
  104. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/__init__.py +0 -0
  105. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/__init__.py +0 -0
  106. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/app_wrap.py +0 -0
  107. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/app_wrap.pyi +0 -0
  108. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/bare.py +0 -0
  109. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/body.py +0 -0
  110. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/body.pyi +0 -0
  111. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/document.py +0 -0
  112. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/document.pyi +0 -0
  113. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/fragment.py +0 -0
  114. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/fragment.pyi +0 -0
  115. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/head.py +0 -0
  116. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/head.pyi +0 -0
  117. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/link.py +0 -0
  118. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/link.pyi +0 -0
  119. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/meta.py +0 -0
  120. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/meta.pyi +0 -0
  121. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/script.py +0 -0
  122. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/base/script.pyi +0 -0
  123. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/__init__.py +0 -0
  124. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/base.py +0 -0
  125. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/base.pyi +0 -0
  126. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/__init__.py +0 -0
  127. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/badge.py +0 -0
  128. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/badge.pyi +0 -0
  129. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/code.py +0 -0
  130. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/code.pyi +0 -0
  131. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/divider.py +0 -0
  132. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/divider.pyi +0 -0
  133. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/keyboard_key.py +0 -0
  134. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/keyboard_key.pyi +0 -0
  135. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/list.py +0 -0
  136. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/list.pyi +0 -0
  137. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/stat.py +0 -0
  138. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/stat.pyi +0 -0
  139. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/table.py +0 -0
  140. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/table.pyi +0 -0
  141. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/tag.py +0 -0
  142. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/datadisplay/tag.pyi +0 -0
  143. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/__init__.py +0 -0
  144. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/accordion.py +0 -0
  145. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/accordion.pyi +0 -0
  146. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/tabs.py +0 -0
  147. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/tabs.pyi +0 -0
  148. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/transition.py +0 -0
  149. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/transition.pyi +0 -0
  150. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/visuallyhidden.py +0 -0
  151. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/disclosure/visuallyhidden.pyi +0 -0
  152. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/__init__.py +0 -0
  153. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/alert.py +0 -0
  154. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/alert.pyi +0 -0
  155. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/circularprogress.py +0 -0
  156. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/circularprogress.pyi +0 -0
  157. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/progress.py +0 -0
  158. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/progress.pyi +0 -0
  159. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/skeleton.py +0 -0
  160. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/skeleton.pyi +0 -0
  161. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/spinner.py +0 -0
  162. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/feedback/spinner.pyi +0 -0
  163. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/__init__.py +0 -0
  164. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/button.py +0 -0
  165. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/button.pyi +0 -0
  166. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/checkbox.py +0 -0
  167. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/checkbox.pyi +0 -0
  168. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/colormodeswitch.py +0 -0
  169. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/colormodeswitch.pyi +0 -0
  170. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/date_picker.py +0 -0
  171. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/date_picker.pyi +0 -0
  172. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/date_time_picker.py +0 -0
  173. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/date_time_picker.pyi +0 -0
  174. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/editable.py +0 -0
  175. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/editable.pyi +0 -0
  176. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/email.py +0 -0
  177. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/email.pyi +0 -0
  178. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/form.py +0 -0
  179. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/form.pyi +0 -0
  180. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/iconbutton.py +0 -0
  181. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/iconbutton.pyi +0 -0
  182. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/input.py +0 -0
  183. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/input.pyi +0 -0
  184. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/multiselect.py +0 -0
  185. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/numberinput.py +0 -0
  186. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/numberinput.pyi +0 -0
  187. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/password.py +0 -0
  188. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/password.pyi +0 -0
  189. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/pininput.py +0 -0
  190. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/pininput.pyi +0 -0
  191. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/radio.py +0 -0
  192. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/radio.pyi +0 -0
  193. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/rangeslider.py +0 -0
  194. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/rangeslider.pyi +0 -0
  195. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/select.py +0 -0
  196. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/select.pyi +0 -0
  197. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/slider.py +0 -0
  198. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/slider.pyi +0 -0
  199. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/switch.py +0 -0
  200. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/switch.pyi +0 -0
  201. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/textarea.py +0 -0
  202. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/textarea.pyi +0 -0
  203. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/time_picker.py +0 -0
  204. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/forms/time_picker.pyi +0 -0
  205. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/__init__.py +0 -0
  206. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/aspect_ratio.py +0 -0
  207. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/aspect_ratio.pyi +0 -0
  208. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/box.py +0 -0
  209. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/box.pyi +0 -0
  210. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/card.py +0 -0
  211. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/card.pyi +0 -0
  212. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/center.py +0 -0
  213. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/center.pyi +0 -0
  214. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/container.py +0 -0
  215. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/container.pyi +0 -0
  216. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/flex.py +0 -0
  217. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/flex.pyi +0 -0
  218. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/grid.py +0 -0
  219. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/grid.pyi +0 -0
  220. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/spacer.py +0 -0
  221. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/spacer.pyi +0 -0
  222. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/stack.py +0 -0
  223. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/stack.pyi +0 -0
  224. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/wrap.py +0 -0
  225. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/layout/wrap.pyi +0 -0
  226. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/media/__init__.py +0 -0
  227. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/media/avatar.py +0 -0
  228. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/media/avatar.pyi +0 -0
  229. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/media/icon.py +0 -0
  230. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/media/icon.pyi +0 -0
  231. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/media/image.py +0 -0
  232. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/media/image.pyi +0 -0
  233. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/__init__.py +0 -0
  234. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/breadcrumb.py +0 -0
  235. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/breadcrumb.pyi +0 -0
  236. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/link.py +0 -0
  237. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/link.pyi +0 -0
  238. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/linkoverlay.py +0 -0
  239. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/linkoverlay.pyi +0 -0
  240. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/stepper.py +0 -0
  241. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/navigation/stepper.pyi +0 -0
  242. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/__init__.py +0 -0
  243. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/alertdialog.py +0 -0
  244. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/alertdialog.pyi +0 -0
  245. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/drawer.py +0 -0
  246. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/drawer.pyi +0 -0
  247. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/menu.py +0 -0
  248. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/menu.pyi +0 -0
  249. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/modal.py +0 -0
  250. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/modal.pyi +0 -0
  251. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/popover.py +0 -0
  252. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/popover.pyi +0 -0
  253. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/tooltip.py +0 -0
  254. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/overlay/tooltip.pyi +0 -0
  255. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/__init__.py +0 -0
  256. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/heading.py +0 -0
  257. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/heading.pyi +0 -0
  258. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/highlight.py +0 -0
  259. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/highlight.pyi +0 -0
  260. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/span.py +0 -0
  261. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/span.pyi +0 -0
  262. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/text.py +0 -0
  263. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/chakra/typography/text.pyi +0 -0
  264. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/__init__.py +0 -0
  265. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/banner.py +0 -0
  266. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/banner.pyi +0 -0
  267. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/client_side_routing.py +0 -0
  268. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/client_side_routing.pyi +0 -0
  269. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/colors.py +0 -0
  270. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/cond.py +0 -0
  271. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/debounce.pyi +0 -0
  272. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/foreach.py +0 -0
  273. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/html.py +0 -0
  274. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/html.pyi +0 -0
  275. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/layout/__init__.py +0 -0
  276. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/match.py +0 -0
  277. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/responsive.py +0 -0
  278. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/upload.py +0 -0
  279. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/core/upload.pyi +0 -0
  280. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/datadisplay/__init__.py +0 -0
  281. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/datadisplay/code.py +0 -0
  282. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/datadisplay/code.pyi +0 -0
  283. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/datadisplay/dataeditor.py +0 -0
  284. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  285. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/datadisplay/logo.py +0 -0
  286. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/__init__.py +0 -0
  287. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/constants/__init__.py +0 -0
  288. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/constants/html.py +0 -0
  289. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/constants/react.py +0 -0
  290. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/constants/reflex.py +0 -0
  291. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/element.py +0 -0
  292. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/element.pyi +0 -0
  293. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/__init__.py +0 -0
  294. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/base.py +0 -0
  295. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/base.pyi +0 -0
  296. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/forms.py +0 -0
  297. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/forms.pyi +0 -0
  298. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/inline.py +0 -0
  299. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/inline.pyi +0 -0
  300. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/media.py +0 -0
  301. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/media.pyi +0 -0
  302. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/metadata.py +0 -0
  303. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/metadata.pyi +0 -0
  304. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/other.py +0 -0
  305. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/other.pyi +0 -0
  306. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/scripts.py +0 -0
  307. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/scripts.pyi +0 -0
  308. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/sectioning.py +0 -0
  309. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/sectioning.pyi +0 -0
  310. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/tables.py +0 -0
  311. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/tables.pyi +0 -0
  312. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/typography.py +0 -0
  313. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/el/elements/typography.pyi +0 -0
  314. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/gridjs/__init__.py +0 -0
  315. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/gridjs/datatable.py +0 -0
  316. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/gridjs/datatable.pyi +0 -0
  317. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/literals.py +0 -0
  318. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/lucide/__init__.py +0 -0
  319. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/lucide/icon.py +0 -0
  320. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/lucide/icon.pyi +0 -0
  321. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/markdown/__init__.py +0 -0
  322. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/markdown/markdown.py +0 -0
  323. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/markdown/markdown.pyi +0 -0
  324. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/media/__init__.py +0 -0
  325. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/media/icon.py +0 -0
  326. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/moment/__init__.py +0 -0
  327. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/moment/moment.py +0 -0
  328. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/moment/moment.pyi +0 -0
  329. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/__init__.py +0 -0
  330. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/base.py +0 -0
  331. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/base.pyi +0 -0
  332. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/image.py +0 -0
  333. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/image.pyi +0 -0
  334. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/link.py +0 -0
  335. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/link.pyi +0 -0
  336. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/video.py +0 -0
  337. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/next/video.pyi +0 -0
  338. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/plotly/__init__.py +0 -0
  339. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/plotly/plotly.py +0 -0
  340. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/plotly/plotly.pyi +0 -0
  341. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/__init__.py +0 -0
  342. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/__init__.py +0 -0
  343. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/accordion.py +0 -0
  344. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/accordion.pyi +0 -0
  345. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/base.py +0 -0
  346. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/base.pyi +0 -0
  347. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/drawer.py +0 -0
  348. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/drawer.pyi +0 -0
  349. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/form.py +0 -0
  350. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/form.pyi +0 -0
  351. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/progress.py +0 -0
  352. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/progress.pyi +0 -0
  353. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/slider.py +0 -0
  354. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/primitives/slider.pyi +0 -0
  355. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/__init__.py +0 -0
  356. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/base.py +0 -0
  357. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/base.pyi +0 -0
  358. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/color_mode.py +0 -0
  359. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/color_mode.pyi +0 -0
  360. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/__init__.py +0 -0
  361. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  362. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  363. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  364. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  365. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/avatar.py +0 -0
  366. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  367. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/badge.py +0 -0
  368. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/badge.pyi +0 -0
  369. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/button.py +0 -0
  370. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/button.pyi +0 -0
  371. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/callout.py +0 -0
  372. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/callout.pyi +0 -0
  373. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/card.py +0 -0
  374. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/card.pyi +0 -0
  375. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/checkbox.py +0 -0
  376. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  377. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/context_menu.py +0 -0
  378. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  379. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/dialog.py +0 -0
  380. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  381. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  382. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  383. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/hover_card.py +0 -0
  384. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  385. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/icon_button.py +0 -0
  386. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  387. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/inset.py +0 -0
  388. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/inset.pyi +0 -0
  389. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/popover.py +0 -0
  390. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/popover.pyi +0 -0
  391. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/radio_group.py +0 -0
  392. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  393. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  394. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  395. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/select.py +0 -0
  396. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/select.pyi +0 -0
  397. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/separator.py +0 -0
  398. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/separator.pyi +0 -0
  399. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/slider.py +0 -0
  400. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/slider.pyi +0 -0
  401. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/switch.py +0 -0
  402. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/switch.pyi +0 -0
  403. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/table.py +0 -0
  404. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/table.pyi +0 -0
  405. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/tabs.py +0 -0
  406. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  407. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/text_area.py +0 -0
  408. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  409. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/text_field.py +0 -0
  410. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  411. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/tooltip.py +0 -0
  412. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  413. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/__init__.py +0 -0
  414. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/base.py +0 -0
  415. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/base.pyi +0 -0
  416. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/box.py +0 -0
  417. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/box.pyi +0 -0
  418. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/center.py +0 -0
  419. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/center.pyi +0 -0
  420. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/container.py +0 -0
  421. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/container.pyi +0 -0
  422. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/flex.py +0 -0
  423. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  424. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/grid.py +0 -0
  425. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  426. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/list.py +0 -0
  427. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/list.pyi +0 -0
  428. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/section.py +0 -0
  429. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/section.pyi +0 -0
  430. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/spacer.py +0 -0
  431. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  432. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/stack.py +0 -0
  433. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  434. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/__init__.py +0 -0
  435. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/base.py +0 -0
  436. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  437. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  438. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/code.py +0 -0
  439. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/code.pyi +0 -0
  440. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/heading.py +0 -0
  441. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  442. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/link.py +0 -0
  443. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/link.pyi +0 -0
  444. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/text.py +0 -0
  445. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/radix/themes/typography/text.pyi +0 -0
  446. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/react_player/__init__.py +0 -0
  447. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/react_player/audio.py +0 -0
  448. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/react_player/audio.pyi +0 -0
  449. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/react_player/react_player.py +0 -0
  450. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/react_player/react_player.pyi +0 -0
  451. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/react_player/video.py +0 -0
  452. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/react_player/video.pyi +0 -0
  453. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/__init__.py +0 -0
  454. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/cartesian.py +0 -0
  455. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/cartesian.pyi +0 -0
  456. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/charts.py +0 -0
  457. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/charts.pyi +0 -0
  458. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/general.py +0 -0
  459. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/general.pyi +0 -0
  460. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/polar.py +0 -0
  461. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/polar.pyi +0 -0
  462. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/recharts.py +0 -0
  463. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/recharts/recharts.pyi +0 -0
  464. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/suneditor/__init__.py +0 -0
  465. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/suneditor/editor.py +0 -0
  466. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/suneditor/editor.pyi +0 -0
  467. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/tags/__init__.py +0 -0
  468. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/tags/cond_tag.py +0 -0
  469. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/tags/iter_tag.py +0 -0
  470. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/tags/match_tag.py +0 -0
  471. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/tags/tag.py +0 -0
  472. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/components/tags/tagless.py +0 -0
  473. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/config.py +0 -0
  474. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/config.pyi +0 -0
  475. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/__init__.py +0 -0
  476. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/base.py +0 -0
  477. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/base.pyi +0 -0
  478. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/colors.py +0 -0
  479. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/compiler.py +0 -0
  480. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/config.py +0 -0
  481. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/custom_components.py +0 -0
  482. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/event.py +0 -0
  483. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/route.py +0 -0
  484. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/constants/style.py +0 -0
  485. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/custom_components/__init__.py +0 -0
  486. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/custom_components/custom_components.py +0 -0
  487. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/event.py +0 -0
  488. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/experimental/misc.py +0 -0
  489. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/middleware/__init__.py +0 -0
  490. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/middleware/hydrate_middleware.py +0 -0
  491. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/middleware/middleware.py +0 -0
  492. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/model.py +0 -0
  493. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/page.py +0 -0
  494. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/reflex.py +0 -0
  495. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/route.py +0 -0
  496. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/state.py +0 -0
  497. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/style.py +0 -0
  498. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/__init__.py +0 -0
  499. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/build.py +0 -0
  500. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/compat.py +0 -0
  501. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/console.py +0 -0
  502. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/exceptions.py +0 -0
  503. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/exec.py +0 -0
  504. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/export.py +0 -0
  505. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/format.py +0 -0
  506. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/imports.py +0 -0
  507. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/path_ops.py +0 -0
  508. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/telemetry.py +0 -0
  509. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/types.py +0 -0
  510. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/utils/watch.py +0 -0
  511. {reflex-0.4.8a1 → reflex-0.4.9}/reflex/vars.pyi +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: reflex
3
- Version: 0.4.8a1
3
+ Version: 0.4.9
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.8a1"
3
+ version = "0.4.9"
4
4
  description = "Web apps in pure Python."
5
5
  license = "Apache-2.0"
6
6
  authors = [
@@ -839,6 +839,9 @@ class App(Base):
839
839
  compile_results.append(
840
840
  compiler.compile_contexts(self.state, self.theme),
841
841
  )
842
+ # Fix #2992 by removing the top-level appearance prop
843
+ if self.theme is not None:
844
+ self.theme.appearance = None
842
845
 
843
846
  app_root = self._app_root(app_wrappers=app_wrappers)
844
847
 
@@ -662,9 +662,11 @@ class Component(BaseComponent, ABC):
662
662
  (
663
663
  child
664
664
  if isinstance(child, Component)
665
- else Fragment.create(*child)
666
- if isinstance(child, tuple)
667
- else Bare.create(contents=Var.create(child, _var_is_string=True))
665
+ else (
666
+ Fragment.create(*child)
667
+ if isinstance(child, tuple)
668
+ else Bare.create(contents=Var.create(child, _var_is_string=True))
669
+ )
668
670
  )
669
671
  for child in children
670
672
  ]
@@ -1053,6 +1055,11 @@ class Component(BaseComponent, ABC):
1053
1055
  ImportVar(tag="useEffect"),
1054
1056
  },
1055
1057
  )
1058
+
1059
+ user_hooks = self._get_hooks()
1060
+ if user_hooks is not None and isinstance(user_hooks, Var):
1061
+ _imports = imports.merge_imports(_imports, user_hooks._var_data.imports) # type: ignore
1062
+
1056
1063
  return _imports
1057
1064
 
1058
1065
  def _get_imports(self) -> imports.ImportDict:
@@ -79,7 +79,9 @@ class DebounceInput(Component):
79
79
  for p in cls.get_props()
80
80
  if getattr(child, p, None) is not None
81
81
  }
82
- props_from_child.update(child.event_triggers)
82
+ props[EventTriggers.ON_CHANGE] = child.event_triggers.pop(
83
+ EventTriggers.ON_CHANGE
84
+ )
83
85
  props = {**props_from_child, **props}
84
86
 
85
87
  # Carry all other child props directly via custom_attrs
@@ -117,6 +119,7 @@ class DebounceInput(Component):
117
119
 
118
120
  component = super().create(**props)
119
121
  component._get_style = child._get_style
122
+ component.event_triggers.update(child.event_triggers)
120
123
  return component
121
124
 
122
125
  def get_event_triggers(self) -> dict[str, Any]:
@@ -112,6 +112,7 @@ class PackageJson(SimpleNamespace):
112
112
  "next-themes": "0.2.1",
113
113
  "react": "18.2.0",
114
114
  "react-dom": "18.2.0",
115
+ "react-focus-lock": "2.11.3",
115
116
  "socket.io-client": "4.6.1",
116
117
  "universal-cookie": "4.0.4",
117
118
  }
@@ -4,6 +4,7 @@ from types import SimpleNamespace
4
4
 
5
5
  from ..utils.console import warn
6
6
  from . import hooks as hooks
7
+ from .layout import layout as layout
7
8
  from .misc import run_in_thread as run_in_thread
8
9
 
9
10
  warn(
@@ -12,5 +13,6 @@ warn(
12
13
 
13
14
  _x = SimpleNamespace(
14
15
  hooks=hooks,
16
+ layout=layout,
15
17
  run_in_thread=run_in_thread,
16
18
  )
@@ -12,7 +12,7 @@ def _add_react_import(v: Var | None, tags: str | list):
12
12
  tags = [tags]
13
13
 
14
14
  v._var_data = VarData( # type: ignore
15
- imports={"react": [ImportVar(tag=tag) for tag in tags]},
15
+ imports={"react": [ImportVar(tag=tag, install=False) for tag in tags]},
16
16
  )
17
17
 
18
18
 
@@ -26,6 +26,8 @@ def const(name, value) -> Var | None:
26
26
  Returns:
27
27
  The constant Var.
28
28
  """
29
+ if isinstance(name, list):
30
+ return Var.create(f"const [{', '.join(name)}] = {value}")
29
31
  return Var.create(f"const {name} = {value}")
30
32
 
31
33
 
@@ -73,3 +75,19 @@ def useRef(default) -> Var | None:
73
75
  v = Var.create(f"useRef({default})")
74
76
  _add_react_import(v, "useRef")
75
77
  return v
78
+
79
+
80
+ def useState(var_name, default=None) -> Var | None:
81
+ """Create a useState hook with a variable name and setter name.
82
+
83
+ Args:
84
+ var_name: The name of the variable.
85
+ default: The default value of the variable.
86
+
87
+ Returns:
88
+ A useState hook.
89
+ """
90
+ setter_name = f"set{var_name.capitalize()}"
91
+ v = const([var_name, setter_name], f"useState({default})")
92
+ _add_react_import(v, "useState")
93
+ return v
@@ -0,0 +1,223 @@
1
+ """To experiment with layout component, move them to reflex/components later."""
2
+
3
+ from reflex import color, cond
4
+ from reflex.components.base.fragment import Fragment
5
+ from reflex.components.component import Component, ComponentNamespace, MemoizationLeaf
6
+ from reflex.components.radix.primitives.drawer import DrawerRoot, drawer
7
+ from reflex.components.radix.themes.components.icon_button import IconButton
8
+ from reflex.components.radix.themes.layout import Box, Container, HStack
9
+ from reflex.event import call_script
10
+ from reflex.experimental import hooks
11
+ from reflex.state import ComponentState
12
+ from reflex.vars import Var
13
+
14
+
15
+ class Sidebar(Box, MemoizationLeaf):
16
+ """A component that renders the sidebar."""
17
+
18
+ @classmethod
19
+ def create(cls, *children, **props):
20
+ """Create the sidebar component.
21
+
22
+ Args:
23
+ children: The children components.
24
+ props: The properties of the sidebar.
25
+
26
+ Returns:
27
+ The sidebar component.
28
+ """
29
+ props.setdefault("border_right", f"1px solid {color('accent', 12)}")
30
+ props.setdefault("background_color", color("accent", 1))
31
+ props.setdefault("width", "20vw")
32
+ props.setdefault("height", "100vh")
33
+ props.setdefault("position", "fixed")
34
+
35
+ return super().create(
36
+ Box.create(*children, **props), # sidebar for content
37
+ Box.create(width=props.get("width")), # spacer for layout
38
+ )
39
+
40
+ def _apply_theme(self, theme: Component | None):
41
+ sidebar: Component = self.children[-2] # type: ignore
42
+ spacer: Component = self.children[-1] # type: ignore
43
+ open = self.State.open if self.State else Var.create("open") # type: ignore
44
+ sidebar.style["display"] = spacer.style["display"] = cond(open, "block", "none")
45
+
46
+ def _get_hooks(self) -> Var | None:
47
+ return hooks.useState("open", "true") if not self.State else None
48
+
49
+
50
+ class StatefulSidebar(ComponentState):
51
+ """Bind a state to a sidebar component."""
52
+
53
+ open: bool = True
54
+
55
+ def toggle(self):
56
+ """Toggle the sidebar."""
57
+ self.open = not self.open
58
+
59
+ @classmethod
60
+ def get_component(cls, *children, **props):
61
+ """Get the stateful sidebar component.
62
+
63
+ Args:
64
+ children: The children components.
65
+ props: The properties of the sidebar.
66
+
67
+ Returns:
68
+ The stateful sidebar component.
69
+ """
70
+ return Sidebar.create(*children, **props)
71
+
72
+
73
+ class DrawerSidebar(DrawerRoot):
74
+ """A component that renders a drawer sidebar."""
75
+
76
+ @classmethod
77
+ def create(cls, *children, **props):
78
+ """Create the sidebar component.
79
+
80
+ Args:
81
+ children: The children components.
82
+ props: The properties of the sidebar.
83
+
84
+ Returns:
85
+ The drawer sidebar component.
86
+ """
87
+ direction = props.pop("direction", "left")
88
+ props.setdefault("border_right", f"1px solid {color('accent', 12)}")
89
+ props.setdefault("background_color", color("accent", 1))
90
+ props.setdefault("width", "20vw")
91
+ props.setdefault("height", "100vh")
92
+ return super().create(
93
+ drawer.trigger(
94
+ IconButton.create(
95
+ "arrow-right-from-line",
96
+ background_color="transparent",
97
+ ),
98
+ position="absolute",
99
+ top="15",
100
+ left="15",
101
+ ),
102
+ drawer.portal(
103
+ drawer.content(
104
+ *children,
105
+ **props,
106
+ )
107
+ ),
108
+ direction=direction,
109
+ )
110
+
111
+
112
+ sidebar_trigger_style = {
113
+ "position": "fixed",
114
+ "z_index": "15",
115
+ "color": color("accent", 12),
116
+ "background_color": "transparent",
117
+ "padding": "0",
118
+ }
119
+
120
+
121
+ class SidebarTrigger(Fragment):
122
+ """A component that renders the sidebar trigger."""
123
+
124
+ @classmethod
125
+ def create(cls, sidebar: Component, **props):
126
+ """Create the sidebar trigger component.
127
+
128
+ Args:
129
+ sidebar: The sidebar component.
130
+ props: The properties of the sidebar trigger.
131
+
132
+ Returns:
133
+ The sidebar trigger component.
134
+ """
135
+ trigger_props = {**props, **sidebar_trigger_style}
136
+
137
+ inner_sidebar: Component = sidebar.children[0] # type: ignore
138
+ sidebar_width = inner_sidebar.style.get("width")
139
+
140
+ if sidebar.State:
141
+ open, toggle = sidebar.State.open, sidebar.State.toggle # type: ignore
142
+ else:
143
+ open, toggle = Var.create("open"), call_script(Var.create("setOpen(!open)")) # type: ignore
144
+
145
+ trigger_props["left"] = cond(open, f"calc({sidebar_width} - 32px)", "0")
146
+
147
+ trigger = cond(
148
+ open,
149
+ IconButton.create(
150
+ "arrow-left-from-line",
151
+ on_click=toggle,
152
+ **trigger_props,
153
+ ),
154
+ IconButton.create(
155
+ "arrow-right-from-line",
156
+ on_click=toggle,
157
+ **trigger_props,
158
+ ),
159
+ )
160
+ return super().create(trigger)
161
+
162
+
163
+ class Layout(Box):
164
+ """A component that renders the layout."""
165
+
166
+ @classmethod
167
+ def create(
168
+ cls,
169
+ *content: Component,
170
+ sidebar: Component | None = None,
171
+ **props,
172
+ ):
173
+ """Create the layout component.
174
+
175
+ Args:
176
+ content: The content component.
177
+ sidebar: The sidebar component.
178
+ props: The properties of the layout.
179
+
180
+ Returns:
181
+ The layout component.
182
+ """
183
+ layout_root = HStack.create
184
+
185
+ if sidebar is None:
186
+ return Container.create(*content, **props)
187
+
188
+ if isinstance(sidebar, DrawerSidebar):
189
+ return super().create(
190
+ sidebar,
191
+ Container.create(*content, height="100%"),
192
+ **props,
193
+ width="100vw",
194
+ min_height="100vh",
195
+ )
196
+
197
+ if not isinstance(sidebar, Sidebar):
198
+ sidebar = Sidebar.create(sidebar)
199
+
200
+ # Add the sidebar trigger to the sidebar as first child to not mess up the rendering.
201
+ sidebar.children.insert(0, SidebarTrigger.create(sidebar))
202
+
203
+ return super().create(
204
+ layout_root(
205
+ sidebar,
206
+ Container.create(*content, height="100%"),
207
+ **props,
208
+ width="100vw",
209
+ min_height="100vh",
210
+ )
211
+ )
212
+
213
+
214
+ class LayoutNamespace(ComponentNamespace):
215
+ """Namespace for layout components."""
216
+
217
+ drawer_sidebar = staticmethod(DrawerSidebar.create)
218
+ stateful_sidebar = staticmethod(StatefulSidebar.create)
219
+ sidebar = staticmethod(Sidebar.create)
220
+ __call__ = staticmethod(Layout.create)
221
+
222
+
223
+ layout = LayoutNamespace()
@@ -112,7 +112,9 @@ class AppHarness:
112
112
  """AppHarness executes a reflex app in-process for testing."""
113
113
 
114
114
  app_name: str
115
- app_source: Optional[types.FunctionType | types.ModuleType] | str
115
+ app_source: Optional[
116
+ types.FunctionType | types.ModuleType | str | functools.partial
117
+ ]
116
118
  app_path: pathlib.Path
117
119
  app_module_path: pathlib.Path
118
120
  app_module: Optional[types.ModuleType] = None
@@ -124,6 +126,7 @@ class AppHarness:
124
126
  backend: Optional[uvicorn.Server] = None
125
127
  state_manager: Optional[StateManagerMemory | StateManagerRedis] = None
126
128
  _frontends: list["WebDriver"] = dataclasses.field(default_factory=list)
129
+ _decorated_pages: list = dataclasses.field(default_factory=list)
127
130
 
128
131
  @classmethod
129
132
  def create(
@@ -149,15 +152,21 @@ class AppHarness:
149
152
  """
150
153
  if app_name is None:
151
154
  if app_source is None:
152
- app_name = root.name.lower()
155
+ app_name = root.name
153
156
  elif isinstance(app_source, functools.partial):
154
- app_name = app_source.func.__name__.lower()
157
+ keywords = app_source.keywords
158
+ slug_suffix = "_".join([str(v) for v in keywords.values()])
159
+ func_name = app_source.func.__name__
160
+ app_name = f"{func_name}_{slug_suffix}"
161
+ app_name = re.sub(r"[^a-zA-Z0-9_]", "_", app_name)
155
162
  elif isinstance(app_source, str):
156
163
  raise ValueError(
157
164
  "app_name must be provided when app_source is a string."
158
165
  )
159
166
  else:
160
- app_name = app_source.__name__.lower()
167
+ app_name = app_source.__name__
168
+
169
+ app_name = app_name.lower()
161
170
  return cls(
162
171
  app_name=app_name,
163
172
  app_source=app_source,
@@ -230,11 +239,15 @@ class AppHarness:
230
239
  with chdir(self.app_path):
231
240
  # ensure config and app are reloaded when testing different app
232
241
  reflex.config.get_config(reload=True)
233
- # Clean out any `rx.page` decorators from other tests.
234
- reflex.app.DECORATED_PAGES.clear()
242
+ # Save decorated pages before importing the test app module
243
+ before_decorated_pages = reflex.app.DECORATED_PAGES.copy()
235
244
  # Ensure the AppHarness test does not skip State assignment due to running via pytest
236
245
  os.environ.pop(reflex.constants.PYTEST_CURRENT_TEST, None)
237
246
  self.app_module = reflex.utils.prerequisites.get_compiled_app(reload=True)
247
+ # Save the pages that were added during testing
248
+ self._decorated_pages = [
249
+ p for p in reflex.app.DECORATED_PAGES if p not in before_decorated_pages
250
+ ]
238
251
  self.app_instance = self.app_module.app
239
252
  if isinstance(self.app_instance._state_manager, StateManagerRedis):
240
253
  # Create our own redis connection for testing.
@@ -396,6 +409,10 @@ class AppHarness:
396
409
  for driver in self._frontends:
397
410
  driver.quit()
398
411
 
412
+ # Cleanup decorated pages added during testing
413
+ for page in self._decorated_pages:
414
+ reflex.app.DECORATED_PAGES.remove(page)
415
+
399
416
  def __exit__(self, *excinfo) -> None:
400
417
  """Contextmanager protocol for `stop()`.
401
418
 
@@ -568,15 +568,17 @@ def update_next_config(export=False, transpile_packages: Optional[List[str]] = N
568
568
  export: if the method run during reflex export.
569
569
  transpile_packages: list of packages to transpile via next.config.js.
570
570
  """
571
- next_config_file = os.path.join(constants.Dirs.WEB, constants.Next.CONFIG_FILE)
571
+ next_config_file = Path(constants.Dirs.WEB, constants.Next.CONFIG_FILE)
572
572
 
573
573
  next_config = _update_next_config(
574
574
  get_config(), export=export, transpile_packages=transpile_packages
575
575
  )
576
576
 
577
- with open(next_config_file, "w") as file:
578
- file.write(next_config)
579
- file.write("\n")
577
+ # Overwriting the next.config.js triggers a full server reload, so make sure
578
+ # there is actually a diff.
579
+ orig_next_config = next_config_file.read_text() if next_config_file.exists() else ""
580
+ if orig_next_config != next_config:
581
+ next_config_file.write_text(next_config)
580
582
 
581
583
 
582
584
  def _update_next_config(
@@ -819,14 +821,16 @@ def install_frontend_packages(packages: set[str], config: Config):
819
821
  Example:
820
822
  >>> install_frontend_packages(["react", "react-dom"], get_config())
821
823
  """
822
- # unsupported archs will use npm anyway. so we dont have to run npm twice
824
+ # unsupported archs(arm and 32bit machines) will use npm anyway. so we dont have to run npm twice
823
825
  fallback_command = (
824
826
  get_package_manager()
825
- if constants.IS_WINDOWS and constants.IS_WINDOWS_BUN_SUPPORTED_MACHINE
827
+ if not constants.IS_WINDOWS
828
+ or constants.IS_WINDOWS
829
+ and constants.IS_WINDOWS_BUN_SUPPORTED_MACHINE
826
830
  else None
827
831
  )
828
832
  processes.run_process_with_fallback(
829
- [get_install_package_manager(), "install", "--loglevel", "silly"],
833
+ [get_install_package_manager(), "install"], # type: ignore
830
834
  fallback=fallback_command,
831
835
  show_status_message="Installing base frontend packages",
832
836
  cwd=constants.Dirs.WEB,
@@ -8,6 +8,7 @@ import os
8
8
  import signal
9
9
  import subprocess
10
10
  from concurrent import futures
11
+ from pathlib import Path
11
12
  from typing import Callable, Generator, List, Optional, Tuple, Union
12
13
 
13
14
  import psutil
@@ -145,6 +146,7 @@ def new_process(args, run: bool = False, show_logs: bool = False, **kwargs):
145
146
  "stdout": None if show_logs else subprocess.PIPE,
146
147
  "universal_newlines": True,
147
148
  "encoding": "UTF-8",
149
+ "errors": "replace", # Avoid UnicodeDecodeError in unknown command output
148
150
  **kwargs,
149
151
  }
150
152
  console.debug(f"Running command: {args}")
@@ -202,13 +204,19 @@ def run_concurrently(*fns: Union[Callable, Tuple]) -> None:
202
204
  pass
203
205
 
204
206
 
205
- def stream_logs(message: str, process: subprocess.Popen, progress=None):
207
+ def stream_logs(
208
+ message: str,
209
+ process: subprocess.Popen,
210
+ progress=None,
211
+ suppress_errors: bool = False,
212
+ ):
206
213
  """Stream the logs for a process.
207
214
 
208
215
  Args:
209
216
  message: The message to display.
210
217
  process: The process.
211
218
  progress: The ongoing progress bar if one is being used.
219
+ suppress_errors: If True, do not exit if errors are encountered (for fallback).
212
220
 
213
221
  Yields:
214
222
  The lines of the process output.
@@ -232,7 +240,7 @@ def stream_logs(message: str, process: subprocess.Popen, progress=None):
232
240
  # Windows uvicorn bug
233
241
  # https://github.com/reflex-dev/reflex/issues/2335
234
242
  accepted_return_codes = [0, -2, 15] if constants.IS_WINDOWS else [0, -2]
235
- if process.returncode not in accepted_return_codes:
243
+ if process.returncode not in accepted_return_codes and not suppress_errors:
236
244
  console.error(f"{message} failed with exit code {process.returncode}")
237
245
  for line in logs:
238
246
  console.error(line, end="")
@@ -251,15 +259,16 @@ def show_logs(message: str, process: subprocess.Popen):
251
259
  pass
252
260
 
253
261
 
254
- def show_status(message: str, process: subprocess.Popen):
262
+ def show_status(message: str, process: subprocess.Popen, suppress_errors: bool = False):
255
263
  """Show the status of a process.
256
264
 
257
265
  Args:
258
266
  message: The initial message to display.
259
267
  process: The process.
268
+ suppress_errors: If True, do not exit if errors are encountered (for fallback).
260
269
  """
261
270
  with console.status(message) as status:
262
- for line in stream_logs(message, process):
271
+ for line in stream_logs(message, process, suppress_errors=suppress_errors):
263
272
  status.update(f"{message} {line}")
264
273
 
265
274
 
@@ -289,6 +298,25 @@ def atexit_handler():
289
298
  console.log("Reflex app stopped.")
290
299
 
291
300
 
301
+ def get_command_with_loglevel(command: list[str]) -> list[str]:
302
+ """Add the right loglevel flag to the designated command.
303
+ npm uses --loglevel <level>, Bun doesnt use the --loglevel flag and
304
+ runs in debug mode by default.
305
+
306
+ Args:
307
+ command:The command to add loglevel flag.
308
+
309
+ Returns:
310
+ The updated command list
311
+ """
312
+ npm_path = path_ops.get_npm_path()
313
+ npm_path = str(Path(npm_path).resolve()) if npm_path else npm_path
314
+
315
+ if command[0] == npm_path:
316
+ return command + ["--loglevel", "silly"]
317
+ return command
318
+
319
+
292
320
  def run_process_with_fallback(args, *, show_status_message, fallback=None, **kwargs):
293
321
  """Run subprocess and retry using fallback command if initial command fails.
294
322
 
@@ -298,29 +326,22 @@ def run_process_with_fallback(args, *, show_status_message, fallback=None, **kwa
298
326
  fallback: The fallback command to run.
299
327
  kwargs: Kwargs to pass to new_process function.
300
328
  """
301
-
302
- def execute_process(process):
303
- if not constants.IS_WINDOWS:
304
- show_status(show_status_message, process)
305
- else:
306
- process.wait()
307
- if process.returncode != 0:
308
- error_output = process.stderr if process.stderr else process.stdout
309
- error_message = f"Error occurred during subprocess execution: {' '.join(args)}\n{error_output.read() if error_output else ''}"
310
- # Only show error in debug mode.
311
- if console.is_debug():
312
- console.error(error_message)
313
-
314
- # retry with fallback command.
315
- fallback_args = [fallback, *args[1:]] if fallback else None
316
- console.warn(
317
- f"There was an error running command: {args}. Falling back to: {fallback_args}."
318
- )
319
- if fallback_args:
320
- process = new_process(fallback_args, **kwargs)
321
- execute_process(process)
322
- else:
323
- show_status(show_status_message, process)
324
-
325
- process = new_process(args, **kwargs)
326
- execute_process(process)
329
+ process = new_process(get_command_with_loglevel(args), **kwargs)
330
+ if fallback is None:
331
+ # No fallback given, or this _is_ the fallback command.
332
+ show_status(show_status_message, process)
333
+ else:
334
+ # Suppress errors for initial command, because we will try to fallback
335
+ show_status(show_status_message, process, suppress_errors=True)
336
+ if process.returncode != 0:
337
+ # retry with fallback command.
338
+ fallback_args = [fallback, *args[1:]]
339
+ console.warn(
340
+ f"There was an error running command: {args}. Falling back to: {fallback_args}."
341
+ )
342
+ run_process_with_fallback(
343
+ fallback_args,
344
+ show_status_message=show_status_message,
345
+ fallback=None,
346
+ **kwargs,
347
+ )
@@ -34,6 +34,7 @@ PWD = Path(".").resolve()
34
34
 
35
35
  EXCLUDED_FILES = [
36
36
  "__init__.py",
37
+ "app.py",
37
38
  "component.py",
38
39
  "bare.py",
39
40
  "foreach.py",
@@ -795,7 +796,11 @@ class PyiGenerator:
795
796
  file_targets = []
796
797
  for target in targets:
797
798
  target_path = Path(target)
798
- if target_path.is_file() and target_path.suffix == ".py":
799
+ if (
800
+ target_path.is_file()
801
+ and target_path.suffix == ".py"
802
+ and target_path.name not in EXCLUDED_FILES
803
+ ):
799
804
  file_targets.append(target_path)
800
805
  continue
801
806
  if not target_path.is_dir():
@@ -7,6 +7,7 @@ import types as builtin_types
7
7
  import warnings
8
8
  from datetime import date, datetime, time, timedelta
9
9
  from enum import Enum
10
+ from pathlib import Path
10
11
  from typing import Any, Callable, Dict, List, Set, Tuple, Type, Union, get_type_hints
11
12
 
12
13
  from reflex.base import Base
@@ -233,6 +234,19 @@ def serialize_datetime(dt: Union[date, datetime, time, timedelta]) -> str:
233
234
  return str(dt)
234
235
 
235
236
 
237
+ @serializer
238
+ def serialize_path(path: Path):
239
+ """Serialize a pathlib.Path to a JSON string.
240
+
241
+ Args:
242
+ path: The path to serialize.
243
+
244
+ Returns:
245
+ The serialized path.
246
+ """
247
+ return str(path.as_posix())
248
+
249
+
236
250
  @serializer
237
251
  def serialize_enum(en: Enum) -> str:
238
252
  """Serialize a enum to a JSON string.
@@ -1340,7 +1340,7 @@ class Var:
1340
1340
  Returns:
1341
1341
  A var representing the contain check.
1342
1342
  """
1343
- if not (types._issubclass(self._var_type, Union[dict, list, tuple, str])):
1343
+ if not (types._issubclass(self._var_type, Union[dict, list, tuple, str, set])):
1344
1344
  raise TypeError(
1345
1345
  f"Var {self._var_full_name} of type {self._var_type} does not support contains check."
1346
1346
  )