reflex 0.8.9a2__tar.gz → 0.8.10__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 (388) hide show
  1. {reflex-0.8.9a2 → reflex-0.8.10}/PKG-INFO +4 -3
  2. {reflex-0.8.9a2 → reflex-0.8.10}/pyproject.toml +13 -15
  3. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +11 -1
  4. reflex-0.8.10/reflex/.templates/web/utils/helpers/upload.js +170 -0
  5. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/utils/state.js +10 -159
  6. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/app.py +9 -0
  7. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/compiler/compiler.py +3 -5
  8. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/compiler/templates.py +1 -6
  9. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/compiler/utils.py +16 -2
  10. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/bare.py +2 -2
  11. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/component.py +23 -23
  12. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/debounce.py +1 -1
  13. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/foreach.py +7 -19
  14. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/upload.py +1 -1
  15. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/dynamic.py +1 -3
  16. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/forms.py +3 -3
  17. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/lucide/icon.py +2 -1
  18. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/lucide/icon.pyi +2 -1
  19. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/environment.py +13 -1
  20. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/event.py +30 -0
  21. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/model.py +4 -0
  22. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/base.py +9 -2
  23. {reflex-0.8.9a2 → reflex-0.8.10}/.gitignore +0 -0
  24. {reflex-0.8.9a2 → reflex-0.8.10}/LICENSE +0 -0
  25. {reflex-0.8.9a2 → reflex-0.8.10}/README.md +0 -0
  26. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  27. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  28. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/apps/blank/code/blank.py +0 -0
  29. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/.gitignore +0 -0
  30. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/app/entry.client.js +0 -0
  31. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/app/routes.js +0 -0
  32. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/components/shiki/code.js +0 -0
  33. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/jsconfig.json +0 -0
  34. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/postcss.config.js +0 -0
  35. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/react-router.config.js +0 -0
  36. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  37. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  38. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  39. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  40. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/utils/helpers/range.js +0 -0
  41. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  42. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/utils/react-theme.js +0 -0
  43. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
  44. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/__init__.py +0 -0
  45. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/__init__.pyi +0 -0
  46. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/__main__.py +0 -0
  47. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/admin.py +0 -0
  48. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/app_mixins/__init__.py +0 -0
  49. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/app_mixins/lifespan.py +0 -0
  50. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/app_mixins/middleware.py +0 -0
  51. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/app_mixins/mixin.py +0 -0
  52. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/assets.py +0 -0
  53. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/base.py +0 -0
  54. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/compiler/__init__.py +0 -0
  55. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/__init__.py +0 -0
  56. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/__init__.pyi +0 -0
  57. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/__init__.py +0 -0
  58. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/__init__.pyi +0 -0
  59. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/app_wrap.py +0 -0
  60. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/app_wrap.pyi +0 -0
  61. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/body.py +0 -0
  62. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/body.pyi +0 -0
  63. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/document.py +0 -0
  64. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/document.pyi +0 -0
  65. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/error_boundary.py +0 -0
  66. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/error_boundary.pyi +0 -0
  67. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/fragment.py +0 -0
  68. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/fragment.pyi +0 -0
  69. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/link.py +0 -0
  70. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/link.pyi +0 -0
  71. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/meta.py +0 -0
  72. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/meta.pyi +0 -0
  73. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/script.py +0 -0
  74. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/script.pyi +0 -0
  75. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/strict_mode.py +0 -0
  76. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/base/strict_mode.pyi +0 -0
  77. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/__init__.py +0 -0
  78. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/__init__.pyi +0 -0
  79. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/auto_scroll.py +0 -0
  80. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/auto_scroll.pyi +0 -0
  81. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/banner.py +0 -0
  82. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/banner.pyi +0 -0
  83. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/breakpoints.py +0 -0
  84. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/clipboard.py +0 -0
  85. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/clipboard.pyi +0 -0
  86. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/colors.py +0 -0
  87. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/cond.py +0 -0
  88. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/debounce.pyi +0 -0
  89. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/helmet.py +0 -0
  90. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/helmet.pyi +0 -0
  91. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/html.py +0 -0
  92. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/html.pyi +0 -0
  93. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/layout/__init__.py +0 -0
  94. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/match.py +0 -0
  95. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/responsive.py +0 -0
  96. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/sticky.py +0 -0
  97. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/sticky.pyi +0 -0
  98. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/upload.pyi +0 -0
  99. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/window_events.py +0 -0
  100. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/core/window_events.pyi +0 -0
  101. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/__init__.py +0 -0
  102. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/__init__.pyi +0 -0
  103. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/code.py +0 -0
  104. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/code.pyi +0 -0
  105. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/dataeditor.py +0 -0
  106. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  107. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/logo.py +0 -0
  108. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  109. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  110. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/__init__.py +0 -0
  111. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/__init__.pyi +0 -0
  112. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/element.py +0 -0
  113. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/element.pyi +0 -0
  114. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/__init__.py +0 -0
  115. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/__init__.pyi +0 -0
  116. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/base.py +0 -0
  117. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/base.pyi +0 -0
  118. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/forms.pyi +0 -0
  119. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/inline.py +0 -0
  120. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/inline.pyi +0 -0
  121. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/media.py +0 -0
  122. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/media.pyi +0 -0
  123. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/metadata.py +0 -0
  124. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/metadata.pyi +0 -0
  125. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/other.py +0 -0
  126. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/other.pyi +0 -0
  127. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/scripts.py +0 -0
  128. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/scripts.pyi +0 -0
  129. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/sectioning.py +0 -0
  130. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/sectioning.pyi +0 -0
  131. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/tables.py +0 -0
  132. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/tables.pyi +0 -0
  133. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/typography.py +0 -0
  134. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/el/elements/typography.pyi +0 -0
  135. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/field.py +0 -0
  136. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/gridjs/__init__.py +0 -0
  137. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/gridjs/datatable.py +0 -0
  138. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/gridjs/datatable.pyi +0 -0
  139. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/literals.py +0 -0
  140. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/lucide/__init__.py +0 -0
  141. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/markdown/__init__.py +0 -0
  142. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/markdown/markdown.py +0 -0
  143. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/markdown/markdown.pyi +0 -0
  144. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/moment/__init__.py +0 -0
  145. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/moment/moment.py +0 -0
  146. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/moment/moment.pyi +0 -0
  147. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/plotly/__init__.py +0 -0
  148. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/plotly/plotly.py +0 -0
  149. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/plotly/plotly.pyi +0 -0
  150. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/props.py +0 -0
  151. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/__init__.py +0 -0
  152. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/__init__.pyi +0 -0
  153. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/__init__.py +0 -0
  154. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/__init__.pyi +0 -0
  155. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/accordion.py +0 -0
  156. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/accordion.pyi +0 -0
  157. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/base.py +0 -0
  158. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/base.pyi +0 -0
  159. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/drawer.py +0 -0
  160. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/drawer.pyi +0 -0
  161. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/form.py +0 -0
  162. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/form.pyi +0 -0
  163. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/progress.py +0 -0
  164. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/progress.pyi +0 -0
  165. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/slider.py +0 -0
  166. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/primitives/slider.pyi +0 -0
  167. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/__init__.py +0 -0
  168. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/__init__.pyi +0 -0
  169. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/base.py +0 -0
  170. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/base.pyi +0 -0
  171. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/color_mode.py +0 -0
  172. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/color_mode.pyi +0 -0
  173. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/__init__.py +0 -0
  174. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  175. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  176. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  177. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  178. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  179. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/avatar.py +0 -0
  180. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  181. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/badge.py +0 -0
  182. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/badge.pyi +0 -0
  183. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/button.py +0 -0
  184. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/button.pyi +0 -0
  185. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/callout.py +0 -0
  186. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/callout.pyi +0 -0
  187. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/card.py +0 -0
  188. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/card.pyi +0 -0
  189. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/checkbox.py +0 -0
  190. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  191. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  192. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  193. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  194. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  195. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/context_menu.py +0 -0
  196. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  197. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/data_list.py +0 -0
  198. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  199. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/dialog.py +0 -0
  200. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  201. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  202. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  203. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/hover_card.py +0 -0
  204. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  205. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/icon_button.py +0 -0
  206. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  207. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/inset.py +0 -0
  208. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/inset.pyi +0 -0
  209. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/popover.py +0 -0
  210. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/popover.pyi +0 -0
  211. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/progress.py +0 -0
  212. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/progress.pyi +0 -0
  213. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/radio.py +0 -0
  214. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/radio.pyi +0 -0
  215. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  216. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  217. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/radio_group.py +0 -0
  218. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  219. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  220. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  221. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  222. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  223. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/select.py +0 -0
  224. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/select.pyi +0 -0
  225. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/separator.py +0 -0
  226. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/separator.pyi +0 -0
  227. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/skeleton.py +0 -0
  228. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  229. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/slider.py +0 -0
  230. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/slider.pyi +0 -0
  231. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/spinner.py +0 -0
  232. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  233. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/switch.py +0 -0
  234. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/switch.pyi +0 -0
  235. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/table.py +0 -0
  236. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/table.pyi +0 -0
  237. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/tabs.py +0 -0
  238. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  239. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/text_area.py +0 -0
  240. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  241. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/text_field.py +0 -0
  242. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  243. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/tooltip.py +0 -0
  244. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  245. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/__init__.py +0 -0
  246. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  247. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/base.py +0 -0
  248. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/base.pyi +0 -0
  249. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/box.py +0 -0
  250. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/box.pyi +0 -0
  251. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/center.py +0 -0
  252. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/center.pyi +0 -0
  253. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/container.py +0 -0
  254. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/container.pyi +0 -0
  255. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/flex.py +0 -0
  256. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  257. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/grid.py +0 -0
  258. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  259. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/list.py +0 -0
  260. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/list.pyi +0 -0
  261. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/section.py +0 -0
  262. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/section.pyi +0 -0
  263. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/spacer.py +0 -0
  264. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  265. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/stack.py +0 -0
  266. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  267. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/__init__.py +0 -0
  268. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  269. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/base.py +0 -0
  270. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  271. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  272. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/code.py +0 -0
  273. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/code.pyi +0 -0
  274. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/heading.py +0 -0
  275. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  276. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/link.py +0 -0
  277. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/link.pyi +0 -0
  278. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/text.py +0 -0
  279. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/radix/themes/typography/text.pyi +0 -0
  280. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_player/__init__.py +0 -0
  281. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_player/audio.py +0 -0
  282. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_player/audio.pyi +0 -0
  283. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_player/react_player.py +0 -0
  284. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_player/react_player.pyi +0 -0
  285. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_player/video.py +0 -0
  286. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_player/video.pyi +0 -0
  287. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_router/__init__.py +0 -0
  288. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_router/dom.py +0 -0
  289. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/react_router/dom.pyi +0 -0
  290. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/__init__.py +0 -0
  291. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/__init__.pyi +0 -0
  292. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/cartesian.py +0 -0
  293. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/cartesian.pyi +0 -0
  294. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/charts.py +0 -0
  295. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/charts.pyi +0 -0
  296. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/general.py +0 -0
  297. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/general.pyi +0 -0
  298. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/polar.py +0 -0
  299. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/polar.pyi +0 -0
  300. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/recharts.py +0 -0
  301. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/recharts/recharts.pyi +0 -0
  302. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/sonner/__init__.py +0 -0
  303. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/sonner/toast.py +0 -0
  304. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/sonner/toast.pyi +0 -0
  305. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/tags/__init__.py +0 -0
  306. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/tags/cond_tag.py +0 -0
  307. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/tags/iter_tag.py +0 -0
  308. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/tags/match_tag.py +0 -0
  309. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/tags/tag.py +0 -0
  310. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/components/tags/tagless.py +0 -0
  311. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/config.py +0 -0
  312. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/__init__.py +0 -0
  313. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/base.py +0 -0
  314. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/colors.py +0 -0
  315. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/compiler.py +0 -0
  316. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/config.py +0 -0
  317. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/custom_components.py +0 -0
  318. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/event.py +0 -0
  319. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/installer.py +0 -0
  320. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/route.py +0 -0
  321. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/state.py +0 -0
  322. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/constants/utils.py +0 -0
  323. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/custom_components/__init__.py +0 -0
  324. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/custom_components/custom_components.py +0 -0
  325. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/experimental/__init__.py +0 -0
  326. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/experimental/client_state.py +0 -0
  327. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/experimental/hooks.py +0 -0
  328. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/istate/__init__.py +0 -0
  329. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/istate/data.py +0 -0
  330. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/istate/dynamic.py +0 -0
  331. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/istate/manager.py +0 -0
  332. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/istate/proxy.py +0 -0
  333. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/istate/storage.py +0 -0
  334. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/istate/wrappers.py +0 -0
  335. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/middleware/__init__.py +0 -0
  336. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/middleware/hydrate_middleware.py +0 -0
  337. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/middleware/middleware.py +0 -0
  338. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/page.py +0 -0
  339. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/plugins/__init__.py +0 -0
  340. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/plugins/_screenshot.py +0 -0
  341. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/plugins/base.py +0 -0
  342. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/plugins/shared_tailwind.py +0 -0
  343. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/plugins/sitemap.py +0 -0
  344. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/plugins/tailwind_v3.py +0 -0
  345. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/plugins/tailwind_v4.py +0 -0
  346. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/py.typed +0 -0
  347. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/reflex.py +0 -0
  348. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/route.py +0 -0
  349. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/state.py +0 -0
  350. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/style.py +0 -0
  351. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/testing.py +0 -0
  352. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/__init__.py +0 -0
  353. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/build.py +0 -0
  354. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/codespaces.py +0 -0
  355. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/compat.py +0 -0
  356. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/console.py +0 -0
  357. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/decorator.py +0 -0
  358. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/exceptions.py +0 -0
  359. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/exec.py +0 -0
  360. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/export.py +0 -0
  361. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/format.py +0 -0
  362. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/frontend_skeleton.py +0 -0
  363. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/imports.py +0 -0
  364. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/js_runtimes.py +0 -0
  365. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/lazy_loader.py +0 -0
  366. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/misc.py +0 -0
  367. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/monitoring.py +0 -0
  368. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/net.py +0 -0
  369. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/path_ops.py +0 -0
  370. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/prerequisites.py +0 -0
  371. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/processes.py +0 -0
  372. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/pyi_generator.py +0 -0
  373. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/redir.py +0 -0
  374. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/registry.py +0 -0
  375. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/rename.py +0 -0
  376. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/serializers.py +0 -0
  377. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/telemetry.py +0 -0
  378. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/templates.py +0 -0
  379. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/token_manager.py +0 -0
  380. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/utils/types.py +0 -0
  381. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/__init__.py +0 -0
  382. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/datetime.py +0 -0
  383. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/dep_tracking.py +0 -0
  384. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/function.py +0 -0
  385. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/number.py +0 -0
  386. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/object.py +0 -0
  387. {reflex-0.8.9a2 → reflex-0.8.10}/reflex/vars/sequence.py +0 -0
  388. {reflex-0.8.9a2 → reflex-0.8.10}/scripts/hatch_build.py +0 -0
