reflex 0.8.0a7__py3-none-any.whl → 0.8.1a1__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.

reflex/istate/data.py CHANGED
@@ -2,9 +2,11 @@
2
2
 
3
3
  import dataclasses
4
4
  from collections.abc import Mapping
5
+ from typing import TYPE_CHECKING
6
+ from urllib.parse import _NetlocResultMixinStr, urlsplit
5
7
 
6
8
  from reflex import constants
7
- from reflex.utils import format
9
+ from reflex.utils import console, format
8
10
  from reflex.utils.serializers import serializer
9
11
 
10
12
 
@@ -45,36 +47,40 @@ class _HeaderData:
45
47
  )
46
48
 
47
49
 
48
- @dataclasses.dataclass(frozen=True, init=False)
50
+ _HEADER_DATA_FIELDS = frozenset(
51
+ [field.name for field in dataclasses.fields(_HeaderData)]
52
+ )
53
+
54
+
55
+ @dataclasses.dataclass(frozen=True)
49
56
  class HeaderData(_HeaderData):
50
57
  """An object containing headers data."""
51
58
 
52
- def __init__(self, router_data: dict | None = None):
53
- """Initialize the HeaderData object based on router_data.
59
+ @classmethod
60
+ def from_router_data(cls, router_data: dict) -> "HeaderData":
61
+ """Create a HeaderData object from the given router_data.
54
62
 
55
63
  Args:
56
64
  router_data: the router_data dict.
65
+
66
+ Returns:
67
+ A HeaderData object initialized with the provided router_data.
57
68
  """
58
- super().__init__()
59
- if router_data:
60
- fields_names = [f.name for f in dataclasses.fields(self)]
61
- for k, v in router_data.get(constants.RouteVar.HEADERS, {}).items():
62
- snake_case_key = format.to_snake_case(k)
63
- if snake_case_key in fields_names:
64
- object.__setattr__(self, snake_case_key, v)
65
- object.__setattr__(
66
- self,
67
- "raw_headers",
68
- _FrozenDictStrStr(
69
- **{
70
- k: v
71
- for k, v in router_data.get(
72
- constants.RouteVar.HEADERS, {}
73
- ).items()
74
- if v
75
- }
76
- ),
77
- )
69
+ return cls(
70
+ **{
71
+ snake_case_key: v
72
+ for k, v in router_data.get(constants.RouteVar.HEADERS, {}).items()
73
+ if v
74
+ and (snake_case_key := format.to_snake_case(k)) in _HEADER_DATA_FIELDS
75
+ },
76
+ raw_headers=_FrozenDictStrStr(
77
+ **{
78
+ k: v
79
+ for k, v in router_data.get(constants.RouteVar.HEADERS, {}).items()
80
+ if v
81
+ }
82
+ ),
83
+ )
78
84
 
79
85
 
80
86
  @serializer(to=dict)
@@ -90,6 +96,35 @@ def serialize_frozen_dict_str_str(obj: _FrozenDictStrStr) -> dict:
90
96
  return dict(obj._data)
91
97
 
92
98
 
99
+ class ReflexURL(str, _NetlocResultMixinStr):
100
+ """A class representing a URL split result."""
101
+
102
+ if TYPE_CHECKING:
103
+ scheme: str
104
+ netloc: str
105
+ path: str
106
+ query: str
107
+ fragment: str
108
+
109
+ def __new__(cls, url: str):
110
+ """Create a new ReflexURL instance.
111
+
112
+ Args:
113
+ url: the URL to split.
114
+
115
+ Returns:
116
+ A new ReflexURL instance.
117
+ """
118
+ (scheme, netloc, path, query, fragment) = urlsplit(url)
119
+ obj = super().__new__(cls, url)
120
+ object.__setattr__(obj, "scheme", scheme)
121
+ object.__setattr__(obj, "netloc", netloc)
122
+ object.__setattr__(obj, "path", path)
123
+ object.__setattr__(obj, "query", query)
124
+ object.__setattr__(obj, "fragment", fragment)
125
+ return obj
126
+
127
+
93
128
  @dataclasses.dataclass(frozen=True)
94
129
  class PageData:
95
130
  """An object containing page data."""
@@ -101,39 +136,30 @@ class PageData:
101
136
  full_raw_path: str = ""
102
137
  params: dict = dataclasses.field(default_factory=dict)
103
138
 
104
- def __init__(self, router_data: dict | None = None):
105
- """Initialize the PageData object based on router_data.
139
+ @classmethod
140
+ def from_router_data(cls, router_data: dict) -> "PageData":
141
+ """Create a PageData object from the given router_data.
106
142
 
107
143
  Args:
108
144
  router_data: the router_data dict.
145
+
146
+ Returns:
147
+ A PageData object initialized with the provided router_data.
109
148
  """
110
- if router_data:
111
- object.__setattr__(
112
- self,
113
- "host",
114
- router_data.get(constants.RouteVar.HEADERS, {}).get("origin", ""),
115
- )
116
- object.__setattr__(
117
- self, "path", router_data.get(constants.RouteVar.PATH, "")
118
- )
119
- object.__setattr__(
120
- self, "raw_path", router_data.get(constants.RouteVar.ORIGIN, "")
121
- )
122
- object.__setattr__(self, "full_path", f"{self.host}{self.path}")
123
- object.__setattr__(self, "full_raw_path", f"{self.host}{self.raw_path}")
124
- object.__setattr__(
125
- self, "params", router_data.get(constants.RouteVar.QUERY, {})
126
- )
127
- else:
128
- object.__setattr__(self, "host", "")
129
- object.__setattr__(self, "path", "")
130
- object.__setattr__(self, "raw_path", "")
131
- object.__setattr__(self, "full_path", "")
132
- object.__setattr__(self, "full_raw_path", "")
133
- object.__setattr__(self, "params", {})
149
+ host = router_data.get(constants.RouteVar.HEADERS, {}).get("origin", "")
150
+ path = router_data.get(constants.RouteVar.PATH, "")
151
+ raw_path = router_data.get(constants.RouteVar.ORIGIN, "")
152
+ return cls(
153
+ host=host,
154
+ path=path,
155
+ raw_path=raw_path,
156
+ full_path=f"{host}{path}",
157
+ full_raw_path=f"{host}{raw_path}",
158
+ params=router_data.get(constants.RouteVar.QUERY, {}),
159
+ )
134
160
 
