reflex-react-joyride 0.2.0__tar.gz → 0.3.0__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.
- reflex_react_joyride-0.3.0/.gitignore +245 -0
- reflex_react_joyride-0.3.0/.nvmrc +1 -0
- reflex_react_joyride-0.3.0/.pre-commit-config.yaml +26 -0
- reflex_react_joyride-0.3.0/.python-version +1 -0
- reflex_react_joyride-0.3.0/AGENTS.md +67 -0
- reflex_react_joyride-0.3.0/CHANGELOG.md +69 -0
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/PKG-INFO +43 -32
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/README.md +35 -23
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/pyproject.toml +30 -14
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/joyride.py +7 -7
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/joyride.pyi +9 -6
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/props.py +79 -79
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/tests/test_component.py +28 -2
- reflex_react_joyride-0.3.0/uv.lock +1037 -0
- reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/PKG-INFO +0 -383
- reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/SOURCES.txt +0 -21
- reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/dependency_links.txt +0 -1
- reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/requires.txt +0 -1
- reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/top_level.txt +0 -1
- reflex_react_joyride-0.2.0/setup.cfg +0 -4
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/LICENSE +0 -0
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/__init__.py +0 -0
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/actions.py +0 -0
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/constants.py +0 -0
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/events.py +0 -0
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/joyride_tour.jsx +0 -0
- {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/py.typed +0 -0
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/tests/test_actions.py +0 -0
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/tests/test_constants.py +0 -0
- {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/tests/test_props.py +0 -0
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
# Byte-compiled / optimized / DLL files
|
|
2
|
+
__pycache__/
|
|
3
|
+
*.py[codz]
|
|
4
|
+
*$py.class
|
|
5
|
+
|
|
6
|
+
# C extensions
|
|
7
|
+
*.so
|
|
8
|
+
|
|
9
|
+
# Distribution / packaging
|
|
10
|
+
.Python
|
|
11
|
+
build/
|
|
12
|
+
develop-eggs/
|
|
13
|
+
dist/
|
|
14
|
+
downloads/
|
|
15
|
+
eggs/
|
|
16
|
+
.eggs/
|
|
17
|
+
lib/
|
|
18
|
+
lib64/
|
|
19
|
+
parts/
|
|
20
|
+
sdist/
|
|
21
|
+
var/
|
|
22
|
+
wheels/
|
|
23
|
+
share/python-wheels/
|
|
24
|
+
*.egg-info/
|
|
25
|
+
.installed.cfg
|
|
26
|
+
*.egg
|
|
27
|
+
MANIFEST
|
|
28
|
+
|
|
29
|
+
# PyInstaller
|
|
30
|
+
# Usually these files are written by a python script from a template
|
|
31
|
+
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
32
|
+
*.manifest
|
|
33
|
+
*.spec
|
|
34
|
+
|
|
35
|
+
# Installer logs
|
|
36
|
+
pip-log.txt
|
|
37
|
+
pip-delete-this-directory.txt
|
|
38
|
+
|
|
39
|
+
# Unit test / coverage reports
|
|
40
|
+
htmlcov/
|
|
41
|
+
.tox/
|
|
42
|
+
.nox/
|
|
43
|
+
.coverage
|
|
44
|
+
.coverage.*
|
|
45
|
+
.cache
|
|
46
|
+
nosetests.xml
|
|
47
|
+
coverage.xml
|
|
48
|
+
*.cover
|
|
49
|
+
*.py.cover
|
|
50
|
+
.hypothesis/
|
|
51
|
+
.pytest_cache/
|
|
52
|
+
cover/
|
|
53
|
+
|
|
54
|
+
# Translations
|
|
55
|
+
*.mo
|
|
56
|
+
*.pot
|
|
57
|
+
|
|
58
|
+
# Django stuff:
|
|
59
|
+
*.log
|
|
60
|
+
local_settings.py
|
|
61
|
+
db.sqlite3
|
|
62
|
+
db.sqlite3-journal
|
|
63
|
+
|
|
64
|
+
# Flask stuff:
|
|
65
|
+
instance/
|
|
66
|
+
.webassets-cache
|
|
67
|
+
|
|
68
|
+
# Scrapy stuff:
|
|
69
|
+
.scrapy
|
|
70
|
+
|
|
71
|
+
# Sphinx documentation
|
|
72
|
+
docs/_build/
|
|
73
|
+
|
|
74
|
+
# PyBuilder
|
|
75
|
+
.pybuilder/
|
|
76
|
+
target/
|
|
77
|
+
|
|
78
|
+
# Jupyter Notebook
|
|
79
|
+
.ipynb_checkpoints
|
|
80
|
+
|
|
81
|
+
# IPython
|
|
82
|
+
profile_default/
|
|
83
|
+
ipython_config.py
|
|
84
|
+
|
|
85
|
+
# pyenv
|
|
86
|
+
# For a library or package, you might want to ignore these files since the code is
|
|
87
|
+
# intended to run in multiple environments; otherwise, check them in:
|
|
88
|
+
# .python-version
|
|
89
|
+
|
|
90
|
+
# pipenv
|
|
91
|
+
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
92
|
+
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
93
|
+
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
94
|
+
# install all needed dependencies.
|
|
95
|
+
# Pipfile.lock
|
|
96
|
+
|
|
97
|
+
# UV
|
|
98
|
+
# Similar to Pipfile.lock, it is generally recommended to include uv.lock in version control.
|
|
99
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
100
|
+
# commonly ignored for libraries.
|
|
101
|
+
# uv.lock
|
|
102
|
+
|
|
103
|
+
# poetry
|
|
104
|
+
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
105
|
+
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
106
|
+
# commonly ignored for libraries.
|
|
107
|
+
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
108
|
+
# poetry.lock
|
|
109
|
+
# poetry.toml
|
|
110
|
+
|
|
111
|
+
# pdm
|
|
112
|
+
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
113
|
+
# pdm recommends including project-wide configuration in pdm.toml, but excluding .pdm-python.
|
|
114
|
+
# https://pdm-project.org/en/latest/usage/project/#working-with-version-control
|
|
115
|
+
# pdm.lock
|
|
116
|
+
# pdm.toml
|
|
117
|
+
.pdm-python
|
|
118
|
+
.pdm-build/
|
|
119
|
+
|
|
120
|
+
# pixi
|
|
121
|
+
# Similar to Pipfile.lock, it is generally recommended to include pixi.lock in version control.
|
|
122
|
+
# pixi.lock
|
|
123
|
+
# Pixi creates a virtual environment in the .pixi directory, just like venv module creates one
|
|
124
|
+
# in the .venv directory. It is recommended not to include this directory in version control.
|
|
125
|
+
.pixi
|
|
126
|
+
|
|
127
|
+
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
128
|
+
__pypackages__/
|
|
129
|
+
|
|
130
|
+
# Celery stuff
|
|
131
|
+
celerybeat-schedule
|
|
132
|
+
celerybeat.pid
|
|
133
|
+
|
|
134
|
+
# Redis
|
|
135
|
+
*.rdb
|
|
136
|
+
*.aof
|
|
137
|
+
*.pid
|
|
138
|
+
|
|
139
|
+
# RabbitMQ
|
|
140
|
+
mnesia/
|
|
141
|
+
rabbitmq/
|
|
142
|
+
rabbitmq-data/
|
|
143
|
+
|
|
144
|
+
# ActiveMQ
|
|
145
|
+
activemq-data/
|
|
146
|
+
|
|
147
|
+
# SageMath parsed files
|
|
148
|
+
*.sage.py
|
|
149
|
+
|
|
150
|
+
# Environments
|
|
151
|
+
.env
|
|
152
|
+
.envrc
|
|
153
|
+
.venv
|
|
154
|
+
env/
|
|
155
|
+
venv/
|
|
156
|
+
ENV/
|
|
157
|
+
env.bak/
|
|
158
|
+
venv.bak/
|
|
159
|
+
|
|
160
|
+
# Spyder project settings
|
|
161
|
+
.spyderproject
|
|
162
|
+
.spyproject
|
|
163
|
+
|
|
164
|
+
# Rope project settings
|
|
165
|
+
.ropeproject
|
|
166
|
+
|
|
167
|
+
# mkdocs documentation
|
|
168
|
+
/site
|
|
169
|
+
|
|
170
|
+
# mypy
|
|
171
|
+
.mypy_cache/
|
|
172
|
+
.dmypy.json
|
|
173
|
+
dmypy.json
|
|
174
|
+
|
|
175
|
+
# Pyre type checker
|
|
176
|
+
.pyre/
|
|
177
|
+
|
|
178
|
+
# pytype static type analyzer
|
|
179
|
+
.pytype/
|
|
180
|
+
|
|
181
|
+
# Cython debug symbols
|
|
182
|
+
cython_debug/
|
|
183
|
+
|
|
184
|
+
# PyCharm
|
|
185
|
+
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
186
|
+
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
187
|
+
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
188
|
+
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
189
|
+
# .idea/
|
|
190
|
+
|
|
191
|
+
# Abstra
|
|
192
|
+
# Abstra is an AI-powered process automation framework.
|
|
193
|
+
# Ignore directories containing user credentials, local state, and settings.
|
|
194
|
+
# Learn more at https://abstra.io/docs
|
|
195
|
+
.abstra/
|
|
196
|
+
|
|
197
|
+
# Visual Studio Code
|
|
198
|
+
# Visual Studio Code specific template is maintained in a separate VisualStudioCode.gitignore
|
|
199
|
+
# that can be found at https://github.com/github/gitignore/blob/main/Global/VisualStudioCode.gitignore
|
|
200
|
+
# and can be added to the global gitignore or merged into this file. However, if you prefer,
|
|
201
|
+
# you could uncomment the following to ignore the entire vscode folder
|
|
202
|
+
# .vscode/
|
|
203
|
+
# Temporary file for partial code execution
|
|
204
|
+
tempCodeRunnerFile.py
|
|
205
|
+
|
|
206
|
+
# Ruff stuff:
|
|
207
|
+
.ruff_cache/
|
|
208
|
+
|
|
209
|
+
# PyPI configuration file
|
|
210
|
+
.pypirc
|
|
211
|
+
|
|
212
|
+
# Marimo
|
|
213
|
+
marimo/_static/
|
|
214
|
+
marimo/_lsp/
|
|
215
|
+
__marimo__/
|
|
216
|
+
|
|
217
|
+
# Streamlit
|
|
218
|
+
.streamlit/secrets.toml
|
|
219
|
+
|
|
220
|
+
# ---------------------------------------------------------------- reflex-react-joyride
|
|
221
|
+
# Compiled frontend and Reflex state, in the demo app and anywhere a component
|
|
222
|
+
# is rendered from the repo root.
|
|
223
|
+
.web/
|
|
224
|
+
.states/
|
|
225
|
+
reflex.lock
|
|
226
|
+
assets/external/
|
|
227
|
+
/assets/
|
|
228
|
+
|
|
229
|
+
# Local tooling: the venv, uv/bun/npm caches and the interpreters used to run
|
|
230
|
+
# the demo from this checkout.
|
|
231
|
+
.devtools/
|
|
232
|
+
.ruff_cache/
|
|
233
|
+
|
|
234
|
+
# IDE settings and local agent output.
|
|
235
|
+
.idea/
|
|
236
|
+
Claude outputs/
|
|
237
|
+
|
|
238
|
+
# Generated at build time by hatch-reflex-pyi. Running the stub generator from
|
|
239
|
+
# src/ also makes rx.asset(shared=True) symlink the JSX wrapper into src/assets/,
|
|
240
|
+
# which must never reach the sdist.
|
|
241
|
+
src/**/*.pyi
|
|
242
|
+
src/assets/
|
|
243
|
+
|
|
244
|
+
# The demo's frontend lockfile, regenerated by `reflex compile`.
|
|
245
|
+
demo/reflex.lock/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
24
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
repos:
|
|
2
|
+
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
3
|
+
rev: v6.0.0
|
|
4
|
+
hooks:
|
|
5
|
+
- id: check-toml
|
|
6
|
+
- id: check-yaml
|
|
7
|
+
- id: end-of-file-fixer
|
|
8
|
+
exclude: ^docs/screenshots/
|
|
9
|
+
- id: trailing-whitespace
|
|
10
|
+
|
|
11
|
+
# Keep this rev in step with the ruff version in uv.lock.
|
|
12
|
+
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
13
|
+
rev: v0.17.2
|
|
14
|
+
hooks:
|
|
15
|
+
- id: ruff-check
|
|
16
|
+
args: [--fix]
|
|
17
|
+
- id: ruff-format
|
|
18
|
+
|
|
19
|
+
- repo: local
|
|
20
|
+
hooks:
|
|
21
|
+
- id: pyright
|
|
22
|
+
name: pyright
|
|
23
|
+
entry: uv run pyright
|
|
24
|
+
language: system
|
|
25
|
+
types: [python]
|
|
26
|
+
pass_filenames: false
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
3.14
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
This repository is a Python package that wraps
|
|
4
|
+
[react-joyride](https://react-joyride.com) as a Reflex component. The package
|
|
5
|
+
lives in `src/reflex_react_joyride/`; `demo/` is a Reflex app for trying it.
|
|
6
|
+
The layout follows Reflex's official
|
|
7
|
+
[component template](https://github.com/reflex-dev/component-template).
|
|
8
|
+
|
|
9
|
+
## Commands
|
|
10
|
+
|
|
11
|
+
| Task | Command |
|
|
12
|
+
|---|---|
|
|
13
|
+
| Install | `uv sync` |
|
|
14
|
+
| Lint, format, type-check | `uv run pre-commit run --all-files` |
|
|
15
|
+
| Test | `uv run pytest` |
|
|
16
|
+
| Regenerate the `.pyi` stub | `cd src && uv run python -m reflex_base.utils.pyi_generator reflex_react_joyride && rm -rf assets` |
|
|
17
|
+
| Build (generates `.pyi` stubs) | `rm -rf dist && uv build` |
|
|
18
|
+
| Run the demo | `cd demo && uv run reflex run` |
|
|
19
|
+
| Check the demo compiles | `cd demo && uv run reflex compile` |
|
|
20
|
+
|
|
21
|
+
Run the lint and test commands before every commit.
|
|
22
|
+
|
|
23
|
+
## How the component is built
|
|
24
|
+
|
|
25
|
+
- `joyride.py` defines `Joyride`, an `rx.NoSSRComponent` (react-joyride
|
|
26
|
+
touches `window`). Its `library` is not the npm package directly but the
|
|
27
|
+
local wrapper `joyride_tour.jsx`, shipped as a package asset, which calls
|
|
28
|
+
react-joyride's `useJoyride` hook; react-joyride itself is pinned through
|
|
29
|
+
`lib_dependencies` to `JOYRIDE_VERSION` in `constants.py`.
|
|
30
|
+
- Do not name a module `component.py`, `app.py` or any other name in
|
|
31
|
+
`EXCLUDED_FILES` in `reflex_base.utils.pyi_generator`: the stub generator
|
|
32
|
+
skips those files silently.
|
|
33
|
+
- Props are `rx.Var[...]` class attributes. Reflex sends snake_case names to
|
|
34
|
+
React as camelCase. Structured props (`Step`, `TourOptions`, `Locale`,
|
|
35
|
+
`TourStyles`, `FloatingOptions`) are `rx.PropsBase` classes in `props.py`;
|
|
36
|
+
give every field a `= None` default so type checkers accept partial
|
|
37
|
+
construction.
|
|
38
|
+
- Events are `rx.EventHandler[spec]` attributes; every trigger receives the
|
|
39
|
+
flat `JoyrideEvent` payload from `events.py`.
|
|
40
|
+
- `actions.py` holds the Python-side controls (`start`, `next_step`, ...),
|
|
41
|
+
which call into the wrapper through the tour id.
|
|
42
|
+
- Export every public name from `__init__.py`.
|
|
43
|
+
- After changing the JSX wrapper or `library`/`tag`, load the demo in a
|
|
44
|
+
browser: a broken import can compile and only fail at render.
|
|
45
|
+
|
|
46
|
+
Reference: https://reflex.dev/docs/wrapping-react/overview/
|
|
47
|
+
|
|
48
|
+
## Stubs
|
|
49
|
+
|
|
50
|
+
`.pyi` files are generated by the `hatch-reflex-pyi` build hook during
|
|
51
|
+
`uv build` (and on the first `uv sync`) so editors see each prop as a keyword
|
|
52
|
+
argument. They are git-ignored; do not write them by hand. The hook skips
|
|
53
|
+
generation when it already built the same version, so regenerate the stub with
|
|
54
|
+
the command above after changing props.
|
|
55
|
+
|
|
56
|
+
## Tests
|
|
57
|
+
|
|
58
|
+
Tests live in `tests/` and check what the component imports and how it renders
|
|
59
|
+
(`str(component)` is the generated JSX). Add a test for each new prop or event.
|
|
60
|
+
|
|
61
|
+
## Releasing
|
|
62
|
+
|
|
63
|
+
Versions come from git tags (`uv-dynamic-versioning`); there is no version in
|
|
64
|
+
`pyproject.toml`. Merge `develop` into `main`, then push a tag `vX.Y.Z` on
|
|
65
|
+
`main`: `.github/workflows/release.yml` tests, builds and publishes to PyPI
|
|
66
|
+
through trusted publishing. Do not rename that workflow file or its `pypi`
|
|
67
|
+
environment, PyPI's trusted publisher is bound to them.
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Changelog
|
|
2
|
+
|
|
3
|
+
All notable changes to this project are documented here. The format follows
|
|
4
|
+
[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project uses
|
|
5
|
+
[Semantic Versioning](https://semver.org/).
|
|
6
|
+
|
|
7
|
+
## [0.3.0] - 2026-10-25
|
|
8
|
+
|
|
9
|
+
### Changed
|
|
10
|
+
|
|
11
|
+
- Migrated to the layout of Reflex's official
|
|
12
|
+
[component template](https://github.com/reflex-dev/component-template):
|
|
13
|
+
- the package moved from `custom_components/` to `src/reflex_react_joyride/`
|
|
14
|
+
and the demo app from `react_joyride_demo/` to `demo/`;
|
|
15
|
+
- builds with hatchling instead of setuptools;
|
|
16
|
+
- the version comes from the git tag (`uv-dynamic-versioning`) and is no
|
|
17
|
+
longer written in `pyproject.toml`;
|
|
18
|
+
- the `.pyi` stubs are generated at build time by `hatch-reflex-pyi` and are
|
|
19
|
+
no longer committed;
|
|
20
|
+
- pre-commit runs ruff, pyright and file checks; new `AGENTS.md`.
|
|
21
|
+
- Python 3.14 is supported and tested.
|
|
22
|
+
- CI runs pre-commit (with pyright) instead of bare ruff, and the release
|
|
23
|
+
workflow checks that the built version matches the tag and that the wheel
|
|
24
|
+
ships the stub.
|
|
25
|
+
|
|
26
|
+
### Fixed
|
|
27
|
+
|
|
28
|
+
- Type checkers no longer require every field of `Step`, `TourOptions`,
|
|
29
|
+
`Locale`, `TourStyles`, `FloatingOptions` and `SpotlightPadding`: all fields
|
|
30
|
+
default to `None`, so `TourOptions(z_index=1000)` type-checks. Serialization
|
|
31
|
+
is unchanged.
|
|
32
|
+
- `steps` is typed as a sequence of `Step` objects or dicts, so passing
|
|
33
|
+
`[rjr.Step(...)]` or a `list[dict]` State var no longer shows a type error.
|
|
34
|
+
- `options`, `locale`, `styles` and `floating_options` accept their typed
|
|
35
|
+
objects (`TourOptions`, `Locale`, `TourStyles`, `FloatingOptions`) in the
|
|
36
|
+
stubs, matching the documented usage.
|
|
37
|
+
|
|
38
|
+
## [0.2.0] - 2026-10-25
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- Requires **Reflex 0.10.0** or newer (was 0.9.11).
|
|
43
|
+
- Requires **Python 3.11** or newer; Python 3.10 is no longer supported, in
|
|
44
|
+
line with Reflex 0.10.
|
|
45
|
+
- Build backend requires `setuptools>=78.1.1`.
|
|
46
|
+
- CI and release workflows use Node 24 (`.nvmrc`), and every JavaScript action
|
|
47
|
+
is forced onto the Node 24 runtime.
|
|
48
|
+
- The release workflow only publishes tags that point to a commit on `main`.
|
|
49
|
+
- `reflex component build` no longer exists in Reflex 0.10: build with
|
|
50
|
+
`uv build` and regenerate the `.pyi` stubs with
|
|
51
|
+
`python -m reflex_base.utils.pyi_generator` (see the README).
|
|
52
|
+
- Regenerated `joyride.pyi`, so the `tooltip` docstring matches the source.
|
|
53
|
+
|
|
54
|
+
### Unchanged
|
|
55
|
+
|
|
56
|
+
- The Python API (`joyride`, props, actions, events and constants) and the
|
|
57
|
+
bundled react-joyride 3.2.0 are the same as in 0.1.0.
|
|
58
|
+
|
|
59
|
+
## [0.1.0] - 2026-09-17
|
|
60
|
+
|
|
61
|
+
### Added
|
|
62
|
+
|
|
63
|
+
- First release: Reflex wrapper for react-joyride 3.2.0 with typed props,
|
|
64
|
+
controlled and uncontrolled modes, Python actions, per-event triggers,
|
|
65
|
+
custom tooltip and beacon components, and a four page demo app.
|
|
66
|
+
|
|
67
|
+
[0.3.0]: https://github.com/ecrespo/reflex-react-joyride/compare/v0.2.0...v0.3.0
|
|
68
|
+
[0.2.0]: https://github.com/ecrespo/reflex-react-joyride/compare/v0.1.0...v0.2.0
|
|
69
|
+
[0.1.0]: https://github.com/ecrespo/reflex-react-joyride/releases/tag/v0.1.0
|
|
@@ -1,29 +1,28 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
1
|
+
Metadata-Version: 2.5
|
|
2
2
|
Name: reflex-react-joyride
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: Reflex custom component for react-joyride: guided product tours and onboarding walkthroughs, with controlled mode, theming, custom tooltips and Python-driven controls
|
|
5
|
-
Author-email: Ernesto Crespo <ecrespo@gmail.com>
|
|
6
|
-
License: MIT
|
|
7
5
|
Project-URL: Homepage, https://github.com/ecrespo/reflex-react-joyride
|
|
8
6
|
Project-URL: Source, https://github.com/ecrespo/reflex-react-joyride
|
|
9
7
|
Project-URL: Issues, https://github.com/ecrespo/reflex-react-joyride/issues
|
|
10
|
-
|
|
8
|
+
Author-email: Ernesto Crespo <ecrespo@gmail.com>
|
|
9
|
+
License-Expression: MIT
|
|
10
|
+
License-File: LICENSE
|
|
11
|
+
Keywords: joyride,onboarding,product-tour,react-joyride,reflex,reflex-custom-components,tour,walkthrough
|
|
11
12
|
Classifier: Development Status :: 4 - Beta
|
|
12
13
|
Classifier: Environment :: Web Environment
|
|
13
14
|
Classifier: Intended Audience :: Developers
|
|
14
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
16
|
Classifier: Programming Language :: Python :: 3.11
|
|
17
17
|
Classifier: Programming Language :: Python :: 3.12
|
|
18
18
|
Classifier: Programming Language :: Python :: 3.13
|
|
19
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
19
20
|
Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
20
21
|
Classifier: Topic :: Software Development :: User Interfaces
|
|
21
22
|
Classifier: Typing :: Typed
|
|
22
23
|
Requires-Python: >=3.11
|
|
23
|
-
Description-Content-Type: text/markdown
|
|
24
|
-
License-File: LICENSE
|
|
25
24
|
Requires-Dist: reflex>=0.10.0
|
|
26
|
-
|
|
25
|
+
Description-Content-Type: text/markdown
|
|
27
26
|
|
|
28
27
|
# reflex-react-joyride
|
|
29
28
|
|
|
@@ -55,13 +54,13 @@ The four pages of the demo app, in order:
|
|
|
55
54
|
|
|
56
55
|
| | Version |
|
|
57
56
|
| --- | --- |
|
|
58
|
-
| Python | 3.11
|
|
57
|
+
| Python | 3.11 to 3.14 |
|
|
59
58
|
| Reflex | **0.10.0** or newer |
|
|
60
59
|
| react-joyride | 3.2.0 (bundled, installed by Reflex on first compile) |
|
|
61
60
|
| Node.js (development and CI only) | 24 LTS, pinned in `.nvmrc` |
|
|
62
61
|
|
|
63
|
-
> **Upgrading from 0.1.x:** 0.2.0
|
|
64
|
-
> following Reflex itself. The Python API is unchanged. See the
|
|
62
|
+
> **Upgrading from 0.1.x:** 0.2.0 and later require Reflex 0.10 and drop
|
|
63
|
+
> Python 3.10, following Reflex itself. The Python API is unchanged. See the
|
|
65
64
|
> [changelog](CHANGELOG.md).
|
|
66
65
|
|
|
67
66
|
## Installation
|
|
@@ -327,56 +326,68 @@ usually exactly what you want.
|
|
|
327
326
|
|
|
328
327
|
## Demo app
|
|
329
328
|
|
|
330
|
-
The `
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
interaction):
|
|
329
|
+
The `demo/` folder is a four page Reflex app covering the basics, controlled
|
|
330
|
+
mode, theming with a Reflex tooltip, and the awkward cases (targets that appear
|
|
331
|
+
late or never, spotlight targets, scrolling, modal steps, blocked interaction):
|
|
334
332
|
|
|
335
333
|
```bash
|
|
336
334
|
uv sync
|
|
337
|
-
cd
|
|
335
|
+
cd demo
|
|
338
336
|
uv run reflex run
|
|
339
337
|
```
|
|
340
338
|
|
|
341
339
|
## Development
|
|
342
340
|
|
|
341
|
+
The project follows the layout of Reflex's official
|
|
342
|
+
[component template](https://github.com/reflex-dev/component-template): the
|
|
343
|
+
package lives in `src/reflex_react_joyride/`, it builds with hatchling, the
|
|
344
|
+
version comes from the git tag, and the `.pyi` stubs are generated at build
|
|
345
|
+
time by `hatch-reflex-pyi` instead of being committed.
|
|
346
|
+
|
|
343
347
|
```bash
|
|
344
|
-
uv sync
|
|
348
|
+
uv sync # creates .venv, installs the package in editable mode
|
|
349
|
+
uv run pre-commit install # once: ruff, pyright and file checks on every commit
|
|
350
|
+
uv run pre-commit run --all-files # lint, format and type-check
|
|
345
351
|
uv run pytest
|
|
346
|
-
uv
|
|
347
|
-
uv run ruff format --check .
|
|
348
|
-
uv build # builds the sdist and wheel into dist/
|
|
352
|
+
rm -rf dist && uv build # sdist and wheel, stubs included, into dist/
|
|
349
353
|
```
|
|
350
354
|
|
|
351
|
-
`
|
|
352
|
-
|
|
355
|
+
`uv sync` writes `src/reflex_react_joyride/joyride.pyi` the first time (it is
|
|
356
|
+
git-ignored). The build hook skips generation when the version hasn't changed,
|
|
357
|
+
so after changing the component's props regenerate the stub yourself, and
|
|
358
|
+
always build into an empty `dist/`:
|
|
353
359
|
|
|
354
360
|
```bash
|
|
355
|
-
uv run python -m reflex_base.utils.pyi_generator
|
|
361
|
+
cd src && uv run python -m reflex_base.utils.pyi_generator reflex_react_joyride && rm -rf assets
|
|
356
362
|
```
|
|
357
363
|
|
|
364
|
+
`reflex component init/build` no longer exist in Reflex 0.10; the template and
|
|
365
|
+
the commands above replace them. See [`AGENTS.md`](AGENTS.md) for the
|
|
366
|
+
conventions coding agents (and humans) should follow.
|
|
367
|
+
|
|
358
368
|
CI runs on Node 24 (`.nvmrc`); use the same version locally (`nvm use`) if you
|
|
359
369
|
compile the demo with Node instead of Bun.
|
|
360
370
|
|
|
361
371
|
## Releasing
|
|
362
372
|
|
|
363
|
-
|
|
364
|
-
|
|
373
|
+
The version is not written anywhere in the code: it comes from the git tag
|
|
374
|
+
(`uv-dynamic-versioning`). Releases are published to PyPI by the `Release`
|
|
375
|
+
workflow through Trusted Publishing, so no token is stored anywhere:
|
|
365
376
|
|
|
366
|
-
1. On `develop`,
|
|
367
|
-
`CHANGELOG.md`.
|
|
377
|
+
1. On `develop`, add an entry to `CHANGELOG.md`.
|
|
368
378
|
2. Open a PR from `develop` to `main` and merge it once the Quality and
|
|
369
379
|
Security workflows pass.
|
|
370
380
|
3. Tag the merge commit on `main` and push the tag:
|
|
371
381
|
|
|
372
382
|
```bash
|
|
373
383
|
git switch main && git pull
|
|
374
|
-
git tag v0.
|
|
384
|
+
git tag v0.3.0 && git push origin v0.3.0
|
|
375
385
|
```
|
|
376
386
|
|
|
377
|
-
The workflow refuses tags that are not on `main
|
|
378
|
-
|
|
379
|
-
build provenance attestations and creates the
|
|
387
|
+
The workflow refuses tags that are not on `main`, runs the tests, builds,
|
|
388
|
+
checks that the built version matches the tag and that the stubs are in the
|
|
389
|
+
wheel, publishes to PyPI with build provenance attestations and creates the
|
|
390
|
+
GitHub release.
|
|
380
391
|
|
|
381
392
|
## License
|
|
382
393
|
|
|
@@ -28,13 +28,13 @@ The four pages of the demo app, in order:
|
|
|
28
28
|
|
|
29
29
|
| | Version |
|
|
30
30
|
| --- | --- |
|
|
31
|
-
| Python | 3.11
|
|
31
|
+
| Python | 3.11 to 3.14 |
|
|
32
32
|
| Reflex | **0.10.0** or newer |
|
|
33
33
|
| react-joyride | 3.2.0 (bundled, installed by Reflex on first compile) |
|
|
34
34
|
| Node.js (development and CI only) | 24 LTS, pinned in `.nvmrc` |
|
|
35
35
|
|
|
36
|
-
> **Upgrading from 0.1.x:** 0.2.0
|
|
37
|
-
> following Reflex itself. The Python API is unchanged. See the
|
|
36
|
+
> **Upgrading from 0.1.x:** 0.2.0 and later require Reflex 0.10 and drop
|
|
37
|
+
> Python 3.10, following Reflex itself. The Python API is unchanged. See the
|
|
38
38
|
> [changelog](CHANGELOG.md).
|
|
39
39
|
|
|
40
40
|
## Installation
|
|
@@ -300,56 +300,68 @@ usually exactly what you want.
|
|
|
300
300
|
|
|
301
301
|
## Demo app
|
|
302
302
|
|
|
303
|
-
The `
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
interaction):
|
|
303
|
+
The `demo/` folder is a four page Reflex app covering the basics, controlled
|
|
304
|
+
mode, theming with a Reflex tooltip, and the awkward cases (targets that appear
|
|
305
|
+
late or never, spotlight targets, scrolling, modal steps, blocked interaction):
|
|
307
306
|
|
|
308
307
|
```bash
|
|
309
308
|
uv sync
|
|
310
|
-
cd
|
|
309
|
+
cd demo
|
|
311
310
|
uv run reflex run
|
|
312
311
|
```
|
|
313
312
|
|
|
314
313
|
## Development
|
|
315
314
|
|
|
315
|
+
The project follows the layout of Reflex's official
|
|
316
|
+
[component template](https://github.com/reflex-dev/component-template): the
|
|
317
|
+
package lives in `src/reflex_react_joyride/`, it builds with hatchling, the
|
|
318
|
+
version comes from the git tag, and the `.pyi` stubs are generated at build
|
|
319
|
+
time by `hatch-reflex-pyi` instead of being committed.
|
|
320
|
+
|
|
316
321
|
```bash
|
|
317
|
-
uv sync
|
|
322
|
+
uv sync # creates .venv, installs the package in editable mode
|
|
323
|
+
uv run pre-commit install # once: ruff, pyright and file checks on every commit
|
|
324
|
+
uv run pre-commit run --all-files # lint, format and type-check
|
|
318
325
|
uv run pytest
|
|
319
|
-
uv
|
|
320
|
-
uv run ruff format --check .
|
|
321
|
-
uv build # builds the sdist and wheel into dist/
|
|
326
|
+
rm -rf dist && uv build # sdist and wheel, stubs included, into dist/
|
|
322
327
|
```
|
|
323
328
|
|
|
324
|
-
`
|
|
325
|
-
|
|
329
|
+
`uv sync` writes `src/reflex_react_joyride/joyride.pyi` the first time (it is
|
|
330
|
+
git-ignored). The build hook skips generation when the version hasn't changed,
|
|
331
|
+
so after changing the component's props regenerate the stub yourself, and
|
|
332
|
+
always build into an empty `dist/`:
|
|
326
333
|
|
|
327
334
|
```bash
|
|
328
|
-
uv run python -m reflex_base.utils.pyi_generator
|
|
335
|
+
cd src && uv run python -m reflex_base.utils.pyi_generator reflex_react_joyride && rm -rf assets
|
|
329
336
|
```
|
|
330
337
|
|
|
338
|
+
`reflex component init/build` no longer exist in Reflex 0.10; the template and
|
|
339
|
+
the commands above replace them. See [`AGENTS.md`](AGENTS.md) for the
|
|
340
|
+
conventions coding agents (and humans) should follow.
|
|
341
|
+
|
|
331
342
|
CI runs on Node 24 (`.nvmrc`); use the same version locally (`nvm use`) if you
|
|
332
343
|
compile the demo with Node instead of Bun.
|
|
333
344
|
|
|
334
345
|
## Releasing
|
|
335
346
|
|
|
336
|
-
|
|
337
|
-
|
|
347
|
+
The version is not written anywhere in the code: it comes from the git tag
|
|
348
|
+
(`uv-dynamic-versioning`). Releases are published to PyPI by the `Release`
|
|
349
|
+
workflow through Trusted Publishing, so no token is stored anywhere:
|
|
338
350
|
|
|
339
|
-
1. On `develop`,
|
|
340
|
-
`CHANGELOG.md`.
|
|
351
|
+
1. On `develop`, add an entry to `CHANGELOG.md`.
|
|
341
352
|
2. Open a PR from `develop` to `main` and merge it once the Quality and
|
|
342
353
|
Security workflows pass.
|
|
343
354
|
3. Tag the merge commit on `main` and push the tag:
|
|
344
355
|
|
|
345
356
|
```bash
|
|
346
357
|
git switch main && git pull
|
|
347
|
-
git tag v0.
|
|
358
|
+
git tag v0.3.0 && git push origin v0.3.0
|
|
348
359
|
```
|
|
349
360
|
|
|
350
|
-
The workflow refuses tags that are not on `main
|
|
351
|
-
|
|
352
|
-
build provenance attestations and creates the
|
|
361
|
+
The workflow refuses tags that are not on `main`, runs the tests, builds,
|
|
362
|
+
checks that the built version matches the tag and that the stubs are in the
|
|
363
|
+
wheel, publishes to PyPI with build provenance attestations and creates the
|
|
364
|
+
GitHub release.
|
|
353
365
|
|
|
354
366
|
## License
|
|
355
367
|
|