reflex 0.8.0a7__tar.gz → 0.8.1a1__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 (406) hide show
  1. {reflex-0.8.0a7 → reflex-0.8.1a1}/PKG-INFO +2 -2
  2. {reflex-0.8.0a7 → reflex-0.8.1a1}/pyproject.toml +3 -3
  3. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/state.js +18 -1
  4. reflex-0.8.1a1/reflex/.templates/web/vite-plugin-safari-cachebust.js +160 -0
  5. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/vite.config.js +28 -6
  6. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/app.py +1 -1
  7. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/__init__.py +1 -0
  8. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/component.py +53 -1
  9. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/upload.py +5 -5
  10. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/__init__.py +7 -1
  11. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/link.py +1 -30
  12. reflex-0.8.1a1/reflex/components/react_router/__init__.py +5 -0
  13. reflex-0.8.1a1/reflex/components/react_router/dom.py +69 -0
  14. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/recharts.py +2 -2
  15. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/installer.py +2 -2
  16. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/environment.py +46 -0
  17. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/event.py +18 -1
  18. reflex-0.8.1a1/reflex/istate/data.py +250 -0
  19. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/plugins/tailwind_v4.py +2 -2
  20. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/state.py +3 -3
  21. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/exec.py +27 -5
  22. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/lazy_loader.py +7 -1
  23. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/processes.py +2 -1
  24. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/pyi_generator.py +17 -2
  25. reflex-0.8.0a7/reflex/istate/data.py +0 -177
  26. {reflex-0.8.0a7 → reflex-0.8.1a1}/.gitignore +0 -0
  27. {reflex-0.8.0a7 → reflex-0.8.1a1}/LICENSE +0 -0
  28. {reflex-0.8.0a7 → reflex-0.8.1a1}/README.md +0 -0
  29. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  30. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  31. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/apps/blank/code/blank.py +0 -0
  32. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
  33. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  34. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  35. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  36. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
  37. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  38. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  39. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
  40. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  41. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  42. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  43. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  44. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  45. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/macros.js.jinja2 +0 -0
  46. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
  47. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  48. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  49. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  50. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  51. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  52. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/.gitignore +0 -0
  53. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/app/entry.client.js +0 -0
  54. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/app/routes.js +0 -0
  55. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  56. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/components/shiki/code.js +0 -0
  57. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/jsconfig.json +0 -0
  58. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/postcss.config.js +0 -0
  59. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/react-router.config.js +0 -0
  60. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  61. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  62. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  63. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  64. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  65. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/helpers/range.js +0 -0
  66. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  67. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/.templates/web/utils/react-theme.js +0 -0
  68. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/__init__.py +0 -0
  69. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/__init__.pyi +0 -0
  70. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/__main__.py +0 -0
  71. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/admin.py +0 -0
  72. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/app_mixins/__init__.py +0 -0
  73. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/app_mixins/lifespan.py +0 -0
  74. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/app_mixins/middleware.py +0 -0
  75. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/app_mixins/mixin.py +0 -0
  76. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/assets.py +0 -0
  77. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/base.py +0 -0
  78. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/compiler/__init__.py +0 -0
  79. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/compiler/compiler.py +0 -0
  80. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/compiler/templates.py +0 -0
  81. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/compiler/utils.py +0 -0
  82. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/__init__.pyi +0 -0
  83. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/__init__.py +0 -0
  84. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/__init__.pyi +0 -0
  85. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/app_wrap.py +0 -0
  86. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/app_wrap.pyi +0 -0
  87. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/bare.py +0 -0
  88. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/body.py +0 -0
  89. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/body.pyi +0 -0
  90. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/document.py +0 -0
  91. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/document.pyi +0 -0
  92. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/error_boundary.py +0 -0
  93. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/error_boundary.pyi +0 -0
  94. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/fragment.py +0 -0
  95. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/fragment.pyi +0 -0
  96. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/link.py +0 -0
  97. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/link.pyi +0 -0
  98. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/meta.py +0 -0
  99. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/meta.pyi +0 -0
  100. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/script.py +0 -0
  101. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/script.pyi +0 -0
  102. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/strict_mode.py +0 -0
  103. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/base/strict_mode.pyi +0 -0
  104. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/__init__.py +0 -0
  105. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/__init__.pyi +0 -0
  106. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/auto_scroll.py +0 -0
  107. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/auto_scroll.pyi +0 -0
  108. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/banner.py +0 -0
  109. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/banner.pyi +0 -0
  110. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/breakpoints.py +0 -0
  111. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/client_side_routing.py +0 -0
  112. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/client_side_routing.pyi +0 -0
  113. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/clipboard.py +0 -0
  114. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/clipboard.pyi +0 -0
  115. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/colors.py +0 -0
  116. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/cond.py +0 -0
  117. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/debounce.py +0 -0
  118. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/debounce.pyi +0 -0
  119. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/foreach.py +0 -0
  120. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/helmet.py +0 -0
  121. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/helmet.pyi +0 -0
  122. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/html.py +0 -0
  123. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/html.pyi +0 -0
  124. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/layout/__init__.py +0 -0
  125. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/match.py +0 -0
  126. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/responsive.py +0 -0
  127. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/sticky.py +0 -0
  128. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/sticky.pyi +0 -0
  129. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/core/upload.pyi +0 -0
  130. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/__init__.py +0 -0
  131. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/__init__.pyi +0 -0
  132. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/code.py +0 -0
  133. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/code.pyi +0 -0
  134. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/dataeditor.py +0 -0
  135. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  136. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/logo.py +0 -0
  137. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  138. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  139. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/dynamic.py +0 -0
  140. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/__init__.pyi +0 -0
  141. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/constants/__init__.py +0 -0
  142. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/constants/html.py +0 -0
  143. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/constants/react.py +0 -0
  144. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/constants/reflex.py +0 -0
  145. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/element.py +0 -0
  146. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/element.pyi +0 -0
  147. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/__init__.py +0 -0
  148. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/__init__.pyi +0 -0
  149. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/base.py +0 -0
  150. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/base.pyi +0 -0
  151. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/forms.py +0 -0
  152. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/forms.pyi +0 -0
  153. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/inline.py +0 -0
  154. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/inline.pyi +0 -0
  155. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/media.py +0 -0
  156. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/media.pyi +0 -0
  157. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/metadata.py +0 -0
  158. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/metadata.pyi +0 -0
  159. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/other.py +0 -0
  160. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/other.pyi +0 -0
  161. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/scripts.py +0 -0
  162. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/scripts.pyi +0 -0
  163. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/sectioning.py +0 -0
  164. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/sectioning.pyi +0 -0
  165. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/tables.py +0 -0
  166. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/tables.pyi +0 -0
  167. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/typography.py +0 -0
  168. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/el/elements/typography.pyi +0 -0
  169. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/field.py +0 -0
  170. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/gridjs/__init__.py +0 -0
  171. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/gridjs/datatable.py +0 -0
  172. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/gridjs/datatable.pyi +0 -0
  173. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/literals.py +0 -0
  174. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/lucide/__init__.py +0 -0
  175. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/lucide/icon.py +0 -0
  176. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/lucide/icon.pyi +0 -0
  177. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/markdown/__init__.py +0 -0
  178. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/markdown/markdown.py +0 -0
  179. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/markdown/markdown.pyi +0 -0
  180. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/moment/__init__.py +0 -0
  181. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/moment/moment.py +0 -0
  182. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/moment/moment.pyi +0 -0
  183. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/plotly/__init__.py +0 -0
  184. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/plotly/plotly.py +0 -0
  185. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/plotly/plotly.pyi +0 -0
  186. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/props.py +0 -0
  187. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/__init__.py +0 -0
  188. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/__init__.pyi +0 -0
  189. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/__init__.py +0 -0
  190. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/__init__.pyi +0 -0
  191. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/accordion.py +0 -0
  192. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/accordion.pyi +0 -0
  193. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/base.py +0 -0
  194. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/base.pyi +0 -0
  195. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/drawer.py +0 -0
  196. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/drawer.pyi +0 -0
  197. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/form.py +0 -0
  198. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/form.pyi +0 -0
  199. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/progress.py +0 -0
  200. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/progress.pyi +0 -0
  201. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/slider.py +0 -0
  202. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/primitives/slider.pyi +0 -0
  203. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/__init__.py +0 -0
  204. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/__init__.pyi +0 -0
  205. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/base.py +0 -0
  206. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/base.pyi +0 -0
  207. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/color_mode.py +0 -0
  208. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/color_mode.pyi +0 -0
  209. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/__init__.py +0 -0
  210. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  211. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  212. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  213. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  214. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  215. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/avatar.py +0 -0
  216. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  217. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/badge.py +0 -0
  218. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/badge.pyi +0 -0
  219. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/button.py +0 -0
  220. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/button.pyi +0 -0
  221. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/callout.py +0 -0
  222. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/callout.pyi +0 -0
  223. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/card.py +0 -0
  224. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/card.pyi +0 -0
  225. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/checkbox.py +0 -0
  226. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  227. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  228. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  229. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  230. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  231. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/context_menu.py +0 -0
  232. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  233. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/data_list.py +0 -0
  234. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  235. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/dialog.py +0 -0
  236. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  237. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  238. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  239. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/hover_card.py +0 -0
  240. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  241. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/icon_button.py +0 -0
  242. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  243. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/inset.py +0 -0
  244. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/inset.pyi +0 -0
  245. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/popover.py +0 -0
  246. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/popover.pyi +0 -0
  247. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/progress.py +0 -0
  248. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/progress.pyi +0 -0
  249. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/radio.py +0 -0
  250. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/radio.pyi +0 -0
  251. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  252. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  253. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/radio_group.py +0 -0
  254. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  255. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  256. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  257. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  258. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  259. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/select.py +0 -0
  260. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/select.pyi +0 -0
  261. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/separator.py +0 -0
  262. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/separator.pyi +0 -0
  263. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/skeleton.py +0 -0
  264. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  265. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/slider.py +0 -0
  266. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/slider.pyi +0 -0
  267. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/spinner.py +0 -0
  268. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  269. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/switch.py +0 -0
  270. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/switch.pyi +0 -0
  271. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/table.py +0 -0
  272. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/table.pyi +0 -0
  273. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/tabs.py +0 -0
  274. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  275. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/text_area.py +0 -0
  276. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  277. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/text_field.py +0 -0
  278. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  279. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/tooltip.py +0 -0
  280. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  281. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/__init__.py +0 -0
  282. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  283. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/base.py +0 -0
  284. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/base.pyi +0 -0
  285. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/box.py +0 -0
  286. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/box.pyi +0 -0
  287. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/center.py +0 -0
  288. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/center.pyi +0 -0
  289. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/container.py +0 -0
  290. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/container.pyi +0 -0
  291. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/flex.py +0 -0
  292. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  293. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/grid.py +0 -0
  294. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  295. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/list.py +0 -0
  296. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/list.pyi +0 -0
  297. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/section.py +0 -0
  298. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/section.pyi +0 -0
  299. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/spacer.py +0 -0
  300. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  301. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/stack.py +0 -0
  302. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  303. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/__init__.py +0 -0
  304. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  305. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/base.py +0 -0
  306. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  307. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  308. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/code.py +0 -0
  309. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/code.pyi +0 -0
  310. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/heading.py +0 -0
  311. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  312. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/link.pyi +0 -0
  313. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/text.py +0 -0
  314. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/radix/themes/typography/text.pyi +0 -0
  315. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/react_player/__init__.py +0 -0
  316. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/react_player/audio.py +0 -0
  317. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/react_player/audio.pyi +0 -0
  318. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/react_player/react_player.py +0 -0
  319. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/react_player/react_player.pyi +0 -0
  320. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/react_player/video.py +0 -0
  321. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/react_player/video.pyi +0 -0
  322. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/__init__.py +0 -0
  323. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/__init__.pyi +0 -0
  324. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/cartesian.py +0 -0
  325. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/cartesian.pyi +0 -0
  326. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/charts.py +0 -0
  327. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/charts.pyi +0 -0
  328. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/general.py +0 -0
  329. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/general.pyi +0 -0
  330. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/polar.py +0 -0
  331. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/polar.pyi +0 -0
  332. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/recharts/recharts.pyi +0 -0
  333. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/sonner/__init__.py +0 -0
  334. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/sonner/toast.py +0 -0
  335. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/sonner/toast.pyi +0 -0
  336. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/tags/__init__.py +0 -0
  337. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/tags/cond_tag.py +0 -0
  338. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/tags/iter_tag.py +0 -0
  339. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/tags/match_tag.py +0 -0
  340. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/tags/tag.py +0 -0
  341. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/components/tags/tagless.py +0 -0
  342. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/config.py +0 -0
  343. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/__init__.py +0 -0
  344. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/base.py +0 -0
  345. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/colors.py +0 -0
  346. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/compiler.py +0 -0
  347. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/config.py +0 -0
  348. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/custom_components.py +0 -0
  349. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/event.py +0 -0
  350. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/route.py +0 -0
  351. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/state.py +0 -0
  352. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/constants/utils.py +0 -0
  353. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/custom_components/__init__.py +0 -0
  354. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/custom_components/custom_components.py +0 -0
  355. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/experimental/__init__.py +0 -0
  356. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/experimental/client_state.py +0 -0
  357. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/experimental/hooks.py +0 -0
  358. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/istate/__init__.py +0 -0
  359. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/istate/dynamic.py +0 -0
  360. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/istate/manager.py +0 -0
  361. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/istate/proxy.py +0 -0
  362. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/istate/storage.py +0 -0
  363. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/istate/wrappers.py +0 -0
  364. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/middleware/__init__.py +0 -0
  365. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/middleware/hydrate_middleware.py +0 -0
  366. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/middleware/middleware.py +0 -0
  367. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/model.py +0 -0
  368. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/page.py +0 -0
  369. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/plugins/__init__.py +0 -0
  370. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/plugins/base.py +0 -0
  371. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/plugins/shared_tailwind.py +0 -0
  372. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/plugins/sitemap.py +0 -0
  373. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/plugins/tailwind_v3.py +0 -0
  374. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/py.typed +0 -0
  375. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/reflex.py +0 -0
  376. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/route.py +0 -0
  377. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/style.py +0 -0
  378. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/testing.py +0 -0
  379. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/__init__.py +0 -0
  380. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/build.py +0 -0
  381. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/codespaces.py +0 -0
  382. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/compat.py +0 -0
  383. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/console.py +0 -0
  384. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/decorator.py +0 -0
  385. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/exceptions.py +0 -0
  386. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/export.py +0 -0
  387. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/format.py +0 -0
  388. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/imports.py +0 -0
  389. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/misc.py +0 -0
  390. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/net.py +0 -0
  391. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/path_ops.py +0 -0
  392. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/prerequisites.py +0 -0
  393. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/redir.py +0 -0
  394. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/registry.py +0 -0
  395. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/serializers.py +0 -0
  396. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/telemetry.py +0 -0
  397. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/utils/types.py +0 -0
  398. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/__init__.py +0 -0
  399. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/base.py +0 -0
  400. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/datetime.py +0 -0
  401. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/dep_tracking.py +0 -0
  402. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/function.py +0 -0
  403. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/number.py +0 -0
  404. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/object.py +0 -0
  405. {reflex-0.8.0a7 → reflex-0.8.1a1}/reflex/vars/sequence.py +0 -0
  406. {reflex-0.8.0a7 → reflex-0.8.1a1}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.0a7
