reflex 0.8.21__tar.gz → 0.8.23a4__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.
Files changed (397) hide show
  1. {reflex-0.8.21 → reflex-0.8.23a4}/PKG-INFO +1 -1
  2. {reflex-0.8.21 → reflex-0.8.23a4}/pyproject.toml +2 -2
  3. reflex-0.8.23a4/reflex/.templates/web/utils/helpers/paste.js +105 -0
  4. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/utils/state.js +2 -2
  5. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/__init__.py +1 -0
  6. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/__init__.pyi +2 -0
  7. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/app.py +14 -6
  8. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/compiler/templates.py +5 -1
  9. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/compiler/utils.py +6 -4
  10. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/component.py +12 -9
  11. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/__init__.py +2 -2
  12. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/lucide/icon.py +10 -3
  13. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/lucide/icon.pyi +10 -3
  14. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/markdown/markdown.py +2 -2
  15. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/plotly/plotly.py +3 -3
  16. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/recharts.py +2 -2
  17. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/installer.py +6 -6
  18. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/environment.py +3 -0
  19. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/data.py +21 -6
  20. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/manager/__init__.py +29 -0
  21. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/manager/redis.py +3 -3
  22. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/proxy.py +8 -4
  23. reflex-0.8.23a4/reflex/istate/shared.py +402 -0
  24. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/model.py +6 -1
  25. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/state.py +32 -3
  26. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/testing.py +4 -3
  27. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/build.py +3 -2
  28. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/processes.py +6 -5
  29. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/base.py +13 -7
  30. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/dep_tracking.py +163 -22
  31. reflex-0.8.21/reflex/.templates/web/utils/helpers/paste.js +0 -59
  32. {reflex-0.8.21 → reflex-0.8.23a4}/.gitignore +0 -0
  33. {reflex-0.8.21 → reflex-0.8.23a4}/LICENSE +0 -0
  34. {reflex-0.8.21 → reflex-0.8.23a4}/README.md +0 -0
  35. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
  36. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/apps/blank/code/__init__.py +0 -0
  37. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/apps/blank/code/blank.py +0 -0
  38. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/.gitignore +0 -0
  39. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/app/entry.client.js +0 -0
  40. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/app/routes.js +0 -0
  41. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
  42. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/components/shiki/code.js +0 -0
  43. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/jsconfig.json +0 -0
  44. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/postcss.config.js +0 -0
  45. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/react-router.config.js +0 -0
  46. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
  47. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
  48. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
  49. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/utils/helpers/range.js +0 -0
  50. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
  51. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/utils/helpers/upload.js +0 -0
  52. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/utils/react-theme.js +0 -0
  53. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
  54. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/__main__.py +0 -0
  55. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/admin.py +0 -0
  56. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/app_mixins/__init__.py +0 -0
  57. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/app_mixins/lifespan.py +0 -0
  58. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/app_mixins/middleware.py +0 -0
  59. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/app_mixins/mixin.py +0 -0
  60. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/assets.py +0 -0
  61. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/base.py +0 -0
  62. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/compiler/__init__.py +0 -0
  63. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/compiler/compiler.py +0 -0
  64. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/__init__.py +0 -0
  65. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/__init__.pyi +0 -0
  66. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/__init__.py +0 -0
  67. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/__init__.pyi +0 -0
  68. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/app_wrap.py +0 -0
  69. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/app_wrap.pyi +0 -0
  70. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/bare.py +0 -0
  71. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/body.py +0 -0
  72. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/body.pyi +0 -0
  73. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/document.py +0 -0
  74. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/document.pyi +0 -0
  75. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/error_boundary.py +0 -0
  76. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/error_boundary.pyi +0 -0
  77. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/fragment.py +0 -0
  78. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/fragment.pyi +0 -0
  79. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/link.py +0 -0
  80. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/link.pyi +0 -0
  81. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/meta.py +0 -0
  82. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/meta.pyi +0 -0
  83. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/script.py +0 -0
  84. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/script.pyi +0 -0
  85. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/strict_mode.py +0 -0
  86. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/base/strict_mode.pyi +0 -0
  87. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/__init__.py +0 -0
  88. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/__init__.pyi +0 -0
  89. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/auto_scroll.py +0 -0
  90. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/auto_scroll.pyi +0 -0
  91. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/banner.py +0 -0
  92. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/banner.pyi +0 -0
  93. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/breakpoints.py +0 -0
  94. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/clipboard.py +0 -0
  95. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/clipboard.pyi +0 -0
  96. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/colors.py +0 -0
  97. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/cond.py +0 -0
  98. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/debounce.py +0 -0
  99. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/debounce.pyi +0 -0
  100. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/foreach.py +0 -0
  101. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/helmet.py +0 -0
  102. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/helmet.pyi +0 -0
  103. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/html.py +0 -0
  104. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/html.pyi +0 -0
  105. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/layout/__init__.py +0 -0
  106. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/match.py +0 -0
  107. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/responsive.py +0 -0
  108. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/sticky.py +0 -0
  109. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/sticky.pyi +0 -0
  110. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/upload.py +0 -0
  111. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/upload.pyi +0 -0
  112. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/window_events.py +0 -0
  113. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/core/window_events.pyi +0 -0
  114. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/__init__.py +0 -0
  115. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/__init__.pyi +0 -0
  116. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/code.py +0 -0
  117. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/code.pyi +0 -0
  118. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/dataeditor.py +0 -0
  119. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/dataeditor.pyi +0 -0
  120. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/logo.py +0 -0
  121. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/shiki_code_block.py +0 -0
  122. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
  123. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/dynamic.py +0 -0
  124. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/__init__.pyi +0 -0
  125. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/element.py +0 -0
  126. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/element.pyi +0 -0
  127. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/__init__.py +0 -0
  128. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/__init__.pyi +0 -0
  129. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/base.py +0 -0
  130. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/base.pyi +0 -0
  131. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/forms.py +0 -0
  132. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/forms.pyi +0 -0
  133. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/inline.py +0 -0
  134. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/inline.pyi +0 -0
  135. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/media.py +0 -0
  136. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/media.pyi +0 -0
  137. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/metadata.py +0 -0
  138. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/metadata.pyi +0 -0
  139. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/other.py +0 -0
  140. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/other.pyi +0 -0
  141. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/scripts.py +0 -0
  142. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/scripts.pyi +0 -0
  143. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/sectioning.py +0 -0
  144. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/sectioning.pyi +0 -0
  145. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/tables.py +0 -0
  146. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/tables.pyi +0 -0
  147. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/typography.py +0 -0
  148. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/el/elements/typography.pyi +0 -0
  149. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/field.py +0 -0
  150. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/gridjs/__init__.py +0 -0
  151. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/gridjs/datatable.py +0 -0
  152. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/gridjs/datatable.pyi +0 -0
  153. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/literals.py +0 -0
  154. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/lucide/__init__.py +0 -0
  155. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/markdown/__init__.py +0 -0
  156. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/markdown/markdown.pyi +0 -0
  157. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/moment/__init__.py +0 -0
  158. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/moment/moment.py +0 -0
  159. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/moment/moment.pyi +0 -0
  160. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/plotly/__init__.py +0 -0
  161. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/plotly/plotly.pyi +0 -0
  162. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/props.py +0 -0
  163. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/__init__.py +0 -0
  164. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/__init__.pyi +0 -0
  165. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/__init__.py +0 -0
  166. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/__init__.pyi +0 -0
  167. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/accordion.py +0 -0
  168. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/accordion.pyi +0 -0
  169. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/base.py +0 -0
  170. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/base.pyi +0 -0
  171. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/dialog.py +0 -0
  172. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/dialog.pyi +0 -0
  173. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/drawer.py +0 -0
  174. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/drawer.pyi +0 -0
  175. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/form.py +0 -0
  176. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/form.pyi +0 -0
  177. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/progress.py +0 -0
  178. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/progress.pyi +0 -0
  179. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/slider.py +0 -0
  180. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/primitives/slider.pyi +0 -0
  181. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/__init__.py +0 -0
  182. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/__init__.pyi +0 -0
  183. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/base.py +0 -0
  184. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/base.pyi +0 -0
  185. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/color_mode.py +0 -0
  186. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/color_mode.pyi +0 -0
  187. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/__init__.py +0 -0
  188. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/__init__.pyi +0 -0
  189. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
  190. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
  191. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
  192. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
  193. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/avatar.py +0 -0
  194. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/avatar.pyi +0 -0
  195. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/badge.py +0 -0
  196. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/badge.pyi +0 -0
  197. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/button.py +0 -0
  198. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/button.pyi +0 -0
  199. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/callout.py +0 -0
  200. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/callout.pyi +0 -0
  201. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/card.py +0 -0
  202. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/card.pyi +0 -0
  203. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/checkbox.py +0 -0
  204. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
  205. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
  206. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
  207. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
  208. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
  209. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/context_menu.py +0 -0
  210. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
  211. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/data_list.py +0 -0
  212. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/data_list.pyi +0 -0
  213. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/dialog.py +0 -0
  214. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/dialog.pyi +0 -0
  215. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
  216. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
  217. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/hover_card.py +0 -0
  218. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
  219. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/icon_button.py +0 -0
  220. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
  221. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/inset.py +0 -0
  222. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/inset.pyi +0 -0
  223. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/popover.py +0 -0
  224. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/popover.pyi +0 -0
  225. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/progress.py +0 -0
  226. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/progress.pyi +0 -0
  227. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/radio.py +0 -0
  228. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/radio.pyi +0 -0
  229. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/radio_cards.py +0 -0
  230. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
  231. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/radio_group.py +0 -0
  232. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
  233. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/scroll_area.py +0 -0
  234. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
  235. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/segmented_control.py +0 -0
  236. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
  237. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/select.py +0 -0
  238. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/select.pyi +0 -0
  239. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/separator.py +0 -0
  240. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/separator.pyi +0 -0
  241. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/skeleton.py +0 -0
  242. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
  243. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/slider.py +0 -0
  244. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/slider.pyi +0 -0
  245. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/spinner.py +0 -0
  246. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/spinner.pyi +0 -0
  247. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/switch.py +0 -0
  248. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/switch.pyi +0 -0
  249. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/table.py +0 -0
  250. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/table.pyi +0 -0
  251. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/tabs.py +0 -0
  252. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/tabs.pyi +0 -0
  253. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/text_area.py +0 -0
  254. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/text_area.pyi +0 -0
  255. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/text_field.py +0 -0
  256. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/text_field.pyi +0 -0
  257. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/tooltip.py +0 -0
  258. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
  259. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/__init__.py +0 -0
  260. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
  261. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/base.py +0 -0
  262. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/base.pyi +0 -0
  263. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/box.py +0 -0
  264. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/box.pyi +0 -0
  265. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/center.py +0 -0
  266. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/center.pyi +0 -0
  267. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/container.py +0 -0
  268. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/container.pyi +0 -0
  269. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/flex.py +0 -0
  270. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/flex.pyi +0 -0
  271. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/grid.py +0 -0
  272. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/grid.pyi +0 -0
  273. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/list.py +0 -0
  274. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/list.pyi +0 -0
  275. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/section.py +0 -0
  276. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/section.pyi +0 -0
  277. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/spacer.py +0 -0
  278. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
  279. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/stack.py +0 -0
  280. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/layout/stack.pyi +0 -0
  281. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/__init__.py +0 -0
  282. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
  283. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/base.py +0 -0
  284. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/blockquote.py +0 -0
  285. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
  286. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/code.py +0 -0
  287. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/code.pyi +0 -0
  288. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/heading.py +0 -0
  289. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/heading.pyi +0 -0
  290. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/link.py +0 -0
  291. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/link.pyi +0 -0
  292. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/text.py +0 -0
  293. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/radix/themes/typography/text.pyi +0 -0
  294. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_player/__init__.py +0 -0
  295. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_player/audio.py +0 -0
  296. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_player/audio.pyi +0 -0
  297. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_player/react_player.py +0 -0
  298. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_player/react_player.pyi +0 -0
  299. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_player/video.py +0 -0
  300. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_player/video.pyi +0 -0
  301. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_router/__init__.py +0 -0
  302. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_router/dom.py +0 -0
  303. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/react_router/dom.pyi +0 -0
  304. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/__init__.py +0 -0
  305. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/__init__.pyi +0 -0
  306. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/cartesian.py +0 -0
  307. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/cartesian.pyi +0 -0
  308. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/charts.py +0 -0
  309. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/charts.pyi +0 -0
  310. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/general.py +0 -0
  311. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/general.pyi +0 -0
  312. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/polar.py +0 -0
  313. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/polar.pyi +0 -0
  314. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/recharts/recharts.pyi +0 -0
  315. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/sonner/__init__.py +0 -0
  316. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/sonner/toast.py +0 -0
  317. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/sonner/toast.pyi +0 -0
  318. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/tags/__init__.py +0 -0
  319. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/tags/cond_tag.py +0 -0
  320. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/tags/iter_tag.py +0 -0
  321. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/tags/match_tag.py +0 -0
  322. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/tags/tag.py +0 -0
  323. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/components/tags/tagless.py +0 -0
  324. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/config.py +0 -0
  325. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/__init__.py +0 -0
  326. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/base.py +0 -0
  327. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/colors.py +0 -0
  328. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/compiler.py +0 -0
  329. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/config.py +0 -0
  330. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/custom_components.py +0 -0
  331. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/event.py +0 -0
  332. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/route.py +0 -0
  333. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/state.py +0 -0
  334. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/constants/utils.py +0 -0
  335. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/custom_components/__init__.py +0 -0
  336. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/custom_components/custom_components.py +0 -0
  337. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/event.py +0 -0
  338. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/experimental/__init__.py +0 -0
  339. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/experimental/client_state.py +0 -0
  340. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/experimental/hooks.py +0 -0
  341. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/__init__.py +0 -0
  342. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/dynamic.py +0 -0
  343. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/manager/disk.py +0 -0
  344. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/manager/memory.py +0 -0
  345. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/storage.py +0 -0
  346. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/istate/wrappers.py +0 -0
  347. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/middleware/__init__.py +0 -0
  348. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/middleware/hydrate_middleware.py +0 -0
  349. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/middleware/middleware.py +0 -0
  350. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/page.py +0 -0
  351. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/plugins/__init__.py +0 -0
  352. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/plugins/_screenshot.py +0 -0
  353. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/plugins/base.py +0 -0
  354. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/plugins/shared_tailwind.py +0 -0
  355. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/plugins/sitemap.py +0 -0
  356. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/plugins/tailwind_v3.py +0 -0
  357. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/plugins/tailwind_v4.py +0 -0
  358. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/py.typed +0 -0
  359. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/reflex.py +0 -0
  360. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/route.py +0 -0
  361. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/style.py +0 -0
  362. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/__init__.py +0 -0
  363. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/codespaces.py +0 -0
  364. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/compat.py +0 -0
  365. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/console.py +0 -0
  366. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/decorator.py +0 -0
  367. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/exceptions.py +0 -0
  368. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/exec.py +0 -0
  369. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/export.py +0 -0
  370. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/format.py +0 -0
  371. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/frontend_skeleton.py +0 -0
  372. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/imports.py +0 -0
  373. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/js_runtimes.py +0 -0
  374. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/lazy_loader.py +0 -0
  375. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/misc.py +0 -0
  376. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/monitoring.py +0 -0
  377. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/net.py +0 -0
  378. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/path_ops.py +0 -0
  379. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/prerequisites.py +0 -0
  380. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/pyi_generator.py +0 -0
  381. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/redir.py +0 -0
  382. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/registry.py +0 -0
  383. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/rename.py +0 -0
  384. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/serializers.py +0 -0
  385. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/tasks.py +0 -0
  386. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/telemetry.py +0 -0
  387. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/templates.py +0 -0
  388. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/token_manager.py +0 -0
  389. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/utils/types.py +0 -0
  390. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/__init__.py +0 -0
  391. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/color.py +0 -0
  392. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/datetime.py +0 -0
  393. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/function.py +0 -0
  394. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/number.py +0 -0
  395. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/object.py +0 -0
  396. {reflex-0.8.21 → reflex-0.8.23a4}/reflex/vars/sequence.py +0 -0
  397. {reflex-0.8.21 → reflex-0.8.23a4}/scripts/hatch_build.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.21
