reflex 0.8.2a1__tar.gz → 0.8.3a2__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 (408) hide show
  1. {reflex-0.8.2a1 → reflex-0.8.3a2}/PKG-INFO +1 -1
  2. {reflex-0.8.2a1 → reflex-0.8.3a2}/pyproject.toml +6 -3
  3. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/state.js +7 -2
  4. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/__init__.py +1 -0
  5. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/__init__.pyi +2 -0
  6. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/app.py +8 -11
  7. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/compiler/compiler.py +10 -38
  8. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/error_boundary.py +6 -5
  9. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/__init__.py +1 -0
  10. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/__init__.pyi +3 -0
  11. reflex-0.8.3a2/reflex/components/core/window_events.py +104 -0
  12. reflex-0.8.3a2/reflex/components/core/window_events.pyi +84 -0
  13. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/__init__.pyi +4 -0
  14. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/__init__.py +1 -0
  15. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/__init__.pyi +5 -0
  16. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/forms.py +4 -2
  17. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/typography.py +7 -0
  18. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/typography.pyi +246 -0
  19. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/lucide/icon.py +303 -292
  20. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/lucide/icon.pyi +303 -292
  21. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/recharts.py +2 -2
  22. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/sonner/toast.py +1 -1
  23. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/installer.py +2 -1
  24. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/environment.py +3 -0
  25. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/event.py +69 -8
  26. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/model.py +55 -0
  27. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/reflex.py +33 -0
  28. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/state.py +9 -4
  29. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/testing.py +180 -288
  30. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/console.py +17 -0
  31. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/exec.py +22 -5
  32. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/processes.py +28 -38
  33. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/types.py +1 -1
  34. {reflex-0.8.2a1 → reflex-0.8.3a2}/.gitignore +0 -0
  35. {reflex-0.8.2a1 → reflex-0.8.3a2}/LICENSE +0 -0
  36. {reflex-0.8.2a1 → reflex-0.8.3a2}/README.md +0 -0
  37. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  38. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  39. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/apps/blank/code/blank.py +0 -0
  40. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
  41. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
  42. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
  43. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
  44. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
  45. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
  46. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
  47. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
  48. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
  49. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
  50. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
  51. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
  52. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
  53. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/macros.js.jinja2 +0 -0
  54. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
  55. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
  56. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
  57. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
  58. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
  59. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
  60. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/.gitignore +0 -0
  61. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/app/entry.client.js +0 -0
  62. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/app/routes.js +0 -0
  63. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  64. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/components/shiki/code.js +0 -0
  65. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/jsconfig.json +0 -0
  66. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/postcss.config.js +0 -0
  67. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/react-router.config.js +0 -0
  68. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  69. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/client_side_routing.js +0 -0
  70. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  71. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  72. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/helpers/paste.js +0 -0
  73. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/helpers/range.js +0 -0
  74. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  75. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/utils/react-theme.js +0 -0
  76. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
  77. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/.templates/web/vite.config.js +0 -0
  78. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/__main__.py +0 -0
  79. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/admin.py +0 -0
  80. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/app_mixins/__init__.py +0 -0
  81. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/app_mixins/lifespan.py +0 -0
  82. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/app_mixins/middleware.py +0 -0
  83. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/app_mixins/mixin.py +0 -0
  84. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/assets.py +0 -0
  85. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/base.py +0 -0
  86. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/compiler/__init__.py +0 -0
  87. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/compiler/templates.py +0 -0
  88. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/compiler/utils.py +0 -0
  89. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/__init__.py +0 -0
  90. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/__init__.pyi +0 -0
  91. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/__init__.py +0 -0
  92. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/__init__.pyi +0 -0
  93. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/app_wrap.py +0 -0
  94. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/app_wrap.pyi +0 -0
  95. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/bare.py +0 -0
  96. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/body.py +0 -0
  97. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/body.pyi +0 -0
  98. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/document.py +0 -0
  99. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/document.pyi +0 -0
  100. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/error_boundary.pyi +0 -0
  101. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/fragment.py +0 -0
  102. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/fragment.pyi +0 -0
  103. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/link.py +0 -0
  104. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/link.pyi +0 -0
  105. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/meta.py +0 -0
  106. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/meta.pyi +0 -0
  107. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/script.py +0 -0
  108. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/script.pyi +0 -0
  109. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/strict_mode.py +0 -0
  110. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/base/strict_mode.pyi +0 -0
  111. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/component.py +0 -0
  112. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/auto_scroll.py +0 -0
  113. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/auto_scroll.pyi +0 -0
  114. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/banner.py +0 -0
  115. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/banner.pyi +0 -0
  116. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/breakpoints.py +0 -0
  117. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/client_side_routing.py +0 -0
  118. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/client_side_routing.pyi +0 -0
  119. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/clipboard.py +0 -0
  120. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/clipboard.pyi +0 -0
  121. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/colors.py +0 -0
  122. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/cond.py +0 -0
  123. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/debounce.py +0 -0
  124. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/debounce.pyi +0 -0
  125. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/foreach.py +0 -0
  126. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/helmet.py +0 -0
  127. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/helmet.pyi +0 -0
  128. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/html.py +0 -0
  129. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/html.pyi +0 -0
  130. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/layout/__init__.py +0 -0
  131. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/match.py +0 -0
  132. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/responsive.py +0 -0
  133. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/sticky.py +0 -0
  134. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/sticky.pyi +0 -0
  135. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/upload.py +0 -0
  136. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/core/upload.pyi +0 -0
  137. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/__init__.py +0 -0
  138. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/__init__.pyi +0 -0
  139. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/code.py +0 -0
  140. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/code.pyi +0 -0
  141. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/dataeditor.py +0 -0
  142. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  143. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/logo.py +0 -0
  144. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  145. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  146. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/dynamic.py +0 -0
  147. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/__init__.py +0 -0
  148. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/constants/__init__.py +0 -0
  149. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/constants/html.py +0 -0
  150. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/constants/react.py +0 -0
  151. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/constants/reflex.py +0 -0
  152. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/element.py +0 -0
  153. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/element.pyi +0 -0
  154. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/base.py +0 -0
  155. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/base.pyi +0 -0
  156. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/forms.pyi +0 -0
  157. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/inline.py +0 -0
  158. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/inline.pyi +0 -0
  159. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/media.py +0 -0
  160. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/media.pyi +0 -0
  161. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/metadata.py +0 -0
  162. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/metadata.pyi +0 -0
  163. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/other.py +0 -0
  164. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/other.pyi +0 -0
  165. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/scripts.py +0 -0
  166. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/scripts.pyi +0 -0
  167. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/sectioning.py +0 -0
  168. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/sectioning.pyi +0 -0
  169. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/tables.py +0 -0
  170. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/el/elements/tables.pyi +0 -0
  171. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/field.py +0 -0
  172. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/gridjs/__init__.py +0 -0
  173. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/gridjs/datatable.py +0 -0
  174. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/gridjs/datatable.pyi +0 -0
  175. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/literals.py +0 -0
  176. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/lucide/__init__.py +0 -0
  177. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/markdown/__init__.py +0 -0
  178. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/markdown/markdown.py +0 -0
  179. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/markdown/markdown.pyi +0 -0
  180. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/moment/__init__.py +0 -0
  181. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/moment/moment.py +0 -0
  182. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/moment/moment.pyi +0 -0
  183. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/plotly/__init__.py +0 -0
  184. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/plotly/plotly.py +0 -0
  185. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/plotly/plotly.pyi +0 -0
  186. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/props.py +0 -0
  187. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/__init__.py +0 -0
  188. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/__init__.pyi +0 -0
  189. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/__init__.py +0 -0
  190. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/__init__.pyi +0 -0
  191. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/accordion.py +0 -0
  192. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/accordion.pyi +0 -0
  193. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/base.py +0 -0
  194. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/base.pyi +0 -0
  195. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/drawer.py +0 -0
  196. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/drawer.pyi +0 -0
  197. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/form.py +0 -0
  198. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/form.pyi +0 -0
  199. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/progress.py +0 -0
  200. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/progress.pyi +0 -0
  201. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/slider.py +0 -0
  202. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/primitives/slider.pyi +0 -0
  203. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/__init__.py +0 -0
  204. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/__init__.pyi +0 -0
  205. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/base.py +0 -0
  206. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/base.pyi +0 -0
  207. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/color_mode.py +0 -0
  208. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/color_mode.pyi +0 -0
  209. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/__init__.py +0 -0
  210. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  211. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  212. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  213. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  214. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  215. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/avatar.py +0 -0
  216. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  217. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/badge.py +0 -0
  218. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/badge.pyi +0 -0
  219. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/button.py +0 -0
  220. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/button.pyi +0 -0
  221. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/callout.py +0 -0
  222. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/callout.pyi +0 -0
  223. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/card.py +0 -0
  224. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/card.pyi +0 -0
  225. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/checkbox.py +0 -0
  226. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  227. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  228. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  229. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  230. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  231. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/context_menu.py +0 -0
  232. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  233. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/data_list.py +0 -0
  234. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  235. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/dialog.py +0 -0
  236. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  237. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  238. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  239. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/hover_card.py +0 -0
  240. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  241. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/icon_button.py +0 -0
  242. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  243. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/inset.py +0 -0
  244. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/inset.pyi +0 -0
  245. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/popover.py +0 -0
  246. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/popover.pyi +0 -0
  247. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/progress.py +0 -0
  248. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/progress.pyi +0 -0
  249. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/radio.py +0 -0
  250. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/radio.pyi +0 -0
  251. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  252. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  253. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/radio_group.py +0 -0
  254. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  255. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  256. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  257. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  258. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  259. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/select.py +0 -0
  260. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/select.pyi +0 -0
  261. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/separator.py +0 -0
  262. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/separator.pyi +0 -0
  263. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/skeleton.py +0 -0
  264. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  265. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/slider.py +0 -0
  266. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/slider.pyi +0 -0
  267. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/spinner.py +0 -0
  268. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  269. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/switch.py +0 -0
  270. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/switch.pyi +0 -0
  271. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/table.py +0 -0
  272. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/table.pyi +0 -0
  273. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/tabs.py +0 -0
  274. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  275. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/text_area.py +0 -0
  276. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  277. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/text_field.py +0 -0
  278. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  279. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/tooltip.py +0 -0
  280. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  281. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/__init__.py +0 -0
  282. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  283. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/base.py +0 -0
  284. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/base.pyi +0 -0
  285. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/box.py +0 -0
  286. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/box.pyi +0 -0
  287. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/center.py +0 -0
  288. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/center.pyi +0 -0
  289. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/container.py +0 -0
  290. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/container.pyi +0 -0
  291. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/flex.py +0 -0
  292. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  293. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/grid.py +0 -0
  294. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  295. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/list.py +0 -0
  296. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/list.pyi +0 -0
  297. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/section.py +0 -0
  298. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/section.pyi +0 -0
  299. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/spacer.py +0 -0
  300. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  301. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/stack.py +0 -0
  302. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  303. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/__init__.py +0 -0
  304. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  305. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/base.py +0 -0
  306. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  307. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  308. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/code.py +0 -0
  309. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/code.pyi +0 -0
  310. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/heading.py +0 -0
  311. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  312. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/link.py +0 -0
  313. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/link.pyi +0 -0
  314. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/text.py +0 -0
  315. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/radix/themes/typography/text.pyi +0 -0
  316. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_player/__init__.py +0 -0
  317. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_player/audio.py +0 -0
  318. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_player/audio.pyi +0 -0
  319. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_player/react_player.py +0 -0
  320. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_player/react_player.pyi +0 -0
  321. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_player/video.py +0 -0
  322. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_player/video.pyi +0 -0
  323. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_router/__init__.py +0 -0
  324. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_router/dom.py +0 -0
  325. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/react_router/dom.pyi +0 -0
  326. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/__init__.py +0 -0
  327. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/__init__.pyi +0 -0
  328. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/cartesian.py +0 -0
  329. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/cartesian.pyi +0 -0
  330. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/charts.py +0 -0
  331. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/charts.pyi +0 -0
  332. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/general.py +0 -0
  333. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/general.pyi +0 -0
  334. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/polar.py +0 -0
  335. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/polar.pyi +0 -0
  336. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/recharts/recharts.pyi +0 -0
  337. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/sonner/__init__.py +0 -0
  338. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/sonner/toast.pyi +0 -0
  339. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/tags/__init__.py +0 -0
  340. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/tags/cond_tag.py +0 -0
  341. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/tags/iter_tag.py +0 -0
  342. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/tags/match_tag.py +0 -0
  343. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/tags/tag.py +0 -0
  344. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/components/tags/tagless.py +0 -0
  345. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/config.py +3 -3
  346. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/__init__.py +0 -0
  347. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/base.py +0 -0
  348. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/colors.py +0 -0
  349. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/compiler.py +0 -0
  350. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/config.py +0 -0
  351. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/custom_components.py +0 -0
  352. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/event.py +0 -0
  353. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/route.py +0 -0
  354. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/state.py +0 -0
  355. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/constants/utils.py +0 -0
  356. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/custom_components/__init__.py +0 -0
  357. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/custom_components/custom_components.py +0 -0
  358. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/experimental/__init__.py +0 -0
  359. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/experimental/client_state.py +0 -0
  360. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/experimental/hooks.py +0 -0
  361. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/istate/__init__.py +0 -0
  362. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/istate/data.py +0 -0
  363. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/istate/dynamic.py +0 -0
  364. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/istate/manager.py +0 -0
  365. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/istate/proxy.py +0 -0
  366. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/istate/storage.py +0 -0
  367. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/istate/wrappers.py +0 -0
  368. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/middleware/__init__.py +0 -0
  369. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/middleware/hydrate_middleware.py +0 -0
  370. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/middleware/middleware.py +0 -0
  371. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/page.py +0 -0
  372. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/plugins/__init__.py +0 -0
  373. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/plugins/base.py +0 -0
  374. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/plugins/shared_tailwind.py +0 -0
  375. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/plugins/sitemap.py +0 -0
  376. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/plugins/tailwind_v3.py +0 -0
  377. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/plugins/tailwind_v4.py +0 -0
  378. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/py.typed +0 -0
  379. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/route.py +0 -0
  380. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/style.py +0 -0
  381. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/__init__.py +0 -0
  382. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/build.py +0 -0
  383. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/codespaces.py +0 -0
  384. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/compat.py +0 -0
  385. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/decorator.py +0 -0
  386. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/exceptions.py +0 -0
  387. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/export.py +0 -0
  388. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/format.py +0 -0
  389. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/imports.py +0 -0
  390. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/lazy_loader.py +0 -0
  391. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/misc.py +0 -0
  392. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/net.py +0 -0
  393. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/path_ops.py +0 -0
  394. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/prerequisites.py +0 -0
  395. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/pyi_generator.py +0 -0
  396. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/redir.py +0 -0
  397. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/registry.py +0 -0
  398. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/serializers.py +0 -0
  399. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/utils/telemetry.py +0 -0
  400. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/__init__.py +0 -0
  401. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/base.py +0 -0
  402. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/datetime.py +0 -0
  403. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/dep_tracking.py +0 -0
  404. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/function.py +0 -0
  405. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/number.py +0 -0
  406. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/object.py +0 -0
  407. {reflex-0.8.2a1 → reflex-0.8.3a2}/reflex/vars/sequence.py +0 -0
  408. {reflex-0.8.2a1 → reflex-0.8.3a2}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.2a1
