reflex 0.8.5a2__py3-none-any.whl → 0.8.6a1__py3-none-any.whl

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 (34) hide show
  1. reflex/.templates/{web/vite.config.js → jinja/web/vite.config.js.jinja2} +11 -0
  2. reflex/.templates/web/utils/state.js +5 -0
  3. reflex/__init__.py +1 -0
  4. reflex/__init__.pyi +2 -0
  5. reflex/app.py +77 -13
  6. reflex/compiler/templates.py +3 -0
  7. reflex/components/base/error_boundary.py +2 -0
  8. reflex/components/datadisplay/dataeditor.py +3 -0
  9. reflex/components/datadisplay/dataeditor.pyi +2 -0
  10. reflex/components/el/__init__.pyi +4 -0
  11. reflex/components/el/elements/__init__.py +1 -0
  12. reflex/components/el/elements/__init__.pyi +5 -0
  13. reflex/components/el/elements/media.py +32 -0
  14. reflex/components/el/elements/media.pyi +261 -0
  15. reflex/components/lucide/icon.py +4 -1
  16. reflex/components/lucide/icon.pyi +4 -1
  17. reflex/components/sonner/toast.py +1 -1
  18. reflex/config.py +15 -0
  19. reflex/constants/base.py +3 -0
  20. reflex/istate/manager.py +2 -1
  21. reflex/plugins/__init__.py +2 -0
  22. reflex/plugins/_screenshot.py +144 -0
  23. reflex/plugins/base.py +14 -1
  24. reflex/state.py +28 -6
  25. reflex/testing.py +11 -0
  26. reflex/utils/decorator.py +1 -0
  27. reflex/utils/monitoring.py +180 -0
  28. reflex/utils/prerequisites.py +17 -0
  29. reflex/utils/token_manager.py +215 -0
  30. {reflex-0.8.5a2.dist-info → reflex-0.8.6a1.dist-info}/METADATA +5 -2
  31. {reflex-0.8.5a2.dist-info → reflex-0.8.6a1.dist-info}/RECORD +34 -31
  32. {reflex-0.8.5a2.dist-info → reflex-0.8.6a1.dist-info}/WHEEL +0 -0
  33. {reflex-0.8.5a2.dist-info → reflex-0.8.6a1.dist-info}/entry_points.txt +0 -0
  34. {reflex-0.8.5a2.dist-info → reflex-0.8.6a1.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,215 @@
1
+ """Token manager for handling client token to session ID mappings."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import uuid
6
+ from abc import ABC, abstractmethod
7
+ from typing import TYPE_CHECKING
8
+
9
+ from reflex.utils import console, prerequisites
10
+
11
+ if TYPE_CHECKING:
12
+ from redis.asyncio import Redis
13
+
14
+
15
+ def _get_new_token() -> str:
16
+ """Generate a new unique token.
17
+
18
+ Returns:
19
+ A new UUID4 token string.
20
+ """
21
+ return str(uuid.uuid4())
22
+
23
+
24
+ class TokenManager(ABC):
25
+ """Abstract base class for managing client token to session ID mappings."""
26
+
27
+ def __init__(self):
28
+ """Initialize the token manager with local dictionaries."""
29
+ # Keep a mapping between socket ID and client token.
30
+ self.token_to_sid: dict[str, str] = {}
31
+ # Keep a mapping between client token and socket ID.
32
+ self.sid_to_token: dict[str, str] = {}
33
+
34
+ @abstractmethod
35
+ async def link_token_to_sid(self, token: str, sid: str) -> str | None:
36
+ """Link a token to a session ID.
37
+
38
+ Args:
39
+ token: The client token.
40
+ sid: The Socket.IO session ID.
41
+
42
+ Returns:
43
+ New token if duplicate detected and new token generated, None otherwise.
44
+ """
45
+
46
+ @abstractmethod
47
+ async def disconnect_token(self, token: str, sid: str) -> None:
48
+ """Clean up token mapping when client disconnects.
49
+
50
+ Args:
51
+ token: The client token.
52
+ sid: The Socket.IO session ID.
53
+ """
54
+
55
+ @classmethod
56
+ def create(cls) -> TokenManager:
57
+ """Factory method to create appropriate TokenManager implementation.
58
+
59
+ Returns:
60
+ RedisTokenManager if Redis is available, LocalTokenManager otherwise.
61
+ """
62
+ if prerequisites.check_redis_used():
63
+ redis_client = prerequisites.get_redis()
64
+ if redis_client is not None:
65
+ return RedisTokenManager(redis_client)
66
+
67
+ return LocalTokenManager()
68
+
69
+
70
+ class LocalTokenManager(TokenManager):
71
+ """Token manager using local in-memory dictionaries (single worker)."""
72
+
73
+ def __init__(self):
74
+ """Initialize the local token manager."""
75
+ super().__init__()
76
+
77
+ async def link_token_to_sid(self, token: str, sid: str) -> str | None:
78
+ """Link a token to a session ID.
79
+
80
+ Args:
81
+ token: The client token.
82
+ sid: The Socket.IO session ID.
83
+
84
+ Returns:
85
+ New token if duplicate detected and new token generated, None otherwise.
86
+ """
87
+ # Check if token is already mapped to a different SID (duplicate tab)
88
+ if token in self.token_to_sid and sid != self.token_to_sid.get(token):
89
+ new_token = _get_new_token()
90
+ self.token_to_sid[new_token] = sid
91
+ self.sid_to_token[sid] = new_token
92
+ return new_token
93
+
94
+ # Normal case - link token to SID
95
+ self.token_to_sid[token] = sid
96
+ self.sid_to_token[sid] = token
97
+ return None
98
+
99
+ async def disconnect_token(self, token: str, sid: str) -> None:
100
+ """Clean up token mapping when client disconnects.
101
+
102
+ Args:
103
+ token: The client token.
104
+ sid: The Socket.IO session ID.
105
+ """
106
+ # Clean up both mappings
107
+ self.token_to_sid.pop(token, None)
108
+ self.sid_to_token.pop(sid, None)
109
+
110
+
111
+ class RedisTokenManager(LocalTokenManager):
112
+ """Token manager using Redis for distributed multi-worker support.
113
+
114
+ Inherits local dict logic from LocalTokenManager and adds Redis layer
115
+ for cross-worker duplicate detection.
116
+ """
117
+
118
+ def __init__(self, redis: Redis):
119
+ """Initialize the Redis token manager.
120
+
121
+ Args:
122
+ redis: The Redis client instance.
123
+ """
124
+ # Initialize parent's local dicts
125
+ super().__init__()
126
+
127
+ self.redis = redis
128
+
129
+ # Get token expiration from config (default 1 hour)
130
+ from reflex.config import get_config
131
+
132
+ config = get_config()
133
+ self.token_expiration = config.redis_token_expiration
134
+
135
+ def _get_redis_key(self, token: str) -> str:
136
+ """Get Redis key for token mapping.
137
+
138
+ Args:
139
+ token: The client token.
140
+
141
+ Returns:
142
+ Redis key following Reflex conventions: {token}_sid
143
+ """
144
+ return f"{token}_sid"
145
+
146
+ async def link_token_to_sid(self, token: str, sid: str) -> str | None:
147
+ """Link a token to a session ID with Redis-based duplicate detection.
148
+
149
+ Args:
150
+ token: The client token.
151
+ sid: The Socket.IO session ID.
152
+
153
+ Returns:
154
+ New token if duplicate detected and new token generated, None otherwise.
155
+ """
156
+ # Fast local check first (handles reconnections)
157
+ if token in self.token_to_sid and self.token_to_sid[token] == sid:
158
+ return None # Same token, same SID = reconnection, no Redis check needed
159
+
160
+ # Check Redis for cross-worker duplicates
161
+ redis_key = self._get_redis_key(token)
162
+
163
+ try:
164
+ token_exists_in_redis = await self.redis.exists(redis_key)
165
+ except Exception as e:
166
+ console.error(f"Redis error checking token existence: {e}")
167
+ return await super().link_token_to_sid(token, sid)
168
+
169
+ if token_exists_in_redis:
170
+ # Duplicate exists somewhere - generate new token
171
+ new_token = _get_new_token()
172
+ new_redis_key = self._get_redis_key(new_token)
173
+
174
+ try:
175
+ # Store in Redis
176
+ await self.redis.set(new_redis_key, "1", ex=self.token_expiration)
177
+ except Exception as e:
178
+ console.error(f"Redis error storing new token: {e}")
179
+ # Still update local dicts and continue
180
+
181
+ # Store in local dicts (always do this)
182
+ self.token_to_sid[new_token] = sid
183
+ self.sid_to_token[sid] = new_token
184
+ return new_token
185
+
186
+ # Normal case - store in both Redis and local dicts
187
+ try:
188
+ await self.redis.set(redis_key, "1", ex=self.token_expiration)
189
+ except Exception as e:
190
+ console.error(f"Redis error storing token: {e}")
191
+ # Continue with local storage
192
+
193
+ # Store in local dicts (always do this)
194
+ self.token_to_sid[token] = sid
195
+ self.sid_to_token[sid] = token
196
+ return None
197
+
198
+ async def disconnect_token(self, token: str, sid: str) -> None:
199
+ """Clean up token mapping when client disconnects.
200
+
201
+ Args:
202
+ token: The client token.
203
+ sid: The Socket.IO session ID.
204
+ """
205
+ # Only clean up if we own it locally (fast ownership check)
206
+ if self.token_to_sid.get(token) == sid:
207
+ # Clean up Redis
208
+ redis_key = self._get_redis_key(token)
209
+ try:
210
+ await self.redis.delete(redis_key)
211
+ except Exception as e:
212
+ console.error(f"Redis error deleting token: {e}")
213
+
214
+ # Clean up local dicts (always do this)
215
+ await super().disconnect_token(token, sid)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.5a2
3
+ Version: 0.8.6a1
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
@@ -36,6 +36,8 @@ Requires-Dist: sqlmodel<0.1,>=0.0.24
36
36
  Requires-Dist: starlette>=0.47.0
37
37
  Requires-Dist: typing-extensions>=4.13.0
38
38
  Requires-Dist: wrapt<2.0,>=1.17.0
39
+ Provides-Extra: monitoring
40
+ Requires-Dist: pyleak<1.0,>=0.1.14; extra == 'monitoring'
39
41
  Description-Content-Type: text/markdown
40
42
 
41
43
  <div align="center">
@@ -50,6 +52,7 @@ Description-Content-Type: text/markdown
50
52
  [![Documentation](https://img.shields.io/badge/Documentation%20-Introduction%20-%20%23007ec6)](https://reflex.dev/docs/getting-started/introduction)
51
53
  [![PyPI Downloads](https://static.pepy.tech/badge/reflex)](https://pepy.tech/projects/reflex)
52
54
  [![Discord](https://img.shields.io/discord/1029853095527727165?color=%237289da&label=Discord)](https://discord.gg/T5WSbC2YtQ)
55
+ [![Twitter](https://img.shields.io/twitter/follow/getreflex)](https://x.com/getreflex)
53
56
 
54
57
  </div>
55
58
 
@@ -242,7 +245,7 @@ def get_image(self):
242
245
 
243
246
  Within the state, we define functions called event handlers that change the state vars. Event handlers are the way that we can modify the state in Reflex. They can be called in response to user actions, such as clicking a button or typing in a text box. These actions are called events.
244
247
 
245
- Our DALL·E. app has an event handler, `get_image` to which get this image from the OpenAI API. Using `yield` in the middle of an event handler will cause the UI to update. Otherwise the UI will update at the end of the event handler.
248
+ Our DALL·E app has an event handler, `get_image` which gets this image from the OpenAI API. Using `yield` in the middle of an event handler will cause the UI to update. Otherwise the UI will update at the end of the event handler.
246
249
 
247
250
  ### **Routing**
248
251
 
@@ -1,11 +1,11 @@
1
- reflex/__init__.py,sha256=ZQcJeGMYKc0Lx153mc_6HBOqXm73vg1PJfxLHn22AtM,10122
2
- reflex/__init__.pyi,sha256=QvBL5PePQ0SpojfClqAafiI6QetFB-qmDH-S7neQm3c,10091
1
+ reflex/__init__.py,sha256=_1PVYjDeA6_JyfXvL6OuKjjO6AX2oMiNcAq8AEHf6xw,10161
2
+ reflex/__init__.pyi,sha256=0D46kHVUJPE_kgYL-BjraERu-MXNCPsQTZQShrijmeQ,10148
3
3
  reflex/__main__.py,sha256=6cVrGEyT3j3tEvlEVUatpaYfbB5EF3UVY-6vc_Z7-hw,108
4
4
  reflex/admin.py,sha256=Nbc38y-M8iaRBvh1W6DQu_D3kEhO8JFvxrog4q2cB_E,434
5
- reflex/app.py,sha256=Yg4CYS5aHTvScfhqW8jC9-JeYoz-Yjii2nDWz7GFuF0,75310
5
+ reflex/app.py,sha256=g5bpc29jekySAvA0a3advQ1dUM-y4cKAM8vMB7oNAsM,77731
6
6
  reflex/assets.py,sha256=l5O_mlrTprC0lF7Rc_McOe3a0OtSLnRdNl_PqCpDCBA,3431
7
7
  reflex/base.py,sha256=Oh664QL3fZEHErhUasFqP7fE4olYf1y-9Oj6uZI2FCU,1173
8
- reflex/config.py,sha256=HgJ57Op-glTro23GoQKmyXwUplvGYgZFKjvClYpD27s,19359
8
+ reflex/config.py,sha256=iL5hbdel04GzTtNiPwoNQ6xACJO1SkuvwzAyodDv028,19875
9
9
  reflex/environment.py,sha256=G-s20hBr-7K1_b6992XTgvNnBojcuL9Y33NAIUJLvT8,22940
10
10
  reflex/event.py,sha256=Yv9-tY-NH4q0Up72ljsABfBfnobnC0__DMvSWhFEo6M,74791
11
11
  reflex/model.py,sha256=l1-6fm7NHRFWH-xK9oV9UzAVfvKeUXG1f-tCrF7vmfI,19403
@@ -13,9 +13,9 @@ reflex/page.py,sha256=ssCbMVFuIy60vH-YhJUzN0OxzUwXFCCD3ej56dVjp3g,3525
13
13
  reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  reflex/reflex.py,sha256=BkHnxKp3uZEllLWBbH8Y_EfSu80L4_0FEbSbZkg7JyQ,22506
15
15
  reflex/route.py,sha256=ZRlXl1HeKWM3W-yFCnRFIA_6I3W9JBqe2CKzCpWX7Vg,7699
16
- reflex/state.py,sha256=mrYV9wEdJ9DdWbAadgdWHbxc6onOU56dT8f4zkbznPo,92127
16
+ reflex/state.py,sha256=V84fFvC8yzs0hoqgAgF1BMK81yWm6UZMGUxSJBQPf6o,93061
17
17
  reflex/style.py,sha256=JxbXXA4MTnXrk0XHEoMBoNC7J-M2oL5Hl3W_QmXvmBg,13222
18
- reflex/testing.py,sha256=6EXQN9K0tYfzEDe2aSRh4xLM_Jb_oIrI_qH2F_e0KXc,39423
18
+ reflex/testing.py,sha256=MgYxW3MLjd8TX5Lv7EWW-go3Fu_gL07i9HpxPJpBUDw,39951
19
19
  reflex/.templates/apps/blank/assets/favicon.ico,sha256=baxxgDAQ2V4-G5Q4S2yK5uUJTUGkv-AOWBQ0xd6myUo,4286
20
20
  reflex/.templates/apps/blank/code/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
21
21
  reflex/.templates/apps/blank/code/blank.py,sha256=wry9E3VjC7qtt_gzqNOyo4KZAAlzVyNp3uhFkcLZmM0,898
@@ -26,6 +26,7 @@ reflex/.templates/jinja/custom_components/demo_app.py.jinja2,sha256=ipbKtObNqQLc
26
26
  reflex/.templates/jinja/custom_components/pyproject.toml.jinja2,sha256=HG-k3pruUlMy7xYz339hgFkNMTLqB-C_FTLKkOgfBPM,630
27
27
  reflex/.templates/jinja/custom_components/src.py.jinja2,sha256=e80PwMI6NoeQtGJ0NXWhYrkqUe7jvvJTFuztYQe-R5w,2403
28
28
  reflex/.templates/jinja/web/package.json.jinja2,sha256=cS9M6ADYDoYL2Kc8m5dYhV8eDaehOXb6qK_IOijT3N0,673
29
+ reflex/.templates/jinja/web/vite.config.js.jinja2,sha256=lx7G9abIKzSn0Sz98YWbAMIeLFM1p0iujj8IW_xBDAY,1639
29
30
  reflex/.templates/jinja/web/pages/_app.js.jinja2,sha256=tG-SRR7DCP3SxLoUl_5rIRmL1uBDVnkcenSUxy459hY,1575
30
31
  reflex/.templates/jinja/web/pages/_document.js.jinja2,sha256=v_r79GPGKnw1g9Bg4lK9o_ow5AzBnvKdz0nv3OgJyzU,166
31
32
  reflex/.templates/jinja/web/pages/base_page.js.jinja2,sha256=nteivFZgOhgwxlPvejgaoxKTPGvDRb7_JAXhsZDZeLM,361
@@ -44,7 +45,6 @@ reflex/.templates/web/jsconfig.json,sha256=rhQZZRBYxBWclFYTeU6UakzbGveM4qyRQZUpE
44
45
  reflex/.templates/web/postcss.config.js,sha256=6Hf540Ny078yfmJ_-tniZtmgHW6euyEyxO0zH-Y1EtQ,86
45
46
  reflex/.templates/web/react-router.config.js,sha256=5K1FBryYdPusn1nE513GwB5_5UdPzoyH8ZMANUbpodQ,84
46
47
  reflex/.templates/web/vite-plugin-safari-cachebust.js,sha256=FcyppYYBxUlZtQ-D_iyVaQIT6TBVisBH7DMzWxYm-zA,5300
47
- reflex/.templates/web/vite.config.js,sha256=JkeosM-OI3zwbwE3zON1ws8SrMAORG54nuQsPecU5d4,1429
48
48
  reflex/.templates/web/app/entry.client.js,sha256=2Jv-5SQWHhHmA07BP50f1ew1V-LOsX5VoLtSInnFDj8,264
49
49
  reflex/.templates/web/app/routes.js,sha256=OPPW82B079c4FGq_p5C5OBrkVnTNRFhgG3--WKlJSy0,312
50
50
  reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js,sha256=dnDHW49imtdalZJQqj7J_u7cj2z8Sve7OlhtOO0FbKE,916
@@ -52,7 +52,7 @@ reflex/.templates/web/components/shiki/code.js,sha256=4Es1pxsr-lX4hTQ5mglrwwC6O_
52
52
  reflex/.templates/web/styles/__reflex_style_reset.css,sha256=qbC6JIT643YEsvSQ0D7xBmWE5vXy94JGrKNihRuEjnA,8913
53
53
  reflex/.templates/web/utils/client_side_routing.js,sha256=lRNgEGCLfTejh8W3aCuBdFuko6UI2vetk64j8wLT5Uk,1650
54
54
  reflex/.templates/web/utils/react-theme.js,sha256=Aa-RND3ooGCXW6Zavzitc-v0ciKlcQDTFlDtE4mPkFI,2713
55
- reflex/.templates/web/utils/state.js,sha256=Z9NeC1sjePtIg03kvxILng-1ri_PNZFAM_t64K4d5Dg,36162
55
+ reflex/.templates/web/utils/state.js,sha256=-RbOSjeggpR4VYffLYN59nTCEw8d9KHEqN_O_Lp33aM,36338
56
56
  reflex/.templates/web/utils/helpers/dataeditor.js,sha256=pG6MgsHuStDR7-qPipzfiK32j9bKDBa-4hZ0JSUo4JM,1623
57
57
  reflex/.templates/web/utils/helpers/debounce.js,sha256=xGhtTRtS_xIcaeqnYVvYJNseLgQVk-DW-eFiHJYO9As,528
58
58
  reflex/.templates/web/utils/helpers/paste.js,sha256=ef30HsR83jRzzvZnl8yV79yqFP8TC_u8SlN99cCS_OM,1799
@@ -64,7 +64,7 @@ reflex/app_mixins/middleware.py,sha256=BKhe0jUFO1_TylEC48LUZyaeYyPmAYW-NV4H5Rw22
64
64
  reflex/app_mixins/mixin.py,sha256=R1YncalqDrbdPZvpKVbm72ZKmQZxYAWfuFq9JknzTqQ,305
65
65
  reflex/compiler/__init__.py,sha256=r8jqmDSFf09iV2lHlNhfc9XrTLjNxfDNwPYlxS4cmHE,27
66
66
  reflex/compiler/compiler.py,sha256=AEGoZRG3PVOUf_5lZxlAt0pwsXg-lYIdOluyzpMuyOI,29088
67
- reflex/compiler/templates.py,sha256=mQifVgvE7cKyzMFL9F5jxdJb9KFxucWJa7nuOp09ZUo,6002
67
+ reflex/compiler/templates.py,sha256=eWBtJBrriUyb7j4yRCi2X8MVauIVAfz0Ip6NaXLUhIM,6104
68
68
  reflex/compiler/utils.py,sha256=587KMP1BDYYigAY6looM9L69Eoq3PEOxCB8k7r9BW5A,18922
69
69
  reflex/components/__init__.py,sha256=eWpgWFbSQDj2TpGp6StEbxU7roQgzY7ZM0XIcIc5RE8,588
70
70
  reflex/components/__init__.pyi,sha256=7VFHtJGIjvGtD3IiPk848IPWYSCcPRT1EyPGljLhYlU,736
@@ -82,7 +82,7 @@ reflex/components/base/body.py,sha256=KLPOhxVsKyjPwrY9AziCOOG_c9ckOqIhI4n2i3_Q3N
82
82
  reflex/components/base/body.pyi,sha256=VG8N-0ocwgFOJR9mXfu6a5BtIY_jR7mK9lX3Y22g9GQ,8655
83
83
  reflex/components/base/document.py,sha256=Fr7y22NbeKeiz8kWPH2q5BpFjKdq-AmY-sxZilee_H8,636
84
84
  reflex/components/base/document.pyi,sha256=PlvclB2vyGcQ8zLJpFac_37LHeXLwpe8Qh0UqzXAPfE,11788
85
- reflex/components/base/error_boundary.py,sha256=hGp0yjFjBLutbplZkI3fkHBjIWBlYOoZ_1ISth7jEV0,6351
85
+ reflex/components/base/error_boundary.py,sha256=sp6W7G6uFWdls6nzl17XSizSSm6zS2OAu3ZqTE2W1CE,6438
86
86
  reflex/components/base/error_boundary.pyi,sha256=SvKnZ09jwIL_4-J5BKVZuATclrB4o3Eh457iTmmoNb4,2926
87
87
  reflex/components/base/fragment.py,sha256=ys7wkokq-N8WBxa9fqkEaNIrBlSximyD7vqlFVe02hQ,342
88
88
  reflex/components/base/fragment.pyi,sha256=1vl8p6SCWd0_QzYVAb-Em70IX6FwIWFvJLxMl5OJTwU,2401
@@ -127,25 +127,25 @@ reflex/components/datadisplay/__init__.py,sha256=L8pWWKNHWdUD2fbZRoEKjd_8c_hpDdG
127
127
  reflex/components/datadisplay/__init__.pyi,sha256=H3LZkWdrw3RTv_csaIT8qoClgAJTonlGZ5ZMeGMV0Bs,551
128
128
  reflex/components/datadisplay/code.py,sha256=--KKcHTi7mxXDv1-sokZYEwBl735i0fbT6RpWHE-8Dw,12588
129
129
  reflex/components/datadisplay/code.pyi,sha256=-oMJ66LEb3sCJHlUj7rEY3H5aIujjMh1sPKndf1KUIo,41275
130
- reflex/components/datadisplay/dataeditor.py,sha256=SxvIDyKl9TILOlx6Zga9jCcu0LBc4E1WhrUFJGO6lKs,13496
131
- reflex/components/datadisplay/dataeditor.pyi,sha256=K9SjpUlJ-k76Gopo0Slmeq7O5YcmFj56Nqjmxvw5mes,12389
130
+ reflex/components/datadisplay/dataeditor.py,sha256=cGwAKPYknoHMwVhBowHKFtG2Nxr5q-8hIptnf98U7x0,13574
131
+ reflex/components/datadisplay/dataeditor.pyi,sha256=eDI6w6ZrJRXQsThXu3vS-dfI-aKPMntLN5RmGkJOYCQ,12511
132
132
  reflex/components/datadisplay/logo.py,sha256=xvg5TRVRSi2IKn7Kg4oYzWcaFMHfXxUaCp0cQmuKSn0,1993
133
133
  reflex/components/datadisplay/shiki_code_block.py,sha256=qCp4jZO3Ek4mR_1Qs4oxLh-GCEo6VBlpb8B9MDDdw4Y,24503
134
134
  reflex/components/datadisplay/shiki_code_block.pyi,sha256=J6NyOY_RQ9VTu7Psi3Tuctv5EM6FnlPZ2EXEZwHBC9w,56933
135
135
  reflex/components/el/__init__.py,sha256=JJHaCMvCh5_nsuyaWRVQ8d75A13lvaq4cpm6HoxUYuM,607
136
- reflex/components/el/__init__.pyi,sha256=zmdFPcH1ta6bA1JiY3DvIXx7wPtuIFmThrzq2mk_D_E,6293
136
+ reflex/components/el/__init__.pyi,sha256=Tp0hDa_HW7TxlN2dVrDHKeuiO0mQSFnmTBFZRUXSheQ,6345
137
137
  reflex/components/el/element.py,sha256=stGVO6A2waCHq2CGQqR_g798hDKkuSZerwB0tYfZpRE,582
138
138
  reflex/components/el/element.pyi,sha256=Bld5aXzT9vR5-pgrRddo5W4JMV54CMkamOZFUeLp4fY,2368
139
- reflex/components/el/elements/__init__.py,sha256=PKchWo_qdR2oSedspbMN1kDmB7OZG90Yxt-nzDenMBs,2779
140
- reflex/components/el/elements/__init__.pyi,sha256=0efVjUvi7r1UsCKf4U3qPyRhEJVcqs7DdBTa3dVTVbA,8610
139
+ reflex/components/el/elements/__init__.py,sha256=_uZaPHSQSDZBqo-v_hRZECJbWBY3SrqJLCZt1s2CTaQ,2797
140
+ reflex/components/el/elements/__init__.pyi,sha256=LCaxINN6BUqHsxgpDITjOUqJnF3x5rRI8y2fj62ZT14,8680
141
141
  reflex/components/el/elements/base.py,sha256=4jnwyCQUHvWcIfwiIWVCiIC_jbwZlkAiOgx73t7tdw8,3075
142
142
  reflex/components/el/elements/base.pyi,sha256=RPdq_8Z1gkV-5n2qeEVQWpPCwVSTzY4eYb6iIJVU-ig,10074
143
143
  reflex/components/el/elements/forms.py,sha256=HK3bJd4pUU7CBjC4Py9Q_AblyaUE6ELyifHQ2lVWDhs,21395
144
144
  reflex/components/el/elements/forms.pyi,sha256=4O2RyZPyC5WGA52SKYWOEvRrbiWg7emLzbtO_w8G_3w,168606
145
145
  reflex/components/el/elements/inline.py,sha256=q3Ku_x8L9NaXrYQovCfkWwZ5AfXG0VyhGN_OT73kA0Y,4126
146
146
  reflex/components/el/elements/inline.pyi,sha256=0pjqiHH8DmFfghbM8MK5tqgiZGSnfT-o055GINU8xrA,231760
147
- reflex/components/el/elements/media.py,sha256=3f3zJRDDp0UCzaUIJHZV4RzLrboGhAgAMsOkxgjuVGk,13647
148
- reflex/components/el/elements/media.pyi,sha256=1g5t9N75S_-qFuwaqmh8GV30pVsiaWKfaSBdbY_ilyU,231143
147
+ reflex/components/el/elements/media.py,sha256=t5vDG5q8K_-YTu2tkyeC7bXb0O913Z5C74jPhDjIqmA,14586
148
+ reflex/components/el/elements/media.pyi,sha256=g8stEbHH7qWoK0_x_ffqZRJdmElVmCo0iBekmxMWLJA,240566
149
149
  reflex/components/el/elements/metadata.py,sha256=Vf0D0dXqvwt76FkrvDQQpESJmxDh6e6Qxnk2GIRhOlM,2316
150
150
  reflex/components/el/elements/metadata.pyi,sha256=5pqPOzE-QbjiOQBitX_qWkcrCssotx-VaP-7x62dfjg,39675
151
151
  reflex/components/el/elements/other.py,sha256=WON35QviPNYsBeLQTNbeN7a6m6ixLYIVa4WsDzo9YBY,1378
@@ -162,8 +162,8 @@ reflex/components/gridjs/__init__.py,sha256=xJwDm1AZ70L5-t9LLqZwGUtDpijbf1KuMYDT
162
162
  reflex/components/gridjs/datatable.py,sha256=7JKrRw1zkpFB0_wwoaIhrVrldsm7-dyi3PASgqLq8Hc,4224
163
163
  reflex/components/gridjs/datatable.pyi,sha256=kFgv82vCgfdWZaUq4bZ73G8X3mkw6ecvSRkZ9G9-28E,5185
164
164
  reflex/components/lucide/__init__.py,sha256=EggTK2MuQKQeOBLKW-mF0VaDK9zdWBImu1HO2dvHZbE,73
165
- reflex/components/lucide/icon.py,sha256=-xb7snRMWPXJ9OR8lLWLD3yTAP2lQviTkMC8JLgyDGE,35092
166
- reflex/components/lucide/icon.pyi,sha256=5XdzyXc1snQvLd_IXInRfLZnKl3_RH5Q-0Pu1MRqVEk,37861
165
+ reflex/components/lucide/icon.py,sha256=aqjX1dq6-FxiMvvOF_002Bbfmz2fq5MnggbEQ5wn30w,35145
166
+ reflex/components/lucide/icon.pyi,sha256=xxhLg-RZgUw0-cDT9F4898aG12EsoKZXrP3KAhkrI60,37939
167
167
  reflex/components/markdown/__init__.py,sha256=Dfl1At5uYoY7H4ufZU_RY2KOGQDLtj75dsZ2BTqqAns,87
168
168
  reflex/components/markdown/markdown.py,sha256=scDHnmn2n4KHXS2Imqa1jw1wTk1ewCB2MojC9NgKGHQ,15503
169
169
  reflex/components/markdown/markdown.pyi,sha256=oOlXZItHB0TPWsFz1Qjvr3KzG8sssthBp40UO_KkRIA,4322
@@ -325,7 +325,7 @@ reflex/components/recharts/polar.pyi,sha256=8ShEcGK9KJyu0FN6KPys1kgAYrzOZ6wtiRuy
325
325
  reflex/components/recharts/recharts.py,sha256=CrkZ1Ez6QhDpDvlL0TkeT_qtBg0keLaGS9L2qfgr8zI,3221
326
326
  reflex/components/recharts/recharts.pyi,sha256=9j8cVSMqyBkkOBBrx9pzDpP1clnbM9kD0TTViTUGDYc,7084
327
327
  reflex/components/sonner/__init__.py,sha256=L_mdRIy7-ccRGSz5VK6J8O-c-e-D1p9xWw29_ErrvGg,68
328
- reflex/components/sonner/toast.py,sha256=T_Vsq6wPnDLNeL6bmxu-DZsRRpoHm4Z4lqKW7URbSgY,12392
328
+ reflex/components/sonner/toast.py,sha256=rzSOAhb7tuT7IFOu7zSttya2GPjUNBahjQ_DEO-uocs,12392
329
329
  reflex/components/sonner/toast.pyi,sha256=jfNzgYUThyhz2lOjat61C8ObKawY16Bq_T3KLZ0aThY,7658
330
330
  reflex/components/tags/__init__.py,sha256=Pc0JU-Tv_W7KCsydXgbKmu7w2VtHNkI6Cx2hTkNhW_Q,152
331
331
  reflex/components/tags/cond_tag.py,sha256=kqN3FoDzr5fZUng1KDIvGmdQCLd7Tni3TQ_iaEz8F-w,641
@@ -334,7 +334,7 @@ reflex/components/tags/match_tag.py,sha256=cMSa_hbuEV8uFg0iCwLhRJ0J6-oU5rKQf9Z2-
334
334
  reflex/components/tags/tag.py,sha256=AbB8MtmmMUAvlMtQe7XLL-afsb1rckzo4R1MJ1RsNQs,3865
335
335
  reflex/components/tags/tagless.py,sha256=qO7Gm4V0ITDyymHkyltfz53155ZBt-W_WIPDYy93ca0,587
336
336
  reflex/constants/__init__.py,sha256=q2Jf-LBbNcGrOmx5M7QotIAYW_t3m02TsmmdtJ5_IhM,2190
337
- reflex/constants/base.py,sha256=3JpSXkVxQEbMB2nVM0koaf_rMgqM2olXTEUfD2esBHQ,7498
337
+ reflex/constants/base.py,sha256=_ozsoSM6g0oILaqC_mjv0SaPu_DjQBbUnk62qfYures,7577
338
338
  reflex/constants/colors.py,sha256=n-FN7stNrvk5rCN0TAvE28dqwUeQZHue-b5q1CO0EyQ,2048
339
339
  reflex/constants/compiler.py,sha256=bzmC1OW6kWr06rV1Gwoa2AtQ4yPoGhEzeoqpiNY0jwU,5703
340
340
  reflex/constants/config.py,sha256=8OIjiBdZZJrRVHsNBheMwopE9AwBFFzau0SXqXKcrPg,1715
@@ -352,15 +352,16 @@ reflex/experimental/hooks.py,sha256=CHYGrAE5t8riltrJmDFgJ4D2Vhmhw-y3B3MSGNlOQow,
352
352
  reflex/istate/__init__.py,sha256=afq_pCS5B_REC-Kl3Rbaa538uWi59xNz4INeuENcWnk,2039
353
353
  reflex/istate/data.py,sha256=KrANpAQFTZcfFWnxyykgK1FRNuXTwTin1WYpyqymV-U,7547
354
354
  reflex/istate/dynamic.py,sha256=xOQ9upZVPf6ngqcLQZ9HdAAYmoWwJ8kRFPH34Q5HTiM,91
355
- reflex/istate/manager.py,sha256=te5uQN6n-ctOGrf6NbZUVy6BKgWapLlMtCzDaO6RthU,30412
355
+ reflex/istate/manager.py,sha256=8EezUlCGkkg_UIs1xa460kZFdJ9qHo6naazphT4jqns,30446
356
356
  reflex/istate/proxy.py,sha256=Q8JrV1m6drVcTNJL9JuN-nKUXclazs96OHl_fhR0UBk,25928
357
357
  reflex/istate/storage.py,sha256=gCPoiZxuG-Rw0y-Pz3OC7rv4o08dQ_jK1fE2u8Jhxqg,4339
358
358
  reflex/istate/wrappers.py,sha256=p8uuioXRbR5hperwbOJHUcWdu7hukLikQdoR7qrnKsI,909
359
359
  reflex/middleware/__init__.py,sha256=x7xTeDuc73Hjj43k1J63naC9x8vzFxl4sq7cCFBX7sk,111
360
360
  reflex/middleware/hydrate_middleware.py,sha256=1ch7bx2ZhojOR15b-LHD2JztrWCnpPJjTe8MWHJe-5Y,1510
361
361
  reflex/middleware/middleware.py,sha256=p5VVoIgQ_NwOg_GOY6g0S4fmrV76_VE1zt-HiwbMw-s,1158
362
- reflex/plugins/__init__.py,sha256=aARE63iAH2pNVdGmFU4qkXDiPoeBxINfkFzwk-NZe0w,351
363
- reflex/plugins/base.py,sha256=Jgj7Xrpk0ztM57kl0hN3PUHYrGSXu7oj7OPyIWQJUcE,3059
362
+ reflex/plugins/__init__.py,sha256=jrMWQqMxCwDwgwQYTygeR_pIewMcvIFwAnngPbjSumQ,439
363
+ reflex/plugins/_screenshot.py,sha256=CAOaRpbrpTTIswwCXqhv7WYShB86Ao9MVv6dcXJzRb4,3958
364
+ reflex/plugins/base.py,sha256=5BgzCM7boj9kJ6FGzVzVlgQk-crJuVmOLCl1PXvv4-E,3372
364
365
  reflex/plugins/shared_tailwind.py,sha256=UXUndEEcYBZ02klymw-vSZv01IZVLJG3oSaBHpQ617U,6426
365
366
  reflex/plugins/sitemap.py,sha256=Jj47uSMnkxndl7awkl48EhlQylBfY00WuMBNyTBcZHA,6186
366
367
  reflex/plugins/tailwind_v3.py,sha256=7bXI-zsGoS1pW27-_gskxGaUOQ7NQMPcYkoI5lnmIMA,4819
@@ -370,7 +371,7 @@ reflex/utils/build.py,sha256=lk8hE69onG95dv-LxRhjtEugct1g-KcWPUDorzqeGIE,7964
370
371
  reflex/utils/codespaces.py,sha256=kEQ-j-jclTukFpXDlYgNp95kYMGDrQmP3VNEoYGZ1u4,3052
371
372
  reflex/utils/compat.py,sha256=aSJH_M6iomgHPQ4onQ153xh1MWqPi3HSYDzE68N6gZM,2635
372
373
  reflex/utils/console.py,sha256=QIOgyElaxSVM1Bbvz0zx77-MqkDZkfpu1d6l26VRkQ0,11580
373
- reflex/utils/decorator.py,sha256=P5xP2kZsJnNdc91x2dou9_Z8U3q4YkPDB-vpfE3CZtU,3900
374
+ reflex/utils/decorator.py,sha256=QUZntENupeW5FA5mNRTx0I1GzGKFQXhMjVg24_IIM5o,3957
374
375
  reflex/utils/exceptions.py,sha256=Wwu7Ji2xgq521bJKtU2NgjwhmFfnG8erirEVN2h8S-g,8884
375
376
  reflex/utils/exec.py,sha256=KQ5tS5vz3wuu9zDGPR6clSE0IoY_vcIbJGCB5bqiDJM,21987
376
377
  reflex/utils/export.py,sha256=Z2AHuhkxGQzOi9I90BejQ4qEcD0URr2i-ZU5qTJt7eQ,2562
@@ -378,15 +379,17 @@ reflex/utils/format.py,sha256=FZe5NA0U3K0n0k7r8RIGcx-eHpN7sf8eQX9w1C8_uR8,21120
378
379
  reflex/utils/imports.py,sha256=Ov-lqv-PfsPl3kTEW13r5aDauIfn6TqzEMyv42RKLOA,3761
379
380
  reflex/utils/lazy_loader.py,sha256=BiY9OvmAJDCz10qpuyTYv9duXgMFQa6RXKQmTO9hqKU,4453
380
381
  reflex/utils/misc.py,sha256=folEweZVCrhHNkkqut9KqQdTJ80HxwL_gI41m40FnNM,4592
382
+ reflex/utils/monitoring.py,sha256=87fr9j6Y9Bvz2uF4tBxuX6CaU054h1UPx0ijcnyP_kw,5250
381
383
  reflex/utils/net.py,sha256=q3h5pNbAlFiqy8U15S9DTOvzy_OnenVVug5ROBTGRTA,4267
382
384
  reflex/utils/path_ops.py,sha256=_RS17IQDNr5vcoLLGZx2-z1E5WP-JgDHvaRAOgqrZiU,8154
383
- reflex/utils/prerequisites.py,sha256=JRZqECnuEglizSTUTpO6x39s_CfEluzDHQn6TDOFZLs,62510
385
+ reflex/utils/prerequisites.py,sha256=JUv4VGPDJmZrJM1U5Ot87ZzPwd4sG-3AbsyuTt5o7K0,63118
384
386
  reflex/utils/processes.py,sha256=t-ufWwu9RDsSMXCSsmjS2TILP5s7-AY94Rgx2O2gHMw,18178
385
387
  reflex/utils/pyi_generator.py,sha256=HdmUVs50Bk7MAMFSvpATRhH--_50w-9URMFnjLlwT40,46086
386
388
  reflex/utils/redir.py,sha256=E6lJ6UYGQs_uCyQAKHT_dDMplo5IRZ9JarWfvgGAgGo,1731
387
389
  reflex/utils/registry.py,sha256=omKh5rrsybDuuKmh4K88lwdwwcpGsu3Vc4pCko_djKY,2239
388
390
  reflex/utils/serializers.py,sha256=sVLfbWIBKPpmo0CVVxoxXGu0K3R9mYMWgaI02LXZmcM,13952
389
391
  reflex/utils/telemetry.py,sha256=XpPbFmlFdEh5uJl5vXoLyCCFv1choJN8EMko0MujigQ,7452
392
+ reflex/utils/token_manager.py,sha256=o_HGbqT9WfYRmek2iY9nem4vDZMz8Q4Dra-eW1lKmuA,6999
390
393
  reflex/utils/types.py,sha256=jFHfd2-yHWV61L7YP2gc9Zj2ZLwdthHOOfRIc_PAWH0,38390
391
394
  reflex/vars/__init__.py,sha256=85eXMt32bFoKtMdH3KxYRMD8mtnKyYiQcThPxJLoW1k,1359
392
395
  reflex/vars/base.py,sha256=IGCU5iwZSsVMPVQqODEjmHJrskqfpfMIQ2yzcVFMoSQ,112940
@@ -397,8 +400,8 @@ reflex/vars/number.py,sha256=tO7pnvFaBsedq1HWT4skytnSqHWMluGEhUbjAUMx8XQ,28190
397
400
  reflex/vars/object.py,sha256=BDmeiwG8v97s_BnR1Egq3NxOKVjv9TfnREB3cz0zZtk,17322
398
401
  reflex/vars/sequence.py,sha256=1kBrqihspyjyQ1XDqFPC8OpVGtZs_EVkOdIKBro5ilA,55249
399
402
  scripts/hatch_build.py,sha256=-4pxcLSFmirmujGpQX9UUxjhIC03tQ_fIQwVbHu9kc0,1861
400
- reflex-0.8.5a2.dist-info/METADATA,sha256=lO1cEJpg5qXPc5COdvcy0vJmH6Lv38sY6iPaDFNXdnw,12372
401
- reflex-0.8.5a2.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
402
- reflex-0.8.5a2.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
403
- reflex-0.8.5a2.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
404
- reflex-0.8.5a2.dist-info/RECORD,,
403
+ reflex-0.8.6a1.dist-info/METADATA,sha256=teDs-RrGAMBksliapUSw7JC4U6yaHZoVfD25pKGzFzY,12541
404
+ reflex-0.8.6a1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
405
+ reflex-0.8.6a1.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
406
+ reflex-0.8.6a1.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
407
+ reflex-0.8.6a1.dist-info/RECORD,,