reflex 0.8.12a2__tar.gz → 0.8.13a1__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.12a2 → reflex-0.8.13a1}/PKG-INFO +1 -1
- {reflex-0.8.12a2 → reflex-0.8.13a1}/pyproject.toml +2 -2
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/app.py +7 -2
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/upload.pyi +8 -0
- reflex-0.8.13a1/reflex/components/react_player/react_player.py +259 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/recharts.py +2 -2
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/colors.py +3 -1
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/installer.py +2 -2
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/environment.py +3 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/plugins/shared_tailwind.py +1 -1
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/reflex.py +36 -3
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/state.py +13 -3
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/build.py +10 -4
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/exec.py +11 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/export.py +3 -1
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/prerequisites.py +82 -7
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/serializers.py +8 -4
- reflex-0.8.13a1/reflex/vars/__init__.py +58 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/vars/base.py +20 -113
- reflex-0.8.13a1/reflex/vars/color.py +214 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/vars/number.py +2 -2
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/vars/sequence.py +0 -136
- reflex-0.8.12a2/reflex/components/react_player/react_player.py +0 -119
- reflex-0.8.12a2/reflex/vars/__init__.py +0 -28
- {reflex-0.8.12a2 → reflex-0.8.13a1}/.gitignore +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/LICENSE +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/README.md +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/apps/blank/code/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/apps/blank/code/blank.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/.gitignore +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/app/entry.client.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/app/routes.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/components/shiki/code.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/jsconfig.json +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/postcss.config.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/react-router.config.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/paste.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/range.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/helpers/upload.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/react-theme.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/utils/state.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/__main__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/admin.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/app_mixins/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/app_mixins/lifespan.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/app_mixins/middleware.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/app_mixins/mixin.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/assets.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/compiler/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/compiler/compiler.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/compiler/templates.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/compiler/utils.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/app_wrap.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/app_wrap.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/bare.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/body.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/body.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/document.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/document.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/error_boundary.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/error_boundary.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/fragment.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/fragment.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/link.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/link.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/meta.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/meta.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/script.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/script.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/strict_mode.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/base/strict_mode.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/component.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/auto_scroll.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/auto_scroll.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/banner.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/banner.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/breakpoints.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/clipboard.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/clipboard.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/colors.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/cond.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/debounce.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/debounce.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/foreach.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/helmet.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/helmet.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/html.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/html.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/layout/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/match.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/responsive.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/sticky.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/sticky.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/upload.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/window_events.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/core/window_events.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/code.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/code.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/dataeditor.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/dataeditor.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/logo.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/shiki_code_block.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/dynamic.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/element.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/element.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/base.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/forms.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/forms.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/inline.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/inline.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/media.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/media.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/metadata.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/metadata.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/other.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/other.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/scripts.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/scripts.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/sectioning.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/sectioning.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/tables.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/tables.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/typography.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/el/elements/typography.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/field.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/gridjs/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/gridjs/datatable.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/gridjs/datatable.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/literals.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/lucide/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/lucide/icon.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/lucide/icon.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/markdown/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/markdown/markdown.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/markdown/markdown.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/moment/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/moment/moment.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/moment/moment.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/plotly/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/plotly/plotly.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/plotly/plotly.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/props.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/accordion.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/accordion.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/base.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/drawer.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/drawer.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/form.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/form.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/progress.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/progress.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/slider.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/primitives/slider.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/base.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/color_mode.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/color_mode.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/avatar.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/avatar.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/badge.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/badge.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/button.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/button.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/callout.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/callout.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/card.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/card.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/context_menu.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/data_list.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/data_list.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dialog.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dialog.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/hover_card.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/icon_button.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/inset.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/inset.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/popover.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/popover.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/progress.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/progress.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_cards.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_group.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/scroll_area.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/segmented_control.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/select.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/select.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/separator.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/separator.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/skeleton.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/slider.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/slider.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/spinner.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/spinner.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/switch.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/switch.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/table.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/table.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tabs.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tabs.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_area.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_area.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_field.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/text_field.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tooltip.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/base.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/box.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/box.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/center.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/center.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/container.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/container.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/flex.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/flex.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/grid.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/grid.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/list.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/list.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/section.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/section.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/spacer.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/stack.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/layout/stack.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/blockquote.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/code.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/code.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/heading.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/heading.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/link.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/link.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/text.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/radix/themes/typography/text.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_player/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_player/audio.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_player/audio.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_player/react_player.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_player/video.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_player/video.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_router/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_router/dom.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/react_router/dom.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/__init__.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/cartesian.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/cartesian.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/charts.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/charts.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/general.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/general.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/polar.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/polar.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/recharts/recharts.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/sonner/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/sonner/toast.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/sonner/toast.pyi +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/tags/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/tags/cond_tag.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/tags/iter_tag.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/tags/match_tag.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/tags/tag.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/components/tags/tagless.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/config.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/compiler.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/config.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/custom_components.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/event.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/route.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/state.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/constants/utils.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/custom_components/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/custom_components/custom_components.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/event.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/experimental/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/experimental/client_state.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/experimental/hooks.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/istate/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/istate/data.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/istate/dynamic.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/istate/manager.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/istate/proxy.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/istate/storage.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/istate/wrappers.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/middleware/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/middleware/hydrate_middleware.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/middleware/middleware.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/model.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/page.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/plugins/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/plugins/_screenshot.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/plugins/base.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/plugins/sitemap.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/plugins/tailwind_v3.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/plugins/tailwind_v4.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/py.typed +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/route.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/style.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/testing.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/__init__.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/codespaces.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/compat.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/console.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/decorator.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/exceptions.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/format.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/frontend_skeleton.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/imports.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/js_runtimes.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/lazy_loader.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/misc.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/monitoring.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/net.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/path_ops.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/processes.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/pyi_generator.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/redir.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/registry.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/rename.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/telemetry.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/templates.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/token_manager.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/utils/types.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/vars/datetime.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/vars/dep_tracking.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/vars/function.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/reflex/vars/object.py +0 -0
- {reflex-0.8.12a2 → reflex-0.8.13a1}/scripts/hatch_build.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "reflex"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.13a1"
|
|
4
4
|
description = "Web apps in pure Python."
|
|
5
5
|
license.text = "Apache-2.0"
|
|
6
6
|
authors = [
|
|
@@ -229,7 +229,7 @@ fail_fast = true
|
|
|
229
229
|
|
|
230
230
|
[[tool.pre-commit.repos]]
|
|
231
231
|
repo = "https://github.com/astral-sh/ruff-pre-commit"
|
|
232
|
-
rev = "v0.13.
|
|
232
|
+
rev = "v0.13.1"
|
|
233
233
|
hooks = [
|
|
234
234
|
{ id = "ruff-format", args = [
|
|
235
235
|
"reflex",
|
|
@@ -113,7 +113,12 @@ from reflex.utils import (
|
|
|
113
113
|
prerequisites,
|
|
114
114
|
types,
|
|
115
115
|
)
|
|
116
|
-
from reflex.utils.exec import
|
|
116
|
+
from reflex.utils.exec import (
|
|
117
|
+
get_compile_context,
|
|
118
|
+
is_prod_mode,
|
|
119
|
+
is_testing_env,
|
|
120
|
+
should_prerender_routes,
|
|
121
|
+
)
|
|
117
122
|
from reflex.utils.imports import ImportVar
|
|
118
123
|
from reflex.utils.token_manager import TokenManager
|
|
119
124
|
from reflex.utils.types import ASGIApp, Message, Receive, Scope, Send
|
|
@@ -607,7 +612,7 @@ class App(MiddlewareMixin, LifespanMixin):
|
|
|
607
612
|
"""
|
|
608
613
|
from reflex.vars.base import GLOBAL_CACHE
|
|
609
614
|
|
|
610
|
-
self._compile(prerender_routes=
|
|
615
|
+
self._compile(prerender_routes=should_prerender_routes())
|
|
611
616
|
|
|
612
617
|
config = get_config()
|
|
613
618
|
|
|
@@ -108,6 +108,7 @@ class GhostUpload(Fragment):
|
|
|
108
108
|
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
109
109
|
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
110
110
|
on_drop: EventType[()] | EventType[Any] | None = None,
|
|
111
|
+
on_drop_rejected: EventType[()] | EventType[Any] | None = None,
|
|
111
112
|
on_focus: EventType[()] | None = None,
|
|
112
113
|
on_mount: EventType[()] | None = None,
|
|
113
114
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -127,6 +128,7 @@ class GhostUpload(Fragment):
|
|
|
127
128
|
Args:
|
|
128
129
|
*children: The children of the component.
|
|
129
130
|
on_drop: Fired when files are dropped.
|
|
131
|
+
on_drop_rejected: Fired when dropped files do not meet the specified criteria.
|
|
130
132
|
style: The style of the component.
|
|
131
133
|
key: A unique key for the component.
|
|
132
134
|
id: The id for the component.
|
|
@@ -171,6 +173,7 @@ class Upload(MemoizationLeaf):
|
|
|
171
173
|
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
172
174
|
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
173
175
|
on_drop: EventType[()] | EventType[Any] | None = None,
|
|
176
|
+
on_drop_rejected: EventType[()] | EventType[Any] | None = None,
|
|
174
177
|
on_focus: EventType[()] | None = None,
|
|
175
178
|
on_mount: EventType[()] | None = None,
|
|
176
179
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -199,6 +202,7 @@ class Upload(MemoizationLeaf):
|
|
|
199
202
|
no_drag: Whether to disable drag and drop.
|
|
200
203
|
no_keyboard: Whether to disable using the space/enter keys to upload.
|
|
201
204
|
on_drop: Fired when files are dropped.
|
|
205
|
+
on_drop_rejected: Fired when dropped files do not meet the specified criteria.
|
|
202
206
|
drag_active_style: Style rules to apply when actively dragging.
|
|
203
207
|
style: The style of the component.
|
|
204
208
|
key: A unique key for the component.
|
|
@@ -242,6 +246,7 @@ class StyledUpload(Upload):
|
|
|
242
246
|
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
243
247
|
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
244
248
|
on_drop: EventType[()] | EventType[Any] | None = None,
|
|
249
|
+
on_drop_rejected: EventType[()] | EventType[Any] | None = None,
|
|
245
250
|
on_focus: EventType[()] | None = None,
|
|
246
251
|
on_mount: EventType[()] | None = None,
|
|
247
252
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -270,6 +275,7 @@ class StyledUpload(Upload):
|
|
|
270
275
|
no_drag: Whether to disable drag and drop.
|
|
271
276
|
no_keyboard: Whether to disable using the space/enter keys to upload.
|
|
272
277
|
on_drop: Fired when files are dropped.
|
|
278
|
+
on_drop_rejected: Fired when dropped files do not meet the specified criteria.
|
|
273
279
|
drag_active_style: Style rules to apply when actively dragging.
|
|
274
280
|
style: The style of the component.
|
|
275
281
|
key: A unique key for the component.
|
|
@@ -314,6 +320,7 @@ class UploadNamespace(ComponentNamespace):
|
|
|
314
320
|
on_context_menu: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
315
321
|
on_double_click: EventType[()] | EventType[PointerEventInfo] | None = None,
|
|
316
322
|
on_drop: EventType[()] | EventType[Any] | None = None,
|
|
323
|
+
on_drop_rejected: EventType[()] | EventType[Any] | None = None,
|
|
317
324
|
on_focus: EventType[()] | None = None,
|
|
318
325
|
on_mount: EventType[()] | None = None,
|
|
319
326
|
on_mouse_down: EventType[()] | None = None,
|
|
@@ -342,6 +349,7 @@ class UploadNamespace(ComponentNamespace):
|
|
|
342
349
|
no_drag: Whether to disable drag and drop.
|
|
343
350
|
no_keyboard: Whether to disable using the space/enter keys to upload.
|
|
344
351
|
on_drop: Fired when files are dropped.
|
|
352
|
+
on_drop_rejected: Fired when dropped files do not meet the specified criteria.
|
|
345
353
|
drag_active_style: Style rules to apply when actively dragging.
|
|
346
354
|
style: The style of the component.
|
|
347
355
|
key: A unique key for the component.
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
"""React-Player component."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
from typing import Any, TypedDict
|
|
6
|
+
|
|
7
|
+
from reflex.components.component import Component
|
|
8
|
+
from reflex.components.core.cond import cond
|
|
9
|
+
from reflex.event import EventHandler, no_args_event_spec
|
|
10
|
+
from reflex.utils import console
|
|
11
|
+
from reflex.vars.base import Var
|
|
12
|
+
from reflex.vars.object import ObjectVar
|
|
13
|
+
|
|
14
|
+
ReactPlayerEvent = ObjectVar[dict[str, dict[str, dict[str, Any]]]]
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class Progress(TypedDict):
|
|
18
|
+
"""Callback containing played and loaded progress as a fraction, and playedSeconds and loadedSeconds in seconds."""
|
|
19
|
+
|
|
20
|
+
played: float
|
|
21
|
+
playedSeconds: float
|
|
22
|
+
loaded: float
|
|
23
|
+
loadedSeconds: float
|
|
24
|
+
duration: float
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def _on_progress_signature(event: ReactPlayerEvent) -> list[Var[Progress]]:
|
|
28
|
+
"""Type signature for on_progress event.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
event: The event variable.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
The progress information extracted from the event.
|
|
35
|
+
"""
|
|
36
|
+
player_info = event["target"]["api"]["playerInfo"].to(dict)
|
|
37
|
+
progress_state = player_info["progressState"].to(dict)
|
|
38
|
+
current = progress_state["current"].to(float)
|
|
39
|
+
loaded = progress_state["loaded"].to(float)
|
|
40
|
+
duration = progress_state["duration"].to(float)
|
|
41
|
+
return [
|
|
42
|
+
cond(
|
|
43
|
+
progress_state,
|
|
44
|
+
{
|
|
45
|
+
"played": cond(duration, current / duration, 0.0),
|
|
46
|
+
"playedSeconds": current,
|
|
47
|
+
"loaded": cond(duration, loaded / duration, 0.0),
|
|
48
|
+
"loadedSeconds": loaded,
|
|
49
|
+
"duration": duration,
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"played": 0.0,
|
|
53
|
+
"playedSeconds": 0.0,
|
|
54
|
+
"loaded": 0.0,
|
|
55
|
+
"loadedSeconds": 0.0,
|
|
56
|
+
"duration": 0.0,
|
|
57
|
+
},
|
|
58
|
+
).to(Progress)
|
|
59
|
+
]
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
def _player_info_key_or_zero(event: ReactPlayerEvent, key: str) -> Var[float]:
|
|
63
|
+
"""Helper to extract a value from playerInfo or return 0.0 if not available.
|
|
64
|
+
|
|
65
|
+
Args:
|
|
66
|
+
event: The event variable.
|
|
67
|
+
key: The key to extract from playerInfo.
|
|
68
|
+
|
|
69
|
+
Returns:
|
|
70
|
+
The extracted value or 0.0 if not available.
|
|
71
|
+
"""
|
|
72
|
+
player_info = event["target"]["api"]["playerInfo"].to(dict)
|
|
73
|
+
return cond(
|
|
74
|
+
player_info[key],
|
|
75
|
+
player_info[key],
|
|
76
|
+
0.0,
|
|
77
|
+
).to(float)
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
def _on_time_update_signature(event: ReactPlayerEvent) -> list[Var[float]]:
|
|
81
|
+
"""Type signature for on_time_update event.
|
|
82
|
+
|
|
83
|
+
Args:
|
|
84
|
+
event: The event variable.
|
|
85
|
+
|
|
86
|
+
Returns:
|
|
87
|
+
The current timestamp in seconds.
|
|
88
|
+
"""
|
|
89
|
+
return [_player_info_key_or_zero(event, "currentTime")]
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
def _on_duration_change_signature(event: ReactPlayerEvent) -> list[Var[float]]:
|
|
93
|
+
"""Type signature for on_duration_change event.
|
|
94
|
+
|
|
95
|
+
Args:
|
|
96
|
+
event: The event variable.
|
|
97
|
+
|
|
98
|
+
Returns:
|
|
99
|
+
The active media's duration in seconds.
|
|
100
|
+
"""
|
|
101
|
+
return [_player_info_key_or_zero(event, "duration")]
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
def _on_rate_change_signature(event: ReactPlayerEvent) -> list[Var[float]]:
|
|
105
|
+
"""Type signature for on_rate_change event.
|
|
106
|
+
|
|
107
|
+
Args:
|
|
108
|
+
event: The event variable.
|
|
109
|
+
|
|
110
|
+
Returns:
|
|
111
|
+
The current playback rate.
|
|
112
|
+
"""
|
|
113
|
+
return [_player_info_key_or_zero(event, "playbackRate")]
|
|
114
|
+
|
|
115
|
+
|
|
116
|
+
_DEPRECATED_PROP_MAP = {
|
|
117
|
+
"url": "src",
|
|
118
|
+
"on_duration": "on_duration_change",
|
|
119
|
+
"on_playback_rate_change": "on_rate_change",
|
|
120
|
+
"on_seek": "on_seeked",
|
|
121
|
+
"on_buffer": "on_waiting",
|
|
122
|
+
"on_buffer_end": "on_playing",
|
|
123
|
+
"on_enable_pip": "on_enter_picture_in_picture",
|
|
124
|
+
"on_disable_pip": "on_leave_picture_in_picture",
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
class ReactPlayer(Component):
|
|
129
|
+
"""Using react-player and not implement all props and callback yet.
|
|
130
|
+
reference: https://github.com/cookpete/react-player.
|
|
131
|
+
"""
|
|
132
|
+
|
|
133
|
+
library = "react-player@3.3.3"
|
|
134
|
+
|
|
135
|
+
tag = "ReactPlayer"
|
|
136
|
+
|
|
137
|
+
is_default = True
|
|
138
|
+
|
|
139
|
+
# The url of a video or song to play
|
|
140
|
+
src: Var[str | list[str] | list[dict[str, str]]]
|
|
141
|
+
|
|
142
|
+
# Set to true or false to pause or play the media
|
|
143
|
+
playing: Var[bool]
|
|
144
|
+
|
|
145
|
+
# Set to true or false to loop the media
|
|
146
|
+
loop: Var[bool]
|
|
147
|
+
|
|
148
|
+
# Set to true or false to display native player controls.
|
|
149
|
+
controls: Var[bool] = Var.create(True)
|
|
150
|
+
|
|
151
|
+
# Set to true to show just the video thumbnail, which loads the full player on click
|
|
152
|
+
light: Var[bool]
|
|
153
|
+
|
|
154
|
+
# Set the volume of the player, between 0 and 1
|
|
155
|
+
volume: Var[float]
|
|
156
|
+
|
|
157
|
+
# Mutes the player
|
|
158
|
+
muted: Var[bool]
|
|
159
|
+
|
|
160
|
+
# Player-specific configuration parameters.
|
|
161
|
+
config: Var[dict[str, Any]]
|
|
162
|
+
|
|
163
|
+
# Called when media is loaded and ready to play. If playing is set to true, media will play immediately.
|
|
164
|
+
on_ready: EventHandler[no_args_event_spec]
|
|
165
|
+
|
|
166
|
+
# Called when media starts playing.
|
|
167
|
+
on_start: EventHandler[no_args_event_spec]
|
|
168
|
+
|
|
169
|
+
# Called when playing is set to true.
|
|
170
|
+
on_play: EventHandler[no_args_event_spec]
|
|
171
|
+
|
|
172
|
+
# Called when media starts or resumes playing after pausing or buffering.
|
|
173
|
+
on_playing: EventHandler[no_args_event_spec]
|
|
174
|
+
|
|
175
|
+
# Called while the video is loading only. Contains played and loaded progress as a fraction, and playedSeconds and loadedSeconds in seconds. eg { played: 0.12, playedSeconds: 11.3, loaded: 0.34, loadedSeconds: 16.7 }
|
|
176
|
+
on_progress: EventHandler[_on_progress_signature]
|
|
177
|
+
|
|
178
|
+
# Called when the media's current time changes (~4Hz, use .throttle to limit calls to backend).
|
|
179
|
+
on_time_update: EventHandler[_on_time_update_signature]
|
|
180
|
+
|
|
181
|
+
# Callback containing duration of the media, in seconds.
|
|
182
|
+
on_duration_change: EventHandler[_on_duration_change_signature]
|
|
183
|
+
|
|
184
|
+
# Called when media is paused.
|
|
185
|
+
on_pause: EventHandler[no_args_event_spec]
|
|
186
|
+
|
|
187
|
+
# Called when media starts buffering.
|
|
188
|
+
on_waiting: EventHandler[no_args_event_spec]
|
|
189
|
+
|
|
190
|
+
# Called when the media is seeking.
|
|
191
|
+
on_seeking: EventHandler[no_args_event_spec]
|
|
192
|
+
|
|
193
|
+
# Called when media seeks with seconds parameter.
|
|
194
|
+
on_seeked: EventHandler[_on_time_update_signature]
|
|
195
|
+
|
|
196
|
+
# Called when playback rate of the player changed. Only supported by YouTube, Vimeo (if enabled), Wistia, and file paths.
|
|
197
|
+
on_rate_change: EventHandler[_on_rate_change_signature]
|
|
198
|
+
|
|
199
|
+
# Called when media finishes playing. Does not fire when loop is set to true.
|
|
200
|
+
on_ended: EventHandler[no_args_event_spec]
|
|
201
|
+
|
|
202
|
+
# Called when an error occurs whilst attempting to play media.
|
|
203
|
+
on_error: EventHandler[no_args_event_spec]
|
|
204
|
+
|
|
205
|
+
# Called when user clicks the light mode preview.
|
|
206
|
+
on_click_preview: EventHandler[no_args_event_spec]
|
|
207
|
+
|
|
208
|
+
# Called when picture-in-picture mode is enabled.
|
|
209
|
+
on_enter_picture_in_picture: EventHandler[no_args_event_spec]
|
|
210
|
+
|
|
211
|
+
# Called when picture-in-picture mode is disabled.
|
|
212
|
+
on_leave_picture_in_picture: EventHandler[no_args_event_spec]
|
|
213
|
+
|
|
214
|
+
@classmethod
|
|
215
|
+
def create(cls, *children, **props) -> ReactPlayer:
|
|
216
|
+
"""Create a component.
|
|
217
|
+
|
|
218
|
+
Args:
|
|
219
|
+
children: The children of the component.
|
|
220
|
+
props: The props of the component.
|
|
221
|
+
|
|
222
|
+
Returns:
|
|
223
|
+
The created component.
|
|
224
|
+
|
|
225
|
+
Raises:
|
|
226
|
+
ValueError: If both a deprecated prop and its replacement are both passed.
|
|
227
|
+
"""
|
|
228
|
+
for prop, new_prop in _DEPRECATED_PROP_MAP.items():
|
|
229
|
+
if prop in props:
|
|
230
|
+
if new_prop in props:
|
|
231
|
+
msg = (
|
|
232
|
+
f"The prop {prop!r} is deprecated, but the replacement {new_prop!r} is also passed. Please remove {prop!r}.",
|
|
233
|
+
)
|
|
234
|
+
raise ValueError(msg)
|
|
235
|
+
console.warn(
|
|
236
|
+
f"The prop {prop!r} has been replaced by {new_prop!r}, please update your code.",
|
|
237
|
+
)
|
|
238
|
+
props[new_prop] = props.pop(prop)
|
|
239
|
+
return super().create(*children, **props) # type: ignore[return-value]
|
|
240
|
+
|
|
241
|
+
def _render(self, props: dict[str, Any] | None = None):
|
|
242
|
+
"""Render the component. Adds width and height set to None because
|
|
243
|
+
react-player will set them to some random value that overrides the
|
|
244
|
+
css width and height.
|
|
245
|
+
|
|
246
|
+
Args:
|
|
247
|
+
props: The props to pass to the component.
|
|
248
|
+
|
|
249
|
+
Returns:
|
|
250
|
+
The rendered component.
|
|
251
|
+
"""
|
|
252
|
+
return (
|
|
253
|
+
super()
|
|
254
|
+
._render(props)
|
|
255
|
+
.add_props(
|
|
256
|
+
width=Var.create(None),
|
|
257
|
+
height=Var.create(None),
|
|
258
|
+
)
|
|
259
|
+
)
|
|
@@ -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.2.
|
|
11
|
+
library = "recharts@3.2.1"
|
|
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.2.
|
|
20
|
+
library = "recharts@3.2.1"
|
|
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.12",
|
|
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.12",
|
|
153
153
|
}
|
|
@@ -657,6 +657,9 @@ class EnvironmentVariables:
|
|
|
657
657
|
# Whether to force a full reload on changes.
|
|
658
658
|
VITE_FORCE_FULL_RELOAD: EnvVar[bool] = env_var(False)
|
|
659
659
|
|
|
660
|
+
# Whether to enable SSR for the frontend.
|
|
661
|
+
REFLEX_SSR: EnvVar[bool] = env_var(True)
|
|
662
|
+
|
|
660
663
|
|
|
661
664
|
environment = EnvironmentVariables()
|
|
662
665
|
|
|
@@ -204,7 +204,7 @@ def _run(
|
|
|
204
204
|
args = (frontend,)
|
|
205
205
|
kwargs = {
|
|
206
206
|
"check_if_schema_up_to_date": True,
|
|
207
|
-
"prerender_routes":
|
|
207
|
+
"prerender_routes": exec.should_prerender_routes(),
|
|
208
208
|
}
|
|
209
209
|
|
|
210
210
|
# Granian fails if the app is already imported.
|
|
@@ -216,9 +216,12 @@ def _run(
|
|
|
216
216
|
*args,
|
|
217
217
|
**kwargs,
|
|
218
218
|
)
|
|
219
|
-
compile_future.result()
|
|
219
|
+
return_result = compile_future.result()
|
|
220
220
|
else:
|
|
221
|
-
app_task(*args, **kwargs)
|
|
221
|
+
return_result = app_task(*args, **kwargs)
|
|
222
|
+
|
|
223
|
+
if not return_result:
|
|
224
|
+
raise SystemExit(1)
|
|
222
225
|
|
|
223
226
|
# Get the frontend and backend commands, based on the environment.
|
|
224
227
|
setup_frontend = frontend_cmd = backend_cmd = None
|
|
@@ -429,6 +432,14 @@ def compile(dry: bool, rich: bool):
|
|
|
429
432
|
type=click.Path(exists=True, path_type=Path, resolve_path=True),
|
|
430
433
|
help="Files or directories to exclude from the backend zip. Can be used multiple times.",
|
|
431
434
|
)
|
|
435
|
+
@click.option(
|
|
436
|
+
"--server-side-rendering/--no-server-side-rendering",
|
|
437
|
+
"--ssr/--no-ssr",
|
|
438
|
+
"ssr",
|
|
439
|
+
default=True,
|
|
440
|
+
is_flag=True,
|
|
441
|
+
help="Whether to enable server side rendering for the frontend.",
|
|
442
|
+
)
|
|
432
443
|
def export(
|
|
433
444
|
zip: bool,
|
|
434
445
|
frontend_only: bool,
|
|
@@ -437,11 +448,17 @@ def export(
|
|
|
437
448
|
upload_db_file: bool,
|
|
438
449
|
env: LITERAL_ENV,
|
|
439
450
|
backend_excluded_dirs: tuple[Path, ...] = (),
|
|
451
|
+
ssr: bool = True,
|
|
440
452
|
):
|
|
441
453
|
"""Export the app to a zip file."""
|
|
442
454
|
from reflex.utils import export as export_utils
|
|
443
455
|
from reflex.utils import prerequisites
|
|
444
456
|
|
|
457
|
+
if not environment.REFLEX_SSR.is_set():
|
|
458
|
+
environment.REFLEX_SSR.set(ssr)
|
|
459
|
+
elif environment.REFLEX_SSR.get() != ssr:
|
|
460
|
+
ssr = environment.REFLEX_SSR.get()
|
|
461
|
+
|
|
445
462
|
environment.REFLEX_COMPILE_CONTEXT.set(constants.CompileContext.EXPORT)
|
|
446
463
|
|
|
447
464
|
should_frontend_run, should_backend_run = prerequisites.check_running_mode(
|
|
@@ -464,6 +481,7 @@ def export(
|
|
|
464
481
|
env=constants.Env.DEV if env == constants.Env.DEV else constants.Env.PROD,
|
|
465
482
|
loglevel=config.loglevel.subprocess_level(),
|
|
466
483
|
backend_excluded_dirs=backend_excluded_dirs,
|
|
484
|
+
prerender_routes=ssr,
|
|
467
485
|
)
|
|
468
486
|
|
|
469
487
|
|
|
@@ -676,6 +694,14 @@ def makemigrations(message: str | None):
|
|
|
676
694
|
type=click.Path(exists=True, path_type=Path, resolve_path=True),
|
|
677
695
|
help="Files or directories to exclude from the backend zip. Can be used multiple times.",
|
|
678
696
|
)
|
|
697
|
+
@click.option(
|
|
698
|
+
"--server-side-rendering/--no-server-side-rendering",
|
|
699
|
+
"--ssr/--no-ssr",
|
|
700
|
+
"ssr",
|
|
701
|
+
default=True,
|
|
702
|
+
is_flag=True,
|
|
703
|
+
help="Whether to enable server side rendering for the frontend.",
|
|
704
|
+
)
|
|
679
705
|
def deploy(
|
|
680
706
|
app_name: str | None,
|
|
681
707
|
app_id: str | None,
|
|
@@ -690,6 +716,7 @@ def deploy(
|
|
|
690
716
|
token: str | None,
|
|
691
717
|
config_path: str | None,
|
|
692
718
|
backend_excluded_dirs: tuple[Path, ...] = (),
|
|
719
|
+
ssr: bool = True,
|
|
693
720
|
):
|
|
694
721
|
"""Deploy the app to the Reflex hosting service."""
|
|
695
722
|
from reflex_cli.utils import dependency
|
|
@@ -707,6 +734,11 @@ def deploy(
|
|
|
707
734
|
|
|
708
735
|
environment.REFLEX_COMPILE_CONTEXT.set(constants.CompileContext.DEPLOY)
|
|
709
736
|
|
|
737
|
+
if not environment.REFLEX_SSR.is_set():
|
|
738
|
+
environment.REFLEX_SSR.set(ssr)
|
|
739
|
+
elif environment.REFLEX_SSR.get() != ssr:
|
|
740
|
+
ssr = environment.REFLEX_SSR.get()
|
|
741
|
+
|
|
710
742
|
# Only check requirements if interactive.
|
|
711
743
|
# There is user interaction for requirements update.
|
|
712
744
|
if interactive:
|
|
@@ -739,6 +771,7 @@ def deploy(
|
|
|
739
771
|
loglevel=config.loglevel.subprocess_level(),
|
|
740
772
|
upload_db_file=upload_db,
|
|
741
773
|
backend_excluded_dirs=backend_excluded_dirs,
|
|
774
|
+
prerender_routes=ssr,
|
|
742
775
|
)
|
|
743
776
|
),
|
|
744
777
|
regions=list(region),
|
|
@@ -7,6 +7,7 @@ import builtins
|
|
|
7
7
|
import contextlib
|
|
8
8
|
import copy
|
|
9
9
|
import dataclasses
|
|
10
|
+
import datetime
|
|
10
11
|
import functools
|
|
11
12
|
import inspect
|
|
12
13
|
import pickle
|
|
@@ -306,6 +307,14 @@ async def _resolve_delta(delta: Delta) -> Delta:
|
|
|
306
307
|
return delta
|
|
307
308
|
|
|
308
309
|
|
|
310
|
+
_deserializers = {
|
|
311
|
+
int: int,
|
|
312
|
+
float: float,
|
|
313
|
+
datetime.datetime: datetime.datetime.fromisoformat,
|
|
314
|
+
datetime.date: datetime.date.fromisoformat,
|
|
315
|
+
datetime.time: datetime.time.fromisoformat,
|
|
316
|
+
}
|
|
317
|
+
|
|
309
318
|
all_base_state_classes: dict[str, None] = {}
|
|
310
319
|
|
|
311
320
|
|
|
@@ -1872,11 +1881,12 @@ class BaseState(EvenMoreBasicBaseState):
|
|
|
1872
1881
|
hinted_args is tuple or hinted_args is tuple
|
|
1873
1882
|
):
|
|
1874
1883
|
payload[arg] = tuple(value)
|
|
1875
|
-
elif
|
|
1876
|
-
|
|
1884
|
+
elif (
|
|
1885
|
+
isinstance(value, str)
|
|
1886
|
+
and (deserializer := _deserializers.get(hinted_args)) is not None
|
|
1877
1887
|
):
|
|
1878
1888
|
try:
|
|
1879
|
-
payload[arg] =
|
|
1889
|
+
payload[arg] = deserializer(value)
|
|
1880
1890
|
except ValueError:
|
|
1881
1891
|
msg = f"Received a string value ({value}) for {arg} but expected a {hinted_args}"
|
|
1882
1892
|
raise ValueError(msg) from None
|
|
@@ -215,10 +215,16 @@ def build():
|
|
|
215
215
|
)
|
|
216
216
|
processes.show_progress("Creating Production Build", process, checkpoints)
|
|
217
217
|
_duplicate_index_html_to_parent_directory(wdir / constants.Dirs.STATIC)
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
218
|
+
|
|
219
|
+
spa_fallback = wdir / constants.Dirs.STATIC / constants.ReactRouter.SPA_FALLBACK
|
|
220
|
+
if not spa_fallback.exists():
|
|
221
|
+
spa_fallback = wdir / constants.Dirs.STATIC / "index.html"
|
|
222
|
+
|
|
223
|
+
if spa_fallback.exists():
|
|
224
|
+
path_ops.cp(
|
|
225
|
+
spa_fallback,
|
|
226
|
+
wdir / constants.Dirs.STATIC / "404.html",
|
|
227
|
+
)
|
|
222
228
|
|
|
223
229
|
config = get_config()
|
|
224
230
|
|
|
@@ -743,6 +743,17 @@ def is_prod_mode() -> bool:
|
|
|
743
743
|
return current_mode == constants.Env.PROD
|
|
744
744
|
|
|
745
745
|
|
|
746
|
+
def should_prerender_routes() -> bool:
|
|
747
|
+
"""Check if the app should prerender routes.
|
|
748
|
+
|
|
749
|
+
Returns:
|
|
750
|
+
True if the app should prerender routes.
|
|
751
|
+
"""
|
|
752
|
+
if not environment.REFLEX_SSR.is_set():
|
|
753
|
+
return is_prod_mode()
|
|
754
|
+
return environment.REFLEX_SSR.get()
|
|
755
|
+
|
|
756
|
+
|
|
746
757
|
def get_compile_context() -> constants.CompileContext:
|
|
747
758
|
"""Check if the app is compiled for deploy.
|
|
748
759
|
|
|
@@ -19,6 +19,7 @@ def export(
|
|
|
19
19
|
env: constants.Env = constants.Env.PROD,
|
|
20
20
|
loglevel: constants.LogLevel = console._LOG_LEVEL,
|
|
21
21
|
backend_excluded_dirs: tuple[Path, ...] = (),
|
|
22
|
+
prerender_routes: bool = True,
|
|
22
23
|
):
|
|
23
24
|
"""Export the app to a zip file.
|
|
24
25
|
|
|
@@ -33,6 +34,7 @@ def export(
|
|
|
33
34
|
env: The environment to use. Defaults to constants.Env.PROD.
|
|
34
35
|
loglevel: The log level to use. Defaults to console._LOG_LEVEL.
|
|
35
36
|
backend_excluded_dirs: A tuple of files or directories to exclude from the backend zip. Defaults to ().
|
|
37
|
+
prerender_routes: Whether to prerender the routes. Defaults to True.
|
|
36
38
|
"""
|
|
37
39
|
config = get_config()
|
|
38
40
|
|
|
@@ -58,7 +60,7 @@ def export(
|
|
|
58
60
|
|
|
59
61
|
if frontend:
|
|
60
62
|
# Ensure module can be imported and app.compile() is called.
|
|
61
|
-
prerequisites.get_compiled_app(prerender_routes=
|
|
63
|
+
prerequisites.get_compiled_app(prerender_routes=prerender_routes)
|
|
62
64
|
# Set up .web directory and install frontend dependencies.
|
|
63
65
|
build.setup_frontend(Path.cwd())
|
|
64
66
|
|