reflex 0.6.0a3__tar.gz → 0.6.1__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 (383) hide show
  1. {reflex-0.6.0a3 → reflex-0.6.1}/PKG-INFO +5 -5
  2. {reflex-0.6.0a3 → reflex-0.6.1}/README.md +1 -2
  3. {reflex-0.6.0a3 → reflex-0.6.1}/pyproject.toml +6 -4
  4. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +1 -1
  5. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +14 -0
  6. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/utils/state.js +70 -41
  7. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/app.py +11 -11
  8. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/app_mixins/lifespan.py +24 -6
  9. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/app_module_for_backend.py +1 -1
  10. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/base.py +7 -13
  11. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/compiler/utils.py +17 -8
  12. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/bare.py +3 -1
  13. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/meta.py +5 -3
  14. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/component.py +28 -20
  15. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/breakpoints.py +1 -3
  16. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/cond.py +4 -4
  17. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/datadisplay/__init__.py +0 -1
  18. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/datadisplay/__init__.pyi +0 -1
  19. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/datadisplay/code.py +93 -106
  20. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/datadisplay/code.pyi +710 -53
  21. reflex-0.6.1/reflex/components/datadisplay/logo.py +52 -0
  22. reflex-0.6.1/reflex/components/dynamic.py +157 -0
  23. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/forms.py +4 -1
  24. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/gridjs/datatable.py +2 -1
  25. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/markdown/markdown.py +10 -6
  26. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/markdown/markdown.pyi +3 -0
  27. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/progress.py +22 -0
  28. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/progress.pyi +2 -0
  29. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/segmented_control.py +3 -0
  30. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/segmented_control.pyi +2 -0
  31. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/stack.py +1 -1
  32. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/cartesian.py +1 -1
  33. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/sonner/toast.py +3 -3
  34. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/tags/iter_tag.py +5 -1
  35. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/config.py +2 -2
  36. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/base.py +4 -1
  37. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/installer.py +8 -1
  38. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/event.py +63 -22
  39. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/experimental/assets.py +3 -1
  40. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/experimental/client_state.py +12 -7
  41. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/experimental/misc.py +5 -3
  42. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/middleware/hydrate_middleware.py +1 -2
  43. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/page.py +10 -3
  44. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/reflex.py +20 -3
  45. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/state.py +105 -44
  46. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/style.py +12 -2
  47. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/testing.py +8 -4
  48. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/console.py +1 -1
  49. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/exceptions.py +4 -0
  50. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/exec.py +170 -18
  51. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/format.py +6 -44
  52. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/path_ops.py +36 -1
  53. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/prerequisites.py +62 -21
  54. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/serializers.py +7 -46
  55. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/telemetry.py +1 -1
  56. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/types.py +18 -3
  57. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/vars/base.py +303 -43
  58. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/vars/number.py +3 -0
  59. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/vars/sequence.py +43 -8
  60. reflex-0.6.0a3/reflex/components/datadisplay/logo.py +0 -50
  61. {reflex-0.6.0a3 → reflex-0.6.1}/LICENSE +0 -0
  62. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  63. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  64. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/apps/blank/code/blank.py +0 -0
  65. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
  66. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  67. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  68. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  69. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  70. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  71. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  72. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  73. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  74. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  75. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  76. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
  77. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  78. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  79. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  80. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/tailwind.config.js.jinja2 +0 -0
  81. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  82. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  83. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/.gitignore +0 -0
  84. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  85. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/jsconfig.json +0 -0
  86. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/next.config.js +0 -0
  87. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/postcss.config.js +0 -0
  88. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/styles/tailwind.css +0 -0
  89. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  90. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  91. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  92. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  93. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/utils/helpers/range.js +0 -0
  94. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  95. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/__init__.py +0 -0
  96. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/__init__.pyi +0 -0
  97. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/__main__.py +0 -0
  98. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/admin.py +0 -0
  99. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/app_mixins/__init__.py +0 -0
  100. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/app_mixins/middleware.py +0 -0
  101. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/app_mixins/mixin.py +0 -0
  102. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/compiler/__init__.py +0 -0
  103. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/compiler/compiler.py +0 -0
  104. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/compiler/templates.py +0 -0
  105. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/__init__.py +0 -0
  106. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/__init__.pyi +0 -0
  107. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/__init__.py +0 -0
  108. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/__init__.pyi +0 -0
  109. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/app_wrap.py +0 -0
  110. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/app_wrap.pyi +0 -0
  111. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/body.py +0 -0
  112. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/body.pyi +0 -0
  113. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/document.py +0 -0
  114. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/document.pyi +0 -0
  115. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/error_boundary.py +0 -0
  116. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/error_boundary.pyi +0 -0
  117. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/fragment.py +0 -0
  118. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/fragment.pyi +0 -0
  119. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/head.py +0 -0
  120. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/head.pyi +0 -0
  121. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/link.py +0 -0
  122. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/link.pyi +0 -0
  123. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/meta.pyi +0 -0
  124. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/script.py +0 -0
  125. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/base/script.pyi +0 -0
  126. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/__init__.py +0 -0
  127. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/__init__.pyi +0 -0
  128. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/banner.py +0 -0
  129. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/banner.pyi +0 -0
  130. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/client_side_routing.py +0 -0
  131. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/client_side_routing.pyi +0 -0
  132. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/clipboard.py +0 -0
  133. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/clipboard.pyi +0 -0
  134. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/colors.py +0 -0
  135. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/debounce.py +0 -0
  136. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/debounce.pyi +0 -0
  137. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/foreach.py +0 -0
  138. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/html.py +0 -0
  139. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/html.pyi +0 -0
  140. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/layout/__init__.py +0 -0
  141. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/match.py +0 -0
  142. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/responsive.py +0 -0
  143. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/upload.py +0 -0
  144. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/core/upload.pyi +0 -0
  145. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/datadisplay/dataeditor.py +0 -0
  146. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  147. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/__init__.py +0 -0
  148. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/__init__.pyi +0 -0
  149. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/constants/__init__.py +0 -0
  150. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/constants/html.py +0 -0
  151. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/constants/react.py +0 -0
  152. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/constants/reflex.py +0 -0
  153. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/element.py +0 -0
  154. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/element.pyi +0 -0
  155. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/__init__.py +0 -0
  156. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/__init__.pyi +0 -0
  157. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/base.py +0 -0
  158. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/base.pyi +0 -0
  159. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/forms.pyi +0 -0
  160. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/inline.py +0 -0
  161. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/inline.pyi +0 -0
  162. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/media.py +0 -0
  163. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/media.pyi +0 -0
  164. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/metadata.py +0 -0
  165. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/metadata.pyi +0 -0
  166. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/other.py +0 -0
  167. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/other.pyi +0 -0
  168. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/scripts.py +0 -0
  169. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/scripts.pyi +0 -0
  170. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/sectioning.py +0 -0
  171. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/sectioning.pyi +0 -0
  172. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/tables.py +0 -0
  173. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/tables.pyi +0 -0
  174. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/typography.py +0 -0
  175. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/el/elements/typography.pyi +0 -0
  176. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/gridjs/__init__.py +0 -0
  177. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/gridjs/datatable.pyi +0 -0
  178. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/literals.py +0 -0
  179. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/lucide/__init__.py +0 -0
  180. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/lucide/icon.py +0 -0
  181. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/lucide/icon.pyi +0 -0
  182. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/markdown/__init__.py +0 -0
  183. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/moment/__init__.py +0 -0
  184. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/moment/moment.py +0 -0
  185. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/moment/moment.pyi +0 -0
  186. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/__init__.py +0 -0
  187. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/base.py +0 -0
  188. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/base.pyi +0 -0
  189. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/image.py +0 -0
  190. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/image.pyi +0 -0
  191. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/link.py +0 -0
  192. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/link.pyi +0 -0
  193. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/video.py +0 -0
  194. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/next/video.pyi +0 -0
  195. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/plotly/__init__.py +0 -0
  196. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/plotly/plotly.py +0 -0
  197. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/plotly/plotly.pyi +0 -0
  198. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/props.py +0 -0
  199. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/__init__.py +0 -0
  200. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/__init__.pyi +0 -0
  201. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/__init__.py +0 -0
  202. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/__init__.pyi +0 -0
  203. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/accordion.py +0 -0
  204. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/accordion.pyi +0 -0
  205. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/base.py +0 -0
  206. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/base.pyi +0 -0
  207. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/drawer.py +0 -0
  208. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/drawer.pyi +0 -0
  209. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/form.py +0 -0
  210. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/form.pyi +0 -0
  211. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/progress.py +0 -0
  212. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/progress.pyi +0 -0
  213. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/slider.py +0 -0
  214. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/primitives/slider.pyi +0 -0
  215. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/__init__.py +0 -0
  216. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/__init__.pyi +0 -0
  217. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/base.py +0 -0
  218. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/base.pyi +0 -0
  219. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/color_mode.py +0 -0
  220. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/color_mode.pyi +0 -0
  221. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/__init__.py +0 -0
  222. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  223. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  224. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  225. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  226. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  227. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/avatar.py +0 -0
  228. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  229. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/badge.py +0 -0
  230. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/badge.pyi +0 -0
  231. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/button.py +0 -0
  232. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/button.pyi +0 -0
  233. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/callout.py +0 -0
  234. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/callout.pyi +0 -0
  235. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/card.py +0 -0
  236. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/card.pyi +0 -0
  237. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/checkbox.py +0 -0
  238. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  239. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  240. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  241. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  242. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  243. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/context_menu.py +0 -0
  244. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  245. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/data_list.py +0 -0
  246. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  247. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/dialog.py +0 -0
  248. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  249. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  250. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  251. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/hover_card.py +0 -0
  252. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  253. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/icon_button.py +0 -0
  254. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  255. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/inset.py +0 -0
  256. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/inset.pyi +0 -0
  257. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/popover.py +0 -0
  258. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/popover.pyi +0 -0
  259. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/radio.py +0 -0
  260. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/radio.pyi +0 -0
  261. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  262. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  263. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/radio_group.py +0 -0
  264. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  265. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  266. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  267. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/select.py +0 -0
  268. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/select.pyi +0 -0
  269. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/separator.py +0 -0
  270. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/separator.pyi +0 -0
  271. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/skeleton.py +0 -0
  272. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  273. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/slider.py +0 -0
  274. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/slider.pyi +0 -0
  275. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/spinner.py +0 -0
  276. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  277. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/switch.py +0 -0
  278. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/switch.pyi +0 -0
  279. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/table.py +0 -0
  280. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/table.pyi +0 -0
  281. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/tabs.py +0 -0
  282. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  283. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/text_area.py +0 -0
  284. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  285. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/text_field.py +0 -0
  286. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  287. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/tooltip.py +0 -0
  288. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  289. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/__init__.py +0 -0
  290. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  291. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/base.py +0 -0
  292. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/base.pyi +0 -0
  293. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/box.py +0 -0
  294. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/box.pyi +0 -0
  295. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/center.py +0 -0
  296. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/center.pyi +0 -0
  297. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/container.py +0 -0
  298. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/container.pyi +0 -0
  299. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/flex.py +0 -0
  300. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  301. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/grid.py +0 -0
  302. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  303. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/list.py +0 -0
  304. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/list.pyi +0 -0
  305. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/section.py +0 -0
  306. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/section.pyi +0 -0
  307. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/spacer.py +0 -0
  308. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  309. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  310. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/__init__.py +0 -0
  311. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  312. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/base.py +0 -0
  313. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  314. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  315. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/code.py +0 -0
  316. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/code.pyi +0 -0
  317. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/heading.py +0 -0
  318. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  319. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/link.py +0 -0
  320. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/link.pyi +0 -0
  321. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/text.py +0 -0
  322. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/radix/themes/typography/text.pyi +0 -0
  323. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/react_player/__init__.py +0 -0
  324. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/react_player/audio.py +0 -0
  325. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/react_player/audio.pyi +0 -0
  326. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/react_player/react_player.py +0 -0
  327. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/react_player/react_player.pyi +0 -0
  328. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/react_player/video.py +0 -0
  329. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/react_player/video.pyi +0 -0
  330. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/__init__.py +0 -0
  331. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/__init__.pyi +0 -0
  332. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/cartesian.pyi +0 -0
  333. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/charts.py +0 -0
  334. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/charts.pyi +0 -0
  335. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/general.py +0 -0
  336. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/general.pyi +0 -0
  337. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/polar.py +0 -0
  338. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/polar.pyi +0 -0
  339. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/recharts.py +0 -0
  340. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/recharts/recharts.pyi +0 -0
  341. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/sonner/__init__.py +0 -0
  342. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/sonner/toast.pyi +0 -0
  343. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/suneditor/__init__.py +0 -0
  344. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/suneditor/editor.py +0 -0
  345. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/suneditor/editor.pyi +0 -0
  346. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/tags/__init__.py +0 -0
  347. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/tags/cond_tag.py +0 -0
  348. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/tags/match_tag.py +0 -0
  349. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/tags/tag.py +0 -0
  350. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/components/tags/tagless.py +0 -0
  351. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/__init__.py +0 -0
  352. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/colors.py +0 -0
  353. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/compiler.py +0 -0
  354. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/config.py +0 -0
  355. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/custom_components.py +0 -0
  356. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/event.py +0 -0
  357. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/route.py +0 -0
  358. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/constants/style.py +0 -0
  359. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/custom_components/__init__.py +0 -0
  360. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/custom_components/custom_components.py +0 -0
  361. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/experimental/__init__.py +0 -0
  362. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/experimental/hooks.py +0 -0
  363. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/experimental/layout.py +0 -0
  364. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/experimental/layout.pyi +0 -0
  365. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/middleware/__init__.py +0 -0
  366. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/middleware/middleware.py +0 -0
  367. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/model.py +0 -0
  368. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/route.py +0 -0
  369. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/__init__.py +0 -0
  370. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/build.py +0 -0
  371. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/codespaces.py +0 -0
  372. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/compat.py +0 -0
  373. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/export.py +0 -0
  374. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/imports.py +0 -0
  375. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/lazy_loader.py +0 -0
  376. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/net.py +0 -0
  377. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/processes.py +0 -0
  378. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/pyi_generator.py +0 -0
  379. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/redir.py +0 -0
  380. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/utils/registry.py +0 -0
  381. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/vars/__init__.py +0 -0
  382. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/vars/function.py +0 -0
  383. {reflex-0.6.0a3 → reflex-0.6.1}/reflex/vars/object.py +0 -0