135
161
 
136
- @dataclasses.dataclass(frozen=True, init=False)
162
+ @dataclasses.dataclass(frozen=True)
137
163
  class SessionData:
138
164
  """An object containing session data."""
139
165
 
@@ -141,37 +167,84 @@ class SessionData:
141
167
  client_ip: str = ""
142
168
  session_id: str = ""
143
169
 
144
- def __init__(self, router_data: dict | None = None):
145
- """Initialize the SessionData object based on router_data.
170
+ @classmethod
171
+ def from_router_data(cls, router_data: dict) -> "SessionData":
172
+ """Create a SessionData object from the given router_data.
146
173
 
147
174
  Args:
148
175
  router_data: the router_data dict.
176
+
177
+ Returns:
178
+ A SessionData object initialized with the provided router_data.
149
179
  """
150
- if router_data:
151
- client_token = router_data.get(constants.RouteVar.CLIENT_TOKEN, "")
152
- client_ip = router_data.get(constants.RouteVar.CLIENT_IP, "")
153
- session_id = router_data.get(constants.RouteVar.SESSION_ID, "")
154
- else:
155
- client_token = client_ip = session_id = ""
156
- object.__setattr__(self, "client_token", client_token)
157
- object.__setattr__(self, "client_ip", client_ip)
158
- object.__setattr__(self, "session_id", session_id)
180
+ return cls(
181
+ client_token=router_data.get(constants.RouteVar.CLIENT_TOKEN, ""),
182
+ client_ip=router_data.get(constants.RouteVar.CLIENT_IP, ""),
183
+ session_id=router_data.get(constants.RouteVar.SESSION_ID, ""),
184
+ )
159
185
 
160
186
 
161
- @dataclasses.dataclass(frozen=True, init=False)
187
+ @dataclasses.dataclass(frozen=True)
162
188
  class RouterData:
163
189
  """An object containing RouterData."""
164
190
 
165
191
  session: SessionData = dataclasses.field(default_factory=SessionData)
166
192
  headers: HeaderData = dataclasses.field(default_factory=HeaderData)
167
- page: PageData = dataclasses.field(default_factory=PageData)
193
+ _page: PageData = dataclasses.field(default_factory=PageData)
194
+ url: ReflexURL = dataclasses.field(default=ReflexURL(""))
195
+ route_id: str = ""
168
196
 
169
- def __init__(self, router_data: dict | None = None):
170
- """Initialize the RouterData object.
197
+ @property
198
+ def page(self) -> PageData:
199
+ """Get the page data.
200
+
201
+ Returns:
202
+ The PageData object.
203
+ """
204
+ console.deprecate(
205
+ "RouterData.page",
206
+ "Use RouterData.url instead",
207
+ deprecation_version="0.8.1",
208
+ removal_version="0.9.0",
209
+ )
210
+ return self._page
211
+
212
+ @classmethod
213
+ def from_router_data(cls, router_data: dict) -> "RouterData":
214
+ """Create a RouterData object from the given router_data.
171
215
 
172
216
  Args:
173
217
  router_data: the router_data dict.
218
+
219
+ Returns:
220
+ A RouterData object initialized with the provided router_data.
174
221
  """
175
- object.__setattr__(self, "session", SessionData(router_data))
176
- object.__setattr__(self, "headers", HeaderData(router_data))
177
- object.__setattr__(self, "page", PageData(router_data))
222
+ return cls(
223
+ session=SessionData.from_router_data(router_data),
224
+ headers=HeaderData.from_router_data(router_data),
225
+ _page=PageData.from_router_data(router_data),
226
+ url=ReflexURL(
227
+ router_data.get(constants.RouteVar.HEADERS, {}).get("origin", "")
228
+ + router_data.get(constants.RouteVar.ORIGIN, "")
229
+ ),
230
+ route_id=router_data.get(constants.RouteVar.PATH, ""),
231
+ )
232
+
233
+
234
+ @serializer(to=dict)
235
+ def serialize_router_data(obj: RouterData) -> dict:
236
+ """Serialize a RouterData object to a dict.
237
+
238
+ Args:
239
+ obj: the RouterData object.
240
+
241
+ Returns:
242
+ A dict representation of the RouterData object.
243
+ """
244
+ return {
245
+ "session": obj.session,
246
+ "headers": obj.headers,
247
+ "page": obj._page,
248
+ "url": obj.url,
249
+ "route_id": obj.route_id,
250
+ }
@@ -17,7 +17,7 @@ class Constants(SimpleNamespace):
17
17
  """Tailwind constants."""
18
18
 
19
19
  # The Tailwindcss version
20
- VERSION = "tailwindcss@4.1.10"
20
+ VERSION = "tailwindcss@4.1.11"
21
21
  # The Tailwind config.
22
22
  CONFIG = "tailwind.config.js"
23
23
  # Default Tailwind content paths
