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.
Files changed (30) hide show
  1. reflex_react_joyride-0.3.0/.gitignore +245 -0
  2. reflex_react_joyride-0.3.0/.nvmrc +1 -0
  3. reflex_react_joyride-0.3.0/.pre-commit-config.yaml +26 -0
  4. reflex_react_joyride-0.3.0/.python-version +1 -0
  5. reflex_react_joyride-0.3.0/AGENTS.md +67 -0
  6. reflex_react_joyride-0.3.0/CHANGELOG.md +69 -0
  7. {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/PKG-INFO +43 -32
  8. {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/README.md +35 -23
  9. {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/pyproject.toml +30 -14
  10. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/joyride.py +7 -7
  11. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/joyride.pyi +9 -6
  12. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/props.py +79 -79
  13. {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/tests/test_component.py +28 -2
  14. reflex_react_joyride-0.3.0/uv.lock +1037 -0
  15. reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/PKG-INFO +0 -383
  16. reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/SOURCES.txt +0 -21
  17. reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/dependency_links.txt +0 -1
  18. reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/requires.txt +0 -1
  19. reflex_react_joyride-0.2.0/custom_components/reflex_react_joyride.egg-info/top_level.txt +0 -1
  20. reflex_react_joyride-0.2.0/setup.cfg +0 -4
  21. {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/LICENSE +0 -0
  22. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/__init__.py +0 -0
  23. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/actions.py +0 -0
  24. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/constants.py +0 -0
  25. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/events.py +0 -0
  26. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/joyride_tour.jsx +0 -0
  27. {reflex_react_joyride-0.2.0/custom_components → reflex_react_joyride-0.3.0/src}/reflex_react_joyride/py.typed +0 -0
  28. {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/tests/test_actions.py +0 -0
  29. {reflex_react_joyride-0.2.0 → reflex_react_joyride-0.3.0}/tests/test_constants.py +0 -0
  30. {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.4
1
+ Metadata-Version: 2.5
2
2
  Name: reflex-react-joyride
3
- Version: 0.2.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
- Keywords: reflex,reflex-custom-components,react-joyride,joyride,tour,onboarding,walkthrough,product-tour
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
- Dynamic: license-file
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, 3.12 or 3.13 |
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 requires Reflex 0.10 and drops Python 3.10,
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 `react_joyride_demo/` folder is a four page Reflex app covering the basics,
331
- controlled mode, theming with a Reflex tooltip, and the awkward cases (targets
332
- that appear late or never, spotlight targets, scrolling, modal steps, blocked
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 react_joyride_demo
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 # creates .venv and installs the package in editable mode
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 run ruff check .
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
- `reflex component` was removed in Reflex 0.10. The `.pyi` stubs are committed;
352
- regenerate them after changing the component's props:
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 custom_components/reflex_react_joyride
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
- Releases are published to PyPI by the `Release` workflow through Trusted
364
- Publishing, so no token is stored anywhere:
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`, bump `version` in `pyproject.toml` and add an entry to
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.2.0 && git push origin v0.2.0
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` or that don't match the
378
- `pyproject.toml` version, then runs the tests, builds, publishes to PyPI with
379
- build provenance attestations and creates the GitHub release.
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, 3.12 or 3.13 |
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 requires Reflex 0.10 and drops Python 3.10,
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 `react_joyride_demo/` folder is a four page Reflex app covering the basics,
304
- controlled mode, theming with a Reflex tooltip, and the awkward cases (targets
305
- that appear late or never, spotlight targets, scrolling, modal steps, blocked
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 react_joyride_demo
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 # creates .venv and installs the package in editable mode
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 run ruff check .
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
- `reflex component` was removed in Reflex 0.10. The `.pyi` stubs are committed;
325
- regenerate them after changing the component's props:
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 custom_components/reflex_react_joyride
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
- Releases are published to PyPI by the `Release` workflow through Trusted
337
- Publishing, so no token is stored anywhere:
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`, bump `version` in `pyproject.toml` and add an entry to
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.2.0 && git push origin v0.2.0
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` or that don't match the
351
- `pyproject.toml` version, then runs the tests, builds, publishes to PyPI with
352
- build provenance attestations and creates the GitHub release.
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