reflex 0.8.3a3__tar.gz → 0.8.4__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.3a3 → reflex-0.8.4}/PKG-INFO +2 -2
- {reflex-0.8.3a3 → reflex-0.8.4}/pyproject.toml +41 -43
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/react-theme.js +8 -1
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/state.js +2 -2
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/app.py +6 -20
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/compiler/utils.py +6 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/installer.py +4 -4
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/custom_components/custom_components.py +1 -1
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/istate/data.py +7 -1
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/console.py +2 -1
- reflex-0.8.4/reflex/utils/decorator.py +147 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/misc.py +40 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/net.py +8 -3
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/prerequisites.py +9 -67
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/processes.py +46 -7
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/redir.py +3 -5
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/registry.py +14 -2
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/telemetry.py +2 -2
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/dep_tracking.py +27 -30
- reflex-0.8.3a3/reflex/utils/decorator.py +0 -72
- {reflex-0.8.3a3 → reflex-0.8.4}/.gitignore +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/LICENSE +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/README.md +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/apps/blank/code/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/apps/blank/code/blank.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/app/rxconfig.py.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/custom_components/README.md.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/custom_components/__init__.py.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/custom_components/demo_app.py.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/custom_components/pyproject.toml.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/custom_components/src.py.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/package.json.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/_app.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/_document.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/base_page.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/component.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/custom_component.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/index.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/macros.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/stateful_component.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/stateful_components.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/pages/utils.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/styles/styles.css.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/utils/context.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/jinja/web/utils/theme.js.jinja2 +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/.gitignore +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/app/entry.client.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/app/routes.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/components/shiki/code.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/jsconfig.json +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/postcss.config.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/react-router.config.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/client_side_routing.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/helpers/paste.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/helpers/range.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/.templates/web/vite.config.js +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/__main__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/admin.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/app_mixins/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/app_mixins/lifespan.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/app_mixins/middleware.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/app_mixins/mixin.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/assets.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/compiler/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/compiler/compiler.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/compiler/templates.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/app_wrap.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/app_wrap.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/bare.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/body.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/body.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/document.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/document.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/error_boundary.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/error_boundary.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/fragment.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/fragment.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/link.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/link.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/meta.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/meta.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/script.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/script.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/strict_mode.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/base/strict_mode.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/component.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/auto_scroll.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/auto_scroll.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/banner.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/banner.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/breakpoints.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/client_side_routing.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/client_side_routing.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/clipboard.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/clipboard.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/colors.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/cond.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/debounce.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/debounce.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/foreach.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/helmet.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/helmet.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/html.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/html.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/layout/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/match.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/responsive.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/sticky.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/sticky.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/upload.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/upload.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/window_events.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/core/window_events.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/code.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/code.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/dataeditor.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/dataeditor.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/logo.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/shiki_code_block.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/dynamic.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/constants/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/constants/html.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/constants/react.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/constants/reflex.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/element.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/element.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/base.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/forms.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/forms.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/inline.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/inline.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/media.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/media.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/metadata.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/metadata.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/other.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/other.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/scripts.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/scripts.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/sectioning.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/sectioning.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/tables.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/tables.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/typography.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/el/elements/typography.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/field.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/gridjs/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/gridjs/datatable.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/gridjs/datatable.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/literals.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/lucide/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/lucide/icon.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/lucide/icon.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/markdown/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/markdown/markdown.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/markdown/markdown.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/moment/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/moment/moment.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/moment/moment.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/plotly/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/plotly/plotly.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/plotly/plotly.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/props.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/accordion.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/accordion.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/base.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/drawer.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/drawer.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/form.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/form.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/progress.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/progress.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/slider.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/primitives/slider.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/base.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/color_mode.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/color_mode.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/avatar.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/avatar.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/badge.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/badge.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/button.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/button.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/callout.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/callout.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/card.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/card.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/checkbox.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/context_menu.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/data_list.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/data_list.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/dialog.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/dialog.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/hover_card.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/icon_button.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/inset.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/inset.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/popover.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/popover.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/progress.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/progress.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/radio.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/radio.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/radio_cards.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/radio_group.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/scroll_area.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/segmented_control.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/select.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/select.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/separator.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/separator.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/skeleton.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/slider.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/slider.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/spinner.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/spinner.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/switch.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/switch.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/table.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/table.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/tabs.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/tabs.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/text_area.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/text_area.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/text_field.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/text_field.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/tooltip.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/base.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/box.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/box.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/center.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/center.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/container.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/container.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/flex.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/flex.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/grid.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/grid.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/list.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/list.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/section.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/section.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/spacer.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/stack.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/layout/stack.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/blockquote.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/code.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/code.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/heading.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/heading.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/link.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/link.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/text.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/radix/themes/typography/text.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_player/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_player/audio.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_player/audio.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_player/react_player.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_player/react_player.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_player/video.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_player/video.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_router/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_router/dom.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/react_router/dom.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/__init__.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/cartesian.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/cartesian.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/charts.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/charts.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/general.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/general.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/polar.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/polar.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/recharts.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/recharts/recharts.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/sonner/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/sonner/toast.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/sonner/toast.pyi +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/tags/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/tags/cond_tag.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/tags/iter_tag.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/tags/match_tag.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/tags/tag.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/components/tags/tagless.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/config.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/colors.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/compiler.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/config.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/custom_components.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/event.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/route.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/state.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/constants/utils.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/custom_components/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/environment.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/event.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/experimental/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/experimental/client_state.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/experimental/hooks.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/istate/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/istate/dynamic.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/istate/manager.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/istate/proxy.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/istate/storage.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/istate/wrappers.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/middleware/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/middleware/hydrate_middleware.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/middleware/middleware.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/model.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/page.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/plugins/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/plugins/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/plugins/shared_tailwind.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/plugins/sitemap.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/plugins/tailwind_v3.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/plugins/tailwind_v4.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/py.typed +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/reflex.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/route.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/state.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/style.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/testing.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/build.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/codespaces.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/compat.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/exceptions.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/exec.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/export.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/format.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/imports.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/lazy_loader.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/path_ops.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/pyi_generator.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/serializers.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/utils/types.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/__init__.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/base.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/datetime.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/function.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/number.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/object.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/reflex/vars/sequence.py +0 -0
- {reflex-0.8.3a3 → reflex-0.8.4}/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.4
|
|
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
|
|
@@ -20,7 +20,6 @@ Classifier: Programming Language :: Python :: 3.13
|
|
|
20
20
|
Requires-Python: <4.0,>=3.10
|
|
21
21
|
Requires-Dist: alembic<2.0,>=1.15.2
|
|
22
22
|
Requires-Dist: click>=8.2
|
|
23
|
-
Requires-Dist: fastapi>=0.115.0
|
|
24
23
|
Requires-Dist: granian[reload]>=2.4.0
|
|
25
24
|
Requires-Dist: httpx<1.0,>=0.28.0
|
|
26
25
|
Requires-Dist: jinja2<4.0,>=3.1.2
|
|
@@ -34,6 +33,7 @@ Requires-Dist: redis<7.0,>=5.2.1
|
|
|
34
33
|
Requires-Dist: reflex-hosting-cli>=0.1.51
|
|
35
34
|
Requires-Dist: rich<15,>=13
|
|
36
35
|
Requires-Dist: sqlmodel<0.1,>=0.0.24
|
|
36
|
+
Requires-Dist: starlette>=0.47.0
|
|
37
37
|
Requires-Dist: typing-extensions>=4.13.0
|
|
38
38
|
Requires-Dist: wrapt<2.0,>=1.17.0
|
|
39
39
|
Description-Content-Type: text/markdown
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "reflex"
|
|
3
|
-
version = "0.8.
|
|
3
|
+
version = "0.8.4"
|
|
4
4
|
description = "Web apps in pure Python."
|
|
5
5
|
license.text = "Apache-2.0"
|
|
6
6
|
authors = [
|
|
@@ -21,7 +21,7 @@ keywords = ["web", "framework"]
|
|
|
21
21
|
requires-python = ">=3.10,<4.0"
|
|
22
22
|
dependencies = [
|
|
23
23
|
"alembic >=1.15.2,<2.0",
|
|
24
|
-
"
|
|
24
|
+
"click >=8.2",
|
|
25
25
|
"granian[reload] >=2.4.0",
|
|
26
26
|
"httpx >=0.28.0,<1.0",
|
|
27
27
|
"jinja2 >=3.1.2,<4.0",
|
|
@@ -29,13 +29,13 @@ dependencies = [
|
|
|
29
29
|
"platformdirs >=4.3.7,<5.0",
|
|
30
30
|
"psutil >=7.0.0,<8.0; sys_platform == 'win32'",
|
|
31
31
|
"pydantic >=1.10.21,<3.0",
|
|
32
|
-
"python-socketio >=5.12.0,<6.0",
|
|
33
32
|
"python-multipart >=0.0.20,<1.0",
|
|
33
|
+
"python-socketio >=5.12.0,<6.0",
|
|
34
34
|
"redis >=5.2.1,<7.0",
|
|
35
35
|
"reflex-hosting-cli >=0.1.51",
|
|
36
36
|
"rich >=13,<15",
|
|
37
37
|
"sqlmodel >=0.0.24,<0.1",
|
|
38
|
-
"
|
|
38
|
+
"starlette >=0.47.0",
|
|
39
39
|
"typing_extensions >=4.13.0",
|
|
40
40
|
"wrapt >=1.17.0,<2.0",
|
|
41
41
|
]
|
|
@@ -58,18 +58,49 @@ documentation = "https://reflex.dev/docs/getting-started/introduction"
|
|
|
58
58
|
[project.scripts]
|
|
59
59
|
reflex = "reflex.reflex:cli"
|
|
60
60
|
|
|
61
|
+
[dependency-groups]
|
|
62
|
+
dev = [
|
|
63
|
+
"asynctest",
|
|
64
|
+
"darglint",
|
|
65
|
+
"dill",
|
|
66
|
+
"fastapi",
|
|
67
|
+
"hatchling",
|
|
68
|
+
"libsass",
|
|
69
|
+
"numpy",
|
|
70
|
+
"pandas",
|
|
71
|
+
"pillow",
|
|
72
|
+
"playwright",
|
|
73
|
+
"plotly",
|
|
74
|
+
"pre-commit",
|
|
75
|
+
"psutil",
|
|
76
|
+
"psycopg[binary]",
|
|
77
|
+
"pyright",
|
|
78
|
+
"pytest-asyncio",
|
|
79
|
+
"pytest-benchmark",
|
|
80
|
+
"pytest-codspeed",
|
|
81
|
+
"pytest-cov",
|
|
82
|
+
"pytest-mock",
|
|
83
|
+
"pytest-playwright",
|
|
84
|
+
"pytest-retry",
|
|
85
|
+
"pytest-split",
|
|
86
|
+
"pytest",
|
|
87
|
+
"python-dotenv",
|
|
88
|
+
"ruff",
|
|
89
|
+
"selenium",
|
|
90
|
+
"starlette-admin",
|
|
91
|
+
"toml",
|
|
92
|
+
"uvicorn",
|
|
93
|
+
]
|
|
94
|
+
|
|
95
|
+
|
|
61
96
|
[build-system]
|
|
62
97
|
requires = ["hatchling"]
|
|
63
98
|
build-backend = "hatchling.build"
|
|
64
99
|
|
|
65
100
|
[tool.hatch.build]
|
|
66
101
|
include = ["reflex", "scripts/hatch_build.py"]
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
artifacts = ["*.pyi"]
|
|
70
|
-
|
|
71
|
-
[tool.hatch.build.targets.wheel]
|
|
72
|
-
artifacts = ["*.pyi"]
|
|
102
|
+
targets.sdist.artifacts = ["*.pyi"]
|
|
103
|
+
targets.wheel.artifacts = ["*.pyi"]
|
|
73
104
|
|
|
74
105
|
[tool.hatch.build.hooks.custom]
|
|
75
106
|
path = "scripts/hatch_build.py"
|
|
@@ -152,39 +183,6 @@ asyncio_mode = "auto"
|
|
|
152
183
|
skip = "docs/*,*.html,examples/*, *.pyi, poetry.lock, uv.lock"
|
|
153
184
|
ignore-words-list = "te, TreeE"
|
|
154
185
|
|
|
155
|
-
[dependency-groups]
|
|
156
|
-
dev = [
|
|
157
|
-
"asynctest >=0.13",
|
|
158
|
-
"darglint >=1.8",
|
|
159
|
-
"dill >=0.3",
|
|
160
|
-
"hatchling >=1.27",
|
|
161
|
-
"libsass >=0.23",
|
|
162
|
-
"numpy >=2.2",
|
|
163
|
-
"pandas >=2.2",
|
|
164
|
-
"pillow >=11",
|
|
165
|
-
"playwright >=1.51",
|
|
166
|
-
"plotly >=6.0",
|
|
167
|
-
"pre-commit ==4.2.0",
|
|
168
|
-
"psutil >=7.0.0",
|
|
169
|
-
"psycopg[binary] >=3.2",
|
|
170
|
-
"pyright >=1.1.400",
|
|
171
|
-
"pytest >=8.3",
|
|
172
|
-
"pytest-asyncio >=0.26",
|
|
173
|
-
"pytest-benchmark >=5.1",
|
|
174
|
-
"pytest-codspeed >=3.2",
|
|
175
|
-
"pytest-cov >=6.1",
|
|
176
|
-
"pytest-mock >=3.14",
|
|
177
|
-
"pytest-playwright >=0.7",
|
|
178
|
-
"pytest-retry >=1.7",
|
|
179
|
-
"pytest-split >=0.10",
|
|
180
|
-
"python-dotenv >=1",
|
|
181
|
-
"ruff >=0.11",
|
|
182
|
-
"selenium >=4.31",
|
|
183
|
-
"starlette-admin >=0.14",
|
|
184
|
-
"toml >=0.10.2",
|
|
185
|
-
"uvicorn >=0.34.0",
|
|
186
|
-
]
|
|
187
|
-
|
|
188
186
|
|
|
189
187
|
[tool.coverage.run]
|
|
190
188
|
source = ["reflex"]
|
|
@@ -21,6 +21,7 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
|
|
|
21
21
|
const [systemTheme, setSystemTheme] = useState(
|
|
22
22
|
defaultTheme !== "system" ? defaultTheme : "light",
|
|
23
23
|
);
|
|
24
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
24
25
|
|
|
25
26
|
const firstRender = useRef(true);
|
|
26
27
|
|
|
@@ -36,6 +37,7 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
|
|
|
36
37
|
if (lastCompiledTheme !== defaultColorMode) {
|
|
37
38
|
// on app startup, make sure the application color mode is persisted correctly.
|
|
38
39
|
localStorage.setItem("last_compiled_theme", defaultColorMode);
|
|
40
|
+
setIsInitialized(true);
|
|
39
41
|
return;
|
|
40
42
|
}
|
|
41
43
|
}
|
|
@@ -43,6 +45,7 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
|
|
|
43
45
|
// Load saved theme from localStorage
|
|
44
46
|
const savedTheme = localStorage.getItem("theme") || defaultTheme;
|
|
45
47
|
setTheme(savedTheme);
|
|
48
|
+
setIsInitialized(true);
|
|
46
49
|
});
|
|
47
50
|
|
|
48
51
|
const resolvedTheme = useMemo(
|
|
@@ -69,16 +72,20 @@ export function ThemeProvider({ children, defaultTheme = "system" }) {
|
|
|
69
72
|
});
|
|
70
73
|
|
|
71
74
|
// Save theme to localStorage whenever it changes
|
|
75
|
+
// Skip saving only if theme key already exists and we haven't initialized yet
|
|
72
76
|
useEffect(() => {
|
|
77
|
+
const existingTheme = localStorage.getItem("theme");
|
|
78
|
+
if (!isInitialized && existingTheme !== null) return;
|
|
73
79
|
localStorage.setItem("theme", theme);
|
|
74
80
|
}, [theme]);
|
|
75
81
|
|
|
76
82
|
useEffect(() => {
|
|
83
|
+
if (!isInitialized) return;
|
|
77
84
|
const root = window.document.documentElement;
|
|
78
85
|
root.classList.remove("light", "dark");
|
|
79
86
|
root.classList.add(resolvedTheme);
|
|
80
87
|
root.style.colorScheme = resolvedTheme;
|
|
81
|
-
}, [resolvedTheme]);
|
|
88
|
+
}, [resolvedTheme, isInitialized]);
|
|
82
89
|
|
|
83
90
|
return createElement(
|
|
84
91
|
ThemeContext.Provider,
|
|
@@ -791,9 +791,9 @@ export const hydrateClientStorage = (client_storage) => {
|
|
|
791
791
|
for (const state_key in client_storage.cookies) {
|
|
792
792
|
const cookie_options = client_storage.cookies[state_key];
|
|
793
793
|
const cookie_name = cookie_options.name || state_key;
|
|
794
|
-
const cookie_value = cookies.get(cookie_name);
|
|
794
|
+
const cookie_value = cookies.get(cookie_name, { doNotParse: true });
|
|
795
795
|
if (cookie_value !== undefined) {
|
|
796
|
-
client_storage_values[state_key] =
|
|
796
|
+
client_storage_values[state_key] = cookie_value;
|
|
797
797
|
}
|
|
798
798
|
}
|
|
799
799
|
}
|
|
@@ -28,7 +28,6 @@ from timeit import default_timer as timer
|
|
|
28
28
|
from types import SimpleNamespace
|
|
29
29
|
from typing import TYPE_CHECKING, Any, BinaryIO, ParamSpec, get_args, get_type_hints
|
|
30
30
|
|
|
31
|
-
from fastapi import FastAPI
|
|
32
31
|
from rich.progress import MofNCompleteColumn, Progress, TimeElapsedColumn
|
|
33
32
|
from socketio import ASGIApp as EngineIOApp
|
|
34
33
|
from socketio import AsyncNamespace, AsyncServer
|
|
@@ -441,9 +440,6 @@ class App(MiddlewareMixin, LifespanMixin):
|
|
|
441
440
|
| None
|
|
442
441
|
) = None
|
|
443
442
|
|
|
444
|
-
# FastAPI app for compatibility with FastAPI.
|
|
445
|
-
_cached_fastapi_app: FastAPI | None = None
|
|
446
|
-
|
|
447
443
|
@property
|
|
448
444
|
def event_namespace(self) -> EventNamespace | None:
|
|
449
445
|
"""Get the event namespace.
|
|
@@ -598,32 +594,22 @@ class App(MiddlewareMixin, LifespanMixin):
|
|
|
598
594
|
Returns:
|
|
599
595
|
The backend api.
|
|
600
596
|
"""
|
|
597
|
+
from reflex.vars.base import GLOBAL_CACHE
|
|
598
|
+
|
|
601
599
|
# For py3.9 compatibility when redis is used, we MUST add any decorator pages
|
|
602
600
|
# before compiling the app in a thread to avoid event loop error (REF-2172).
|
|
603
601
|
self._apply_decorated_pages()
|
|
604
602
|
|
|
605
|
-
|
|
606
|
-
self._compile, prerender_routes=is_prod_mode()
|
|
607
|
-
)
|
|
603
|
+
self._compile(prerender_routes=is_prod_mode())
|
|
608
604
|
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
return f.result()
|
|
612
|
-
|
|
613
|
-
compile_future.add_done_callback(callback)
|
|
614
|
-
# Wait for the compile to finish to ensure all optional endpoints are mounted.
|
|
615
|
-
compile_future.result()
|
|
605
|
+
# We will not be making more vars, so we can clear the global cache to free up memory.
|
|
606
|
+
GLOBAL_CACHE.clear()
|
|
616
607
|
|
|
617
608
|
if not self._api:
|
|
618
609
|
msg = "The app has not been initialized."
|
|
619
610
|
raise ValueError(msg)
|
|
620
611
|
|
|
621
|
-
|
|
622
|
-
asgi_app = self._cached_fastapi_app
|
|
623
|
-
asgi_app.mount("", self._api)
|
|
624
|
-
App._add_cors(asgi_app)
|
|
625
|
-
else:
|
|
626
|
-
asgi_app = self._api
|
|
612
|
+
asgi_app = self._api
|
|
627
613
|
|
|
628
614
|
if self.api_transformer is not None:
|
|
629
615
|
api_transformers: Sequence[Starlette | Callable[[ASGIApp], ASGIApp]] = (
|
|
@@ -359,6 +359,8 @@ def create_document_root(
|
|
|
359
359
|
Returns:
|
|
360
360
|
The document root.
|
|
361
361
|
"""
|
|
362
|
+
from reflex.utils.misc import preload_color_theme
|
|
363
|
+
|
|
362
364
|
existing_meta_types = set()
|
|
363
365
|
|
|
364
366
|
for component in head_components or []:
|
|
@@ -385,7 +387,11 @@ def create_document_root(
|
|
|
385
387
|
Meta.create(name="viewport", content="width=device-width, initial-scale=1")
|
|
386
388
|
)
|
|
387
389
|
|
|
390
|
+
# Add theme preload script as the very first component to prevent FOUC
|
|
391
|
+
theme_preload_components = [preload_color_theme()]
|
|
392
|
+
|
|
388
393
|
head_components = [
|
|
394
|
+
*theme_preload_components,
|
|
389
395
|
*(head_components or []),
|
|
390
396
|
*maybe_head_components,
|
|
391
397
|
*always_head_components,
|
|
@@ -14,7 +14,7 @@ class Bun(SimpleNamespace):
|
|
|
14
14
|
"""Bun constants."""
|
|
15
15
|
|
|
16
16
|
# The Bun version.
|
|
17
|
-
VERSION = "1.2.
|
|
17
|
+
VERSION = "1.2.19"
|
|
18
18
|
|
|
19
19
|
# Min Bun Version
|
|
20
20
|
MIN_VERSION = "1.2.17"
|
|
@@ -75,7 +75,7 @@ fetch-retries=0
|
|
|
75
75
|
|
|
76
76
|
|
|
77
77
|
def _determine_react_router_version() -> str:
|
|
78
|
-
default_version = "7.
|
|
78
|
+
default_version = "7.7.0"
|
|
79
79
|
if (version := os.getenv("REACT_ROUTER_VERSION")) and version != default_version:
|
|
80
80
|
from reflex.utils import console
|
|
81
81
|
|
|
@@ -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
|
-
"rolldown-vite": "7.0.
|
|
146
|
+
"rolldown-vite": "7.0.11",
|
|
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
|
-
"rollup": "4.
|
|
152
|
+
"rollup": "4.45.1",
|
|
153
153
|
}
|
|
@@ -12,7 +12,6 @@ from pathlib import Path
|
|
|
12
12
|
from typing import Any
|
|
13
13
|
|
|
14
14
|
import click
|
|
15
|
-
import httpx
|
|
16
15
|
|
|
17
16
|
from reflex import constants
|
|
18
17
|
from reflex.constants import CustomComponents
|
|
@@ -467,6 +466,7 @@ def _collect_details_for_gallery():
|
|
|
467
466
|
Raises:
|
|
468
467
|
Exit: If pyproject.toml file is ill-formed or the request to the backend services fails.
|
|
469
468
|
"""
|
|
469
|
+
import httpx
|
|
470
470
|
from reflex_cli.utils import hosting
|
|
471
471
|
|
|
472
472
|
console.rule("[bold]Authentication with Reflex Services")
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
import dataclasses
|
|
4
4
|
from collections.abc import Mapping
|
|
5
5
|
from typing import TYPE_CHECKING
|
|
6
|
-
from urllib.parse import _NetlocResultMixinStr, urlsplit
|
|
6
|
+
from urllib.parse import _NetlocResultMixinStr, parse_qsl, urlsplit
|
|
7
7
|
|
|
8
8
|
from reflex import constants
|
|
9
9
|
from reflex.utils import console, format
|
|
@@ -102,8 +102,10 @@ class ReflexURL(str, _NetlocResultMixinStr):
|
|
|
102
102
|
if TYPE_CHECKING:
|
|
103
103
|
scheme: str
|
|
104
104
|
netloc: str
|
|
105
|
+
origin: str
|
|
105
106
|
path: str
|
|
106
107
|
query: str
|
|
108
|
+
query_parameters: Mapping[str, str]
|
|
107
109
|
fragment: str
|
|
108
110
|
|
|
109
111
|
def __new__(cls, url: str):
|
|
@@ -121,6 +123,10 @@ class ReflexURL(str, _NetlocResultMixinStr):
|
|
|
121
123
|
object.__setattr__(obj, "netloc", netloc)
|
|
122
124
|
object.__setattr__(obj, "path", path)
|
|
123
125
|
object.__setattr__(obj, "query", query)
|
|
126
|
+
object.__setattr__(obj, "origin", f"{scheme}://{netloc}")
|
|
127
|
+
object.__setattr__(
|
|
128
|
+
obj, "query_parameters", _FrozenDictStrStr(**dict(parse_qsl(query)))
|
|
129
|
+
)
|
|
124
130
|
object.__setattr__(obj, "fragment", fragment)
|
|
125
131
|
return obj
|
|
126
132
|
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
5
5
|
import contextlib
|
|
6
|
+
import datetime
|
|
6
7
|
import inspect
|
|
7
8
|
import os
|
|
8
9
|
import shutil
|
|
@@ -136,7 +137,7 @@ def print_to_log_file(msg: str, *, dedupe: bool = False, **kwargs):
|
|
|
136
137
|
dedupe: If True, suppress multiple console logs of print message.
|
|
137
138
|
kwargs: Keyword arguments to pass to the print function.
|
|
138
139
|
"""
|
|
139
|
-
log_file_console().print(msg, **kwargs)
|
|
140
|
+
log_file_console().print(f"[{datetime.datetime.now()}] {msg}", **kwargs)
|
|
140
141
|
|
|
141
142
|
|
|
142
143
|
def debug(msg: str, *, dedupe: bool = False, **kwargs):
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
"""Decorator utilities."""
|
|
2
|
+
|
|
3
|
+
import functools
|
|
4
|
+
from collections.abc import Callable
|
|
5
|
+
from pathlib import Path
|
|
6
|
+
from typing import ParamSpec, TypeVar, cast
|
|
7
|
+
|
|
8
|
+
T = TypeVar("T")
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
def once(f: Callable[[], T]) -> Callable[[], T]:
|
|
12
|
+
"""A decorator that calls the function once and caches the result.
|
|
13
|
+
|
|
14
|
+
Args:
|
|
15
|
+
f: The function to call.
|
|
16
|
+
|
|
17
|
+
Returns:
|
|
18
|
+
A function that calls the function once and caches the result.
|
|
19
|
+
"""
|
|
20
|
+
unset = object()
|
|
21
|
+
value: object | T = unset
|
|
22
|
+
|
|
23
|
+
@functools.wraps(f)
|
|
24
|
+
def wrapper() -> T:
|
|
25
|
+
nonlocal value
|
|
26
|
+
value = f() if value is unset else value
|
|
27
|
+
return value # pyright: ignore[reportReturnType]
|
|
28
|
+
|
|
29
|
+
return wrapper
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
def once_unless_none(f: Callable[[], T | None]) -> Callable[[], T | None]:
|
|
33
|
+
"""A decorator that calls the function once and caches the result unless it is None.
|
|
34
|
+
|
|
35
|
+
Args:
|
|
36
|
+
f: The function to call.
|
|
37
|
+
|
|
38
|
+
Returns:
|
|
39
|
+
A function that calls the function once and caches the result unless it is None.
|
|
40
|
+
"""
|
|
41
|
+
value: T | None = None
|
|
42
|
+
|
|
43
|
+
@functools.wraps(f)
|
|
44
|
+
def wrapper() -> T | None:
|
|
45
|
+
nonlocal value
|
|
46
|
+
value = f() if value is None else value
|
|
47
|
+
return value
|
|
48
|
+
|
|
49
|
+
return wrapper
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
P = ParamSpec("P")
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def debug(f: Callable[P, T]) -> Callable[P, T]:
|
|
56
|
+
"""A decorator that prints the function name, arguments, and result.
|
|
57
|
+
|
|
58
|
+
Args:
|
|
59
|
+
f: The function to call.
|
|
60
|
+
|
|
61
|
+
Returns:
|
|
62
|
+
A function that prints the function name, arguments, and result.
|
|
63
|
+
"""
|
|
64
|
+
|
|
65
|
+
@functools.wraps(f)
|
|
66
|
+
def wrapper(*args: P.args, **kwargs: P.kwargs) -> T:
|
|
67
|
+
result = f(*args, **kwargs)
|
|
68
|
+
print( # noqa: T201
|
|
69
|
+
f"Calling {f.__name__} with args: {args} and kwargs: {kwargs}, result: {result}"
|
|
70
|
+
)
|
|
71
|
+
return result
|
|
72
|
+
|
|
73
|
+
return wrapper
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
def _write_cached_procedure_file(payload: str, cache_file: Path, value: object):
|
|
77
|
+
import pickle
|
|
78
|
+
|
|
79
|
+
cache_file.write_bytes(pickle.dumps((payload, value)))
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def _read_cached_procedure_file(cache_file: Path) -> tuple[str | None, object]:
|
|
83
|
+
import pickle
|
|
84
|
+
|
|
85
|
+
if cache_file.exists():
|
|
86
|
+
with cache_file.open("rb") as f:
|
|
87
|
+
return pickle.loads(f.read())
|
|
88
|
+
|
|
89
|
+
return None, None
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
P = ParamSpec("P")
|
|
93
|
+
Picklable = TypeVar("Picklable")
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
def cached_procedure(
|
|
97
|
+
cache_file_path: Callable[[], Path],
|
|
98
|
+
payload_fn: Callable[P, str],
|
|
99
|
+
) -> Callable[[Callable[P, Picklable]], Callable[P, Picklable]]:
|
|
100
|
+
"""Decorator to cache the result of a function based on its arguments.
|
|
101
|
+
|
|
102
|
+
Args:
|
|
103
|
+
cache_file_path: Function that computes the cache file path.
|
|
104
|
+
payload_fn: Function that computes cache payload from function args.
|
|
105
|
+
|
|
106
|
+
Returns:
|
|
107
|
+
The decorated function.
|
|
108
|
+
"""
|
|
109
|
+
|
|
110
|
+
def _inner_decorator(func: Callable[P, Picklable]) -> Callable[P, Picklable]:
|
|
111
|
+
def _inner(*args: P.args, **kwargs: P.kwargs) -> Picklable:
|
|
112
|
+
_cache_file = cache_file_path()
|
|
113
|
+
|
|
114
|
+
payload, value = _read_cached_procedure_file(_cache_file)
|
|
115
|
+
new_payload = payload_fn(*args, **kwargs)
|
|
116
|
+
|
|
117
|
+
if payload != new_payload:
|
|
118
|
+
new_value = func(*args, **kwargs)
|
|
119
|
+
_write_cached_procedure_file(new_payload, _cache_file, new_value)
|
|
120
|
+
return new_value
|
|
121
|
+
|
|
122
|
+
from reflex.utils import console
|
|
123
|
+
|
|
124
|
+
console.debug(
|
|
125
|
+
f"Using cached value for {func.__name__} with payload: {new_payload}"
|
|
126
|
+
)
|
|
127
|
+
return cast("Picklable", value)
|
|
128
|
+
|
|
129
|
+
return _inner
|
|
130
|
+
|
|
131
|
+
return _inner_decorator
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
def cache_result_in_disk(
|
|
135
|
+
cache_file_path: Callable[[], Path],
|
|
136
|
+
) -> Callable[[Callable[[], Picklable]], Callable[[], Picklable]]:
|
|
137
|
+
"""Decorator to cache the result of a function on disk.
|
|
138
|
+
|
|
139
|
+
Args:
|
|
140
|
+
cache_file_path: Function that computes the cache file path.
|
|
141
|
+
|
|
142
|
+
Returns:
|
|
143
|
+
The decorated function.
|
|
144
|
+
"""
|
|
145
|
+
return cached_procedure(
|
|
146
|
+
cache_file_path=cache_file_path, payload_fn=lambda: "constant"
|
|
147
|
+
)
|
|
@@ -90,3 +90,43 @@ def with_cwd_in_syspath():
|
|
|
90
90
|
yield
|
|
91
91
|
finally:
|
|
92
92
|
sys.path[:] = orig_sys_path
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
def preload_color_theme():
|
|
96
|
+
"""Create a script component that preloads the color theme to prevent FOUC.
|
|
97
|
+
|
|
98
|
+
This script runs immediately in the document head before React hydration,
|
|
99
|
+
reading the saved theme from localStorage and applying the correct CSS classes
|
|
100
|
+
to prevent flash of unstyled content.
|
|
101
|
+
|
|
102
|
+
Returns:
|
|
103
|
+
Script: A script component to add to App.head_components
|
|
104
|
+
"""
|
|
105
|
+
from reflex.components.el.elements.scripts import Script
|
|
106
|
+
|
|
107
|
+
# Create direct inline script content (like next-themes dangerouslySetInnerHTML)
|
|
108
|
+
script_content = """
|
|
109
|
+
// Only run in browser environment, not during SSR
|
|
110
|
+
if (typeof document !== 'undefined') {
|
|
111
|
+
try {
|
|
112
|
+
const theme = localStorage.getItem("theme") || "system";
|
|
113
|
+
const systemPreference = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
114
|
+
const resolvedTheme = theme === "system" ? systemPreference : theme;
|
|
115
|
+
|
|
116
|
+
// Apply theme immediately - blocks until complete
|
|
117
|
+
// Use classList to avoid overwriting other classes
|
|
118
|
+
document.documentElement.classList.remove("light", "dark");
|
|
119
|
+
document.documentElement.classList.add(resolvedTheme);
|
|
120
|
+
document.documentElement.style.colorScheme = resolvedTheme;
|
|
121
|
+
|
|
122
|
+
} catch (e) {
|
|
123
|
+
// Fallback to system preference on any error (resolve "system" to actual theme)
|
|
124
|
+
const fallbackTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
|
|
125
|
+
document.documentElement.classList.remove("light", "dark");
|
|
126
|
+
document.documentElement.classList.add(fallbackTheme);
|
|
127
|
+
document.documentElement.style.colorScheme = fallbackTheme;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
"""
|
|
131
|
+
|
|
132
|
+
return Script.create(script_content)
|
|
@@ -5,8 +5,6 @@ import time
|
|
|
5
5
|
from collections.abc import Callable
|
|
6
6
|
from typing import ParamSpec, TypeVar
|
|
7
7
|
|
|
8
|
-
import httpx
|
|
9
|
-
|
|
10
8
|
from reflex.utils.decorator import once
|
|
11
9
|
from reflex.utils.types import Unset
|
|
12
10
|
|
|
@@ -42,6 +40,8 @@ def _wrap_https_func(
|
|
|
42
40
|
|
|
43
41
|
@functools.wraps(func)
|
|
44
42
|
def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _T:
|
|
43
|
+
import httpx
|
|
44
|
+
|
|
45
45
|
url = args[0]
|
|
46
46
|
console.debug(f"Sending HTTPS request to {args[0]}")
|
|
47
47
|
initial_time = time.time()
|
|
@@ -94,6 +94,8 @@ def _is_ipv4_supported() -> bool:
|
|
|
94
94
|
Returns:
|
|
95
95
|
True if the system supports IPv4, False otherwise.
|
|
96
96
|
"""
|
|
97
|
+
import httpx
|
|
98
|
+
|
|
97
99
|
try:
|
|
98
100
|
httpx.head("http://1.1.1.1", timeout=3)
|
|
99
101
|
except httpx.RequestError:
|
|
@@ -108,6 +110,8 @@ def _is_ipv6_supported() -> bool:
|
|
|
108
110
|
Returns:
|
|
109
111
|
True if the system supports IPv6, False otherwise.
|
|
110
112
|
"""
|
|
113
|
+
import httpx
|
|
114
|
+
|
|
111
115
|
try:
|
|
112
116
|
httpx.head("http://[2606:4700:4700::1111]", timeout=3)
|
|
113
117
|
except httpx.RequestError:
|
|
@@ -139,12 +143,13 @@ def _httpx_local_address_kwarg() -> str:
|
|
|
139
143
|
|
|
140
144
|
|
|
141
145
|
@once
|
|
142
|
-
def _httpx_client()
|
|
146
|
+
def _httpx_client():
|
|
143
147
|
"""Get an HTTPX client.
|
|
144
148
|
|
|
145
149
|
Returns:
|
|
146
150
|
An HTTPX client.
|
|
147
151
|
"""
|
|
152
|
+
import httpx
|
|
148
153
|
from httpx._utils import get_environment_proxies
|
|
149
154
|
|
|
150
155
|
return httpx.Client(
|