reflex 0.8.6a1__py3-none-any.whl → 0.8.7__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 (37) hide show
  1. reflex/.templates/jinja/web/vite.config.js.jinja2 +4 -1
  2. reflex/.templates/web/app/routes.js +0 -1
  3. reflex/.templates/web/utils/state.js +1 -11
  4. reflex/app.py +15 -23
  5. reflex/components/component.py +6 -4
  6. reflex/components/lucide/icon.py +4 -1
  7. reflex/components/lucide/icon.pyi +4 -1
  8. reflex/components/plotly/plotly.py +9 -9
  9. reflex/components/recharts/recharts.py +2 -2
  10. reflex/components/sonner/toast.py +7 -7
  11. reflex/components/sonner/toast.pyi +8 -8
  12. reflex/config.py +9 -2
  13. reflex/constants/base.py +2 -0
  14. reflex/constants/installer.py +6 -6
  15. reflex/constants/state.py +1 -0
  16. reflex/custom_components/custom_components.py +3 -3
  17. reflex/reflex.py +7 -6
  18. reflex/route.py +4 -0
  19. reflex/state.py +1 -1
  20. reflex/testing.py +3 -5
  21. reflex/utils/build.py +21 -3
  22. reflex/utils/exec.py +11 -11
  23. reflex/utils/frontend_skeleton.py +254 -0
  24. reflex/utils/js_runtimes.py +411 -0
  25. reflex/utils/prerequisites.py +17 -1383
  26. reflex/utils/rename.py +170 -0
  27. reflex/utils/telemetry.py +101 -10
  28. reflex/utils/templates.py +443 -0
  29. reflex/vars/base.py +3 -3
  30. {reflex-0.8.6a1.dist-info → reflex-0.8.7.dist-info}/METADATA +2 -2
  31. {reflex-0.8.6a1.dist-info → reflex-0.8.7.dist-info}/RECORD +34 -33
  32. reflex/.templates/web/utils/client_side_routing.js +0 -45
  33. reflex/components/core/client_side_routing.py +0 -70
  34. reflex/components/core/client_side_routing.pyi +0 -68
  35. {reflex-0.8.6a1.dist-info → reflex-0.8.7.dist-info}/WHEEL +0 -0
  36. {reflex-0.8.6a1.dist-info → reflex-0.8.7.dist-info}/entry_points.txt +0 -0
  37. {reflex-0.8.6a1.dist-info → reflex-0.8.7.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,443 @@
1
+ """This module provides utilities for managing Reflex app templates."""
2
+
3
+ import dataclasses
4
+ import re
5
+ import shutil
6
+ import tempfile
7
+ import zipfile
8
+ from pathlib import Path
9
+ from urllib.parse import urlparse
10
+
11
+ import click
12
+
13
+ from reflex import constants
14
+ from reflex.config import get_config
15
+ from reflex.utils import console, net, path_ops, redir
16
+
17
+
18
+ @dataclasses.dataclass(frozen=True)
19
+ class Template:
20
+ """A template for a Reflex app."""
21
+
22
+ name: str
23
+ description: str
24
+ code_url: str
25
+
26
+
27
+ def create_config(app_name: str):
28
+ """Create a new rxconfig file.
29
+
30
+ Args:
31
+ app_name: The name of the app.
32
+ """
33
+ # Import here to avoid circular imports.
34
+ from reflex.compiler import templates
35
+
36
+ config_name = f"{re.sub(r'[^a-zA-Z]', '', app_name).capitalize()}Config"
37
+
38
+ console.debug(f"Creating {constants.Config.FILE}")
39
+ constants.Config.FILE.write_text(
40
+ templates.RXCONFIG.render(app_name=app_name, config_name=config_name)
41
+ )
42
+
43
+
44
+ def initialize_app_directory(
45
+ app_name: str,
46
+ template_name: str = constants.Templates.DEFAULT,
47
+ template_code_dir_name: str | None = None,
48
+ template_dir: Path | None = None,
49
+ ):
50
+ """Initialize the app directory on reflex init.
51
+
52
+ Args:
53
+ app_name: The name of the app.
54
+ template_name: The name of the template to use.
55
+ template_code_dir_name: The name of the code directory in the template.
56
+ template_dir: The directory of the template source files.
57
+
58
+ Raises:
59
+ Exit: If template_name, template_code_dir_name, template_dir combination is not supported.
60
+ """
61
+ console.log("Initializing the app directory.")
62
+
63
+ # By default, use the blank template from local assets.
64
+ if template_name == constants.Templates.DEFAULT:
65
+ if template_code_dir_name is not None or template_dir is not None:
66
+ console.error(
67
+ f"Only {template_name=} should be provided, got {template_code_dir_name=}, {template_dir=}."
68
+ )
69
+ raise click.exceptions.Exit(1)
70
+ template_code_dir_name = constants.Templates.Dirs.CODE
71
+ template_dir = Path(constants.Templates.Dirs.BASE, "apps", template_name)
72
+ else:
73
+ if template_code_dir_name is None or template_dir is None:
74
+ console.error(
75
+ f"For `{template_name}` template, `template_code_dir_name` and `template_dir` should both be provided."
76
+ )
77
+ raise click.exceptions.Exit(1)
78
+
79
+ console.debug(f"Using {template_name=} {template_dir=} {template_code_dir_name=}.")
80
+
81
+ # Remove __pycache__ dirs in template directory and current directory.
82
+ for pycache_dir in [
83
+ *template_dir.glob("**/__pycache__"),
84
+ *Path.cwd().glob("**/__pycache__"),
85
+ ]:
86
+ shutil.rmtree(pycache_dir, ignore_errors=True)
87
+
88
+ for file in template_dir.iterdir():
89
+ # Copy the file to current directory but keep the name the same.
90
+ path_ops.cp(str(file), file.name)
91
+
92
+ # Rename the template app to the app name.
93
+ path_ops.mv(template_code_dir_name, app_name)
94
+ path_ops.mv(
95
+ Path(app_name) / (template_name + constants.Ext.PY),
96
+ Path(app_name) / (app_name + constants.Ext.PY),
97
+ )
98
+
99
+ # Fix up the imports.
100
+ path_ops.find_replace(
101
+ app_name,
102
+ f"from {template_name}",
103
+ f"from {app_name}",
104
+ )
105
+
106
+
107
+ def initialize_default_app(app_name: str):
108
+ """Initialize the default app.
109
+
110
+ Args:
111
+ app_name: The name of the app.
112
+ """
113
+ create_config(app_name)
114
+ initialize_app_directory(app_name)
115
+
116
+
117
+ def create_config_init_app_from_remote_template(app_name: str, template_url: str):
118
+ """Create new rxconfig and initialize app using a remote template.
119
+
120
+ Args:
121
+ app_name: The name of the app.
122
+ template_url: The path to the template source code as a zip file.
123
+
124
+ Raises:
125
+ Exit: If any download, file operations fail or unexpected zip file format.
126
+
127
+ """
128
+ import httpx
129
+
130
+ # Create a temp directory for the zip download.
131
+ try:
132
+ temp_dir = tempfile.mkdtemp()
133
+ except OSError as ose:
134
+ console.error(f"Failed to create temp directory for download: {ose}")
135
+ raise click.exceptions.Exit(1) from ose
136
+
137
+ # Use httpx GET with redirects to download the zip file.
138
+ zip_file_path: Path = Path(temp_dir) / "template.zip"
139
+ try:
140
+ # Note: following redirects can be risky. We only allow this for reflex built templates at the moment.
141
+ response = net.get(template_url, follow_redirects=True)
142
+ console.debug(f"Server responded download request: {response}")
143
+ response.raise_for_status()
144
+ except httpx.HTTPError as he:
145
+ console.error(f"Failed to download the template: {he}")
146
+ raise click.exceptions.Exit(1) from he
147
+ try:
148
+ zip_file_path.write_bytes(response.content)
149
+ console.debug(f"Downloaded the zip to {zip_file_path}")
150
+ except OSError as ose:
151
+ console.error(f"Unable to write the downloaded zip to disk {ose}")
152
+ raise click.exceptions.Exit(1) from ose
153
+
154
+ # Create a temp directory for the zip extraction.
155
+ try:
156
+ unzip_dir = Path(tempfile.mkdtemp())
157
+ except OSError as ose:
158
+ console.error(f"Failed to create temp directory for extracting zip: {ose}")
159
+ raise click.exceptions.Exit(1) from ose
160
+
161
+ try:
162
+ zipfile.ZipFile(zip_file_path).extractall(path=unzip_dir)
163
+ # The zip file downloaded from github looks like:
164
+ # repo-name-branch/**/*, so we need to remove the top level directory.
165
+ except Exception as uze:
166
+ console.error(f"Failed to unzip the template: {uze}")
167
+ raise click.exceptions.Exit(1) from uze
168
+
169
+ if len(subdirs := list(unzip_dir.iterdir())) != 1:
170
+ console.error(f"Expected one directory in the zip, found {subdirs}")
171
+ raise click.exceptions.Exit(1)
172
+
173
+ template_dir = unzip_dir / subdirs[0]
174
+ console.debug(f"Template folder is located at {template_dir}")
175
+
176
+ # Move the rxconfig file here first.
177
+ path_ops.mv(str(template_dir / constants.Config.FILE), constants.Config.FILE)
178
+ new_config = get_config(reload=True)
179
+
180
+ # Get the template app's name from rxconfig in case it is different than
181
+ # the source code repo name on github.
182
+ template_name = new_config.app_name
183
+
184
+ create_config(app_name)
185
+ initialize_app_directory(
186
+ app_name,
187
+ template_name=template_name,
188
+ template_code_dir_name=template_name,
189
+ template_dir=template_dir,
190
+ )
191
+ req_file = Path("requirements.txt")
192
+ if req_file.exists() and len(req_file.read_text().splitlines()) > 1:
193
+ console.info(
194
+ "Run `pip install -r requirements.txt` to install the required python packages for this template."
195
+ )
196
+ # Clean up the temp directories.
197
+ shutil.rmtree(temp_dir)
198
+ shutil.rmtree(unzip_dir)
199
+
200
+
201
+ def validate_and_create_app_using_remote_template(
202
+ app_name: str, template: str, templates: dict[str, Template]
203
+ ):
204
+ """Validate and create an app using a remote template.
205
+
206
+ Args:
207
+ app_name: The name of the app.
208
+ template: The name of the template.
209
+ templates: The available templates.
210
+
211
+ Raises:
212
+ Exit: If the template is not found.
213
+ """
214
+ # If user selects a template, it needs to exist.
215
+ if template in templates:
216
+ from reflex_cli.v2.utils import hosting
217
+
218
+ authenticated_token = hosting.authenticated_token()
219
+ if not authenticated_token or not authenticated_token[0]:
220
+ console.print(
221
+ f"Please use `reflex login` to access the '{template}' template."
222
+ )
223
+ raise click.exceptions.Exit(3)
224
+
225
+ template_url = templates[template].code_url
226
+ else:
227
+ template_parsed_url = urlparse(template)
228
+ # Check if the template is a github repo.
229
+ if template_parsed_url.hostname == "github.com":
230
+ path = template_parsed_url.path.strip("/").removesuffix(".git")
231
+ template_url = f"https://github.com/{path}/archive/main.zip"
232
+ else:
233
+ console.error(f"Template `{template}` not found or invalid.")
234
+ raise click.exceptions.Exit(1)
235
+
236
+ if template_url is None:
237
+ return
238
+
239
+ create_config_init_app_from_remote_template(
240
+ app_name=app_name, template_url=template_url
241
+ )
242
+
243
+
244
+ def fetch_app_templates(version: str) -> dict[str, Template]:
245
+ """Fetch a dict of templates from the templates repo using github API.
246
+
247
+ Args:
248
+ version: The version of the templates to fetch.
249
+
250
+ Returns:
251
+ The dict of templates.
252
+ """
253
+
254
+ def get_release_by_tag(tag: str) -> dict | None:
255
+ response = net.get(constants.Reflex.RELEASES_URL)
256
+ response.raise_for_status()
257
+ releases = response.json()
258
+ for release in releases:
259
+ if release["tag_name"] == f"v{tag}":
260
+ return release
261
+ return None
262
+
263
+ release = get_release_by_tag(version)
264
+ if release is None:
265
+ console.warn(f"No templates known for version {version}")
266
+ return {}
267
+
268
+ assets = release.get("assets", [])
269
+ asset = next((a for a in assets if a["name"] == "templates.json"), None)
270
+ if asset is None:
271
+ console.warn(f"Templates metadata not found for version {version}")
272
+ return {}
273
+ templates_url = asset["browser_download_url"]
274
+
275
+ templates_data = net.get(templates_url, follow_redirects=True).json()["templates"]
276
+
277
+ for template in templates_data:
278
+ if template["name"] == "blank":
279
+ template["code_url"] = ""
280
+ continue
281
+ template["code_url"] = next(
282
+ (
283
+ a["browser_download_url"]
284
+ for a in assets
285
+ if a["name"] == f"{template['name']}.zip"
286
+ ),
287
+ None,
288
+ )
289
+
290
+ filtered_templates = {}
291
+ for tp in templates_data:
292
+ if tp["hidden"] or tp["code_url"] is None:
293
+ continue
294
+ known_fields = {f.name for f in dataclasses.fields(Template)}
295
+ filtered_templates[tp["name"]] = Template(
296
+ **{k: v for k, v in tp.items() if k in known_fields}
297
+ )
298
+ return filtered_templates
299
+
300
+
301
+ def fetch_remote_templates(
302
+ template: str,
303
+ ) -> tuple[str, dict[str, Template]]:
304
+ """Fetch the available remote templates.
305
+
306
+ Args:
307
+ template: The name of the template.
308
+
309
+ Returns:
310
+ The selected template and the available templates.
311
+ """
312
+ available_templates = {}
313
+
314
+ try:
315
+ # Get the available templates
316
+ available_templates = fetch_app_templates(constants.Reflex.VERSION)
317
+ except Exception as e:
318
+ console.warn("Failed to fetch templates. Falling back to default template.")
319
+ console.debug(f"Error while fetching templates: {e}")
320
+ template = constants.Templates.DEFAULT
321
+
322
+ return template, available_templates
323
+
324
+
325
+ def prompt_for_template_options(templates: list[Template]) -> str:
326
+ """Prompt the user to specify a template.
327
+
328
+ Args:
329
+ templates: The templates to choose from.
330
+
331
+ Returns:
332
+ The template name the user selects.
333
+
334
+ Raises:
335
+ Exit: If the user does not select a template.
336
+ """
337
+ # Show the user the URLs of each template to preview.
338
+ console.print("\nGet started with a template:")
339
+
340
+ # Prompt the user to select a template.
341
+ for index, template in enumerate(templates):
342
+ console.print(f"({index}) {template.description}")
343
+
344
+ template = console.ask(
345
+ "Which template would you like to use?",
346
+ choices=[str(i) for i in range(len(templates))],
347
+ show_choices=False,
348
+ default="0",
349
+ )
350
+
351
+ if not template:
352
+ console.error("No template selected.")
353
+ raise click.exceptions.Exit(1)
354
+
355
+ try:
356
+ template_index = int(template)
357
+ except ValueError:
358
+ console.error("Invalid template selected.")
359
+ raise click.exceptions.Exit(1) from None
360
+
361
+ if template_index < 0 or template_index >= len(templates):
362
+ console.error("Invalid template selected.")
363
+ raise click.exceptions.Exit(1)
364
+
365
+ # Return the template.
366
+ return templates[template_index].name
367
+
368
+
369
+ def initialize_app(app_name: str, template: str | None = None) -> str | None:
370
+ """Initialize the app either from a remote template or a blank app. If the config file exists, it is considered as reinit.
371
+
372
+ Args:
373
+ app_name: The name of the app.
374
+ template: The name of the template to use.
375
+
376
+ Returns:
377
+ The name of the template.
378
+
379
+ Raises:
380
+ Exit: If the template is not valid or unspecified.
381
+ """
382
+ # Local imports to avoid circular imports.
383
+ from reflex.utils import telemetry
384
+
385
+ # Check if the app is already initialized.
386
+ if constants.Config.FILE.exists():
387
+ telemetry.send("reinit")
388
+ return None
389
+
390
+ templates: dict[str, Template] = {}
391
+
392
+ # Don't fetch app templates if the user directly asked for DEFAULT.
393
+ if template is not None and (template not in (constants.Templates.DEFAULT,)):
394
+ template, templates = fetch_remote_templates(template)
395
+
396
+ if template is None:
397
+ template = prompt_for_template_options(get_init_cli_prompt_options())
398
+
399
+ if template == constants.Templates.CHOOSE_TEMPLATES:
400
+ redir.reflex_templates()
401
+ raise click.exceptions.Exit(0)
402
+
403
+ if template == constants.Templates.AI:
404
+ redir.reflex_build_redirect()
405
+ raise click.exceptions.Exit(0)
406
+
407
+ # If the blank template is selected, create a blank app.
408
+ if template == constants.Templates.DEFAULT:
409
+ # Default app creation behavior: a blank app.
410
+ initialize_default_app(app_name)
411
+ else:
412
+ validate_and_create_app_using_remote_template(
413
+ app_name=app_name, template=template, templates=templates
414
+ )
415
+
416
+ telemetry.send("init", template=template)
417
+
418
+ return template
419
+
420
+
421
+ def get_init_cli_prompt_options() -> list[Template]:
422
+ """Get the CLI options for initializing a Reflex app.
423
+
424
+ Returns:
425
+ The CLI options.
426
+ """
427
+ return [
428
+ Template(
429
+ name=constants.Templates.DEFAULT,
430
+ description="A blank Reflex app.",
431
+ code_url="",
432
+ ),
433
+ Template(
434
+ name=constants.Templates.AI,
435
+ description="[bold]Try our free AI builder.",
436
+ code_url="",
437
+ ),
438
+ Template(
439
+ name=constants.Templates.CHOOSE_TEMPLATES,
440
+ description="Premade templates built by the Reflex team.",
441
+ code_url="",
442
+ ),
443
+ ]
reflex/vars/base.py CHANGED
@@ -717,7 +717,7 @@ class Var(Generic[VAR_TYPE], metaclass=MetaclassVar):
717
717
  return f"{constants.REFLEX_VAR_OPENING_TAG}{hashed_var}{constants.REFLEX_VAR_CLOSING_TAG}{self._js_expr}"
718
718
 
719
719
  @overload
720
- def to(self, output: type[str]) -> StringVar: ...
720
+ def to(self, output: type[str]) -> StringVar: ... # pyright: ignore[reportOverlappingOverload]
721
721
 
722
722
  @overload
723
723
  def to(self, output: type[bool]) -> BooleanVar: ...
@@ -734,8 +734,8 @@ class Var(Generic[VAR_TYPE], metaclass=MetaclassVar):
734
734
  @overload
735
735
  def to(
736
736
  self,
737
- output: type[list] | type[tuple] | type[set],
738
- ) -> ArrayVar: ...
737
+ output: type[SEQUENCE_TYPE],
738
+ ) -> ArrayVar[SEQUENCE_TYPE]: ...
739
739
 
