diff --git a/pyi_hashes.json b/pyi_hashes.json index bd1389e0a25..368a53ae263 100644 --- a/pyi_hashes.json +++ b/pyi_hashes.json @@ -1,126 +1,126 @@ { - "reflex/__init__.pyi": "8a6d2350e96659846436792a5c7b772b", - "reflex/components/__init__.pyi": "76ba0a12cd3a7ba5ab6341a3ae81551f", - "reflex/components/base/__init__.pyi": "e9aaf47be1e1977eacee97b880c8f7de", - "reflex/components/base/app_wrap.pyi": "387fc7a0c2da8760d9449e2893e44eec", - "reflex/components/base/body.pyi": "2cc870cec4b1c28081dd40467752c2b7", - "reflex/components/base/document.pyi": "30377cdfb02b564f8de29b0473d2346c", - "reflex/components/base/error_boundary.pyi": "c56b591d14a92b99a1e97e04afe167d7", - "reflex/components/base/fragment.pyi": "603ee8e03af88d4a8ff6bc1fbce4e022", - "reflex/components/base/head.pyi": "893047aa32da553711db8f1345adb6b0", - "reflex/components/base/link.pyi": "396488afa3b7a5b0d0e6c5e89159f857", - "reflex/components/base/meta.pyi": "bc4b4fda6f022a517de339ffdd667e3b", - "reflex/components/base/script.pyi": "530cf8f47eb90082bf65942e8b5d745f", - "reflex/components/base/strict_mode.pyi": "d972e0ff2a6f961e7df90fc27b8bb51b", - "reflex/components/core/__init__.pyi": "44bcee7bc4e27e2f4f4707b843acf291", - "reflex/components/core/auto_scroll.pyi": "d3012d2a4ccaab8dfebf9aa484020f59", - "reflex/components/core/banner.pyi": "48d0eb86ae09e806ebe20d0edcc3cdb3", - "reflex/components/core/client_side_routing.pyi": "9be638a2b0e00b8181697e5dd6b45e4e", - "reflex/components/core/clipboard.pyi": "4098368af3c32dbde77fc74599f8799a", - "reflex/components/core/debounce.pyi": "affda049624c266c7d5620efa3b7041b", - "reflex/components/core/html.pyi": "b12117b42ef79ee90b6b4dec50baeb86", - "reflex/components/core/sticky.pyi": "c65131cf7c2312c68e1fddaa0cc27150", - "reflex/components/core/upload.pyi": "53e06193fa23a603737bc49b1c6c2565", - "reflex/components/datadisplay/__init__.pyi": "cf087efa8b3960decc6b231cc986cfa9", - "reflex/components/datadisplay/code.pyi": "3d8f0ab4c2f123d7f80d15c7ebc553d9", - "reflex/components/datadisplay/dataeditor.pyi": "cb03d732e2fe771a8d46c7bcda671f92", - "reflex/components/datadisplay/shiki_code_block.pyi": "87db7639bfa5cd53e1709e1363f93278", - "reflex/components/el/__init__.pyi": "09042a2db5e0637e99b5173430600522", - "reflex/components/el/element.pyi": "06ac2213b062119323291fa66a1ac19e", - "reflex/components/el/elements/__init__.pyi": "280ed457675f3720e34b560a3f617739", - "reflex/components/el/elements/base.pyi": "6e533348b5e1a88cf62fbb5a38dbd795", - "reflex/components/el/elements/forms.pyi": "161f1ef847e5da8755528a7977fdcf53", - "reflex/components/el/elements/inline.pyi": "33d9d860e75dd8c4769825127ed363bb", - "reflex/components/el/elements/media.pyi": "addd6872281d65d44a484358b895432f", - "reflex/components/el/elements/metadata.pyi": "974a86d9f0662f6fc15a5bb4b3a87862", - "reflex/components/el/elements/other.pyi": "995a4fbf10bfdb7f48808210dfe413bd", - "reflex/components/el/elements/scripts.pyi": "cd5bd53c3a6b016fbb913aff36d63344", - "reflex/components/el/elements/sectioning.pyi": "65aa53b1372598ec1785616cb7016032", - "reflex/components/el/elements/tables.pyi": "e1282d8ddf4efa4c911ca104a907ee88", - "reflex/components/el/elements/typography.pyi": "00088c9c1b68a14e5a41d837e8fdf542", - "reflex/components/gridjs/datatable.pyi": "3db3f994640c19be5c3fa2983f71de56", - "reflex/components/lucide/icon.pyi": "a5521a8baf8d2d7281e3fdfe6ce7073b", - "reflex/components/markdown/markdown.pyi": "6b268afa879e33abf651bda56be5065e", - "reflex/components/moment/moment.pyi": "6dd0c7cee5f0f29bc11d830c697d7f92", - "reflex/components/next/base.pyi": "14aafd5b018a4bc9748a3c9980fcfe3e", - "reflex/components/next/image.pyi": "3a0d1970e69144e9c6806e68ab99f181", - "reflex/components/next/link.pyi": "cd913e10205314afe67101d9640e05cb", - "reflex/components/next/video.pyi": "09698418db651917630a7fefeb573fc2", - "reflex/components/plotly/plotly.pyi": "b1f0bbcaf4706d0a373c99395ba50118", - "reflex/components/radix/__init__.pyi": "8d586cbff1d7130d09476ac72ee73400", - "reflex/components/radix/primitives/__init__.pyi": "fe8715decf3e9ae471b56bba14e42cb3", - "reflex/components/radix/primitives/accordion.pyi": "54427d58c5e1498ad2c6189214bba28a", - "reflex/components/radix/primitives/base.pyi": "8b1dbf0b75cb29e873d611b83c9e4156", - "reflex/components/radix/primitives/drawer.pyi": "95cc7c2fdc5407f8ceca06199d4503fa", - "reflex/components/radix/primitives/form.pyi": "79ddb679e0b3df814439ce993fcf355e", - "reflex/components/radix/primitives/progress.pyi": "c62a0c44e0d440701174fcca93bf8fbe", - "reflex/components/radix/primitives/slider.pyi": "10196fb967c9cde3860a930a526b6c51", - "reflex/components/radix/themes/__init__.pyi": "a15f9464ad99f248249ffa8e6deea4cf", - "reflex/components/radix/themes/base.pyi": "a3c3c3b72fd3d8f1e38990e5c461b682", - "reflex/components/radix/themes/color_mode.pyi": "e18fe42952d10f5733f3baf4789c4bb5", - "reflex/components/radix/themes/components/__init__.pyi": "87bb9ffff641928562da1622d2ca5993", - "reflex/components/radix/themes/components/alert_dialog.pyi": "8e1dde62450296310a116ed066bd51e3", - "reflex/components/radix/themes/components/aspect_ratio.pyi": "1845813a034adfc1f5db8e0f6ffc1118", - "reflex/components/radix/themes/components/avatar.pyi": "b591cb8b31d5a9aea5413120a6a744d9", - "reflex/components/radix/themes/components/badge.pyi": "5e8f49fd9ff10c756d9afa54bfd3fd10", - "reflex/components/radix/themes/components/button.pyi": "201448dcdf735f24d8bd21112039c1ca", - "reflex/components/radix/themes/components/callout.pyi": "e2b5828f271a2d790e88bb965d0fcded", - "reflex/components/radix/themes/components/card.pyi": "fe42e0cbdf9eb34341f4bbba8a586b34", - "reflex/components/radix/themes/components/checkbox.pyi": "78bc26eabd6468a44f5139449a2c6208", - "reflex/components/radix/themes/components/checkbox_cards.pyi": "cc43c568aa42ffa3e693e5cd1acba156", - "reflex/components/radix/themes/components/checkbox_group.pyi": "b798c7cca10f4493484dc1621c0eed9c", - "reflex/components/radix/themes/components/context_menu.pyi": "cdf546723a84c99412d91ca63d4bb2df", - "reflex/components/radix/themes/components/data_list.pyi": "768e4c9222d37d90228309166a1c6ab3", - "reflex/components/radix/themes/components/dialog.pyi": "b51cb34dc6c90ccd07a2f9fc97eaf1c1", - "reflex/components/radix/themes/components/dropdown_menu.pyi": "34807c4ab4665932da664ab68dab0edf", - "reflex/components/radix/themes/components/hover_card.pyi": "cfa947d1edec4b17dc6f227783ca1cbc", - "reflex/components/radix/themes/components/icon_button.pyi": "560cc3a95a8f1a396c8c5fb916b0ee8b", - "reflex/components/radix/themes/components/inset.pyi": "828f3d3a5b8f7fd07597069c01aaa0a0", - "reflex/components/radix/themes/components/popover.pyi": "c953a42260a3b261eec772dba716d951", - "reflex/components/radix/themes/components/progress.pyi": "c880c6bb9803d47048f656dfa66a7c15", - "reflex/components/radix/themes/components/radio.pyi": "36fa5585440685a7d2dff40b50502840", - "reflex/components/radix/themes/components/radio_cards.pyi": "e9a0f27119322e6148946ae178edb7a9", - "reflex/components/radix/themes/components/radio_group.pyi": "510e2ac6aebec248c275f4ddb25940a9", - "reflex/components/radix/themes/components/scroll_area.pyi": "83892be0b2c902d2147cbdb5e19310ab", - "reflex/components/radix/themes/components/segmented_control.pyi": "ee1b8cb2cada89459d17a186206f3c3a", - "reflex/components/radix/themes/components/select.pyi": "869d36f7a20b466bc15c634c7c0ee0dd", - "reflex/components/radix/themes/components/separator.pyi": "58a95aca75a556d349eb56f898bde680", - "reflex/components/radix/themes/components/skeleton.pyi": "d91615706e5efb81d97755decbbf5ae3", - "reflex/components/radix/themes/components/slider.pyi": "8caaea62efdd0b4b9878a63620c97632", - "reflex/components/radix/themes/components/spinner.pyi": "80766a7324b582221edb66ec46da0acb", - "reflex/components/radix/themes/components/switch.pyi": "f8256d2b50d15ab163649cfb05229750", - "reflex/components/radix/themes/components/table.pyi": "560ce8d920e03b450fe6b938f5f0fea0", - "reflex/components/radix/themes/components/tabs.pyi": "96ac1082651d2adc2a60a3af6e90c17f", - "reflex/components/radix/themes/components/text_area.pyi": "418d3df53eeca0723d83a93d81f16b12", - "reflex/components/radix/themes/components/text_field.pyi": "cdf0e08f5af0a5fce6b31787001f1dc3", - "reflex/components/radix/themes/components/tooltip.pyi": "c37fb988ec52da25be83083c3a85524a", - "reflex/components/radix/themes/layout/__init__.pyi": "9a52c5b283c864be70b51a8fd6120392", - "reflex/components/radix/themes/layout/base.pyi": "e9a5c1f376e66653ebcf5d2315f990f8", - "reflex/components/radix/themes/layout/box.pyi": "5a3c2339d74cc062358ec32b2c2c138c", - "reflex/components/radix/themes/layout/center.pyi": "29bde2c21a190ba7d7a382a1157f5aa7", - "reflex/components/radix/themes/layout/container.pyi": "4020c3dca660027b84d11cc4198393c4", - "reflex/components/radix/themes/layout/flex.pyi": "f814281a5635ad43dd1df23f8e356c66", - "reflex/components/radix/themes/layout/grid.pyi": "6062188367a2c253f014f916197c963d", - "reflex/components/radix/themes/layout/list.pyi": "0e91d3f1c82c9094f328e5b8ecd2f60a", - "reflex/components/radix/themes/layout/section.pyi": "41895910072e023ed0fef6a8ad956046", - "reflex/components/radix/themes/layout/spacer.pyi": "029eb0eaa731bcdff7c496e0437e22b1", - "reflex/components/radix/themes/layout/stack.pyi": "3b0da99b00c826d087ed89fc67c595c1", - "reflex/components/radix/themes/typography/__init__.pyi": "ef0ba71353dcac1f3546de45f8721bae", - "reflex/components/radix/themes/typography/blockquote.pyi": "8ed6f1c5aa86743d1fb9488334af64fe", - "reflex/components/radix/themes/typography/code.pyi": "85e869bb61e3e0da9c244aea78e14193", - "reflex/components/radix/themes/typography/heading.pyi": "5a3b0b8e44bda0fce22c6b1a1f25e68e", - "reflex/components/radix/themes/typography/link.pyi": "45965d95b9f9b76f8f4a3084a5430194", - "reflex/components/radix/themes/typography/text.pyi": "e6aa0ca43ebbd42701a3c72c0312032e", - "reflex/components/react_player/audio.pyi": "972975ed0ba3e1dc4a867da20b11ae8e", - "reflex/components/react_player/react_player.pyi": "63ffffbc24907103f797dcfd85894107", - "reflex/components/react_player/video.pyi": "35ce5ad62e8bff17d9c09d27c362f8dc", - "reflex/components/recharts/__init__.pyi": "a52c9055e37c6ee25ded15688d45e8a5", - "reflex/components/recharts/cartesian.pyi": "9dd16c08abe5205c6c414474e2de2f79", - "reflex/components/recharts/charts.pyi": "3570af4627c601d10ee37033f1b2329c", - "reflex/components/recharts/general.pyi": "a1b846d5f2fd0a8b1969b472c5cab2e7", - "reflex/components/recharts/polar.pyi": "973c3e6aa253914c4c5fd18ed32196fb", - "reflex/components/recharts/recharts.pyi": "157acc830323075ffaf4f68d495d1787", - "reflex/components/sonner/toast.pyi": "0b6dc33413f30fdd043b89ec3c8c3f39", - "reflex/components/suneditor/editor.pyi": "7d94c3587f9ee15e4ab68aca8c3a6d8b", - "reflex/experimental/layout.pyi": "6398e779743963ef3e03396696b8ddfb" + "reflex\\__init__.pyi": "8a6d2350e96659846436792a5c7b772b", + "reflex\\components\\__init__.pyi": "76ba0a12cd3a7ba5ab6341a3ae81551f", + "reflex\\components\\base\\__init__.pyi": "e9aaf47be1e1977eacee97b880c8f7de", + "reflex\\components\\base\\app_wrap.pyi": "387fc7a0c2da8760d9449e2893e44eec", + "reflex\\components\\base\\body.pyi": "2cc870cec4b1c28081dd40467752c2b7", + "reflex\\components\\base\\document.pyi": "30377cdfb02b564f8de29b0473d2346c", + "reflex\\components\\base\\error_boundary.pyi": "c56b591d14a92b99a1e97e04afe167d7", + "reflex\\components\\base\\fragment.pyi": "603ee8e03af88d4a8ff6bc1fbce4e022", + "reflex\\components\\base\\head.pyi": "893047aa32da553711db8f1345adb6b0", + "reflex\\components\\base\\link.pyi": "396488afa3b7a5b0d0e6c5e89159f857", + "reflex\\components\\base\\meta.pyi": "bc4b4fda6f022a517de339ffdd667e3b", + "reflex\\components\\base\\script.pyi": "530cf8f47eb90082bf65942e8b5d745f", + "reflex\\components\\base\\strict_mode.pyi": "d972e0ff2a6f961e7df90fc27b8bb51b", + "reflex\\components\\core\\__init__.pyi": "44bcee7bc4e27e2f4f4707b843acf291", + "reflex\\components\\core\\auto_scroll.pyi": "d3012d2a4ccaab8dfebf9aa484020f59", + "reflex\\components\\core\\banner.pyi": "48d0eb86ae09e806ebe20d0edcc3cdb3", + "reflex\\components\\core\\client_side_routing.pyi": "9be638a2b0e00b8181697e5dd6b45e4e", + "reflex\\components\\core\\clipboard.pyi": "4098368af3c32dbde77fc74599f8799a", + "reflex\\components\\core\\debounce.pyi": "affda049624c266c7d5620efa3b7041b", + "reflex\\components\\core\\html.pyi": "b12117b42ef79ee90b6b4dec50baeb86", + "reflex\\components\\core\\sticky.pyi": "c65131cf7c2312c68e1fddaa0cc27150", + "reflex\\components\\core\\upload.pyi": "53e06193fa23a603737bc49b1c6c2565", + "reflex\\components\\datadisplay\\__init__.pyi": "cf087efa8b3960decc6b231cc986cfa9", + "reflex\\components\\datadisplay\\code.pyi": "3d8f0ab4c2f123d7f80d15c7ebc553d9", + "reflex\\components\\datadisplay\\dataeditor.pyi": "cb03d732e2fe771a8d46c7bcda671f92", + "reflex\\components\\datadisplay\\shiki_code_block.pyi": "87db7639bfa5cd53e1709e1363f93278", + "reflex\\components\\el\\__init__.pyi": "09042a2db5e0637e99b5173430600522", + "reflex\\components\\el\\element.pyi": "06ac2213b062119323291fa66a1ac19e", + "reflex\\components\\el\\elements\\__init__.pyi": "280ed457675f3720e34b560a3f617739", + "reflex\\components\\el\\elements\\base.pyi": "6e533348b5e1a88cf62fbb5a38dbd795", + "reflex\\components\\el\\elements\\forms.pyi": "161f1ef847e5da8755528a7977fdcf53", + "reflex\\components\\el\\elements\\inline.pyi": "33d9d860e75dd8c4769825127ed363bb", + "reflex\\components\\el\\elements\\media.pyi": "addd6872281d65d44a484358b895432f", + "reflex\\components\\el\\elements\\metadata.pyi": "974a86d9f0662f6fc15a5bb4b3a87862", + "reflex\\components\\el\\elements\\other.pyi": "995a4fbf10bfdb7f48808210dfe413bd", + "reflex\\components\\el\\elements\\scripts.pyi": "cd5bd53c3a6b016fbb913aff36d63344", + "reflex\\components\\el\\elements\\sectioning.pyi": "65aa53b1372598ec1785616cb7016032", + "reflex\\components\\el\\elements\\tables.pyi": "e1282d8ddf4efa4c911ca104a907ee88", + "reflex\\components\\el\\elements\\typography.pyi": "00088c9c1b68a14e5a41d837e8fdf542", + "reflex\\components\\gridjs\\datatable.pyi": "3db3f994640c19be5c3fa2983f71de56", + "reflex\\components\\lucide\\icon.pyi": "a5521a8baf8d2d7281e3fdfe6ce7073b", + "reflex\\components\\markdown\\markdown.pyi": "6b268afa879e33abf651bda56be5065e", + "reflex\\components\\moment\\moment.pyi": "6dd0c7cee5f0f29bc11d830c697d7f92", + "reflex\\components\\next\\base.pyi": "14aafd5b018a4bc9748a3c9980fcfe3e", + "reflex\\components\\next\\image.pyi": "3a0d1970e69144e9c6806e68ab99f181", + "reflex\\components\\next\\link.pyi": "cd913e10205314afe67101d9640e05cb", + "reflex\\components\\next\\video.pyi": "09698418db651917630a7fefeb573fc2", + "reflex\\components\\plotly\\plotly.pyi": "b1f0bbcaf4706d0a373c99395ba50118", + "reflex\\components\\radix\\__init__.pyi": "8d586cbff1d7130d09476ac72ee73400", + "reflex\\components\\radix\\primitives\\__init__.pyi": "fe8715decf3e9ae471b56bba14e42cb3", + "reflex\\components\\radix\\primitives\\accordion.pyi": "54427d58c5e1498ad2c6189214bba28a", + "reflex\\components\\radix\\primitives\\base.pyi": "8b1dbf0b75cb29e873d611b83c9e4156", + "reflex\\components\\radix\\primitives\\drawer.pyi": "95cc7c2fdc5407f8ceca06199d4503fa", + "reflex\\components\\radix\\primitives\\form.pyi": "79ddb679e0b3df814439ce993fcf355e", + "reflex\\components\\radix\\primitives\\progress.pyi": "c62a0c44e0d440701174fcca93bf8fbe", + "reflex\\components\\radix\\primitives\\slider.pyi": "10196fb967c9cde3860a930a526b6c51", + "reflex\\components\\radix\\themes\\__init__.pyi": "a15f9464ad99f248249ffa8e6deea4cf", + "reflex\\components\\radix\\themes\\base.pyi": "a3c3c3b72fd3d8f1e38990e5c461b682", + "reflex\\components\\radix\\themes\\color_mode.pyi": "e18fe42952d10f5733f3baf4789c4bb5", + "reflex\\components\\radix\\themes\\components\\__init__.pyi": "87bb9ffff641928562da1622d2ca5993", + "reflex\\components\\radix\\themes\\components\\alert_dialog.pyi": "8e1dde62450296310a116ed066bd51e3", + "reflex\\components\\radix\\themes\\components\\aspect_ratio.pyi": "1845813a034adfc1f5db8e0f6ffc1118", + "reflex\\components\\radix\\themes\\components\\avatar.pyi": "b591cb8b31d5a9aea5413120a6a744d9", + "reflex\\components\\radix\\themes\\components\\badge.pyi": "5e8f49fd9ff10c756d9afa54bfd3fd10", + "reflex\\components\\radix\\themes\\components\\button.pyi": "201448dcdf735f24d8bd21112039c1ca", + "reflex\\components\\radix\\themes\\components\\callout.pyi": "e2b5828f271a2d790e88bb965d0fcded", + "reflex\\components\\radix\\themes\\components\\card.pyi": "fe42e0cbdf9eb34341f4bbba8a586b34", + "reflex\\components\\radix\\themes\\components\\checkbox.pyi": "78bc26eabd6468a44f5139449a2c6208", + "reflex\\components\\radix\\themes\\components\\checkbox_cards.pyi": "cc43c568aa42ffa3e693e5cd1acba156", + "reflex\\components\\radix\\themes\\components\\checkbox_group.pyi": "b798c7cca10f4493484dc1621c0eed9c", + "reflex\\components\\radix\\themes\\components\\context_menu.pyi": "cdf546723a84c99412d91ca63d4bb2df", + "reflex\\components\\radix\\themes\\components\\data_list.pyi": "768e4c9222d37d90228309166a1c6ab3", + "reflex\\components\\radix\\themes\\components\\dialog.pyi": "b51cb34dc6c90ccd07a2f9fc97eaf1c1", + "reflex\\components\\radix\\themes\\components\\dropdown_menu.pyi": "34807c4ab4665932da664ab68dab0edf", + "reflex\\components\\radix\\themes\\components\\hover_card.pyi": "cfa947d1edec4b17dc6f227783ca1cbc", + "reflex\\components\\radix\\themes\\components\\icon_button.pyi": "560cc3a95a8f1a396c8c5fb916b0ee8b", + "reflex\\components\\radix\\themes\\components\\inset.pyi": "828f3d3a5b8f7fd07597069c01aaa0a0", + "reflex\\components\\radix\\themes\\components\\popover.pyi": "c953a42260a3b261eec772dba716d951", + "reflex\\components\\radix\\themes\\components\\progress.pyi": "c880c6bb9803d47048f656dfa66a7c15", + "reflex\\components\\radix\\themes\\components\\radio.pyi": "36fa5585440685a7d2dff40b50502840", + "reflex\\components\\radix\\themes\\components\\radio_cards.pyi": "e9a0f27119322e6148946ae178edb7a9", + "reflex\\components\\radix\\themes\\components\\radio_group.pyi": "510e2ac6aebec248c275f4ddb25940a9", + "reflex\\components\\radix\\themes\\components\\scroll_area.pyi": "83892be0b2c902d2147cbdb5e19310ab", + "reflex\\components\\radix\\themes\\components\\segmented_control.pyi": "ee1b8cb2cada89459d17a186206f3c3a", + "reflex\\components\\radix\\themes\\components\\select.pyi": "869d36f7a20b466bc15c634c7c0ee0dd", + "reflex\\components\\radix\\themes\\components\\separator.pyi": "58a95aca75a556d349eb56f898bde680", + "reflex\\components\\radix\\themes\\components\\skeleton.pyi": "d91615706e5efb81d97755decbbf5ae3", + "reflex\\components\\radix\\themes\\components\\slider.pyi": "8caaea62efdd0b4b9878a63620c97632", + "reflex\\components\\radix\\themes\\components\\spinner.pyi": "80766a7324b582221edb66ec46da0acb", + "reflex\\components\\radix\\themes\\components\\switch.pyi": "f8256d2b50d15ab163649cfb05229750", + "reflex\\components\\radix\\themes\\components\\table.pyi": "560ce8d920e03b450fe6b938f5f0fea0", + "reflex\\components\\radix\\themes\\components\\tabs.pyi": "96ac1082651d2adc2a60a3af6e90c17f", + "reflex\\components\\radix\\themes\\components\\text_area.pyi": "418d3df53eeca0723d83a93d81f16b12", + "reflex\\components\\radix\\themes\\components\\text_field.pyi": "cdf0e08f5af0a5fce6b31787001f1dc3", + "reflex\\components\\radix\\themes\\components\\tooltip.pyi": "c37fb988ec52da25be83083c3a85524a", + "reflex\\components\\radix\\themes\\layout\\__init__.pyi": "9a52c5b283c864be70b51a8fd6120392", + "reflex\\components\\radix\\themes\\layout\\base.pyi": "e9a5c1f376e66653ebcf5d2315f990f8", + "reflex\\components\\radix\\themes\\layout\\box.pyi": "5a3c2339d74cc062358ec32b2c2c138c", + "reflex\\components\\radix\\themes\\layout\\center.pyi": "29bde2c21a190ba7d7a382a1157f5aa7", + "reflex\\components\\radix\\themes\\layout\\container.pyi": "4020c3dca660027b84d11cc4198393c4", + "reflex\\components\\radix\\themes\\layout\\flex.pyi": "f814281a5635ad43dd1df23f8e356c66", + "reflex\\components\\radix\\themes\\layout\\grid.pyi": "6062188367a2c253f014f916197c963d", + "reflex\\components\\radix\\themes\\layout\\list.pyi": "0e91d3f1c82c9094f328e5b8ecd2f60a", + "reflex\\components\\radix\\themes\\layout\\section.pyi": "41895910072e023ed0fef6a8ad956046", + "reflex\\components\\radix\\themes\\layout\\spacer.pyi": "029eb0eaa731bcdff7c496e0437e22b1", + "reflex\\components\\radix\\themes\\layout\\stack.pyi": "3b0da99b00c826d087ed89fc67c595c1", + "reflex\\components\\radix\\themes\\typography\\__init__.pyi": "ef0ba71353dcac1f3546de45f8721bae", + "reflex\\components\\radix\\themes\\typography\\blockquote.pyi": "8ed6f1c5aa86743d1fb9488334af64fe", + "reflex\\components\\radix\\themes\\typography\\code.pyi": "85e869bb61e3e0da9c244aea78e14193", + "reflex\\components\\radix\\themes\\typography\\heading.pyi": "5a3b0b8e44bda0fce22c6b1a1f25e68e", + "reflex\\components\\radix\\themes\\typography\\link.pyi": "45965d95b9f9b76f8f4a3084a5430194", + "reflex\\components\\radix\\themes\\typography\\text.pyi": "e6aa0ca43ebbd42701a3c72c0312032e", + "reflex\\components\\react_player\\audio.pyi": "972975ed0ba3e1dc4a867da20b11ae8e", + "reflex\\components\\react_player\\react_player.pyi": "63ffffbc24907103f797dcfd85894107", + "reflex\\components\\react_player\\video.pyi": "35ce5ad62e8bff17d9c09d27c362f8dc", + "reflex\\components\\recharts\\__init__.pyi": "a52c9055e37c6ee25ded15688d45e8a5", + "reflex\\components\\recharts\\cartesian.pyi": "9dd16c08abe5205c6c414474e2de2f79", + "reflex\\components\\recharts\\charts.pyi": "3570af4627c601d10ee37033f1b2329c", + "reflex\\components\\recharts\\general.pyi": "a1b846d5f2fd0a8b1969b472c5cab2e7", + "reflex\\components\\recharts\\polar.pyi": "973c3e6aa253914c4c5fd18ed32196fb", + "reflex\\components\\recharts\\recharts.pyi": "157acc830323075ffaf4f68d495d1787", + "reflex\\components\\sonner\\toast.pyi": "0b6dc33413f30fdd043b89ec3c8c3f39", + "reflex\\components\\suneditor\\editor.pyi": "7d94c3587f9ee15e4ab68aca8c3a6d8b", + "reflex\\experimental\\layout.pyi": "6398e779743963ef3e03396696b8ddfb" } diff --git a/reflex/app.py b/reflex/app.py index 34ee12689b2..d369d225335 100644 --- a/reflex/app.py +++ b/reflex/app.py @@ -127,19 +127,23 @@ def default_frontend_exception_handler(exception: Exception) -> None: """ console.error(f"[Reflex Frontend Exception]\n {exception}\n") + # Ensure that plain function returns nothing + return def default_backend_exception_handler(exception: Exception) -> EventSpec: """Default backend exception handler function. + Logs the backend exception and returns an EventSpec that triggers + error handling through State event processing, preserving session context. Args: exception: The exception. Returns: - EventSpec: The window alert event. - + EventSpec: The window alert event that updates the ErrorState with a user-visible error message. """ - from reflex.components.sonner.toast import toast + from reflex.state import ErrorState + from reflex.vars import Var error = traceback.format_exc() @@ -151,14 +155,18 @@ def default_backend_exception_handler(exception: Exception) -> EventSpec: else [f"{type(exception).__name__}: {exception}.", "See logs for details."] ) - return toast( - "An error occurred.", - level="error", - fallback_to_alert=True, - description="
".join(error_message), - position="top-center", - id="backend_error", - style={"width": "500px"}, + error_message_var = Var.create_safe(error_message) + + error_state_instance = ErrorState() + + handler = EventHandler( + fn=error_state_instance.handle_error, + state_full_name=error_state_instance.get_full_name(), # assuming ErrorState inherits this + ) + + return EventSpec( + handler=handler, + args=((error_message_var, error_message_var),), ) diff --git a/reflex/state.py b/reflex/state.py index 94f7d19e1ea..68c29c2b7cf 100644 --- a/reflex/state.py +++ b/reflex/state.py @@ -46,6 +46,7 @@ from sqlalchemy.orm import DeclarativeBase from typing_extensions import Self +import reflex as rx import reflex.istate.dynamic from reflex import constants, event from reflex.base import Base @@ -4144,3 +4145,19 @@ def reload_state_module( state._var_dependencies = {} state._init_var_dependency_dicts() state.get_class_substate.cache_clear() + + +class ErrorState(rx.State): + """Handles error state globally.""" + + error_message: str = "" + + def handle_error(self, event: Event) -> None: + """Handle an error at the backend dynamically by storing the message.""" + args = getattr(event, "args", []) + if args: + message = "\n".join(args[0]) if isinstance(args[0], list) else str(args[0]) + else: + message = "Unknown error" + + self.error_message = message diff --git a/tests/units/test_state.py b/tests/units/test_state.py index 891f02b002c..1ec93600b79 100644 --- a/tests/units/test_state.py +++ b/tests/units/test_state.py @@ -23,10 +23,14 @@ import reflex as rx import reflex.config from reflex import constants -from reflex.app import App +from reflex.app import ( + App, + default_backend_exception_handler, + default_frontend_exception_handler, +) from reflex.base import Base from reflex.constants import CompileVars, RouteVar, SocketEvent -from reflex.event import Event, EventHandler +from reflex.event import Event, EventHandler, EventSpec from reflex.state import ( BaseState, ImmutableStateError, @@ -4028,3 +4032,59 @@ class SecondCvState(CvMixin, rx.State): assert first_cv is not second_cv assert first_cv._static_deps is not second_cv._static_deps + + +def test_default_frontend_exception_handler(capfd): + """Test that frontend handler logs the exception and returns None.""" + ex = ValueError("frontend oops") + result = default_frontend_exception_handler(ex) + assert result is None + out, _ = capfd.readouterr() + assert "[Reflex Frontend Exception]" in out + assert "frontend oops" in out + + +def test_default_backend_exception_handler_returns_eventspec(): + """Test that backend handler returns a correct EventSpec.""" + ex = RuntimeError("backend error") + event_spec = default_backend_exception_handler(ex) + + assert isinstance(event_spec, EventSpec) + assert event_spec.handler is not None + + from reflex.event import EventHandler + + assert isinstance(event_spec.handler, EventHandler) + + handler_fn = event_spec.handler.fn + if isinstance(handler_fn, functools.partial): + handler_fn = handler_fn.func + assert handler_fn.__name__ == "handle_error" + + assert "error" in event_spec.handler.state_full_name.lower() + + # Args checks + var_pairs = event_spec.args + assert var_pairs, "Args should not be empty" + right_hand_value = var_pairs[0][1] + + # Normalize for safe access + if hasattr(right_hand_value, "_js_expr"): + js_expr = right_hand_value._js_expr + assert ( + "Contact the website administrator." in js_expr + or "See logs for details." in js_expr + ) + else: + assert "Contact the website administrator." in str( + right_hand_value + ) or "See logs for details." in str(right_hand_value) + + # repr check + repr_output = repr(event_spec) + assert "handle_error" in repr_output + assert "error" in repr_output.lower() + assert ( + "Contact the website administrator." in repr_output + or "See logs for details." in repr_output + )