@@ -1,16 +1,17 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: reflex
3
- Version: 0.6.0a3
3
+ Version: 0.6.1
4
4
  Summary: Web apps in pure Python.
5
5
  Home-page: https://reflex.dev
6
6
  License: Apache-2.0
7
7
  Keywords: web,framework
8
8
  Author: Nikhil Rao
9
9
  Author-email: nikhil@reflex.dev
10
- Requires-Python: >=3.10,<4.0
10
+ Requires-Python: >=3.9,<4.0
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: License :: OSI Approved :: Apache Software License
13
13
  Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.9
14
15
  Classifier: Programming Language :: Python :: 3.10
15
16
  Classifier: Programming Language :: Python :: 3.11
16
17
  Classifier: Programming Language :: Python :: 3.12
@@ -32,7 +33,7 @@ Requires-Dist: python-engineio (!=4.6.0)
32
33
  Requires-Dist: python-multipart (>=0.0.5,<0.1)
33
34
  Requires-Dist: python-socketio (>=5.7.0,<6.0)
34
35
  Requires-Dist: redis (>=4.3.5,<6.0)
35
- Requires-Dist: reflex-chakra (>=0.6.0a6)
36
+ Requires-Dist: reflex-chakra (>=0.6.0)
36
37
  Requires-Dist: reflex-hosting-cli (>=0.1.2,<2.0)
