reflex 0.8.8a1__tar.gz → 0.8.9a1__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 (387) hide show
  1. {reflex-0.8.8a1 → reflex-0.8.9a1}/PKG-INFO +1 -1
  2. {reflex-0.8.8a1 → reflex-0.8.9a1}/pyproject.toml +2 -2
  3. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/utils/state.js +5 -5
  4. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/app.py +17 -7
  5. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/compiler/compiler.py +2 -2
  6. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/compiler/templates.py +23 -7
  7. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/compiler/utils.py +8 -5
  8. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/component.py +65 -35
  9. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/media.py +518 -0
  10. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/lucide/icon.py +4 -1
  11. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/lucide/icon.pyi +1 -1
  12. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/drawer.py +9 -21
  13. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/drawer.pyi +4 -0
  14. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/config.py +1 -1
  15. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/compiler.py +1 -1
  16. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/installer.py +4 -4
  17. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/environment.py +8 -3
  18. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/event.py +1 -1
  19. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/istate/data.py +15 -0
  20. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/plugins/sitemap.py +3 -6
  21. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/reflex.py +8 -2
  22. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/state.py +46 -6
  23. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/testing.py +1 -1
  24. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/console.py +67 -7
  25. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/format.py +1 -1
  26. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/frontend_skeleton.py +6 -1
  27. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/imports.py +1 -1
  28. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/prerequisites.py +3 -1
  29. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/pyi_generator.py +2 -2
  30. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/serializers.py +4 -4
  31. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/types.py +7 -10
  32. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/base.py +24 -17
  33. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/object.py +4 -2
  34. {reflex-0.8.8a1 → reflex-0.8.9a1}/.gitignore +0 -0
  35. {reflex-0.8.8a1 → reflex-0.8.9a1}/LICENSE +0 -0
  36. {reflex-0.8.8a1 → reflex-0.8.9a1}/README.md +0 -0
  37. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  38. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  39. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/apps/blank/code/blank.py +0 -0
  40. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/.gitignore +0 -0
  41. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/app/entry.client.js +0 -0
  42. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/app/routes.js +0 -0
  43. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  44. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/components/shiki/code.js +0 -0
  45. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/jsconfig.json +0 -0
  46. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/postcss.config.js +0 -0
  47. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/react-router.config.js +0 -0
  48. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  49. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  50. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  51. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  52. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/utils/helpers/range.js +0 -0
  53. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  54. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/utils/react-theme.js +0 -0
  55. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
  56. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/__init__.py +0 -0
  57. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/__init__.pyi +0 -0
  58. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/__main__.py +0 -0
  59. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/admin.py +0 -0
  60. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/app_mixins/__init__.py +0 -0
  61. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/app_mixins/lifespan.py +0 -0
  62. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/app_mixins/middleware.py +0 -0
  63. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/app_mixins/mixin.py +0 -0
  64. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/assets.py +0 -0
  65. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/base.py +0 -0
  66. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/compiler/__init__.py +0 -0
  67. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/__init__.py +0 -0
  68. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/__init__.pyi +0 -0
  69. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/__init__.py +0 -0
  70. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/__init__.pyi +0 -0
  71. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/app_wrap.py +0 -0
  72. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/app_wrap.pyi +0 -0
  73. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/bare.py +0 -0
  74. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/body.py +0 -0
  75. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/body.pyi +0 -0
  76. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/document.py +0 -0
  77. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/document.pyi +0 -0
  78. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/error_boundary.py +0 -0
  79. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/error_boundary.pyi +0 -0
  80. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/fragment.py +0 -0
  81. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/fragment.pyi +0 -0
  82. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/link.py +0 -0
  83. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/link.pyi +0 -0
  84. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/meta.py +0 -0
  85. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/meta.pyi +0 -0
  86. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/script.py +0 -0
  87. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/script.pyi +0 -0
  88. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/strict_mode.py +0 -0
  89. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/base/strict_mode.pyi +0 -0
  90. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/__init__.py +0 -0
  91. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/__init__.pyi +0 -0
  92. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/auto_scroll.py +0 -0
  93. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/auto_scroll.pyi +0 -0
  94. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/banner.py +0 -0
  95. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/banner.pyi +0 -0
  96. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/breakpoints.py +0 -0
  97. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/clipboard.py +0 -0
  98. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/clipboard.pyi +0 -0
  99. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/colors.py +0 -0
  100. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/cond.py +0 -0
  101. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/debounce.py +0 -0
  102. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/debounce.pyi +0 -0
  103. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/foreach.py +0 -0
  104. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/helmet.py +0 -0
  105. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/helmet.pyi +0 -0
  106. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/html.py +0 -0
  107. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/html.pyi +0 -0
  108. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/layout/__init__.py +0 -0
  109. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/match.py +0 -0
  110. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/responsive.py +0 -0
  111. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/sticky.py +0 -0
  112. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/sticky.pyi +0 -0
  113. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/upload.py +0 -0
  114. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/upload.pyi +0 -0
  115. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/window_events.py +0 -0
  116. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/core/window_events.pyi +0 -0
  117. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/__init__.py +0 -0
  118. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/__init__.pyi +0 -0
  119. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/code.py +0 -0
  120. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/code.pyi +0 -0
  121. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/dataeditor.py +0 -0
  122. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  123. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/logo.py +0 -0
  124. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  125. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  126. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/dynamic.py +0 -0
  127. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/__init__.py +0 -0
  128. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/__init__.pyi +0 -0
  129. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/element.py +0 -0
  130. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/element.pyi +0 -0
  131. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/__init__.py +0 -0
  132. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/__init__.pyi +0 -0
  133. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/base.py +0 -0
  134. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/base.pyi +0 -0
  135. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/forms.py +0 -0
  136. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/forms.pyi +0 -0
  137. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/inline.py +0 -0
  138. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/inline.pyi +0 -0
  139. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/media.pyi +0 -0
  140. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/metadata.py +0 -0
  141. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/metadata.pyi +0 -0
  142. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/other.py +0 -0
  143. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/other.pyi +0 -0
  144. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/scripts.py +0 -0
  145. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/scripts.pyi +0 -0
  146. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/sectioning.py +0 -0
  147. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/sectioning.pyi +0 -0
  148. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/tables.py +0 -0
  149. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/tables.pyi +0 -0
  150. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/typography.py +0 -0
  151. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/el/elements/typography.pyi +0 -0
  152. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/field.py +0 -0
  153. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/gridjs/__init__.py +0 -0
  154. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/gridjs/datatable.py +0 -0
  155. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/gridjs/datatable.pyi +0 -0
  156. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/literals.py +0 -0
  157. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/lucide/__init__.py +0 -0
  158. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/markdown/__init__.py +0 -0
  159. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/markdown/markdown.py +0 -0
  160. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/markdown/markdown.pyi +0 -0
  161. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/moment/__init__.py +0 -0
  162. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/moment/moment.py +0 -0
  163. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/moment/moment.pyi +0 -0
  164. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/plotly/__init__.py +0 -0
  165. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/plotly/plotly.py +0 -0
  166. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/plotly/plotly.pyi +0 -0
  167. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/props.py +0 -0
  168. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/__init__.py +0 -0
  169. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/__init__.pyi +0 -0
  170. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/__init__.py +0 -0
  171. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/__init__.pyi +0 -0
  172. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/accordion.py +0 -0
  173. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/accordion.pyi +0 -0
  174. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/base.py +0 -0
  175. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/base.pyi +0 -0
  176. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/form.py +0 -0
  177. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/form.pyi +0 -0
  178. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/progress.py +0 -0
  179. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/progress.pyi +0 -0
  180. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/slider.py +0 -0
  181. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/primitives/slider.pyi +0 -0
  182. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/__init__.py +0 -0
  183. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/__init__.pyi +0 -0
  184. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/base.py +0 -0
  185. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/base.pyi +0 -0
  186. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/color_mode.py +0 -0
  187. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/color_mode.pyi +0 -0
  188. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/__init__.py +0 -0
  189. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  190. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  191. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  192. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  193. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  194. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/avatar.py +0 -0
  195. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  196. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/badge.py +0 -0
  197. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/badge.pyi +0 -0
  198. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/button.py +0 -0
  199. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/button.pyi +0 -0
  200. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/callout.py +0 -0
  201. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/callout.pyi +0 -0
  202. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/card.py +0 -0
  203. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/card.pyi +0 -0
  204. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/checkbox.py +0 -0
  205. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  206. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  207. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  208. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  209. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  210. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/context_menu.py +0 -0
  211. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  212. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/data_list.py +0 -0
  213. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  214. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/dialog.py +0 -0
  215. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  216. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  217. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  218. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/hover_card.py +0 -0
  219. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  220. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/icon_button.py +0 -0
  221. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  222. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/inset.py +0 -0
  223. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/inset.pyi +0 -0
  224. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/popover.py +0 -0
  225. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/popover.pyi +0 -0
  226. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/progress.py +0 -0
  227. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/progress.pyi +0 -0
  228. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/radio.py +0 -0
  229. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/radio.pyi +0 -0
  230. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  231. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  232. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/radio_group.py +0 -0
  233. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  234. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  235. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  236. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  237. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  238. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/select.py +0 -0
  239. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/select.pyi +0 -0
  240. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/separator.py +0 -0
  241. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/separator.pyi +0 -0
  242. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/skeleton.py +0 -0
  243. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  244. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/slider.py +0 -0
  245. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/slider.pyi +0 -0
  246. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/spinner.py +0 -0
  247. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  248. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/switch.py +0 -0
  249. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/switch.pyi +0 -0
  250. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/table.py +0 -0
  251. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/table.pyi +0 -0
  252. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/tabs.py +0 -0
  253. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  254. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/text_area.py +0 -0
  255. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  256. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/text_field.py +0 -0
  257. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  258. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/tooltip.py +0 -0
  259. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  260. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/__init__.py +0 -0
  261. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  262. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/base.py +0 -0
  263. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/base.pyi +0 -0
  264. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/box.py +0 -0
  265. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/box.pyi +0 -0
  266. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/center.py +0 -0
  267. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/center.pyi +0 -0
  268. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/container.py +0 -0
  269. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/container.pyi +0 -0
  270. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/flex.py +0 -0
  271. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  272. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/grid.py +0 -0
  273. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  274. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/list.py +0 -0
  275. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/list.pyi +0 -0
  276. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/section.py +0 -0
  277. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/section.pyi +0 -0
  278. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/spacer.py +0 -0
  279. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  280. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/stack.py +0 -0
  281. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  282. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/__init__.py +0 -0
  283. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  284. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/base.py +0 -0
  285. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  286. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  287. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/code.py +0 -0
  288. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/code.pyi +0 -0
  289. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/heading.py +0 -0
  290. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  291. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/link.py +0 -0
  292. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/link.pyi +0 -0
  293. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/text.py +0 -0
  294. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/radix/themes/typography/text.pyi +0 -0
  295. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_player/__init__.py +0 -0
  296. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_player/audio.py +0 -0
  297. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_player/audio.pyi +0 -0
  298. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_player/react_player.py +0 -0
  299. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_player/react_player.pyi +0 -0
  300. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_player/video.py +0 -0
  301. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_player/video.pyi +0 -0
  302. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_router/__init__.py +0 -0
  303. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_router/dom.py +0 -0
  304. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/react_router/dom.pyi +0 -0
  305. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/__init__.py +0 -0
  306. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/__init__.pyi +0 -0
  307. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/cartesian.py +0 -0
  308. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/cartesian.pyi +0 -0
  309. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/charts.py +0 -0
  310. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/charts.pyi +0 -0
  311. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/general.py +0 -0
  312. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/general.pyi +0 -0
  313. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/polar.py +0 -0
  314. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/polar.pyi +0 -0
  315. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/recharts.py +0 -0
  316. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/recharts/recharts.pyi +0 -0
  317. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/sonner/__init__.py +0 -0
  318. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/sonner/toast.py +0 -0
  319. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/sonner/toast.pyi +0 -0
  320. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/tags/__init__.py +0 -0
  321. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/tags/cond_tag.py +0 -0
  322. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/tags/iter_tag.py +0 -0
  323. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/tags/match_tag.py +0 -0
  324. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/tags/tag.py +0 -0
  325. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/components/tags/tagless.py +0 -0
  326. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/__init__.py +0 -0
  327. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/base.py +0 -0
  328. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/colors.py +0 -0
  329. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/config.py +0 -0
  330. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/custom_components.py +0 -0
  331. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/event.py +0 -0
  332. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/route.py +0 -0
  333. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/state.py +0 -0
  334. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/constants/utils.py +0 -0
  335. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/custom_components/__init__.py +0 -0
  336. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/custom_components/custom_components.py +0 -0
  337. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/experimental/__init__.py +0 -0
  338. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/experimental/client_state.py +0 -0
  339. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/experimental/hooks.py +0 -0
  340. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/istate/__init__.py +0 -0
  341. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/istate/dynamic.py +0 -0
  342. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/istate/manager.py +0 -0
  343. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/istate/proxy.py +0 -0
  344. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/istate/storage.py +0 -0
  345. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/istate/wrappers.py +0 -0
  346. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/middleware/__init__.py +0 -0
  347. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/middleware/hydrate_middleware.py +0 -0
  348. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/middleware/middleware.py +0 -0
  349. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/model.py +0 -0
  350. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/page.py +0 -0
  351. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/plugins/__init__.py +0 -0
  352. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/plugins/_screenshot.py +0 -0
  353. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/plugins/base.py +0 -0
  354. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/plugins/shared_tailwind.py +0 -0
  355. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/plugins/tailwind_v3.py +0 -0
  356. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/plugins/tailwind_v4.py +0 -0
  357. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/py.typed +0 -0
  358. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/route.py +0 -0
  359. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/style.py +0 -0
  360. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/__init__.py +0 -0
  361. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/build.py +0 -0
  362. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/codespaces.py +0 -0
  363. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/compat.py +0 -0
  364. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/decorator.py +0 -0
  365. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/exceptions.py +0 -0
  366. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/exec.py +0 -0
  367. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/export.py +0 -0
  368. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/js_runtimes.py +0 -0
  369. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/lazy_loader.py +0 -0
  370. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/misc.py +0 -0
  371. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/monitoring.py +0 -0
  372. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/net.py +0 -0
  373. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/path_ops.py +0 -0
  374. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/processes.py +0 -0
  375. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/redir.py +0 -0
  376. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/registry.py +0 -0
  377. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/rename.py +0 -0
  378. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/telemetry.py +0 -0
  379. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/templates.py +0 -0
  380. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/utils/token_manager.py +0 -0
  381. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/__init__.py +0 -0
  382. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/datetime.py +0 -0
  383. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/dep_tracking.py +0 -0
  384. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/function.py +0 -0
  385. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/number.py +0 -0
  386. {reflex-0.8.8a1 → reflex-0.8.9a1}/reflex/vars/sequence.py +0 -0
  387. {reflex-0.8.8a1 → reflex-0.8.9a1}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.8a1
