reactpy 1.0.0__tar.gz → 1.0.2__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- reactpy-1.0.2/.gitignore +4 -0
- reactpy-1.0.2/PKG-INFO +73 -0
- reactpy-1.0.2/README.md +23 -0
- reactpy-1.0.2/pyproject.toml +176 -0
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/__init__.py +1 -2
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/ast_utils.py +11 -10
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/rewrite_camel_case_props.py +3 -3
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/rewrite_keys.py +4 -3
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_option.py +42 -20
- reactpy-1.0.2/reactpy/_static/app/dist/assets/index.a1f87a11.js +1 -0
- {reactpy-1.0.0/src/reactpy/_client → reactpy-1.0.2/reactpy/_static/app/dist}/index.html +3 -3
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_warnings.py +3 -2
- reactpy-1.0.2/reactpy/backend/__init__.py +22 -0
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/_common.py +47 -35
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/default.py +18 -11
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/fastapi.py +1 -2
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/flask.py +19 -19
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/hooks.py +9 -6
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/sanic.py +16 -24
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/starlette.py +19 -23
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/tornado.py +21 -18
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/types.py +2 -4
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/backend/utils.py +9 -12
- reactpy-1.0.2/reactpy/config.py +82 -0
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/_f_back.py +4 -3
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/_thread_local.py +0 -1
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/component.py +8 -9
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/events.py +11 -11
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/hooks.py +19 -24
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/layout.py +44 -50
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/serve.py +21 -7
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/types.py +18 -18
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/core/vdom.py +19 -20
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/html.py +63 -12
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/logging.py +1 -2
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/sample.py +3 -3
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/svg.py +2 -3
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/__init__.py +9 -5
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/backend.py +20 -23
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/common.py +8 -8
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/display.py +4 -4
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/testing/logs.py +3 -2
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/types.py +4 -5
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/utils.py +18 -23
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/__init__.py +1 -2
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/module.py +20 -20
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/templates/react.js +1 -1
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/web/utils.py +6 -8
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/widgets.py +10 -12
- reactpy-1.0.2/tests/__init__.py +0 -0
- reactpy-1.0.2/tests/conftest.py +80 -0
- reactpy-1.0.2/tests/test__console/__init__.py +0 -0
- reactpy-1.0.2/tests/test__console/test_rewrite_camel_case_props.py +118 -0
- reactpy-1.0.2/tests/test__console/test_rewrite_keys.py +237 -0
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test__option.py +29 -3
- reactpy-1.0.2/tests/test_backend/__init__.py +0 -0
- reactpy-1.0.2/tests/test_backend/test__common.py +70 -0
- reactpy-1.0.2/tests/test_backend/test_all.py +174 -0
- reactpy-1.0.2/tests/test_backend/test_utils.py +46 -0
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_client.py +2 -3
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_config.py +24 -0
- reactpy-1.0.2/tests/test_core/__init__.py +0 -0
- reactpy-1.0.2/tests/test_core/test_component.py +73 -0
- reactpy-1.0.2/tests/test_core/test_events.py +223 -0
- reactpy-1.0.2/tests/test_core/test_hooks.py +1259 -0
- reactpy-1.0.2/tests/test_core/test_layout.py +1252 -0
- reactpy-1.0.2/tests/test_core/test_serve.py +139 -0
- reactpy-1.0.2/tests/test_core/test_vdom.py +315 -0
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_sample.py +0 -1
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_testing.py +16 -9
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_utils.py +1 -5
- reactpy-1.0.2/tests/test_web/__init__.py +0 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/component-can-have-child.js +27 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/export-resolution/index.js +2 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/export-resolution/one.js +5 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/export-resolution/two.js +2 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/exports-syntax.js +23 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/exports-two-components.js +20 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/set-flag-when-unmount-is-called.js +31 -0
- reactpy-1.0.2/tests/test_web/js_fixtures/simple-button.js +25 -0
- reactpy-1.0.2/tests/test_web/test_module.py +235 -0
- reactpy-1.0.2/tests/test_web/test_utils.py +152 -0
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_widgets.py +0 -1
- reactpy-1.0.2/tests/tooling/__init__.py +0 -0
- reactpy-1.0.2/tests/tooling/asserts.py +5 -0
- reactpy-1.0.2/tests/tooling/common.py +14 -0
- reactpy-1.0.2/tests/tooling/hooks.py +15 -0
- reactpy-1.0.2/tests/tooling/layout.py +44 -0
- reactpy-1.0.2/tests/tooling/loop.py +91 -0
- reactpy-1.0.2/tests/tooling/select.py +107 -0
- reactpy-1.0.0/LICENSE +0 -21
- reactpy-1.0.0/PKG-INFO +0 -103
- reactpy-1.0.0/README.md +0 -69
- reactpy-1.0.0/pyproject.toml +0 -61
- reactpy-1.0.0/setup.cfg +0 -4
- reactpy-1.0.0/setup.py +0 -203
- reactpy-1.0.0/src/reactpy/_client/assets/index.53b29c63.js +0 -9
- reactpy-1.0.0/src/reactpy/config.py +0 -62
- reactpy-1.0.0/src/reactpy.egg-info/PKG-INFO +0 -103
- reactpy-1.0.0/src/reactpy.egg-info/SOURCES.txt +0 -70
- reactpy-1.0.0/src/reactpy.egg-info/dependency_links.txt +0 -1
- reactpy-1.0.0/src/reactpy.egg-info/entry_points.txt +0 -2
- reactpy-1.0.0/src/reactpy.egg-info/not-zip-safe +0 -1
- reactpy-1.0.0/src/reactpy.egg-info/requires.txt +0 -47
- reactpy-1.0.0/src/reactpy.egg-info/top_level.txt +0 -1
- {reactpy-1.0.0 → reactpy-1.0.2}/MANIFEST.in +0 -0
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/__main__.py +0 -0
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/_console/__init__.py +0 -0
- {reactpy-1.0.0/src/reactpy/_client → reactpy-1.0.2/reactpy/_static/app/dist}/assets/reactpy-logo.ico +0 -0
- {reactpy-1.0.0/src/reactpy/backend → reactpy-1.0.2/reactpy/core}/__init__.py +0 -0
- /reactpy-1.0.0/src/reactpy/core/__init__.py → /reactpy-1.0.2/reactpy/future.py +0 -0
- {reactpy-1.0.0/src → reactpy-1.0.2}/reactpy/py.typed +0 -0
- {reactpy-1.0.0 → reactpy-1.0.2}/tests/test_html.py +0 -0
reactpy-1.0.2/.gitignore
ADDED
reactpy-1.0.2/PKG-INFO
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
Metadata-Version: 2.1
|
|
2
|
+
Name: reactpy
|
|
3
|
+
Version: 1.0.2
|
|
4
|
+
Summary: Reactive user interfaces with pure Python
|
|
5
|
+
Project-URL: Source, https://github.com/reactive-python/reactpy
|
|
6
|
+
Project-URL: Documentation, https://github.com/reactive-python/reactpy#readme
|
|
7
|
+
Project-URL: Issues, https://github.com/reactive-python/reactpy/discussions
|
|
8
|
+
Author-email: Ryan Morshead <ryan.morshead@gmail.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
Keywords: component,javascript,react,reactpy
|
|
11
|
+
Classifier: Development Status :: 4 - Beta
|
|
12
|
+
Classifier: Programming Language :: Python
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: Implementation :: CPython
|
|
17
|
+
Classifier: Programming Language :: Python :: Implementation :: PyPy
|
|
18
|
+
Requires-Python: >=3.9
|
|
19
|
+
Requires-Dist: anyio>=3
|
|
20
|
+
Requires-Dist: asgiref>=3
|
|
21
|
+
Requires-Dist: colorlog>=6
|
|
22
|
+
Requires-Dist: fastjsonschema>=2.14.5
|
|
23
|
+
Requires-Dist: jsonpatch>=1.32
|
|
24
|
+
Requires-Dist: lxml>=4
|
|
25
|
+
Requires-Dist: mypy-extensions>=0.4.3
|
|
26
|
+
Requires-Dist: requests>=2
|
|
27
|
+
Requires-Dist: typing-extensions>=3.10
|
|
28
|
+
Provides-Extra: all
|
|
29
|
+
Requires-Dist: reactpy[fastapi,flask,sanic,starlette,testing,tornado]; extra == 'all'
|
|
30
|
+
Provides-Extra: fastapi
|
|
31
|
+
Requires-Dist: fastapi>=0.63.0; extra == 'fastapi'
|
|
32
|
+
Requires-Dist: uvicorn[standard]>=0.19.0; extra == 'fastapi'
|
|
33
|
+
Provides-Extra: flask
|
|
34
|
+
Requires-Dist: flask; extra == 'flask'
|
|
35
|
+
Requires-Dist: flask-cors; extra == 'flask'
|
|
36
|
+
Requires-Dist: flask-sock; extra == 'flask'
|
|
37
|
+
Requires-Dist: markupsafe<2.1,>=1.1.1; extra == 'flask'
|
|
38
|
+
Provides-Extra: sanic
|
|
39
|
+
Requires-Dist: sanic-cors; extra == 'sanic'
|
|
40
|
+
Requires-Dist: sanic>=21; extra == 'sanic'
|
|
41
|
+
Requires-Dist: uvicorn[standard]>=0.19.0; extra == 'sanic'
|
|
42
|
+
Provides-Extra: starlette
|
|
43
|
+
Requires-Dist: starlette>=0.13.6; extra == 'starlette'
|
|
44
|
+
Requires-Dist: uvicorn[standard]>=0.19.0; extra == 'starlette'
|
|
45
|
+
Provides-Extra: testing
|
|
46
|
+
Requires-Dist: playwright; extra == 'testing'
|
|
47
|
+
Provides-Extra: tornado
|
|
48
|
+
Requires-Dist: tornado; extra == 'tornado'
|
|
49
|
+
Description-Content-Type: text/markdown
|
|
50
|
+
|
|
51
|
+
# <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy
|
|
52
|
+
|
|
53
|
+
<p>
|
|
54
|
+
<a href="https://github.com/reactive-python/reactpy/actions">
|
|
55
|
+
<img src="https://github.com/reactive-python/reactpy/workflows/test/badge.svg?event=push">
|
|
56
|
+
</a>
|
|
57
|
+
<a href="https://pypi.org/project/reactpy/">
|
|
58
|
+
<img src="https://img.shields.io/pypi/v/reactpy.svg?label=PyPI">
|
|
59
|
+
</a>
|
|
60
|
+
<a href="https://github.com/reactive-python/reactpy/blob/main/LICENSE">
|
|
61
|
+
<img src="https://img.shields.io/badge/License-MIT-purple.svg">
|
|
62
|
+
</a>
|
|
63
|
+
<a href="https://reactpy.dev/">
|
|
64
|
+
<img src="https://img.shields.io/website?down_message=offline&label=Docs&logo=read-the-docs&logoColor=white&up_message=online&url=https%3A%2F%2Freactpy.dev%2Fdocs%2Findex.html">
|
|
65
|
+
</a>
|
|
66
|
+
<a href="https://discord.gg/uNb5P4hA9X">
|
|
67
|
+
<img src="https://img.shields.io/discord/1111078259854168116?label=Discord&logo=discord">
|
|
68
|
+
</a>
|
|
69
|
+
</p>
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
[ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions.
|
reactpy-1.0.2/README.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# <img src="https://raw.githubusercontent.com/reactive-python/reactpy/main/branding/svg/reactpy-logo-square.svg" align="left" height="45"/> ReactPy
|
|
2
|
+
|
|
3
|
+
<p>
|
|
4
|
+
<a href="https://github.com/reactive-python/reactpy/actions">
|
|
5
|
+
<img src="https://github.com/reactive-python/reactpy/workflows/test/badge.svg?event=push">
|
|
6
|
+
</a>
|
|
7
|
+
<a href="https://pypi.org/project/reactpy/">
|
|
8
|
+
<img src="https://img.shields.io/pypi/v/reactpy.svg?label=PyPI">
|
|
9
|
+
</a>
|
|
10
|
+
<a href="https://github.com/reactive-python/reactpy/blob/main/LICENSE">
|
|
11
|
+
<img src="https://img.shields.io/badge/License-MIT-purple.svg">
|
|
12
|
+
</a>
|
|
13
|
+
<a href="https://reactpy.dev/">
|
|
14
|
+
<img src="https://img.shields.io/website?down_message=offline&label=Docs&logo=read-the-docs&logoColor=white&up_message=online&url=https%3A%2F%2Freactpy.dev%2Fdocs%2Findex.html">
|
|
15
|
+
</a>
|
|
16
|
+
<a href="https://discord.gg/uNb5P4hA9X">
|
|
17
|
+
<img src="https://img.shields.io/discord/1111078259854168116?label=Discord&logo=discord">
|
|
18
|
+
</a>
|
|
19
|
+
</p>
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
[ReactPy](https://reactpy.dev/) is a library for building user interfaces in Python without Javascript. ReactPy interfaces are made from components that look and behave similar to those found in [ReactJS](https://reactjs.org/). Designed with simplicity in mind, ReactPy can be used by those without web development experience while also being powerful enough to grow with your ambitions.
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
[build-system]
|
|
2
|
+
requires = ["hatchling", "hatch-build-scripts>=0.0.4"]
|
|
3
|
+
build-backend = "hatchling.build"
|
|
4
|
+
|
|
5
|
+
# --- Project --------------------------------------------------------------------------
|
|
6
|
+
|
|
7
|
+
[project]
|
|
8
|
+
name = "reactpy"
|
|
9
|
+
dynamic = ["version"]
|
|
10
|
+
description = 'Reactive user interfaces with pure Python'
|
|
11
|
+
readme = "README.md"
|
|
12
|
+
requires-python = ">=3.9"
|
|
13
|
+
license = "MIT"
|
|
14
|
+
keywords = ["react", "javascript", "reactpy", "component"]
|
|
15
|
+
authors = [
|
|
16
|
+
{ name = "Ryan Morshead", email = "ryan.morshead@gmail.com" },
|
|
17
|
+
]
|
|
18
|
+
classifiers = [
|
|
19
|
+
"Development Status :: 4 - Beta",
|
|
20
|
+
"Programming Language :: Python",
|
|
21
|
+
"Programming Language :: Python :: 3.9",
|
|
22
|
+
"Programming Language :: Python :: 3.10",
|
|
23
|
+
"Programming Language :: Python :: 3.11",
|
|
24
|
+
"Programming Language :: Python :: Implementation :: CPython",
|
|
25
|
+
"Programming Language :: Python :: Implementation :: PyPy",
|
|
26
|
+
]
|
|
27
|
+
dependencies = [
|
|
28
|
+
"typing-extensions >=3.10",
|
|
29
|
+
"mypy-extensions >=0.4.3",
|
|
30
|
+
"anyio >=3",
|
|
31
|
+
"jsonpatch >=1.32",
|
|
32
|
+
"fastjsonschema >=2.14.5",
|
|
33
|
+
"requests >=2",
|
|
34
|
+
"colorlog >=6",
|
|
35
|
+
"asgiref >=3",
|
|
36
|
+
"lxml >=4",
|
|
37
|
+
]
|
|
38
|
+
[project.optional-dependencies]
|
|
39
|
+
all = ["reactpy[starlette,sanic,fastapi,flask,tornado,testing]"]
|
|
40
|
+
|
|
41
|
+
starlette = [
|
|
42
|
+
"starlette >=0.13.6",
|
|
43
|
+
"uvicorn[standard] >=0.19.0",
|
|
44
|
+
]
|
|
45
|
+
sanic = [
|
|
46
|
+
"sanic >=21",
|
|
47
|
+
"sanic-cors",
|
|
48
|
+
"uvicorn[standard] >=0.19.0",
|
|
49
|
+
]
|
|
50
|
+
fastapi = [
|
|
51
|
+
"fastapi >=0.63.0",
|
|
52
|
+
"uvicorn[standard] >=0.19.0",
|
|
53
|
+
]
|
|
54
|
+
flask = [
|
|
55
|
+
"flask",
|
|
56
|
+
"markupsafe>=1.1.1,<2.1",
|
|
57
|
+
"flask-cors",
|
|
58
|
+
"flask-sock",
|
|
59
|
+
]
|
|
60
|
+
tornado = [
|
|
61
|
+
"tornado",
|
|
62
|
+
]
|
|
63
|
+
testing = [
|
|
64
|
+
"playwright",
|
|
65
|
+
]
|
|
66
|
+
|
|
67
|
+
[project.urls]
|
|
68
|
+
Source = "https://github.com/reactive-python/reactpy"
|
|
69
|
+
Documentation = "https://github.com/reactive-python/reactpy#readme"
|
|
70
|
+
Issues = "https://github.com/reactive-python/reactpy/discussions"
|
|
71
|
+
|
|
72
|
+
# --- Hatch ----------------------------------------------------------------------------
|
|
73
|
+
|
|
74
|
+
[tool.hatch.version]
|
|
75
|
+
path = "reactpy/__init__.py"
|
|
76
|
+
|
|
77
|
+
[tool.hatch.envs.default]
|
|
78
|
+
features = ["all"]
|
|
79
|
+
pre-install-command = "hatch build --hooks-only"
|
|
80
|
+
dependencies = [
|
|
81
|
+
"coverage[toml]>=6.5",
|
|
82
|
+
"pytest",
|
|
83
|
+
"pytest-asyncio>=0.17",
|
|
84
|
+
"pytest-mock",
|
|
85
|
+
"pytest-rerunfailures",
|
|
86
|
+
"pytest-timeout",
|
|
87
|
+
"responses",
|
|
88
|
+
"playwright",
|
|
89
|
+
# I'm not quite sure why this needs to be installed for tests with Sanic to pass
|
|
90
|
+
"sanic-testing",
|
|
91
|
+
# Used to generate model changes from layout update messages
|
|
92
|
+
"jsonpointer",
|
|
93
|
+
]
|
|
94
|
+
[tool.hatch.envs.default.scripts]
|
|
95
|
+
test = "playwright install && pytest {args:tests}"
|
|
96
|
+
test-cov = "playwright install && coverage run -m pytest {args:tests}"
|
|
97
|
+
cov-report = [
|
|
98
|
+
# "- coverage combine",
|
|
99
|
+
"coverage report",
|
|
100
|
+
]
|
|
101
|
+
cov = [
|
|
102
|
+
"test-cov {args}",
|
|
103
|
+
"cov-report",
|
|
104
|
+
]
|
|
105
|
+
|
|
106
|
+
[tool.hatch.envs.default.env-vars]
|
|
107
|
+
REACTPY_DEBUG_MODE="1"
|
|
108
|
+
|
|
109
|
+
[tool.hatch.envs.lint]
|
|
110
|
+
features = ["all"]
|
|
111
|
+
dependencies = [
|
|
112
|
+
"mypy>=1.0.0",
|
|
113
|
+
"types-click",
|
|
114
|
+
"types-tornado",
|
|
115
|
+
"types-pkg-resources",
|
|
116
|
+
"types-flask",
|
|
117
|
+
"types-requests",
|
|
118
|
+
]
|
|
119
|
+
|
|
120
|
+
[tool.hatch.envs.lint.scripts]
|
|
121
|
+
types = "mypy --strict reactpy"
|
|
122
|
+
all = ["types"]
|
|
123
|
+
|
|
124
|
+
[[tool.hatch.build.hooks.build-scripts.scripts]]
|
|
125
|
+
work_dir = "../../js"
|
|
126
|
+
out_dir = "reactpy/_static"
|
|
127
|
+
commands = [
|
|
128
|
+
"npm ci",
|
|
129
|
+
"npm run build"
|
|
130
|
+
]
|
|
131
|
+
artifacts = [
|
|
132
|
+
"app/dist/"
|
|
133
|
+
]
|
|
134
|
+
|
|
135
|
+
# --- Pytest ---------------------------------------------------------------------------
|
|
136
|
+
|
|
137
|
+
[tool.pytest.ini_options]
|
|
138
|
+
testpaths = "tests"
|
|
139
|
+
xfail_strict = true
|
|
140
|
+
python_files = "*asserts.py test_*.py"
|
|
141
|
+
asyncio_mode = "auto"
|
|
142
|
+
log_cli_level = "INFO"
|
|
143
|
+
|
|
144
|
+
# --- MyPy -----------------------------------------------------------------------------
|
|
145
|
+
|
|
146
|
+
[tool.mypy]
|
|
147
|
+
incremental = false
|
|
148
|
+
ignore_missing_imports = true
|
|
149
|
+
warn_unused_configs = true
|
|
150
|
+
warn_redundant_casts = true
|
|
151
|
+
warn_unused_ignores = true
|
|
152
|
+
|
|
153
|
+
# --- Coverage -------------------------------------------------------------------------
|
|
154
|
+
|
|
155
|
+
[tool.coverage.run]
|
|
156
|
+
source_pkgs = ["reactpy"]
|
|
157
|
+
branch = false
|
|
158
|
+
parallel = false
|
|
159
|
+
omit = [
|
|
160
|
+
"reactpy/__init__.py",
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
[tool.coverage.report]
|
|
164
|
+
fail_under = 100
|
|
165
|
+
show_missing = true
|
|
166
|
+
skip_covered = true
|
|
167
|
+
sort = "Name"
|
|
168
|
+
exclude_lines = [
|
|
169
|
+
"no ?cov",
|
|
170
|
+
'\.\.\.',
|
|
171
|
+
"if __name__ == .__main__.:",
|
|
172
|
+
"if TYPE_CHECKING:",
|
|
173
|
+
]
|
|
174
|
+
omit = [
|
|
175
|
+
"reactpy/__main__.py",
|
|
176
|
+
]
|
|
@@ -20,9 +20,8 @@ from reactpy.core.serve import Stop
|
|
|
20
20
|
from reactpy.core.vdom import vdom
|
|
21
21
|
from reactpy.utils import Ref, html_to_vdom, vdom_to_html
|
|
22
22
|
|
|
23
|
-
|
|
24
23
|
__author__ = "The Reactive Python Team"
|
|
25
|
-
__version__ = "1.0.
|
|
24
|
+
__version__ = "1.0.2" # DO NOT MODIFY
|
|
26
25
|
|
|
27
26
|
__all__ = [
|
|
28
27
|
"backend",
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
3
|
import ast
|
|
4
|
-
from collections.abc import Sequence
|
|
4
|
+
from collections.abc import Iterator, Sequence
|
|
5
5
|
from dataclasses import dataclass
|
|
6
6
|
from pathlib import Path
|
|
7
7
|
from textwrap import indent
|
|
8
8
|
from tokenize import COMMENT as COMMENT_TOKEN
|
|
9
9
|
from tokenize import generate_tokens
|
|
10
|
-
from typing import Any
|
|
10
|
+
from typing import Any
|
|
11
11
|
|
|
12
12
|
import click
|
|
13
13
|
|
|
@@ -37,12 +37,13 @@ def rewrite_changed_nodes(
|
|
|
37
37
|
):
|
|
38
38
|
nodes_to_unparse.append(current_node)
|
|
39
39
|
break
|
|
40
|
-
else: #
|
|
41
|
-
|
|
40
|
+
else: # nocov
|
|
41
|
+
msg = "Failed to change code"
|
|
42
|
+
raise RuntimeError(msg)
|
|
42
43
|
|
|
43
|
-
# check if an nodes to rewrite contain
|
|
44
|
-
current_outermost_node, *sorted_nodes_to_unparse =
|
|
45
|
-
|
|
44
|
+
# check if an nodes to rewrite contain each other, pick outermost nodes
|
|
45
|
+
current_outermost_node, *sorted_nodes_to_unparse = sorted(
|
|
46
|
+
nodes_to_unparse, key=lambda n: n.lineno
|
|
46
47
|
)
|
|
47
48
|
outermost_nodes_to_unparse = [current_outermost_node]
|
|
48
49
|
for node in sorted_nodes_to_unparse:
|
|
@@ -80,7 +81,7 @@ def rewrite_changed_nodes(
|
|
|
80
81
|
if comments:
|
|
81
82
|
moved_comment_lines_from_end.append(len(lines) - node.lineno)
|
|
82
83
|
|
|
83
|
-
for lineno_from_end in sorted(
|
|
84
|
+
for lineno_from_end in sorted(set(moved_comment_lines_from_end)):
|
|
84
85
|
click.echo(f"Moved comments to {file}:{len(lines) - lineno_from_end}")
|
|
85
86
|
|
|
86
87
|
return "\n".join(lines)
|
|
@@ -128,7 +129,7 @@ def find_element_constructor_usages(
|
|
|
128
129
|
node.args.insert(1, maybe_attr_dict_node)
|
|
129
130
|
else:
|
|
130
131
|
continue
|
|
131
|
-
elif len(node.args) >= 2:
|
|
132
|
+
elif len(node.args) >= 2: # noqa: PLR2004
|
|
132
133
|
maybe_attr_dict_node = node.args[1]
|
|
133
134
|
elif hasattr(html, name):
|
|
134
135
|
if len(node.args) == 0:
|
|
@@ -179,7 +180,7 @@ def _find_comments(lines: list[str]) -> list[str]:
|
|
|
179
180
|
def _walk_with_parent(
|
|
180
181
|
node: ast.AST, parents: tuple[ast.AST, ...] = ()
|
|
181
182
|
) -> Iterator[tuple[tuple[ast.AST, ...], ast.AST]]:
|
|
182
|
-
parents = (node,
|
|
183
|
+
parents = (node, *parents)
|
|
183
184
|
for child in ast.iter_child_nodes(node):
|
|
184
185
|
yield parents, child
|
|
185
186
|
yield from _walk_with_parent(child, parents)
|
|
@@ -16,7 +16,6 @@ from reactpy._console.ast_utils import (
|
|
|
16
16
|
rewrite_changed_nodes,
|
|
17
17
|
)
|
|
18
18
|
|
|
19
|
-
|
|
20
19
|
CAMEL_CASE_SUB_PATTERN = re.compile(r"(?<!^)(?=[A-Z])")
|
|
21
20
|
|
|
22
21
|
|
|
@@ -24,8 +23,9 @@ CAMEL_CASE_SUB_PATTERN = re.compile(r"(?<!^)(?=[A-Z])")
|
|
|
24
23
|
@click.argument("paths", nargs=-1, type=click.Path(exists=True))
|
|
25
24
|
def rewrite_camel_case_props(paths: list[str]) -> None:
|
|
26
25
|
"""Rewrite camelCase props to snake_case"""
|
|
27
|
-
if sys.version_info < (3, 9): #
|
|
28
|
-
|
|
26
|
+
if sys.version_info < (3, 9): # nocov
|
|
27
|
+
msg = "This command requires Python>=3.9"
|
|
28
|
+
raise RuntimeError(msg)
|
|
29
29
|
|
|
30
30
|
for p in map(Path, paths):
|
|
31
31
|
for f in [p] if p.is_file() else p.rglob("*.py"):
|
|
@@ -40,13 +40,14 @@ def rewrite_keys(paths: list[str]) -> None:
|
|
|
40
40
|
recommend running your code formatter like Black against your code after executing
|
|
41
41
|
this command.
|
|
42
42
|
|
|
43
|
-
Additionally, We are unable to
|
|
43
|
+
Additionally, We are unable to preserve the location of comments that lie within any
|
|
44
44
|
rewritten code. This command will place the comments in the code it plans to rewrite
|
|
45
45
|
just above its changes. As such it requires manual intervention to put those
|
|
46
46
|
comments back in their original location.
|
|
47
47
|
"""
|
|
48
|
-
if sys.version_info < (3, 9): #
|
|
49
|
-
|
|
48
|
+
if sys.version_info < (3, 9): # nocov
|
|
49
|
+
msg = "This command requires Python>=3.9"
|
|
50
|
+
raise RuntimeError(msg)
|
|
50
51
|
|
|
51
52
|
for p in map(Path, paths):
|
|
52
53
|
for f in [p] if p.is_file() else p.rglob("*.py"):
|
|
@@ -6,9 +6,9 @@ from typing import Any, Callable, Generic, TypeVar, cast
|
|
|
6
6
|
|
|
7
7
|
from reactpy._warnings import warn
|
|
8
8
|
|
|
9
|
-
|
|
10
9
|
_O = TypeVar("_O")
|
|
11
10
|
logger = getLogger(__name__)
|
|
11
|
+
UNDEFINED = cast(Any, object())
|
|
12
12
|
|
|
13
13
|
|
|
14
14
|
class Option(Generic[_O]):
|
|
@@ -17,8 +17,9 @@ class Option(Generic[_O]):
|
|
|
17
17
|
def __init__(
|
|
18
18
|
self,
|
|
19
19
|
name: str,
|
|
20
|
-
default: _O
|
|
20
|
+
default: _O = UNDEFINED,
|
|
21
21
|
mutable: bool = True,
|
|
22
|
+
parent: Option[_O] | None = None,
|
|
22
23
|
validator: Callable[[Any], _O] = lambda x: cast(_O, x),
|
|
23
24
|
) -> None:
|
|
24
25
|
self._name = name
|
|
@@ -29,12 +30,15 @@ class Option(Generic[_O]):
|
|
|
29
30
|
if name in os.environ:
|
|
30
31
|
self._current = validator(os.environ[name])
|
|
31
32
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
33
|
+
if parent is not None:
|
|
34
|
+
if not (parent.mutable and self.mutable):
|
|
35
|
+
raise TypeError("Parent and child options must be mutable")
|
|
36
|
+
self._default = parent.default
|
|
37
|
+
parent.subscribe(self.set_current)
|
|
38
|
+
elif default is not UNDEFINED:
|
|
37
39
|
self._default = default
|
|
40
|
+
else:
|
|
41
|
+
raise TypeError("Must specify either a default or a parent option")
|
|
38
42
|
|
|
39
43
|
logger.debug(f"{self._name}={self.current}")
|
|
40
44
|
|
|
@@ -63,12 +67,12 @@ class Option(Generic[_O]):
|
|
|
63
67
|
@current.setter
|
|
64
68
|
def current(self, new: _O) -> None:
|
|
65
69
|
self.set_current(new)
|
|
66
|
-
return None
|
|
67
70
|
|
|
68
71
|
def subscribe(self, handler: Callable[[_O], None]) -> Callable[[_O], None]:
|
|
69
72
|
"""Register a callback that will be triggered when this option changes"""
|
|
70
73
|
if not self.mutable:
|
|
71
|
-
|
|
74
|
+
msg = "Immutable options cannot be subscribed to."
|
|
75
|
+
raise TypeError(msg)
|
|
72
76
|
self._subscribers.append(handler)
|
|
73
77
|
handler(self.current)
|
|
74
78
|
return handler
|
|
@@ -82,10 +86,19 @@ class Option(Generic[_O]):
|
|
|
82
86
|
|
|
83
87
|
Raises a ``TypeError`` if this option is not :attr:`Option.mutable`.
|
|
84
88
|
"""
|
|
85
|
-
if not self._mutable:
|
|
86
|
-
raise TypeError(f"{self} cannot be modified after initial load")
|
|
87
89
|
old = self.current
|
|
88
|
-
new
|
|
90
|
+
if new is old:
|
|
91
|
+
return None
|
|
92
|
+
|
|
93
|
+
if not self._mutable:
|
|
94
|
+
msg = f"{self} cannot be modified after initial load"
|
|
95
|
+
raise TypeError(msg)
|
|
96
|
+
|
|
97
|
+
try:
|
|
98
|
+
new = self._current = self._validator(new)
|
|
99
|
+
except ValueError as error:
|
|
100
|
+
raise ValueError(f"Invalid value for {self._name}: {new!r}") from error
|
|
101
|
+
|
|
89
102
|
logger.debug(f"{self._name}={self._current}")
|
|
90
103
|
if new != old:
|
|
91
104
|
for sub_func in self._subscribers:
|
|
@@ -107,7 +120,8 @@ class Option(Generic[_O]):
|
|
|
107
120
|
def unset(self) -> None:
|
|
108
121
|
"""Remove the current value, the default will be used until it is set again."""
|
|
109
122
|
if not self._mutable:
|
|
110
|
-
|
|
123
|
+
msg = f"{self} cannot be modified after initial load"
|
|
124
|
+
raise TypeError(msg)
|
|
111
125
|
old = self.current
|
|
112
126
|
delattr(self, "_current")
|
|
113
127
|
if self.current != old:
|
|
@@ -118,15 +132,23 @@ class Option(Generic[_O]):
|
|
|
118
132
|
return f"Option({self._name}={self.current!r})"
|
|
119
133
|
|
|
120
134
|
|
|
121
|
-
class DeprecatedOption(Option[_O]):
|
|
122
|
-
|
|
123
|
-
|
|
135
|
+
class DeprecatedOption(Option[_O]):
|
|
136
|
+
"""An option that will warn when it is accessed"""
|
|
137
|
+
|
|
138
|
+
def __init__(self, *args: Any, message: str, **kwargs: Any) -> None:
|
|
124
139
|
super().__init__(*args, **kwargs)
|
|
140
|
+
self._deprecation_message = message
|
|
125
141
|
|
|
126
142
|
@Option.current.getter # type: ignore
|
|
127
143
|
def current(self) -> _O:
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
144
|
+
try:
|
|
145
|
+
# we access the current value during init to debug log it
|
|
146
|
+
# no need to warn unless it's actually used. since this attr
|
|
147
|
+
# is only set after super().__init__ is called, we can check
|
|
148
|
+
# for it to determine if it's being accessed by a user.
|
|
149
|
+
msg = self._deprecation_message
|
|
150
|
+
except AttributeError:
|
|
151
|
+
pass
|
|
152
|
+
else:
|
|
153
|
+
warn(msg, DeprecationWarning)
|
|
132
154
|
return super().current
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var we=Object.defineProperty;var Pe=(ee,te,ne)=>te in ee?we(ee,te,{enumerable:!0,configurable:!0,writable:!0,value:ne}):ee[te]=ne;var ge=(ee,te,ne)=>(Pe(ee,typeof te!="symbol"?te+"":te,ne),ne);(function(){const te=document.createElement("link").relList;if(te&&te.supports&&te.supports("modulepreload"))return;for(const ie of document.querySelectorAll('link[rel="modulepreload"]'))re(ie);new MutationObserver(ie=>{for(const oe of ie)if(oe.type==="childList")for(const le of oe.addedNodes)le.tagName==="LINK"&&le.rel==="modulepreload"&&re(le)}).observe(document,{childList:!0,subtree:!0});function ne(ie){const oe={};return ie.integrity&&(oe.integrity=ie.integrity),ie.referrerpolicy&&(oe.referrerPolicy=ie.referrerpolicy),ie.crossorigin==="use-credentials"?oe.credentials="include":ie.crossorigin==="anonymous"?oe.credentials="omit":oe.credentials="same-origin",oe}function re(ie){if(ie.ep)return;ie.ep=!0;const oe=ne(ie);fetch(ie.href,oe)}})();var n,l$1,u$1,t$1,o$1,r$1,f$1,e$1,c$1={},s$1=[],a$1=/acit|ex(?:s|g|n|p|$)|rph|grid|ows|mnc|ntw|ine[ch]|zoo|^ord|itera/i,v$1=Array.isArray;function h$1(ee,te){for(var ne in te)ee[ne]=te[ne];return ee}function p$1(ee){var te=ee.parentNode;te&&te.removeChild(ee)}function y$1(ee,te,ne){var re,ie,oe,le={};for(oe in te)oe=="key"?re=te[oe]:oe=="ref"?ie=te[oe]:le[oe]=te[oe];if(arguments.length>2&&(le.children=arguments.length>3?n.call(arguments,2):ne),typeof ee=="function"&&ee.defaultProps!=null)for(oe in ee.defaultProps)le[oe]===void 0&&(le[oe]=ee.defaultProps[oe]);return d$1(ee,le,re,ie,null)}function d$1(ee,te,ne,re,ie){var oe={type:ee,props:te,key:ne,ref:re,__k:null,__:null,__b:0,__e:null,__d:void 0,__c:null,__h:null,constructor:void 0,__v:ie==null?++u$1:ie};return ie==null&&l$1.vnode!=null&&l$1.vnode(oe),oe}function _$1(){return{current:null}}function k$2(ee){return ee.children}function b$1(ee,te){this.props=ee,this.context=te}function g$2(ee,te){if(te==null)return ee.__?g$2(ee.__,ee.__.__k.indexOf(ee)+1):null;for(var ne;te<ee.__k.length;te++)if((ne=ee.__k[te])!=null&&ne.__e!=null)return ne.__e;return typeof ee.type=="function"?g$2(ee):null}function m$1(ee){var te,ne;if((ee=ee.__)!=null&&ee.__c!=null){for(ee.__e=ee.__c.base=null,te=0;te<ee.__k.length;te++)if((ne=ee.__k[te])!=null&&ne.__e!=null){ee.__e=ee.__c.base=ne.__e;break}return m$1(ee)}}function w$2(ee){(!ee.__d&&(ee.__d=!0)&&t$1.push(ee)&&!x$2.__r++||o$1!==l$1.debounceRendering)&&((o$1=l$1.debounceRendering)||r$1)(x$2)}function x$2(){var ee,te,ne,re,ie,oe,le,ue;for(t$1.sort(f$1);ee=t$1.shift();)ee.__d&&(te=t$1.length,re=void 0,ie=void 0,le=(oe=(ne=ee).__v).__e,(ue=ne.__P)&&(re=[],(ie=h$1({},oe)).__v=oe.__v+1,L$1(ue,oe,ie,ne.__n,ue.ownerSVGElement!==void 0,oe.__h!=null?[le]:null,re,le==null?g$2(oe):le,oe.__h),M$1(re,oe),oe.__e!=le&&m$1(oe)),t$1.length>te&&t$1.sort(f$1));x$2.__r=0}function P$1(ee,te,ne,re,ie,oe,le,ue,se,fe){var ce,pe,_e,ae,de,$e,ve,me=re&&re.__k||s$1,ye=me.length;for(ne.__k=[],ce=0;ce<te.length;ce++)if((ae=ne.__k[ce]=(ae=te[ce])==null||typeof ae=="boolean"||typeof ae=="function"?null:typeof ae=="string"||typeof ae=="number"||typeof ae=="bigint"?d$1(null,ae,null,null,ae):v$1(ae)?d$1(k$2,{children:ae},null,null,null):ae.__b>0?d$1(ae.type,ae.props,ae.key,ae.ref?ae.ref:null,ae.__v):ae)!=null){if(ae.__=ne,ae.__b=ne.__b+1,(_e=me[ce])===null||_e&&ae.key==_e.key&&ae.type===_e.type)me[ce]=void 0;else for(pe=0;pe<ye;pe++){if((_e=me[pe])&&ae.key==_e.key&&ae.type===_e.type){me[pe]=void 0;break}_e=null}L$1(ee,ae,_e=_e||c$1,ie,oe,le,ue,se,fe),de=ae.__e,(pe=ae.ref)&&_e.ref!=pe&&(ve||(ve=[]),_e.ref&&ve.push(_e.ref,null,ae),ve.push(pe,ae.__c||de,ae)),de!=null?($e==null&&($e=de),typeof ae.type=="function"&&ae.__k===_e.__k?ae.__d=se=C$1(ae,se,ee):se=$$1(ee,ae,_e,me,de,se),typeof ne.type=="function"&&(ne.__d=se)):se&&_e.__e==se&&se.parentNode!=ee&&(se=g$2(_e))}for(ne.__e=$e,ce=ye;ce--;)me[ce]!=null&&(typeof ne.type=="function"&&me[ce].__e!=null&&me[ce].__e==ne.__d&&(ne.__d=A$2(re).nextSibling),q$2(me[ce],me[ce]));if(ve)for(ce=0;ce<ve.length;ce++)O$1(ve[ce],ve[++ce],ve[++ce])}function C$1(ee,te,ne){for(var re,ie=ee.__k,oe=0;ie&&oe<ie.length;oe++)(re=ie[oe])&&(re.__=ee,te=typeof re.type=="function"?C$1(re,te,ne):$$1(ne,re,re,ie,re.__e,te));return te}function S(ee,te){return te=te||[],ee==null||typeof ee=="boolean"||(v$1(ee)?ee.some(function(ne){S(ne,te)}):te.push(ee)),te}function $$1(ee,te,ne,re,ie,oe){var le,ue,se;if(te.__d!==void 0)le=te.__d,te.__d=void 0;else if(ne==null||ie!=oe||ie.parentNode==null)e:if(oe==null||oe.parentNode!==ee)ee.appendChild(ie),le=null;else{for(ue=oe,se=0;(ue=ue.nextSibling)&&se<re.length;se+=1)if(ue==ie)break e;ee.insertBefore(ie,oe),le=oe}return le!==void 0?le:ie.nextSibling}function A$2(ee){var te,ne,re;if(ee.type==null||typeof ee.type=="string")return ee.__e;if(ee.__k){for(te=ee.__k.length-1;te>=0;te--)if((ne=ee.__k[te])&&(re=A$2(ne)))return re}return null}function H$1(ee,te,ne,re,ie){var oe;for(oe in ne)oe==="children"||oe==="key"||oe in te||T$2(ee,oe,null,ne[oe],re);for(oe in te)ie&&typeof te[oe]!="function"||oe==="children"||oe==="key"||oe==="value"||oe==="checked"||ne[oe]===te[oe]||T$2(ee,oe,te[oe],ne[oe],re)}function I$1(ee,te,ne){te[0]==="-"?ee.setProperty(te,ne==null?"":ne):ee[te]=ne==null?"":typeof ne!="number"||a$1.test(te)?ne:ne+"px"}function T$2(ee,te,ne,re,ie){var oe;e:if(te==="style")if(typeof ne=="string")ee.style.cssText=ne;else{if(typeof re=="string"&&(ee.style.cssText=re=""),re)for(te in re)ne&&te in ne||I$1(ee.style,te,"");if(ne)for(te in ne)re&&ne[te]===re[te]||I$1(ee.style,te,ne[te])}else if(te[0]==="o"&&te[1]==="n")oe=te!==(te=te.replace(/Capture$/,"")),te=te.toLowerCase()in ee?te.toLowerCase().slice(2):te.slice(2),ee.l||(ee.l={}),ee.l[te+oe]=ne,ne?re||ee.addEventListener(te,oe?z$2:j$2,oe):ee.removeEventListener(te,oe?z$2:j$2,oe);else if(te!=="dangerouslySetInnerHTML"){if(ie)te=te.replace(/xlink(H|:h)/,"h").replace(/sName$/,"s");else if(te!=="width"&&te!=="height"&&te!=="href"&&te!=="list"&&te!=="form"&&te!=="tabIndex"&&te!=="download"&&te!=="rowSpan"&&te!=="colSpan"&&te in ee)try{ee[te]=ne==null?"":ne;break e}catch{}typeof ne=="function"||(ne==null||ne===!1&&te[4]!=="-"?ee.removeAttribute(te):ee.setAttribute(te,ne))}}function j$2(ee){return this.l[ee.type+!1](l$1.event?l$1.event(ee):ee)}function z$2(ee){return this.l[ee.type+!0](l$1.event?l$1.event(ee):ee)}function L$1(ee,te,ne,re,ie,oe,le,ue,se){var fe,ce,pe,_e,ae,de,$e,ve,me,ye,be,Ee,ke,Ce,Te,he=te.type;if(te.constructor!==void 0)return null;ne.__h!=null&&(se=ne.__h,ue=te.__e=ne.__e,te.__h=null,oe=[ue]),(fe=l$1.__b)&&fe(te);try{e:if(typeof he=="function"){if(ve=te.props,me=(fe=he.contextType)&&re[fe.__c],ye=fe?me?me.props.value:fe.__:re,ne.__c?$e=(ce=te.__c=ne.__c).__=ce.__E:("prototype"in he&&he.prototype.render?te.__c=ce=new he(ve,ye):(te.__c=ce=new b$1(ve,ye),ce.constructor=he,ce.render=B$2),me&&me.sub(ce),ce.props=ve,ce.state||(ce.state={}),ce.context=ye,ce.__n=re,pe=ce.__d=!0,ce.__h=[],ce._sb=[]),ce.__s==null&&(ce.__s=ce.state),he.getDerivedStateFromProps!=null&&(ce.__s==ce.state&&(ce.__s=h$1({},ce.__s)),h$1(ce.__s,he.getDerivedStateFromProps(ve,ce.__s))),_e=ce.props,ae=ce.state,ce.__v=te,pe)he.getDerivedStateFromProps==null&&ce.componentWillMount!=null&&ce.componentWillMount(),ce.componentDidMount!=null&&ce.__h.push(ce.componentDidMount);else{if(he.getDerivedStateFromProps==null&&ve!==_e&&ce.componentWillReceiveProps!=null&&ce.componentWillReceiveProps(ve,ye),!ce.__e&&ce.shouldComponentUpdate!=null&&ce.shouldComponentUpdate(ve,ce.__s,ye)===!1||te.__v===ne.__v){for(te.__v!==ne.__v&&(ce.props=ve,ce.state=ce.__s,ce.__d=!1),ce.__e=!1,te.__e=ne.__e,te.__k=ne.__k,te.__k.forEach(function(Se){Se&&(Se.__=te)}),be=0;be<ce._sb.length;be++)ce.__h.push(ce._sb[be]);ce._sb=[],ce.__h.length&&le.push(ce);break e}ce.componentWillUpdate!=null&&ce.componentWillUpdate(ve,ce.__s,ye),ce.componentDidUpdate!=null&&ce.__h.push(function(){ce.componentDidUpdate(_e,ae,de)})}if(ce.context=ye,ce.props=ve,ce.__P=ee,Ee=l$1.__r,ke=0,"prototype"in he&&he.prototype.render){for(ce.state=ce.__s,ce.__d=!1,Ee&&Ee(te),fe=ce.render(ce.props,ce.state,ce.context),Ce=0;Ce<ce._sb.length;Ce++)ce.__h.push(ce._sb[Ce]);ce._sb=[]}else do ce.__d=!1,Ee&&Ee(te),fe=ce.render(ce.props,ce.state,ce.context),ce.state=ce.__s;while(ce.__d&&++ke<25);ce.state=ce.__s,ce.getChildContext!=null&&(re=h$1(h$1({},re),ce.getChildContext())),pe||ce.getSnapshotBeforeUpdate==null||(de=ce.getSnapshotBeforeUpdate(_e,ae)),P$1(ee,v$1(Te=fe!=null&&fe.type===k$2&&fe.key==null?fe.props.children:fe)?Te:[Te],te,ne,re,ie,oe,le,ue,se),ce.base=te.__e,te.__h=null,ce.__h.length&&le.push(ce),$e&&(ce.__E=ce.__=null),ce.__e=!1}else oe==null&&te.__v===ne.__v?(te.__k=ne.__k,te.__e=ne.__e):te.__e=N$1(ne.__e,te,ne,re,ie,oe,le,se);(fe=l$1.diffed)&&fe(te)}catch(Se){te.__v=null,(se||oe!=null)&&(te.__e=ue,te.__h=!!se,oe[oe.indexOf(ue)]=null),l$1.__e(Se,te,ne)}}function M$1(ee,te){l$1.__c&&l$1.__c(te,ee),ee.some(function(ne){try{ee=ne.__h,ne.__h=[],ee.some(function(re){re.call(ne)})}catch(re){l$1.__e(re,ne.__v)}})}function N$1(ee,te,ne,re,ie,oe,le,ue){var se,fe,ce,pe=ne.props,_e=te.props,ae=te.type,de=0;if(ae==="svg"&&(ie=!0),oe!=null){for(;de<oe.length;de++)if((se=oe[de])&&"setAttribute"in se==!!ae&&(ae?se.localName===ae:se.nodeType===3)){ee=se,oe[de]=null;break}}if(ee==null){if(ae===null)return document.createTextNode(_e);ee=ie?document.createElementNS("http://www.w3.org/2000/svg",ae):document.createElement(ae,_e.is&&_e),oe=null,ue=!1}if(ae===null)pe===_e||ue&&ee.data===_e||(ee.data=_e);else{if(oe=oe&&n.call(ee.childNodes),fe=(pe=ne.props||c$1).dangerouslySetInnerHTML,ce=_e.dangerouslySetInnerHTML,!ue){if(oe!=null)for(pe={},de=0;de<ee.attributes.length;de++)pe[ee.attributes[de].name]=ee.attributes[de].value;(ce||fe)&&(ce&&(fe&&ce.__html==fe.__html||ce.__html===ee.innerHTML)||(ee.innerHTML=ce&&ce.__html||""))}if(H$1(ee,_e,pe,ie,ue),ce)te.__k=[];else if(P$1(ee,v$1(de=te.props.children)?de:[de],te,ne,re,ie&&ae!=="foreignObject",oe,le,oe?oe[0]:ne.__k&&g$2(ne,0),ue),oe!=null)for(de=oe.length;de--;)oe[de]!=null&&p$1(oe[de]);ue||("value"in _e&&(de=_e.value)!==void 0&&(de!==ee.value||ae==="progress"&&!de||ae==="option"&&de!==pe.value)&&T$2(ee,"value",de,pe.value,!1),"checked"in _e&&(de=_e.checked)!==void 0&&de!==ee.checked&&T$2(ee,"checked",de,pe.checked,!1))}return ee}function O$1(ee,te,ne){try{typeof ee=="function"?ee(te):ee.current=te}catch(re){l$1.__e(re,ne)}}function q$2(ee,te,ne){var re,ie;if(l$1.unmount&&l$1.unmount(ee),(re=ee.ref)&&(re.current&&re.current!==ee.__e||O$1(re,null,te)),(re=ee.__c)!=null){if(re.componentWillUnmount)try{re.componentWillUnmount()}catch(oe){l$1.__e(oe,te)}re.base=re.__P=null,ee.__c=void 0}if(re=ee.__k)for(ie=0;ie<re.length;ie++)re[ie]&&q$2(re[ie],te,ne||typeof ee.type!="function");ne||ee.__e==null||p$1(ee.__e),ee.__=ee.__e=ee.__d=void 0}function B$2(ee,te,ne){return this.constructor(ee,ne)}function D$1(ee,te,ne){var re,ie,oe;l$1.__&&l$1.__(ee,te),ie=(re=typeof ne=="function")?null:ne&&ne.__k||te.__k,oe=[],L$1(te,ee=(!re&&ne||te).__k=y$1(k$2,null,[ee]),ie||c$1,c$1,te.ownerSVGElement!==void 0,!re&&ne?[ne]:ie?null:te.firstChild?n.call(te.childNodes):null,oe,!re&&ne?ne:ie?ie.__e:te.firstChild,re),M$1(oe,ee)}function E$1(ee,te){D$1(ee,te,E$1)}function F$2(ee,te,ne){var re,ie,oe,le,ue=h$1({},ee.props);for(oe in ee.type&&ee.type.defaultProps&&(le=ee.type.defaultProps),te)oe=="key"?re=te[oe]:oe=="ref"?ie=te[oe]:ue[oe]=te[oe]===void 0&&le!==void 0?le[oe]:te[oe];return arguments.length>2&&(ue.children=arguments.length>3?n.call(arguments,2):ne),d$1(ee.type,ue,re||ee.key,ie||ee.ref,null)}function G$1(ee,te){var ne={__c:te="__cC"+e$1++,__:ee,Consumer:function(re,ie){return re.children(ie)},Provider:function(re){var ie,oe;return this.getChildContext||(ie=[],(oe={})[te]=this,this.getChildContext=function(){return oe},this.shouldComponentUpdate=function(le){this.props.value!==le.value&&ie.some(function(ue){ue.__e=!0,w$2(ue)})},this.sub=function(le){ie.push(le);var ue=le.componentWillUnmount;le.componentWillUnmount=function(){ie.splice(ie.indexOf(le),1),ue&&ue.call(le)}}),re.children}};return ne.Provider.__=ne.Consumer.contextType=ne}n=s$1.slice,l$1={__e:function(ee,te,ne,re){for(var ie,oe,le;te=te.__;)if((ie=te.__c)&&!ie.__)try{if((oe=ie.constructor)&&oe.getDerivedStateFromError!=null&&(ie.setState(oe.getDerivedStateFromError(ee)),le=ie.__d),ie.componentDidCatch!=null&&(ie.componentDidCatch(ee,re||{}),le=ie.__d),le)return ie.__E=ie}catch(ue){ee=ue}throw ee}},u$1=0,b$1.prototype.setState=function(ee,te){var ne;ne=this.__s!=null&&this.__s!==this.state?this.__s:this.__s=h$1({},this.state),typeof ee=="function"&&(ee=ee(h$1({},ne),this.props)),ee&&h$1(ne,ee),ee!=null&&this.__v&&(te&&this._sb.push(te),w$2(this))},b$1.prototype.forceUpdate=function(ee){this.__v&&(this.__e=!0,ee&&this.__h.push(ee),w$2(this))},b$1.prototype.render=k$2,t$1=[],r$1=typeof Promise=="function"?Promise.prototype.then.bind(Promise.resolve()):setTimeout,f$1=function(ee,te){return ee.__v.__b-te.__v.__b},x$2.__r=0,e$1=0;var t,r,u,i,o=0,f=[],c=[],e=l$1.__b,a=l$1.__r,v=l$1.diffed,l=l$1.__c,m=l$1.unmount;function d(ee,te){l$1.__h&&l$1.__h(r,ee,o||te),o=0;var ne=r.__H||(r.__H={__:[],__h:[]});return ee>=ne.__.length&&ne.__.push({__V:c}),ne.__[ee]}function h(ee){return o=1,s(B$1,ee)}function s(ee,te,ne){var re=d(t++,2);if(re.t=ee,!re.__c&&(re.__=[ne?ne(te):B$1(void 0,te),function(ue){var se=re.__N?re.__N[0]:re.__[0],fe=re.t(se,ue);se!==fe&&(re.__N=[fe,re.__[1]],re.__c.setState({}))}],re.__c=r,!r.u)){var ie=function(ue,se,fe){if(!re.__c.__H)return!0;var ce=re.__c.__H.__.filter(function(_e){return _e.__c});if(ce.every(function(_e){return!_e.__N}))return!oe||oe.call(this,ue,se,fe);var pe=!1;return ce.forEach(function(_e){if(_e.__N){var ae=_e.__[0];_e.__=_e.__N,_e.__N=void 0,ae!==_e.__[0]&&(pe=!0)}}),!(!pe&&re.__c.props===ue)&&(!oe||oe.call(this,ue,se,fe))};r.u=!0;var oe=r.shouldComponentUpdate,le=r.componentWillUpdate;r.componentWillUpdate=function(ue,se,fe){if(this.__e){var ce=oe;oe=void 0,ie(ue,se,fe),oe=ce}le&&le.call(this,ue,se,fe)},r.shouldComponentUpdate=ie}return re.__N||re.__}function p(ee,te){var ne=d(t++,3);!l$1.__s&&z$1(ne.__H,te)&&(ne.__=ee,ne.i=te,r.__H.__h.push(ne))}function y(ee,te){var ne=d(t++,4);!l$1.__s&&z$1(ne.__H,te)&&(ne.__=ee,ne.i=te,r.__h.push(ne))}function _(ee){return o=5,F$1(function(){return{current:ee}},[])}function A$1(ee,te,ne){o=6,y(function(){return typeof ee=="function"?(ee(te()),function(){return ee(null)}):ee?(ee.current=te(),function(){return ee.current=null}):void 0},ne==null?ne:ne.concat(ee))}function F$1(ee,te){var ne=d(t++,7);return z$1(ne.__H,te)?(ne.__V=ee(),ne.i=te,ne.__h=ee,ne.__V):ne.__}function T$1(ee,te){return o=8,F$1(function(){return ee},te)}function q$1(ee){var te=r.context[ee.__c],ne=d(t++,9);return ne.c=ee,te?(ne.__==null&&(ne.__=!0,te.sub(r)),te.props.value):ee.__}function x$1(ee,te){l$1.useDebugValue&&l$1.useDebugValue(te?te(ee):ee)}function V$1(){var ee=d(t++,11);if(!ee.__){for(var te=r.__v;te!==null&&!te.__m&&te.__!==null;)te=te.__;var ne=te.__m||(te.__m=[0,0]);ee.__="P"+ne[0]+"-"+ne[1]++}return ee.__}function b(){for(var ee;ee=f.shift();)if(ee.__P&&ee.__H)try{ee.__H.__h.forEach(k$1),ee.__H.__h.forEach(w$1),ee.__H.__h=[]}catch(te){ee.__H.__h=[],l$1.__e(te,ee.__v)}}l$1.__b=function(ee){r=null,e&&e(ee)},l$1.__r=function(ee){a&&a(ee),t=0;var te=(r=ee.__c).__H;te&&(u===r?(te.__h=[],r.__h=[],te.__.forEach(function(ne){ne.__N&&(ne.__=ne.__N),ne.__V=c,ne.__N=ne.i=void 0})):(te.__h.forEach(k$1),te.__h.forEach(w$1),te.__h=[],t=0)),u=r},l$1.diffed=function(ee){v&&v(ee);var te=ee.__c;te&&te.__H&&(te.__H.__h.length&&(f.push(te)!==1&&i===l$1.requestAnimationFrame||((i=l$1.requestAnimationFrame)||j$1)(b)),te.__H.__.forEach(function(ne){ne.i&&(ne.__H=ne.i),ne.__V!==c&&(ne.__=ne.__V),ne.i=void 0,ne.__V=c})),u=r=null},l$1.__c=function(ee,te){te.some(function(ne){try{ne.__h.forEach(k$1),ne.__h=ne.__h.filter(function(re){return!re.__||w$1(re)})}catch(re){te.some(function(ie){ie.__h&&(ie.__h=[])}),te=[],l$1.__e(re,ne.__v)}}),l&&l(ee,te)},l$1.unmount=function(ee){m&&m(ee);var te,ne=ee.__c;ne&&ne.__H&&(ne.__H.__.forEach(function(re){try{k$1(re)}catch(ie){te=ie}}),ne.__H=void 0,te&&l$1.__e(te,ne.__v))};var g$1=typeof requestAnimationFrame=="function";function j$1(ee){var te,ne=function(){clearTimeout(re),g$1&&cancelAnimationFrame(te),setTimeout(ee)},re=setTimeout(ne,100);g$1&&(te=requestAnimationFrame(ne))}function k$1(ee){var te=r,ne=ee.__c;typeof ne=="function"&&(ee.__c=void 0,ne()),r=te}function w$1(ee){var te=r;ee.__c=ee.__(),r=te}function z$1(ee,te){return!ee||ee.length!==te.length||te.some(function(ne,re){return ne!==ee[re]})}function B$1(ee,te){return typeof te=="function"?te(ee):te}function g(ee,te){for(var ne in te)ee[ne]=te[ne];return ee}function C(ee,te){for(var ne in ee)if(ne!=="__source"&&!(ne in te))return!0;for(var re in te)if(re!=="__source"&&ee[re]!==te[re])return!0;return!1}function E(ee,te){return ee===te&&(ee!==0||1/ee==1/te)||ee!=ee&&te!=te}function w(ee){this.props=ee}function x(ee,te){function ne(ie){var oe=this.props.ref,le=oe==ie.ref;return!le&&oe&&(oe.call?oe(null):oe.current=null),te?!te(this.props,ie)||!le:C(this.props,ie)}function re(ie){return this.shouldComponentUpdate=ne,y$1(ee,ie)}return re.displayName="Memo("+(ee.displayName||ee.name)+")",re.prototype.isReactComponent=!0,re.__f=!0,re}(w.prototype=new b$1).isPureReactComponent=!0,w.prototype.shouldComponentUpdate=function(ee,te){return C(this.props,ee)||C(this.state,te)};var R=l$1.__b;l$1.__b=function(ee){ee.type&&ee.type.__f&&ee.ref&&(ee.props.ref=ee.ref,ee.ref=null),R&&R(ee)};var N=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.forward_ref")||3911;function k(ee){function te(ne){var re=g({},ne);return delete re.ref,ee(re,ne.ref||null)}return te.$$typeof=N,te.render=te,te.prototype.isReactComponent=te.__f=!0,te.displayName="ForwardRef("+(ee.displayName||ee.name)+")",te}var A=function(ee,te){return ee==null?null:S(S(ee).map(te))},O={map:A,forEach:A,count:function(ee){return ee?S(ee).length:0},only:function(ee){var te=S(ee);if(te.length!==1)throw"Children.only";return te[0]},toArray:S},T=l$1.__e;l$1.__e=function(ee,te,ne,re){if(ee.then){for(var ie,oe=te;oe=oe.__;)if((ie=oe.__c)&&ie.__c)return te.__e==null&&(te.__e=ne.__e,te.__k=ne.__k),ie.__c(ee,te)}T(ee,te,ne,re)};var I=l$1.unmount;function L(ee,te,ne){return ee&&(ee.__c&&ee.__c.__H&&(ee.__c.__H.__.forEach(function(re){typeof re.__c=="function"&&re.__c()}),ee.__c.__H=null),(ee=g({},ee)).__c!=null&&(ee.__c.__P===ne&&(ee.__c.__P=te),ee.__c=null),ee.__k=ee.__k&&ee.__k.map(function(re){return L(re,te,ne)})),ee}function U(ee,te,ne){return ee&&(ee.__v=null,ee.__k=ee.__k&&ee.__k.map(function(re){return U(re,te,ne)}),ee.__c&&ee.__c.__P===te&&(ee.__e&&ne.insertBefore(ee.__e,ee.__d),ee.__c.__e=!0,ee.__c.__P=ne)),ee}function D(){this.__u=0,this.t=null,this.__b=null}function F(ee){var te=ee.__.__c;return te&&te.__a&&te.__a(ee)}function M(ee){var te,ne,re;function ie(oe){if(te||(te=ee()).then(function(le){ne=le.default||le},function(le){re=le}),re)throw re;if(!ne)throw te;return y$1(ne,oe)}return ie.displayName="Lazy",ie.__f=!0,ie}function V(){this.u=null,this.o=null}l$1.unmount=function(ee){var te=ee.__c;te&&te.__R&&te.__R(),te&&ee.__h===!0&&(ee.type=null),I&&I(ee)},(D.prototype=new b$1).__c=function(ee,te){var ne=te.__c,re=this;re.t==null&&(re.t=[]),re.t.push(ne);var ie=F(re.__v),oe=!1,le=function(){oe||(oe=!0,ne.__R=null,ie?ie(ue):ue())};ne.__R=le;var ue=function(){if(!--re.__u){if(re.state.__a){var fe=re.state.__a;re.__v.__k[0]=U(fe,fe.__c.__P,fe.__c.__O)}var ce;for(re.setState({__a:re.__b=null});ce=re.t.pop();)ce.forceUpdate()}},se=te.__h===!0;re.__u++||se||re.setState({__a:re.__b=re.__v.__k[0]}),ee.then(le,le)},D.prototype.componentWillUnmount=function(){this.t=[]},D.prototype.render=function(ee,te){if(this.__b){if(this.__v.__k){var ne=document.createElement("div"),re=this.__v.__k[0].__c;this.__v.__k[0]=L(this.__b,ne,re.__O=re.__P)}this.__b=null}var ie=te.__a&&y$1(k$2,null,ee.fallback);return ie&&(ie.__h=null),[y$1(k$2,null,te.__a?null:ee.children),ie]};var W=function(ee,te,ne){if(++ne[1]===ne[0]&&ee.o.delete(te),ee.props.revealOrder&&(ee.props.revealOrder[0]!=="t"||!ee.o.size))for(ne=ee.u;ne;){for(;ne.length>3;)ne.pop()();if(ne[1]<ne[0])break;ee.u=ne=ne[2]}};function P(ee){return this.getChildContext=function(){return ee.context},ee.children}function j(ee){var te=this,ne=ee.i;te.componentWillUnmount=function(){D$1(null,te.l),te.l=null,te.i=null},te.i&&te.i!==ne&&te.componentWillUnmount(),ee.__v?(te.l||(te.i=ne,te.l={nodeType:1,parentNode:ne,childNodes:[],appendChild:function(re){this.childNodes.push(re),te.i.appendChild(re)},insertBefore:function(re,ie){this.childNodes.push(re),te.i.appendChild(re)},removeChild:function(re){this.childNodes.splice(this.childNodes.indexOf(re)>>>1,1),te.i.removeChild(re)}}),D$1(y$1(P,{context:te.context},ee.__v),te.l)):te.l&&te.componentWillUnmount()}function z(ee,te){var ne=y$1(j,{__v:ee,i:te});return ne.containerInfo=te,ne}(V.prototype=new b$1).__a=function(ee){var te=this,ne=F(te.__v),re=te.o.get(ee);return re[0]++,function(ie){var oe=function(){te.props.revealOrder?(re.push(ie),W(te,ee,re)):ie()};ne?ne(oe):oe()}},V.prototype.render=function(ee){this.u=null,this.o=new Map;var te=S(ee.children);ee.revealOrder&&ee.revealOrder[0]==="b"&&te.reverse();for(var ne=te.length;ne--;)this.o.set(te[ne],this.u=[1,0,this.u]);return ee.children},V.prototype.componentDidUpdate=V.prototype.componentDidMount=function(){var ee=this;this.o.forEach(function(te,ne){W(ee,ne,te)})};var B=typeof Symbol<"u"&&Symbol.for&&Symbol.for("react.element")||60103,H=/^(?:accent|alignment|arabic|baseline|cap|clip(?!PathU)|color|dominant|fill|flood|font|glyph(?!R)|horiz|image(!S)|letter|lighting|marker(?!H|W|U)|overline|paint|pointer|shape|stop|strikethrough|stroke|text(?!L)|transform|underline|unicode|units|v|vector|vert|word|writing|x(?!C))[A-Z]/,Z=/^on(Ani|Tra|Tou|BeforeInp|Compo)/,Y=/[A-Z0-9]/g,$=typeof document<"u",q=function(ee){return(typeof Symbol<"u"&&typeof Symbol()=="symbol"?/fil|che|rad/:/fil|che|ra/).test(ee)};function G(ee,te,ne){return te.__k==null&&(te.textContent=""),D$1(ee,te),typeof ne=="function"&&ne(),ee?ee.__c:null}function J(ee,te,ne){return E$1(ee,te),typeof ne=="function"&&ne(),ee?ee.__c:null}b$1.prototype.isReactComponent={},["componentWillMount","componentWillReceiveProps","componentWillUpdate"].forEach(function(ee){Object.defineProperty(b$1.prototype,ee,{configurable:!0,get:function(){return this["UNSAFE_"+ee]},set:function(te){Object.defineProperty(this,ee,{configurable:!0,writable:!0,value:te})}})});var K=l$1.event;function Q(){}function X(){return this.cancelBubble}function nn(){return this.defaultPrevented}l$1.event=function(ee){return K&&(ee=K(ee)),ee.persist=Q,ee.isPropagationStopped=X,ee.isDefaultPrevented=nn,ee.nativeEvent=ee};var tn,en={enumerable:!1,configurable:!0,get:function(){return this.class}},rn=l$1.vnode;l$1.vnode=function(ee){typeof ee.type=="string"&&function(te){var ne=te.props,re=te.type,ie={};for(var oe in ne){var le=ne[oe];if(!(oe==="value"&&"defaultValue"in ne&&le==null||$&&oe==="children"&&re==="noscript"||oe==="class"||oe==="className")){var ue=oe.toLowerCase();oe==="defaultValue"&&"value"in ne&&ne.value==null?oe="value":oe==="download"&&le===!0?le="":ue==="ondoubleclick"?oe="ondblclick":ue!=="onchange"||re!=="input"&&re!=="textarea"||q(ne.type)?ue==="onfocus"?oe="onfocusin":ue==="onblur"?oe="onfocusout":Z.test(oe)?oe=ue:re.indexOf("-")===-1&&H.test(oe)?oe=oe.replace(Y,"-$&").toLowerCase():le===null&&(le=void 0):ue=oe="oninput",ue==="oninput"&&ie[oe=ue]&&(oe="oninputCapture"),ie[oe]=le}}re=="select"&&ie.multiple&&Array.isArray(ie.value)&&(ie.value=S(ne.children).forEach(function(se){se.props.selected=ie.value.indexOf(se.props.value)!=-1})),re=="select"&&ie.defaultValue!=null&&(ie.value=S(ne.children).forEach(function(se){se.props.selected=ie.multiple?ie.defaultValue.indexOf(se.props.value)!=-1:ie.defaultValue==se.props.value})),ne.class&&!ne.className?(ie.class=ne.class,Object.defineProperty(ie,"className",en)):(ne.className&&!ne.class||ne.class&&ne.className)&&(ie.class=ie.className=ne.className),te.props=ie}(ee),ee.$$typeof=B,rn&&rn(ee)};var un=l$1.__r;l$1.__r=function(ee){un&&un(ee),tn=ee.__c};var on=l$1.diffed;l$1.diffed=function(ee){on&&on(ee);var te=ee.props,ne=ee.__e;ne!=null&&ee.type==="textarea"&&"value"in te&&te.value!==ne.value&&(ne.value=te.value==null?"":te.value),tn=null};var ln={ReactCurrentDispatcher:{current:{readContext:function(ee){return tn.__n[ee.__c].props.value}}}};function fn(ee){return y$1.bind(null,ee)}function an(ee){return!!ee&&ee.$$typeof===B}function sn(ee){return an(ee)?F$2.apply(null,arguments):ee}function hn(ee){return!!ee.__k&&(D$1(null,ee),!0)}function vn(ee){return ee&&(ee.base||ee.nodeType===1&&ee)||null}var dn=function(ee,te){return ee(te)},pn=function(ee,te){return ee(te)},mn=k$2;function yn(ee){ee()}function _n(ee){return ee}function bn(){return[!1,yn]}var Sn=y;function gn(ee,te){var ne=te(),re=h({h:{__:ne,v:te}}),ie=re[0].h,oe=re[1];return y(function(){ie.__=ne,ie.v=te,E(ie.__,te())||oe({h:ie})},[ee,ne,te]),p(function(){return E(ie.__,ie.v())||oe({h:ie}),ee(function(){E(ie.__,ie.v())||oe({h:ie})})},[ee]),ne}var Cn={useState:h,useId:V$1,useReducer:s,useEffect:p,useLayoutEffect:y,useInsertionEffect:Sn,useTransition:bn,useDeferredValue:_n,useSyncExternalStore:gn,startTransition:yn,useRef:_,useImperativeHandle:A$1,useMemo:F$1,useCallback:T$1,useContext:q$1,useDebugValue:x$1,version:"17.0.2",Children:O,render:G,hydrate:J,unmountComponentAtNode:hn,createPortal:z,createElement:y$1,createContext:G$1,createFactory:fn,cloneElement:sn,createRef:_$1,Fragment:k$2,isValidElement:an,findDOMNode:vn,Component:b$1,PureComponent:w,memo:x,forwardRef:k,flushSync:pn,unstable_batchedUpdates:dn,StrictMode:mn,Suspense:D,SuspenseList:V,lazy:M,__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED:ln},hasOwn=Object.prototype.hasOwnProperty,toString=Object.prototype.toString,foreach=function(te,ne,re){if(toString.call(ne)!=="[object Function]")throw new TypeError("iterator must be a function");var ie=te.length;if(ie===+ie)for(var oe=0;oe<ie;oe++)ne.call(re,te[oe],oe,te);else for(var le in te)hasOwn.call(te,le)&&ne.call(re,te[le],le,te)},each=foreach,jsonPointer=api;function api(ee,te,ne){if(arguments.length===3)return api.set(ee,te,ne);if(arguments.length===2)return api.get(ee,te);var re=api.bind(api,ee);for(var ie in api)api.hasOwnProperty(ie)&&(re[ie]=api[ie].bind(re,ee));return re}api.get=function(te,ne){for(var re=Array.isArray(ne)?ne:api.parse(ne),ie=0;ie<re.length;++ie){var oe=re[ie];if(!(typeof te=="object"&&oe in te))throw new Error("Invalid reference token: "+oe);te=te[oe]}return te};api.set=function(te,ne,re){var ie=Array.isArray(ne)?ne:api.parse(ne),oe=ie[0];if(ie.length===0)throw Error("Can not set the root object");for(var le=0;le<ie.length-1;++le){var ue=ie[le];typeof ue!="string"&&typeof ue!="number"&&(ue=String(ue)),!(ue==="__proto__"||ue==="constructor"||ue==="prototype")&&(ue==="-"&&Array.isArray(te)&&(ue=te.length),oe=ie[le+1],ue in te||(oe.match(/^(\d+|-)$/)?te[ue]=[]:te[ue]={}),te=te[ue])}return oe==="-"&&Array.isArray(te)&&(oe=te.length),te[oe]=re,this};api.remove=function(ee,te){var ne=Array.isArray(te)?te:api.parse(te),re=ne[ne.length-1];if(re===void 0)throw new Error('Invalid JSON pointer for remove: "'+te+'"');var ie=api.get(ee,ne.slice(0,-1));if(Array.isArray(ie)){var oe=+re;if(re===""&&isNaN(oe))throw new Error('Invalid array index: "'+re+'"');Array.prototype.splice.call(ie,oe,1)}else delete ie[re]};api.dict=function(te,ne){var re={};return api.walk(te,function(ie,oe){re[oe]=ie},ne),re};api.walk=function(te,ne,re){var ie=[];re=re||function(oe){var le=Object.prototype.toString.call(oe);return le==="[object Object]"||le==="[object Array]"},function oe(le){each(le,function(ue,se){ie.push(String(se)),re(ue)?oe(ue):ne(ue,api.compile(ie)),ie.pop()})}(te)};api.has=function(te,ne){try{api.get(te,ne)}catch{return!1}return!0};api.escape=function(te){return te.toString().replace(/~/g,"~0").replace(/\//g,"~1")};api.unescape=function(te){return te.replace(/~1/g,"/").replace(/~0/g,"~")};api.parse=function(te){if(te==="")return[];if(te.charAt(0)!=="/")throw new Error("Invalid JSON pointer: "+te);return te.substring(1).split(/\//).map(api.unescape)};api.compile=function(te){return te.length===0?"":"/"+te.map(api.escape).join("/")};const scriptRel="modulepreload",assetsURL=function(ee){return"/_reactpy/"+ee},seen={},__vitePreload=function(te,ne,re){if(!ne||ne.length===0)return te();const ie=document.getElementsByTagName("link");return Promise.all(ne.map(oe=>{if(oe=assetsURL(oe),oe in seen)return;seen[oe]=!0;const le=oe.endsWith(".css"),ue=le?'[rel="stylesheet"]':"";if(!!re)for(let ce=ie.length-1;ce>=0;ce--){const pe=ie[ce];if(pe.href===oe&&(!le||pe.rel==="stylesheet"))return}else if(document.querySelector(`link[href="${oe}"]${ue}`))return;const fe=document.createElement("link");if(fe.rel=le?"stylesheet":scriptRel,le||(fe.as="script",fe.crossOrigin=""),fe.href=oe,document.head.appendChild(fe),le)return new Promise((ce,pe)=>{fe.addEventListener("load",ce),fe.addEventListener("error",()=>pe(new Error(`Unable to preload CSS for ${oe}`)))})})).then(()=>te())};function convert(ee){return ee.type in eventConverters?eventConverters[ee.type](ee):convertEvent(ee)}const convertEvent=ee=>({bubbles:ee.bubbles,composed:ee.composed,currentTarget:convertElement(ee.currentTarget),defaultPrevented:ee.defaultPrevented,eventPhase:ee.eventPhase,isTrusted:ee.isTrusted,target:convertElement(ee.target),timeStamp:ee.timeStamp,type:ee.type,selection:convertSelection(window.getSelection())}),convertClipboardEvent=ee=>({...convertEvent(ee),clipboardData:convertDataTransferObject(ee.clipboardData)}),convertCompositionEvent=ee=>({...convertUiEvent(ee),data:ee.data}),convertInputEvent=ee=>({...convertUiEvent(ee),data:ee.data,inputType:ee.inputType,dataTransfer:convertDataTransferObject(ee.dataTransfer),isComposing:ee.isComposing}),convertKeyboardEvent=ee=>({...convertUiEvent(ee),code:ee.code,isComposing:ee.isComposing,altKey:ee.altKey,ctrlKey:ee.ctrlKey,key:ee.key,location:ee.location,metaKey:ee.metaKey,repeat:ee.repeat,shiftKey:ee.shiftKey}),convertMouseEvent=ee=>({...convertEvent(ee),altKey:ee.altKey,button:ee.button,buttons:ee.buttons,clientX:ee.clientX,clientY:ee.clientY,ctrlKey:ee.ctrlKey,metaKey:ee.metaKey,pageX:ee.pageX,pageY:ee.pageY,screenX:ee.screenX,screenY:ee.screenY,shiftKey:ee.shiftKey,movementX:ee.movementX,movementY:ee.movementY,offsetX:ee.offsetX,offsetY:ee.offsetY,x:ee.x,y:ee.y,relatedTarget:convertElement(ee.relatedTarget)}),convertTouchEvent=ee=>({...convertUiEvent(ee),altKey:ee.altKey,ctrlKey:ee.ctrlKey,metaKey:ee.metaKey,shiftKey:ee.shiftKey,touches:Array.from(ee.touches).map(convertTouch),changedTouches:Array.from(ee.changedTouches).map(convertTouch),targetTouches:Array.from(ee.targetTouches).map(convertTouch)}),convertUiEvent=ee=>({...convertEvent(ee),detail:ee.detail}),convertAnimationEvent=ee=>({...convertEvent(ee),animationName:ee.animationName,pseudoElement:ee.pseudoElement,elapsedTime:ee.elapsedTime}),convertTransitionEvent=ee=>({...convertEvent(ee),propertyName:ee.propertyName,pseudoElement:ee.pseudoElement,elapsedTime:ee.elapsedTime}),convertFocusEvent=ee=>({...convertUiEvent(ee),relatedTarget:convertElement(ee.relatedTarget)}),convertDeviceOrientationEvent=ee=>({...convertEvent(ee),absolute:ee.absolute,alpha:ee.alpha,beta:ee.beta,gamma:ee.gamma}),convertDragEvent=ee=>({...convertMouseEvent(ee),dataTransfer:convertDataTransferObject(ee.dataTransfer)}),convertGamepadEvent=ee=>({...convertEvent(ee),gamepad:convertGamepad(ee.gamepad)}),convertPointerEvent=ee=>({...convertMouseEvent(ee),pointerId:ee.pointerId,width:ee.width,height:ee.height,pressure:ee.pressure,tiltX:ee.tiltX,tiltY:ee.tiltY,pointerType:ee.pointerType,isPrimary:ee.isPrimary,tangentialPressure:ee.tangentialPressure,twist:ee.twist}),convertWheelEvent=ee=>({...convertMouseEvent(ee),deltaMode:ee.deltaMode,deltaX:ee.deltaX,deltaY:ee.deltaY,deltaZ:ee.deltaZ}),convertSubmitEvent=ee=>({...convertEvent(ee),submitter:convertElement(ee.submitter)}),eventConverters={animationcancel:convertAnimationEvent,animationend:convertAnimationEvent,animationiteration:convertAnimationEvent,animationstart:convertAnimationEvent,beforeinput:convertInputEvent,compositionend:convertCompositionEvent,compositionstart:convertCompositionEvent,compositionupdate:convertCompositionEvent,copy:convertClipboardEvent,cut:convertClipboardEvent,paste:convertClipboardEvent,deviceorientation:convertDeviceOrientationEvent,drag:convertDragEvent,dragend:convertDragEvent,dragenter:convertDragEvent,dragleave:convertDragEvent,dragover:convertDragEvent,dragstart:convertDragEvent,drop:convertDragEvent,error:convertUiEvent,blur:convertFocusEvent,focus:convertFocusEvent,focusin:convertFocusEvent,focusout:convertFocusEvent,gamepadconnected:convertGamepadEvent,gamepaddisconnected:convertGamepadEvent,keydown:convertKeyboardEvent,keypress:convertKeyboardEvent,keyup:convertKeyboardEvent,auxclick:convertMouseEvent,click:convertMouseEvent,dblclick:convertMouseEvent,contextmenu:convertMouseEvent,mousedown:convertMouseEvent,mouseenter:convertMouseEvent,mouseleave:convertMouseEvent,mousemove:convertMouseEvent,mouseout:convertMouseEvent,mouseover:convertMouseEvent,mouseup:convertMouseEvent,scroll:convertMouseEvent,gotpointercapture:convertPointerEvent,lostpointercapture:convertPointerEvent,pointercancel:convertPointerEvent,pointerdown:convertPointerEvent,pointerenter:convertPointerEvent,pointerleave:convertPointerEvent,pointerlockchange:convertPointerEvent,pointerlockerror:convertPointerEvent,pointermove:convertPointerEvent,pointerout:convertPointerEvent,pointerover:convertPointerEvent,pointerup:convertPointerEvent,submit:convertSubmitEvent,touchcancel:convertTouchEvent,touchend:convertTouchEvent,touchmove:convertTouchEvent,touchstart:convertTouchEvent,transitioncancel:convertTransitionEvent,transitionend:convertTransitionEvent,transitionrun:convertTransitionEvent,transitionstart:convertTransitionEvent,wheel:convertWheelEvent};function convertElement(ee){if(!ee||!("tagName"in ee))return null;const te=ee;return{...convertGenericElement(te),...te.tagName in elementConverters?elementConverters[te.tagName](te):{}}}const convertGenericElement=ee=>({tagName:ee.tagName,boundingClientRect:{...ee.getBoundingClientRect()}}),convertMediaElement=ee=>({currentTime:ee.currentTime,duration:ee.duration,ended:ee.ended,error:ee.error,seeking:ee.seeking,volume:ee.volume}),elementConverters={AUDIO:convertMediaElement,BUTTON:ee=>({value:ee.value}),DATA:ee=>({value:ee.value}),DATALIST:ee=>({options:Array.from(ee.options).map(elementConverters.OPTION)}),DIALOG:ee=>({returnValue:ee.returnValue}),FIELDSET:ee=>({elements:Array.from(ee.elements).map(convertElement)}),FORM:ee=>({elements:Array.from(ee.elements).map(convertElement)}),INPUT:ee=>({value:ee.value}),METER:ee=>({value:ee.value}),OPTION:ee=>({value:ee.value}),OUTPUT:ee=>({value:ee.value}),PROGRESS:ee=>({value:ee.value}),SELECT:ee=>({value:ee.value}),TEXTAREA:ee=>({value:ee.value}),VIDEO:convertMediaElement},convertGamepad=ee=>({axes:Array.from(ee.axes),buttons:Array.from(ee.buttons).map(convertGamepadButton),connected:ee.connected,id:ee.id,index:ee.index,mapping:ee.mapping,timestamp:ee.timestamp,hapticActuators:Array.from(ee.hapticActuators).map(convertGamepadHapticActuator)}),convertGamepadButton=ee=>({pressed:ee.pressed,touched:ee.touched,value:ee.value}),convertGamepadHapticActuator=ee=>({type:ee.type}),convertFile=ee=>({lastModified:ee.lastModified,name:ee.name,size:ee.size,type:ee.type});function convertDataTransferObject(ee){if(!ee)return null;const{dropEffect:te,effectAllowed:ne,files:re,items:ie,types:oe}=ee;return{dropEffect:te,effectAllowed:ne,files:Array.from(re).map(convertFile),items:Array.from(ie).map(le=>({kind:le.kind,type:le.type})),types:Array.from(oe)}}function convertSelection(ee){if(!ee)return null;const{type:te,anchorNode:ne,anchorOffset:re,focusNode:ie,focusOffset:oe,isCollapsed:le,rangeCount:ue}=ee;return te==="None"?null:{type:te,anchorNode:convertElement(ne),anchorOffset:re,focusNode:convertElement(ie),focusOffset:oe,isCollapsed:le,rangeCount:ue,selectedText:ee.toString()}}function convertTouch({identifier:ee,pageX:te,pageY:ne,screenX:re,screenY:ie,clientX:oe,clientY:le,force:ue,radiusX:se,radiusY:fe,rotationAngle:ce,target:pe}){return{identifier:ee,pageX:te,pageY:ne,screenX:re,screenY:ie,clientX:oe,clientY:le,force:ue,radiusX:se,radiusY:fe,rotationAngle:ce,target:convertElement(pe)}}async function loadImportSource(ee,te){let ne;if(ee.sourceType==="URL"?ne=await __vitePreload(()=>import(ee.source),[]):ne=await te.loadModule(ee.source),typeof ne.bind!="function")throw new Error(`${ee.source} did not export a function 'bind'`);return re=>{const ie=ne.bind(re,{sendMessage:te.sendMessage,onMessage:te.onMessage});return typeof ie.create=="function"&&typeof ie.render=="function"&&typeof ie.unmount=="function"?{render:oe=>ie.render(createImportSourceElement({client:te,module:ne,binding:ie,model:oe,currentImportSource:ee})),unmount:ie.unmount}:(console.error(`${ee.source} returned an impropper binding`),null)}}function createImportSourceElement(ee){let te;if(ee.model.importSource)if(isImportSourceEqual(ee.currentImportSource,ee.model.importSource))if(ee.module[ee.model.tagName])te=ee.module[ee.model.tagName];else return console.error("Module from source "+stringifyImportSource(ee.currentImportSource)+` does not export ${ee.model.tagName}`),null;else return console.error("Parent element import source "+stringifyImportSource(ee.currentImportSource)+" does not match child's import source "+stringifyImportSource(ee.model.importSource)),null;else te=ee.model.tagName;return ee.binding.create(te,createAttributes(ee.model,ee.client),createChildren(ee.model,ne=>createImportSourceElement({...ee,model:ne})))}function isImportSourceEqual(ee,te){return ee.source===te.source&&ee.sourceType===te.sourceType}function stringifyImportSource(ee){return JSON.stringify({source:ee.source,sourceType:ee.sourceType})}function createChildren(ee,te){return ee.children?ee.children.map(ne=>{switch(typeof ne){case"object":return te(ne);case"string":return ne}}):[]}function createAttributes(ee,te){return Object.fromEntries(Object.entries({...ee.attributes,...Object.fromEntries(Object.entries(ee.eventHandlers||{}).map(([ne,re])=>createEventHandler(te,ne,re)))}).map(normalizeAttribute))}function createEventHandler(ee,te,{target:ne,preventDefault:re,stopPropagation:ie}){return[te,function(){const oe=Array.from(arguments).map(le=>{if(!(typeof le=="object"&&le.nativeEvent))return le;const ue=le;return re&&ue.preventDefault(),ie&&ue.stopPropagation(),convert(ue.nativeEvent)});ee.sendMessage({type:"layout-event",data:oe,target:ne})}]}function normalizeAttribute([ee,te]){let ne=ee,re=te;return ee==="style"&&typeof te=="object"?re=Object.fromEntries(Object.entries(te).map(([ie,oe])=>[snakeToCamel(ie),oe])):ee.startsWith("data_")||ee.startsWith("aria_")||DASHED_HTML_ATTRS.includes(ee)?ne=ee.split("_").join("-"):ne=snakeToCamel(ee),[ne,re]}function snakeToCamel(ee){return ee.replace(/([_][a-z])/g,te=>te.toUpperCase().replace("_",""))}const DASHED_HTML_ATTRS=["accept_charset","http_equiv"],ClientContext=G$1(null);function Layout(ee){const te=h({tagName:""})[0],ne=useForceUpdate();return p(()=>(ee.client.onMessage("layout-update",({path:re,model:ie})=>{re===""?Object.assign(te,ie):jsonPointer.set(te,re,ie),ne()}),ee.client.start(),()=>ee.client.stop()),[te,ee.client]),Cn.createElement(ClientContext.Provider,{value:ee.client},Cn.createElement(Element,{model:te}))}function Element({model:ee}){if(ee.error!==void 0)return ee.error?Cn.createElement("pre",null,ee.error):null;let te;return ee.tagName in SPECIAL_ELEMENTS?te=SPECIAL_ELEMENTS[ee.tagName]:ee.importSource?te=ImportedElement:te=StandardElement,Cn.createElement(te,{model:ee})}function StandardElement({model:ee}){const te=Cn.useContext(ClientContext);return y$1(ee.tagName===""?k$2:ee.tagName,createAttributes(ee,te),...createChildren(ee,ne=>Cn.createElement(Element,{model:ne,key:ne.key})))}function UserInputElement({model:ee}){const te=q$1(ClientContext),ne=createAttributes(ee,te),[re,ie]=Cn.useState(ne.value);Cn.useEffect(()=>ie(ne.value),[ne.value]);const oe=ne.onChange;return typeof oe=="function"&&(ne.onChange=le=>{ie(le.target.value),oe(le)}),y$1(ee.tagName,{...ne,value:re},...createChildren(ee,le=>Cn.createElement(Element,{model:le,key:le.key})))}function ScriptElement({model}){const ref=_(null);return Cn.useEffect(()=>{var ee;if(!ref.current)return;const scriptContent=(ee=model==null?void 0:model.children)==null?void 0:ee.filter(te=>typeof te=="string")[0];let scriptElement;if(model.attributes){scriptElement=document.createElement("script");for(const[te,ne]of Object.entries(model.attributes))scriptElement.setAttribute(te,ne);scriptContent&&scriptElement.appendChild(document.createTextNode(scriptContent)),ref.current.appendChild(scriptElement)}else if(scriptContent){let scriptResult=eval(scriptContent);if(typeof scriptResult=="function")return scriptResult()}},[model.key,ref.current]),Cn.createElement("div",{ref})}function ImportedElement({model:ee}){const te=ee.importSource,ne=useImportSource(ee);if(!te)return null;const re=te.fallback;return te?Cn.createElement("div",{ref:ne}):re?typeof re=="string"?Cn.createElement("div",null,re):Cn.createElement(StandardElement,{model:re}):null}function useForceUpdate(){const[,ee]=h(!1);return()=>ee(te=>!te)}function useImportSource(ee){const te=ee.importSource,ne=_(null),re=Cn.useContext(ClientContext),[ie,oe]=h(null);return Cn.useEffect(()=>{let le=!1;return te&&loadImportSource(te,re).then(ue=>{!le&&ne.current&&oe(ue(ne.current))}),()=>{le=!0,ie&&te&&!te.unmountBeforeUpdate&&ie.unmount()}},[re,te,oe,ne.current]),p(()=>{if(!!(ie&&te)&&(ie.render(ee),te.unmountBeforeUpdate))return ie.unmount}),ne}const SPECIAL_ELEMENTS={input:UserInputElement,script:ScriptElement,select:UserInputElement,textarea:UserInputElement};function mount(ee,te){G(Cn.createElement(Layout,{client:te}),ee)}const logger={log:(...ee)=>console.log("[ReactPy]",...ee),warn:(...ee)=>console.warn("[ReactPy]",...ee),error:(...ee)=>console.error("[ReactPy]",...ee)};class SimpleReactPyClient{constructor(te){ge(this,"resolveShouldOpen");ge(this,"resolveShouldClose");ge(this,"urls");ge(this,"handlers");ge(this,"socket");this.handlers={"connection-open":[],"connection-close":[],"layout-update":[]},this.urls=getServerUrls(te.serverLocation||{url:document.location.origin,route:document.location.pathname,query:document.location.search}),this.resolveShouldOpen=()=>{throw new Error("Could not start client")},this.resolveShouldClose=()=>{throw new Error("Could not stop client")};const ne=new Promise(ie=>this.resolveShouldOpen=ie),re=new Promise(ie=>this.resolveShouldClose=ie);this.socket=startReconnectingWebSocket({shouldOpen:ne,shouldClose:re,url:this.urls.stream,onOpen:()=>this.handleIncoming({type:"connection-open"}),onMessage:async({data:ie})=>this.handleIncoming(JSON.parse(ie)),onClose:()=>this.handleIncoming({type:"connection-close"}),...te.reconnectOptions})}start(){logger.log("starting client..."),this.resolveShouldOpen(void 0)}stop(){logger.log("stopping client..."),this.resolveShouldClose(void 0)}onMessage(te,ne){this.handlers[te].push(ne)}sendMessage(te){var ne;(ne=this.socket.current)==null||ne.send(JSON.stringify(te))}loadModule(te){return __vitePreload(()=>import(`${this.urls.modules}/${te}`),[])}handleIncoming(te){if(!te.type){logger.warn("Received message without type",te);return}const ne=this.handlers[te.type];if(!ne){logger.warn("Received message without handler",te);return}ne.forEach(re=>re(te))}}function getServerUrls(ee){const te=new URL(`${ee.url||document.location.origin}/_reactpy`),ne=`${te}/modules`,re=`${te}/assets`,ie=`ws${te.protocol==="https:"?"s":""}`,oe=rtrim(`${te.pathname}/stream${ee.route||""}`,"/"),le=`${ie}://${te.host}${oe}${ee.query}`;return{base:te,modules:ne,assets:re,stream:le}}function startReconnectingWebSocket(ee){const{maxInterval:te=6e4,maxRetries:ne=50,backoffRate:re=1.1,intervalJitter:ie=.1}=ee,oe=750;let le=0,ue=oe,se=!1,fe=!1;const ce={},pe=()=>{se||(ce.current=new WebSocket(ee.url),ce.current.onopen=()=>{fe=!0,logger.log("client connected"),ue=oe,le=0,ee.onOpen()},ce.current.onmessage=ee.onMessage,ce.current.onclose=()=>{if(!fe){logger.log("failed to connect");return}if(logger.log("client disconnected"),ee.onClose(),le>=ne)return;const _e=addJitter(ue,ie);logger.log(`reconnecting in ${(_e/1e3).toPrecision(4)} seconds...`),setTimeout(pe,_e),ue=nextInterval(ue,re,te),le++})};return ee.shouldOpen.then(pe),ee.shouldClose.then(()=>{var _e;se=!0,(_e=ce.current)==null||_e.close()}),ce}function nextInterval(ee,te,ne){return Math.min(ee*te,ne)}function addJitter(ee,te){return ee+(Math.random()*te*ee*2-te*ee)}function rtrim(ee,te){return ee.replace(new RegExp(`${te}+$`),"")}function app(ee){const te=new SimpleReactPyClient({serverLocation:{url:document.location.origin,route:document.location.pathname,query:document.location.search}});mount(ee,te)}app(document.getElementById("app"));
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
<!
|
|
1
|
+
<!doctype html>
|
|
2
2
|
<html lang="en">
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
|
+
|
|
5
6
|
<!-- we replace this with user-provided head elements -->
|
|
6
7
|
{__head__}
|
|
7
|
-
<script type="module" crossorigin src="/_reactpy/assets/index.
|
|
8
|
+
<script type="module" crossorigin src="/_reactpy/assets/index.a1f87a11.js"></script>
|
|
8
9
|
</head>
|
|
9
10
|
<body>
|
|
10
11
|
<div id="app"></div>
|
|
11
|
-
|
|
12
12
|
</body>
|
|
13
13
|
</html>
|