reflex 0.8.12a1__tar.gz → 0.8.13a1__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 (391) hide show
  1. {reflex-0.8.12a1 → reflex-0.8.13a1}/PKG-INFO +1 -1
  2. {reflex-0.8.12a1 → reflex-0.8.13a1}/pyproject.toml +2 -2
  3. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/state.js +48 -17
  4. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/app.py +17 -12
  5. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/app_mixins/lifespan.py +11 -0
  6. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/compiler/compiler.py +4 -1
  7. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/upload.py +53 -14
  8. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/upload.pyi +8 -0
  9. reflex-0.8.13a1/reflex/components/react_player/react_player.py +259 -0
  10. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/recharts.py +2 -2
  11. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/colors.py +3 -1
  12. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/installer.py +2 -2
  13. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/environment.py +3 -0
  14. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/istate/proxy.py +36 -36
  15. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/plugins/shared_tailwind.py +1 -1
  16. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/reflex.py +54 -3
  17. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/state.py +15 -5
  18. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/testing.py +14 -0
  19. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/build.py +77 -57
  20. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/exec.py +12 -0
  21. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/export.py +7 -2
  22. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/prerequisites.py +82 -7
  23. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/serializers.py +8 -4
  24. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/token_manager.py +10 -0
  25. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/types.py +2 -0
  26. reflex-0.8.13a1/reflex/vars/__init__.py +58 -0
  27. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/vars/base.py +20 -113
  28. reflex-0.8.13a1/reflex/vars/color.py +214 -0
  29. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/vars/number.py +2 -2
  30. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/vars/sequence.py +0 -136
  31. reflex-0.8.12a1/reflex/components/react_player/react_player.py +0 -119
  32. reflex-0.8.12a1/reflex/vars/__init__.py +0 -28
  33. {reflex-0.8.12a1 → reflex-0.8.13a1}/.gitignore +0 -0
  34. {reflex-0.8.12a1 → reflex-0.8.13a1}/LICENSE +0 -0
  35. {reflex-0.8.12a1 → reflex-0.8.13a1}/README.md +0 -0
  36. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  37. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  38. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/apps/blank/code/blank.py +0 -0
  39. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/.gitignore +0 -0
  40. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/app/entry.client.js +0 -0
  41. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/app/routes.js +0 -0
  42. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  43. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/components/shiki/code.js +0 -0
  44. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/jsconfig.json +0 -0
  45. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/postcss.config.js +0 -0
  46. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/react-router.config.js +0 -0
  47. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  48. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  49. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  50. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  51. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/range.js +0 -0
  52. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  53. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/upload.js +0 -0
  54. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/utils/react-theme.js +0 -0
  55. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
  56. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/__init__.py +0 -0
  57. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/__init__.pyi +0 -0
  58. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/__main__.py +0 -0
  59. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/admin.py +0 -0
  60. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/app_mixins/__init__.py +0 -0
  61. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/app_mixins/middleware.py +0 -0
  62. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/app_mixins/mixin.py +0 -0
  63. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/assets.py +0 -0
  64. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/base.py +0 -0
  65. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/compiler/__init__.py +0 -0
  66. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/compiler/templates.py +0 -0
  67. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/compiler/utils.py +0 -0
  68. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/__init__.py +0 -0
  69. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/__init__.pyi +0 -0
  70. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/__init__.py +0 -0
  71. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/__init__.pyi +0 -0
  72. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/app_wrap.py +0 -0
  73. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/app_wrap.pyi +0 -0
  74. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/bare.py +0 -0
  75. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/body.py +0 -0
  76. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/body.pyi +0 -0
  77. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/document.py +0 -0
  78. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/document.pyi +0 -0
  79. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/error_boundary.py +0 -0
  80. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/error_boundary.pyi +0 -0
  81. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/fragment.py +0 -0
  82. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/fragment.pyi +0 -0
  83. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/link.py +0 -0
  84. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/link.pyi +0 -0
  85. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/meta.py +0 -0
  86. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/meta.pyi +0 -0
  87. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/script.py +0 -0
  88. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/script.pyi +0 -0
  89. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/strict_mode.py +0 -0
  90. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/base/strict_mode.pyi +0 -0
  91. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/component.py +0 -0
  92. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/__init__.py +0 -0
  93. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/__init__.pyi +0 -0
  94. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/auto_scroll.py +0 -0
  95. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/auto_scroll.pyi +0 -0
  96. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/banner.py +0 -0
  97. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/banner.pyi +0 -0
  98. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/breakpoints.py +0 -0
  99. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/clipboard.py +0 -0
  100. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/clipboard.pyi +0 -0
  101. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/colors.py +0 -0
  102. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/cond.py +0 -0
  103. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/debounce.py +0 -0
  104. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/debounce.pyi +0 -0
  105. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/foreach.py +0 -0
  106. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/helmet.py +0 -0
  107. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/helmet.pyi +0 -0
  108. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/html.py +0 -0
  109. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/html.pyi +0 -0
  110. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/layout/__init__.py +0 -0
  111. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/match.py +0 -0
  112. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/responsive.py +0 -0
  113. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/sticky.py +0 -0
  114. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/sticky.pyi +0 -0
  115. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/window_events.py +0 -0
  116. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/core/window_events.pyi +0 -0
  117. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/__init__.py +0 -0
  118. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/__init__.pyi +0 -0
  119. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/code.py +0 -0
  120. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/code.pyi +0 -0
  121. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/dataeditor.py +0 -0
  122. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  123. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/logo.py +0 -0
  124. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  125. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  126. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/dynamic.py +0 -0
  127. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/__init__.py +0 -0
  128. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/__init__.pyi +0 -0
  129. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/element.py +0 -0
  130. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/element.pyi +0 -0
  131. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/__init__.py +0 -0
  132. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/__init__.pyi +0 -0
  133. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/base.py +0 -0
  134. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/base.pyi +0 -0
  135. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/forms.py +0 -0
  136. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/forms.pyi +0 -0
  137. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/inline.py +0 -0
  138. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/inline.pyi +0 -0
  139. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/media.py +0 -0
  140. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/media.pyi +0 -0
  141. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/metadata.py +0 -0
  142. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/metadata.pyi +0 -0
  143. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/other.py +0 -0
  144. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/other.pyi +0 -0
  145. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/scripts.py +0 -0
  146. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/scripts.pyi +0 -0
  147. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/sectioning.py +0 -0
  148. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/sectioning.pyi +0 -0
  149. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/tables.py +0 -0
  150. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/tables.pyi +0 -0
  151. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/typography.py +0 -0
  152. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/el/elements/typography.pyi +0 -0
  153. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/field.py +0 -0
  154. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/gridjs/__init__.py +0 -0
  155. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/gridjs/datatable.py +0 -0
  156. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/gridjs/datatable.pyi +0 -0
  157. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/literals.py +0 -0
  158. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/lucide/__init__.py +0 -0
  159. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/lucide/icon.py +0 -0
  160. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/lucide/icon.pyi +0 -0
  161. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/markdown/__init__.py +0 -0
  162. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/markdown/markdown.py +0 -0
  163. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/markdown/markdown.pyi +0 -0
  164. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/moment/__init__.py +0 -0
  165. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/moment/moment.py +0 -0
  166. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/moment/moment.pyi +0 -0
  167. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/plotly/__init__.py +0 -0
  168. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/plotly/plotly.py +0 -0
  169. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/plotly/plotly.pyi +0 -0
  170. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/props.py +0 -0
  171. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/__init__.py +0 -0
  172. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/__init__.pyi +0 -0
  173. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/__init__.py +0 -0
  174. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/__init__.pyi +0 -0
  175. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/accordion.py +0 -0
  176. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/accordion.pyi +0 -0
  177. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/base.py +0 -0
  178. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/base.pyi +0 -0
  179. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/drawer.py +0 -0
  180. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/drawer.pyi +0 -0
  181. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/form.py +0 -0
  182. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/form.pyi +0 -0
  183. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/progress.py +0 -0
  184. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/progress.pyi +0 -0
  185. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/slider.py +0 -0
  186. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/primitives/slider.pyi +0 -0
  187. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/__init__.py +0 -0
  188. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/__init__.pyi +0 -0
  189. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/base.py +0 -0
  190. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/base.pyi +0 -0
  191. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/color_mode.py +0 -0
  192. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/color_mode.pyi +0 -0
  193. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/__init__.py +0 -0
  194. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  195. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  196. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  197. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  198. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  199. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/avatar.py +0 -0
  200. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  201. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/badge.py +0 -0
  202. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/badge.pyi +0 -0
  203. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/button.py +0 -0
  204. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/button.pyi +0 -0
  205. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/callout.py +0 -0
  206. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/callout.pyi +0 -0
  207. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/card.py +0 -0
  208. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/card.pyi +0 -0
  209. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox.py +0 -0
  210. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  211. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  212. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  213. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  214. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  215. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/context_menu.py +0 -0
  216. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  217. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/data_list.py +0 -0
  218. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  219. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dialog.py +0 -0
  220. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  221. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  222. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  223. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/hover_card.py +0 -0
  224. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  225. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/icon_button.py +0 -0
  226. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  227. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/inset.py +0 -0
  228. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/inset.pyi +0 -0
  229. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/popover.py +0 -0
  230. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/popover.pyi +0 -0
  231. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/progress.py +0 -0
  232. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/progress.pyi +0 -0
  233. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio.py +0 -0
  234. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio.pyi +0 -0
  235. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  236. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  237. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_group.py +0 -0
  238. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  239. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  240. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  241. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  242. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  243. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/select.py +0 -0
  244. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/select.pyi +0 -0
  245. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/separator.py +0 -0
  246. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/separator.pyi +0 -0
  247. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/skeleton.py +0 -0
  248. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  249. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/slider.py +0 -0
  250. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/slider.pyi +0 -0
  251. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/spinner.py +0 -0
  252. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  253. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/switch.py +0 -0
  254. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/switch.pyi +0 -0
  255. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/table.py +0 -0
  256. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/table.pyi +0 -0
  257. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tabs.py +0 -0
  258. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  259. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_area.py +0 -0
  260. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  261. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_field.py +0 -0
  262. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  263. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tooltip.py +0 -0
  264. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  265. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/__init__.py +0 -0
  266. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  267. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/base.py +0 -0
  268. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/base.pyi +0 -0
  269. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/box.py +0 -0
  270. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/box.pyi +0 -0
  271. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/center.py +0 -0
  272. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/center.pyi +0 -0
  273. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/container.py +0 -0
  274. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/container.pyi +0 -0
  275. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/flex.py +0 -0
  276. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  277. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/grid.py +0 -0
  278. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  279. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/list.py +0 -0
  280. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/list.pyi +0 -0
  281. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/section.py +0 -0
  282. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/section.pyi +0 -0
  283. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/spacer.py +0 -0
  284. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  285. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/stack.py +0 -0
  286. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  287. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/__init__.py +0 -0
  288. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  289. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/base.py +0 -0
  290. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  291. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  292. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/code.py +0 -0
  293. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/code.pyi +0 -0
  294. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/heading.py +0 -0
  295. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  296. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/link.py +0 -0
  297. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/link.pyi +0 -0
  298. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/text.py +0 -0
  299. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/text.pyi +0 -0
  300. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_player/__init__.py +0 -0
  301. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_player/audio.py +0 -0
  302. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_player/audio.pyi +0 -0
  303. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_player/react_player.pyi +0 -0
  304. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_player/video.py +0 -0
  305. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_player/video.pyi +0 -0
  306. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_router/__init__.py +0 -0
  307. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_router/dom.py +0 -0
  308. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/react_router/dom.pyi +0 -0
  309. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/__init__.py +0 -0
  310. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/__init__.pyi +0 -0
  311. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/cartesian.py +0 -0
  312. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/cartesian.pyi +0 -0
  313. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/charts.py +0 -0
  314. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/charts.pyi +0 -0
  315. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/general.py +0 -0
  316. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/general.pyi +0 -0
  317. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/polar.py +0 -0
  318. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/polar.pyi +0 -0
  319. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/recharts/recharts.pyi +0 -0
  320. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/sonner/__init__.py +0 -0
  321. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/sonner/toast.py +0 -0
  322. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/sonner/toast.pyi +0 -0
  323. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/tags/__init__.py +0 -0
  324. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/tags/cond_tag.py +0 -0
  325. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/tags/iter_tag.py +0 -0
  326. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/tags/match_tag.py +0 -0
  327. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/tags/tag.py +0 -0
  328. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/components/tags/tagless.py +0 -0
  329. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/config.py +0 -0
  330. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/__init__.py +0 -0
  331. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/base.py +0 -0
  332. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/compiler.py +0 -0
  333. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/config.py +0 -0
  334. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/custom_components.py +0 -0
  335. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/event.py +0 -0
  336. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/route.py +0 -0
  337. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/state.py +0 -0
  338. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/constants/utils.py +0 -0
  339. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/custom_components/__init__.py +0 -0
  340. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/custom_components/custom_components.py +0 -0
  341. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/event.py +0 -0
  342. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/experimental/__init__.py +0 -0
  343. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/experimental/client_state.py +0 -0
  344. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/experimental/hooks.py +0 -0
  345. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/istate/__init__.py +0 -0
  346. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/istate/data.py +0 -0
  347. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/istate/dynamic.py +0 -0
  348. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/istate/manager.py +0 -0
  349. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/istate/storage.py +0 -0
  350. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/istate/wrappers.py +0 -0
  351. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/middleware/__init__.py +0 -0
  352. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/middleware/hydrate_middleware.py +0 -0
  353. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/middleware/middleware.py +0 -0
  354. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/model.py +0 -0
  355. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/page.py +0 -0
  356. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/plugins/__init__.py +0 -0
  357. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/plugins/_screenshot.py +0 -0
  358. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/plugins/base.py +0 -0
  359. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/plugins/sitemap.py +0 -0
  360. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/plugins/tailwind_v3.py +0 -0
  361. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/plugins/tailwind_v4.py +0 -0
  362. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/py.typed +0 -0
  363. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/route.py +0 -0
  364. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/style.py +0 -0
  365. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/__init__.py +0 -0
  366. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/codespaces.py +0 -0
  367. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/compat.py +0 -0
  368. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/console.py +0 -0
  369. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/decorator.py +0 -0
  370. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/exceptions.py +0 -0
  371. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/format.py +0 -0
  372. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/frontend_skeleton.py +0 -0
  373. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/imports.py +0 -0
  374. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/js_runtimes.py +0 -0
  375. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/lazy_loader.py +0 -0
  376. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/misc.py +0 -0
  377. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/monitoring.py +0 -0
  378. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/net.py +0 -0
  379. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/path_ops.py +0 -0
  380. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/processes.py +0 -0
  381. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/pyi_generator.py +0 -0
  382. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/redir.py +0 -0
  383. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/registry.py +0 -0
  384. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/rename.py +0 -0
  385. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/telemetry.py +0 -0
  386. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/utils/templates.py +0 -0
  387. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/vars/datetime.py +0 -0
  388. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/vars/dep_tracking.py +0 -0
  389. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/vars/function.py +0 -0
  390. {reflex-0.8.12a1 → reflex-0.8.13a1}/reflex/vars/object.py +0 -0
  391. {reflex-0.8.12a1 → reflex-0.8.13a1}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.12a1
