reflex 0.8.16a1__tar.gz → 0.8.17a1__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.
Potentially problematic release.
This version of reflex might be problematic. Click here for more details.
- {reflex-0.8.16a1 → reflex-0.8.17a1}/PKG-INFO +40 -11
- {reflex-0.8.16a1 → reflex-0.8.17a1}/README.md +37 -8
- {reflex-0.8.16a1 → reflex-0.8.17a1}/pyproject.toml +4 -4
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/state.js +3 -1
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/app.py +11 -3
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/compiler/templates.py +12 -2
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/window_events.py +30 -9
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/window_events.pyi +6 -5
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/lucide/icon.py +2 -1
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/plotly/plotly.py +9 -9
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/recharts.py +2 -2
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/installer.py +2 -2
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/environment.py +31 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/manager/__init__.py +24 -2
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/manager/disk.py +15 -5
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/manager/memory.py +13 -4
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/manager/redis.py +27 -6
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/proxy.py +14 -12
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/plugins/tailwind_v4.py +2 -2
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/state.py +41 -11
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/frontend_skeleton.py +2 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/.gitignore +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/LICENSE +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/apps/blank/code/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/apps/blank/code/blank.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/.gitignore +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/app/entry.client.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/app/routes.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/components/shiki/code.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/jsconfig.json +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/postcss.config.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/react-router.config.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/helpers/paste.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/helpers/range.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/helpers/upload.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/utils/react-theme.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/__main__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/admin.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/app_mixins/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/app_mixins/lifespan.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/app_mixins/middleware.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/app_mixins/mixin.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/assets.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/compiler/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/compiler/compiler.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/compiler/utils.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/app_wrap.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/app_wrap.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/bare.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/body.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/body.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/document.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/document.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/error_boundary.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/error_boundary.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/fragment.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/fragment.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/link.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/link.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/meta.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/meta.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/script.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/script.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/strict_mode.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/base/strict_mode.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/component.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/auto_scroll.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/auto_scroll.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/banner.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/banner.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/breakpoints.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/clipboard.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/clipboard.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/colors.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/cond.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/debounce.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/debounce.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/foreach.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/helmet.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/helmet.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/html.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/html.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/layout/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/match.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/responsive.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/sticky.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/sticky.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/upload.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/core/upload.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/code.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/code.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/dataeditor.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/dataeditor.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/logo.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/shiki_code_block.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/dynamic.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/element.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/element.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/base.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/forms.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/forms.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/inline.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/inline.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/media.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/media.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/metadata.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/metadata.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/other.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/other.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/scripts.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/scripts.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/sectioning.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/sectioning.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/tables.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/tables.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/typography.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/el/elements/typography.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/field.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/gridjs/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/gridjs/datatable.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/gridjs/datatable.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/literals.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/lucide/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/lucide/icon.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/markdown/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/markdown/markdown.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/markdown/markdown.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/moment/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/moment/moment.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/moment/moment.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/plotly/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/plotly/plotly.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/props.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/accordion.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/accordion.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/base.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/dialog.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/dialog.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/drawer.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/drawer.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/form.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/form.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/progress.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/progress.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/slider.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/primitives/slider.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/base.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/color_mode.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/color_mode.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/avatar.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/avatar.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/badge.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/badge.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/button.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/button.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/callout.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/callout.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/card.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/card.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/checkbox.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/context_menu.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/data_list.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/data_list.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/dialog.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/dialog.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/hover_card.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/icon_button.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/inset.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/inset.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/popover.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/popover.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/progress.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/progress.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/radio.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/radio.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/radio_cards.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/radio_group.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/scroll_area.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/segmented_control.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/select.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/select.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/separator.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/separator.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/skeleton.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/slider.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/slider.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/spinner.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/spinner.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/switch.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/switch.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/table.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/table.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/tabs.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/tabs.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/text_area.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/text_area.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/text_field.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/text_field.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/tooltip.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/base.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/box.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/box.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/center.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/center.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/container.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/container.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/flex.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/flex.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/grid.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/grid.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/list.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/list.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/section.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/section.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/spacer.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/stack.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/layout/stack.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/blockquote.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/code.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/code.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/heading.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/heading.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/link.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/link.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/text.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/radix/themes/typography/text.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_player/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_player/audio.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_player/audio.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_player/react_player.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_player/react_player.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_player/video.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_player/video.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_router/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_router/dom.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/react_router/dom.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/__init__.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/cartesian.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/cartesian.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/charts.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/charts.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/general.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/general.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/polar.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/polar.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/recharts/recharts.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/sonner/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/sonner/toast.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/sonner/toast.pyi +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/tags/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/tags/cond_tag.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/tags/iter_tag.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/tags/match_tag.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/tags/tag.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/components/tags/tagless.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/config.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/colors.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/compiler.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/config.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/custom_components.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/event.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/route.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/state.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/constants/utils.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/custom_components/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/custom_components/custom_components.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/event.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/experimental/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/experimental/client_state.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/experimental/hooks.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/data.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/dynamic.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/storage.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/istate/wrappers.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/middleware/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/middleware/hydrate_middleware.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/middleware/middleware.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/model.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/page.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/plugins/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/plugins/_screenshot.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/plugins/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/plugins/shared_tailwind.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/plugins/sitemap.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/plugins/tailwind_v3.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/py.typed +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/reflex.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/route.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/style.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/testing.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/build.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/codespaces.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/compat.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/console.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/decorator.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/exceptions.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/exec.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/export.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/format.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/imports.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/js_runtimes.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/lazy_loader.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/misc.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/monitoring.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/net.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/path_ops.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/prerequisites.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/processes.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/pyi_generator.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/redir.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/registry.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/rename.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/serializers.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/telemetry.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/templates.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/token_manager.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/utils/types.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/__init__.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/base.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/color.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/datetime.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/dep_tracking.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/function.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/number.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/object.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/reflex/vars/sequence.py +0 -0
- {reflex-0.8.16a1 → reflex-0.8.17a1}/scripts/hatch_build.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: reflex
|
|
3
|
-
Version: 0.8.
|
|
3
|
+
Version: 0.8.17a1
|
|
4
4
|
Summary: Web apps in pure Python.
|
|
5
5
|
Project-URL: homepage, https://reflex.dev
|
|
6
6
|
Project-URL: repository, https://github.com/reflex-dev/reflex
|
|
@@ -31,12 +31,12 @@ Requires-Dist: pydantic<3.0,>=1.10.21
|
|
|
31
31
|
Requires-Dist: python-multipart<1.0,>=0.0.20
|
|
32
32
|
Requires-Dist: python-socketio<6.0,>=5.12.0
|
|
33
33
|
Requires-Dist: redis<7.0,>=5.2.1
|
|
34
|
-
Requires-Dist: reflex-hosting-cli>=0.1.
|
|
34
|
+
Requires-Dist: reflex-hosting-cli>=0.1.57
|
|
35
35
|
Requires-Dist: rich<15,>=13
|
|
36
36
|
Requires-Dist: sqlmodel<0.1,>=0.0.27
|
|
37
37
|
Requires-Dist: starlette>=0.47.0
|
|
38
38
|
Requires-Dist: typing-extensions>=4.13.0
|
|
39
|
-
Requires-Dist: wrapt<
|
|
39
|
+
Requires-Dist: wrapt<3.0,>=1.17.0
|
|
40
40
|
Provides-Extra: db
|
|
41
41
|
Requires-Dist: alembic<2.0,>=1.15.2; extra == 'db'
|
|
42
42
|
Requires-Dist: pydantic<3.0,>=1.10.21; extra == 'db'
|
|
@@ -86,25 +86,50 @@ See our [architecture page](https://reflex.dev/blog/2024-03-21-reflex-architectu
|
|
|
86
86
|
|
|
87
87
|
## ⚙️ Installation
|
|
88
88
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
```bash
|
|
92
|
-
pip install reflex
|
|
93
|
-
```
|
|
89
|
+
**Important:** We strongly recommend using a virtual environment to ensure the `reflex` command is available in your PATH.
|
|
94
90
|
|
|
95
91
|
## 🥳 Create your first app
|
|
96
92
|
|
|
97
|
-
|
|
93
|
+
### 1. Create the project directory
|
|
98
94
|
|
|
99
|
-
|
|
95
|
+
Replace `my_app_name` with your project name:
|
|
100
96
|
|
|
101
97
|
```bash
|
|
102
98
|
mkdir my_app_name
|
|
103
99
|
cd my_app_name
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### 2. Set up a virtual environment
|
|
103
|
+
|
|
104
|
+
Create and activate virtual environment
|
|
105
|
+
|
|
106
|
+
```bash
|
|
107
|
+
# On Windows:
|
|
108
|
+
python -m venv .venv
|
|
109
|
+
.venv\Scripts\activate
|
|
110
|
+
|
|
111
|
+
# On macOS/Linux:
|
|
112
|
+
python3 -m venv .venv
|
|
113
|
+
source .venv/bin/activate
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### 3. Install Reflex
|
|
117
|
+
|
|
118
|
+
Reflex is available as a pip package (Requires Python 3.10+):
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
pip install reflex
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
### 4. Initialize the project
|
|
125
|
+
|
|
126
|
+
This command initializes a template app in your new directory:
|
|
127
|
+
|
|
128
|
+
```bash
|
|
104
129
|
reflex init
|
|
105
130
|
```
|
|
106
131
|
|
|
107
|
-
|
|
132
|
+
### 5. Run the app
|
|
108
133
|
|
|
109
134
|
You can run this app in development mode:
|
|
110
135
|
|
|
@@ -116,6 +141,10 @@ You should see your app running at http://localhost:3000.
|
|
|
116
141
|
|
|
117
142
|
Now you can modify the source code in `my_app_name/my_app_name.py`. Reflex has fast refreshes so you can see your changes instantly when you save your code.
|
|
118
143
|
|
|
144
|
+
### Troubleshooting
|
|
145
|
+
|
|
146
|
+
If you installed Reflex without a virtual environment and the `reflex` command is not found, you can run commands using: `python3 -m reflex init` and `python3 -m reflex run`
|
|
147
|
+
|
|
119
148
|
## 🫧 Example App
|
|
120
149
|
|
|
121
150
|
Let's go over an example: creating an image generation UI around [DALL·E](https://platform.openai.com/docs/guides/images/image-generation?context=node). For simplicity, we just call the [OpenAI API](https://platform.openai.com/docs/api-reference/authentication), but you could replace this with an ML model run locally.
|
|
@@ -39,25 +39,50 @@ See our [architecture page](https://reflex.dev/blog/2024-03-21-reflex-architectu
|
|
|
39
39
|
|
|
40
40
|
## ⚙️ Installation
|
|
41
41
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
```bash
|
|
45
|
-
pip install reflex
|
|
46
|
-
```
|
|
42
|
+
**Important:** We strongly recommend using a virtual environment to ensure the `reflex` command is available in your PATH.
|
|
47
43
|
|
|
48
44
|
## 🥳 Create your first app
|
|
49
45
|
|
|
50
|
-
|
|
46
|
+
### 1. Create the project directory
|
|
51
47
|
|
|
52
|
-
|
|
48
|
+
Replace `my_app_name` with your project name:
|
|
53
49
|
|
|
54
50
|
```bash
|
|
55
51
|
mkdir my_app_name
|
|
56
52
|
cd my_app_name
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### 2. Set up a virtual environment
|
|
56
|
+
|
|
57
|
+
Create and activate virtual environment
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
# On Windows:
|
|
61
|
+
python -m venv .venv
|
|
62
|
+
.venv\Scripts\activate
|
|
63
|
+
|
|
64
|
+
# On macOS/Linux:
|
|
65
|
+
python3 -m venv .venv
|
|
66
|
+
source .venv/bin/activate
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 3. Install Reflex
|
|
70
|
+
|
|
71
|
+
Reflex is available as a pip package (Requires Python 3.10+):
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
pip install reflex
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 4. Initialize the project
|
|
78
|
+
|
|
79
|
+
This command initializes a template app in your new directory:
|
|
80
|
+
|
|
81
|
+
```bash
|
|
57
82
|
reflex init
|
|
58
83
|
```
|
|
59
84
|
|
|
60
|
-
|
|
85
|
+
### 5. Run the app
|
|
61
86
|
|
|
62
87
|
You can run this app in development mode:
|
|
63
88
|
|
|
@@ -69,6 +94,10 @@ You should see your app running at http://localhost:3000.
|
|
|
69
94
|
|
|
70
95
|
Now you can modify the source code in `my_app_name/my_app_name.py`. Reflex has fast refreshes so you can see your changes instantly when you save your code.
|
|
71
96
|
|
|
97
|
+
### Troubleshooting
|
|
98
|
+
|
|
99
|
+
If you installed Reflex without a virtual environment and the `reflex` command is not found, you can run commands using: `python3 -m reflex init` and `python3 -m reflex run`
|
|
100
|
+
|
|
72
101
|
## 🫧 Example App
|
|
73
102
|
|
|
74
103
|
Let's go over an example: creating an image generation UI around [DALL·E](https://platform.openai.com/docs/guides/images/image-generation?context=node). For simplicity, we just call the [OpenAI API](https://platform.openai.com/docs/api-reference/authentication), but you could replace this with an ML model run locally.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "reflex"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.17a1"
|
|
4
4
|
description = "Web apps in pure Python."
|
|
5
5
|
license.text = "Apache-2.0"
|
|
6
6
|
authors = [
|
|
@@ -31,12 +31,12 @@ dependencies = [
|
|
|
31
31
|
"python-multipart >=0.0.20,<1.0",
|
|
32
32
|
"python-socketio >=5.12.0,<6.0",
|
|
33
33
|
"redis >=5.2.1,<7.0",
|
|
34
|
-
"reflex-hosting-cli >=0.1.
|
|
34
|
+
"reflex-hosting-cli >=0.1.57",
|
|
35
35
|
"rich >=13,<15",
|
|
36
36
|
"sqlmodel >=0.0.27,<0.1",
|
|
37
37
|
"starlette >=0.47.0",
|
|
38
38
|
"typing_extensions >=4.13.0",
|
|
39
|
-
"wrapt >=1.17.0,<
|
|
39
|
+
"wrapt >=1.17.0,<3.0",
|
|
40
40
|
]
|
|
41
41
|
|
|
42
42
|
classifiers = [
|
|
@@ -243,7 +243,7 @@ fail_fast = true
|
|
|
243
243
|
|
|
244
244
|
[[tool.pre-commit.repos]]
|
|
245
245
|
repo = "https://github.com/astral-sh/ruff-pre-commit"
|
|
246
|
-
rev = "v0.14.
|
|
246
|
+
rev = "v0.14.1"
|
|
247
247
|
hooks = [
|
|
248
248
|
{ id = "ruff-format", args = [
|
|
249
249
|
"reflex",
|
|
@@ -665,7 +665,9 @@ export const connect = async (
|
|
|
665
665
|
}
|
|
666
666
|
}
|
|
667
667
|
applyClientStorageDelta(client_storage, update.delta);
|
|
668
|
-
|
|
668
|
+
if (update.final !== null) {
|
|
669
|
+
event_processing = !update.final;
|
|
670
|
+
}
|
|
669
671
|
if (update.events) {
|
|
670
672
|
queueEvents(update.events, socket, false, navigate, params);
|
|
671
673
|
}
|
|
@@ -1556,11 +1556,14 @@ class App(MiddlewareMixin, LifespanMixin):
|
|
|
1556
1556
|
)
|
|
1557
1557
|
|
|
1558
1558
|
@contextlib.asynccontextmanager
|
|
1559
|
-
async def modify_state(
|
|
1559
|
+
async def modify_state(
|
|
1560
|
+
self, token: str, background: bool = False
|
|
1561
|
+
) -> AsyncIterator[BaseState]:
|
|
1560
1562
|
"""Modify the state out of band.
|
|
1561
1563
|
|
|
1562
1564
|
Args:
|
|
1563
1565
|
token: The token to modify the state for.
|
|
1566
|
+
background: Whether the modification is happening in a background task.
|
|
1564
1567
|
|
|
1565
1568
|
Yields:
|
|
1566
1569
|
The state to modify.
|
|
@@ -1581,7 +1584,10 @@ class App(MiddlewareMixin, LifespanMixin):
|
|
|
1581
1584
|
# When the state is modified reset dirty status and emit the delta to the frontend.
|
|
1582
1585
|
state._clean()
|
|
1583
1586
|
await self.event_namespace.emit_update(
|
|
1584
|
-
update=StateUpdate(
|
|
1587
|
+
update=StateUpdate(
|
|
1588
|
+
delta=delta,
|
|
1589
|
+
final=True if not background else None,
|
|
1590
|
+
),
|
|
1585
1591
|
token=token,
|
|
1586
1592
|
)
|
|
1587
1593
|
|
|
@@ -1758,7 +1764,9 @@ async def process(
|
|
|
1758
1764
|
constants.RouteVar.CLIENT_IP: client_ip,
|
|
1759
1765
|
})
|
|
1760
1766
|
# Get the state for the session exclusively.
|
|
1761
|
-
async with app.state_manager.modify_state(
|
|
1767
|
+
async with app.state_manager.modify_state(
|
|
1768
|
+
event.substate_token, event=event
|
|
1769
|
+
) as state:
|
|
1762
1770
|
# When this is a brand new instance of the state, signal the
|
|
1763
1771
|
# frontend to reload before processing it.
|
|
1764
1772
|
if (
|
|
@@ -4,7 +4,7 @@ from __future__ import annotations
|
|
|
4
4
|
|
|
5
5
|
import json
|
|
6
6
|
from collections.abc import Iterable, Mapping
|
|
7
|
-
from typing import TYPE_CHECKING, Any
|
|
7
|
+
from typing import TYPE_CHECKING, Any, Literal
|
|
8
8
|
|
|
9
9
|
from reflex import constants
|
|
10
10
|
from reflex.constants import Hooks
|
|
@@ -492,13 +492,21 @@ def package_json_template(
|
|
|
492
492
|
})
|
|
493
493
|
|
|
494
494
|
|
|
495
|
-
def vite_config_template(
|
|
495
|
+
def vite_config_template(
|
|
496
|
+
base: str,
|
|
497
|
+
hmr: bool,
|
|
498
|
+
force_full_reload: bool,
|
|
499
|
+
experimental_hmr: bool,
|
|
500
|
+
sourcemap: bool | Literal["inline", "hidden"],
|
|
501
|
+
):
|
|
496
502
|
"""Template for vite.config.js.
|
|
497
503
|
|
|
498
504
|
Args:
|
|
499
505
|
base: The base path for the Vite config.
|
|
500
506
|
hmr: Whether to enable hot module replacement.
|
|
501
507
|
force_full_reload: Whether to force a full reload on changes.
|
|
508
|
+
experimental_hmr: Whether to enable experimental HMR features.
|
|
509
|
+
sourcemap: The sourcemap configuration.
|
|
502
510
|
|
|
503
511
|
Returns:
|
|
504
512
|
Rendered vite.config.js content as string.
|
|
@@ -550,6 +558,7 @@ export default defineConfig((config) => ({{
|
|
|
550
558
|
].concat({"[fullReload()]" if force_full_reload else "[]"}),
|
|
551
559
|
build: {{
|
|
552
560
|
assetsDir: "{base}assets".slice(1),
|
|
561
|
+
sourcemap: {"true" if sourcemap is True else "false" if sourcemap is False else repr(sourcemap)},
|
|
553
562
|
rollupOptions: {{
|
|
554
563
|
onwarn(warning, warn) {{
|
|
555
564
|
if (warning.code === "EVAL" && warning.id && warning.id.endsWith("state.js")) return;
|
|
@@ -570,6 +579,7 @@ export default defineConfig((config) => ({{
|
|
|
570
579
|
}},
|
|
571
580
|
experimental: {{
|
|
572
581
|
enableNativePlugin: false,
|
|
582
|
+
hmr: {"true" if experimental_hmr else "false"},
|
|
573
583
|
}},
|
|
574
584
|
server: {{
|
|
575
585
|
port: process.env.PORT,
|
|
@@ -1,7 +1,12 @@
|
|
|
1
1
|
"""Window event listener component for Reflex."""
|
|
2
2
|
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, cast
|
|
6
|
+
|
|
3
7
|
import reflex as rx
|
|
4
8
|
from reflex.components.base.fragment import Fragment
|
|
9
|
+
from reflex.components.component import StatefulComponent, field
|
|
5
10
|
from reflex.constants.compiler import Hooks
|
|
6
11
|
from reflex.event import key_event, no_args_event_spec
|
|
7
12
|
from reflex.vars.base import Var, VarData
|
|
@@ -61,6 +66,23 @@ class WindowEventListener(Fragment):
|
|
|
61
66
|
on_popstate: rx.EventHandler[no_args_event_spec]
|
|
62
67
|
on_storage: rx.EventHandler[_on_storage_spec]
|
|
63
68
|
|
|
69
|
+
hooks: list[str] = field(default_factory=list, is_javascript_property=False)
|
|
70
|
+
|
|
71
|
+
@classmethod
|
|
72
|
+
def create(cls, **props) -> WindowEventListener:
|
|
73
|
+
"""Create a WindowEventListener component.
|
|
74
|
+
|
|
75
|
+
Args:
|
|
76
|
+
**props: The props to set on the component.
|
|
77
|
+
|
|
78
|
+
Returns:
|
|
79
|
+
The created component.
|
|
80
|
+
"""
|
|
81
|
+
real_component = cast("WindowEventListener", super().create(**props))
|
|
82
|
+
hooks = StatefulComponent._fix_event_triggers(real_component)
|
|
83
|
+
real_component.hooks = hooks
|
|
84
|
+
return real_component
|
|
85
|
+
|
|
64
86
|
def _exclude_props(self) -> list[str]:
|
|
65
87
|
"""Exclude event handler props from being passed to Fragment.
|
|
66
88
|
|
|
@@ -69,31 +91,30 @@ class WindowEventListener(Fragment):
|
|
|
69
91
|
"""
|
|
70
92
|
return [*super()._exclude_props(), *self.event_triggers.keys()]
|
|
71
93
|
|
|
72
|
-
def add_hooks(self) -> list[str | Var[
|
|
94
|
+
def add_hooks(self) -> list[str | Var[Any]]:
|
|
73
95
|
"""Add hooks to register window event listeners.
|
|
74
96
|
|
|
75
97
|
Returns:
|
|
76
98
|
The hooks to add to the component.
|
|
77
99
|
"""
|
|
78
|
-
hooks = []
|
|
100
|
+
hooks: list[str | Var[Any]] = [*self.hooks]
|
|
79
101
|
|
|
80
102
|
for prop_name, event_trigger in self.event_triggers.items():
|
|
81
103
|
# Get JS event name: remove on_ prefix and underscores
|
|
82
104
|
event_name = prop_name.removeprefix("on_").replace("_", "")
|
|
83
105
|
|
|
84
106
|
hook_expr = f"""
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
107
|
+
useEffect(() => {{
|
|
108
|
+
if (typeof window === 'undefined') return;
|
|
109
|
+
const fn = {Var.create(event_trigger)};
|
|
110
|
+
window.addEventListener('{event_name}', fn);
|
|
111
|
+
return () => window.removeEventListener('{event_name}', fn);
|
|
112
|
+
}}, []);
|
|
91
113
|
"""
|
|
92
114
|
|
|
93
115
|
hooks.append(
|
|
94
116
|
Var(
|
|
95
117
|
hook_expr,
|
|
96
|
-
_var_type="str",
|
|
97
118
|
_var_data=VarData(position=Hooks.HookPosition.POST_TRIGGER),
|
|
98
119
|
)
|
|
99
120
|
)
|
|
@@ -12,11 +12,11 @@ from reflex.event import EventType, KeyInputInfo, PointerEventInfo
|
|
|
12
12
|
from reflex.vars.base import Var
|
|
13
13
|
|
|
14
14
|
class WindowEventListener(Fragment):
|
|
15
|
-
def add_hooks(self) -> list[str | Var[str]]: ...
|
|
16
15
|
@classmethod
|
|
17
16
|
def create(
|
|
18
17
|
cls,
|
|
19
18
|
*children,
|
|
19
|
+
hooks: list[str] | None = None,
|
|
20
20
|
style: Sequence[Mapping[str, Any]]
|
|
21
21
|
| Mapping[str, Any]
|
|
22
22
|
| Var[Mapping[str, Any]]
|
|
@@ -62,10 +62,9 @@ class WindowEventListener(Fragment):
|
|
|
62
62
|
on_visibility_change: EventType[()] | EventType[bool] | None = None,
|
|
63
63
|
**props,
|
|
64
64
|
) -> WindowEventListener:
|
|
65
|
-
"""Create
|
|
65
|
+
"""Create a WindowEventListener component.
|
|
66
66
|
|
|
67
67
|
Args:
|
|
68
|
-
*children: The children of the component.
|
|
69
68
|
on_resize: Event handlers
|
|
70
69
|
style: The style of the component.
|
|
71
70
|
key: A unique key for the component.
|
|
@@ -73,10 +72,12 @@ class WindowEventListener(Fragment):
|
|
|
73
72
|
ref: The Var to pass as the ref to the component.
|
|
74
73
|
class_name: The class name for the component.
|
|
75
74
|
custom_attrs: custom attribute
|
|
76
|
-
**props: The props
|
|
75
|
+
**props: The props to set on the component.
|
|
77
76
|
|
|
78
77
|
Returns:
|
|
79
|
-
The component.
|
|
78
|
+
The created component.
|
|
80
79
|
"""
|
|
81
80
|
|
|
81
|
+
def add_hooks(self) -> list[str | Var[Any]]: ...
|
|
82
|
+
|
|
82
83
|
window_event_listener = WindowEventListener.create
|
|
@@ -6,7 +6,7 @@ from reflex.utils.imports import ImportVar
|
|
|
6
6
|
from reflex.vars.base import LiteralVar, Var
|
|
7
7
|
from reflex.vars.sequence import LiteralStringVar, StringVar
|
|
8
8
|
|
|
9
|
-
LUCIDE_LIBRARY = "lucide-react@0.
|
|
9
|
+
LUCIDE_LIBRARY = "lucide-react@0.546.0"
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class LucideIconComponent(Component):
|
|
@@ -1115,6 +1115,7 @@ LUCIDE_ICON_LIST = [
|
|
|
1115
1115
|
"minimize",
|
|
1116
1116
|
"minus",
|
|
1117
1117
|
"monitor_check",
|
|
1118
|
+
"monitor_cloud",
|
|
1118
1119
|
"monitor_cog",
|
|
1119
1120
|
"monitor_dot",
|
|
1120
1121
|
"monitor_down",
|
|
@@ -72,7 +72,7 @@ class Plotly(NoSSRComponent):
|
|
|
72
72
|
|
|
73
73
|
library = "react-plotly.js@2.6.0"
|
|
74
74
|
|
|
75
|
-
lib_dependencies: list[str] = ["plotly.js@3.1.
|
|
75
|
+
lib_dependencies: list[str] = ["plotly.js@3.1.2"]
|
|
76
76
|
|
|
77
77
|
tag = "Plot"
|
|
78
78
|
|
|
@@ -303,7 +303,7 @@ class PlotlyBasic(Plotly):
|
|
|
303
303
|
|
|
304
304
|
library = "react-plotly.js@2.6.0"
|
|
305
305
|
|
|
306
|
-
lib_dependencies: list[str] = ["plotly.js-basic-dist-min@3.1.
|
|
306
|
+
lib_dependencies: list[str] = ["plotly.js-basic-dist-min@3.1.2"]
|
|
307
307
|
|
|
308
308
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
309
309
|
"""Add imports for the plotly basic component.
|
|
@@ -329,7 +329,7 @@ class PlotlyCartesian(Plotly):
|
|
|
329
329
|
|
|
330
330
|
library = "react-plotly.js@2.6.0"
|
|
331
331
|
|
|
332
|
-
lib_dependencies: list[str] = ["plotly.js-cartesian-dist-min@3.1.
|
|
332
|
+
lib_dependencies: list[str] = ["plotly.js-cartesian-dist-min@3.1.2"]
|
|
333
333
|
|
|
334
334
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
335
335
|
"""Add imports for the plotly cartesian component.
|
|
@@ -355,7 +355,7 @@ class PlotlyGeo(Plotly):
|
|
|
355
355
|
|
|
356
356
|
library = "react-plotly.js@2.6.0"
|
|
357
357
|
|
|
358
|
-
lib_dependencies: list[str] = ["plotly.js-geo-dist-min@3.1.
|
|
358
|
+
lib_dependencies: list[str] = ["plotly.js-geo-dist-min@3.1.2"]
|
|
359
359
|
|
|
360
360
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
361
361
|
"""Add imports for the plotly geo component.
|
|
@@ -381,7 +381,7 @@ class PlotlyGl3d(Plotly):
|
|
|
381
381
|
|
|
382
382
|
library = "react-plotly.js@2.6.0"
|
|
383
383
|
|
|
384
|
-
lib_dependencies: list[str] = ["plotly.js-gl3d-dist-min@3.1.
|
|
384
|
+
lib_dependencies: list[str] = ["plotly.js-gl3d-dist-min@3.1.2"]
|
|
385
385
|
|
|
386
386
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
387
387
|
"""Add imports for the plotly 3d component.
|
|
@@ -407,7 +407,7 @@ class PlotlyGl2d(Plotly):
|
|
|
407
407
|
|
|
408
408
|
library = "react-plotly.js@2.6.0"
|
|
409
409
|
|
|
410
|
-
lib_dependencies: list[str] = ["plotly.js-gl2d-dist-min@3.1.
|
|
410
|
+
lib_dependencies: list[str] = ["plotly.js-gl2d-dist-min@3.1.2"]
|
|
411
411
|
|
|
412
412
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
413
413
|
"""Add imports for the plotly 2d component.
|
|
@@ -433,7 +433,7 @@ class PlotlyMapbox(Plotly):
|
|
|
433
433
|
|
|
434
434
|
library = "react-plotly.js@2.6.0"
|
|
435
435
|
|
|
436
|
-
lib_dependencies: list[str] = ["plotly.js-mapbox-dist-min@3.1.
|
|
436
|
+
lib_dependencies: list[str] = ["plotly.js-mapbox-dist-min@3.1.2"]
|
|
437
437
|
|
|
438
438
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
439
439
|
"""Add imports for the plotly mapbox component.
|
|
@@ -459,7 +459,7 @@ class PlotlyFinance(Plotly):
|
|
|
459
459
|
|
|
460
460
|
library = "react-plotly.js@2.6.0"
|
|
461
461
|
|
|
462
|
-
lib_dependencies: list[str] = ["plotly.js-finance-dist-min@3.1.
|
|
462
|
+
lib_dependencies: list[str] = ["plotly.js-finance-dist-min@3.1.2"]
|
|
463
463
|
|
|
464
464
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
465
465
|
"""Add imports for the plotly finance component.
|
|
@@ -485,7 +485,7 @@ class PlotlyStrict(Plotly):
|
|
|
485
485
|
|
|
486
486
|
library = "react-plotly.js@2.6.0"
|
|
487
487
|
|
|
488
|
-
lib_dependencies: list[str] = ["plotly.js-strict-dist-min@3.1.
|
|
488
|
+
lib_dependencies: list[str] = ["plotly.js-strict-dist-min@3.1.2"]
|
|
489
489
|
|
|
490
490
|
def add_imports(self) -> ImportDict | list[ImportDict]:
|
|
491
491
|
"""Add imports for the plotly strict component.
|
|
@@ -8,7 +8,7 @@ from reflex.components.component import Component, MemoizationLeaf, NoSSRCompone
|
|
|
8
8
|
class Recharts(Component):
|
|
9
9
|
"""A component that wraps a recharts lib."""
|
|
10
10
|
|
|
11
|
-
library = "recharts@3.
|
|
11
|
+
library = "recharts@3.3.0"
|
|
12
12
|
|
|
13
13
|
def _get_style(self) -> dict:
|
|
14
14
|
return {"wrapperStyle": self.style}
|
|
@@ -17,7 +17,7 @@ class Recharts(Component):
|
|
|
17
17
|
class RechartsCharts(NoSSRComponent, MemoizationLeaf):
|
|
18
18
|
"""A component that wraps a recharts lib."""
|
|
19
19
|
|
|
20
|
-
library = "recharts@3.
|
|
20
|
+
library = "recharts@3.3.0"
|
|
21
21
|
|
|
22
22
|
|
|
23
23
|
LiteralAnimationEasing = Literal["ease", "ease-in", "ease-out", "ease-in-out", "linear"]
|
|
@@ -143,11 +143,11 @@ class PackageJson(SimpleNamespace):
|
|
|
143
143
|
"postcss-import": "16.1.1",
|
|
144
144
|
"@react-router/dev": _react_router_version,
|
|
145
145
|
"@react-router/fs-routes": _react_router_version,
|
|
146
|
-
"vite": "npm:rolldown-vite@7.1.
|
|
146
|
+
"vite": "npm:rolldown-vite@7.1.18",
|
|
147
147
|
}
|
|
148
148
|
OVERRIDES = {
|
|
149
149
|
# This should always match the `react` version in DEPENDENCIES for recharts compatibility.
|
|
150
150
|
"react-is": _react_version,
|
|
151
151
|
"cookie": "1.0.2",
|
|
152
|
-
"vite": "npm:rolldown-vite@7.1.
|
|
152
|
+
"vite": "npm:rolldown-vite@7.1.18",
|
|
153
153
|
}
|
|
@@ -17,6 +17,7 @@ from typing import (
|
|
|
17
17
|
Annotated,
|
|
18
18
|
Any,
|
|
19
19
|
Generic,
|
|
20
|
+
Literal,
|
|
20
21
|
TypeVar,
|
|
21
22
|
get_args,
|
|
22
23
|
get_origin,
|
|
@@ -256,6 +257,27 @@ def interpret_env_var_value(
|
|
|
256
257
|
return interpret_existing_path_env(value, field_name)
|
|
257
258
|
if field_type is Plugin:
|
|
258
259
|
return interpret_plugin_env(value, field_name)
|
|
260
|
+
if get_origin(field_type) is Literal:
|
|
261
|
+
literal_values = get_args(field_type)
|
|
262
|
+
for literal_value in literal_values:
|
|
263
|
+
if isinstance(literal_value, str) and literal_value == value:
|
|
264
|
+
return literal_value
|
|
265
|
+
if isinstance(literal_value, bool):
|
|
266
|
+
try:
|
|
267
|
+
interpreted_bool = interpret_boolean_env(value, field_name)
|
|
268
|
+
if interpreted_bool == literal_value:
|
|
269
|
+
return interpreted_bool
|
|
270
|
+
except EnvironmentVarValueError:
|
|
271
|
+
continue
|
|
272
|
+
if isinstance(literal_value, int):
|
|
273
|
+
try:
|
|
274
|
+
interpreted_int = interpret_int_env(value, field_name)
|
|
275
|
+
if interpreted_int == literal_value:
|
|
276
|
+
return interpreted_int
|
|
277
|
+
except EnvironmentVarValueError:
|
|
278
|
+
continue
|
|
279
|
+
msg = f"Invalid literal value: {value!r} for {field_name}, expected one of {literal_values}"
|
|
280
|
+
raise EnvironmentVarValueError(msg)
|
|
259
281
|
if get_origin(field_type) in (list, Sequence):
|
|
260
282
|
return [
|
|
261
283
|
interpret_env_var_value(
|
|
@@ -687,6 +709,12 @@ class EnvironmentVariables:
|
|
|
687
709
|
# Whether to force a full reload on changes.
|
|
688
710
|
VITE_FORCE_FULL_RELOAD: EnvVar[bool] = env_var(False)
|
|
689
711
|
|
|
712
|
+
# Whether to enable Rolldown's experimental HMR.
|
|
713
|
+
VITE_EXPERIMENTAL_HMR: EnvVar[bool] = env_var(False)
|
|
714
|
+
|
|
715
|
+
# Whether to generate sourcemaps for the frontend.
|
|
716
|
+
VITE_SOURCEMAP: EnvVar[Literal[False, True, "inline", "hidden"]] = env_var(False) # noqa: RUF038
|
|
717
|
+
|
|
690
718
|
# Whether to enable SSR for the frontend.
|
|
691
719
|
REFLEX_SSR: EnvVar[bool] = env_var(True)
|
|
692
720
|
|
|
@@ -696,6 +724,9 @@ class EnvironmentVariables:
|
|
|
696
724
|
# How long to delay writing updated states to disk. (Higher values mean less writes, but more chance of lost data.)
|
|
697
725
|
REFLEX_STATE_MANAGER_DISK_DEBOUNCE_SECONDS: EnvVar[float] = env_var(2.0)
|
|
698
726
|
|
|
727
|
+
# How long to wait between automatic reload on frontend error to avoid reload loops.
|
|
728
|
+
REFLEX_AUTO_RELOAD_COOLDOWN_TIME_MS: EnvVar[int] = env_var(10_000)
|
|
729
|
+
|
|
699
730
|
|
|
700
731
|
environment = EnvironmentVariables()
|
|
701
732
|
|
|
@@ -4,14 +4,27 @@ import contextlib
|
|
|
4
4
|
import dataclasses
|
|
5
5
|
from abc import ABC, abstractmethod
|
|
6
6
|
from collections.abc import AsyncIterator
|
|
7
|
+
from typing import TypedDict
|
|
8
|
+
|
|
9
|
+
from typing_extensions import ReadOnly, Unpack
|
|
7
10
|
|
|
8
11
|
from reflex import constants
|
|
9
12
|
from reflex.config import get_config
|
|
13
|
+
from reflex.event import Event
|
|
10
14
|
from reflex.state import BaseState
|
|
11
15
|
from reflex.utils import console, prerequisites
|
|
12
16
|
from reflex.utils.exceptions import InvalidStateManagerModeError
|
|
13
17
|
|
|
14
18
|
|
|
19
|
+
class StateModificationContext(TypedDict, total=False):
|
|
20
|
+
"""The context for modifying state."""
|
|
21
|
+
|
|
22
|
+
event: ReadOnly[Event]
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
EmptyContext = StateModificationContext()
|
|
26
|
+
|
|
27
|
+
|
|
15
28
|
@dataclasses.dataclass
|
|
16
29
|
class StateManager(ABC):
|
|
17
30
|
"""A class to manage many client states."""
|
|
@@ -71,21 +84,30 @@ class StateManager(ABC):
|
|
|
71
84
|
"""
|
|
72
85
|
|
|
73
86
|
@abstractmethod
|
|
74
|
-
async def set_state(
|
|
87
|
+
async def set_state(
|
|
88
|
+
self,
|
|
89
|
+
token: str,
|
|
90
|
+
state: BaseState,
|
|
91
|
+
**context: Unpack[StateModificationContext],
|
|
92
|
+
):
|
|
75
93
|
"""Set the state for a token.
|
|
76
94
|
|
|
77
95
|
Args:
|
|
78
96
|
token: The token to set the state for.
|
|
79
97
|
state: The state to set.
|
|
98
|
+
context: The state modification context.
|
|
80
99
|
"""
|
|
81
100
|
|
|
82
101
|
@abstractmethod
|
|
83
102
|
@contextlib.asynccontextmanager
|
|
84
|
-
async def modify_state(
|
|
103
|
+
async def modify_state(
|
|
104
|
+
self, token: str, **context: Unpack[StateModificationContext]
|
|
105
|
+
) -> AsyncIterator[BaseState]:
|
|
85
106
|
"""Modify the state for a token while holding exclusive lock.
|
|
86
107
|
|
|
87
108
|
Args:
|
|
88
109
|
token: The token to modify the state for.
|
|
110
|
+
context: The state modification context.
|
|
89
111
|
|
|
90
112
|
Yields:
|
|
91
113
|
The state for the token.
|