3
+ Version: 0.8.23a4
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.21"
3
+ version = "0.8.23a4"
4
4
  description = "Web apps in pure Python."
5
5
  license.text = "Apache-2.0"
6
6
  authors = [
@@ -243,7 +243,7 @@ fail_fast = true
243
243
 
244
244
  [[tool.pre-commit.repos]]
245
245
  repo = "https://github.com/astral-sh/ruff-pre-commit"
246
- rev = "v0.14.6"
246
+ rev = "v0.14.8"
247
247
  hooks = [
248
248
  { id = "ruff-format", args = [
249
249
  "reflex",
@@ -0,0 +1,105 @@
1
+ import { useEffect, useRef } from "react";
2
+
3
+ const handle_paste_data = (clipboardData) =>
4
+ new Promise((resolve, reject) => {
5
+ const pasted_data = [];
6
+ const n_items = clipboardData.items.length;
7
+ const extract_data = (item) => {
8
+ const type = item.type;
9
+ if (item.kind === "string") {
10
+ item.getAsString((data) => {
11
+ pasted_data.push([type, data]);
12
+ if (pasted_data.length === n_items) {
13
+ resolve(pasted_data);
14
+ }
15
+ });
16
+ } else if (item.kind === "file") {
17
+ const file = item.getAsFile();
18
+ const reader = new FileReader();
19
+ reader.onload = (e) => {
20
+ pasted_data.push([type, e.target.result]);
21
+ if (pasted_data.length === n_items) {
22
+ resolve(pasted_data);
23
+ }
24
+ };
25
+ if (type.indexOf("text/") === 0) {
26
+ reader.readAsText(file);
27
+ } else {
28
+ reader.readAsDataURL(file);
29
+ }
30
+ }
31
+ };
32
+ for (const item of clipboardData.items) {
33
+ extract_data(item);
34
+ }
35
+ });
36
+
37
+ export default function usePasteHandler(target_ids, event_actions, on_paste) {
38
+ const onPasteRef = useRef(on_paste);
39
+ const eventActionsRef = useRef(event_actions);
40
+
41
+ useEffect(() => {
42
+ onPasteRef.current = on_paste;
43
+ }, [on_paste]);
44
+ useEffect(() => {
45
+ eventActionsRef.current = event_actions;
46
+ }, [event_actions]);
47
+
48
+ useEffect(() => {
49
+ const handle_paste = (_ev) => {
50
+ eventActionsRef.current?.preventDefault && _ev.preventDefault();
51
+ eventActionsRef.current?.stopPropagation && _ev.stopPropagation();
52
+ handle_paste_data(_ev.clipboardData).then(onPasteRef.current);
53
+ };
54
+
55
+ let cleanupListeners = null;
56
+ let observer = null;
57
+
58
+ const attachListeners = (targets) => {
59
+ targets.forEach((target) =>
60
+ target.addEventListener("paste", handle_paste, false),
61
+ );
62
+ return () => {
63
+ targets.forEach((target) =>
64
+ target.removeEventListener("paste", handle_paste, false),
65
+ );
66
+ };
67
+ };
68
+
69
+ const tryAttach = () => {
70
+ if (target_ids.length === 0) {
71
+ cleanupListeners = attachListeners([document]);
72
+ return true;
73
+ }
74
+ const targets = target_ids
75
+ .map((id) => document.getElementById(id))
76
+ .filter((element) => !!element);
77
+
78
+ if (targets.length === target_ids.length) {
79
+ cleanupListeners = attachListeners(targets);
80
+ return true;
81
+ }
82
+
83
+ return false;
84
+ };
85
+
86
+ if (!tryAttach()) {
87
+ observer = new MutationObserver(() => {
88
+ if (tryAttach()) {
89
+ observer.disconnect();
90
+ observer = null;
91
+ }
92
+ });
93
+ observer.observe(document.body, { childList: true, subtree: true });
94
+ }
95
+
96
+ return () => {
97
+ if (observer) {
98
+ observer.disconnect();
99
+ }
100
+ if (cleanupListeners) {
101
+ cleanupListeners();
102
+ }
103
+ };
104
+ }, [target_ids]);
105
+ }
@@ -56,10 +56,10 @@ export const generateUUID = () => {
56
56
  return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (c) => {
57
57
  let r = Math.random() * 16;
58
58
  if (d > 0) {
59
- r = (d + r) % 16 | 0;
59
+ r = ((d + r) % 16) | 0;
60
60
  d = Math.floor(d / 16);
61
61
  } else {
62
- r = (d2 + r) % 16 | 0;
62
+ r = ((d2 + r) % 16) | 0;
63
63
  d2 = Math.floor(d2 / 16);
64
64
  }
65
65
  return (c == "x" ? r : (r & 0x7) | 0x8).toString(16);
@@ -336,6 +336,7 @@ _MAPPING: dict = {
336
336
  "State",
337
337
  "dynamic",
338
338
  ],
339
+ "istate.shared": ["SharedState"],
339
340
  "istate.wrappers": ["get_state"],
340
341
  "style": ["Style", "toggle_color_mode"],
341
342
  "utils.imports": ["ImportDict", "ImportVar"],
@@ -148,6 +148,7 @@ from .event import (
148
148
  window_alert,
149
149
  )
150
150
  from .experimental import _x
151
+ from .istate.shared import SharedState
151
152
  from .istate.storage import Cookie, LocalStorage, SessionStorage
152
153
  from .istate.wrappers import get_state
153
154
  from .middleware import Middleware, middleware
@@ -205,6 +206,7 @@ __all__ = [
205
206
  "PropsBase",
206
207
  "Script",
207
208
  "SessionStorage",
209
+ "SharedState",
208
210
  "State",
209
211
  "Style",
210
212
  "UploadFile",
@@ -297,7 +297,7 @@ class UnevaluatedPage:
297
297
  description: Var | str | None
298
298
  image: str
299
299
  on_load: EventType[()] | None
300
- meta: Sequence[Mapping[str, str]]
300
+ meta: Sequence[Mapping[str, Any] | Component]
301
301
  context: Mapping[str, Any]
302
302
 
303
303
  def merged_with(self, other: UnevaluatedPage) -> UnevaluatedPage:
@@ -772,7 +772,7 @@ class App(MiddlewareMixin, LifespanMixin):
772
772
  description: str | Var | None = None,
773
773
  image: str = constants.DefaultPage.IMAGE,
774
774
  on_load: EventType[()] | None = None,
775
- meta: list[dict[str, str]] = constants.DefaultPage.META_LIST,
775
+ meta: Sequence[Mapping[str, Any] | Component] = constants.DefaultPage.META_LIST,
776
776
  context: dict[str, Any] | None = None,
777
777
  ):
778
778
  """Add a page to the app.
@@ -1562,13 +1562,17 @@ class App(MiddlewareMixin, LifespanMixin):
1562
1562
 
1563
1563
  @contextlib.asynccontextmanager
1564
1564
  async def modify_state(
1565
- self, token: str, background: bool = False
1565
+ self,
1566
+ token: str,
1567
+ background: bool = False,
1568
+ previous_dirty_vars: dict[str, set[str]] | None = None,
1566
1569
  ) -> AsyncIterator[BaseState]:
1567
1570
  """Modify the state out of band.
1568
1571
 
1569
1572
  Args:
1570
1573
  token: The token to modify the state for.
1571
1574
  background: Whether the modification is happening in a background task.
1575
+ previous_dirty_vars: Vars that are considered dirty from a previous operation.
1572
1576
 
1573
1577
  Yields:
1574
1578
  The state to modify.
@@ -1581,7 +1585,9 @@ class App(MiddlewareMixin, LifespanMixin):
1581
1585
  raise RuntimeError(msg)
1582
1586
 
1583
1587
  # Get exclusive access to the state.
1584
- async with self.state_manager.modify_state(token) as state:
1588
+ async with self.state_manager.modify_state_with_links(
1589
+ token, previous_dirty_vars=previous_dirty_vars
1590
+ ) as state:
1585
1591
  # No other event handler can modify the state while in this context.
1586
1592
  yield state
1587
1593
  delta = await state._get_resolved_delta()
@@ -1769,7 +1775,7 @@ async def process(
1769
1775
  constants.RouteVar.CLIENT_IP: client_ip,
1770
1776
  })
1771
1777
  # Get the state for the session exclusively.
1772
- async with app.state_manager.modify_state(
1778
+ async with app.state_manager.modify_state_with_links(
1773
1779
  event.substate_token, event=event
1774
1780
  ) as state:
1775
1781
  # When this is a brand new instance of the state, signal the
@@ -2003,7 +2009,9 @@ def upload(app: App):
2003
2009
  Each state update as JSON followed by a new line.
2004
2010
  """
2005
2011
  # Process the event.
2006
- async with app.state_manager.modify_state(event.substate_token) as state:
2012
+ async with app.state_manager.modify_state_with_links(
2013
+ event.substate_token
2014
+ ) as state:
2007
2015
  async for update in state._process(event):
2008
2016
  # Postprocess the event.
2009
2017
  update = await app._postprocess(state, event, update)
@@ -378,7 +378,11 @@ export function ClientSide(component) {{
378
378
  return ({{ children, ...props }}) => {{
379
379
  const [Component, setComponent] = useState(null);
380
380
  useEffect(() => {{
381
- setComponent(component);
381
+ async function load() {{
382
+ const comp = await component();
383
+ setComponent(() => comp);
384
+ }}
385
+ load();
382
386
  }}, []);
383
387
  return Component ? jsx(Component, props, children) : null;
384
388
  }};
@@ -73,10 +73,12 @@ def validate_imports(import_dict: ParsedImportDict):
73
73
  ValueError: if a conflict on "tag/alias" is detected for an import.
74
74
  """
75
75
  used_tags = {}
76
- for lib, _imports in import_dict.items():
77
- for _import in _imports:
76
+ for lib, imported_items in import_dict.items():
77
+ for imported_item in imported_items:
78
78
  import_name = (
79
- f"{_import.tag}/{_import.alias}" if _import.alias else _import.tag
79
+ f"{imported_item.tag}/{imported_item.alias}"
80
+ if imported_item.alias
81
+ else imported_item.tag
80
82
  )
81
83
  if import_name in used_tags:
82
84
  already_imported = used_tags[import_name]
@@ -562,7 +564,7 @@ def add_meta(
562
564
  page: Component,
563
565
  title: str,
564
566
  image: str,
565
- meta: list[dict],
567
+ meta: Sequence[Mapping[str, Any] | Component],
566
568
  description: str | None = None,
567
569
  ) -> Component:
568
570
  """Add metadata to a page.
@@ -515,8 +515,10 @@ def _deterministic_hash(value: object) -> str:
515
515
  return _hash_str(
516
516
  str((value._js_expr, _deterministic_hash(value._get_all_var_data())))
517
517
  )
518
- if isinstance(value, VarData):
519
- return _hash_dict(dataclasses.asdict(value))
518
+ if dataclasses.is_dataclass(value):
519
+ return _hash_dict({
520
+ k.name: getattr(value, k.name) for k in dataclasses.fields(value)
521
+ })
520
522
  if isinstance(value, BaseComponent):
521
523
  # If the value is a component, hash its rendered code.
522
524
  return _hash_dict(value.render())
@@ -758,9 +760,11 @@ class Component(BaseComponent, ABC):
758
760
  and key not in component_specific_triggers
759
761
  and key not in props
760
762
  ):
763
+ valid_triggers = sorted(component_specific_triggers.keys())
761
764
  msg = (
762
- f"The {(comp_name := type(self).__name__)} does not take in an `{key}` event trigger. If {comp_name}"
763
- f" is a third party component make sure to add `{key}` to the component's event triggers. "
765
+ f"The {(comp_name := type(self).__name__)} does not take in an `{key}` event trigger. "
766
+ f"Valid triggers for {comp_name}: {valid_triggers}. "
767
+ f"If {comp_name} is a third party component make sure to add `{key}` to the component's event triggers. "
764
768
  f"visit https://reflex.dev/docs/wrapping-react/guide/#event-triggers for more info."
765
769
  )
766
770
  raise ValueError(msg)
@@ -2228,7 +2232,6 @@ class NoSSRComponent(Component):
2228
2232
  """
2229
2233
  # React lazy import mechanism.
2230
2234
  dynamic_import = {
2231
- "react": [ImportVar(tag="lazy")],
2232
2235
  f"$/{constants.Dirs.UTILS}/context": [ImportVar(tag="ClientSide")],
2233
2236
  }
2234
2237
 
@@ -2259,15 +2262,15 @@ class NoSSRComponent(Component):
2259
2262
  library_import = f"import('{import_name}')"
2260
2263
  mod_import = (
2261
2264
  # https://nextjs.org/docs/pages/building-your-application/optimizing/lazy-loading#with-named-exports
2262
- f".then((mod) => ({{default: mod.{self.tag}}}))"
2265
+ f".then((mod) => mod.{self.tag})"
2263
2266
  if not self.is_default
2264
- else ""
2267
+ else ".then((mod) => mod.default.default ?? mod.default)"
2265
2268
  )
2266
2269
  return (
2267
- f"const {self.alias or self.tag} = ClientSide(lazy(() => "
2270
+ f"const {self.alias or self.tag} = ClientSide(() => "
2268
2271
  + library_import
2269
2272
  + mod_import
2270
- + "))"
2273
+ + ")"
2271
2274
  )
2272
2275
 
2273
2276
 
@@ -9,8 +9,8 @@ from . import elements
9
9
  _SUBMODULES: set[str] = {"elements"}
10
10
  _SUBMOD_ATTRS: dict[str, list[str]] = {
11
11
  # rx.el.a is replaced by React Router's Link.
12
- f"elements.{k}": [_v for _v in v if _v != "a"]
13
- for k, v in elements._MAPPING.items()
12
+ f"elements.{k}": [attr for attr in attrs if attr != "a"]
13
+ for k, attrs in elements._MAPPING.items()
14
14
  }
15
15
  _EXTRA_MAPPINGS: dict[str, str] = {
16
16
  "a": "reflex.components.react_router.link",
@@ -6,7 +6,7 @@ from reflex.utils.imports import ImportVar
6
6
  from reflex.vars.base import LiteralVar, Var
7
7
  from reflex.vars.sequence import LiteralStringVar, StringVar
8
8
 
9
- LUCIDE_LIBRARY = "lucide-react@0.554.0"
9
+ LUCIDE_LIBRARY = "lucide-react@0.556.0"
10
10
 
11
11
 
12
12
  class LucideIconComponent(Component):
@@ -317,6 +317,7 @@ LUCIDE_ICON_LIST = [
317
317
  "book_open_text",
318
318
  "book_open",
319
319
  "book_plus",
320
+ "book_search",
320
321
  "book_text",
321
322
  "book_type",
322
323
  "book_up_2",
@@ -386,8 +387,8 @@ LUCIDE_ICON_LIST = [
386
387
  "calendar_sync",
387
388
  "calendar_x_2",
388
389
  "calendar_x",
389
- "calendars",
390
390
  "calendar",
391
+ "calendars",
391
392
  "camera_off",
392
393
  "camera",
393
394
  "candlestick_chart",
@@ -764,8 +765,8 @@ LUCIDE_ICON_LIST = [
764
765
  "film",
765
766
  "filter_x",
766
767
  "filter",
767
- "fingerprint",
768
768
  "fingerprint_pattern",
769
+ "fingerprint",
769
770
  "fire_extinguisher",
770
771
  "fish_off",
771
772
  "fish_symbol",
@@ -823,6 +824,7 @@ LUCIDE_ICON_LIST = [
823
824
  "folders",
824
825
  "footprints",
825
826
  "forklift",
827
+ "form",
826
828
  "forward",
827
829
  "frame",
828
830
  "framer",
@@ -1394,6 +1396,7 @@ LUCIDE_ICON_LIST = [
1394
1396
  "school",
1395
1397
  "scissors_line_dashed",
1396
1398
  "scissors",
1399
+ "scooter",
1397
1400
  "screen_share_off",
1398
1401
  "screen_share",
1399
1402
  "scroll_text",
@@ -1721,6 +1724,7 @@ LUCIDE_ICON_LIST = [
1721
1724
  "utensils_crossed",
1722
1725
  "utensils",
1723
1726
  "utility_pole",
1727
+ "van",
1724
1728
  "variable",
1725
1729
  "vault",
1726
1730
  "vector_square",
@@ -1751,12 +1755,15 @@ LUCIDE_ICON_LIST = [
1751
1755
  "warehouse",
1752
1756
  "washing_machine",
1753
1757
  "watch",
1758
+ "waves_arrow_down",
1759
+ "waves_arrow_up",
1754
1760
  "waves_ladder",
1755
1761
  "waves",
1756
1762
  "waypoints",
1757
1763
  "webcam",
1758
1764
  "webhook_off",
1759
1765
  "webhook",
1766
+ "weight_tilde",
1760
1767
  "weight",
1761
1768
  "wheat_off",
1762
1769
  "wheat",
@@ -11,7 +11,7 @@ from reflex.components.core.breakpoints import Breakpoints
11
11
  from reflex.event import EventType, PointerEventInfo
12
12
  from reflex.vars.base import Var
13
13
 
14
- LUCIDE_LIBRARY = "lucide-react@0.554.0"
14
+ LUCIDE_LIBRARY = "lucide-react@0.556.0"
15
15
 
16
16
  class LucideIconComponent(Component):
17
17
  @classmethod
@@ -378,6 +378,7 @@ LUCIDE_ICON_LIST = [
378
378
  "book_open_text",
379
379
  "book_open",
380
380
  "book_plus",
381
+ "book_search",
381
382
  "book_text",
382
383
  "book_type",
383
384
  "book_up_2",
@@ -447,8 +448,8 @@ LUCIDE_ICON_LIST = [
447
448
  "calendar_sync",
448
449
  "calendar_x_2",
449
450
  "calendar_x",
450
- "calendars",
451
451
  "calendar",
452
+ "calendars",
452
453
  "camera_off",
453
454
  "camera",
454
455
  "candlestick_chart",
@@ -825,8 +826,8 @@ LUCIDE_ICON_LIST = [
825
826
  "film",
826
827
  "filter_x",
827
828
  "filter",
828
- "fingerprint",
829
829
  "fingerprint_pattern",
830
+ "fingerprint",
830
831
  "fire_extinguisher",
831
832
  "fish_off",
832
833
  "fish_symbol",
@@ -884,6 +885,7 @@ LUCIDE_ICON_LIST = [
884
885
  "folders",
885
886
  "footprints",
886
887
  "forklift",
888
+ "form",
887
889
  "forward",
888
890
  "frame",
889
891
  "framer",
@@ -1455,6 +1457,7 @@ LUCIDE_ICON_LIST = [
1455
1457
  "school",
1456
1458
  "scissors_line_dashed",
1457
1459
  "scissors",
1460
+ "scooter",
1458
1461
  "screen_share_off",
1459
1462
  "screen_share",
1460
1463
  "scroll_text",
@@ -1782,6 +1785,7 @@ LUCIDE_ICON_LIST = [
1782
1785
  "utensils_crossed",
1783
1786
  "utensils",
1784
1787
  "utility_pole",
1788
+ "van",
1785
1789
  "variable",
1786
1790
  "vault",
1787
1791
  "vector_square",
@@ -1812,12 +1816,15 @@ LUCIDE_ICON_LIST = [
1812
1816
  "warehouse",
1813
1817
  "washing_machine",
1814
1818
  "watch",
1819
+ "waves_arrow_down",
1820
+ "waves_arrow_up",
1815
1821
  "waves_ladder",
1816
1822
  "waves",
1817
1823
  "waypoints",
1818
1824
  "webcam",
1819
1825
  "webhook_off",
1820
1826
  "webhook",
1827
+ "weight_tilde",
1821
1828
  "weight",
1822
1829
  "wheat_off",
1823
1830
  "wheat",
@@ -494,8 +494,8 @@ let {_LANGUAGE!s} = match ? match[1] : '';
494
494
  hooks = {}
495
495
  from reflex.compiler.templates import _render_hooks
496
496
 
497
- for _component in self.component_map.values():
498
- comp = _component(_MOCK_ARG)
497
+ for component_factory in self.component_map.values():
498
+ comp = component_factory(_MOCK_ARG)
499
499
  hooks.update(comp._get_all_hooks())
500
500
  formatted_hooks = _render_hooks(hooks)
501
501
  return f"""
@@ -288,11 +288,11 @@ def dynamic_plotly_import(name: str, package: str) -> str:
288
288
  The dynamic import for the plotly component.
289
289
  """
290
290
  library_import = f"import('{package}')"
291
- mod_import = ".then((mod) => ({ default: createPlotlyComponent(mod) }))"
291
+ mod_import = ".then((mod) => createPlotlyComponent(mod))"
292
292
  return f"""
293
- const {name} = ClientSide(lazy(() =>
293
+ const {name} = ClientSide(() =>
294
294
  {library_import}{mod_import}
295
- ))
295
+ )
296
296
  """
297
297
 
298
298
 
@@ -8,7 +8,7 @@ from reflex.components.component import Component, MemoizationLeaf, NoSSRCompone
8
8
  class Recharts(Component):
9
9
  """A component that wraps a recharts lib."""
10
10
 
11
- library = "recharts@3.4.1"
11
+ library = "recharts@3.5.1"
12
12
 
13
13
  def _get_style(self) -> dict:
14
14
  return {"wrapperStyle": self.style}
@@ -17,7 +17,7 @@ class Recharts(Component):
17
17
  class RechartsCharts(NoSSRComponent, MemoizationLeaf):
18
18
  """A component that wraps a recharts lib."""
19
19
 
20
- library = "recharts@3.4.1"
20
+ library = "recharts@3.5.1"
21
21
 
22
22
 
23
23
  LiteralAnimationEasing = Literal["ease", "ease-in", "ease-out", "ease-in-out", "linear"]
@@ -14,7 +14,7 @@ class Bun(SimpleNamespace):
14
14
  """Bun constants."""
15
15
 
16
16
  # The Bun version.
17
- VERSION = "1.3.3"
17
+ VERSION = "1.3.4"
18
18
 
19
19
  # Min Bun Version
20
20
  MIN_VERSION = "1.3.0"
@@ -75,7 +75,7 @@ fetch-retries=0
75
75
 
76
76
 
77
77
  def _determine_react_router_version() -> str:
78
- default_version = "7.9.6"
78
+ default_version = "7.10.1"
79
79
  if (version := os.getenv("REACT_ROUTER_VERSION")) and version != default_version:
80
80
  from reflex.utils import console
81
81
 
@@ -87,7 +87,7 @@ def _determine_react_router_version() -> str:
87
87
 
88
88
 
89
89
  def _determine_react_version() -> str:
90
- default_version = "19.2.0"
90
+ default_version = "19.2.1"
91
91
  if (version := os.getenv("REACT_VERSION")) and version != default_version:
92
92
  from reflex.utils import console
93
93
 
@@ -143,11 +143,11 @@ class PackageJson(SimpleNamespace):
143
143
  "postcss-import": "16.1.1",
144
144
  "@react-router/dev": _react_router_version,
145
145
  "@react-router/fs-routes": _react_router_version,
146
- "vite": "npm:rolldown-vite@7.1.18",
146
+ "vite": "npm:rolldown-vite@7.2.10",
147
147
  }
148
148
  OVERRIDES = {
149
149
  # This should always match the `react` version in DEPENDENCIES for recharts compatibility.
150
150
  "react-is": _react_version,
151
- "cookie": "1.0.2",
152
- "vite": "npm:rolldown-vite@7.1.18",
151
+ "cookie": "1.1.1",
152
+ "vite": "npm:rolldown-vite@7.2.10",
153
153
  }
@@ -583,6 +583,9 @@ class EnvironmentVariables:
583
583
  # Path to the alembic config file
584
584
  ALEMBIC_CONFIG: EnvVar[ExistingPath] = env_var(Path(constants.ALEMBIC_CONFIG))
585
585
 
586
+ # Include schemas in alembic migrations.
587
+ ALEMBIC_INCLUDE_SCHEMAS: EnvVar[bool] = env_var(False)
588
+
586
589
  # Disable SSL verification for HTTPX requests.
587
590
  SSL_NO_VERIFY: EnvVar[bool] = env_var(False)
588
591
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  import dataclasses
4
4
  from collections.abc import Mapping
5
+ from types import MappingProxyType
5
6
  from typing import TYPE_CHECKING
6
7
  from urllib.parse import _NetlocResultMixinStr, parse_qsl, urlsplit
7
8
 
@@ -12,20 +13,34 @@ from reflex.utils.serializers import serializer
12
13
 
13
14
  @dataclasses.dataclass(frozen=True, init=False)
14
15
  class _FrozenDictStrStr(Mapping[str, str]):
15
- _data: tuple[tuple[str, str], ...]
16
+ _data: MappingProxyType[str, str]
16
17
 
17
18
  def __init__(self, **kwargs):
18
- object.__setattr__(self, "_data", tuple(sorted(kwargs.items())))
19
+ object.__setattr__(
20
+ self, "_data", MappingProxyType(dict(sorted(kwargs.items())))
21
+ )
19
22
 
20
23
  def __getitem__(self, key: str) -> str:
21
- return dict(self._data)[key]
24
+ return self._data[key]
22
25
 
23
26
  def __iter__(self):
24
- return (x[0] for x in self._data)
27
+ return iter(self._data)
25
28
 
26
29
  def __len__(self):
27
30
  return len(self._data)
28
31
 
32
+ def __hash__(self) -> int:
33
+ return hash(frozenset(self._data.items()))
34
+
35
+ def __getstate__(self) -> object:
36
+ return dict(self._data)
37
+
38
+ def __setstate__(self, state: object) -> None:
39
+ if not isinstance(state, dict):
40
+ msg = "Invalid state for _FrozenDictStrStr"
41
+ raise TypeError(msg)
42
+ object.__setattr__(self, "_data", MappingProxyType(state))
43
+
29
44
 
30
45
  @dataclasses.dataclass(frozen=True)
31
46
  class _HeaderData:
@@ -170,7 +185,7 @@ class PageData:
170
185
 
171
186
  @serializer(to=dict)
172
187
  def _serialize_page_data(obj: PageData) -> dict:
173
- return dataclasses.asdict(obj)
188
+ return {key.name: getattr(obj, key.name) for key in dataclasses.fields(obj)}
174
189
 
175
190
 
176
191
  @dataclasses.dataclass(frozen=True)
@@ -200,7 +215,7 @@ class SessionData:
200
215
 
201
216
  @serializer(to=dict)
202
217
  def _serialize_session_data(obj: SessionData) -> dict:
203
- return dataclasses.asdict(obj)
218
+ return {key.name: getattr(obj, key.name) for key in dataclasses.fields(obj)}
204
219
 
205
220
 
206
221
  @dataclasses.dataclass(frozen=True)