@@ -1,12 +1,13 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.9a2
3
+ Version: 0.8.10
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
7
7
  Project-URL: documentation, https://reflex.dev/docs/getting-started/introduction
8
- Author-email: Nikhil Rao <nikhil@reflex.dev>, Alek Petuskey <alek@reflex.dev>, Masen Furer <masen@reflex.dev>, Elijah Ahianyo <elijahahianyo@gmail.com>, Thomas Brandeho <thomas@reflex.dev>, Khaleel Al-Adhami <khaleel@reflex.dev>
9
- Maintainer-email: Masen Furer <masen@reflex.dev>, Thomas Brandeho <thomas@reflex.dev>, Khaleel Al-Adhami <khaleel@reflex.dev>
8
+ Author: Nikhil Rao, Alek Petuskey, Masen Furer, Elijah Ahianyo, Thomas Brandeho, Khaleel Al-Adhami
9
+ Maintainer: Masen Furer, Khaleel Al-Adhami
10
+ Maintainer-email: maintainers@reflex.dev
10
11
  License: Apache-2.0
11
12
  License-File: LICENSE
12
13
  Keywords: framework,web
@@ -1,20 +1,20 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.8.9a2"
3
+ version = "0.8.10"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
7
- { name = "Nikhil Rao", email = "nikhil@reflex.dev" },
8
- { name = "Alek Petuskey", email = "alek@reflex.dev" },
9
- { name = "Masen Furer", email = "masen@reflex.dev" },
10
- { name = "Elijah Ahianyo", email = "elijahahianyo@gmail.com" },
11
- { name = "Thomas Brandeho", email = "thomas@reflex.dev" },
12
- { name = "Khaleel Al-Adhami", email = "khaleel@reflex.dev" },
7
+ { name = "Nikhil Rao" },
8
+ { name = "Alek Petuskey" },
9
+ { name = "Masen Furer" },
10
+ { name = "Elijah Ahianyo" },
11
+ { name = "Thomas Brandeho" },
12
+ { name = "Khaleel Al-Adhami" },
13
13
  ]