3
+ Version: 0.8.1a1
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
@@ -31,7 +31,7 @@ Requires-Dist: pydantic<3.0,>=1.10.21
31
31
  Requires-Dist: python-multipart<1.0,>=0.0.20
32
32
  Requires-Dist: python-socketio<6.0,>=5.12.0
33
33
  Requires-Dist: redis<7.0,>=5.2.1
34
- Requires-Dist: reflex-hosting-cli>=0.1.47
34
+ Requires-Dist: reflex-hosting-cli>=0.1.51
35
35
  Requires-Dist: rich<15,>=13
36
36
  Requires-Dist: sqlmodel<0.1,>=0.0.24
37
37
  Requires-Dist: typing-extensions>=4.13.0
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.8.0a7"
3
+ version = "0.8.1a1"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -32,7 +32,7 @@ dependencies = [
32
32
  "python-socketio >=5.12.0,<6.0",
33
33
  "python-multipart >=0.0.20,<1.0",
34
34
  "redis >=5.2.1,<7.0",
35
- "reflex-hosting-cli >=0.1.47",
35
+ "reflex-hosting-cli >=0.1.51",
36
36
  "rich >=13,<15",
37
37
  "sqlmodel >=0.0.24,<0.1",
38
38
  "click >=8.2",
@@ -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.11.13"
232
+ rev = "v0.12.1"
233
233
  hooks = [
234
234
  { id = "ruff-format", args = [
235
235
  "reflex",
@@ -295,6 +295,20 @@ export const applyEvent = async (event, socket, navigate, params) => {
295
295
  return false;
296
296
  }
297
297
 
298
+ if (event.name == "_blur_focus") {
299
+ const ref =
300
+ event.payload.ref in refs ? refs[event.payload.ref] : event.payload.ref;
301
+ const current = ref?.current;
302
+ if (current === undefined || current?.blur === undefined) {
303
+ console.error(
304
+ `No element found for ref ${event.payload.ref} in _blur_focus`,
305
+ );
306
+ } else {
307
+ current.blur();
308
+ }
309
+ return false;
310
+ }
311
+
298
312
  if (event.name == "_set_value") {
299
313
  const ref =
300
314
  event.payload.ref in refs ? refs[event.payload.ref] : event.payload.ref;
@@ -370,7 +384,10 @@ export const applyEvent = async (event, socket, navigate, params) => {
370
384
  ...Object.fromEntries(new URLSearchParams(window.location.search)),
371
385
  ...params(),
372
386
  },
373
- asPath: window.location.pathname + window.location.search,
387
+ asPath:
388
+ window.location.pathname +
389
+ window.location.search +
390
+ window.location.hash,
374
391
  };
375
392
  }
376
393
 
@@ -0,0 +1,160 @@
1
+ /* vite-plugin-safari-cachebust.js
2
+ *
3
+ * Rewrite modulepreload <link> tags and ESM imports to include a cache-busting
4
+ * query parameter for Safari browser.
5
+ *
6
+ * https://github.com/remix-run/react-router/issues/12761
7
+ *
8
+ * The issue seems to be Safari over-aggressive caching of ESM imports (and modulepreload)
9
+ * which does not respect the cache-control headers sent by the server. This approach
10
+ * allows hot reload to work in Safari when adding routes or changing dependencies.
11
+ *
12
+ * No equivalent transformation is needed for production builds, as the
13
+ * output already contains the file hash in the name.
14
+ */
15
+
16
+ /**
17
+ * @typedef {import('vite').Plugin} Plugin
18
+ * @typedef {import('vite').ViteDevServer} ViteDevServer
19
+ * @typedef {import('http').IncomingMessage} IncomingMessage
20
+ * @typedef {import('http').ServerResponse} ServerResponse
21
+ * @typedef {import('connect').NextHandleFunction} NextHandleFunction
22
+ */
23
+
24
+ const pluginName = "vite-plugin-safari-cachebust";
25
+
26
+ /**
27
+ * Creates a Vite plugin that adds cache-busting for Safari browsers
28
+ * @returns {Plugin} The Vite plugin
29
+ */
30
+ export default function safariCacheBustPlugin() {
31
+ return {
32
+ name: pluginName,
33
+ /**
34
+ * Configure the dev server with the Safari middleware
35
+ * @param {ViteDevServer} server - The Vite dev server instance
36
+ */
37
+ configureServer(server) {
38
+ server.middlewares.use(createSafariMiddleware());
39
+ },
40
+ };
41
+ }
42
+
43
+ /**
44
+ * Determines if the user agent is Safari
45
+ * @param {string} ua - The user agent string
46
+ * @returns {boolean} True if the browser is Safari
47
+ */
48
+ function isSafari(ua) {
49
+ return /Safari/.test(ua) && !/Chrome/.test(ua);
50
+ }
51
+
52
+ /**
53
+ * Creates a middleware that adds cache-busting for Safari browsers
54
+ * @returns {NextHandleFunction} The middleware function
55
+ */
56
+ function createSafariMiddleware() {
57
+ // Set when a log message for rewriting n links has been emitted.
58
+ let _have_logged_n = -1;
59
+
60
+ /**
61
+ * Rewrites module import links in HTML content with cache-busting parameters
62
+ * @param {string} html - The HTML content to process
63
+ * @returns {string} The processed HTML content
64
+ */
65
+ function rewriteModuleImports(html) {
66
+ const currentTimestamp = new Date().getTime();
67
+ const parts = html.split(/(<link\s+rel="modulepreload"[^>]*>)/g);
68
+ /** @type {[string, string][]} */
69
+ const replacements = parts
70
+ .map((chunk) => {
71
+ const match = chunk.match(
72
+ /<link\s+rel="modulepreload"\s+href="([^"]+)"(.*?)\/?>/,
73
+ );
74
+ if (!match) return;
75
+
76
+ const [fullMatch, href, rest] = match;
77
+ if (/^(https?:)?\/\//.test(href)) return;
78
+
79
+ try {
80
+ const newHref = href.includes("?")
81
+ ? `${href}&__reflex_ts=${currentTimestamp}`
82
+ : `${href}?__reflex_ts=${currentTimestamp}`;
83
+ return [href, newHref];
84
+ } catch {
85
+ // no worries;
86
+ }
87
+ })
88
+ .filter(Boolean);
89
+ if (replacements.length && _have_logged_n !== replacements.length) {
90
+ _have_logged_n = replacements.length;
91
+ console.debug(
92
+ `[${pluginName}] Rewrote ${replacements.length} modulepreload links with __reflex_ts param.`,
93
+ );
94
+ }
95
+ return replacements.reduce((accumulator, [target, replacement]) => {
96
+ return accumulator.split(target).join(replacement);
97
+ }, html);
98
+ }
99
+
100
+ /**
101
+ * Middleware function to handle Safari cache busting
102
+ * @param {IncomingMessage} req - The incoming request
103
+ * @param {ServerResponse} res - The server response
104
+ * @param {(err?: any) => void} next - The next middleware function
105
+ * @returns {void}
106
+ */
107
+ return function safariCacheBustMiddleware(req, res, next) {
108
+ const ua = req.headers["user-agent"] || "";
109
+ // Remove our special cache bust query param to avoid affecting lower middleware layers.
110
+ if (
111
+ req.url &&
112
+ (req.url.includes("?__reflex_ts=") || req.url.includes("&__reflex_ts="))
113
+ ) {
114
+ req.url = req.url.replace(/(\?|&)__reflex_ts=\d+/, "");
115
+ return next();
116
+ }
117
+
118
+ // Only apply this middleware for Safari browsers.
119
+ if (!isSafari(ua)) return next();
120
+
121
+ // Only transform requests that want HTML.
122
+ const header_accept = req.headers["accept"] || "";
123
+ if (
124
+ typeof header_accept !== "string" ||
125
+ !header_accept.includes("text/html")
126
+ ) {
127
+ return next();
128
+ }
129
+
130
+ let buffer = "";
131
+ const _end = res.end.bind(res);
132
+
133
+ res.setHeader("x-modified-by", "vite-plugin-safari-cachebust");
134
+ /**
135
+ * Overridden write method to collect chunks
136
+ * @param {any} chunk - The chunk to write
137
+ * @param {...any} args - Additional arguments
138
+ * @returns {boolean} Result of the write operation
139
+ */
140
+ res.write = function (chunk, ...args) {
141
+ buffer += chunk instanceof Buffer ? chunk.toString("utf-8") : chunk;
142
+ return true;
143
+ };
144
+
145
+ /**
146
+ * Overridden end method to process and send the final response
147
+ * @param {any} chunk - The final chunk to write
148
+ * @param {...any} args - Additional arguments
149
+ * @returns {ServerResponse<IncomingMessage>} The server response
150
+ */
151
+ res.end = function (chunk, ...args) {
152
+ if (chunk) {
153
+ buffer += chunk instanceof Buffer ? chunk.toString("utf-8") : chunk;
154
+ }
155
+ buffer = rewriteModuleImports(buffer);
156
+ return _end(buffer, ...args);
157
+ };
158
+ return next();
159
+ };
160
+ }
@@ -1,9 +1,35 @@
1
1
  import { fileURLToPath, URL } from "url";
2
2
  import { reactRouter } from "@react-router/dev/vite";
3
3
  import { defineConfig } from "vite";
4
+ import safariCacheBustPlugin from "./vite-plugin-safari-cachebust";
5
+
6
+ // Ensure that bun always uses the react-dom/server.node functions.
7
+ function alwaysUseReactDomServerNode() {
8
+ return {
9
+ name: "vite-plugin-always-use-react-dom-server-node",
10
+ enforce: "pre",
11
+
12
+ resolveId(source, importer) {
13
+ if (
14
+ typeof importer === "string" &&
15
+ importer.endsWith("/entry.server.node.tsx") &&
16
+ source.includes("react-dom/server")
17
+ ) {
18
+ return this.resolve("react-dom/server.node", importer, {
19
+ skipSelf: true,
20
+ });
21
+ }
22
+ return null;
23
+ },
24
+ };
25
+ }
4
26
 
5
27
  export default defineConfig((config) => ({
6
- plugins: [reactRouter()],
28
+ plugins: [
29
+ alwaysUseReactDomServerNode(),
30
+ reactRouter(),
31
+ safariCacheBustPlugin(),
32
+ ],
7
33
  build: {
8
34
  rollupOptions: {
9
35
  jsx: {},
@@ -29,10 +55,6 @@ export default defineConfig((config) => ({
29
55
  find: "@",
30
56
  replacement: fileURLToPath(new URL("./public", import.meta.url)),
31
57
  },
32
- ].concat(
33
- config.command === "build"
34
- ? [{ find: "react-dom/server", replacement: "react-dom/server.node" }]
35
- : [],
36
- ),
58
+ ],
37
59
  },
38
60
  }));
@@ -1741,7 +1741,7 @@ async def process(
1741
1741
  if (path := router_data.get(constants.RouteVar.PATH))
1742
1742
  else "404"
1743
1743
  ).removeprefix("/")
1744
- state.router = RouterData(router_data)
1744
+ state.router = RouterData.from_router_data(router_data)
1745
1745
 
1746
1746
  # Preprocess the event.
1747
1747
  update = await app._preprocess(state, event)
@@ -14,6 +14,7 @@ _SUBMODULES: set[str] = {
14
14
  "plotly",
15
15
  "radix",
16
16
  "react_player",
17
+ "react_router",
17
18
  "sonner",
18
19
  "el",
19
20
  "base",
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import contextlib
6
6
  import copy
7
7
  import dataclasses
8
+ import enum
8
9
  import functools
9
10
  import inspect
10
11
  import typing
@@ -479,6 +480,57 @@ def _components_from(
479
480
  return ()
480
481
 
481
482
 
483
+ def _deterministic_hash(value: object) -> int:
484
+ """Hash a rendered dictionary.
485
+
486
+ Args:
487
+ value: The dictionary to hash.
488
+
489
+ Returns:
490
+ The hash of the dictionary.
491
+
492
+ Raises:
493
+ TypeError: If the value is not hashable.
494
+ """
495
+ if isinstance(value, BaseComponent):
496
+ # If the value is a component, hash its rendered code.
497
+ rendered_code = value.render()
498
+ return _deterministic_hash(rendered_code)
499
+ if isinstance(value, Var):
500
+ return _deterministic_hash((value._js_expr, value._get_all_var_data()))
501
+ if isinstance(value, VarData):
502
+ return _deterministic_hash(dataclasses.asdict(value))
503
+ if isinstance(value, dict):
504
+ # Sort the dictionary to ensure consistent hashing.
505
+ return _deterministic_hash(
506
+ tuple(sorted((k, _deterministic_hash(v)) for k, v in value.items()))
507
+ )
508
+ if isinstance(value, int):
509
+ # Hash numbers and booleans directly.
510
+ return int(value)
511
+ if isinstance(value, float):
512
+ return _deterministic_hash(str(value))
513
+ if isinstance(value, str):
514
+ return int(md5(f'"{value}"'.encode()).hexdigest(), 16)
515
+ if isinstance(value, (tuple, list)):
516
+ # Hash tuples by hashing each element.
517
+ return _deterministic_hash(
518
+ "[" + ",".join(map(str, map(_deterministic_hash, value))) + "]"
519
+ )
520
+ if isinstance(value, enum.Enum):
521
+ # Hash enums by their name.
522
+ return _deterministic_hash(str(value))
523
+ if value is None:
524
+ # Hash None as a special case.
525
+ return _deterministic_hash("None")
526
+
527
+ msg = (
528
+ f"Cannot hash value `{value}` of type `{type(value).__name__}`. "
529
+ "Only BaseComponent, Var, VarData, dict, str, tuple, and enum.Enum are supported."
530
+ )
531
+ raise TypeError(msg)
532
+
533
+
482
534
  DEFAULT_TRIGGERS: Mapping[str, types.ArgsSpec | Sequence[types.ArgsSpec]] = {
483
535
  EventTriggers.ON_FOCUS: no_args_event_spec,
484
536
  EventTriggers.ON_BLUR: no_args_event_spec,
@@ -2430,7 +2482,7 @@ class StatefulComponent(BaseComponent):
2430
2482
  return None
2431
2483
 
2432
2484
  # Compute the hash based on the rendered code.
2433
- code_hash = md5(str(rendered_code).encode("utf-8")).hexdigest()
2485
+ code_hash = _deterministic_hash(rendered_code)
2434
2486
 
2435
2487
  # Format the tag name including the hash.
2436
2488
  return format.format_state_name(
@@ -50,7 +50,7 @@ upload_files_context_var_data: VarData = VarData(
50
50
  )
51
51
 
52
52
 
53
- def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> Var:
53
+ def upload_file(id_: str | Var[str] = DEFAULT_UPLOAD_ID) -> Var:
54
54
  """Get the file upload drop trigger.
55
55
 
56
56
  This var is passed to the dropzone component to update the file list when a
@@ -62,7 +62,7 @@ def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> Var:
62
62
  Returns:
63
63
  A var referencing the file upload drop trigger.
64
64
  """
65
- id_var = LiteralStringVar.create(id_)
65
+ id_var = LiteralStringVar.create(id_) if not isinstance(id_, Var) else id_
66
66
  var_name = f"""e => setFilesById(filesById => {{
67
67
  const updatedFilesById = Object.assign({{}}, filesById);
68
68
  updatedFilesById[{id_var!s}] = e;
@@ -79,7 +79,7 @@ def upload_file(id_: str = DEFAULT_UPLOAD_ID) -> Var:
79
79
  )
80
80
 
81
81
 
82
- def selected_files(id_: str = DEFAULT_UPLOAD_ID) -> Var:
82
+ def selected_files(id_: str | Var[str] = DEFAULT_UPLOAD_ID) -> Var:
83
83
  """Get the list of selected files.
84
84
 
85
85
  Args:
@@ -88,9 +88,9 @@ def selected_files(id_: str = DEFAULT_UPLOAD_ID) -> Var:
88
88
  Returns:
89
89
  A var referencing the list of selected file paths.
90
90
  """
91
- id_var = LiteralStringVar.create(id_)
91
+ id_var = LiteralStringVar.create(id_) if not isinstance(id_, Var) else id_
92
92
  return Var(
93
- _js_expr=f"(filesById[{id_var!s}] ? filesById[{id_var!s}].map((f) => (f.path || f.name)) : [])",
93
+ _js_expr=f"(filesById[{id_var!s}] ? filesById[{id_var!s}].map((f) => f.name) : [])",
94
94
  _var_type=list[str],
95
95
  _var_data=VarData.merge(
96
96
  upload_files_context_var_data, id_var._get_all_var_data()
@@ -8,11 +8,17 @@ from . import elements
8
8
 
9
9
  _SUBMODULES: set[str] = {"elements"}
10
10
  _SUBMOD_ATTRS: dict[str, list[str]] = {
11
- f"elements.{k}": v for k, v in elements._MAPPING.items()
11
+ # rx.el.a is replaced by React Router's Link.
12
+ f"elements.{k}": [_v for _v in v if _v != "a"]
13
+ for k, v in elements._MAPPING.items()
14
+ }
15
+ _EXTRA_MAPPINGS: dict[str, str] = {
16
+ "a": "reflex.components.react_router.link",
12
17
  }
13
18
 
14
19
  __getattr__, __dir__, __all__ = lazy_loader.attach(
15
20
  __name__,
16
21
  submodules=_SUBMODULES,
17
22
  submod_attrs=_SUBMOD_ATTRS,
23
+ **_EXTRA_MAPPINGS,
18
24
  )
@@ -14,6 +14,7 @@ from reflex.components.core.cond import cond
14
14
  from reflex.components.el.elements.inline import A
15
15
  from reflex.components.markdown.markdown import MarkdownComponentMap
16
16
  from reflex.components.radix.themes.base import LiteralAccentColor, RadixThemesComponent
17
+ from reflex.components.react_router.dom import ReactRouterLink
17
18
  from reflex.utils.imports import ImportDict, ImportVar
18
19
  from reflex.vars.base import Var
19
20
 
@@ -21,36 +22,6 @@ from .base import LiteralTextSize, LiteralTextTrim, LiteralTextWeight
21
22
 
22
23
  LiteralLinkUnderline = Literal["auto", "hover", "always", "none"]
23
24
 
24
- LiteralLinkDiscover = Literal["none", "render"]
25
-
26
-
27
- class ReactRouterLink(A):
28
- """Links are accessible elements used primarily for navigation. This component is styled to resemble a hyperlink and semantically renders an <a>."""
29
-
30
- library = "react-router"
31
-
32
- tag = "Link"
33
-
34
- alias = "ReactRouterLink"
35
-
36
- # The page to link to.
37
- to: Var[str]
38
-
39
- # Replaces the current entry in the history stack instead of pushing a new one onto it.
40
- replace: Var[bool]
41
-
42
- # Will use document navigation instead of client side routing when the link is clicked: the browser will handle the transition normally (as if it were an <a href>).
43
- reload_document: Var[bool]
44
-
45
- # Prevents the scroll position from being reset to the top of the window when the link is clicked and the app is using ScrollRestoration. This only prevents new locations resetting scroll to the top, scroll position will be restored for back/forward button navigation.
46
- prevent_scroll_reset: Var[bool]
47
-
48
- # Defines the link discovery behavior
49
- discover: Var[LiteralLinkDiscover]
50
-
51
- # Enables a View Transition for this navigation.
52
- view_transition: Var[bool]
53
-
54
25
 
55
26
  _KNOWN_REACT_ROUTER_LINK_PROPS = frozenset(ReactRouterLink.get_props())
56
27
 
@@ -0,0 +1,5 @@
1
+ """React-router internal components."""
2
+
3
+ from .dom import ReactRouterLink
4
+
5
+ link = ReactRouterLink.create
@@ -0,0 +1,69 @@
1
+ """Components for client side navigation within React Router applications."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import ClassVar, Literal, TypedDict
6
+
7
+ from reflex.components.el.elements.inline import A
8
+ from reflex.vars.base import Var
9
+
10
+ LiteralLinkDiscover = Literal["none", "render"]
11
+
12
+
13
+ class To(TypedDict):
14
+ """Structured object for navigating via the `to` prop."""
15
+
16
+ # A URL pathname, beginning with a /
17
+ pathname: str
18
+
19
+ # A URL search string, beginning with a ?.
20
+ search: str
21
+
22
+ # A URL fragment identifier, beginning with a #.
23
+ hash: str
24
+
25
+
26
+ class ReactRouterLink(A):
27
+ """Links are accessible elements used primarily for navigation. This component is styled to resemble a hyperlink and semantically renders an <a>."""
28
+
29
+ library = "react-router"
30
+
31
+ tag = "Link"
32
+
33
+ alias = "ReactRouterLink"
34
+
35
+ # The page to link to.
36
+ to: Var[str | To]
37
+
38
+ # Replaces the current entry in the history stack instead of pushing a new one onto it.
39
+ replace: Var[bool]
40
+
41
+ # Will use document navigation instead of client side routing when the link is clicked: the browser will handle the transition normally (as if it were an <a href>).
42
+ reload_document: Var[bool]
43
+
44
+ # Prevents the scroll position from being reset to the top of the window when the link is clicked and the app is using ScrollRestoration. This only prevents new locations resetting scroll to the top, scroll position will be restored for back/forward button navigation.
45
+ prevent_scroll_reset: Var[bool]
46
+
47
+ # Defines the link discovery behavior
48
+ discover: Var[LiteralLinkDiscover]
49
+
50
+ # Enables a View Transition for this navigation.
51
+ view_transition: Var[bool]
52
+
53
+ @classmethod
54
+ def create(cls, *children, **props):
55
+ """Create a ReactRouterLink component for client-side navigation.
56
+
57
+ Args:
58
+ *children: The children of the component.
59
+ **props: The props of the component.
60
+
61
+ Returns:
62
+ The ReactRouterLink component.
63
+ """
64
+ # React Router special behavior is triggered on the `to` prop, not href.
65
+ if "to" not in props and "href" in props:
66
+ props["to"] = props.pop("href")
67
+ return super().create(*children, **props)
68
+
69
+ _invalid_children: ClassVar[list[str]] = ["A", "ReactRouterLink"]
@@ -8,7 +8,7 @@ from reflex.components.component import Component, MemoizationLeaf, NoSSRCompone
8
8
  class Recharts(Component):
9
9
  """A component that wraps a recharts lib."""
10
10
 
11
- library = "recharts@3.0.0"
11
+ library = "recharts@3.0.2"
12
12
 
13
13
  def _get_style(self) -> dict:
14
14
  return {"wrapperStyle": self.style}
@@ -17,7 +17,7 @@ class Recharts(Component):
17
17
  class RechartsCharts(NoSSRComponent, MemoizationLeaf):
18
18
  """A component that wraps a recharts lib."""
19
19
 
20
- library = "recharts@3.0.0"
20
+ library = "recharts@3.0.2"
21
21
 
22
22
 
23
23
  LiteralAnimationEasing = Literal["ease", "ease-in", "ease-out", "ease-in-out", "linear"]
@@ -75,7 +75,7 @@ fetch-retries=0
75
75
 
76
76
 
77
77
  def _determine_react_router_version() -> str:
78
- default_version = "7.6.2"
78
+ default_version = "7.6.3"
79
79
  if (version := os.getenv("REACT_ROUTER_VERSION")) and version != default_version:
80
80
  from reflex.utils import console
81
81
 
@@ -143,7 +143,7 @@ class PackageJson(SimpleNamespace):
143
143
  "postcss-import": "16.1.1",
144
144
  "@react-router/dev": _react_router_version,
145
145
  "@react-router/fs-routes": _react_router_version,
146
- "rolldown-vite": "7.0.1",
146
+ "rolldown-vite": "7.0.3",
147
147
  }
148
148
  OVERRIDES = {
149
149
  # This should always match the `react` version in DEPENDENCIES for recharts compatibility.
@@ -5,6 +5,7 @@ from __future__ import annotations
5
5
  import concurrent.futures
6
6
  import dataclasses
7
7
  import enum
8
+ import importlib
8
9
  import inspect
9
10
  import multiprocessing
10
11
  import os
@@ -24,6 +25,7 @@ from typing import (
24
25
  )
25
26
 
26
27
  from reflex import constants
28
+ from reflex.plugins import Plugin
27
29
  from reflex.utils.exceptions import EnvironmentVarValueError
28
30
  from reflex.utils.types import GenericType, is_union, value_inside_optional
29
31
 
@@ -126,6 +128,48 @@ def interpret_path_env(value: str, field_name: str) -> Path:
126
128
  return Path(value)
127
129
 
128
130
 
131
+ def interpret_plugin_env(value: str, field_name: str) -> Plugin:
132
+ """Interpret a plugin environment variable value.
133
+
134
+ Args:
135
+ value: The environment variable value.
136
+ field_name: The field name.
137
+
138
+ Returns:
139
+ The interpreted value.
140
+
141
+ Raises:
142
+ EnvironmentVarValueError: If the value is invalid.
143
+ """
144
+ if "." not in value:
145
+ msg = f"Invalid plugin value: {value!r} for {field_name}. Plugin name must be in the format 'package.module.PluginName'."
146
+ raise EnvironmentVarValueError(msg)
147
+
148
+ import_path, plugin_name = value.rsplit(".", 1)
149
+
150
+ try:
151
+ module = importlib.import_module(import_path)
152
+ except ImportError as e:
153
+ msg = f"Failed to import module {import_path!r} for {field_name}: {e}"
154
+ raise EnvironmentVarValueError(msg) from e
155
+
156
+ try:
157
+ plugin_class = getattr(module, plugin_name, None)
158
+ except Exception as e:
159
+ msg = f"Failed to get plugin class {plugin_name!r} from module {import_path!r} for {field_name}: {e}"
160
+ raise EnvironmentVarValueError(msg) from e
161
+
162
+ if not inspect.isclass(plugin_class) or not issubclass(plugin_class, Plugin):
163
+ msg = f"Invalid plugin class: {plugin_name!r} for {field_name}. Must be a subclass of Plugin."
164
+ raise EnvironmentVarValueError(msg)
165
+
166
+ try:
167
+ return plugin_class()
168
+ except Exception as e:
169
+ msg = f"Failed to instantiate plugin {plugin_name!r} for {field_name}: {e}"
170
+ raise EnvironmentVarValueError(msg) from e
171
+
172
+
129
173
  def interpret_enum_env(value: str, field_type: GenericType, field_name: str) -> Any:
130
174
  """Interpret an enum environment variable value.
131
175
 
@@ -181,6 +225,8 @@ def interpret_env_var_value(
181
225
  return interpret_path_env(value, field_name)
182
226
  if field_type is ExistingPath:
183
227
  return interpret_existing_path_env(value, field_name)
228
+ if field_type is Plugin:
229
+ return interpret_plugin_env(value, field_name)
184
230
  if get_origin(field_type) is list:
185
231
  return [
186
232
  interpret_env_var_value(