reflex 0.8.10a1__tar.gz → 0.8.11__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.10a1 → reflex-0.8.11}/PKG-INFO +1 -1
- {reflex-0.8.10a1 → reflex-0.8.11}/pyproject.toml +3 -3
- reflex-0.8.11/reflex/.templates/web/utils/helpers/upload.js +170 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/utils/state.js +5 -158
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/app.py +15 -6
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/compiler/compiler.py +4 -4
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/compiler/templates.py +3 -2
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/component.py +10 -28
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/upload.py +2 -2
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/code.py +2 -2
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/code.pyi +6 -2
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/field.py +5 -1
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/lucide/icon.py +2 -1
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/lucide/icon.pyi +2 -1
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/props.py +15 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/recharts.py +2 -2
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/installer.py +2 -2
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/state.py +1 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/environment.py +1 -1
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/event.py +34 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/plugins/tailwind_v4.py +2 -2
- {reflex-0.8.10a1 → reflex-0.8.11}/.gitignore +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/LICENSE +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/README.md +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/apps/blank/assets/favicon.ico +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/apps/blank/code/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/apps/blank/code/blank.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/.gitignore +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/app/entry.client.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/app/routes.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/components/reflex/radix_themes_color_mode_provider.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/components/shiki/code.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/jsconfig.json +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/postcss.config.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/react-router.config.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/styles/__reflex_style_reset.css +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/utils/helpers/dataeditor.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/utils/helpers/debounce.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/utils/helpers/paste.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/utils/helpers/range.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/utils/helpers/throttle.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/utils/react-theme.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/.templates/web/vite-plugin-safari-cachebust.js +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/__main__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/admin.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/app_mixins/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/app_mixins/lifespan.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/app_mixins/middleware.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/app_mixins/mixin.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/assets.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/compiler/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/compiler/utils.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/app_wrap.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/app_wrap.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/bare.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/body.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/body.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/document.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/document.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/error_boundary.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/error_boundary.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/fragment.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/fragment.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/link.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/link.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/meta.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/meta.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/script.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/script.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/strict_mode.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/base/strict_mode.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/auto_scroll.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/auto_scroll.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/banner.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/banner.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/breakpoints.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/clipboard.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/clipboard.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/colors.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/cond.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/debounce.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/debounce.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/foreach.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/helmet.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/helmet.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/html.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/html.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/layout/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/match.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/responsive.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/sticky.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/sticky.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/upload.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/window_events.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/core/window_events.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/dataeditor.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/dataeditor.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/logo.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/shiki_code_block.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/datadisplay/shiki_code_block.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/dynamic.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/element.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/element.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/base.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/forms.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/forms.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/inline.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/inline.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/media.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/media.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/metadata.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/metadata.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/other.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/other.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/scripts.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/scripts.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/sectioning.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/sectioning.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/tables.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/tables.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/typography.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/el/elements/typography.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/gridjs/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/gridjs/datatable.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/gridjs/datatable.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/literals.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/lucide/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/markdown/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/markdown/markdown.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/markdown/markdown.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/moment/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/moment/moment.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/moment/moment.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/plotly/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/plotly/plotly.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/plotly/plotly.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/accordion.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/accordion.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/base.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/drawer.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/drawer.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/form.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/form.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/progress.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/progress.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/slider.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/primitives/slider.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/base.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/color_mode.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/color_mode.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/alert_dialog.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/alert_dialog.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/aspect_ratio.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/aspect_ratio.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/avatar.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/avatar.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/badge.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/badge.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/button.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/button.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/callout.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/callout.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/card.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/card.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/checkbox.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/checkbox.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/checkbox_cards.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/checkbox_cards.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/checkbox_group.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/checkbox_group.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/context_menu.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/context_menu.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/data_list.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/data_list.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/dialog.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/dialog.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/dropdown_menu.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/dropdown_menu.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/hover_card.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/hover_card.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/icon_button.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/icon_button.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/inset.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/inset.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/popover.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/popover.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/progress.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/progress.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/radio.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/radio.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/radio_cards.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/radio_cards.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/radio_group.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/radio_group.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/scroll_area.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/scroll_area.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/segmented_control.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/segmented_control.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/select.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/select.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/separator.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/separator.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/skeleton.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/skeleton.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/slider.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/slider.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/spinner.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/spinner.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/switch.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/switch.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/table.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/table.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/tabs.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/tabs.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/text_area.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/text_area.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/text_field.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/text_field.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/tooltip.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/components/tooltip.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/base.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/box.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/box.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/center.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/center.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/container.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/container.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/flex.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/flex.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/grid.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/grid.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/list.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/list.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/section.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/section.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/spacer.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/spacer.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/stack.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/layout/stack.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/blockquote.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/blockquote.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/code.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/code.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/heading.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/heading.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/link.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/link.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/text.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/radix/themes/typography/text.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_player/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_player/audio.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_player/audio.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_player/react_player.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_player/react_player.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_player/video.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_player/video.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_router/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_router/dom.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/react_router/dom.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/__init__.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/cartesian.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/cartesian.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/charts.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/charts.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/general.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/general.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/polar.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/polar.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/recharts/recharts.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/sonner/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/sonner/toast.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/sonner/toast.pyi +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/tags/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/tags/cond_tag.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/tags/iter_tag.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/tags/match_tag.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/tags/tag.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/components/tags/tagless.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/config.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/colors.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/compiler.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/config.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/custom_components.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/event.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/route.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/constants/utils.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/custom_components/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/custom_components/custom_components.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/experimental/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/experimental/client_state.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/experimental/hooks.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/istate/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/istate/data.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/istate/dynamic.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/istate/manager.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/istate/proxy.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/istate/storage.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/istate/wrappers.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/middleware/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/middleware/hydrate_middleware.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/middleware/middleware.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/model.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/page.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/plugins/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/plugins/_screenshot.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/plugins/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/plugins/shared_tailwind.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/plugins/sitemap.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/plugins/tailwind_v3.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/py.typed +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/reflex.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/route.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/state.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/style.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/testing.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/build.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/codespaces.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/compat.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/console.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/decorator.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/exceptions.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/exec.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/export.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/format.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/frontend_skeleton.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/imports.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/js_runtimes.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/lazy_loader.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/misc.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/monitoring.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/net.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/path_ops.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/prerequisites.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/processes.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/pyi_generator.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/redir.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/registry.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/rename.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/serializers.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/telemetry.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/templates.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/token_manager.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/utils/types.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/__init__.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/base.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/datetime.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/dep_tracking.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/function.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/number.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/object.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/reflex/vars/sequence.py +0 -0
- {reflex-0.8.10a1 → reflex-0.8.11}/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.11"
|
|
4
4
|
description = "Web apps in pure Python."
|
|
5
5
|
license.text = "Apache-2.0"
|
|
6
6
|
authors = [
|
|
@@ -230,7 +230,7 @@ fail_fast = true
|
|
|
230
230
|
|
|
231
231
|
[[tool.pre-commit.repos]]
|
|
232
232
|
repo = "https://github.com/astral-sh/ruff-pre-commit"
|
|
233
|
-
rev = "v0.12.
|
|
233
|
+
rev = "v0.12.12"
|
|
234
234
|
hooks = [
|
|
235
235
|
{ id = "ruff-format", args = [
|
|
236
236
|
"reflex",
|
|
@@ -262,7 +262,7 @@ hooks = [
|
|
|
262
262
|
|
|
263
263
|
[[tool.pre-commit.repos]]
|
|
264
264
|
repo = "https://github.com/RobertCraigie/pyright-python"
|
|
265
|
-
rev = "v1.1.
|
|
265
|
+
rev = "v1.1.405"
|
|
266
266
|
hooks = [{ id = "pyright", args = ["reflex", "tests"], language = "system" }]
|
|
267
267
|
|
|
268
268
|
[[tool.pre-commit.repos]]
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import JSON5 from "json5";
|
|
2
|
+
import env from "$/env.json";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Upload files to the server.
|
|
6
|
+
*
|
|
7
|
+
* @param state The state to apply the delta to.
|
|
8
|
+
* @param handler The handler to use.
|
|
9
|
+
* @param upload_id The upload id to use.
|
|
10
|
+
* @param on_upload_progress The function to call on upload progress.
|
|
11
|
+
* @param socket the websocket connection
|
|
12
|
+
* @param extra_headers Extra headers to send with the request.
|
|
13
|
+
* @param refs The refs object to store the abort controller in.
|
|
14
|
+
* @param getBackendURL Function to get the backend URL.
|
|
15
|
+
* @param getToken Function to get the Reflex token.
|
|
16
|
+
*
|
|
17
|
+
* @returns The response from posting to the UPLOADURL endpoint.
|
|
18
|
+
*/
|
|
19
|
+
export const uploadFiles = async (
|
|
20
|
+
handler,
|
|
21
|
+
files,
|
|
22
|
+
upload_id,
|
|
23
|
+
on_upload_progress,
|
|
24
|
+
extra_headers,
|
|
25
|
+
socket,
|
|
26
|
+
refs,
|
|
27
|
+
getBackendURL,
|
|
28
|
+
getToken,
|
|
29
|
+
) => {
|
|
30
|
+
// return if there's no file to upload
|
|
31
|
+
if (files === undefined || files.length === 0) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const upload_ref_name = `__upload_controllers_${upload_id}`;
|
|
36
|
+
|
|
37
|
+
if (refs[upload_ref_name]) {
|
|
38
|
+
console.log("Upload already in progress for ", upload_id);
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Track how many partial updates have been processed for this upload.
|
|
43
|
+
let resp_idx = 0;
|
|
44
|
+
const eventHandler = (progressEvent) => {
|
|
45
|
+
const event_callbacks = socket._callbacks.$event;
|
|
46
|
+
// Whenever called, responseText will contain the entire response so far.
|
|
47
|
+
const chunks = progressEvent.event.target.responseText.trim().split("\n");
|
|
48
|
+
// So only process _new_ chunks beyond resp_idx.
|
|
49
|
+
chunks.slice(resp_idx).map((chunk_json) => {
|
|
50
|
+
try {
|
|
51
|
+
const chunk = JSON5.parse(chunk_json);
|
|
52
|
+
event_callbacks.map((f, ix) => {
|
|
53
|
+
f(chunk)
|
|
54
|
+
.then(() => {
|
|
55
|
+
if (ix === event_callbacks.length - 1) {
|
|
56
|
+
// Mark this chunk as processed.
|
|
57
|
+
resp_idx += 1;
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
.catch((e) => {
|
|
61
|
+
if (progressEvent.progress === 1) {
|
|
62
|
+
// Chunk may be incomplete, so only report errors when full response is available.
|
|
63
|
+
console.log("Error processing chunk", chunk, e);
|
|
64
|
+
}
|
|
65
|
+
return;
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
} catch (e) {
|
|
69
|
+
if (progressEvent.progress === 1) {
|
|
70
|
+
console.log("Error parsing chunk", chunk_json, e);
|
|
71
|
+
}
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
});
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const controller = new AbortController();
|
|
78
|
+
const formdata = new FormData();
|
|
79
|
+
|
|
80
|
+
// Add the token and handler to the file name.
|
|
81
|
+
files.forEach((file) => {
|
|
82
|
+
formdata.append("files", file, file.path || file.name);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
// Send the file to the server.
|
|
86
|
+
refs[upload_ref_name] = controller;
|
|
87
|
+
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
const xhr = new XMLHttpRequest();
|
|
90
|
+
|
|
91
|
+
// Set up event handlers
|
|
92
|
+
xhr.onload = function () {
|
|
93
|
+
if (xhr.status >= 200 && xhr.status < 300) {
|
|
94
|
+
resolve({
|
|
95
|
+
data: xhr.responseText,
|
|
96
|
+
status: xhr.status,
|
|
97
|
+
statusText: xhr.statusText,
|
|
98
|
+
headers: {
|
|
99
|
+
get: (name) => xhr.getResponseHeader(name),
|
|
100
|
+
},
|
|
101
|
+
});
|
|
102
|
+
} else {
|
|
103
|
+
reject(new Error(`HTTP error! status: ${xhr.status}`));
|
|
104
|
+
}
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
xhr.onerror = function () {
|
|
108
|
+
reject(new Error("Network error"));
|
|
109
|
+
};
|
|
110
|
+
|
|
111
|
+
xhr.onabort = function () {
|
|
112
|
+
reject(new Error("Upload aborted"));
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// Handle upload progress
|
|
116
|
+
if (on_upload_progress) {
|
|
117
|
+
xhr.upload.onprogress = function (event) {
|
|
118
|
+
if (event.lengthComputable) {
|
|
119
|
+
const progressEvent = {
|
|
120
|
+
loaded: event.loaded,
|
|
121
|
+
total: event.total,
|
|
122
|
+
progress: event.loaded / event.total,
|
|
123
|
+
};
|
|
124
|
+
on_upload_progress(progressEvent);
|
|
125
|
+
}
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// Handle download progress with streaming response parsing
|
|
130
|
+
xhr.onprogress = function (event) {
|
|
131
|
+
if (eventHandler) {
|
|
132
|
+
const progressEvent = {
|
|
133
|
+
event: {
|
|
134
|
+
target: {
|
|
135
|
+
responseText: xhr.responseText,
|
|
136
|
+
},
|
|
137
|
+
},
|
|
138
|
+
progress: event.lengthComputable ? event.loaded / event.total : 0,
|
|
139
|
+
};
|
|
140
|
+
eventHandler(progressEvent);
|
|
141
|
+
}
|
|
142
|
+
};
|
|
143
|
+
|
|
144
|
+
// Handle abort controller
|
|
145
|
+
controller.signal.addEventListener("abort", () => {
|
|
146
|
+
xhr.abort();
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
// Configure and send request
|
|
150
|
+
xhr.open("POST", getBackendURL(env.UPLOAD));
|
|
151
|
+
xhr.setRequestHeader("Reflex-Client-Token", getToken());
|
|
152
|
+
xhr.setRequestHeader("Reflex-Event-Handler", handler);
|
|
153
|
+
for (const [key, value] of Object.entries(extra_headers || {})) {
|
|
154
|
+
xhr.setRequestHeader(key, value);
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
try {
|
|
158
|
+
xhr.send(formdata);
|
|
159
|
+
} catch (error) {
|
|
160
|
+
reject(error);
|
|
161
|
+
}
|
|
162
|
+
})
|
|
163
|
+
.catch((error) => {
|
|
164
|
+
console.log("Upload error:", error.message);
|
|
165
|
+
return false;
|
|
166
|
+
})
|
|
167
|
+
.finally(() => {
|
|
168
|
+
delete refs[upload_ref_name];
|
|
169
|
+
});
|
|
170
|
+
};
|
|
@@ -20,10 +20,10 @@ import {
|
|
|
20
20
|
} from "$/utils/context";
|
|
21
21
|
import debounce from "$/utils/helpers/debounce";
|
|
22
22
|
import throttle from "$/utils/helpers/throttle";
|
|
23
|
+
import { uploadFiles } from "$/utils/helpers/upload";
|
|
23
24
|
|
|
24
25
|
// Endpoint URLs.
|
|
25
26
|
const EVENTURL = env.EVENT;
|
|
26
|
-
const UPLOADURL = env.UPLOAD;
|
|
27
27
|
|
|
28
28
|
// These hostnames indicate that the backend and frontend are reachable via the same domain.
|
|
29
29
|
const SAME_DOMAIN_HOSTNAMES = ["localhost", "0.0.0.0", "::", "0:0:0:0:0:0:0:0"];
|
|
@@ -432,7 +432,11 @@ export const applyRestEvent = async (event, socket, navigate, params) => {
|
|
|
432
432
|
event.payload.files,
|
|
433
433
|
event.payload.upload_id,
|
|
434
434
|
event.payload.on_upload_progress,
|
|
435
|
+
event.payload.extra_headers,
|
|
435
436
|
socket,
|
|
437
|
+
refs,
|
|
438
|
+
getBackendURL,
|
|
439
|
+
getToken,
|
|
436
440
|
);
|
|
437
441
|
return false;
|
|
438
442
|
}
|
|
@@ -614,163 +618,6 @@ export const connect = async (
|
|
|
614
618
|
document.addEventListener("visibilitychange", checkVisibility);
|
|
615
619
|
};
|
|
616
620
|
|
|
617
|
-
/**
|
|
618
|
-
* Upload files to the server.
|
|
619
|
-
*
|
|
620
|
-
* @param state The state to apply the delta to.
|
|
621
|
-
* @param handler The handler to use.
|
|
622
|
-
* @param upload_id The upload id to use.
|
|
623
|
-
* @param on_upload_progress The function to call on upload progress.
|
|
624
|
-
* @param socket the websocket connection
|
|
625
|
-
*
|
|
626
|
-
* @returns The response from posting to the UPLOADURL endpoint.
|
|
627
|
-
*/
|
|
628
|
-
export const uploadFiles = async (
|
|
629
|
-
handler,
|
|
630
|
-
files,
|
|
631
|
-
upload_id,
|
|
632
|
-
on_upload_progress,
|
|
633
|
-
socket,
|
|
634
|
-
) => {
|
|
635
|
-
// return if there's no file to upload
|
|
636
|
-
if (files === undefined || files.length === 0) {
|
|
637
|
-
return false;
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
const upload_ref_name = `__upload_controllers_${upload_id}`;
|
|
641
|
-
|
|
642
|
-
if (refs[upload_ref_name]) {
|
|
643
|
-
console.log("Upload already in progress for ", upload_id);
|
|
644
|
-
return false;
|
|
645
|
-
}
|
|
646
|
-
|
|
647
|
-
// Track how many partial updates have been processed for this upload.
|
|
648
|
-
let resp_idx = 0;
|
|
649
|
-
const eventHandler = (progressEvent) => {
|
|
650
|
-
const event_callbacks = socket._callbacks.$event;
|
|
651
|
-
// Whenever called, responseText will contain the entire response so far.
|
|
652
|
-
const chunks = progressEvent.event.target.responseText.trim().split("\n");
|
|
653
|
-
// So only process _new_ chunks beyond resp_idx.
|
|
654
|
-
chunks.slice(resp_idx).map((chunk_json) => {
|
|
655
|
-
try {
|
|
656
|
-
const chunk = JSON5.parse(chunk_json);
|
|
657
|
-
event_callbacks.map((f, ix) => {
|
|
658
|
-
f(chunk)
|
|
659
|
-
.then(() => {
|
|
660
|
-
if (ix === event_callbacks.length - 1) {
|
|
661
|
-
// Mark this chunk as processed.
|
|
662
|
-
resp_idx += 1;
|
|
663
|
-
}
|
|
664
|
-
})
|
|
665
|
-
.catch((e) => {
|
|
666
|
-
if (progressEvent.progress === 1) {
|
|
667
|
-
// Chunk may be incomplete, so only report errors when full response is available.
|
|
668
|
-
console.log("Error processing chunk", chunk, e);
|
|
669
|
-
}
|
|
670
|
-
return;
|
|
671
|
-
});
|
|
672
|
-
});
|
|
673
|
-
} catch (e) {
|
|
674
|
-
if (progressEvent.progress === 1) {
|
|
675
|
-
console.log("Error parsing chunk", chunk_json, e);
|
|
676
|
-
}
|
|
677
|
-
return;
|
|
678
|
-
}
|
|
679
|
-
});
|
|
680
|
-
};
|
|
681
|
-
|
|
682
|
-
const controller = new AbortController();
|
|
683
|
-
const formdata = new FormData();
|
|
684
|
-
|
|
685
|
-
// Add the token and handler to the file name.
|
|
686
|
-
files.forEach((file) => {
|
|
687
|
-
formdata.append("files", file, file.path || file.name);
|
|
688
|
-
});
|
|
689
|
-
|
|
690
|
-
// Send the file to the server.
|
|
691
|
-
refs[upload_ref_name] = controller;
|
|
692
|
-
|
|
693
|
-
return new Promise((resolve, reject) => {
|
|
694
|
-
const xhr = new XMLHttpRequest();
|
|
695
|
-
|
|
696
|
-
// Set up event handlers
|
|
697
|
-
xhr.onload = function () {
|
|
698
|
-
if (xhr.status >= 200 && xhr.status < 300) {
|
|
699
|
-
resolve({
|
|
700
|
-
data: xhr.responseText,
|
|
701
|
-
status: xhr.status,
|
|
702
|
-
statusText: xhr.statusText,
|
|
703
|
-
headers: {
|
|
704
|
-
get: (name) => xhr.getResponseHeader(name),
|
|
705
|
-
},
|
|
706
|
-
});
|
|
707
|
-
} else {
|
|
708
|
-
reject(new Error(`HTTP error! status: ${xhr.status}`));
|
|
709
|
-
}
|
|
710
|
-
};
|
|
711
|
-
|
|
712
|
-
xhr.onerror = function () {
|
|
713
|
-
reject(new Error("Network error"));
|
|
714
|
-
};
|
|
715
|
-
|
|
716
|
-
xhr.onabort = function () {
|
|
717
|
-
reject(new Error("Upload aborted"));
|
|
718
|
-
};
|
|
719
|
-
|
|
720
|
-
// Handle upload progress
|
|
721
|
-
if (on_upload_progress) {
|
|
722
|
-
xhr.upload.onprogress = function (event) {
|
|
723
|
-
if (event.lengthComputable) {
|
|
724
|
-
const progressEvent = {
|
|
725
|
-
loaded: event.loaded,
|
|
726
|
-
total: event.total,
|
|
727
|
-
progress: event.loaded / event.total,
|
|
728
|
-
};
|
|
729
|
-
on_upload_progress(progressEvent);
|
|
730
|
-
}
|
|
731
|
-
};
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
// Handle download progress with streaming response parsing
|
|
735
|
-
xhr.onprogress = function (event) {
|
|
736
|
-
if (eventHandler) {
|
|
737
|
-
const progressEvent = {
|
|
738
|
-
event: {
|
|
739
|
-
target: {
|
|
740
|
-
responseText: xhr.responseText,
|
|
741
|
-
},
|
|
742
|
-
},
|
|
743
|
-
progress: event.lengthComputable ? event.loaded / event.total : 0,
|
|
744
|
-
};
|
|
745
|
-
eventHandler(progressEvent);
|
|
746
|
-
}
|
|
747
|
-
};
|
|
748
|
-
|
|
749
|
-
// Handle abort controller
|
|
750
|
-
controller.signal.addEventListener("abort", () => {
|
|
751
|
-
xhr.abort();
|
|
752
|
-
});
|
|
753
|
-
|
|
754
|
-
// Configure and send request
|
|
755
|
-
xhr.open("POST", getBackendURL(UPLOADURL));
|
|
756
|
-
xhr.setRequestHeader("Reflex-Client-Token", getToken());
|
|
757
|
-
xhr.setRequestHeader("Reflex-Event-Handler", handler);
|
|
758
|
-
|
|
759
|
-
try {
|
|
760
|
-
xhr.send(formdata);
|
|
761
|
-
} catch (error) {
|
|
762
|
-
reject(error);
|
|
763
|
-
}
|
|
764
|
-
})
|
|
765
|
-
.catch((error) => {
|
|
766
|
-
console.log("Upload error:", error.message);
|
|
767
|
-
return false;
|
|
768
|
-
})
|
|
769
|
-
.finally(() => {
|
|
770
|
-
delete refs[upload_ref_name];
|
|
771
|
-
});
|
|
772
|
-
};
|
|
773
|
-
|
|
774
621
|
/**
|
|
775
622
|
* Create an event object.
|
|
776
623
|
* @param {string} name The name of the event.
|
|
@@ -258,6 +258,15 @@ class UploadFile(StarletteUploadFile):
|
|
|
258
258
|
|
|
259
259
|
headers: Headers = dataclasses.field(default_factory=Headers)
|
|
260
260
|
|
|
261
|
+
@property
|
|
262
|
+
def filename(self) -> str | None:
|
|
263
|
+
"""Get the name of the uploaded file.
|
|
264
|
+
|
|
265
|
+
Returns:
|
|
266
|
+
The name of the uploaded file.
|
|
267
|
+
"""
|
|
268
|
+
return self.name
|
|
269
|
+
|
|
261
270
|
@property
|
|
262
271
|
def name(self) -> str | None:
|
|
263
272
|
"""Get the name of the uploaded file.
|
|
@@ -1272,12 +1281,12 @@ class App(MiddlewareMixin, LifespanMixin):
|
|
|
1272
1281
|
|
|
1273
1282
|
# Compile custom components.
|
|
1274
1283
|
(
|
|
1275
|
-
|
|
1276
|
-
|
|
1277
|
-
|
|
1278
|
-
) = compiler.
|
|
1279
|
-
compile_results.append((
|
|
1280
|
-
all_imports.update(
|
|
1284
|
+
memo_components_output,
|
|
1285
|
+
memo_components_result,
|
|
1286
|
+
memo_components_imports,
|
|
1287
|
+
) = compiler.compile_memo_components(dict.fromkeys(CUSTOM_COMPONENTS.values()))
|
|
1288
|
+
compile_results.append((memo_components_output, memo_components_result))
|
|
1289
|
+
all_imports.update(memo_components_imports)
|
|
1281
1290
|
progress.advance(task)
|
|
1282
1291
|
|
|
1283
1292
|
with console.timing("Collect all imports and app wraps"):
|
|
@@ -336,7 +336,7 @@ def _compile_component(component: Component | StatefulComponent) -> str:
|
|
|
336
336
|
return templates.component_template(component=component)
|
|
337
337
|
|
|
338
338
|
|
|
339
|
-
def
|
|
339
|
+
def _compile_memo_components(
|
|
340
340
|
components: Iterable[CustomComponent],
|
|
341
341
|
) -> tuple[str, dict[str, list[ImportVar]]]:
|
|
342
342
|
"""Compile the components.
|
|
@@ -376,7 +376,7 @@ def _compile_components(
|
|
|
376
376
|
|
|
377
377
|
# Compile the components page.
|
|
378
378
|
return (
|
|
379
|
-
templates.
|
|
379
|
+
templates.memo_components_template(
|
|
380
380
|
imports=utils.compile_imports(imports),
|
|
381
381
|
components=component_renders,
|
|
382
382
|
dynamic_imports=sorted(dynamic_imports),
|
|
@@ -565,7 +565,7 @@ def compile_page(path: str, component: BaseComponent) -> tuple[str, str]:
|
|
|
565
565
|
return output_path, code
|
|
566
566
|
|
|
567
567
|
|
|
568
|
-
def
|
|
568
|
+
def compile_memo_components(
|
|
569
569
|
components: Iterable[CustomComponent],
|
|
570
570
|
) -> tuple[str, str, dict[str, list[ImportVar]]]:
|
|
571
571
|
"""Compile the custom components.
|
|
@@ -580,7 +580,7 @@ def compile_components(
|
|
|
580
580
|
output_path = utils.get_components_path()
|
|
581
581
|
|
|
582
582
|
# Compile the components.
|
|
583
|
-
code, imports =
|
|
583
|
+
code, imports = _compile_memo_components(components)
|
|
584
584
|
return output_path, code, imports
|
|
585
585
|
|
|
586
586
|
|
|
@@ -8,6 +8,7 @@ from typing import TYPE_CHECKING, Any
|
|
|
8
8
|
|
|
9
9
|
from reflex import constants
|
|
10
10
|
from reflex.constants import Hooks
|
|
11
|
+
from reflex.constants.state import CAMEL_CASE_MEMO_MARKER
|
|
11
12
|
from reflex.utils.format import format_state_name, json_dumps
|
|
12
13
|
from reflex.vars.base import VarData
|
|
13
14
|
|
|
@@ -637,7 +638,7 @@ def stateful_components_template(imports: list[_ImportDict], memoized_code: str)
|
|
|
637
638
|
return f"{imports_str}\n{memoized_code}"
|
|
638
639
|
|
|
639
640
|
|
|
640
|
-
def
|
|
641
|
+
def memo_components_template(
|
|
641
642
|
imports: list[_ImportDict],
|
|
642
643
|
components: list[dict[str, Any]],
|
|
643
644
|
dynamic_imports: Iterable[str],
|
|
@@ -661,7 +662,7 @@ def custom_component_template(
|
|
|
661
662
|
components_code = ""
|
|
662
663
|
for component in components:
|
|
663
664
|
components_code += f"""
|
|
664
|
-
export const {component["name"]} = memo(({{ {",
|
|
665
|
+
export const {component["name"]} = memo(({{ {",".join([f"{prop}:{prop}{CAMEL_CASE_MEMO_MARKER}" for prop in component.get("props", [])])} }}) => {{
|
|
665
666
|
{_render_hooks(component.get("hooks", {}))}
|
|
666
667
|
return(
|
|
667
668
|
{_RenderUtils.render(component["render"])}
|
|
@@ -37,12 +37,13 @@ from reflex.constants import (
|
|
|
37
37
|
PageNames,
|
|
38
38
|
)
|
|
39
39
|
from reflex.constants.compiler import SpecialAttributes
|
|
40
|
-
from reflex.constants.state import
|
|
40
|
+
from reflex.constants.state import CAMEL_CASE_MEMO_MARKER, FRONTEND_EVENT_STATE
|
|
41
41
|
from reflex.event import (
|
|
42
42
|
EventCallback,
|
|
43
43
|
EventChain,
|
|
44
44
|
EventHandler,
|
|
45
45
|
EventSpec,
|
|
46
|
+
args_specs_from_fields,
|
|
46
47
|
no_args_event_spec,
|
|
47
48
|
parse_args_spec,
|
|
48
49
|
pointer_event_spec,
|
|
@@ -143,14 +144,6 @@ class BaseComponentMeta(FieldBasedMeta, ABCMeta):
|
|
|
143
144
|
_fields: Mapping[str, ComponentField]
|
|
144
145
|
_js_fields: Mapping[str, ComponentField]
|
|
145
146
|
|
|
146
|
-
@classmethod
|
|
147
|
-
def _resolve_annotations(
|
|
148
|
-
cls, namespace: dict[str, Any], name: str
|
|
149
|
-
) -> dict[str, Any]:
|
|
150
|
-
return types.resolve_annotations(
|
|
151
|
-
namespace.get("__annotations__", {}), namespace["__module__"]
|
|
152
|
-
)
|
|
153
|
-
|
|
154
147
|
@classmethod
|
|
155
148
|
def _process_annotated_fields(
|
|
156
149
|
cls,
|
|
@@ -909,18 +902,7 @@ class Component(BaseComponent, ABC):
|
|
|
909
902
|
"""
|
|
910
903
|
# Look for component specific triggers,
|
|
911
904
|
# e.g. variable declared as EventHandler types.
|
|
912
|
-
return DEFAULT_TRIGGERS |
|
|
913
|
-
name: (
|
|
914
|
-
metadata[0]
|
|
915
|
-
if (
|
|
916
|
-
(metadata := getattr(field.annotated_type, "__metadata__", None))
|
|
917
|
-
is not None
|
|
918
|
-
)
|
|
919
|
-
else no_args_event_spec
|
|
920
|
-
)
|
|
921
|
-
for name, field in cls.get_fields().items()
|
|
922
|
-
if field.type_origin is EventHandler
|
|
923
|
-
} # pyright: ignore [reportOperatorIssue]
|
|
905
|
+
return DEFAULT_TRIGGERS | args_specs_from_fields(cls.get_fields()) # pyright: ignore [reportOperatorIssue]
|
|
924
906
|
|
|
925
907
|
def __repr__(self) -> str:
|
|
926
908
|
"""Represent the component in React.
|
|
@@ -1983,7 +1965,7 @@ class CustomComponent(Component):
|
|
|
1983
1965
|
|
|
1984
1966
|
super()._post_init(
|
|
1985
1967
|
event_triggers={
|
|
1986
|
-
key
|
|
1968
|
+
key: EventChain.create(
|
|
1987
1969
|
value=props[key],
|
|
1988
1970
|
args_spec=get_args_spec(key),
|
|
1989
1971
|
key=key,
|
|
@@ -1994,9 +1976,7 @@ class CustomComponent(Component):
|
|
|
1994
1976
|
)
|
|
1995
1977
|
|
|
1996
1978
|
to_camel_cased_props = {
|
|
1997
|
-
format.to_camel_case(key
|
|
1998
|
-
for key in props
|
|
1999
|
-
if key not in event_types
|
|
1979
|
+
format.to_camel_case(key): None for key in props if key not in event_types
|
|
2000
1980
|
}
|
|
2001
1981
|
self.get_props = lambda: to_camel_cased_props # pyright: ignore [reportIncompatibleVariableOverride]
|
|
2002
1982
|
|
|
@@ -2011,7 +1991,7 @@ class CustomComponent(Component):
|
|
|
2011
1991
|
if key not in props_types:
|
|
2012
1992
|
continue
|
|
2013
1993
|
|
|
2014
|
-
camel_cased_key = format.to_camel_case(key
|
|
1994
|
+
camel_cased_key = format.to_camel_case(key)
|
|
2015
1995
|
|
|
2016
1996
|
# Get the type based on the annotation.
|
|
2017
1997
|
type_ = props_types[key]
|
|
@@ -2101,11 +2081,13 @@ class CustomComponent(Component):
|
|
|
2101
2081
|
"""
|
|
2102
2082
|
return [
|
|
2103
2083
|
Var(
|
|
2104
|
-
_js_expr=name,
|
|
2084
|
+
_js_expr=name + CAMEL_CASE_MEMO_MARKER,
|
|
2105
2085
|
_var_type=(prop._var_type if isinstance(prop, Var) else type(prop)),
|
|
2106
2086
|
).guess_type()
|
|
2107
2087
|
if isinstance(prop, Var) or not isinstance(prop, EventChain)
|
|
2108
|
-
else CustomComponent._get_event_spec_from_args_spec(
|
|
2088
|
+
else CustomComponent._get_event_spec_from_args_spec(
|
|
2089
|
+
name + CAMEL_CASE_MEMO_MARKER, prop
|
|
2090
|
+
)
|
|
2109
2091
|
for name, prop in self.props.items()
|
|
2110
2092
|
]
|
|
2111
2093
|
|
|
@@ -35,6 +35,7 @@ from reflex.utils import format
|
|
|
35
35
|
from reflex.utils.imports import ImportVar
|
|
36
36
|
from reflex.vars import VarData
|
|
37
37
|
from reflex.vars.base import Var, get_unique_variable_name
|
|
38
|
+
from reflex.vars.function import FunctionVar
|
|
38
39
|
from reflex.vars.sequence import LiteralStringVar
|
|
39
40
|
|
|
40
41
|
DEFAULT_UPLOAD_ID: str = "default"
|
|
@@ -111,8 +112,7 @@ def clear_selected_files(id_: str = DEFAULT_UPLOAD_ID) -> EventSpec:
|
|
|
111
112
|
# UploadFilesProvider assigns a special function to clear selected files
|
|
112
113
|
# into the shared global refs object to make it accessible outside a React
|
|
113
114
|
# component via `run_script` (otherwise backend could never clear files).
|
|
114
|
-
|
|
115
|
-
return run_script(f"{func}({id_!r})")
|
|
115
|
+
return run_script(Var("__clear_selected_files")._as_ref().to(FunctionVar).call(id_))
|
|
116
116
|
|
|
117
117
|
|
|
118
118
|
def cancel_upload(upload_id: str) -> EventSpec:
|
|
@@ -382,7 +382,7 @@ for theme_name in dir(Theme):
|
|
|
382
382
|
class CodeBlock(Component, MarkdownComponentMap):
|
|
383
383
|
"""A code block."""
|
|
384
384
|
|
|
385
|
-
library = "react-syntax-highlighter@15.6.
|
|
385
|
+
library = "react-syntax-highlighter@15.6.6"
|
|
386
386
|
|
|
387
387
|
tag = "PrismAsyncLight"
|
|
388
388
|
|
|
@@ -412,7 +412,7 @@ class CodeBlock(Component, MarkdownComponentMap):
|
|
|
412
412
|
)
|
|
413
413
|
|
|
414
414
|
# Props passed down to the code tag.
|
|
415
|
-
code_tag_props: Var[dict[str, str]]
|
|
415
|
+
code_tag_props: Var[dict[str, str | dict[str, str]]]
|
|
416
416
|
|
|
417
417
|
# Whether a copy button should appear.
|
|
418
418
|
can_copy: bool | None = field(
|
|
@@ -926,7 +926,9 @@ class CodeBlock(Component, MarkdownComponentMap):
|
|
|
926
926
|
starting_line_number: Var[int] | int | None = None,
|
|
927
927
|
wrap_long_lines: Var[bool] | bool | None = None,
|
|
928
928
|
custom_style: dict[str, str | Var | Color] | None = None,
|
|
929
|
-
code_tag_props: Var[dict[str,
|
|
929
|
+
code_tag_props: Var[dict[str, dict[str, str] | str]]
|
|
930
|
+
| dict[str, dict[str, str] | str]
|
|
931
|
+
| None = None,
|
|
930
932
|
can_copy: bool | None = None,
|
|
931
933
|
copy_button: Component | bool | None = None,
|
|
932
934
|
style: Sequence[Mapping[str, Any]]
|
|
@@ -1562,7 +1564,9 @@ class CodeblockNamespace(ComponentNamespace):
|
|
|
1562
1564
|
starting_line_number: Var[int] | int | None = None,
|
|
1563
1565
|
wrap_long_lines: Var[bool] | bool | None = None,
|
|
1564
1566
|
custom_style: dict[str, str | Var | Color] | None = None,
|
|
1565
|
-
code_tag_props: Var[dict[str,
|
|
1567
|
+
code_tag_props: Var[dict[str, dict[str, str] | str]]
|
|
1568
|
+
| dict[str, dict[str, str] | str]
|
|
1569
|
+
| None = None,
|
|
1566
1570
|
can_copy: bool | None = None,
|
|
1567
1571
|
copy_button: Component | bool | None = None,
|
|
1568
1572
|
style: Sequence[Mapping[str, Any]]
|
|
@@ -6,6 +6,8 @@ from collections.abc import Callable
|
|
|
6
6
|
from dataclasses import _MISSING_TYPE, MISSING
|
|
7
7
|
from typing import Annotated, Any, Generic, TypeVar, get_origin
|
|
8
8
|
|
|
9
|
+
from reflex.utils import types
|
|
10
|
+
|
|
9
11
|
FIELD_TYPE = TypeVar("FIELD_TYPE")
|
|
10
12
|
|
|
11
13
|
|
|
@@ -114,7 +116,9 @@ class FieldBasedMeta(type):
|
|
|
114
116
|
def _resolve_annotations(
|
|
115
117
|
cls, namespace: dict[str, Any], name: str
|
|
116
118
|
) -> dict[str, Any]:
|
|
117
|
-
return
|
|
119
|
+
return types.resolve_annotations(
|
|
120
|
+
namespace.get("__annotations__", {}), namespace["__module__"]
|
|
121
|
+
)
|
|
118
122
|
|
|
119
123
|
@classmethod
|
|
120
124
|
def _process_field_overrides(
|
|
@@ -6,7 +6,7 @@ from reflex.utils.imports import ImportVar
|
|
|
6
6
|
from reflex.vars.base import LiteralVar, Var
|
|
7
7
|
from reflex.vars.sequence import LiteralStringVar, StringVar
|
|
8
8
|
|
|
9
|
-
LUCIDE_LIBRARY = "lucide-react@0.
|
|
9
|
+
LUCIDE_LIBRARY = "lucide-react@0.543.0"
|
|
10
10
|
|
|
11
11
|
|
|
12
12
|
class LucideIconComponent(Component):
|
|
@@ -921,6 +921,7 @@ LUCIDE_ICON_LIST = [
|
|
|
921
921
|
"hospital",
|
|
922
922
|
"hotel",
|
|
923
923
|
"hourglass",
|
|
924
|
+
"house_heart",
|
|
924
925
|
"house_plug",
|
|
925
926
|
"house_plus",
|
|
926
927
|
"house_wifi",
|