14
14
  maintainers = [
15
- { name = "Masen Furer", email = "masen@reflex.dev" },
16
- { name = "Thomas Brandeho", email = "thomas@reflex.dev" },
17
- { name = "Khaleel Al-Adhami", email = "khaleel@reflex.dev" },
15
+ { name = "Masen Furer" },
16
+ { name = "Khaleel Al-Adhami" },
17
+ { email = "maintainers@reflex.dev" },
18
18
  ]
19
19
  readme = "README.md"
20
20
  keywords = ["web", "framework"]
@@ -50,9 +50,7 @@ classifiers = [
50
50
  ]
51
51
 
52
52
  [project.optional-dependencies]
53
- monitoring = [
54
- "pyleak >=0.1.14,<1.0",
55
- ]
53
+ monitoring = ["pyleak >=0.1.14,<1.0"]
56
54
 
57
55
  [project.urls]
58
56
  homepage = "https://reflex.dev"
@@ -232,7 +230,7 @@ fail_fast = true
232
230
 
233
231
  [[tool.pre-commit.repos]]
234
232
  repo = "https://github.com/astral-sh/ruff-pre-commit"
235
- rev = "v0.12.10"
233
+ rev = "v0.12.11"
236
234
  hooks = [
237
235
  { id = "ruff-format", args = [
238
236
  "reflex",
@@ -264,7 +262,7 @@ hooks = [
264
262
 
265
263
  [[tool.pre-commit.repos]]
266
264
  repo = "https://github.com/RobertCraigie/pyright-python"
267
- rev = "v1.1.403"
265
+ rev = "v1.1.404"
268
266
  hooks = [{ id = "pyright", args = ["reflex", "tests"], language = "system" }]
269
267
 
270
268
  [[tool.pre-commit.repos]]
@@ -1,5 +1,5 @@
1
1
  import { useTheme } from "$/utils/react-theme";
2
- import { createElement } from "react";
2
+ import { createElement, useEffect } from "react";
3
3
  import { ColorModeContext, defaultColorMode } from "$/utils/context";
4
4
 
5
5
  export default function RadixThemesColorModeProvider({ children }) {
@@ -20,6 +20,16 @@ export default function RadixThemesColorModeProvider({ children }) {
20
20
  setTheme(mode);
21
21
  };
22
22
 
23
+ useEffect(() => {
24
+ const radixRoot = document.querySelector(
25
+ '.radix-themes[data-is-root-theme="true"]',
26
+ );
27
+ if (radixRoot) {
28
+ radixRoot.classList.remove("light", "dark");
29
+ radixRoot.classList.add(resolvedTheme);
30
+ }
31
+ }, [resolvedTheme]);
32
+
23
33
  return createElement(
24
34
  ColorModeContext.Provider,
25
35
  {
@@ -0,0 +1,170 @@
1
+ import JSON5 from "json5";
2
+ import env from "$/env.json";
3
+
4
+ /**
5
+ * Upload files to the server.
6
+ *
7
+ * @param state The state to apply the delta to.
8
+ * @param handler The handler to use.
9
+ * @param upload_id The upload id to use.
10
+ * @param on_upload_progress The function to call on upload progress.
11
+ * @param socket the websocket connection
12
+ * @param extra_headers Extra headers to send with the request.
13
+ * @param refs The refs object to store the abort controller in.
14
+ * @param getBackendURL Function to get the backend URL.
15
+ * @param getToken Function to get the Reflex token.
16
+ *
17
+ * @returns The response from posting to the UPLOADURL endpoint.
18
+ */
19
+ export const uploadFiles = async (
20
+ handler,
21
+ files,
22
+ upload_id,
23
+ on_upload_progress,
24
+ extra_headers,
25
+ socket,
26
+ refs,
27
+ getBackendURL,
28
+ getToken,
29
+ ) => {
30
+ // return if there's no file to upload
31
+ if (files === undefined || files.length === 0) {
32
+ return false;
33
+ }
34
+
35
+ const upload_ref_name = `__upload_controllers_${upload_id}`;
36
+
37
+ if (refs[upload_ref_name]) {
38
+ console.log("Upload already in progress for ", upload_id);
39
+ return false;
40
+ }
41
+
42
+ // Track how many partial updates have been processed for this upload.
43
+ let resp_idx = 0;
44
+ const eventHandler = (progressEvent) => {
45
+ const event_callbacks = socket._callbacks.$event;
46
+ // Whenever called, responseText will contain the entire response so far.
47
+ const chunks = progressEvent.event.target.responseText.trim().split("\n");
48
+ // So only process _new_ chunks beyond resp_idx.
49
+ chunks.slice(resp_idx).map((chunk_json) => {
50
+ try {
51
+ const chunk = JSON5.parse(chunk_json);
52
+ event_callbacks.map((f, ix) => {
53
+ f(chunk)
54
+ .then(() => {
55
+ if (ix === event_callbacks.length - 1) {
56
+ // Mark this chunk as processed.
57
+ resp_idx += 1;
58
+ }
59
+ })
60
+ .catch((e) => {
61
+ if (progressEvent.progress === 1) {
62
+ // Chunk may be incomplete, so only report errors when full response is available.
63
+ console.log("Error processing chunk", chunk, e);
64
+ }
65
+ return;
66
+ });
67
+ });
68
+ } catch (e) {
69
+ if (progressEvent.progress === 1) {
70
+ console.log("Error parsing chunk", chunk_json, e);
71
+ }
72
+ return;
73
+ }
74
+ });
75
+ };
76
+
77
+ const controller = new AbortController();
78
+ const formdata = new FormData();
79
+
80
+ // Add the token and handler to the file name.
81
+ files.forEach((file) => {
82
+ formdata.append("files", file, file.path || file.name);
83
+ });
84
+
85
+ // Send the file to the server.
86
+ refs[upload_ref_name] = controller;
87
+
88
+ return new Promise((resolve, reject) => {
89
+ const xhr = new XMLHttpRequest();
90
+
91
+ // Set up event handlers
92
+ xhr.onload = function () {
93
+ if (xhr.status >= 200 && xhr.status < 300) {
94
+ resolve({
95
+ data: xhr.responseText,
96
+ status: xhr.status,
97
+ statusText: xhr.statusText,
98
+ headers: {
99
+ get: (name) => xhr.getResponseHeader(name),
100
+ },
101
+ });
102
+ } else {
103
+ reject(new Error(`HTTP error! status: ${xhr.status}`));
104
+ }
105
+ };
106
+
107
+ xhr.onerror = function () {
108
+ reject(new Error("Network error"));
109
+ };
110
+
111
+ xhr.onabort = function () {
112
+ reject(new Error("Upload aborted"));
113
+ };
114
+
115
+ // Handle upload progress
116
+ if (on_upload_progress) {
117
+ xhr.upload.onprogress = function (event) {
118
+ if (event.lengthComputable) {
119
+ const progressEvent = {
120
+ loaded: event.loaded,
121
+ total: event.total,
122
+ progress: event.loaded / event.total,
123
+ };
124
+ on_upload_progress(progressEvent);
125
+ }
126
+ };
127
+ }
128
+
129
+ // Handle download progress with streaming response parsing
130
+ xhr.onprogress = function (event) {
131
+ if (eventHandler) {
132
+ const progressEvent = {
133
+ event: {
134
+ target: {
135
+ responseText: xhr.responseText,
136
+ },
137
+ },
138
+ progress: event.lengthComputable ? event.loaded / event.total : 0,
139
+ };
140
+ eventHandler(progressEvent);
141
+ }
142
+ };
143
+
144
+ // Handle abort controller
145
+ controller.signal.addEventListener("abort", () => {
146
+ xhr.abort();
147
+ });
148
+
149
+ // Configure and send request
150
+ xhr.open("POST", getBackendURL(env.UPLOAD));
151
+ xhr.setRequestHeader("Reflex-Client-Token", getToken());
152
+ xhr.setRequestHeader("Reflex-Event-Handler", handler);
153
+ for (const [key, value] of Object.entries(extra_headers || {})) {
154
+ xhr.setRequestHeader(key, value);
155
+ }
156
+
157
+ try {
158
+ xhr.send(formdata);
159
+ } catch (error) {
160
+ reject(error);
161
+ }
162
+ })
163
+ .catch((error) => {
164
+ console.log("Upload error:", error.message);
165
+ return false;
166
+ })
167
+ .finally(() => {
168
+ delete refs[upload_ref_name];
169
+ });
170
+ };
@@ -20,10 +20,10 @@ import {
20
20
  } from "$/utils/context";
21
21
  import debounce from "$/utils/helpers/debounce";
22
22
  import throttle from "$/utils/helpers/throttle";
23
+ import { uploadFiles } from "$/utils/helpers/upload";
23
24
 
24
25
  // Endpoint URLs.
25
26
  const EVENTURL = env.EVENT;
26
- const UPLOADURL = env.UPLOAD;
27
27
 
28
28
  // These hostnames indicate that the backend and frontend are reachable via the same domain.
29
29
  const SAME_DOMAIN_HOSTNAMES = ["localhost", "0.0.0.0", "::", "0:0:0:0:0:0:0:0"];
@@ -210,7 +210,11 @@ export const applyEvent = async (event, socket, navigate, params) => {
210
210
  return false;
211
211
  }
212
212
  if (event.payload.external) {
213
- window.open(event.payload.path, "_blank", "noopener");
213
+ window.open(
214
+ event.payload.path,
215
+ "_blank",
216
+ "noopener" + (event.payload.popup ? ",popup" : ""),
217
+ );
214
218
  return false;
215
219
  }
216
220
  const url = urlFrom(event.payload.path);
@@ -428,7 +432,11 @@ export const applyRestEvent = async (event, socket, navigate, params) => {
428
432
  event.payload.files,
429
433
  event.payload.upload_id,
430
434
  event.payload.on_upload_progress,
435
+ event.payload.extra_headers,
431
436
  socket,
437
+ refs,
438
+ getBackendURL,
439
+ getToken,
432
440
  );
433
441
  return false;
434
442
  }
@@ -610,163 +618,6 @@ export const connect = async (
610
618
  document.addEventListener("visibilitychange", checkVisibility);
611
619
  };
612
620
 
613
- /**
614
- * Upload files to the server.
615
- *
616
- * @param state The state to apply the delta to.
617
- * @param handler The handler to use.
618
- * @param upload_id The upload id to use.
619
- * @param on_upload_progress The function to call on upload progress.
620
- * @param socket the websocket connection
621
- *
622
- * @returns The response from posting to the UPLOADURL endpoint.
623
- */
624
- export const uploadFiles = async (
625
- handler,
626
- files,
627
- upload_id,
628
- on_upload_progress,
629
- socket,
630
- ) => {
631
- // return if there's no file to upload
632
- if (files === undefined || files.length === 0) {
633
- return false;
634
- }
635
-
636
- const upload_ref_name = `__upload_controllers_${upload_id}`;
637
-
638
- if (refs[upload_ref_name]) {
639
- console.log("Upload already in progress for ", upload_id);
640
- return false;
641
- }
642
-
643
- // Track how many partial updates have been processed for this upload.
644
- let resp_idx = 0;
645
- const eventHandler = (progressEvent) => {
646
- const event_callbacks = socket._callbacks.$event;
647
- // Whenever called, responseText will contain the entire response so far.
648
- const chunks = progressEvent.event.target.responseText.trim().split("\n");
649
- // So only process _new_ chunks beyond resp_idx.
650
- chunks.slice(resp_idx).map((chunk_json) => {
651
- try {
652
- const chunk = JSON5.parse(chunk_json);
653
- event_callbacks.map((f, ix) => {
654
- f(chunk)
655
- .then(() => {
656
- if (ix === event_callbacks.length - 1) {
657
- // Mark this chunk as processed.
658
- resp_idx += 1;
659
- }
660
- })
661
- .catch((e) => {
662
- if (progressEvent.progress === 1) {
663
- // Chunk may be incomplete, so only report errors when full response is available.
664
- console.log("Error processing chunk", chunk, e);
665
- }
666
- return;
667
- });
668
- });
669
- } catch (e) {
670
- if (progressEvent.progress === 1) {
671
- console.log("Error parsing chunk", chunk_json, e);
672
- }
673
- return;
674
- }
675
- });
676
- };
677
-
678
- const controller = new AbortController();
679
- const formdata = new FormData();
680
-
681
- // Add the token and handler to the file name.
682
- files.forEach((file) => {
683
- formdata.append("files", file, file.path || file.name);
684
- });
685
-
686
- // Send the file to the server.
687
- refs[upload_ref_name] = controller;
688
-
689
- return new Promise((resolve, reject) => {
690
- const xhr = new XMLHttpRequest();
691
-
692
- // Set up event handlers
693
- xhr.onload = function () {
694
- if (xhr.status >= 200 && xhr.status < 300) {
695
- resolve({
696
- data: xhr.responseText,
697
- status: xhr.status,
698
- statusText: xhr.statusText,
699
- headers: {
700
- get: (name) => xhr.getResponseHeader(name),
701
- },
702
- });
703
- } else {
704
- reject(new Error(`HTTP error! status: ${xhr.status}`));
705
- }
706
- };
707
-
708
- xhr.onerror = function () {
709
- reject(new Error("Network error"));
710
- };
711
-
712
- xhr.onabort = function () {
713
- reject(new Error("Upload aborted"));
714
- };
715
-
716
- // Handle upload progress
717
- if (on_upload_progress) {
718
- xhr.upload.onprogress = function (event) {
719
- if (event.lengthComputable) {
720
- const progressEvent = {
721
- loaded: event.loaded,
722
- total: event.total,
723
- progress: event.loaded / event.total,
724
- };
725
- on_upload_progress(progressEvent);
726
- }
727
- };
728
- }
729
-
730
- // Handle download progress with streaming response parsing
731
- xhr.onprogress = function (event) {
732
- if (eventHandler) {
733
- const progressEvent = {
734
- event: {
735
- target: {
736
- responseText: xhr.responseText,
737
- },
738
- },
739
- progress: event.lengthComputable ? event.loaded / event.total : 0,
740
- };
741
- eventHandler(progressEvent);
742
- }
743
- };
744
-
745
- // Handle abort controller
746
- controller.signal.addEventListener("abort", () => {
747
- xhr.abort();
748
- });
749
-
750
- // Configure and send request
751
- xhr.open("POST", getBackendURL(UPLOADURL));
752
- xhr.setRequestHeader("Reflex-Client-Token", getToken());
753
- xhr.setRequestHeader("Reflex-Event-Handler", handler);
754
-
755
- try {
756
- xhr.send(formdata);
757
- } catch (error) {
758
- reject(error);
759
- }
760
- })
761
- .catch((error) => {
762
- console.log("Upload error:", error.message);
763
- return false;
764
- })
765
- .finally(() => {
766
- delete refs[upload_ref_name];
767
- });
768
- };
769
-
770
621
  /**
771
622
  * Create an event object.
772
623
  * @param {string} name The name of the event.
@@ -258,6 +258,15 @@ class UploadFile(StarletteUploadFile):
258
258
 
259
259
  headers: Headers = dataclasses.field(default_factory=Headers)
260
260
 
261
+ @property
262
+ def filename(self) -> str | None:
263
+ """Get the name of the uploaded file.
264
+
265
+ Returns:
266
+ The name of the uploaded file.
267
+ """
268
+ return self.name
269
+
261
270
  @property
262
271
  def name(self) -> str | None:
263
272
  """Get the name of the uploaded file.
@@ -161,7 +161,7 @@ def _compile_page(component: BaseComponent) -> str:
161
161
  # Compile the code to render the component.
162
162
  return templates.page_template(
163
163
  imports=imports,
164
- dynamic_imports=component._get_all_dynamic_imports(),
164
+ dynamic_imports=sorted(component._get_all_dynamic_imports()),
165
165
  custom_codes=component._get_all_custom_code(),
166
166
  hooks=component._get_all_hooks(),
167
167
  render=component.render(),
@@ -379,7 +379,7 @@ def _compile_components(
379
379
  templates.custom_component_template(
380
380
  imports=utils.compile_imports(imports),
381
381
  components=component_renders,
382
- dynamic_imports=dynamic_imports,
382
+ dynamic_imports=sorted(dynamic_imports),
383
383
  custom_codes=custom_codes,
384
384
  ),
385
385
  imports,
@@ -435,9 +435,7 @@ def _compile_stateful_components(
435
435
  rendered_components.update(dict.fromkeys(dynamic_imports))
436
436
 
437
437
  # Include custom code in the shared component.
438
- rendered_components.update(
439
- dict.fromkeys(component._get_all_custom_code(export=True)),
440
- )
438
+ rendered_components.update(component._get_all_custom_code(export=True))
441
439
 
442
440
  # Include all imports in the shared component.
443
441
  all_import_dicts.append(component._get_all_imports())
@@ -164,7 +164,7 @@ export function Layout({{children}}) {{
164
164
  def app_root_template(
165
165
  *,
166
166
  imports: list[_ImportDict],
167
- custom_codes: set[str],
167
+ custom_codes: Iterable[str],
168
168
  hooks: dict[str, VarData | None],
169
169
  window_libraries: list[tuple[str, str]],
170
170
  render: dict[str, Any],
@@ -200,7 +200,6 @@ def app_root_template(
200
200
  )
201
201
 
202
202
  return f"""
203
- import reflexGlobalStyles from '$/styles/__reflex_global_styles.css?url';
204
203
  {imports_str}
205
204
  {dynamic_imports_str}
206
205
  import {{ EventLoopProvider, StateProvider, defaultColorMode }} from "$/utils/context";
@@ -211,10 +210,6 @@ import {{ Outlet }} from 'react-router';
211
210
 
212
211
  {custom_code_str}
213
212
 
214
- export const links = () => [
215
- {{ rel: 'stylesheet', href: reflexGlobalStyles, type: 'text/css' }}
216
- ];
217
-
218
213
  function AppWrap({{children}}) {{
219
214
  {_render_hooks(hooks)}
220
215
  return ({_RenderUtils.render(render)})
@@ -16,7 +16,7 @@ from reflex.components.base import Description, Image, Scripts
16
16
  from reflex.components.base.document import Links, ScrollRestoration
17
17
  from reflex.components.base.document import Meta as ReactMeta
18
18
  from reflex.components.component import Component, ComponentStyle, CustomComponent
19
- from reflex.components.el.elements.metadata import Head, Meta, Title
19
+ from reflex.components.el.elements.metadata import Head, Link, Meta, Title
20
20
  from reflex.components.el.elements.other import Html
21
21
  from reflex.components.el.elements.sectioning import Body
22
22
  from reflex.constants.state import FIELD_MARKER
@@ -26,7 +26,7 @@ from reflex.style import Style
26
26
  from reflex.utils import format, imports, path_ops
27
27
  from reflex.utils.imports import ImportVar, ParsedImportDict
28
28
  from reflex.utils.prerequisites import get_web_dir
29
- from reflex.vars.base import Field, Var
29
+ from reflex.vars.base import Field, Var, VarData
30
30
 
31
31
  # To re-export this function.
32
32
  merge_imports = imports.merge_imports
@@ -382,6 +382,20 @@ def create_document_root(
382
382
  # Always include the framework meta and link tags.
383
383
  always_head_components = [
384
384
  ReactMeta.create(),
385
+ Link.create(
386
+ rel="stylesheet",
387
+ type="text/css",
388
+ href=Var(
389
+ "reflexGlobalStyles",
390
+ _var_data=VarData(
391
+ imports={
392
+ "$/styles/__reflex_global_styles.css?url": [
393
+ ImportVar(tag="reflexGlobalStyles", is_default=True)
394
+ ]
395
+ }
396
+ ),
397
+ ),
398
+ ),
385
399
  Links.create(),
386
400
  ]
387
401
  maybe_head_components = []
@@ -129,7 +129,7 @@ class Bare(Component):
129
129
  dynamic_imports |= component._get_all_dynamic_imports()
130
130
  return dynamic_imports
131
131
 
132
- def _get_all_custom_code(self) -> set[str]:
132
+ def _get_all_custom_code(self) -> dict[str, None]:
133
133
  """Get custom code for the component.
134
134
 
135
135
  Returns:
@@ -166,7 +166,7 @@ class Bare(Component):
166
166
  )
167
167
  return app_wrap_components
168
168
 
169
- def _get_all_refs(self) -> set[str]:
169
+ def _get_all_refs(self) -> dict[str, None]:
170
170
  """Get the refs for the children of the component.
171
171
 
172
172
  Returns: