reflex 0.8.14a2__tar.gz → 0.8.15__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 (398) hide show
  1. {reflex-0.8.14a2 → reflex-0.8.15}/PKG-INFO +8 -3
  2. {reflex-0.8.14a2 → reflex-0.8.15}/pyproject.toml +12 -6
  3. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/state.js +68 -8
  4. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/__init__.py +12 -7
  5. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/__init__.pyi +11 -3
  6. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/app.py +10 -7
  7. reflex-0.8.15/reflex/base.py +72 -0
  8. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/dataeditor.py +17 -2
  9. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/dataeditor.pyi +6 -2
  10. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/field.py +3 -1
  11. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/lucide/icon.py +2 -1
  12. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/lucide/icon.pyi +2 -1
  13. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/markdown/markdown.py +101 -27
  14. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/sonner/toast.py +3 -2
  15. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/sonner/toast.pyi +3 -2
  16. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/base.py +5 -0
  17. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/installer.py +3 -3
  18. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/environment.py +9 -1
  19. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/event.py +3 -0
  20. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/experimental/client_state.py +1 -1
  21. reflex-0.8.15/reflex/istate/manager/__init__.py +120 -0
  22. reflex-0.8.15/reflex/istate/manager/disk.py +210 -0
  23. reflex-0.8.15/reflex/istate/manager/memory.py +76 -0
  24. reflex-0.8.14a2/reflex/istate/manager.py → reflex-0.8.15/reflex/istate/manager/redis.py +5 -372
  25. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/istate/proxy.py +35 -24
  26. reflex-0.8.15/reflex/model.py +640 -0
  27. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/plugins/tailwind_v4.py +2 -2
  28. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/reflex.py +16 -10
  29. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/state.py +35 -34
  30. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/testing.py +12 -14
  31. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/build.py +11 -1
  32. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/codespaces.py +30 -1
  33. reflex-0.8.15/reflex/utils/compat.py +94 -0
  34. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/misc.py +2 -1
  35. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/monitoring.py +1 -2
  36. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/prerequisites.py +19 -4
  37. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/processes.py +3 -1
  38. reflex-0.8.15/reflex/utils/redir.py +43 -0
  39. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/serializers.py +21 -20
  40. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/telemetry.py +0 -2
  41. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/types.py +89 -90
  42. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/base.py +108 -41
  43. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/color.py +28 -8
  44. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/datetime.py +6 -2
  45. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/dep_tracking.py +2 -2
  46. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/number.py +26 -0
  47. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/object.py +51 -7
  48. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/sequence.py +32 -1
  49. reflex-0.8.14a2/reflex/base.py +0 -47
  50. reflex-0.8.14a2/reflex/model.py +0 -617
  51. reflex-0.8.14a2/reflex/utils/compat.py +0 -91
  52. reflex-0.8.14a2/reflex/utils/redir.py +0 -59
  53. {reflex-0.8.14a2 → reflex-0.8.15}/.gitignore +0 -0
  54. {reflex-0.8.14a2 → reflex-0.8.15}/LICENSE +0 -0
  55. {reflex-0.8.14a2 → reflex-0.8.15}/README.md +0 -0
  56. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  57. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  58. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/apps/blank/code/blank.py +0 -0
  59. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/.gitignore +0 -0
  60. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/app/entry.client.js +0 -0
  61. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/app/routes.js +0 -0
  62. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  63. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/components/shiki/code.js +0 -0
  64. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/jsconfig.json +0 -0
  65. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/postcss.config.js +0 -0
  66. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/react-router.config.js +0 -0
  67. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  68. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  69. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  70. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  71. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/helpers/range.js +0 -0
  72. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  73. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/helpers/upload.js +0 -0
  74. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/utils/react-theme.js +0 -0
  75. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
  76. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/__main__.py +0 -0
  77. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/admin.py +0 -0
  78. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/app_mixins/__init__.py +0 -0
  79. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/app_mixins/lifespan.py +0 -0
  80. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/app_mixins/middleware.py +0 -0
  81. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/app_mixins/mixin.py +0 -0
  82. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/assets.py +0 -0
  83. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/compiler/__init__.py +0 -0
  84. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/compiler/compiler.py +0 -0
  85. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/compiler/templates.py +0 -0
  86. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/compiler/utils.py +0 -0
  87. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/__init__.py +0 -0
  88. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/__init__.pyi +0 -0
  89. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/__init__.py +0 -0
  90. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/__init__.pyi +0 -0
  91. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/app_wrap.py +0 -0
  92. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/app_wrap.pyi +0 -0
  93. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/bare.py +0 -0
  94. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/body.py +0 -0
  95. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/body.pyi +0 -0
  96. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/document.py +0 -0
  97. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/document.pyi +0 -0
  98. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/error_boundary.py +0 -0
  99. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/error_boundary.pyi +0 -0
  100. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/fragment.py +0 -0
  101. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/fragment.pyi +0 -0
  102. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/link.py +0 -0
  103. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/link.pyi +0 -0
  104. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/meta.py +0 -0
  105. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/meta.pyi +0 -0
  106. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/script.py +0 -0
  107. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/script.pyi +0 -0
  108. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/strict_mode.py +0 -0
  109. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/base/strict_mode.pyi +0 -0
  110. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/component.py +0 -0
  111. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/__init__.py +0 -0
  112. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/__init__.pyi +0 -0
  113. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/auto_scroll.py +0 -0
  114. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/auto_scroll.pyi +0 -0
  115. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/banner.py +0 -0
  116. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/banner.pyi +0 -0
  117. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/breakpoints.py +0 -0
  118. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/clipboard.py +0 -0
  119. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/clipboard.pyi +0 -0
  120. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/colors.py +0 -0
  121. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/cond.py +0 -0
  122. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/debounce.py +0 -0
  123. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/debounce.pyi +0 -0
  124. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/foreach.py +0 -0
  125. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/helmet.py +0 -0
  126. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/helmet.pyi +0 -0
  127. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/html.py +0 -0
  128. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/html.pyi +0 -0
  129. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/layout/__init__.py +0 -0
  130. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/match.py +0 -0
  131. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/responsive.py +0 -0
  132. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/sticky.py +0 -0
  133. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/sticky.pyi +0 -0
  134. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/upload.py +0 -0
  135. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/upload.pyi +0 -0
  136. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/window_events.py +0 -0
  137. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/core/window_events.pyi +0 -0
  138. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/__init__.py +0 -0
  139. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/__init__.pyi +0 -0
  140. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/code.py +0 -0
  141. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/code.pyi +0 -0
  142. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/logo.py +0 -0
  143. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  144. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  145. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/dynamic.py +0 -0
  146. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/__init__.py +0 -0
  147. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/__init__.pyi +0 -0
  148. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/element.py +0 -0
  149. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/element.pyi +0 -0
  150. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/__init__.py +0 -0
  151. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/__init__.pyi +0 -0
  152. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/base.py +0 -0
  153. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/base.pyi +0 -0
  154. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/forms.py +0 -0
  155. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/forms.pyi +0 -0
  156. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/inline.py +0 -0
  157. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/inline.pyi +0 -0
  158. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/media.py +0 -0
  159. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/media.pyi +0 -0
  160. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/metadata.py +0 -0
  161. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/metadata.pyi +0 -0
  162. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/other.py +0 -0
  163. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/other.pyi +0 -0
  164. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/scripts.py +0 -0
  165. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/scripts.pyi +0 -0
  166. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/sectioning.py +0 -0
  167. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/sectioning.pyi +0 -0
  168. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/tables.py +0 -0
  169. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/tables.pyi +0 -0
  170. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/typography.py +0 -0
  171. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/el/elements/typography.pyi +0 -0
  172. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/gridjs/__init__.py +0 -0
  173. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/gridjs/datatable.py +0 -0
  174. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/gridjs/datatable.pyi +0 -0
  175. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/literals.py +0 -0
  176. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/lucide/__init__.py +0 -0
  177. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/markdown/__init__.py +0 -0
  178. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/markdown/markdown.pyi +0 -0
  179. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/moment/__init__.py +0 -0
  180. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/moment/moment.py +0 -0
  181. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/moment/moment.pyi +0 -0
  182. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/plotly/__init__.py +0 -0
  183. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/plotly/plotly.py +0 -0
  184. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/plotly/plotly.pyi +0 -0
  185. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/props.py +0 -0
  186. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/__init__.py +0 -0
  187. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/__init__.pyi +0 -0
  188. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/__init__.py +0 -0
  189. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/__init__.pyi +0 -0
  190. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/accordion.py +0 -0
  191. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/accordion.pyi +0 -0
  192. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/base.py +0 -0
  193. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/base.pyi +0 -0
  194. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/dialog.py +0 -0
  195. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/dialog.pyi +0 -0
  196. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/drawer.py +0 -0
  197. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/drawer.pyi +0 -0
  198. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/form.py +0 -0
  199. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/form.pyi +0 -0
  200. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/progress.py +0 -0
  201. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/progress.pyi +0 -0
  202. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/slider.py +0 -0
  203. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/primitives/slider.pyi +0 -0
  204. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/__init__.py +0 -0
  205. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/__init__.pyi +0 -0
  206. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/base.py +0 -0
  207. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/base.pyi +0 -0
  208. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/color_mode.py +0 -0
  209. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/color_mode.pyi +0 -0
  210. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/__init__.py +0 -0
  211. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  212. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  213. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  214. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  215. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  216. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/avatar.py +0 -0
  217. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  218. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/badge.py +0 -0
  219. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/badge.pyi +0 -0
  220. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/button.py +0 -0
  221. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/button.pyi +0 -0
  222. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/callout.py +0 -0
  223. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/callout.pyi +0 -0
  224. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/card.py +0 -0
  225. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/card.pyi +0 -0
  226. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/checkbox.py +0 -0
  227. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  228. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  229. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  230. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  231. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  232. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/context_menu.py +0 -0
  233. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  234. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/data_list.py +0 -0
  235. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  236. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/dialog.py +0 -0
  237. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  238. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  239. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  240. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/hover_card.py +0 -0
  241. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  242. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/icon_button.py +0 -0
  243. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  244. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/inset.py +0 -0
  245. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/inset.pyi +0 -0
  246. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/popover.py +0 -0
  247. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/popover.pyi +0 -0
  248. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/progress.py +0 -0
  249. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/progress.pyi +0 -0
  250. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/radio.py +0 -0
  251. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/radio.pyi +0 -0
  252. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  253. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  254. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/radio_group.py +0 -0
  255. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  256. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  257. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  258. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  259. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  260. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/select.py +0 -0
  261. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/select.pyi +0 -0
  262. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/separator.py +0 -0
  263. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/separator.pyi +0 -0
  264. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/skeleton.py +0 -0
  265. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  266. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/slider.py +0 -0
  267. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/slider.pyi +0 -0
  268. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/spinner.py +0 -0
  269. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  270. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/switch.py +0 -0
  271. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/switch.pyi +0 -0
  272. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/table.py +0 -0
  273. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/table.pyi +0 -0
  274. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/tabs.py +0 -0
  275. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  276. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/text_area.py +0 -0
  277. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  278. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/text_field.py +0 -0
  279. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  280. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/tooltip.py +0 -0
  281. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  282. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/__init__.py +0 -0
  283. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  284. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/base.py +0 -0
  285. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/base.pyi +0 -0
  286. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/box.py +0 -0
  287. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/box.pyi +0 -0
  288. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/center.py +0 -0
  289. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/center.pyi +0 -0
  290. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/container.py +0 -0
  291. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/container.pyi +0 -0
  292. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/flex.py +0 -0
  293. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  294. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/grid.py +0 -0
  295. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  296. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/list.py +0 -0
  297. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/list.pyi +0 -0
  298. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/section.py +0 -0
  299. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/section.pyi +0 -0
  300. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/spacer.py +0 -0
  301. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  302. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/stack.py +0 -0
  303. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  304. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/__init__.py +0 -0
  305. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  306. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/base.py +0 -0
  307. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  308. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  309. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/code.py +0 -0
  310. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/code.pyi +0 -0
  311. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/heading.py +0 -0
  312. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  313. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/link.py +0 -0
  314. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/link.pyi +0 -0
  315. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/text.py +0 -0
  316. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/radix/themes/typography/text.pyi +0 -0
  317. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_player/__init__.py +0 -0
  318. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_player/audio.py +0 -0
  319. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_player/audio.pyi +0 -0
  320. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_player/react_player.py +0 -0
  321. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_player/react_player.pyi +0 -0
  322. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_player/video.py +0 -0
  323. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_player/video.pyi +0 -0
  324. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_router/__init__.py +0 -0
  325. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_router/dom.py +0 -0
  326. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/react_router/dom.pyi +0 -0
  327. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/__init__.py +0 -0
  328. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/__init__.pyi +0 -0
  329. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/cartesian.py +0 -0
  330. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/cartesian.pyi +0 -0
  331. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/charts.py +0 -0
  332. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/charts.pyi +0 -0
  333. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/general.py +0 -0
  334. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/general.pyi +0 -0
  335. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/polar.py +0 -0
  336. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/polar.pyi +0 -0
  337. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/recharts.py +0 -0
  338. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/recharts/recharts.pyi +0 -0
  339. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/sonner/__init__.py +0 -0
  340. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/tags/__init__.py +0 -0
  341. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/tags/cond_tag.py +0 -0
  342. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/tags/iter_tag.py +0 -0
  343. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/tags/match_tag.py +0 -0
  344. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/tags/tag.py +0 -0
  345. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/components/tags/tagless.py +0 -0
  346. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/config.py +0 -0
  347. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/__init__.py +0 -0
  348. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/colors.py +0 -0
  349. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/compiler.py +0 -0
  350. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/config.py +0 -0
  351. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/custom_components.py +0 -0
  352. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/event.py +0 -0
  353. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/route.py +0 -0
  354. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/state.py +0 -0
  355. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/constants/utils.py +0 -0
  356. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/custom_components/__init__.py +0 -0
  357. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/custom_components/custom_components.py +0 -0
  358. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/experimental/__init__.py +0 -0
  359. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/experimental/hooks.py +0 -0
  360. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/istate/__init__.py +0 -0
  361. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/istate/data.py +0 -0
  362. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/istate/dynamic.py +0 -0
  363. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/istate/storage.py +0 -0
  364. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/istate/wrappers.py +0 -0
  365. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/middleware/__init__.py +0 -0
  366. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/middleware/hydrate_middleware.py +0 -0
  367. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/middleware/middleware.py +0 -0
  368. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/page.py +0 -0
  369. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/plugins/__init__.py +0 -0
  370. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/plugins/_screenshot.py +0 -0
  371. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/plugins/base.py +0 -0
  372. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/plugins/shared_tailwind.py +0 -0
  373. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/plugins/sitemap.py +0 -0
  374. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/plugins/tailwind_v3.py +0 -0
  375. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/py.typed +0 -0
  376. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/route.py +0 -0
  377. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/style.py +0 -0
  378. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/__init__.py +0 -0
  379. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/console.py +0 -0
  380. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/decorator.py +0 -0
  381. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/exceptions.py +0 -0
  382. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/exec.py +0 -0
  383. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/export.py +0 -0
  384. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/format.py +0 -0
  385. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/frontend_skeleton.py +0 -0
  386. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/imports.py +0 -0
  387. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/js_runtimes.py +0 -0
  388. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/lazy_loader.py +0 -0
  389. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/net.py +0 -0
  390. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/path_ops.py +0 -0
  391. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/pyi_generator.py +0 -0
  392. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/registry.py +0 -0
  393. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/rename.py +0 -0
  394. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/templates.py +4 -4
  395. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/utils/token_manager.py +0 -0
  396. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/__init__.py +0 -0
  397. {reflex-0.8.14a2 → reflex-0.8.15}/reflex/vars/function.py +0 -0
  398. {reflex-0.8.14a2 → reflex-0.8.15}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.14a2
3
+ Version: 0.8.15
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
@@ -18,10 +18,11 @@ Classifier: Programming Language :: Python :: 3.10
18
18
  Classifier: Programming Language :: Python :: 3.11
19
19
  Classifier: Programming Language :: Python :: 3.12
20
20
  Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
21
22
  Requires-Python: <4.0,>=3.10
22
23
  Requires-Dist: alembic<2.0,>=1.15.2
23
24
  Requires-Dist: click>=8.2
24
- Requires-Dist: granian[reload]>=2.4.0
25
+ Requires-Dist: granian[reload]>=2.5.5
25
26
  Requires-Dist: httpx<1.0,>=0.23.3
26
27
  Requires-Dist: packaging<26,>=24.2
27
28
  Requires-Dist: platformdirs<5.0,>=4.3.7
@@ -32,10 +33,14 @@ Requires-Dist: python-socketio<6.0,>=5.12.0
32
33
  Requires-Dist: redis<7.0,>=5.2.1
33
34
  Requires-Dist: reflex-hosting-cli>=0.1.55
34
35
  Requires-Dist: rich<15,>=13
35
- Requires-Dist: sqlmodel<0.1,>=0.0.24
36
+ Requires-Dist: sqlmodel<0.1,>=0.0.27
36
37
  Requires-Dist: starlette>=0.47.0