37
38
  Requires-Dist: rich (>=13.0.0,<14.0)
38
39
  Requires-Dist: setuptools (>=69.1.1,<70.2)
@@ -61,7 +62,6 @@ Description-Content-Type: text/markdown
61
62
 
62
63
  ### **✨ Performant, customizable web apps in pure Python. Deploy in seconds. ✨**
63
64
  [![PyPI version](https://badge.fury.io/py/reflex.svg)](https://badge.fury.io/py/reflex)
64
- ![tests](https://github.com/pynecone-io/pynecone/actions/workflows/integration.yml/badge.svg)
65
65
  ![versions](https://img.shields.io/pypi/pyversions/reflex.svg)
66
66
  [![Documentation](https://img.shields.io/badge/Documentation%20-Introduction%20-%20%23007ec6)](https://reflex.dev/docs/getting-started/introduction)
67
67
  [![Discord](https://img.shields.io/discord/1029853095527727165?color=%237289da&label=Discord)](https://discord.gg/T5WSbC2YtQ)
@@ -86,7 +86,7 @@ See our [architecture page](https://reflex.dev/blog/2024-03-21-reflex-architectu
86
86
 
87
87
  ## ⚙️ Installation
88
88
 
89
- Open a terminal and run (Requires Python 3.10+):
89
+ Open a terminal and run (Requires Python 3.9+):
90
90
 
91
91
  ```bash
92
92
  pip install reflex
@@ -10,7 +10,6 @@
10
10
 
11
11
  ### **✨ Performant, customizable web apps in pure Python. Deploy in seconds. ✨**
12
12
  [![PyPI version](https://badge.fury.io/py/reflex.svg)](https://badge.fury.io/py/reflex)
13
- ![tests](https://github.com/pynecone-io/pynecone/actions/workflows/integration.yml/badge.svg)
14
13
  ![versions](https://img.shields.io/pypi/pyversions/reflex.svg)
15
14
  [![Documentation](https://img.shields.io/badge/Documentation%20-Introduction%20-%20%23007ec6)](https://reflex.dev/docs/getting-started/introduction)
16
15
  [![Discord](https://img.shields.io/discord/1029853095527727165?color=%237289da&label=Discord)](https://discord.gg/T5WSbC2YtQ)
@@ -35,7 +34,7 @@ See our [architecture page](https://reflex.dev/blog/2024-03-21-reflex-architectu
35
34
 
36
35
  ## ⚙️ Installation
37
36
 
38
- Open a terminal and run (Requires Python 3.10+):
37
+ Open a terminal and run (Requires Python 3.9+):
39
38
 
40
39
  ```bash
41
40
  pip install reflex
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "reflex"
3
- version = "0.6.0a3"
3
+ version = "0.6.1"
4
4
  description = "Web apps in pure Python."
5
5
  license = "Apache-2.0"
6
6
  authors = [
@@ -26,7 +26,7 @@ packages = [
26
26
  ]
27
27
 
28
28
  [tool.poetry.dependencies]
29
- python = "^3.10"
29
+ python = "^3.9"
30
30
  dill = ">=0.3.8,<0.4"
31
31
  fastapi = ">=0.96.0,!=0.111.0,!=0.111.1"
32
32
  gunicorn = ">=20.1.0,<24.0"
@@ -59,7 +59,7 @@ httpx = ">=0.25.1,<1.0"
59
59
  twine = ">=4.0.0,<6.0"
60
60
  tomlkit = ">=0.12.4,<1.0"
61
61
  lazy_loader = ">=0.4"
62
- reflex-chakra = ">=0.6.0a6"
62
+ reflex-chakra = ">=0.6.0"
63
63
 
64
64
  [tool.poetry.group.dev.dependencies]
65
65
  pytest = ">=7.1.2,<8.0"
@@ -77,6 +77,8 @@ asynctest = ">=0.13.0,<1.0"
77
77
  pre-commit = ">=3.2.1"
78
78
  selenium = ">=4.11.0,<5.0"
79
79
  pytest-benchmark = ">=4.0.0,<5.0"
80
+ playwright = ">=1.46.0"
81
+ pytest-playwright = ">=0.5.1"
80
82
 
81
83
  [tool.poetry.scripts]
82
84
  reflex = "reflex.reflex:cli"
@@ -88,7 +90,7 @@ build-backend = "poetry.core.masonry.api"
88
90
  [tool.pyright]
89
91
 
90
92
  [tool.ruff]
91
- target-version = "py310"
93
+ target-version = "py39"
92
94
  lint.select = ["B", "D", "E", "F", "I", "SIM", "W"]
93
95
  lint.ignore = ["B008", "D203", "D205", "D213", "D401", "D406", "D407", "E501", "F403", "F405", "F541"]
94
96
  lint.pydocstyle.convention = "google"
@@ -8,7 +8,7 @@ version = "0.0.1"
8
8
  description = "Reflex custom component {{ module_name }}"
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
11
- requires-python = ">=3.10"
11
+ requires-python = ">=3.9"
12
12
  authors = [{ name = "", email = "YOUREMAIL@domain.com" }]
13
13
  keywords = ["reflex","reflex-custom-components"]
14
14
 
@@ -7,6 +7,10 @@ import '/styles/styles.css'
7
7
  {% block declaration %}
8
8
  import { EventLoopProvider, StateProvider, defaultColorMode } from "/utils/context.js";
9
9
  import { ThemeProvider } from 'next-themes'
10
+ import * as React from "react";
11
+ import * as utils_context from "/utils/context.js";
12
+ import * as utils_state from "/utils/state.js";
13
+ import * as radix from "@radix-ui/themes";
10
14
 
11
15
  {% for custom_code in custom_codes %}
12
16
  {{custom_code}}
@@ -26,6 +30,16 @@ function AppWrap({children}) {
26
30
  }
27
31
 
28
32
  export default function MyApp({ Component, pageProps }) {
33
+ React.useEffect(() => {
34
+ // Make contexts and state objects available globally for dynamic eval'd components
35
+ let windowImports = {
36
+ "react": React,
37
+ "@radix-ui/themes": radix,
38
+ "/utils/context": utils_context,
39
+ "/utils/state": utils_state,
40
+ };
41
+ window["__reflex"] = windowImports;
42
+ }, []);
29
43
  return (
30
44
  <ThemeProvider defaultTheme={ defaultColorMode } attribute="class">
31
45
  <AppWrap>
@@ -15,6 +15,7 @@ import {
15
15
  } from "utils/context.js";
16
16
  import debounce from "/utils/helpers/debounce";
17
17
  import throttle from "/utils/helpers/throttle";
18
+ import * as Babel from "@babel/standalone";
18
19
 
19
20
  // Endpoint URLs.
20
21
  const EVENTURL = env.EVENT;
@@ -117,8 +118,8 @@ export const isStateful = () => {
117
118
  if (event_queue.length === 0) {
118
119
  return false;
119
120
  }
120
- return event_queue.some(event => event.name.startsWith("reflex___state"));
121
- }
121
+ return event_queue.some((event) => event.name.startsWith("reflex___state"));
122
+ };
122
123
 
123
124
  /**
124
125
  * Apply a delta to the state.
@@ -129,6 +130,22 @@ export const applyDelta = (state, delta) => {
129
130
  return { ...state, ...delta };
130
131
  };
131
132
 
133
+ /**
134
+ * Evaluate a dynamic component.
135
+ * @param component The component to evaluate.
136
+ * @returns The evaluated component.
137
+ */
138
+ export const evalReactComponent = async (component) => {
139
+ if (!window.React && window.__reflex) {
140
+ window.React = window.__reflex.react;
141
+ }
142
+ const output = Babel.transform(component, { presets: ["react"] }).code;
143
+ const encodedJs = encodeURIComponent(output);
144
+ const dataUri = "data:text/javascript;charset=utf-8," + encodedJs;
145
+ const module = await eval(`import(dataUri)`);
146
+ return module.default;
147
+ };
148
+
132
149
  /**
133
150
  * Only Queue and process events when websocket connection exists.
134
151
  * @param event The event to queue.
@@ -141,7 +158,7 @@ export const queueEventIfSocketExists = async (events, socket) => {
141
158
  return;
142
159
  }
143
160
  await queueEvents(events, socket);
144
- }
161
+ };
145
162
 
146
163
  /**
147
164
  * Handle frontend event or send the event to the backend via Websocket.
@@ -208,7 +225,10 @@ export const applyEvent = async (event, socket) => {
208
225
  const a = document.createElement("a");
209
226
  a.hidden = true;
210
227
  // Special case when linking to uploaded files
211
- a.href = event.payload.url.replace("${getBackendURL(env.UPLOAD)}", getBackendURL(env.UPLOAD))
228
+ a.href = event.payload.url.replace(
229
+ "${getBackendURL(env.UPLOAD)}",
230
+ getBackendURL(env.UPLOAD)
231
+ );
212
232
  a.download = event.payload.filename;
213
233
  a.click();
214
234
  a.remove();
@@ -249,7 +269,7 @@ export const applyEvent = async (event, socket) => {
249
269
  } catch (e) {
250
270
  console.log("_call_script", e);
251
271
  if (window && window?.onerror) {
252
- window.onerror(e.message, null, null, null, e)
272
+ window.onerror(e.message, null, null, null, e);
253
273
  }
254
274
  }
255
275
  return false;
@@ -290,10 +310,9 @@ export const applyEvent = async (event, socket) => {
290
310
  export const applyRestEvent = async (event, socket) => {
291
311
  let eventSent = false;
292
312
  if (event.handler === "uploadFiles") {
293
-
294
313
  if (event.payload.files === undefined || event.payload.files.length === 0) {
295
314
  // Submit the event over the websocket to trigger the event handler.
296
- return await applyEvent(Event(event.name), socket)
315
+ return await applyEvent(Event(event.name), socket);
297
316
  }
298
317
 
299
318
  // Start upload, but do not wait for it, which would block other events.
@@ -397,7 +416,7 @@ export const connect = async (
397
416
  console.log("Disconnect backend before bfcache on navigation");
398
417
  socket.current.disconnect();
399
418
  }
400
- }
419
+ };
401
420
 
402
421
  // Once the socket is open, hydrate the page.
403
422
  socket.current.on("connect", () => {
@@ -416,7 +435,7 @@ export const connect = async (
416
435
  });
417
436
 
418
437
  // On each received message, queue the updates and events.
419
- socket.current.on("event", (message) => {
438
+ socket.current.on("event", async (message) => {
420
439
  const update = JSON5.parse(message);
421
440
  for (const substate in update.delta) {
422
441
  dispatch[substate](update.delta[substate]);
@@ -574,7 +593,11 @@ export const hydrateClientStorage = (client_storage) => {
574
593
  }
575
594
  }
576
595
  }
577
- if (client_storage.cookies || client_storage.local_storage || client_storage.session_storage) {
596
+ if (
597
+ client_storage.cookies ||
598
+ client_storage.local_storage ||
599
+ client_storage.session_storage
600
+ ) {
578
601
  return client_storage_values;
579
602
  }
580
603
  return {};
@@ -614,15 +637,17 @@ const applyClientStorageDelta = (client_storage, delta) => {
614
637
  ) {
615
638
  const options = client_storage.local_storage[state_key];
616
639
  localStorage.setItem(options.name || state_key, delta[substate][key]);
617
- } else if(
640
+ } else if (
618
641
  client_storage.session_storage &&
619
642
  state_key in client_storage.session_storage &&
620
643
  typeof window !== "undefined"
621
644
  ) {
622
645
  const session_options = client_storage.session_storage[state_key];
623
- sessionStorage.setItem(session_options.name || state_key, delta[substate][key]);
646
+ sessionStorage.setItem(
647
+ session_options.name || state_key,
648
+ delta[substate][key]
649
+ );
624
650
  }
625
-
626
651
  }
627
652
  }
628
653
  };
@@ -651,7 +676,7 @@ export const useEventLoop = (
651
676
  if (!(args instanceof Array)) {
652
677
  args = [args];
653
678
  }
654
- const _e = args.filter((o) => o?.preventDefault !== undefined)[0]
679
+ const _e = args.filter((o) => o?.preventDefault !== undefined)[0];
655
680
 
656
681
  if (event_actions?.preventDefault && _e?.preventDefault) {
657
682
  _e.preventDefault();
@@ -671,7 +696,7 @@ export const useEventLoop = (
671
696
  debounce(
672
697
  combined_name,
673
698
  () => queueEvents(events, socket),
674
- event_actions.debounce,
699
+ event_actions.debounce
675
700
  );
676
701
  } else {
677
702
  queueEvents(events, socket);
@@ -696,30 +721,32 @@ export const useEventLoop = (
696
721
  }
697
722
  }, [router.isReady]);
698
723
 
699
- // Handle frontend errors and send them to the backend via websocket.
700
- useEffect(() => {
701
-
702
- if (typeof window === 'undefined') {
703
- return;
704
- }
705
-
706
- window.onerror = function (msg, url, lineNo, columnNo, error) {
707
- addEvents([Event(`${exception_state_name}.handle_frontend_exception`, {
724
+ // Handle frontend errors and send them to the backend via websocket.
725
+ useEffect(() => {
726
+ if (typeof window === "undefined") {
727
+ return;
728
+ }
729
+
730
+ window.onerror = function (msg, url, lineNo, columnNo, error) {
731
+ addEvents([
732
+ Event(`${exception_state_name}.handle_frontend_exception`, {
708
733
  stack: error.stack,
709
- })])
710
- return false;
711
- }
734
+ }),
735
+ ]);
736
+ return false;
737
+ };
712
738
 
713
- //NOTE: Only works in Chrome v49+
714
- //https://github.com/mknichel/javascript-errors?tab=readme-ov-file#promise-rejection-events
715
- window.onunhandledrejection = function (event) {
716
- addEvents([Event(`${exception_state_name}.handle_frontend_exception`, {
717
- stack: event.reason.stack,
718
- })])
719
- return false;
720
- }
721
-
722
- },[])
739
+ //NOTE: Only works in Chrome v49+
740
+ //https://github.com/mknichel/javascript-errors?tab=readme-ov-file#promise-rejection-events
741
+ window.onunhandledrejection = function (event) {
742
+ addEvents([
743
+ Event(`${exception_state_name}.handle_frontend_exception`, {
744
+ stack: event.reason.stack,
745
+ }),
746
+ ]);
747
+ return false;
748
+ };
749
+ }, []);
723
750
 
724
751
  // Main event loop.
725
752
  useEffect(() => {
@@ -782,11 +809,11 @@ export const useEventLoop = (
782
809
  // Route after the initial page hydration.
783
810
  useEffect(() => {
784
811
  const change_start = () => {
785
- const main_state_dispatch = dispatch["reflex___state____state"]
812
+ const main_state_dispatch = dispatch["reflex___state____state"];
786
813
  if (main_state_dispatch !== undefined) {
787
- main_state_dispatch({ is_hydrated: false })
814
+ main_state_dispatch({ is_hydrated: false });
788
815
  }
789
- }
816
+ };
790
817
  const change_complete = () => addEvents(onLoadInternalEvent());
791
818
  router.events.on("routeChangeStart", change_start);
792
819
  router.events.on("routeChangeComplete", change_complete);
@@ -805,7 +832,9 @@ export const useEventLoop = (
805
832
  * @returns True if the value is truthy, false otherwise.
806
833
  */
807
834
  export const isTrue = (val) => {
808
- return Array.isArray(val) ? val.length > 0 : !!val;
835
+ if (Array.isArray(val)) return val.length > 0;
836
+ if (val === Object(val)) return Object.keys(val).length > 0;
837
+ return Boolean(val);
809
838
  };
810
839
 
811
840
  /**
@@ -482,9 +482,8 @@ class App(MiddlewareMixin, LifespanMixin, Base):
482
482
  """
483
483
  # If the route is not set, get it from the callable.
484
484
  if route is None:
485
- assert isinstance(
486
- component, Callable
487
- ), "Route must be set if component is not a callable."
485
+ if not isinstance(component, Callable):
486
+ raise ValueError("Route must be set if component is not a callable.")
488
487
  # Format the route.
489
488
  route = format.format_route(component.__name__)
490
489
  else:
@@ -606,10 +605,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
606
605
  for route in self.pages:
607
606
  replaced_route = replace_brackets_with_keywords(route)
608
607
  for rw, r, nr in zip(
609
- replaced_route.split("/"),
610
- route.split("/"),
611
- new_route.split("/"),
612
- strict=False,
608
+ replaced_route.split("/"), route.split("/"), new_route.split("/")
613
609
  ):
614
610
  if rw in segments and r != nr:
615
611
  # If the slugs in the segments of both routes are not the same, then the route is invalid
@@ -958,7 +954,7 @@ class App(MiddlewareMixin, LifespanMixin, Base):
958
954
 
959
955
  # Prepopulate the global ExecutorSafeFunctions class with input data required by the compile functions.
960
956
  # This is required for multiprocessing to work, in presence of non-picklable inputs.
961
- for route, component in zip(self.pages, page_components, strict=False):
957
+ for route, component in zip(self.pages, page_components):
962
958
  ExecutorSafeFunctions.COMPILE_PAGE_ARGS_BY_ROUTE[route] = (
963
959
  route,
964
960
  component,
@@ -1172,7 +1168,6 @@ class App(MiddlewareMixin, LifespanMixin, Base):
1172
1168
  FRONTEND_ARG_SPEC,
1173
1169
  BACKEND_ARG_SPEC,
1174
1170
  ],
1175
- strict=False,
1176
1171
  ):
1177
1172
  if hasattr(handler_fn, "__name__"):
1178
1173
  _fn_name = handler_fn.__name__
@@ -1532,6 +1527,9 @@ class EventNamespace(AsyncNamespace):
1532
1527
  async def on_event(self, sid, data):
1533
1528
  """Event for receiving front-end websocket events.
1534
1529
 
1530
+ Raises:
1531
+ RuntimeError: If the Socket.IO is badly initialized.
1532
+
1535
1533
  Args:
1536
1534
  sid: The Socket.IO session id.
1537
1535
  data: The event data.
@@ -1544,9 +1542,11 @@ class EventNamespace(AsyncNamespace):
1544
1542
  self.sid_to_token[sid] = event.token
1545
1543
 
1546
1544
  # Get the event environment.
1547
- assert self.app.sio is not None
1545
+ if self.app.sio is None:
1546
+ raise RuntimeError("Socket.IO is not initialized.")
1548
1547
  environ = self.app.sio.get_environ(sid, self.namespace)
1549
- assert environ is not None
1548
+ if environ is None:
1549
+ raise RuntimeError("Socket.IO environ is not initialized.")
1550
1550
 
1551
1551
  # Get the client headers.
1552
1552
  headers = {
@@ -6,11 +6,13 @@ import asyncio
6
6
  import contextlib
7
7
  import functools
8
8
  import inspect
9
- import sys
10
9
  from typing import Callable, Coroutine, Set, Union
11
10
 
12
11
  from fastapi import FastAPI
13
12
 
13
+ from reflex.utils import console
14
+ from reflex.utils.exceptions import InvalidLifespanTaskType
15
+
14
16
  from .mixin import AppMixin
15
17
 
16
18
 
@@ -26,6 +28,7 @@ class LifespanMixin(AppMixin):
26
28
  try:
27
29
  async with contextlib.AsyncExitStack() as stack:
28
30
  for task in self.lifespan_tasks:
31
+ run_msg = f"Started lifespan task: {task.__name__} as {{type}}" # type: ignore
29
32
  if isinstance(task, asyncio.Task):
30
33
  running_tasks.append(task)
31
34
  else:
@@ -35,15 +38,19 @@ class LifespanMixin(AppMixin):
35
38
  _t = task()
36
39
  if isinstance(_t, contextlib._AsyncGeneratorContextManager):
37
40
  await stack.enter_async_context(_t)
41
+ console.debug(run_msg.format(type="asynccontextmanager"))
38
42
  elif isinstance(_t, Coroutine):
39
- running_tasks.append(asyncio.create_task(_t))
43
+ task_ = asyncio.create_task(_t)
44
+ task_.add_done_callback(lambda t: t.result())
45
+ running_tasks.append(task_)
46
+ console.debug(run_msg.format(type="coroutine"))
47
+ else:
48
+ console.debug(run_msg.format(type="function"))
40
49
  yield
41
50
  finally:
42
- cancel_kwargs = (
43
- {"msg": "lifespan_cleanup"} if sys.version_info >= (3, 9) else {}
44
- )
45
51
  for task in running_tasks:
46
- task.cancel(**cancel_kwargs)
52
+ console.debug(f"Canceling lifespan task: {task}")
53
+ task.cancel(msg="lifespan_cleanup")
47
54
 
48
55
  def register_lifespan_task(self, task: Callable | asyncio.Task, **task_kwargs):
49
56
  """Register a task to run during the lifespan of the app.
@@ -51,7 +58,18 @@ class LifespanMixin(AppMixin):
51
58
  Args:
52
59
  task: The task to register.
53
60
  task_kwargs: The kwargs of the task.
61
+
62
+ Raises:
63
+ InvalidLifespanTaskType: If the task is a generator function.
54
64
  """
65
+ if inspect.isgeneratorfunction(task) or inspect.isasyncgenfunction(task):
66
+ raise InvalidLifespanTaskType(
67
+ f"Task {task.__name__} of type generator must be decorated with contextlib.asynccontextmanager."
68
+ )
69
+
55
70
  if task_kwargs:
71
+ original_task = task
56
72
  task = functools.partial(task, **task_kwargs) # type: ignore
73
+ functools.update_wrapper(task, original_task) # type: ignore
57
74
  self.lifespan_tasks.add(task) # type: ignore
75
+ console.debug(f"Registered lifespan task: {task.__name__}") # type: ignore
@@ -15,7 +15,7 @@ if constants.CompileVars.APP != "app":
15
15
  telemetry.send("compile")
16
16
  app_module = get_app(reload=False)
17
17
  app = getattr(app_module, constants.CompileVars.APP)
18
- # For py3.8 and py3.9 compatibility when redis is used, we MUST add any decorator pages
18
+ # For py3.9 compatibility when redis is used, we MUST add any decorator pages
19
19
  # before compiling the app in a thread to avoid event loop error (REF-2172).
20
20
  app._apply_decorated_pages()
21
21
  compile_future = ThreadPoolExecutor(max_workers=1).submit(app._compile)
@@ -47,6 +47,9 @@ def validate_field_name(bases: List[Type["BaseModel"]], field_name: str) -> None
47
47
  # shadowed state vars when reloading app via utils.prerequisites.get_app(reload=True)
48
48
  pydantic_main.validate_field_name = validate_field_name # type: ignore
49
49
 
50
+ if TYPE_CHECKING:
51
+ from reflex.vars import Var
52
+
50
53
 
51
54
  class Base(BaseModel): # pyright: ignore [reportUnboundVariable]
52
55
  """The base class subclassed by all Reflex classes.
@@ -92,7 +95,7 @@ class Base(BaseModel): # pyright: ignore [reportUnboundVariable]
92
95
  return self
93
96
 
94
97
  @classmethod
95
- def get_fields(cls) -> dict[str, Any]:
98
+ def get_fields(cls) -> dict[str, ModelField]:
96
99
  """Get the fields of the object.
97
100
 
98
101
  Returns:
@@ -101,7 +104,7 @@ class Base(BaseModel): # pyright: ignore [reportUnboundVariable]
101
104
  return cls.__fields__
102
105
 
103
106
  @classmethod
104
- def add_field(cls, var: Any, default_value: Any):
107
+ def add_field(cls, var: Var, default_value: Any):
105
108
  """Add a pydantic field after class definition.
106
109
 
107
110
  Used by State.add_var() to correctly handle the new variable.
@@ -110,7 +113,7 @@ class Base(BaseModel): # pyright: ignore [reportUnboundVariable]
110
113
  var: The variable to add a pydantic field for.
111
114
  default_value: The default value of the field
112
115
  """
113
- var_name = var._js_expr.split(".")[-1]
116
+ var_name = var._var_field_name
114
117
  new_field = ModelField.infer(
115
118
  name=var_name,
116
119
  value=default_value,
@@ -133,13 +136,4 @@ class Base(BaseModel): # pyright: ignore [reportUnboundVariable]
133
136
  # Seems like this function signature was wrong all along?
134
137
  # If the user wants a field that we know of, get it and pass it off to _get_value
135
138
  key = getattr(self, key)
136
- return self._get_value(
137
- key,
138
- to_dict=True,
139
- by_alias=False,
140
- include=None,
141
- exclude=None,
142
- exclude_unset=False,
143
- exclude_defaults=False,
144
- exclude_none=False,
145
- )
139
+ return key
@@ -44,6 +44,9 @@ def compile_import_statement(fields: list[ImportVar]) -> tuple[str, list[str]]:
44
44
  Args:
45
45
  fields: The set of fields to import from the library.
46
46
 
47
+ Raises:
48
+ ValueError: If there is more than one default import.
49
+
47
50
  Returns:
48
51
  The libraries for default and rest.
49
52
  default: default library. When install "import def from library".
@@ -54,7 +57,8 @@ def compile_import_statement(fields: list[ImportVar]) -> tuple[str, list[str]]:
54
57
 
55
58
  # Check for default imports.
56
59
  defaults = {field for field in fields_set if field.is_default}
57
- assert len(defaults) < 2
60
+ if len(defaults) >= 2:
61
+ raise ValueError("Only one default import is allowed.")
58
62
 
59
63
  # Get the default import, and the specific imports.
60
64
  default = next(iter({field.name for field in defaults}), "")
@@ -92,6 +96,9 @@ def compile_imports(import_dict: ParsedImportDict) -> list[dict]:
92
96
  Args:
93
97
  import_dict: The import dict to compile.
94
98
 
99
+ Raises:
100
+ ValueError: If an import in the dict is invalid.
101
+
95
102
  Returns:
96
103
  The list of import dict.
97
104
  """
@@ -106,8 +113,10 @@ def compile_imports(import_dict: ParsedImportDict) -> list[dict]:
106
113
  continue
107
114
 
108
115
  if not lib:
109
- assert not default, "No default field allowed for empty library."
110
- assert rest is not None and len(rest) > 0, "No fields to import."
116
+ if default:
117
+ raise ValueError("No default field allowed for empty library.")
118
+ if rest is None or len(rest) == 0:
119
+ raise ValueError("No fields to import.")
111
120
  for module in sorted(rest):
112
121
  import_dicts.append(get_import_dict(module))
113
122
  continue
@@ -155,7 +164,7 @@ def compile_state(state: Type[BaseState]) -> dict:
155
164
  initial_state = state(_reflex_internal_init=True).dict(
156
165
  initial=True, include_computed=False
157
166
  )
158
- return format.format_state(initial_state)
167
+ return initial_state
159
168
 
160
169
 
161
170
  def _compile_client_storage_field(
@@ -429,11 +438,11 @@ def add_meta(
429
438
  Returns:
430
439
  The component with the metadata added.
431
440
  """
432
- meta_tags = [Meta.create(**item) for item in meta]
433
-
434
- children: list[Any] = [
435
- Title.create(title),
441
+ meta_tags = [
442
+ item if isinstance(item, Component) else Meta.create(**item) for item in meta
436
443
  ]
444
+
445
+ children: list[Any] = [Title.create(title)]
437
446
  if description:
438
447
  children.append(Description.create(content=description))
439
448
  children.append(Image.create(content=image))
@@ -7,7 +7,7 @@ from typing import Any, Iterator
7
7
  from reflex.components.component import Component
8
8
  from reflex.components.tags import Tag
9
9
  from reflex.components.tags.tagless import Tagless
10
- from reflex.vars.base import Var
10
+ from reflex.vars import ArrayVar, BooleanVar, ObjectVar, Var
11
11
 
12
12
 
13
13
  class Bare(Component):
@@ -33,6 +33,8 @@ class Bare(Component):
33
33
 
34
34
  def _render(self) -> Tag:
35
35
  if isinstance(self.contents, Var):
36
+ if isinstance(self.contents, (BooleanVar, ObjectVar, ArrayVar)):
37
+ return Tagless(contents=f"{{{str(self.contents.to_string())}}}")
36
38
  return Tagless(contents=f"{{{str(self.contents)}}}")
37
39
  return Tagless(contents=str(self.contents))
38
40
 
@@ -16,13 +16,15 @@ class Title(Component):
16
16
  def render(self) -> dict:
17
17
  """Render the title component.
18
18
 
19
+ Raises:
20
+ ValueError: If the title is not a single string.
21
+
19
22
  Returns:
20
23
  The rendered title component.
21
24
  """
22
25
  # Make sure the title is a single string.
23
- assert len(self.children) == 1 and isinstance(
24
- self.children[0], Bare
25
- ), "Title must be a single string."
26
+ if len(self.children) != 1 or not isinstance(self.children[0], Bare):
27
+ raise ValueError("Title must be a single string.")
26
28
  return super().render()
27
29
 
28
30