@@ -156,7 +156,7 @@ class TailwindV4Plugin(TailwindPlugin):
156
156
  return [
157
157
  *super().get_frontend_development_dependencies(**context),
158
158
  Constants.VERSION,
159
- "@tailwindcss/postcss@4.1.10",
159
+ "@tailwindcss/postcss@4.1.11",
160
160
  ]
161
161
 
162
162
  def pre_compile(self, **context):
reflex/state.py CHANGED
@@ -1204,7 +1204,7 @@ class BaseState(EvenMoreBasicBaseState):
1204
1204
 
1205
1205
  def argsingle_factory(param: str):
1206
1206
  def inner_func(self: BaseState) -> str:
1207
- return self.router.page.params.get(param, "")
1207
+ return self.router._page.params.get(param, "")
1208
1208
 
1209
1209
  inner_func.__name__ = param
1210
1210
 
@@ -1212,7 +1212,7 @@ class BaseState(EvenMoreBasicBaseState):
1212
1212
 
1213
1213
  def arglist_factory(param: str):
1214
1214
  def inner_func(self: BaseState) -> list[str]:
1215
- return self.router.page.params.get(param, [])
1215
+ return self.router._page.params.get(param, [])
1216
1216
 
1217
1217
  inner_func.__name__ = param
1218
1218
 
@@ -2466,7 +2466,7 @@ class OnLoadInternalState(State):
2466
2466
  """
2467
2467
  # Do not app._compile()! It should be already compiled by now.
2468
2468
  load_events = prerequisites.get_and_validate_app().app.get_load_events(
2469
- self.router.page.path
2469
+ self.router._page.path
2470
2470
  )
2471
2471
  if not load_events:
2472
2472
  self.is_hydrated = True
reflex/utils/exec.py CHANGED
@@ -573,15 +573,37 @@ def run_uvicorn_backend_prod(host: str, port: int, loglevel: LogLevel):
573
573
  port: The app port
574
574
  loglevel: The log level.
575
575
  """
576
+ import os
577
+ import shlex
578
+
576
579
  from reflex.utils import processes
577
580
 
578
581
  app_module = get_app_instance()
579
582
 
580
- command = (
581
- ["uvicorn", *("--host", host), *("--port", str(port)), "--factory", app_module]
582
- if constants.IS_WINDOWS
583
- else ["gunicorn", "--preload", *("--bind", f"{host}:{port}"), f"{app_module}()"]
584
- )
583
+ if constants.IS_WINDOWS:
584
+ command = [
585
+ "uvicorn",
586
+ *("--host", host),
587
+ *("--port", str(port)),
588
+ "--factory",
589
+ app_module,
590
+ ]
591
+ else:
592
+ # Parse GUNICORN_CMD_ARGS for user overrides
593
+ env_args = []
594
+ if gunicorn_cmd_args := os.environ.get("GUNICORN_CMD_ARGS", ""):
595
+ env_args = shlex.split(gunicorn_cmd_args)
596
+
597
+ # Our default args, then env args (env args win on conflicts)
598
+ command = [
599
+ "gunicorn",
600
+ "--preload",
601
+ "--worker-class",
602
+ "uvicorn.workers.UvicornH11Worker",
603
+ *("--bind", f"{host}:{port}"),
604
+ *env_args,
605
+ f"{app_module}()",
606
+ ]
585
607
 