740
740
  @overload
741
741
  def to(
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: reflex
3
- Version: 0.8.6a1
3
+ Version: 0.8.7
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
@@ -30,7 +30,7 @@ Requires-Dist: pydantic<3.0,>=1.10.21
30
30
  Requires-Dist: python-multipart<1.0,>=0.0.20
31
31
  Requires-Dist: python-socketio<6.0,>=5.12.0
32
32
  Requires-Dist: redis<7.0,>=5.2.1
33
- Requires-Dist: reflex-hosting-cli>=0.1.53
33
+ Requires-Dist: reflex-hosting-cli>=0.1.54
34
34
  Requires-Dist: rich<15,>=13
35
35
  Requires-Dist: sqlmodel<0.1,>=0.0.24
36
36
  Requires-Dist: starlette>=0.47.0
@@ -2,20 +2,20 @@ reflex/__init__.py,sha256=_1PVYjDeA6_JyfXvL6OuKjjO6AX2oMiNcAq8AEHf6xw,10161
2
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=g5bpc29jekySAvA0a3advQ1dUM-y4cKAM8vMB7oNAsM,77731
5
+ reflex/app.py,sha256=SCsHNd0PxGES_B16vd5NFkZpHux5Q8BNkwhNgsmeuEk,77324
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=iL5hbdel04GzTtNiPwoNQ6xACJO1SkuvwzAyodDv028,19875
8
+ reflex/config.py,sha256=JhCChJ3WkOvC7sFIcKZ7T_JBobC0XiBlCPTlai6-fyU,20227
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
12
12
  reflex/page.py,sha256=ssCbMVFuIy60vH-YhJUzN0OxzUwXFCCD3ej56dVjp3g,3525
13
13
  reflex/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- reflex/reflex.py,sha256=BkHnxKp3uZEllLWBbH8Y_EfSu80L4_0FEbSbZkg7JyQ,22506
15
- reflex/route.py,sha256=ZRlXl1HeKWM3W-yFCnRFIA_6I3W9JBqe2CKzCpWX7Vg,7699
16
- reflex/state.py,sha256=V84fFvC8yzs0hoqgAgF1BMK81yWm6UZMGUxSJBQPf6o,93061
14
+ reflex/reflex.py,sha256=KVlNh8nQGzuaYnpUtQ1D7Rcuqzp1TeKernlDucTXaQE,22578
15
+ reflex/route.py,sha256=TnS4m6Hm-b3LfGFpm37iAMEd-_JISAouPW5FqUxTAfU,7858
16
+ reflex/state.py,sha256=95dLzwoGaq6aC0dsSKIexaBUySnbeyRbfx2cTVixmx0,93059
17
17
  reflex/style.py,sha256=JxbXXA4MTnXrk0XHEoMBoNC7J-M2oL5Hl3W_QmXvmBg,13222
18
- reflex/testing.py,sha256=MgYxW3MLjd8TX5Lv7EWW-go3Fu_gL07i9HpxPJpBUDw,39951
18
+ reflex/testing.py,sha256=kR-imGVnWCp6xiryuZcJJIfogRg2tcNT4tw5mt0T3sY,39901
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,7 +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
+ reflex/.templates/jinja/web/vite.config.js.jinja2,sha256=pSrDq10Y4oSSO55CCsxsT2I0OUIoqBnEhxjG6ElFVN4,1715
30
30
  reflex/.templates/jinja/web/pages/_app.js.jinja2,sha256=tG-SRR7DCP3SxLoUl_5rIRmL1uBDVnkcenSUxy459hY,1575
31
31
  reflex/.templates/jinja/web/pages/_document.js.jinja2,sha256=v_r79GPGKnw1g9Bg4lK9o_ow5AzBnvKdz0nv3OgJyzU,166
32
32
  reflex/.templates/jinja/web/pages/base_page.js.jinja2,sha256=nteivFZgOhgwxlPvejgaoxKTPGvDRb7_JAXhsZDZeLM,361
@@ -46,13 +46,12 @@ reflex/.templates/web/postcss.config.js,sha256=6Hf540Ny078yfmJ_-tniZtmgHW6euyEyx
46
46
  reflex/.templates/web/react-router.config.js,sha256=5K1FBryYdPusn1nE513GwB5_5UdPzoyH8ZMANUbpodQ,84
47
47
  reflex/.templates/web/vite-plugin-safari-cachebust.js,sha256=FcyppYYBxUlZtQ-D_iyVaQIT6TBVisBH7DMzWxYm-zA,5300
48
48
  reflex/.templates/web/app/entry.client.js,sha256=2Jv-5SQWHhHmA07BP50f1ew1V-LOsX5VoLtSInnFDj8,264
49
- reflex/.templates/web/app/routes.js,sha256=OPPW82B079c4FGq_p5C5OBrkVnTNRFhgG3--WKlJSy0,312
49
+ reflex/.templates/web/app/routes.js,sha256=-16AwZFzrVSR7DBPYZbGx3lBA5hBFJ_XF2Y-6ilharo,254
50
50
  reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js,sha256=dnDHW49imtdalZJQqj7J_u7cj2z8Sve7OlhtOO0FbKE,916
51
51
  reflex/.templates/web/components/shiki/code.js,sha256=4Es1pxsr-lX4hTQ5mglrwwC6O_SI-z-O60k03z8VFzQ,1144
52
52
  reflex/.templates/web/styles/__reflex_style_reset.css,sha256=qbC6JIT643YEsvSQ0D7xBmWE5vXy94JGrKNihRuEjnA,8913
53
- reflex/.templates/web/utils/client_side_routing.js,sha256=lRNgEGCLfTejh8W3aCuBdFuko6UI2vetk64j8wLT5Uk,1650
54
53
  reflex/.templates/web/utils/react-theme.js,sha256=Aa-RND3ooGCXW6Zavzitc-v0ciKlcQDTFlDtE4mPkFI,2713
55
- reflex/.templates/web/utils/state.js,sha256=-RbOSjeggpR4VYffLYN59nTCEw8d9KHEqN_O_Lp33aM,36338
54
+ reflex/.templates/web/utils/state.js,sha256=hyd2XCme0vfTpW0FQHJmzlk7quXw8JrO3c3YkHhA6h4,36030
56
55
  reflex/.templates/web/utils/helpers/dataeditor.js,sha256=pG6MgsHuStDR7-qPipzfiK32j9bKDBa-4hZ0JSUo4JM,1623
57
56
  reflex/.templates/web/utils/helpers/debounce.js,sha256=xGhtTRtS_xIcaeqnYVvYJNseLgQVk-DW-eFiHJYO9As,528
58
57
  reflex/.templates/web/utils/helpers/paste.js,sha256=ef30HsR83jRzzvZnl8yV79yqFP8TC_u8SlN99cCS_OM,1799
@@ -68,7 +67,7 @@ reflex/compiler/templates.py,sha256=eWBtJBrriUyb7j4yRCi2X8MVauIVAfz0Ip6NaXLUhIM,
68
67
  reflex/compiler/utils.py,sha256=587KMP1BDYYigAY6looM9L69Eoq3PEOxCB8k7r9BW5A,18922
69
68
  reflex/components/__init__.py,sha256=eWpgWFbSQDj2TpGp6StEbxU7roQgzY7ZM0XIcIc5RE8,588
70
69
  reflex/components/__init__.pyi,sha256=7VFHtJGIjvGtD3IiPk848IPWYSCcPRT1EyPGljLhYlU,736
71
- reflex/components/component.py,sha256=DyeMdHSPkhYUXn18QcVZneJZKV8qzAlPMR9M8kY7_K8,98462
70
+ reflex/components/component.py,sha256=2eZlhNMh_unz-3wMJ2ZEuDT0CjKKOh5KUocbDgLb0t0,98541
72
71
  reflex/components/dynamic.py,sha256=AyOjAW5LQZlDShIFJ7d9P2dFTI-1pr1tZR32E2Rhr9s,7422
73
72
  reflex/components/field.py,sha256=j5JZFzNlET3GAIW91m1L31RypXylMAxJNm0-CJbtykM,5745
74
73
  reflex/components/literals.py,sha256=hogLnwTJxFJODIvqihg-GD9kFZVsEBDoYzaRit56Nuk,501
@@ -101,8 +100,6 @@ reflex/components/core/auto_scroll.pyi,sha256=0R5NvVJ00X42-dSTX23zOGPbwGWGt1lQ_4
101
100
  reflex/components/core/banner.py,sha256=JEutUBT1UfpgnaDJthE2BoSzpIEE-cSHoQZlEvQb0dw,18471
102
101
  reflex/components/core/banner.pyi,sha256=F7LPVH4wkdsBnTaXG3NW3NkULYQSm5wAmvHerEOFdjQ,25480
103
102
  reflex/components/core/breakpoints.py,sha256=7nNG9Ewjvbk1hB0VoFiQxlDR333Mq2y977CNWjslAWA,2692
104
- reflex/components/core/client_side_routing.py,sha256=D5LWLTVW8WEuV17nNe14RKmuDhJegam0eYvOoHxh2Ts,1893
105
- reflex/components/core/client_side_routing.pyi,sha256=zY06iJEGGaqGE59If4VEnehg6-mvRlnxEOPqIWbUQuY,2616
106
103
  reflex/components/core/clipboard.py,sha256=lrM4KpbioSqBclhvtrgawgeg9Vq2dKsv40xP4bUgYmA,3339
107
104
  reflex/components/core/clipboard.pyi,sha256=Wt84ce1rd5vje-KuzAIkn_0riAD91_VtnZcRiRBsFLs,3230
108
105
  reflex/components/core/colors.py,sha256=gkT5o5OqI_BR5fGMcCmBUpaz99XRNol9zAis46WktI4,1564
@@ -162,8 +159,8 @@ reflex/components/gridjs/__init__.py,sha256=xJwDm1AZ70L5-t9LLqZwGUtDpijbf1KuMYDT
162
159
  reflex/components/gridjs/datatable.py,sha256=7JKrRw1zkpFB0_wwoaIhrVrldsm7-dyi3PASgqLq8Hc,4224
163
160
  reflex/components/gridjs/datatable.pyi,sha256=kFgv82vCgfdWZaUq4bZ73G8X3mkw6ecvSRkZ9G9-28E,5185
164
161
  reflex/components/lucide/__init__.py,sha256=EggTK2MuQKQeOBLKW-mF0VaDK9zdWBImu1HO2dvHZbE,73
165
- reflex/components/lucide/icon.py,sha256=aqjX1dq6-FxiMvvOF_002Bbfmz2fq5MnggbEQ5wn30w,35145
166
- reflex/components/lucide/icon.pyi,sha256=xxhLg-RZgUw0-cDT9F4898aG12EsoKZXrP3KAhkrI60,37939
162
+ reflex/components/lucide/icon.py,sha256=5rGGbkfNTftuDPllEsBQ8MCwFEjddG9pnsogKjFjp6w,35202
163
+ reflex/components/lucide/icon.pyi,sha256=F3gzfvQuyI1KJWnL2O5uAtwZeNNv0F60ARqWZVZr0uM,37996
167
164
  reflex/components/markdown/__init__.py,sha256=Dfl1At5uYoY7H4ufZU_RY2KOGQDLtj75dsZ2BTqqAns,87
168
165
  reflex/components/markdown/markdown.py,sha256=scDHnmn2n4KHXS2Imqa1jw1wTk1ewCB2MojC9NgKGHQ,15503
169
166
  reflex/components/markdown/markdown.pyi,sha256=oOlXZItHB0TPWsFz1Qjvr3KzG8sssthBp40UO_KkRIA,4322
@@ -171,7 +168,7 @@ reflex/components/moment/__init__.py,sha256=jGnZgRBivYJQPIcFgtLaXFteCeIG3gGH5ACX
171
168
  reflex/components/moment/moment.py,sha256=fhhzrun9USb8J30btpyyDD3JuXF_N7EL5Dou3x7NQYw,4080
172
169
  reflex/components/moment/moment.pyi,sha256=4YGqoKDFPV_Ve7G_UoN85UigtCExqp0qXR55Jb8WgfY,6013
173
170
  reflex/components/plotly/__init__.py,sha256=6B_woBJhkrVA9O_AbOTbsA_SxWsqjicYHmLA9FLjGfU,650
174
- reflex/components/plotly/plotly.py,sha256=c290oBd8Z5izaro-N8l8ymdcgxr5h3RlKhstDSAEjKM,15172
171
+ reflex/components/plotly/plotly.py,sha256=_HIMVHz2K4X9LO2PqdCiYlexG8cjbzSnbnp_gCqwwjQ,15172
175
172
  reflex/components/plotly/plotly.pyi,sha256=5Nhph2PL9eIb-Xd6CUZHQf79P-tOazy1alwRQl7CKWw,46821
176
173
  reflex/components/radix/__init__.py,sha256=fRsLvIO3MrTtPOXtmnxYDB9phvzlcbyB_utgpafYMho,474
177
174
  reflex/components/radix/__init__.pyi,sha256=ke_dGrpFMNHd3MgQ9qiStSQDlGcJ39KVSrpIxayBU3c,3927
@@ -322,11 +319,11 @@ reflex/components/recharts/general.py,sha256=DuPDfccUWWehc40ji7_JSYHX_AoJyGn_-4y
322
319
  reflex/components/recharts/general.pyi,sha256=e77vGL8lo-t1jI79h0O12qSK5e9wbjerPslCxQQgSBw,23462
323
320
  reflex/components/recharts/polar.py,sha256=zocHpwWQ0lbg4BTnEBwQ6J9SSJsOYRwZGf9UPzxoNKs,15682
324
321
  reflex/components/recharts/polar.pyi,sha256=8ShEcGK9KJyu0FN6KPys1kgAYrzOZ6wtiRuytHJ--38,26937
325
- reflex/components/recharts/recharts.py,sha256=CrkZ1Ez6QhDpDvlL0TkeT_qtBg0keLaGS9L2qfgr8zI,3221
322
+ reflex/components/recharts/recharts.py,sha256=pYJxI8UQBbF1TS0VcTJoFFGvJtZarZTSVaRjwkeqjoc,3221
326
323
  reflex/components/recharts/recharts.pyi,sha256=9j8cVSMqyBkkOBBrx9pzDpP1clnbM9kD0TTViTUGDYc,7084
327
324
  reflex/components/sonner/__init__.py,sha256=L_mdRIy7-ccRGSz5VK6J8O-c-e-D1p9xWw29_ErrvGg,68
328
- reflex/components/sonner/toast.py,sha256=rzSOAhb7tuT7IFOu7zSttya2GPjUNBahjQ_DEO-uocs,12392
329
- reflex/components/sonner/toast.pyi,sha256=jfNzgYUThyhz2lOjat61C8ObKawY16Bq_T3KLZ0aThY,7658
325
+ reflex/components/sonner/toast.py,sha256=sJ9E60VaMBwoev4aBrKr42ygN7e0jajNTooa5o5wYPQ,12505
326
+ reflex/components/sonner/toast.pyi,sha256=cj0zlkcFVmJ3CrHe2XIsF0MeBw61Bn-hrGkzHTFz8Og,7782
330
327
  reflex/components/tags/__init__.py,sha256=Pc0JU-Tv_W7KCsydXgbKmu7w2VtHNkI6Cx2hTkNhW_Q,152
331
328
  reflex/components/tags/cond_tag.py,sha256=kqN3FoDzr5fZUng1KDIvGmdQCLd7Tni3TQ_iaEz8F-w,641
332
329
  reflex/components/tags/iter_tag.py,sha256=6w0pLBJ4ZJq1B3mz9kV3b8fULCGhzqpMDHWPbHphFxA,4421
@@ -334,18 +331,18 @@ reflex/components/tags/match_tag.py,sha256=cMSa_hbuEV8uFg0iCwLhRJ0J6-oU5rKQf9Z2-
334
331
  reflex/components/tags/tag.py,sha256=AbB8MtmmMUAvlMtQe7XLL-afsb1rckzo4R1MJ1RsNQs,3865
335
332
  reflex/components/tags/tagless.py,sha256=qO7Gm4V0ITDyymHkyltfz53155ZBt-W_WIPDYy93ca0,587
336
333
  reflex/constants/__init__.py,sha256=q2Jf-LBbNcGrOmx5M7QotIAYW_t3m02TsmmdtJ5_IhM,2190
337
- reflex/constants/base.py,sha256=_ozsoSM6g0oILaqC_mjv0SaPu_DjQBbUnk62qfYures,7577
334
+ reflex/constants/base.py,sha256=ei3YERoOFdS3yrCYbr7GDcPNlFN9YkVIZRBcj-MWFYw,7619
338
335
  reflex/constants/colors.py,sha256=n-FN7stNrvk5rCN0TAvE28dqwUeQZHue-b5q1CO0EyQ,2048
339
336
  reflex/constants/compiler.py,sha256=bzmC1OW6kWr06rV1Gwoa2AtQ4yPoGhEzeoqpiNY0jwU,5703
340
337
  reflex/constants/config.py,sha256=8OIjiBdZZJrRVHsNBheMwopE9AwBFFzau0SXqXKcrPg,1715
341
338
  reflex/constants/custom_components.py,sha256=joJt4CEt1yKy7wsBH6vYo7_QRW0O_fWXrrTf0VY2q14,1317
342
339
  reflex/constants/event.py,sha256=tgoynWQi2L0_Kqc3XhXo7XXL76A-OKhJGHRrNjm7gFw,2885
343
- reflex/constants/installer.py,sha256=UqviYL10RH5LFyYbqCWy-8rKJE3HI5VGD8NoPDfq6TU,4167
340
+ reflex/constants/installer.py,sha256=VmJfwEUfgr9lcIVNlYoUXFHDYRfwrBtUKm6dSu4GOHg,4191
344
341
  reflex/constants/route.py,sha256=UBjqaAOxiUxlDZCSY4O2JJChKvA4MZrhUU0E5rNvKbM,2682
345
- reflex/constants/state.py,sha256=uF_7-M9Gid-P3DjAOq4F1ERplyZhiNccowo_jLrdJrg,323
342
+ reflex/constants/state.py,sha256=dkoVvO9JcJyHovHJlGsZx-dDxpM80OvS4cJEm_TUOiM,349
346
343
  reflex/constants/utils.py,sha256=e1ChEvbHfmE_V2UJvCSUhD_qTVAIhEGPpRJSqdSd6PA,780
347
344
  reflex/custom_components/__init__.py,sha256=R4zsvOi4dfPmHc18KEphohXnQFBPnUCb50cMR5hSLDE,36
348
- reflex/custom_components/custom_components.py,sha256=IPW7Kbtyr8vjk1FzXRsCyCaLJTlaLQMYjOxgf1WK_jg,20210
345
+ reflex/custom_components/custom_components.py,sha256=ho4C_Yf_tbf7iZaiqtk7GFllMSzoHHDXBxhKzapwZzo,20218
349
346
  reflex/experimental/__init__.py,sha256=P8fe8S2e2gy2HCwHFGQzr3lPMmh7qN5Ii2e8ukoPHuQ,1664
350
347
  reflex/experimental/client_state.py,sha256=1VOe6rYhpOBOZi7-tZwfOnSNPPdX3tsXzlfgNs7aDrg,10020
351
348
  reflex/experimental/hooks.py,sha256=CHYGrAE5t8riltrJmDFgJ4D2Vhmhw-y3B3MSGNlOQow,2366
@@ -367,32 +364,36 @@ reflex/plugins/sitemap.py,sha256=Jj47uSMnkxndl7awkl48EhlQylBfY00WuMBNyTBcZHA,618
367
364
  reflex/plugins/tailwind_v3.py,sha256=7bXI-zsGoS1pW27-_gskxGaUOQ7NQMPcYkoI5lnmIMA,4819
368
365
  reflex/plugins/tailwind_v4.py,sha256=gDzQd9M1F03n6sU0xSKhNZZ3xFO5SJMBmSXL-dPteOM,5239
369
366
  reflex/utils/__init__.py,sha256=y-AHKiRQAhk2oAkvn7W8cRVTZVK625ff8tTwvZtO7S4,24
370
- reflex/utils/build.py,sha256=lk8hE69onG95dv-LxRhjtEugct1g-KcWPUDorzqeGIE,7964
367
+ reflex/utils/build.py,sha256=GLT2ycqgAe1cw__MFbfdlYrkzcTnY1oJ8cAv80jEcnQ,8641
371
368
  reflex/utils/codespaces.py,sha256=kEQ-j-jclTukFpXDlYgNp95kYMGDrQmP3VNEoYGZ1u4,3052
372
369
  reflex/utils/compat.py,sha256=aSJH_M6iomgHPQ4onQ153xh1MWqPi3HSYDzE68N6gZM,2635
373
370
  reflex/utils/console.py,sha256=QIOgyElaxSVM1Bbvz0zx77-MqkDZkfpu1d6l26VRkQ0,11580
374
371
  reflex/utils/decorator.py,sha256=QUZntENupeW5FA5mNRTx0I1GzGKFQXhMjVg24_IIM5o,3957
375
372
  reflex/utils/exceptions.py,sha256=Wwu7Ji2xgq521bJKtU2NgjwhmFfnG8erirEVN2h8S-g,8884
376
- reflex/utils/exec.py,sha256=KQ5tS5vz3wuu9zDGPR6clSE0IoY_vcIbJGCB5bqiDJM,21987
373
+ reflex/utils/exec.py,sha256=o0u81B6pHv5Yt982V1vFYEJDxgM-HxmM5KRUBbTYmZI,21965
377
374
  reflex/utils/export.py,sha256=Z2AHuhkxGQzOi9I90BejQ4qEcD0URr2i-ZU5qTJt7eQ,2562
378
375
  reflex/utils/format.py,sha256=FZe5NA0U3K0n0k7r8RIGcx-eHpN7sf8eQX9w1C8_uR8,21120
376
+ reflex/utils/frontend_skeleton.py,sha256=oPF7JUnRmBANbk3rBYPSCjKHvlgdN90kotVnNqHTfUI,8604
379
377
  reflex/utils/imports.py,sha256=Ov-lqv-PfsPl3kTEW13r5aDauIfn6TqzEMyv42RKLOA,3761
378
+ reflex/utils/js_runtimes.py,sha256=ipVrZCajiRcjow-nQeUuxPS_c6F_NpfvMtITOesbPjU,13153
380
379
  reflex/utils/lazy_loader.py,sha256=BiY9OvmAJDCz10qpuyTYv9duXgMFQa6RXKQmTO9hqKU,4453
381
380
  reflex/utils/misc.py,sha256=folEweZVCrhHNkkqut9KqQdTJ80HxwL_gI41m40FnNM,4592
382
381
  reflex/utils/monitoring.py,sha256=87fr9j6Y9Bvz2uF4tBxuX6CaU054h1UPx0ijcnyP_kw,5250
383
382
  reflex/utils/net.py,sha256=q3h5pNbAlFiqy8U15S9DTOvzy_OnenVVug5ROBTGRTA,4267
384
383
  reflex/utils/path_ops.py,sha256=_RS17IQDNr5vcoLLGZx2-z1E5WP-JgDHvaRAOgqrZiU,8154
385
- reflex/utils/prerequisites.py,sha256=JUv4VGPDJmZrJM1U5Ot87ZzPwd4sG-3AbsyuTt5o7K0,63118
384
+ reflex/utils/prerequisites.py,sha256=LEQCGg_PpvrNOBiOMZUZRrqWXYAW1Zkp56tHAPrpL9s,18643
386
385
  reflex/utils/processes.py,sha256=t-ufWwu9RDsSMXCSsmjS2TILP5s7-AY94Rgx2O2gHMw,18178
387
386
  reflex/utils/pyi_generator.py,sha256=HdmUVs50Bk7MAMFSvpATRhH--_50w-9URMFnjLlwT40,46086
388
387
  reflex/utils/redir.py,sha256=E6lJ6UYGQs_uCyQAKHT_dDMplo5IRZ9JarWfvgGAgGo,1731
389
388
  reflex/utils/registry.py,sha256=omKh5rrsybDuuKmh4K88lwdwwcpGsu3Vc4pCko_djKY,2239
389
+ reflex/utils/rename.py,sha256=qdE4SXHOaNs-TDGrnJz-h_nvLWA1C5osVrWb4wLSfyI,5262
390
390
  reflex/utils/serializers.py,sha256=sVLfbWIBKPpmo0CVVxoxXGu0K3R9mYMWgaI02LXZmcM,13952
391
- reflex/utils/telemetry.py,sha256=XpPbFmlFdEh5uJl5vXoLyCCFv1choJN8EMko0MujigQ,7452
391
+ reflex/utils/telemetry.py,sha256=Ps0Q98dD5RZUlt5skZx2Iopc-hXv5DUdomHZw4u3QcI,10696
392
+ reflex/utils/templates.py,sha256=ytAkuBadwlAxL3TA8AeqCIpdll6nENVgyC_jKbWvovY,14376
392
393
  reflex/utils/token_manager.py,sha256=o_HGbqT9WfYRmek2iY9nem4vDZMz8Q4Dra-eW1lKmuA,6999
393
394
  reflex/utils/types.py,sha256=jFHfd2-yHWV61L7YP2gc9Zj2ZLwdthHOOfRIc_PAWH0,38390
394
395
  reflex/vars/__init__.py,sha256=85eXMt32bFoKtMdH3KxYRMD8mtnKyYiQcThPxJLoW1k,1359
395
- reflex/vars/base.py,sha256=IGCU5iwZSsVMPVQqODEjmHJrskqfpfMIQ2yzcVFMoSQ,112940
396
+ reflex/vars/base.py,sha256=8tRs__Pp0qvtlV3b-_-u_9dhwbJ2y0IUoHpnpbWexhQ,112984
396
397
  reflex/vars/datetime.py,sha256=F2Jv_bfydipFSkIQ1F6x5MnSgFEyES9Vq5RG_uGH81E,5118
397
398
  reflex/vars/dep_tracking.py,sha256=LfDGgAGlqfC0DeiVcitRBcA1uCe1C3fNRARRekLgCz4,13738
398
399
  reflex/vars/function.py,sha256=0i-VkxHkDJmZtfQUwUfaF0rlS6WM8azjwQ8k7rEOkyk,13944
@@ -400,8 +401,8 @@ reflex/vars/number.py,sha256=tO7pnvFaBsedq1HWT4skytnSqHWMluGEhUbjAUMx8XQ,28190
400
401
  reflex/vars/object.py,sha256=BDmeiwG8v97s_BnR1Egq3NxOKVjv9TfnREB3cz0zZtk,17322
401
402
  reflex/vars/sequence.py,sha256=1kBrqihspyjyQ1XDqFPC8OpVGtZs_EVkOdIKBro5ilA,55249
402
403
  scripts/hatch_build.py,sha256=-4pxcLSFmirmujGpQX9UUxjhIC03tQ_fIQwVbHu9kc0,1861
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,,
404
+ reflex-0.8.7.dist-info/METADATA,sha256=nTin5FphJmxeB1EMtS8Tqa-wOJLeAKdGgYfVvoL4F7M,12539
405
+ reflex-0.8.7.dist-info/WHEEL,sha256=qtCwoSJWgHk21S1Kb4ihdzI2rlJ1ZKaIurTj_ngOhyQ,87
406
+ reflex-0.8.7.dist-info/entry_points.txt,sha256=Rxt4dXc7MLBNt5CSHTehVPuSe9Xqow4HLX55nD9tQQ0,45
407
+ reflex-0.8.7.dist-info/licenses/LICENSE,sha256=dw3zLrp9f5ObD7kqS32vWfhcImfO52PMmRqvtxq_YEE,11358
408
+ reflex-0.8.7.dist-info/RECORD,,