3
+ Version: 0.8.3a2
4
4
  Summary: Web apps in pure Python.
5
5
  Project-URL: homepage, https://reflex.dev
6
6
  Project-URL: repository, https://github.com/reflex-dev/reflex
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "reflex"
3
- version = "0.8.2a1"
3
+ version = "0.8.3a2"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -229,7 +229,7 @@ fail_fast = true
229
229
 
230
230
  [[tool.pre-commit.repos]]
231
231
  repo = "https://github.com/astral-sh/ruff-pre-commit"
232
- rev = "v0.12.2"
232
+ rev = "v0.12.3"
233
233
  hooks = [
234
234
  { id = "ruff-format", args = [
235
235
  "reflex",
@@ -261,7 +261,7 @@ hooks = [
261
261
 
262
262
  [[tool.pre-commit.repos]]
263
263
  repo = "https://github.com/RobertCraigie/pyright-python"
264
- rev = "v1.1.402"
264
+ rev = "v1.1.403"
265
265
  hooks = [{ id = "pyright", args = ["reflex", "tests"], language = "system" }]
266
266
 
267
267
  [[tool.pre-commit.repos]]
@@ -273,3 +273,6 @@ hooks = [{ id = "darglint", exclude = "^reflex/reflex.py" }]
273
273
  repo = "https://github.com/pre-commit/mirrors-prettier"
274
274
  rev = "f62a70a3a7114896b062de517d72829ea1c884b6"
275
275
  hooks = [{ id = "prettier", require_serial = true }]
276
+
277
+ [tool.uv]
278
+ required-version = ">=0.7.0"
@@ -993,7 +993,7 @@ export const useEventLoop = (
993
993
  window.onerror = function (msg, url, lineNo, columnNo, error) {
994
994
  addEvents([
995
995
  Event(`${exception_state_name}.handle_frontend_exception`, {
996
- stack: error.stack,
996
+ info: error.name + ": " + error.message + "\n" + error.stack,
997
997
  component_stack: "",
998
998
  }),
999
999
  ]);
@@ -1005,7 +1005,12 @@ export const useEventLoop = (
1005
1005
  window.onunhandledrejection = function (event) {
1006
1006
  addEvents([
1007
1007
  Event(`${exception_state_name}.handle_frontend_exception`, {
1008
- stack: event.reason?.stack,
1008
+ info:
1009
+ event.reason?.name +
1010
+ ": " +
1011
+ event.reason?.message +
1012
+ "\n" +
1013
+ event.reason?.stack,
1009
1014
  component_stack: "",
1010
1015
  }),
1011
1016
  ]);
@@ -249,6 +249,7 @@ COMPONENTS_CORE_MAPPING: dict = {
249
249
  "upload",
250
250
  ],
251
251
  "components.core.auto_scroll": ["auto_scroll"],
252
+ "components.core.window_events": ["window_event_listener"],
252
253
  }
253
254
 
254
255
  COMPONENTS_BASE_MAPPING: dict = {
@@ -52,6 +52,7 @@ from .components.core.upload import (
52
52
  selected_files,
53
53
  upload,
54
54
  )
55
+ from .components.core.window_events import window_event_listener
55
56
  from .components.datadisplay.code import code_block
56
57
  from .components.datadisplay.dataeditor import data_editor, data_editor_theme
57
58
  from .components.datadisplay.logo import logo
@@ -348,4 +349,5 @@ __all__ = [
348
349
  "video",
349
350
  "vstack",
350
351
  "window_alert",
352
+ "window_event_listener",
351
353
  ]
@@ -400,6 +400,9 @@ class App(MiddlewareMixin, LifespanMixin):
400
400
  # The state class to use for the app.
401
401
  _state: type[BaseState] | None = None
402
402
 
403
+ # Whether to enable state for the app. If False, the app will not use state.
404
+ enable_state: bool = True
405
+
403
406
  # Class to manage many client states.
404
407
  _state_manager: StateManager | None = None
405
408
 
@@ -480,7 +483,8 @@ class App(MiddlewareMixin, LifespanMixin):
480
483
  if issubclass(clz, AppMixin):
481
484
  clz._init_mixin(self)
482
485
 
483
- self._setup_state()
486
+ if self.enable_state:
487
+ self._enable_state()
484
488
 
485
489
  # Set up the admin dash.
486
490
  self._setup_admin_dash()
@@ -495,7 +499,7 @@ class App(MiddlewareMixin, LifespanMixin):
495
499
  """Enable state for the app."""
496
500
  if not self._state:
497
501
  self._state = State
498
- self._setup_state()
502
+ self._setup_state()
499
503
 
500
504
  def _setup_state(self) -> None:
501
505
  """Set up the state for the app.
@@ -847,14 +851,10 @@ class App(MiddlewareMixin, LifespanMixin):
847
851
  save_page: If True, the compiled page is saved to self._pages.
848
852
  """
849
853
  n_states_before = len(all_base_state_classes)
850
- component, enable_state = compiler.compile_unevaluated_page(
851
- route, self._unevaluated_pages[route], self._state, self.style, self.theme
854
+ component = compiler.compile_unevaluated_page(
855
+ route, self._unevaluated_pages[route], self.style, self.theme
852
856
  )
853
857
 
854
- # Indicate that the app should use state.
855
- if enable_state:
856
- self._enable_state()
857
-
858
858
  # Indicate that evaluating this page creates one or more state classes.
859
859
  if len(all_base_state_classes) > n_states_before:
860
860
  self._stateful_pages[route] = None
@@ -1146,7 +1146,6 @@ class App(MiddlewareMixin, LifespanMixin):
1146
1146
  for route in stateful_pages:
1147
1147
  console.debug(f"BE Evaluating stateful page: {route}")
1148
1148
  self._compile_page(route, save_page=False)
1149
- self._enable_state()
1150
1149
  self._add_optional_endpoints()
1151
1150
  return
1152
1151
 
@@ -1345,8 +1344,6 @@ class App(MiddlewareMixin, LifespanMixin):
1345
1344
  for route, component in zip(self._pages, page_components, strict=True):
1346
1345
  ExecutorSafeFunctions.COMPONENTS[route] = component
1347
1346
 
1348
- ExecutorSafeFunctions.STATE = self._state
1349
-
1350
1347
  modify_files_tasks: list[tuple[str, str, Callable[[str], str]]] = []
1351
1348
 
1352
1349
  with console.timing("Compile to Javascript"), executor as executor:
@@ -145,15 +145,11 @@ def _compile_contexts(state: type[BaseState] | None, theme: Component | None) ->
145
145
  )
146
146
 
147
147
 
148
- def _compile_page(
149
- component: BaseComponent,
150
- state: type[BaseState] | None,
151
- ) -> str:
152
- """Compile the component given the app state.
148
+ def _compile_page(component: BaseComponent) -> str:
149
+ """Compile the component.
153
150
 
154
151
  Args:
155
152
  component: The component to compile.
156
- state: The app state.
157
153
 
158
154
  Returns:
159
155
  The compiled component.
@@ -163,15 +159,12 @@ def _compile_page(
163
159
  imports = utils.compile_imports(imports)
164
160
 
165
161
  # Compile the code to render the component.
166
- kwargs = {"state_name": state.get_name()} if state is not None else {}
167
-
168
162
  return templates.PAGE.render(
169
163
  imports=imports,
170
164
  dynamic_imports=component._get_all_dynamic_imports(),
171
165
  custom_codes=component._get_all_custom_code(),
172
166
  hooks=component._get_all_hooks(),
173
167
  render=component.render(),
174
- **kwargs,
175
168
  )
176
169
 
177
170
 
@@ -556,15 +549,12 @@ def compile_contexts(
556
549
  return output_path, _compile_contexts(state, theme)
557
550
 
558
551
 
559
- def compile_page(
560
- path: str, component: BaseComponent, state: type[BaseState] | None
561
- ) -> tuple[str, str]:
552
+ def compile_page(path: str, component: BaseComponent) -> tuple[str, str]:
562
553
  """Compile a single page.
563
554
 
564
555
  Args:
565
556
  path: The path to compile the page to.
566
557
  component: The component to compile.
567
- state: The app state.
568
558
 
569
559
  Returns:
570
560
  The path and code of the compiled page.
@@ -573,7 +563,7 @@ def compile_page(
573
563
  output_path = utils.get_page_path(path)
574
564
 
575
565
  # Add the style to the component.
576
- code = _compile_page(component, state)
566
+ code = _compile_page(component)
577
567
  return output_path, code
578
568
 
579
569
 
@@ -788,16 +778,14 @@ def into_component(component: Component | ComponentCallable) -> Component:
788
778
  def compile_unevaluated_page(
789
779
  route: str,
790
780
  page: UnevaluatedPage,
791
- state: type[BaseState] | None = None,
792
781
  style: ComponentStyle | None = None,
793
782
  theme: Component | None = None,
794
- ) -> tuple[Component, bool]:
783
+ ) -> Component:
795
784
  """Compiles an uncompiled page into a component and adds meta information.
796
785
 
797
786
  Args:
798
787
  route: The route of the page.
799
788
  page: The uncompiled page object.
800
- state: The state of the app.
801
789
  style: The style of the page.
802
790
  theme: The theme of the page.
803
791
 
@@ -813,21 +801,6 @@ def compile_unevaluated_page(
813
801
 
814
802
  component._add_style_recursive(style or {}, theme)
815
803
 
816
- enable_state = False
817
- # Ensure state is enabled if this page uses state.
818
- if state is None:
819
- if page.on_load or component._has_stateful_event_triggers():
820
- enable_state = True
821
- else:
822
- for var in component._get_vars(include_children=True):
823
- var_data = var._get_all_var_data()
824
- if not var_data:
825
- continue
826
- if not var_data.state:
827
- continue
828
- enable_state = True
829
- break
830
-
831
804
  from reflex.utils.format import make_default_page_title
832
805
 
833
806
  component = Fragment.create(component)
@@ -856,7 +829,7 @@ def compile_unevaluated_page(
856
829
  e.add_note(f"Happened while evaluating page {route!r}")
857
830
  raise
858
831
  else:
859
- return component, enable_state
832
+ return component
860
833
 
861
834
 
862
835
  class ExecutorSafeFunctions:
@@ -886,7 +859,6 @@ class ExecutorSafeFunctions:
886
859
 
887
860
  COMPONENTS: dict[str, BaseComponent] = {}
888
861
  UNCOMPILED_PAGES: dict[str, UnevaluatedPage] = {}
889
- STATE: type[BaseState] | None = None
890
862
 
891
863
  @classmethod
892
864
  def compile_page(cls, route: str) -> tuple[str, str]:
@@ -898,7 +870,7 @@ class ExecutorSafeFunctions:
898
870
  Returns:
899
871
  The path and code of the compiled page.
900
872
  """
901
- return compile_page(route, cls.COMPONENTS[route], cls.STATE)
873
+ return compile_page(route, cls.COMPONENTS[route])
902
874
 
903
875
  @classmethod
904
876
  def compile_unevaluated_page(
@@ -917,10 +889,10 @@ class ExecutorSafeFunctions:
917
889
  Returns:
918
890
  The route, compiled component, and compiled page.
919
891
  """
920
- component, enable_state = compile_unevaluated_page(
921
- route, cls.UNCOMPILED_PAGES[route], cls.STATE, style, theme
892
+ component = compile_unevaluated_page(
893
+ route, cls.UNCOMPILED_PAGES[route], style, theme
922
894
  )
923
- return route, component, compile_page(route, component, cls.STATE)
895
+ return route, component, compile_page(route, component)
924
896
 
925
897
  @classmethod
926
898
  def compile_theme(cls, style: ComponentStyle | None) -> tuple[str, str]:
@@ -25,11 +25,14 @@ def on_error_spec(
25
25
  The arguments for the event handler.
26
26
  """
27
27
  return (
28
- error.stack,
28
+ error.name.to(str) + ": " + error.message.to(str) + "\n" + error.stack.to(str),
29
29
  info.componentStack,
30
30
  )
31
31
 
32
32
 
33
+ _ERROR_DISPLAY: str = r"""event_args.error.name + ': ' + event_args.error.message + '\n' + event_args.error.stack"""
34
+
35
+
33
36
  class ErrorBoundary(Component):
34
37
  """A React Error Boundary component that catches unhandled frontend exceptions."""
35
38
 
@@ -76,9 +79,7 @@ class ErrorBoundary(Component):
76
79
  div(
77
80
  div(
78
81
  pre(
79
- Var(
80
- _js_expr="event_args.error.stack",
81
- ),
82
+ Var(_js_expr=_ERROR_DISPLAY),
82
83
  ),
83
84
  padding="0.5rem",
84
85
  width="fit-content",
@@ -93,7 +94,7 @@ class ErrorBoundary(Component):
93
94
  button(
94
95
  "Copy",
95
96
  on_click=set_clipboard(
96
- Var(_js_expr="event_args.error.stack"),
97
+ Var(_js_expr=_ERROR_DISPLAY)
97
98
  ),
98
99
  padding="0.35rem 0.75rem",
99
100
  margin="0.5rem",
@@ -50,6 +50,7 @@ _SUBMOD_ATTRS: dict[str, list[str]] = {
50
50
  "selected_files",
51
51
  ],
52
52
  "auto_scroll": ["auto_scroll"],
53
+ "window_events": ["WindowEventListener", "window_event_listener"],
53
54
  }
54
55
 
55
56
  __getattr__, __dir__, __all__ = lazy_loader.attach(
@@ -39,6 +39,7 @@ from .upload import (
39
39
  selected_files,
40
40
  upload,
41
41
  )
42
+ from .window_events import WindowEventListener, window_event_listener
42
43
 
43
44
  __all__ = [
44
45
  "Clipboard",
@@ -52,6 +53,7 @@ __all__ = [
52
53
  "Helmet",
53
54
  "Html",
54
55
  "Match",
56
+ "WindowEventListener",
55
57
  "auto_scroll",
56
58
  "breakpoints",
57
59
  "cancel_upload",
@@ -79,4 +81,5 @@ __all__ = [
79
81
  "tablet_and_desktop",
80
82
  "tablet_only",
81
83
  "upload",
84
+ "window_event_listener",
82
85
  ]
@@ -0,0 +1,104 @@
1
+ """Window event listener component for Reflex."""
2
+
3
+ import reflex as rx
4
+ from reflex.components.base.fragment import Fragment
5
+ from reflex.constants.compiler import Hooks
6
+ from reflex.event import key_event, no_args_event_spec
7
+ from reflex.vars.base import Var, VarData
8
+ from reflex.vars.object import ObjectVar
9
+
10
+
11
+ def _on_resize_spec() -> tuple[Var[int], Var[int]]:
12
+ """Args spec for the on_resize event trigger.
13
+
14
+ Returns:
15
+ A tuple containing window width and height variables.
16
+ """
17
+ return (Var("window.innerWidth"), Var("window.innerHeight"))
18
+
19
+
20
+ def _on_scroll_spec() -> tuple[Var[float], Var[float]]:
21
+ """Args spec for the on_scroll event trigger.
22
+
23
+ Returns:
24
+ A tuple containing window scroll X and Y position variables.
25
+ """
26
+ return (Var("window.scrollX"), Var("window.scrollY"))
27
+
28
+
29
+ def _on_visibility_change_spec() -> tuple[Var[bool]]:
30
+ """Args spec for the on_visibility_change event trigger.
31
+
32
+ Returns:
33
+ A tuple containing the document hidden state variable.
34
+ """
35
+ return (Var("document.hidden"),)
36
+
37
+
38
+ def _on_storage_spec(e: ObjectVar) -> tuple[Var[str], Var[str], Var[str], Var[str]]:
39
+ """Args spec for the on_storage event trigger.
40
+
41
+ Args:
42
+ e: The storage event.
43
+
44
+ Returns:
45
+ A tuple containing key, old value, new value, and URL variables.
46
+ """
47
+ return (e.key.to(str), e.oldValue.to(str), e.newValue.to(str), e.url.to(str))
48
+
49
+
50
+ class WindowEventListener(Fragment):
51
+ """A component that listens for window events."""
52
+
53
+ # Event handlers
54
+ on_resize: rx.EventHandler[_on_resize_spec]
55
+ on_scroll: rx.EventHandler[_on_scroll_spec]
56
+ on_focus: rx.EventHandler[no_args_event_spec]
57
+ on_blur: rx.EventHandler[no_args_event_spec]
58
+ on_visibility_change: rx.EventHandler[_on_visibility_change_spec]
59
+ on_before_unload: rx.EventHandler[no_args_event_spec]
60
+ on_key_down: rx.EventHandler[key_event]
61
+ on_popstate: rx.EventHandler[no_args_event_spec]
62
+ on_storage: rx.EventHandler[_on_storage_spec]
63
+
64
+ def _exclude_props(self) -> list[str]:
65
+ """Exclude event handler props from being passed to Fragment.
66
+
67
+ Returns:
68
+ List of prop names to exclude from the Fragment.
69
+ """
70
+ return [*super()._exclude_props(), *self.event_triggers.keys()]
71
+
72
+ def add_hooks(self) -> list[str | Var[str]]:
73
+ """Add hooks to register window event listeners.
74
+
75
+ Returns:
76
+ The hooks to add to the component.
77
+ """
78
+ hooks = []
79
+
80
+ for prop_name, event_trigger in self.event_triggers.items():
81
+ # Get JS event name: remove on_ prefix and underscores
82
+ event_name = prop_name.removeprefix("on_").replace("_", "")
83
+
84
+ hook_expr = f"""
85
+ useEffect(() => {{
86
+ if (typeof window === 'undefined') return;
87
+
88
+ window.addEventListener('{event_name}', {event_trigger});
89
+ return () => window.removeEventListener('{event_name}', {event_trigger});
90
+ }}, []);
91
+ """
92
+
93
+ hooks.append(
94
+ Var(
95
+ hook_expr,
96
+ _var_type="str",
97
+ _var_data=VarData(position=Hooks.HookPosition.POST_TRIGGER),
98
+ )
99
+ )
100
+
101
+ return hooks
102
+
103
+
104
+ window_event_listener = WindowEventListener.create
@@ -0,0 +1,84 @@
1
+ """Stub file for reflex/components/core/window_events.py"""
2
+
3
+ # ------------------- DO NOT EDIT ----------------------
4
+ # This file was generated by `reflex/utils/pyi_generator.py`!
5
+ # ------------------------------------------------------
6
+ from collections.abc import Mapping, Sequence
7
+ from typing import Any
8
+
9
+ from reflex.components.base.fragment import Fragment
10
+ from reflex.components.core.breakpoints import Breakpoints
11
+ from reflex.event import EventType, KeyInputInfo, PointerEventInfo
12
+ from reflex.vars.base import Var
13
+
14
+ class WindowEventListener(Fragment):
15
+ def add_hooks(self) -> list[str | Var[str]]: ...
16
+ @classmethod
17
+ def create(
18
+ cls,
19
+ *children,
20
+ style: Sequence[Mapping[str, Any]]
21
+ | Mapping[str, Any]
22
+ | Var[Mapping[str, Any]]
23
+ | Breakpoints
24
+ | None = None,
25
+ key: Any | None = None,
26
+ id: Any | None = None,
27
+ ref: Var | None = None,
28
+ class_name: Any | None = None,
29
+ autofocus: bool | None = None,
30
+ custom_attrs: dict[str, Var | Any] | None = None,
31
+ on_before_unload: EventType[()] | None = None,
32
+ on_blur: EventType[()] | None = None,
33
+ on_click: EventType[()] | EventType[PointerEventInfo] | None = None,
34
+ on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
35
+ on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
36
+ on_focus: EventType[()] | None = None,
37
+ on_key_down: EventType[()]
38
+ | EventType[str]
39
+ | EventType[str, KeyInputInfo]
40
+ | None = None,
41
+ on_mount: EventType[()] | None = None,
42
+ on_mouse_down: EventType[()] | None = None,
43
+ on_mouse_enter: EventType[()] | None = None,
44
+ on_mouse_leave: EventType[()] | None = None,
45
+ on_mouse_move: EventType[()] | None = None,
46
+ on_mouse_out: EventType[()] | None = None,
47
+ on_mouse_over: EventType[()] | None = None,
48
+ on_mouse_up: EventType[()] | None = None,
49
+ on_popstate: EventType[()] | None = None,
50
+ on_resize: EventType[()] | EventType[int] | EventType[int, int] | None = None,
51
+ on_scroll: EventType[()]
52
+ | EventType[float]
53
+ | EventType[float, float]
54
+ | None = None,
55
+ on_scroll_end: EventType[()] | None = None,
56
+ on_storage: EventType[()]
57
+ | EventType[str]
58
+ | EventType[str, str]
59
+ | EventType[str, str, str]
60
+ | EventType[str, str, str, str]
61
+ | None = None,
62
+ on_unmount: EventType[()] | None = None,
63
+ on_visibility_change: EventType[()] | EventType[bool] | None = None,
64
+ **props,
65
+ ) -> WindowEventListener:
66
+ """Create the component.
67
+
68
+ Args:
69
+ *children: The children of the component.
70
+ on_resize: Event handlers
71
+ style: The style of the component.
72
+ key: A unique key for the component.
73
+ id: The id for the component.
74
+ ref: The Var to pass as the ref to the component.
75
+ class_name: The class name for the component.
76
+ autofocus: Whether the component should take the focus once the page is loaded
77
+ custom_attrs: custom attribute
78
+ **props: The props of the component.
79
+
80
+ Returns:
81
+ The component.
82
+ """
83
+
84
+ window_event_listener = WindowEventListener.create
@@ -239,6 +239,7 @@ from .elements.typography import (
239
239
  Dl,
240
240
  Dt,
241
241
  Figcaption,
242
+ Figure,
242
243
  Hr,
243
244
  Ins,
244
245
  Li,
@@ -253,6 +254,7 @@ from .elements.typography import (
253
254
  dl,
254
255
  dt,
255
256
  figcaption,
257
+ figure,
256
258
  hr,
257
259
  ins,
258
260
  li,
@@ -307,6 +309,7 @@ __all__ = [
307
309
  "Embed",
308
310
  "Fieldset",
309
311
  "Figcaption",
312
+ "Figure",
310
313
  "Footer",
311
314
  "Form",
312
315
  "G",
@@ -424,6 +427,7 @@ __all__ = [
424
427
  "embed",
425
428
  "fieldset",
426
429
  "figcaption",
430
+ "figure",
427
431
  "footer",
428
432
  "form",
429
433
  "g",
@@ -125,6 +125,7 @@ _MAPPING = {
125
125
  "dl",
126
126
  "dt",
127
127
  "figcaption",
128
+ "figure",
128
129
  "hr",
129
130
  "ol",
130
131
  "li",
@@ -237,6 +237,7 @@ from .typography import (
237
237
  Dl,
238
238
  Dt,
239
239
  Figcaption,
240
+ Figure,
240
241
  Hr,
241
242
  Ins,
242
243
  Li,
@@ -251,6 +252,7 @@ from .typography import (
251
252
  dl,
252
253
  dt,
253
254
  figcaption,
255
+ figure,
254
256
  hr,
255
257
  ins,
256
258
  li,
@@ -374,6 +376,7 @@ _MAPPING = {
374
376
  "dl",
375
377
  "dt",
376
378
  "figcaption",
379
+ "figure",
377
380
  "hr",
378
381
  "ol",
379
382
  "li",
@@ -443,6 +446,7 @@ __all__ = [
443
446
  "Embed",
444
447
  "Fieldset",
445
448
  "Figcaption",
449
+ "Figure",
446
450
  "Footer",
447
451
  "Form",
448
452
  "G",
@@ -559,6 +563,7 @@ __all__ = [
559
563
  "embed",
560
564
  "fieldset",
561
565
  "figcaption",
566
+ "figure",
562
567
  "footer",
563
568
  "form",
564
569
  "g",
@@ -466,11 +466,13 @@ class Input(BaseInput):
466
466
  if cls is Input:
467
467
  input_type = props.get("type")
468
468
 
469
- if input_type == "checkbox":
469
+ if isinstance(input_type, str) and input_type == "checkbox":
470
470
  # Checkbox inputs should use the CheckboxInput class
471
471
  return CheckboxInput.create(*children, **props)
472
472
 
473
- if input_type == "number" or input_type == "range":
473
+ if isinstance(input_type, str) and (
474
+ input_type == "number" or input_type == "range"
475
+ ):
474
476
  # Number inputs should use the ValueNumberInput class
475
477
  return ValueNumberInput.create(*children, **props)
476
478
 
@@ -46,6 +46,12 @@ class Figcaption(BaseHTML):
46
46
  tag = "figcaption"
47
47
 
48
48
 
49
+ class Figure(BaseHTML):
50
+ """Display the figure element."""
51
+
52
+ tag = "figure"
53
+
54
+
49
55
  class Hr(BaseHTML):
50
56
  """Display the hr element."""
51
57
 
@@ -132,6 +138,7 @@ div = Div.create
132
138
  dl = Dl.create
133
139
  dt = Dt.create
134
140
  figcaption = Figcaption.create
141
+ figure = Figure.create
135
142
  hr = Hr.create
136
143
  li = Li.create
137
144
  ol = Ol.create