586
608
  command += [
587
609
  *("--log-level", loglevel.value),
@@ -27,6 +27,7 @@ def attach(
27
27
  package_name: str,
28
28
  submodules: set[str] | None = None,
29
29
  submod_attrs: dict[str, list[str]] | None = None,
30
+ **extra_mappings,
30
31
  ):
31
32
  """Replaces a package's __getattr__, __dir__, and __all__ attributes using lazy.attach.
32
33
  The lazy loader __getattr__ doesn't support tuples as list values. We needed to add
@@ -39,6 +40,7 @@ def attach(
39
40
  submodules : List of submodules to attach.
40
41
  submod_attrs : Dictionary of submodule -> list of attributes / functions.
41
42
  These attributes are imported as they are used.
43
+ extra_mappings: Additional mappings to resolve lazily.
42
44
 
43
45
  Returns:
44
46
  __getattr__, __dir__, __all__
@@ -60,9 +62,13 @@ def attach(
60
62
  attr: mod for mod, attrs in submod_attrs.items() for attr in attrs
61
63
  }
62
64
 
63
- __all__ = sorted(submodules | attr_to_modules.keys())
65
+ __all__ = sorted([*(submodules | attr_to_modules.keys()), *(extra_mappings or [])])
64
66
 
65
67
  def __getattr__(name: str): # noqa: N807
68
+ if name in extra_mappings:
69
+ submod_path, attr = extra_mappings[name].rsplit(".", 1)
70
+ submod = importlib.import_module(submod_path)
71
+ return getattr(submod, attr)
66
72
  if name in submodules:
67
73
  return importlib.import_module(f"{package_name}.{name}")
68
74
  if name in attr_to_modules:
reflex/utils/processes.py CHANGED
@@ -15,6 +15,7 @@ from pathlib import Path
15
15
  from typing import Any, Literal, overload
16
16
 
17
17
  import click
18
+ import rich.markup
18
19
  from redis.exceptions import RedisError
19
20
  from rich.progress import Progress
20
21
 
@@ -281,7 +282,7 @@ def stream_logs(
281
282
  return
282
283
  try:
283
284
  for line in process.stdout:
284
- console.debug(line, end="", progress=progress)
285
+ console.debug(rich.markup.escape(line), end="", progress=progress)
285
286
  logs.append(line)
286
287
  yield line
287
288
  except ValueError:
@@ -1108,11 +1108,13 @@ class PyiGenerator:
1108
1108
  sub_mod_attrs: dict[str, list[str | tuple[str, str]]] | None = getattr(
1109
1109
  mod, "_SUBMOD_ATTRS", None
1110
1110
  )
1111
+ extra_mappings: dict[str, str] | None = getattr(mod, "_EXTRA_MAPPINGS", None)
1111
1112
 
1112
- if not sub_mods and not sub_mod_attrs:
1113
+ if not sub_mods and not sub_mod_attrs and not extra_mappings:
1113
1114
  return None
1114
1115
  sub_mods_imports = []
1115
1116
  sub_mod_attrs_imports = []
1117
+ extra_mappings_imports = []
1116
1118
 
1117
1119
  if sub_mods:
1118
1120
  sub_mods_imports = [f"from . import {mod}" for mod in sorted(sub_mods)]
@@ -1140,7 +1142,20 @@ class PyiGenerator:
1140
1142
  ]
1141
1143
  sub_mod_attrs_imports.append("")
1142
1144
 
1143
- text = "\n" + "\n".join([*sub_mods_imports, *sub_mod_attrs_imports])
1145
+ if extra_mappings:
1146
+ for alias, import_path in extra_mappings.items():
1147
+ module_name, import_name = import_path.rsplit(".", 1)
1148
+ extra_mappings_imports.append(
1149
+ f"from {module_name} import {import_name} as {alias}"
1150
+ )
1151
+
1152
+ text = (
1153
+ "\n"
1154
+ + "\n".join(
1155
+ [*sub_mods_imports, *sub_mod_attrs_imports, *extra_mappings_imports]
1156
+ )
1157
+ + "\n"
1158
+ )
1144
1159
  text += ast.unparse(new_tree) + "\n\n"
1145
1160
  text += f"__all__ = {getattr(mod, '__all__', [])!r}\n"
1146
1161
  return text
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.0a7
3
+ Version: 0.8.1a1
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
@@ -31,7 +31,7 @@ Requires-Dist: pydantic<3.0,>=1.10.21
31
31
  Requires-Dist: python-multipart<1.0,>=0.0.20
32
32
  Requires-Dist: python-socketio<6.0,>=5.12.0
33
33
  Requires-Dist: redis<7.0,>=5.2.1
34
- Requires-Dist: reflex-hosting-cli>=0.1.47
34
+ Requires-Dist: reflex-hosting-cli>=0.1.51
35
35
  Requires-Dist: rich<15,>=13
36
36
  Requires-Dist: sqlmodel<0.1,>=0.0.24
37
37
  Requires-Dist: typing-extensions>=4.13.0
@@ -2,18 +2,18 @@ reflex/__init__.py,sha256=S_nJPFaTYwyxSzfOpACFxlSe2Vc8rQGr5ZDeyRSDiYQ,10264
2
2
  reflex/__init__.pyi,sha256=LHVB-SgdoFyB5aLiqiLEezMAd-vJje79ndxDxt9HWz8,10003
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=qRyXDNd9ASIeyescIg71E08mUarppiITdh-btn1TREQ,75003
5
+ reflex/app.py,sha256=2H_MpJvHkfMlfKp6j5ieydCrftM_k_uVwvLB6LmvNJw,75020
6
6
  reflex/assets.py,sha256=l5O_mlrTprC0lF7Rc_McOe3a0OtSLnRdNl_PqCpDCBA,3431
7
7
  reflex/base.py,sha256=Oh664QL3fZEHErhUasFqP7fE4olYf1y-9Oj6uZI2FCU,1173
8
8
  reflex/config.py,sha256=tEUaW4oJbkCDtQ1SgsT4APtLpQ9-VknVWdqwFoYorvg,15729
9
- reflex/environment.py,sha256=f9-5-XGTcI2OF02SM7DXGQMjW9YdfK0gj6IGyqOglvQ,21567
10
- reflex/event.py,sha256=IDjHAbbzMo7mNUiFKvgiR7sGlQ883B00rvmncVy5I-Q,69724
9
+ reflex/environment.py,sha256=bYikxi9VANTrA1EDWtygVT2WyoYx_Q6xFX7P8CeoIbM,23205
10
+ reflex/event.py,sha256=JdhRwJO1MYni4YfZ13NPSv0AWYHpLwk3L4WltH07L2c,70070
11
11
  reflex/model.py,sha256=xED7blemoiKxPFaOkCMrSayjjon7AJp8t5g459p7dGs,17646
12
12
  reflex/page.py,sha256=Bn8FTlUtjjKwUtpQA5r5eaWE_ZUb8i4XgrQi8FWbzNA,1880
13
13
  reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
14
  reflex/reflex.py,sha256=eUP0GevShUc1nodfA5_ewB3hgefWU0_x166HGCY8QTs,21606
15
15
  reflex/route.py,sha256=UfhKxFwe3EYto66TZv5K2Gp6ytRbcL-_v72DJ5girEs,7691
16
- reflex/state.py,sha256=4qqkUu_sazxQXn526v9jItudESZuzR6vZbxqdIKcczo,91953
16
+ reflex/state.py,sha256=OQKUTsa-kuehbt2U4esJT4Cq8lp6e3I-8QUk0pm2XB4,91956
17
17
  reflex/style.py,sha256=JxbXXA4MTnXrk0XHEoMBoNC7J-M2oL5Hl3W_QmXvmBg,13222
18
18
  reflex/testing.py,sha256=6EXQN9K0tYfzEDe2aSRh4xLM_Jb_oIrI_qH2F_e0KXc,39423
19
19
  reflex/.templates/apps/blank/assets/favicon.ico,sha256=baxxgDAQ2V4-G5Q4S2yK5uUJTUGkv-AOWBQ0xd6myUo,4286
@@ -43,7 +43,8 @@ reflex/.templates/web/.gitignore,sha256=3tT0CtVkCL09D_Y3Hd4myUgGcBuESeavCa0WHU5i
43
43
  reflex/.templates/web/jsconfig.json,sha256=rhQZZRBYxBWclFYTeU6UakzbGveM4qyRQZUpEAVhyqY,118
44
44
  reflex/.templates/web/postcss.config.js,sha256=6Hf540Ny078yfmJ_-tniZtmgHW6euyEyxO0zH-Y1EtQ,86
45
45
  reflex/.templates/web/react-router.config.js,sha256=5K1FBryYdPusn1nE513GwB5_5UdPzoyH8ZMANUbpodQ,84
46
- reflex/.templates/web/vite.config.js,sha256=48pSybaKFRmbeR2n7ead5ppJZxEpDPJQUB8jD9jbfEM,890
46
+ 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
47
48
  reflex/.templates/web/app/entry.client.js,sha256=2Jv-5SQWHhHmA07BP50f1ew1V-LOsX5VoLtSInnFDj8,264
48
49
  reflex/.templates/web/app/routes.js,sha256=OPPW82B079c4FGq_p5C5OBrkVnTNRFhgG3--WKlJSy0,312
49
50
  reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js,sha256=dnDHW49imtdalZJQqj7J_u7cj2z8Sve7OlhtOO0FbKE,916
@@ -51,7 +52,7 @@ reflex/.templates/web/components/shiki/code.js,sha256=4Es1pxsr-lX4hTQ5mglrwwC6O_
51
52
  reflex/.templates/web/styles/__reflex_style_reset.css,sha256=qbC6JIT643YEsvSQ0D7xBmWE5vXy94JGrKNihRuEjnA,8913
52
53
  reflex/.templates/web/utils/client_side_routing.js,sha256=lRNgEGCLfTejh8W3aCuBdFuko6UI2vetk64j8wLT5Uk,1650
53
54
  reflex/.templates/web/utils/react-theme.js,sha256=4CNLOcjLS5tiRp0TIgKK7trf8bSLWtmeDVhFP6BLe80,2349
54
- reflex/.templates/web/utils/state.js,sha256=fd6ZL57lhvK2ykeuM4-ojtQOl6ym65adMLTUr2pKTIE,35549
55
+ reflex/.templates/web/utils/state.js,sha256=U5ihE4pOVtyTHD4JN8Jz82KVFZaWdwfpNu1wXU3h8Is,35992
55
56
  reflex/.templates/web/utils/helpers/dataeditor.js,sha256=pG6MgsHuStDR7-qPipzfiK32j9bKDBa-4hZ0JSUo4JM,1623
56
57
  reflex/.templates/web/utils/helpers/debounce.js,sha256=xGhtTRtS_xIcaeqnYVvYJNseLgQVk-DW-eFiHJYO9As,528
57
58
  reflex/.templates/web/utils/helpers/paste.js,sha256=ef30HsR83jRzzvZnl8yV79yqFP8TC_u8SlN99cCS_OM,1799
@@ -65,9 +66,9 @@ reflex/compiler/__init__.py,sha256=r8jqmDSFf09iV2lHlNhfc9XrTLjNxfDNwPYlxS4cmHE,2
65
66
  reflex/compiler/compiler.py,sha256=p-8xacPH7kCjE6tpW1AzbfNQJsF0033yXMpu03Exti4,29923
66
67
  reflex/compiler/templates.py,sha256=mQifVgvE7cKyzMFL9F5jxdJb9KFxucWJa7nuOp09ZUo,6002
67
68
  reflex/compiler/utils.py,sha256=v2LGz6WAFOSRpn3H0l215E94R7r7hB3s9vseWrQiXUQ,19045
68
- reflex/components/__init__.py,sha256=55uockd2mEBsaA-fmDO_R4vJewzGPZUk-6UZFNHBSdc,568
69
+ reflex/components/__init__.py,sha256=eWpgWFbSQDj2TpGp6StEbxU7roQgzY7ZM0XIcIc5RE8,588
69
70
  reflex/components/__init__.pyi,sha256=ZqnBIRh1UuLSwAk6wLFmHlexyZ-6SNGo7AGJjWI7aGQ,698
70
- reflex/components/component.py,sha256=yjVYLZ4LGlfj7uV9O3QpM3-f_OKvHK9lHcNOdJI3mpo,97642
71
+ reflex/components/component.py,sha256=0ZouhQgfO5hAbKu3Z4ytM0jvaz70U0Uab9SrIewdUbQ,99431
71
72
  reflex/components/dynamic.py,sha256=AyOjAW5LQZlDShIFJ7d9P2dFTI-1pr1tZR32E2Rhr9s,7422
72
73
  reflex/components/field.py,sha256=j5JZFzNlET3GAIW91m1L31RypXylMAxJNm0-CJbtykM,5745
73
74
  reflex/components/literals.py,sha256=hogLnwTJxFJODIvqihg-GD9kFZVsEBDoYzaRit56Nuk,501
@@ -117,7 +118,7 @@ reflex/components/core/match.py,sha256=syVnQw0OS2jYpqE9AsLH0uODyjmFJVBqrEPviUYf3
117
118
  reflex/components/core/responsive.py,sha256=ACZdtJ4a4F8B3dm1k8h6J2_UJx0Z5LDB7XHQ2ty4wAc,1911
118
119
  reflex/components/core/sticky.py,sha256=2B3TxrwG2Rtp_lv1VkMOIF2bqSiT7qYGbqbiZiMKxKY,3856
119
120
  reflex/components/core/sticky.pyi,sha256=U3VyCnx4hWWORd4yIiIe-mu_IdsPry2iMXrGMw2tLgQ,32906
120
- reflex/components/core/upload.py,sha256=z3oHPpdy9A9csuSlw9IKi61mEZJWmr37wArbDMAy02k,13460
121
+ reflex/components/core/upload.py,sha256=b4-ubt4dznL5LDA7UCKNdWcdCX9aLOX2vNFdv4GlRdg,13544
121
122
  reflex/components/core/upload.pyi,sha256=q88GncKmdgG9s1PQkEs0SWGEdzpxdr31UXmDIYq9qhQ,16385
122
123
  reflex/components/core/layout/__init__.py,sha256=znldZaj_NGt8qCZDG70GMwjMTskcvCf_2N_EjCAHwdc,30
123
124
  reflex/components/datadisplay/__init__.py,sha256=L8pWWKNHWdUD2fbZRoEKjd_8c_hpDdGYO463hwkoIi4,438
@@ -129,7 +130,7 @@ reflex/components/datadisplay/dataeditor.pyi,sha256=qda-3yLFPykvMSrKk-j3EOliVXY8
129
130
  reflex/components/datadisplay/logo.py,sha256=xvg5TRVRSi2IKn7Kg4oYzWcaFMHfXxUaCp0cQmuKSn0,1993
130
131
  reflex/components/datadisplay/shiki_code_block.py,sha256=qCp4jZO3Ek4mR_1Qs4oxLh-GCEo6VBlpb8B9MDDdw4Y,24503
131
132
  reflex/components/datadisplay/shiki_code_block.pyi,sha256=FXGWyG7u3RZQIwhK4M0YAYXRaJ-Pd-Aof_wjrlG7SrY,57323
132
- reflex/components/el/__init__.py,sha256=nfIjf_cyieEmxptKjA6wRjoongswXv4X3n6vDmsdarI,416
133
+ reflex/components/el/__init__.py,sha256=JJHaCMvCh5_nsuyaWRVQ8d75A13lvaq4cpm6HoxUYuM,607
133
134
  reflex/components/el/__init__.pyi,sha256=7P6mNFbjiPyE0vNwUO4B5i-a2cqhjNRSJ7YNL7xKa7E,6194
134
135
  reflex/components/el/element.py,sha256=stGVO6A2waCHq2CGQqR_g798hDKkuSZerwB0tYfZpRE,582
135
136
  reflex/components/el/element.pyi,sha256=z8WHnR-wzs3XGaqJpS6Gj02S_MMljLYp9F3fn6F3DYA,2498
@@ -299,7 +300,7 @@ reflex/components/radix/themes/typography/code.py,sha256=sSshc5GsSOsJPi_SbR7nkAe
299
300
  reflex/components/radix/themes/typography/code.pyi,sha256=0iuE24yCemd2u__-SBcB33RJRWQiBQbCxQJMZmW6RBw,11740
300
301
  reflex/components/radix/themes/typography/heading.py,sha256=YVoQu9cLx5SJSNkliNp5UyVhrwu7vgpIMj1X43jifd0,1575
301
302
  reflex/components/radix/themes/typography/heading.pyi,sha256=bfhGqJJU_MW5WRXc5hZElJmrVnKseBnKLOmefyIB_FE,12558
302
- reflex/components/radix/themes/typography/link.py,sha256=-wnjg_b2xjGpyfppsqy_53Z_r0Kky2p1gxjDZAmbx84,5013
303
+ reflex/components/radix/themes/typography/link.py,sha256=UpjiOLMiJTlra5bY3UAF1iC0faU2F7hpxUP527n-jao,3928
303
304
  reflex/components/radix/themes/typography/link.pyi,sha256=uLdbyTjmc-vlxOnnj9knnP3RsMT_7WkhdiDskKVsiYM,25886
304
305
  reflex/components/radix/themes/typography/text.py,sha256=qnpZuqyabh-VuKGBtlOmu3dfZloBXehjCtEk4AmZQLg,2843
305
306
  reflex/components/radix/themes/typography/text.pyi,sha256=exTgSHtho1PIDMsT46dNyRmXb2kOH7x8eiryfbmHMlA,73279
@@ -310,6 +311,8 @@ reflex/components/react_player/react_player.py,sha256=_yiqTiT73p3Lig0-oVzDxzBxZ7
310
311
  reflex/components/react_player/react_player.pyi,sha256=gAvuhIxYNj-JG9zMHveIIREi0v50f9Jh9fSCUECoAHs,5874
311
312
  reflex/components/react_player/video.py,sha256=WmdxzLtrZNNm9Nals5IpYUGhm45P14hR7I1NCaIW-eg,176
312
313
  reflex/components/react_player/video.pyi,sha256=wdleNz97WblmeMU9qtJV77OH6urmgtiQacddc6H3lmg,5814
314
+ reflex/components/react_router/__init__.py,sha256=ittQ4lHlEsjDneYXODIjz3U0Z8jjtD6xjQuQNDd2MOQ,105
315
+ reflex/components/react_router/dom.py,sha256=1Aw6UfojyO1EmylyNX_ozxqhGUqfjrgWki8zN_d5QqM,2298
313
316
  reflex/components/recharts/__init__.py,sha256=M8Xa0KVrwloklxPHqZCEBF8HaDluK4w5brXnlIrdNHI,2696
314
317
  reflex/components/recharts/__init__.pyi,sha256=MnpXChZwm3DYprV7Ufc-yOptpqKpzRT_sou3oRk11jk,4080
315
318
  reflex/components/recharts/cartesian.py,sha256=o0PYn-EwW1UcGDM5eXBcPnzNGFgzphjis_HeQ9-5Sew,34234
@@ -320,7 +323,7 @@ reflex/components/recharts/general.py,sha256=DuPDfccUWWehc40ji7_JSYHX_AoJyGn_-4y
320
323
  reflex/components/recharts/general.pyi,sha256=-FcVLHn30AR7SzbjETpfKD5mXfOcv3GJO0w9c6MBmWQ,24242
321
324
  reflex/components/recharts/polar.py,sha256=zocHpwWQ0lbg4BTnEBwQ6J9SSJsOYRwZGf9UPzxoNKs,15682
322
325
  reflex/components/recharts/polar.pyi,sha256=6_karFX40GH0SwJK7o_VVHu4pn4o-UKx470cxayWnfg,27717
323
- reflex/components/recharts/recharts.py,sha256=WQsxVm8Aqe5rSbBsulMIMM9yCsNUxcZ8pXqI3ckRoZw,3221
326
+ reflex/components/recharts/recharts.py,sha256=gQ1zk6ickKV86M4rCB7o3Ym4KVH4s4vlfMMNa5IS2Jo,3221
324
327
  reflex/components/recharts/recharts.pyi,sha256=9iHH1FiIGNYwn1zqyU2iqa9n71Q04AVfy9gWKkUirN0,7344
325
328
  reflex/components/sonner/__init__.py,sha256=L_mdRIy7-ccRGSz5VK6J8O-c-e-D1p9xWw29_ErrvGg,68
326
329
  reflex/components/sonner/toast.py,sha256=W3JF5G1pXNu5FjIUDXzmPTiO6vRJ2dNjfSjaqji68do,12392
@@ -338,7 +341,7 @@ reflex/constants/compiler.py,sha256=y72_HbyHGyCVv_Xqr3hB3_Nu1p8NA4gUebBqL8cxY6Y,
338
341
  reflex/constants/config.py,sha256=8OIjiBdZZJrRVHsNBheMwopE9AwBFFzau0SXqXKcrPg,1715
339
342
  reflex/constants/custom_components.py,sha256=joJt4CEt1yKy7wsBH6vYo7_QRW0O_fWXrrTf0VY2q14,1317
340
343
  reflex/constants/event.py,sha256=tgoynWQi2L0_Kqc3XhXo7XXL76A-OKhJGHRrNjm7gFw,2885
341
- reflex/constants/installer.py,sha256=wHosh9W2kOE-u65JihEoSCuvD5qdfYIO_MERNgRKCyo,4106
344
+ reflex/constants/installer.py,sha256=5PeqMLsQRlUTNG2JXXyoukIc2Qpz55rVJTaySiqq_Js,4106
342
345
  reflex/constants/route.py,sha256=UBjqaAOxiUxlDZCSY4O2JJChKvA4MZrhUU0E5rNvKbM,2682
343
346
  reflex/constants/state.py,sha256=uF_7-M9Gid-P3DjAOq4F1ERplyZhiNccowo_jLrdJrg,323
344
347
  reflex/constants/utils.py,sha256=e1ChEvbHfmE_V2UJvCSUhD_qTVAIhEGPpRJSqdSd6PA,780
@@ -348,7 +351,7 @@ reflex/experimental/__init__.py,sha256=P8fe8S2e2gy2HCwHFGQzr3lPMmh7qN5Ii2e8ukoPH
348
351
  reflex/experimental/client_state.py,sha256=1VOe6rYhpOBOZi7-tZwfOnSNPPdX3tsXzlfgNs7aDrg,10020
349
352
  reflex/experimental/hooks.py,sha256=CHYGrAE5t8riltrJmDFgJ4D2Vhmhw-y3B3MSGNlOQow,2366
350
353
  reflex/istate/__init__.py,sha256=afq_pCS5B_REC-Kl3Rbaa538uWi59xNz4INeuENcWnk,2039
351
- reflex/istate/data.py,sha256=igpPEXs_ZJvK7J3JJ1mLiKnLmS5iFJiMLesCaQZpgqs,5798
354
+ reflex/istate/data.py,sha256=oMaBzjpgxnHdU9Pp9tdstxQ7EdkJ8caS5nuu0zoDPLI,7267
352
355
  reflex/istate/dynamic.py,sha256=xOQ9upZVPf6ngqcLQZ9HdAAYmoWwJ8kRFPH34Q5HTiM,91
353
356
  reflex/istate/manager.py,sha256=te5uQN6n-ctOGrf6NbZUVy6BKgWapLlMtCzDaO6RthU,30412
354
357
  reflex/istate/proxy.py,sha256=Q8JrV1m6drVcTNJL9JuN-nKUXclazs96OHl_fhR0UBk,25928
@@ -362,7 +365,7 @@ reflex/plugins/base.py,sha256=fVez3g3OVlu0NZ-ldMMAYFxpj1avyxBoJSNH1wUdJYE,3057
362
365
  reflex/plugins/shared_tailwind.py,sha256=UXUndEEcYBZ02klymw-vSZv01IZVLJG3oSaBHpQ617U,6426
363
366
  reflex/plugins/sitemap.py,sha256=dbbqIWaim4zl1LEU6Su-gyxd0BgM3E6S8gCExDfkTRo,6154
364
367
  reflex/plugins/tailwind_v3.py,sha256=7bXI-zsGoS1pW27-_gskxGaUOQ7NQMPcYkoI5lnmIMA,4819
365
- reflex/plugins/tailwind_v4.py,sha256=JMhP6abjmu8pRVUxHKuGYVfFDGJ3q0CbJ5b7poBhQTk,5239
368
+ reflex/plugins/tailwind_v4.py,sha256=gDzQd9M1F03n6sU0xSKhNZZ3xFO5SJMBmSXL-dPteOM,5239
366
369
  reflex/utils/__init__.py,sha256=y-AHKiRQAhk2oAkvn7W8cRVTZVK625ff8tTwvZtO7S4,24
367
370
  reflex/utils/build.py,sha256=lk8hE69onG95dv-LxRhjtEugct1g-KcWPUDorzqeGIE,7964
368
371
  reflex/utils/codespaces.py,sha256=kEQ-j-jclTukFpXDlYgNp95kYMGDrQmP3VNEoYGZ1u4,3052
@@ -370,17 +373,17 @@ reflex/utils/compat.py,sha256=aSJH_M6iomgHPQ4onQ153xh1MWqPi3HSYDzE68N6gZM,2635
370
373
  reflex/utils/console.py,sha256=OFyXqnyhpAgXCDM7m5lokoUMjvXMohc2ftgrmcf62nc,11500
371
374
  reflex/utils/decorator.py,sha256=DVrlVGljV5OchMs-5_y1CbbqnCWlH6lv-dFko8yHxVY,1738
372
375
  reflex/utils/exceptions.py,sha256=Wwu7Ji2xgq521bJKtU2NgjwhmFfnG8erirEVN2h8S-g,8884
373
- reflex/utils/exec.py,sha256=zQ4WlH80QPjFF4RnGZPOxbCYR8ly9VO0CdJsPZZOQ40,21026
376
+ reflex/utils/exec.py,sha256=LpCwG34VymgJMfwuWpkImU7Bqh0E4i9SDeGbSHZXkoM,21562
374
377
  reflex/utils/export.py,sha256=Z2AHuhkxGQzOi9I90BejQ4qEcD0URr2i-ZU5qTJt7eQ,2562
375
378
  reflex/utils/format.py,sha256=6lgPpYsArWDwGuC_BT-X9g4BnCG14vvH7-oNjrCA5Xc,21119
376
379
  reflex/utils/imports.py,sha256=Ov-lqv-PfsPl3kTEW13r5aDauIfn6TqzEMyv42RKLOA,3761
377
- reflex/utils/lazy_loader.py,sha256=UREKeql_aSusSFMn6qldyol4n8qD3Sm9Wg7LLICjJgQ,4136
380
+ reflex/utils/lazy_loader.py,sha256=BiY9OvmAJDCz10qpuyTYv9duXgMFQa6RXKQmTO9hqKU,4453
378
381
  reflex/utils/misc.py,sha256=zbYIl7mI08is9enr851sj7PnDaNeVVvq5jDmQ4wdlCE,2879
379
382
  reflex/utils/net.py,sha256=HEHA8L5g7L9s0fFG4dTiZzB9PFO_0WRrlbMgpZr_GAQ,4093
380
383
  reflex/utils/path_ops.py,sha256=_RS17IQDNr5vcoLLGZx2-z1E5WP-JgDHvaRAOgqrZiU,8154
381
384
  reflex/utils/prerequisites.py,sha256=L2tCFqqiYqygRbQ0JMMBduMdsMkKJLDvzGKZnvI1Enc,66001
382
- reflex/utils/processes.py,sha256=e5V6-eRSh-r7hR34wW5qvowurhDEW9qv-DTOFJl7kO8,16157
383
- reflex/utils/pyi_generator.py,sha256=Qm_og4yQcJ3-dwMfGJ2QhPxiFng3lftPJne-dMCC8C0,45532
385
+ reflex/utils/processes.py,sha256=eYzdfFhhnGnPxWN5USxdoLaYA8m8UEOOuxwxRRtLMW0,16196
386
+ reflex/utils/pyi_generator.py,sha256=HdmUVs50Bk7MAMFSvpATRhH--_50w-9URMFnjLlwT40,46086
384
387
  reflex/utils/redir.py,sha256=3JG0cRdfIZnFIBHHN32ynD5cfbUZa7gLRxzrxRGGl5I,1751
385
388
  reflex/utils/registry.py,sha256=DEF7csYQ5VnrZhy6ULVfMlceh7XVH0pks96lIyyThuc,1882
386
389
  reflex/utils/serializers.py,sha256=sVLfbWIBKPpmo0CVVxoxXGu0K3R9mYMWgaI02LXZmcM,13952
@@ -395,8 +398,8 @@ reflex/vars/number.py,sha256=tO7pnvFaBsedq1HWT4skytnSqHWMluGEhUbjAUMx8XQ,28190
395
398
  reflex/vars/object.py,sha256=BDmeiwG8v97s_BnR1Egq3NxOKVjv9TfnREB3cz0zZtk,17322
396
399
  reflex/vars/sequence.py,sha256=1kBrqihspyjyQ1XDqFPC8OpVGtZs_EVkOdIKBro5ilA,55249
397
400
  scripts/hatch_build.py,sha256=-4pxcLSFmirmujGpQX9UUxjhIC03tQ_fIQwVbHu9kc0,1861
398
- reflex-0.8.0a7.dist-info/METADATA,sha256=XK-wK7ZpvQvGbKnF_mSKw5ohRMG9FJ3HrXNrfslwGGI,12371
399
- reflex-0.8.0a7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
400
- reflex-0.8.0a7.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
401
- reflex-0.8.0a7.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
402
- reflex-0.8.0a7.dist-info/RECORD,,
401
+ reflex-0.8.1a1.dist-info/METADATA,sha256=oBA8su-NDM7o_4kCnWj_BiHrr3bqA6xYd0lW0EskyWU,12371
402
+ reflex-0.8.1a1.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
403
+ reflex-0.8.1a1.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
404
+ reflex-0.8.1a1.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
405
+ reflex-0.8.1a1.dist-info/RECORD,,