3
+ Version: 0.8.9a1
4
4
  Summary: Web apps in pure Python.
5
5
  Project-URL: homepage, https://reflex.dev
6
6
  Project-URL: repository, https://github.com/reflex-dev/reflex
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.8.8a1"
3
+ version = "0.8.9a1"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -232,7 +232,7 @@ fail_fast = true
232
232
 
233
233
  [[tool.pre-commit.repos]]
234
234
  repo = "https://github.com/astral-sh/ruff-pre-commit"
235
- rev = "v0.12.9"
235
+ rev = "v0.12.10"
236
236
  hooks = [
237
237
  { id = "ruff-format", args = [
238
238
  "reflex",
@@ -415,7 +415,7 @@ export const applyRestEvent = async (event, socket, navigate, params) => {
415
415
  if (event.payload.files === undefined || event.payload.files.length === 0) {
416
416
  // Submit the event over the websocket to trigger the event handler.
417
417
  return await applyEvent(
418
- Event(event.name, { files: [] }),
418
+ ReflexEvent(event.name, { files: [] }),
419
419
  socket,
420
420
  navigate,
421
421
  params,
@@ -775,7 +775,7 @@ export const uploadFiles = async (
775
775
  * @param {string} handler The client handler to process event.
776
776
  * @returns The event object.
777
777
  */
778
- export const Event = (
778
+ export const ReflexEvent = (
779
779
  name,
780
780
  payload = {},
781
781
  event_actions = {},
@@ -987,7 +987,7 @@ export const useEventLoop = (
987
987
 
988
988
  window.onerror = function (msg, url, lineNo, columnNo, error) {
989
989
  addEvents([
990
- Event(`${exception_state_name}.handle_frontend_exception`, {
990
+ ReflexEvent(`${exception_state_name}.handle_frontend_exception`, {
991
991
  info: error.name + ": " + error.message + "\n" + error.stack,
992
992
  component_stack: "",
993
993
  }),
@@ -999,7 +999,7 @@ export const useEventLoop = (
999
999
  //https://github.com/mknichel/javascript-errors?tab=readme-ov-file#promise-rejection-events
1000
1000
  window.onunhandledrejection = function (event) {
1001
1001
  addEvents([
1002
- Event(`${exception_state_name}.handle_frontend_exception`, {
1002
+ ReflexEvent(`${exception_state_name}.handle_frontend_exception`, {
1003
1003
  info:
1004
1004
  event.reason?.name +
1005
1005
  ": " +
@@ -1072,7 +1072,7 @@ export const useEventLoop = (
1072
1072
  if (storage_to_state_map[e.key]) {
1073
1073
  const vars = {};
1074
1074
  vars[storage_to_state_map[e.key]] = e.newValue;
1075
- const event = Event(
1075
+ const event = ReflexEvent(
1076
1076
  `${state_name}.reflex___state____update_vars_internal_state.update_vars_internal`,
1077
1077
  { vars: vars },
1078
1078
  );
@@ -1100,12 +1100,18 @@ class App(MiddlewareMixin, LifespanMixin):
1100
1100
  for substate in state.class_subclasses:
1101
1101
  self._validate_var_dependencies(substate)
1102
1102
 
1103
- def _compile(self, prerender_routes: bool = False, dry_run: bool = False):
1103
+ def _compile(
1104
+ self,
1105
+ prerender_routes: bool = False,
1106
+ dry_run: bool = False,
1107
+ use_rich: bool = True,
1108
+ ):
1104
1109
  """Compile the app and output it to the pages folder.
1105
1110
 
1106
1111
  Args:
1107
1112
  prerender_routes: Whether to prerender the routes.
1108
1113
  dry_run: Whether to compile the app without saving it.
1114
+ use_rich: Whether to use rich progress bars.
1109
1115
 
1110
1116
  Raises:
1111
1117
  ReflexRuntimeError: When any page uses state, but no rx.State subclass is defined.
@@ -1171,10 +1177,14 @@ class App(MiddlewareMixin, LifespanMixin):
1171
1177
  return
1172
1178
 
1173
1179
  # Create a progress bar.
1174
- progress = Progress(
1175
- *Progress.get_default_columns()[:-1],
1176
- MofNCompleteColumn(),
1177
- TimeElapsedColumn(),
1180
+ progress = (
1181
+ Progress(
1182
+ *Progress.get_default_columns()[:-1],
1183
+ MofNCompleteColumn(),
1184
+ TimeElapsedColumn(),
1185
+ )
1186
+ if use_rich
1187
+ else console.PoorProgress()
1178
1188
  )
1179
1189
 
1180
1190
  # try to be somewhat accurate - but still not 100%
@@ -1311,9 +1321,9 @@ class App(MiddlewareMixin, LifespanMixin):
1311
1321
  self.head_components,
1312
1322
  html_lang=self.html_lang,
1313
1323
  html_custom_attrs=(
1314
- {"suppressHydrationWarning": "true", **self.html_custom_attrs}
1324
+ {"suppressHydrationWarning": True, **self.html_custom_attrs}
1315
1325
  if self.html_custom_attrs
1316
- else {"suppressHydrationWarning": "true"}
1326
+ else {"suppressHydrationWarning": True}
1317
1327
  ),
1318
1328
  )
1319
1329
  )
@@ -6,7 +6,7 @@ import sys
6
6
  from collections.abc import Callable, Iterable, Sequence
7
7
  from inspect import getmodule
8
8
  from pathlib import Path
9
- from typing import TYPE_CHECKING
9
+ from typing import TYPE_CHECKING, Any
10
10
 
11
11
  from reflex import constants
12
12
  from reflex.compiler import templates, utils
@@ -465,7 +465,7 @@ def _compile_stateful_components(
465
465
  def compile_document_root(
466
466
  head_components: list[Component],
467
467
  html_lang: str | None = None,
468
- html_custom_attrs: dict[str, Var | str] | None = None,
468
+ html_custom_attrs: dict[str, Var | Any] | None = None,
469
469
  ) -> tuple[str, str]:
470
470
  """Compile the document root.
471
471
 
@@ -303,7 +303,7 @@ export const onLoadInternalEvent = () => {{
303
303
  // But only send the vars if any are actually set in the browser.
304
304
  if (client_storage_vars && Object.keys(client_storage_vars).length !== 0) {{
305
305
  internal_events.push(
306
- Event(
306
+ ReflexEvent(
307
307
  '{state_name}.{constants.CompileVars.UPDATE_VARS_INTERNAL}',
308
308
  {{vars: client_storage_vars}},
309
309
  ),
@@ -312,14 +312,14 @@ export const onLoadInternalEvent = () => {{
312
312
 
313
313
  // `on_load_internal` triggers the correct on_load event(s) for the current page.
314
314
  // If the page does not define any on_load event, this will just set `is_hydrated = true`.
315
- internal_events.push(Event('{state_name}.{constants.CompileVars.ON_LOAD_INTERNAL}'));
315
+ internal_events.push(ReflexEvent('{state_name}.{constants.CompileVars.ON_LOAD_INTERNAL}'));
316
316
 
317
317
  return internal_events;
318
318
  }}
319
319
 
320
320
  // The following events are sent when the websocket connects or reconnects.
321
321
  export const initialEvents = () => [
322
- Event('{state_name}.{constants.CompileVars.HYDRATE}'),
322
+ ReflexEvent('{state_name}.{constants.CompileVars.HYDRATE}'),
323
323
  ...onLoadInternalEvent()
324
324
  ]
325
325
  """
@@ -351,7 +351,7 @@ export const initialEvents = () => []
351
351
  )
352
352
 
353
353
  return rf"""import {{ createContext, useContext, useMemo, useReducer, useState, createElement, useEffect }} from "react"
354
- import {{ applyDelta, Event, hydrateClientStorage, useEventLoop, refs }} from "$/utils/state"
354
+ import {{ applyDelta, ReflexEvent, hydrateClientStorage, useEventLoop, refs }} from "$/utils/state"
355
355
  import {{ jsx }} from "@emotion/react";
356
356
 
357
357
  export const initialState = {"{}" if not initial_state else json_dumps(initial_state)}
@@ -362,7 +362,7 @@ export const UploadFilesContext = createContext(null);
362
362
  export const DispatchContext = createContext(null);
363
363
  export const StateContexts = {{{state_contexts_str}}};
364
364
  export const EventLoopContext = createContext(null);
365
- export const clientStorage = {"{}" if client_storage is None else json_dumps(client_storage)}
365
+ export const clientStorage = {"{}" if client_storage is None else json.dumps(client_storage)}
366
366
 
367
367
  {state_str}
368
368
 
@@ -502,11 +502,13 @@ def package_json_template(
502
502
  )
503
503
 
504
504
 
505
- def vite_config_template(base: str):
505
+ def vite_config_template(base: str, hmr: bool, force_full_reload: bool):
506
506
  """Template for vite.config.js.
507
507
 
508
508
  Args:
509
509
  base: The base path for the Vite config.
510
+ hmr: Whether to enable hot module replacement.
511
+ force_full_reload: Whether to force a full reload on changes.
510
512
 
511
513
  Returns:
512
514
  Rendered vite.config.js content as string.
@@ -537,12 +539,25 @@ function alwaysUseReactDomServerNode() {{
537
539
  }};
538
540
  }}
539
541
 
542
+ function fullReload() {{
543
+ return {{
544
+ name: "full-reload",
545
+ enforce: "pre",
546
+ handleHotUpdate({{ server }}) {{
547
+ server.ws.send({{
548
+ type: "full-reload",
549
+ }});
550
+ return [];
551
+ }}
552
+ }};
553
+ }}
554
+
540
555
  export default defineConfig((config) => ({{
541
556
  plugins: [
542
557
  alwaysUseReactDomServerNode(),
543
558
  reactRouter(),
544
559
  safariCacheBustPlugin(),
545
- ],
560
+ ].concat({"[fullReload()]" if force_full_reload else "[]"}),
546
561
  build: {{
547
562
  assetsDir: "{base}assets".slice(1),
548
563
  rollupOptions: {{
@@ -564,6 +579,7 @@ export default defineConfig((config) => ({{
564
579
  }},
565
580
  server: {{
566
581
  port: process.env.PORT,
582
+ hmr: {"true" if hmr else "false"},
567
583
  watch: {{
568
584
  ignored: [
569
585
  "**/.web/backend/**",
@@ -220,10 +220,13 @@ def compile_state(state: type[BaseState]) -> dict:
220
220
 
221
221
  def _compile_client_storage_field(
222
222
  field: Field,
223
- ) -> tuple[
224
- type[Cookie] | type[LocalStorage] | type[SessionStorage] | None,
225
- dict[str, Any] | None,
226
- ]:
223
+ ) -> (
224
+ tuple[
225
+ type[Cookie] | type[LocalStorage] | type[SessionStorage],
226
+ dict[str, Any],
227
+ ]
228
+ | tuple[None, None]
229
+ ):
227
230
  """Compile the given cookie, local_storage or session_storage field.
228
231
 
229
232
  Args:
@@ -350,7 +353,7 @@ def compile_custom_component(
350
353
  def create_document_root(
351
354
  head_components: Sequence[Component] | None = None,
352
355
  html_lang: str | None = None,
353
- html_custom_attrs: dict[str, Var | str] | None = None,
356
+ html_custom_attrs: dict[str, Var | Any] | None = None,
354
357
  ) -> Component:
355
358
  """Create the document root.
356
359
 
@@ -419,7 +419,6 @@ def evaluate_style_namespaces(style: ComponentStyle) -> dict:
419
419
 
420
420
  # Map from component to styling.
421
421
  ComponentStyle = dict[str | type[BaseComponent] | Callable | ComponentNamespace, Any]
422
- ComponentChild = types.PrimitiveType | Var | BaseComponent
423
422
  ComponentChildTypes = (*types.PrimitiveTypes, Var, BaseComponent, type(None))
424
423
 
425
424
 
@@ -480,7 +479,21 @@ def _components_from(
480
479
  return ()
481
480
 
482
481
 
483
- def _deterministic_hash(value: object) -> int:
482
+ def _hash_str(value: str) -> str:
483
+ return md5(f'"{value}"'.encode(), usedforsecurity=False).hexdigest()
484
+
485
+
486
+ def _hash_sequence(value: Sequence) -> str:
487
+ return _hash_str(str([_deterministic_hash(v) for v in value]))
488
+
489
+
490
+ def _hash_dict(value: dict) -> str:
491
+ return _hash_sequence(
492
+ sorted([(k, _deterministic_hash(v)) for k, v in value.items()])
493
+ )
494
+
495
+
496
+ def _deterministic_hash(value: object) -> str:
484
497
  """Hash a rendered dictionary.
485
498
 
486
499
  Args:
@@ -492,37 +505,28 @@ def _deterministic_hash(value: object) -> int:
492
505
  Raises:
493
506
  TypeError: If the value is not hashable.
494
507
  """
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):
508
+ if value is None:
509
+ # Hash None as a special case.
510
+ return "None"
511
+ if isinstance(value, (int, float, enum.Enum)):
509
512
  # Hash numbers and booleans directly.
510
- return int(value)
511
- if isinstance(value, float):
512
- return _deterministic_hash(str(value))
513
+ return str(value)
513
514
  if isinstance(value, str):
514
- return int(md5(f'"{value}"'.encode()).hexdigest(), 16)
515
+ return _hash_str(value)
516
+ if isinstance(value, dict):
517
+ return _hash_dict(value)
515
518
  if isinstance(value, (tuple, list)):
516
519
  # Hash tuples by hashing each element.
517
- return _deterministic_hash(
518
- "[" + ",".join(map(str, map(_deterministic_hash, value))) + "]"
520
+ return _hash_sequence(value)
521
+ if isinstance(value, Var):
522
+ return _hash_str(
523
+ str((value._js_expr, _deterministic_hash(value._get_all_var_data())))
519
524
  )
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")
525
+ if isinstance(value, VarData):
526
+ return _hash_dict(dataclasses.asdict(value))
527
+ if isinstance(value, BaseComponent):
528
+ # If the value is a component, hash its rendered code.
529
+ return _hash_dict(value.render())
526
530
 
527
531
  msg = (
528
532
  f"Cannot hash value `{value}` of type `{type(value).__name__}`. "
@@ -1038,9 +1042,13 @@ class Component(BaseComponent, ABC):
1038
1042
  name
1039
1043
  for name in cls.get_fields()
1040
1044
  if name in cls.get_props()
1041
- and types._issubclass(
1042
- types.value_inside_optional(types.get_field_type(cls, name)), Component
1045
+ and isinstance(
1046
+ field_type := types.value_inside_optional(
1047
+ types.get_field_type(cls, name)
1048
+ ),
1049
+ type,
1043
1050
  )
1051
+ and issubclass(field_type, Component)
1044
1052
  }
1045
1053
 
1046
1054
  def _get_components_in_props(self) -> Sequence[BaseComponent]:
@@ -1508,8 +1516,9 @@ class Component(BaseComponent, ABC):
1508
1516
  Returns:
1509
1517
  A sequence of parent classes that define the method (differently than the base).
1510
1518
  """
1519
+ current_class_method = getattr(Component, method, None)
1511
1520
  seen_methods = (
1512
- {getattr(Component, method)} if hasattr(Component, method) else set()
1521
+ {current_class_method} if current_class_method is not None else set()
1513
1522
  )
1514
1523
  clzs: list[type[Component]] = []
1515
1524
  for clz in cls.mro():
@@ -1807,7 +1816,7 @@ class Component(BaseComponent, ABC):
1807
1816
 
1808
1817
  # Add the hook code from add_hooks for each parent class (this is reversed to preserve
1809
1818
  # the order of the hooks in the final output)
1810
- for clz in reversed(tuple(self._iter_parent_classes_with_method("add_hooks"))):
1819
+ for clz in reversed(self._iter_parent_classes_with_method("add_hooks")):
1811
1820
  for hook in clz.add_hooks(self):
1812
1821
  if isinstance(hook, Var):
1813
1822
  extract_var_hooks(hook)
@@ -2190,6 +2199,9 @@ def _register_custom_component(
2190
2199
  Args:
2191
2200
  component_fn: The function that creates the component.
2192
2201
 
2202
+ Returns:
2203
+ The custom component.
2204
+
2193
2205
  Raises:
2194
2206
  TypeError: If the tag name cannot be determined.
2195
2207
  """
@@ -2214,6 +2226,7 @@ def _register_custom_component(
2214
2226
  msg = f"Could not determine the tag name for {component_fn!r}"
2215
2227
  raise TypeError(msg)
2216
2228
  CUSTOM_COMPONENTS[dummy_component.tag] = dummy_component
2229
+ return dummy_component
2217
2230
 
2218
2231
 
2219
2232
  def custom_component(
@@ -2237,7 +2250,24 @@ def custom_component(
2237
2250
  )
2238
2251
 
2239
2252
  # Register this component so it can be compiled.
2240
- _register_custom_component(component_fn)
2253
+ dummy_component = _register_custom_component(component_fn)
2254
+ if tag := dummy_component.tag:
2255
+ object.__setattr__(
2256
+ wrapper,
2257
+ "_as_var",
2258
+ lambda: Var(
2259
+ tag,
2260
+ _var_type=type[Component],
2261
+ _var_data=VarData(
2262
+ imports={
2263
+ f"$/{constants.Dirs.UTILS}/components": [ImportVar(tag=tag)],
2264
+ "@emotion/react": [
2265
+ ImportVar(tag="jsx"),
2266
+ ],
2267
+ }
2268
+ ),
2269
+ ),
2270
+ )
2241
2271
 
2242
2272
  return wrapper
2243
2273
 
@@ -2457,7 +2487,7 @@ class StatefulComponent(BaseComponent):
2457
2487
  return None
2458
2488
 
2459
2489
  # Compute the hash based on the rendered code.
2460
- code_hash = _deterministic_hash(rendered_code)
2490
+ code_hash = _hash_str(_deterministic_hash(rendered_code))
2461
2491
 
2462
2492
  # Format the tag name including the hash.
2463
2493
  return format.format_state_name(
@@ -2599,7 +2629,7 @@ class StatefulComponent(BaseComponent):
2599
2629
  memo_name = f"{event_trigger}_{chain_hash}"
2600
2630
 
2601
2631
  # Calculate Var dependencies accessed by the handler for useCallback dep array.
2602
- var_deps = ["addEvents", "Event"]
2632
+ var_deps = ["addEvents", "ReflexEvent"]
2603
2633
 
2604
2634
  # Get deps from event trigger var data.
2605
2635
  var_deps.extend(cls._get_deps_from_event_trigger(event))