3
+ Version: 0.8.13a1
4
4
  Summary: Web apps in pure Python.
5
5
  Project-URL: homepage, https://reflex.dev
6
6
  Project-URL: repository, https://github.com/reflex-dev/reflex
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.8.12a1"
3
+ version = "0.8.13a1"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -229,7 +229,7 @@ fail_fast = true
229
229
 
230
230
  [[tool.pre-commit.repos]]
231
231
  repo = "https://github.com/astral-sh/ruff-pre-commit"
232
- rev = "v0.13.0"
232
+ rev = "v0.13.1"
233
233
  hooks = [
234
234
  { id = "ruff-format", args = [
235
235
  "reflex",
@@ -531,6 +531,7 @@ export const connect = async (
531
531
  ) => {
532
532
  // Get backend URL object from the endpoint.
533
533
  const endpoint = getBackendURL(EVENTURL);
534
+ const on_hydrated_queue = [];
534
535
 
535
536
  // Create the socket.
536
537
  socket.current = io(endpoint.href, {
@@ -552,7 +553,17 @@ export const connect = async (
552
553
 
553
554
  function checkVisibility() {
554
555
  if (document.visibilityState === "visible") {
555
- if (!socket.current.connected) {
556
+ if (!socket.current) {
557
+ connect(
558
+ socket,
559
+ dispatch,
560
+ transports,
561
+ setConnectErrors,
562
+ client_storage,
563
+ navigate,
564
+ params,
565
+ );
566
+ } else if (!socket.current.connected) {
556
567
  console.log("Socket is disconnected, attempting to reconnect ");
557
568
  socket.current.connect();
558
569
  } else {
@@ -593,6 +604,7 @@ export const connect = async (
593
604
 
594
605
  // When the socket disconnects reset the event_processing flag
595
606
  socket.current.on("disconnect", () => {
607
+ socket.current = null; // allow reconnect to occur automatically
596
608
  event_processing = false;
597
609
  window.removeEventListener("unload", disconnectTrigger);
598
610
  window.removeEventListener("beforeunload", disconnectTrigger);
@@ -603,6 +615,14 @@ export const connect = async (
603
615
  socket.current.on("event", async (update) => {
604
616
  for (const substate in update.delta) {
605
617
  dispatch[substate](update.delta[substate]);
618
+ // handle events waiting for `is_hydrated`
619
+ if (
620
+ substate === state_name &&
621
+ update.delta[substate]?.is_hydrated_rx_state_
622
+ ) {
623
+ queueEvents(on_hydrated_queue, socket, false, navigate, params);
624
+ on_hydrated_queue.length = 0;
625
+ }
606
626
  }
607
627
  applyClientStorageDelta(client_storage, update.delta);
608
628
  event_processing = !update.final;
@@ -612,7 +632,8 @@ export const connect = async (
612
632
  });
613
633
  socket.current.on("reload", async (event) => {
614
634
  event_processing = false;
615
- queueEvents([...initialEvents(), event], socket, true, navigate, params);
635
+ on_hydrated_queue.push(event);
636
+ queueEvents(initialEvents(), socket, true, navigate, params);
616
637
  });
617
638
  socket.current.on("new_token", async (new_token) => {
618
639
  token = new_token;
@@ -774,10 +795,32 @@ export const useEventLoop = (
774
795
  }
775
796
  }, [paramsR]);
776
797
 
798
+ const ensureSocketConnected = useCallback(async () => {
799
+ // only use websockets if state is present and backend is not disabled (reflex cloud).
800
+ if (
801
+ Object.keys(initialState).length > 1 &&
802
+ !isBackendDisabled() &&
803
+ !socket.current
804
+ ) {
805
+ // Initialize the websocket connection.
806
+ await connect(
807
+ socket,
808
+ dispatch,
809
+ ["websocket"],
810
+ setConnectErrors,
811
+ client_storage,
812
+ navigate,
813
+ () => params.current,
814
+ );
815
+ }
816
+ }, [socket, dispatch, setConnectErrors, client_storage, navigate, params]);
817
+
777
818
  // Function to add new events to the event queue.
778
819
  const addEvents = useCallback((events, args, event_actions) => {
779
820
  const _events = events.filter((e) => e !== undefined && e !== null);
780
821
 
822
+ ensureSocketConnected();
823
+
781
824
  if (!(args instanceof Array)) {
782
825
  args = [args];
783
826
  }
@@ -870,21 +913,8 @@ export const useEventLoop = (
870
913
 
871
914
  // Handle socket connect/disconnect.
872
915
  useEffect(() => {
873
- // only use websockets if state is present and backend is not disabled (reflex cloud).
874
- if (Object.keys(initialState).length > 1 && !isBackendDisabled()) {
875
- // Initialize the websocket connection.
876
- if (!socket.current) {
877
- connect(
878
- socket,
879
- dispatch,
880
- ["websocket"],
881
- setConnectErrors,
882
- client_storage,
883
- navigate,
884
- () => params.current,
885
- );
886
- }
887
- }
916
+ // Initialize the websocket connection.
917
+ ensureSocketConnected();
888
918
 
889
919
  // Cleanup function.
890
920
  return () => {
@@ -903,6 +933,7 @@ export const useEventLoop = (
903
933
  (async () => {
904
934
  // Process all outstanding events.
905
935
  while (event_queue.length > 0 && !event_processing) {
936
+ await ensureSocketConnected();
906
937
  await processEvent(socket.current, navigate, () => params.current);
907
938
  }
908
939
  })();
@@ -97,6 +97,7 @@ from reflex.state import (
97
97
  State,
98
98
  StateManager,
99
99
  StateUpdate,
100
+ _split_substate_key,
100
101
  _substate_key,
101
102
  all_base_state_classes,
102
103
  code_uses_state_contexts,
@@ -112,7 +113,12 @@ from reflex.utils import (
112
113
  prerequisites,
113
114
  types,
114
115
  )
115
- from reflex.utils.exec import get_compile_context, is_prod_mode, is_testing_env
116
+ from reflex.utils.exec import (
117
+ get_compile_context,
118
+ is_prod_mode,
119
+ is_testing_env,
120
+ should_prerender_routes,
121
+ )
116
122
  from reflex.utils.imports import ImportVar
117
123
  from reflex.utils.token_manager import TokenManager
118
124
  from reflex.utils.types import ASGIApp, Message, Receive, Scope, Send
@@ -606,7 +612,7 @@ class App(MiddlewareMixin, LifespanMixin):
606
612
  """
607
613
  from reflex.vars.base import GLOBAL_CACHE
608
614
 
609
- self._compile(prerender_routes=is_prod_mode())
615
+ self._compile(prerender_routes=should_prerender_routes())
610
616
 
611
617
  config = get_config()
612
618
 
@@ -1559,7 +1565,7 @@ class App(MiddlewareMixin, LifespanMixin):
1559
1565
  state._clean()
1560
1566
  await self.event_namespace.emit_update(
1561
1567
  update=StateUpdate(delta=delta),
1562
- sid=state.router.session.session_id,
1568
+ token=token,
1563
1569
  )
1564
1570
 
1565
1571
  def _process_background(
@@ -1599,7 +1605,7 @@ class App(MiddlewareMixin, LifespanMixin):
1599
1605
  # Send the update to the client.
1600
1606
  await self.event_namespace.emit_update(
1601
1607
  update=update,
1602
- sid=state.router.session.session_id,
1608
+ token=event.token,
1603
1609
  )
1604
1610
 
1605
1611
  task = asyncio.create_task(
@@ -2061,20 +2067,19 @@ class EventNamespace(AsyncNamespace):
2061
2067
  and console.error(f"Token cleanup error: {t.exception()}")
2062
2068
  )
2063
2069
 
2064
- async def emit_update(self, update: StateUpdate, sid: str) -> None:
2070
+ async def emit_update(self, update: StateUpdate, token: str) -> None:
2065
2071
  """Emit an update to the client.
2066
2072
 
2067
2073
  Args:
2068
2074
  update: The state update to send.
2069
- sid: The Socket.IO session id.
2075
+ token: The client token (tab) associated with the event.
2070
2076
  """
2071
- if not sid:
2077
+ client_token, _ = _split_substate_key(token)
2078
+ sid = self.token_to_sid.get(client_token)
2079
+ if sid is None:
2072
2080
  # If the sid is None, we are not connected to a client. Prevent sending
2073
2081
  # updates to all clients.
2074
- return
2075
- token = self.sid_to_token.get(sid)
2076
- if token is None:
2077
- console.warn(f"Attempting to send delta to disconnected websocket {sid}")
2082
+ console.warn(f"Attempting to send delta to disconnected client {token!r}")
2078
2083
  return
2079
2084
  # Creating a task prevents the update from being blocked behind other coroutines.
2080
2085
  await asyncio.create_task(
@@ -2165,7 +2170,7 @@ class EventNamespace(AsyncNamespace):
2165
2170
  # Process the events.
2166
2171
  async for update in updates_gen:
2167
2172
  # Emit the update from processing the event.
2168
- await self.emit_update(update=update, sid=sid)
2173
+ await self.emit_update(update=update, token=event.token)
2169
2174
 
2170
2175
  async def on_ping(self, sid: str):
2171
2176
  """Event for testing the API endpoint.
@@ -60,6 +60,17 @@ class LifespanMixin(AppMixin):
60
60
  for task in running_tasks:
61
61
  console.debug(f"Canceling lifespan task: {task}")
62
62
  task.cancel(msg="lifespan_cleanup")
63
+ # Disassociate sid / token pairings so they can be reconnected properly.
64
+ try:
65
+ event_namespace = self.event_namespace # pyright: ignore[reportAttributeAccessIssue]
66
+ except AttributeError:
67
+ pass
68
+ else:
69
+ try:
70
+ if event_namespace:
71
+ await event_namespace._token_manager.disconnect_all()
72
+ except Exception as e:
73
+ console.error(f"Error during lifespan cleanup: {e}")
63
74
 
64
75
  def register_lifespan_task(self, task: Callable | asyncio.Task, **task_kwargs):
65
76
  """Register a task to run during the lifespan of the app.
@@ -621,7 +621,10 @@ def purge_web_pages_dir():
621
621
  return
622
622
 
623
623
  # Empty out the web pages directory.
624
- utils.empty_dir(get_web_dir() / constants.Dirs.PAGES, keep_files=["routes.js"])
624
+ utils.empty_dir(
625
+ get_web_dir() / constants.Dirs.PAGES,
626
+ keep_files=["routes.js", "entry.client.js"],
627
+ )
625
628
 
626
629
 
627
630
  if TYPE_CHECKING:
@@ -17,6 +17,7 @@ from reflex.components.component import (
17
17
  from reflex.components.core.cond import cond
18
18
  from reflex.components.el.elements.forms import Input
19
19
  from reflex.components.radix.themes.layout.box import Box
20
+ from reflex.components.sonner.toast import toast
20
21
  from reflex.constants import Dirs
21
22
  from reflex.constants.compiler import Hooks, Imports
22
23
  from reflex.environment import environment
@@ -36,7 +37,8 @@ from reflex.utils.imports import ImportVar
36
37
  from reflex.vars import VarData
37
38
  from reflex.vars.base import Var, get_unique_variable_name
38
39
  from reflex.vars.function import FunctionVar
39
- from reflex.vars.sequence import LiteralStringVar
40
+ from reflex.vars.object import ObjectVar
41
+ from reflex.vars.sequence import ArrayVar, LiteralStringVar
40
42
 
41
43
  DEFAULT_UPLOAD_ID: str = "default"
42
44
 
@@ -178,6 +180,34 @@ def _on_drop_spec(files: Var) -> tuple[Var[Any]]:
178
180
  return (files,)
179
181
 
180
182
 
183
+ def _default_drop_rejected(rejected_files: ArrayVar[list[dict[str, Any]]]) -> EventSpec:
184
+ """Event handler for showing a toast with rejected file info.
185
+
186
+ Args:
187
+ rejected_files: The files that were rejected.
188
+
189
+ Returns:
190
+ An event spec that shows a toast with the rejected file info when triggered.
191
+ """
192
+
193
+ def _format_rejected_file_record(rf: ObjectVar[dict[str, Any]]) -> str:
194
+ rf = rf.to(ObjectVar, dict[str, dict[str, Any]])
195
+ file = rf["file"].to(ObjectVar, dict[str, Any])
196
+ errors = rf["errors"].to(ArrayVar, list[dict[str, Any]])
197
+ return (
198
+ f"{file['path']}: {errors.foreach(lambda err: err['message']).join(', ')}"
199
+ )
200
+
201
+ return toast.error(
202
+ title="Files not Accepted",
203
+ description=rejected_files.to(ArrayVar)
204
+ .foreach(_format_rejected_file_record)
205
+ .join("\n\n"),
206
+ close_button=True,
207
+ style={"white_space": "pre-line"},
208
+ )
209
+
210
+
181
211
  class UploadFilesProvider(Component):
182
212
  """AppWrap component that provides a dict of selected files by ID via useContext."""
183
213
 
@@ -191,6 +221,9 @@ class GhostUpload(Fragment):
191
221
  # Fired when files are dropped.
192
222
  on_drop: EventHandler[_on_drop_spec]
193
223
 
224
+ # Fired when dropped files do not meet the specified criteria.
225
+ on_drop_rejected: EventHandler[_on_drop_spec]
226
+
194
227
 
195
228
  class Upload(MemoizationLeaf):
196
229
  """A file upload component."""
@@ -234,6 +267,9 @@ class Upload(MemoizationLeaf):
234
267
  # Fired when files are dropped.
235
268
  on_drop: EventHandler[_on_drop_spec]
236
269
 
270
+ # Fired when dropped files do not meet the specified criteria.
271
+ on_drop_rejected: EventHandler[_on_drop_spec]
272
+
237
273
  # Style rules to apply when actively dragging.
238
274
  drag_active_style: Style | None = field(default=None, is_javascript_property=False)
239
275
 
@@ -295,6 +331,10 @@ class Upload(MemoizationLeaf):
295
331
  on_drop[ix] = event
296
332
  upload_props["on_drop"] = on_drop
297
333
 
334
+ if upload_props.get("on_drop_rejected") is None:
335
+ # If on_drop_rejected is not provided, show an error toast.
336
+ upload_props["on_drop_rejected"] = _default_drop_rejected
337
+
298
338
  input_props_unique_name = get_unique_variable_name()
299
339
  root_props_unique_name = get_unique_variable_name()
300
340
  is_drag_active_unique_name = get_unique_variable_name()
@@ -313,22 +353,22 @@ class Upload(MemoizationLeaf):
313
353
  ),
314
354
  )
315
355
 
316
- event_var, callback_str = StatefulComponent._get_memoized_event_triggers(
317
- GhostUpload.create(on_drop=upload_props["on_drop"])
318
- )["on_drop"]
319
-
320
- upload_props["on_drop"] = event_var
356
+ event_triggers = StatefulComponent._get_memoized_event_triggers(
357
+ GhostUpload.create(
358
+ on_drop=upload_props["on_drop"],
359
+ on_drop_rejected=upload_props["on_drop_rejected"],
360
+ )
361
+ )
362
+ callback_hooks = []
363
+ for trigger_name, (event_var, callback_str) in event_triggers.items():
364
+ upload_props[trigger_name] = event_var
365
+ callback_hooks.append(callback_str)
321
366
 
322
367
  upload_props = {
323
368
  format.to_camel_case(key): value for key, value in upload_props.items()
324
369
  }
325
370
 
326
- use_dropzone_arguments = Var.create(
327
- {
328
- "onDrop": event_var,
329
- **upload_props,
330
- }
331
- )
371
+ use_dropzone_arguments = Var.create(upload_props)
332
372
 
333
373
  left_side = (
334
374
  "const { "
@@ -344,11 +384,10 @@ class Upload(MemoizationLeaf):
344
384
  imports=Imports.EVENTS,
345
385
  hooks={Hooks.EVENTS: None},
346
386
  ),
347
- event_var._get_all_var_data(),
348
387
  use_dropzone_arguments._get_all_var_data(),
349
388
  VarData(
350
389
  hooks={
351
- callback_str: None,
390
+ **dict.fromkeys(callback_hooks, None),
352
391
  f"{left_side} = {right_side};": None,
353
392
  },
354
393
  imports={
@@ -108,6 +108,7 @@ class GhostUpload(Fragment):
108
108
  on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
109
109
  on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
110
110
  on_drop: EventType[()] | EventType[Any] | None = None,
111
+ on_drop_rejected: EventType[()] | EventType[Any] | None = None,
111
112
  on_focus: EventType[()] | None = None,
112
113
  on_mount: EventType[()] | None = None,
113
114
  on_mouse_down: EventType[()] | None = None,
@@ -127,6 +128,7 @@ class GhostUpload(Fragment):
127
128
  Args:
128
129
  *children: The children of the component.
129
130
  on_drop: Fired when files are dropped.
131
+ on_drop_rejected: Fired when dropped files do not meet the specified criteria.
130
132
  style: The style of the component.
131
133
  key: A unique key for the component.
132
134
  id: The id for the component.
@@ -171,6 +173,7 @@ class Upload(MemoizationLeaf):
171
173
  on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
172
174
  on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
173
175
  on_drop: EventType[()] | EventType[Any] | None = None,
176
+ on_drop_rejected: EventType[()] | EventType[Any] | None = None,
174
177
  on_focus: EventType[()] | None = None,
175
178
  on_mount: EventType[()] | None = None,
176
179
  on_mouse_down: EventType[()] | None = None,
@@ -199,6 +202,7 @@ class Upload(MemoizationLeaf):
199
202
  no_drag: Whether to disable drag and drop.
200
203
  no_keyboard: Whether to disable using the space/enter keys to upload.
201
204
  on_drop: Fired when files are dropped.
205
+ on_drop_rejected: Fired when dropped files do not meet the specified criteria.
202
206
  drag_active_style: Style rules to apply when actively dragging.
203
207
  style: The style of the component.
204
208
  key: A unique key for the component.
@@ -242,6 +246,7 @@ class StyledUpload(Upload):
242
246
  on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
243
247
  on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
244
248
  on_drop: EventType[()] | EventType[Any] | None = None,
249
+ on_drop_rejected: EventType[()] | EventType[Any] | None = None,
245
250
  on_focus: EventType[()] | None = None,
246
251
  on_mount: EventType[()] | None = None,
247
252
  on_mouse_down: EventType[()] | None = None,
@@ -270,6 +275,7 @@ class StyledUpload(Upload):
270
275
  no_drag: Whether to disable drag and drop.
271
276
  no_keyboard: Whether to disable using the space/enter keys to upload.
272
277
  on_drop: Fired when files are dropped.
278
+ on_drop_rejected: Fired when dropped files do not meet the specified criteria.
273
279
  drag_active_style: Style rules to apply when actively dragging.
274
280
  style: The style of the component.
275
281
  key: A unique key for the component.
@@ -314,6 +320,7 @@ class UploadNamespace(ComponentNamespace):
314
320
  on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
315
321
  on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
316
322
  on_drop: EventType[()] | EventType[Any] | None = None,
323
+ on_drop_rejected: EventType[()] | EventType[Any] | None = None,
317
324
  on_focus: EventType[()] | None = None,
318
325
  on_mount: EventType[()] | None = None,
319
326
  on_mouse_down: EventType[()] | None = None,
@@ -342,6 +349,7 @@ class UploadNamespace(ComponentNamespace):
342
349
  no_drag: Whether to disable drag and drop.
343
350
  no_keyboard: Whether to disable using the space/enter keys to upload.
344
351
  on_drop: Fired when files are dropped.
352
+ on_drop_rejected: Fired when dropped files do not meet the specified criteria.
345
353
  drag_active_style: Style rules to apply when actively dragging.
346
354
  style: The style of the component.
347
355
  key: A unique key for the component.