37
38
  Requires-Dist: typing-extensions>=4.13.0
38
39
  Requires-Dist: wrapt<2.0,>=1.17.0
40
+ Provides-Extra: db
41
+ Requires-Dist: alembic<2.0,>=1.15.2; extra == 'db'
42
+ Requires-Dist: pydantic<3.0,>=1.10.21; extra == 'db'
43
+ Requires-Dist: sqlmodel<0.1,>=0.0.24; extra == 'db'
39
44
  Provides-Extra: monitoring
40
45
  Requires-Dist: pyleak<1.0,>=0.1.14; extra == 'monitoring'
41
46
  Description-Content-Type: text/markdown
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.8.14a2"
3
+ version = "0.8.15"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -22,7 +22,7 @@ requires-python = ">=3.10,<4.0"
22
22
  dependencies = [
23
23
  "alembic >=1.15.2,<2.0",
24
24
  "click >=8.2",
25
- "granian[reload] >=2.4.0",
25
+ "granian[reload] >=2.5.5",
26
26
  "httpx >=0.23.3,<1.0",
27
27
  "packaging >=24.2,<26",
28
28
  "platformdirs >=4.3.7,<5.0",
@@ -33,7 +33,7 @@ dependencies = [
33
33
  "redis >=5.2.1,<7.0",
34
34
  "reflex-hosting-cli >=0.1.55",
35
35
  "rich >=13,<15",
36
- "sqlmodel >=0.0.24,<0.1",
36
+ "sqlmodel >=0.0.27,<0.1",
37
37
  "starlette >=0.47.0",
38
38
  "typing_extensions >=4.13.0",
39
39
  "wrapt >=1.17.0,<2.0",
@@ -47,9 +47,15 @@ classifiers = [
47
47
  "Programming Language :: Python :: 3.11",
48
48
  "Programming Language :: Python :: 3.12",
49
49
  "Programming Language :: Python :: 3.13",
50
+ "Programming Language :: Python :: 3.14",
50
51
  ]
51
52
 
52
53
  [project.optional-dependencies]
54
+ db = [
55
+ "alembic >=1.15.2,<2.0",
56
+ "pydantic >=1.10.21,<3.0",
57
+ "sqlmodel >=0.0.24,<0.1",
58
+ ]
53
59
  monitoring = ["pyleak >=0.1.14,<1.0"]
54
60
 
55
61
  [project.urls]
@@ -84,7 +90,7 @@ dev = [
84
90
  "pytest-cov",
85
91
  "pytest-mock",
86
92
  "pytest-playwright",
87
- "pytest-retry",
93
+ "pytest-rerunfailures",
88
94
  "pytest-split",
89
95
  "pytest",
90
96
  "python-dotenv",
@@ -229,7 +235,7 @@ fail_fast = true
229
235
 
230
236
  [[tool.pre-commit.repos]]
231
237
  repo = "https://github.com/astral-sh/ruff-pre-commit"
232
- rev = "v0.13.2"
238
+ rev = "v0.13.3"
233
239
  hooks = [
234
240
  { id = "ruff-format", args = [
235
241
  "reflex",
@@ -261,7 +267,7 @@ hooks = [
261
267
 
262
268
  [[tool.pre-commit.repos]]
263
269
  repo = "https://github.com/RobertCraigie/pyright-python"
264
- rev = "v1.1.405"
270
+ rev = "v1.1.406"
265
271
  hooks = [{ id = "pyright", args = ["reflex", "tests"], language = "system" }]
266
272
 
267
273
  [[tool.pre-commit.repos]]
@@ -529,6 +529,14 @@ export const connect = async (
529
529
  navigate,
530
530
  params,
531
531
  ) => {
532
+ // Socket already allocated, just reconnect it if needed.
533
+ if (socket.current) {
534
+ if (!socket.current.connected) {
535
+ socket.current.reconnect();
536
+ }
537
+ return;
538
+ }
539
+
532
540
  // Get backend URL object from the endpoint.
533
541
  const endpoint = getBackendURL(EVENTURL);
534
542
  const on_hydrated_queue = [];
@@ -540,7 +548,9 @@ export const connect = async (
540
548
  protocols: [reflexEnvironment.version],
541
549
  autoUnref: false,
542
550
  query: { token: getToken() },
551
+ reconnection: false, // Reconnection will be handled manually.
543
552
  });
553
+ socket.current.wait_connect = !socket.current.connected;
544
554
  // Ensure undefined fields in events are sent as null instead of removed
545
555
  socket.current.io.encoder.replacer = (k, v) => (v === undefined ? null : v);
546
556
  socket.current.io.decoder.tryParse = (str) => {
@@ -550,6 +560,18 @@ export const connect = async (
550
560
  return false;
551
561
  }
552
562
  };
563
+ // Set up a reconnect helper function
564
+ socket.current.reconnect = () => {
565
+ if (
566
+ socket.current &&
567
+ !socket.current.connected &&
568
+ !socket.current.wait_connect
569
+ ) {
570
+ socket.current.wait_connect = true;
571
+ socket.current.io.opts.query = { token: getToken() }; // Update token for reconnect.
572
+ socket.current.connect();
573
+ }
574
+ };
553
575
 
554
576
  function checkVisibility() {
555
577
  if (document.visibilityState === "visible") {
@@ -565,7 +587,7 @@ export const connect = async (
565
587
  );
566
588
  } else if (!socket.current.connected) {
567
589
  console.log("Socket is disconnected, attempting to reconnect ");
568
- socket.current.connect();
590
+ socket.current.reconnect();
569
591
  } else {
570
592
  console.log("Socket is reconnected ");
571
593
  }
@@ -588,6 +610,7 @@ export const connect = async (
588
610
 
589
611
  // Once the socket is open, hydrate the page.
590
612
  socket.current.on("connect", async () => {
613
+ socket.current.wait_connect = false;
591
614
  setConnectErrors([]);
592
615
  window.addEventListener("pagehide", pagehideHandler);
593
616
  window.addEventListener("beforeunload", disconnectTrigger);
@@ -599,16 +622,33 @@ export const connect = async (
599
622
  });
600
623
 
601
624
  socket.current.on("connect_error", (error) => {
602
- setConnectErrors((connectErrors) => [connectErrors.slice(-9), error]);
625
+ socket.current.wait_connect = false;
626
+ let n_connect_errors = 0;
627
+ setConnectErrors((connectErrors) => {
628
+ const new_errors = [...connectErrors.slice(-9), error];
629
+ n_connect_errors = new_errors.length;
630
+ return new_errors;
631
+ });
632
+ window.setTimeout(() => {
633
+ if (socket.current && !socket.current.connected) {
634
+ socket.current.reconnect();
635
+ }
636
+ }, 200 * n_connect_errors); // Incremental backoff
603
637
  });
604
638
 
605
639
  // When the socket disconnects reset the event_processing flag
606
- socket.current.on("disconnect", () => {
607
- socket.current = null; // allow reconnect to occur automatically
640
+ socket.current.on("disconnect", (reason, details) => {
641
+ socket.current.wait_connect = false;
642
+ const try_reconnect =
643
+ reason !== "io server disconnect" && reason !== "io client disconnect";
608
644
  event_processing = false;
609
645
  window.removeEventListener("unload", disconnectTrigger);
610
646
  window.removeEventListener("beforeunload", disconnectTrigger);
611
647
  window.removeEventListener("pagehide", pagehideHandler);
648
+ if (try_reconnect) {
649
+ // Attempt to reconnect transient non-intentional disconnects.
650
+ socket.current.reconnect();
651
+ }
612
652
  });
613
653
 
614
654
  // On each received message, queue the updates and events.
@@ -785,6 +825,7 @@ export const useEventLoop = (
785
825
  const [searchParams] = useSearchParams();
786
826
  const [connectErrors, setConnectErrors] = useState([]);
787
827
  const params = useRef(paramsR);
828
+ const mounted = useRef(false);
788
829
 
789
830
  useEffect(() => {
790
831
  const { "*": splat, ...remainingParams } = paramsR;
@@ -796,11 +837,16 @@ export const useEventLoop = (
796
837
  }, [paramsR]);
797
838
 
798
839
  const ensureSocketConnected = useCallback(async () => {
840
+ if (!mounted.current) {
841
+ // During hot reload, some components may still have a reference to
842
+ // addEvents, so avoid reconnecting the socket of an unmounted event loop.
843
+ return;
844
+ }
799
845
  // only use websockets if state is present and backend is not disabled (reflex cloud).
800
846
  if (
801
847
  Object.keys(initialState).length > 1 &&
802
848
  !isBackendDisabled() &&
803
- !socket.current
849
+ !socket.current?.connected
804
850
  ) {
805
851
  // Initialize the websocket connection.
806
852
  await connect(
@@ -813,13 +859,23 @@ export const useEventLoop = (
813
859
  () => params.current,
814
860
  );
815
861
  }
816
- }, [socket, dispatch, setConnectErrors, client_storage, navigate, params]);
862
+ }, [
863
+ socket,
864
+ dispatch,
865
+ setConnectErrors,
866
+ client_storage,
867
+ navigate,
868
+ params,
869
+ mounted,
870
+ ]);
817
871
 
818
872
  // Function to add new events to the event queue.
819
873
  const addEvents = useCallback((events, args, event_actions) => {
820
874
  const _events = events.filter((e) => e !== undefined && e !== null);
821
-
822
- ensureSocketConnected();
875
+ if (!event_actions?.temporal) {
876
+ // Reconnect socket if needed for non-temporal events.
877
+ ensureSocketConnected();
878
+ }
823
879
 
824
880
  if (!(args instanceof Array)) {
825
881
  args = [args];
@@ -914,12 +970,16 @@ export const useEventLoop = (
914
970
  // Handle socket connect/disconnect.
915
971
  useEffect(() => {
916
972
  // Initialize the websocket connection.
973
+ mounted.current = true;
917
974
  ensureSocketConnected();
918
975
 
919
976
  // Cleanup function.
920
977
  return () => {
978
+ mounted.current = false;
921
979
  if (socket.current) {
922
980
  socket.current.disconnect();
981
+ socket.current.off();
982
+ socket.current = null;
923
983
  }
924
984
  };
925
985
  }, []);
@@ -84,13 +84,18 @@ In the example above, you will be able to do `rx.list`
84
84
 
85
85
  from __future__ import annotations
86
86
 
87
- from reflex.utils import (
88
- compat, # for side-effects
89
- lazy_loader,
90
- )
87
+ import sys
88
+
89
+ from reflex.utils import lazy_loader
90
+
91
+ if sys.version_info < (3, 11):
92
+ from reflex.utils import console
91
93
 
92
- # Remove the `compat` name from the namespace, it was imported for side-effects only.
93
- del compat
94
+ console.warn(
95
+ "Reflex support for Python 3.10 is deprecated and will be removed in a future release. Please upgrade to Python 3.11 or higher for continued support."
96
+ )
97
+ del console
98
+ del sys
94
99
 
95
100
  RADIX_THEMES_MAPPING: dict = {
96
101
  "components.radix.themes.base": ["color_mode", "theme", "theme_panel"],
@@ -323,7 +328,7 @@ _MAPPING: dict = {
323
328
  "SessionStorage",
324
329
  ],
325
330
  "middleware": ["middleware", "Middleware"],
326
- "model": ["asession", "session", "Model"],
331
+ "model": ["asession", "session", "Model", "ModelRegistry"],
327
332
  "page": ["page"],
328
333
  "state": [
329
334
  "var",
@@ -3,7 +3,7 @@
3
3
  # This file was generated by `reflex/utils/pyi_generator.py`!
4
4
  # ------------------------------------------------------
5
5
 
6
- from reflex.utils import compat
6
+ import sys
7
7
 
8
8
  from . import (
9
9
  admin,
@@ -151,7 +151,7 @@ from .experimental import _x
151
151
  from .istate.storage import Cookie, LocalStorage, SessionStorage
152
152
  from .istate.wrappers import get_state
153
153
  from .middleware import Middleware, middleware
154
- from .model import Model, asession, session
154
+ from .model import Model, ModelRegistry, asession, session
155
155
  from .page import page
156
156
  from .state import ComponentState, State, dynamic, var
157
157
  from .style import Style, toggle_color_mode
@@ -160,7 +160,14 @@ from .utils.misc import run_in_thread
160
160
  from .utils.serializers import serializer
161
161
  from .vars import Field, Var, field
162
162
 
163
- del compat
163
+ if sys.version_info < (3, 11):
164
+ from reflex.utils import console
165
+
166
+ console.warn(
167
+ "Reflex support for Python 3.10 is deprecated and will be removed in a future release. Please upgrade to Python 3.11 or higher for continued support."
168
+ )
169
+ del console
170
+ del sys
164
171
  RADIX_THEMES_MAPPING: dict
165
172
  RADIX_THEMES_COMPONENTS_MAPPING: dict
166
173
  RADIX_THEMES_LAYOUT_MAPPING: dict
@@ -192,6 +199,7 @@ __all__ = [
192
199
  "LocalStorage",
193
200
  "Middleware",
194
201
  "Model",
202
+ "ModelRegistry",
195
203
  "MomentDelta",
196
204
  "NoSSRComponent",
197
205
  "PropsBase",
@@ -83,7 +83,6 @@ from reflex.event import (
83
83
  get_hydrate_event,
84
84
  noop,
85
85
  )
86
- from reflex.model import Model, get_db_status
87
86
  from reflex.page import DECORATED_PAGES
88
87
  from reflex.route import (
89
88
  get_route_args,
@@ -648,7 +647,7 @@ class App(MiddlewareMixin, LifespanMixin):
648
647
 
649
648
  for api_transformer in api_transformers:
650
649
  if isinstance(api_transformer, Starlette):
651
- # Mount the api to the fastapi app.
650
+ # Mount the api to the starlette app.
652
651
  App._add_cors(api_transformer)
653
652
  api_transformer.mount("", asgi_app)
654
653
  asgi_app = api_transformer
@@ -957,6 +956,8 @@ class App(MiddlewareMixin, LifespanMixin):
957
956
  try:
958
957
  from starlette_admin.contrib.sqla.admin import Admin
959
958
  from starlette_admin.contrib.sqla.view import ModelView
959
+
960
+ from reflex.model import Model
960
961
  except ImportError:
961
962
  return
962
963
 
@@ -1780,16 +1781,16 @@ async def process(
1780
1781
  name=f"reflex_emit_reload|{event.name}|{time.time()}|{event.token}",
1781
1782
  )
1782
1783
  return
1784
+ router_data[constants.RouteVar.PATH] = "/" + (
1785
+ app.router(path) or "404"
1786
+ if (path := router_data.get(constants.RouteVar.PATH))
1787
+ else "404"
1788
+ ).removeprefix("/")
1783
1789
  # re-assign only when the value is different
1784
1790
  if state.router_data != router_data:
1785
1791
  # assignment will recurse into substates and force recalculation of
1786
1792
  # dependent ComputedVar (dynamic route variables)
1787
1793
  state.router_data = router_data
1788
- router_data[constants.RouteVar.PATH] = "/" + (
1789
- app.router(path) or "404"
1790
- if (path := router_data.get(constants.RouteVar.PATH))
1791
- else "404"
1792
- ).removeprefix("/")
1793
1794
  state.router = RouterData.from_router_data(router_data)
1794
1795
 
1795
1796
  # Preprocess the event.
@@ -1849,6 +1850,8 @@ async def health(_request: Request) -> JSONResponse:
1849
1850
  tasks = []
1850
1851
 
1851
1852
  if prerequisites.check_db_used():
1853
+ from reflex.model import get_db_status
1854
+
1852
1855
  tasks.append(get_db_status())
1853
1856
  if prerequisites.check_redis_used():
1854
1857
  tasks.append(prerequisites.get_redis_status())
@@ -0,0 +1,72 @@
1
+ """Define the base Reflex class."""
2
+
3
+ from importlib.util import find_spec
4
+
5
+ if find_spec("pydantic") and find_spec("pydantic.v1"):
6
+ from pydantic.v1 import BaseModel
7
+
8
+ from reflex.utils.compat import ModelMetaclassLazyAnnotations
9
+
10
+ class Base(BaseModel, metaclass=ModelMetaclassLazyAnnotations):
11
+ """The base class subclassed by all Reflex classes.
12
+
13
+ This class wraps Pydantic and provides common methods such as
14
+ serialization and setting fields.
15
+
16
+ Any data structure that needs to be transferred between the
17
+ frontend and backend should subclass this class.
18
+ """
19
+
20
+ class Config:
21
+ """Pydantic config."""
22
+
23
+ arbitrary_types_allowed = True
24
+ use_enum_values = True
25
+ extra = "allow"
26
+
27
+ def __init_subclass__(cls):
28
+ """Warn that rx.Base is deprecated."""
29
+ from reflex.utils import console
30
+
31
+ console.deprecate(
32
+ feature_name="rx.Base",
33
+ reason=f"{cls!r} is subclassing rx.Base. You can subclass from `pydantic.BaseModel` directly instead or use dataclasses if possible.",
34
+ deprecation_version="0.8.15",
35
+ removal_version="0.9.0",
36
+ )
37
+ super().__init_subclass__()
38
+
39
+ def json(self) -> str:
40
+ """Convert the object to a json string.
41
+
42
+ Returns:
43
+ The object as a json string.
44
+ """
45
+ from reflex.utils.serializers import serialize
46
+
47
+ return self.__config__.json_dumps(
48
+ self.dict(),
49
+ default=serialize,
50
+ )
51
+ else:
52
+
53
+ class PydanticNotFoundFallback:
54
+ """Fallback base class for environments without Pydantic."""
55
+
56
+ def __init__(self, *args, **kwargs):
57
+ """Initialize the base class.
58
+
59
+ Args:
60
+ *args: Positional arguments.
61
+ **kwargs: Keyword arguments.
62
+
63
+ Raises:
64
+ ImportError: As Pydantic is not installed.
65
+ """
66
+ msg = (
67
+ "Pydantic is not installed. Please install it to use rx.Base."
68
+ "You can install it with `pip install pydantic`."
69
+ )
70
+ raise ImportError(msg)
71
+
72
+ Base = PydanticNotFoundFallback # pyright: ignore[reportAssignmentType]
@@ -2,11 +2,11 @@
2
2
 
3
3
  from __future__ import annotations
4
4
 
5
+ import dataclasses
5
6
  from collections.abc import Mapping, Sequence
6
7
  from enum import Enum
7
8
  from typing import Any, Literal, TypedDict
8
9
 
9
- from reflex.base import Base
10
10
  from reflex.components.component import Component, NoSSRComponent
11
11
  from reflex.components.literals import LiteralRowMarker
12
12
  from reflex.event import EventHandler, no_args_event_spec, passthrough_event_spec
@@ -50,7 +50,8 @@ class GridColumnIcons(Enum):
50
50
  VideoUri = "video_uri"
51
51
 
52
52
 
53
- class DataEditorTheme(Base):
53
+ @dataclasses.dataclass
54
+ class DataEditorThemeBase:
54
55
  """The theme for the DataEditor component."""
55
56
 
56
57
  accent_color: str | None = None
@@ -87,6 +88,20 @@ class DataEditorTheme(Base):
87
88
  text_medium: str | None = None
88
89
 
89
90
 
91
+ @dataclasses.dataclass(init=False)
92
+ class DataEditorTheme(DataEditorThemeBase):
93
+ """The theme for the DataEditor component."""
94
+
95
+ def __init__(self, **kwargs: Any):
96
+ """Initialize the DataEditorTheme.
97
+
98
+ Args:
99
+ **kwargs: The keyword arguments to initialize the theme.
100
+ """
101
+ kwargs = {format.to_snake_case(k): v for k, v in kwargs.items()}
102
+ super().__init__(**kwargs)
103
+
104
+
90
105
  class Bounds(TypedDict):
91
106
  """The bounds of the group header."""
92
107
 
@@ -3,11 +3,11 @@
3
3
  # ------------------- DO NOT EDIT ----------------------
4
4
  # This file was generated by `reflex/utils/pyi_generator.py`!
5
5
  # ------------------------------------------------------
6
+ import dataclasses
6
7
  from collections.abc import Mapping, Sequence
7
8
  from enum import Enum
8
9
  from typing import Any, Literal, TypedDict
9
10
 
10
- from reflex.base import Base
11
11
  from reflex.components.component import NoSSRComponent
12
12
  from reflex.components.core.breakpoints import Breakpoints
13
13
  from reflex.event import EventType, PointerEventInfo
@@ -43,7 +43,8 @@ class GridColumnIcons(Enum):
43
43
  Uri = "uri"
44
44
  VideoUri = "video_uri"
45
45
 
46
- class DataEditorTheme(Base):
46
+ @dataclasses.dataclass
47
+ class DataEditorThemeBase:
47
48
  accent_color: str | None
48
49
  accent_fg: str | None
49
50
  accent_light: str | None
@@ -77,6 +78,9 @@ class DataEditorTheme(Base):
77
78
  text_light: str | None
78
79
  text_medium: str | None
79
80
 
81
+ @dataclasses.dataclass(init=False)
82
+ class DataEditorTheme(DataEditorThemeBase): ...
83
+
80
84
  class Bounds(TypedDict):
81
85
  x: int
82
86
  y: int
@@ -7,6 +7,7 @@ from dataclasses import _MISSING_TYPE, MISSING
7
7
  from typing import Annotated, Any, Generic, TypeVar, get_origin
8
8
 
9
9
  from reflex.utils import types
10
+ from reflex.utils.compat import annotations_from_namespace
10
11
 
11
12
  FIELD_TYPE = TypeVar("FIELD_TYPE")
12
13
 
@@ -117,7 +118,8 @@ class FieldBasedMeta(type):
117
118
  cls, namespace: dict[str, Any], name: str
118
119
  ) -> dict[str, Any]:
119
120
  return types.resolve_annotations(
120
- namespace.get("__annotations__", {}), namespace["__module__"]
121
+ annotations_from_namespace(namespace),
122
+ namespace["__module__"],
121
123
  )
122
124
 
123
125
  @classmethod
@@ -6,7 +6,7 @@ from reflex.utils.imports import ImportVar
6
6
  from reflex.vars.base import LiteralVar, Var
7
7
  from reflex.vars.sequence import LiteralStringVar, StringVar
8
8
 
9
- LUCIDE_LIBRARY = "lucide-react@0.544.0"
9
+ LUCIDE_LIBRARY = "lucide-react@0.545.0"
10
10
 
11
11
 
12
12
  class LucideIconComponent(Component):
@@ -1129,6 +1129,7 @@ LUCIDE_ICON_LIST = [
1129
1129
  "monitor",
1130
1130
  "moon_star",
1131
1131
  "moon",
1132
+ "motorbike",
1132
1133
  "mountain_snow",
1133
1134
  "mountain",
1134
1135
  "mouse_off",
@@ -11,7 +11,7 @@ from reflex.components.core.breakpoints import Breakpoints
11
11
  from reflex.event import EventType, PointerEventInfo
12
12
  from reflex.vars.base import Var
13
13
 
14
- LUCIDE_LIBRARY = "lucide-react@0.544.0"
14
+ LUCIDE_LIBRARY = "lucide-react@0.545.0"
15
15
 
16
16
  class LucideIconComponent(Component):
17
17
  @classmethod
@@ -1194,6 +1194,7 @@ LUCIDE_ICON_LIST = [
1194
1194
  "monitor",
1195
1195
  "moon_star",
1196
1196
  "moon",
1197
+ "motorbike",
1197
1198
  "mountain_snow",
1198
1199
  "mountain",
1199
1200
  "mouse_off",