streamlit 1.50.0__py3-none-any.whl → 1.52.0__py3-none-any.whl
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.
- streamlit/__init__.py +5 -1
- streamlit/commands/execution_control.py +89 -14
- streamlit/commands/navigation.py +4 -6
- streamlit/commands/page_config.py +4 -6
- streamlit/components/v1/component_arrow.py +7 -7
- streamlit/components/v2/__init__.py +514 -0
- streamlit/components/v2/bidi_component/__init__.py +20 -0
- streamlit/components/v2/bidi_component/constants.py +29 -0
- streamlit/components/v2/bidi_component/main.py +534 -0
- streamlit/components/v2/bidi_component/serialization.py +272 -0
- streamlit/components/v2/bidi_component/state.py +92 -0
- streamlit/components/v2/component_definition_resolver.py +143 -0
- streamlit/components/v2/component_file_watcher.py +403 -0
- streamlit/components/v2/component_manager.py +439 -0
- streamlit/components/v2/component_manifest_handler.py +122 -0
- streamlit/components/v2/component_path_utils.py +245 -0
- streamlit/components/v2/component_registry.py +426 -0
- streamlit/components/v2/get_bidi_component_manager.py +51 -0
- streamlit/components/v2/manifest_scanner.py +615 -0
- streamlit/components/v2/presentation.py +198 -0
- streamlit/components/v2/types.py +324 -0
- streamlit/config.py +456 -53
- streamlit/config_option.py +4 -1
- streamlit/config_util.py +650 -1
- streamlit/connections/snowflake_connection.py +1 -1
- streamlit/connections/snowpark_connection.py +1 -1
- streamlit/dataframe_util.py +33 -26
- streamlit/delta_generator.py +13 -4
- streamlit/delta_generator_singletons.py +11 -15
- streamlit/deprecation_util.py +17 -6
- streamlit/elements/alert.py +16 -0
- streamlit/elements/arrow.py +68 -10
- streamlit/elements/bokeh_chart.py +10 -78
- streamlit/elements/code.py +2 -2
- streamlit/elements/deck_gl_json_chart.py +98 -40
- streamlit/elements/dialog_decorator.py +2 -1
- streamlit/elements/exception.py +4 -2
- streamlit/elements/form.py +27 -0
- streamlit/elements/graphviz_chart.py +1 -3
- streamlit/elements/heading.py +63 -10
- streamlit/elements/html.py +13 -2
- streamlit/elements/image.py +3 -5
- streamlit/elements/layouts.py +59 -33
- streamlit/elements/lib/built_in_chart_utils.py +50 -19
- streamlit/elements/lib/color_util.py +9 -19
- streamlit/elements/lib/column_config_utils.py +9 -12
- streamlit/elements/lib/column_types.py +40 -12
- streamlit/elements/lib/dialog.py +2 -2
- streamlit/elements/lib/image_utils.py +3 -5
- streamlit/elements/lib/layout_utils.py +100 -13
- streamlit/elements/lib/mutable_status_container.py +2 -2
- streamlit/elements/lib/options_selector_utils.py +2 -2
- streamlit/elements/lib/pandas_styler_utils.py +17 -9
- streamlit/elements/lib/shortcut_utils.py +152 -0
- streamlit/elements/lib/utils.py +4 -4
- streamlit/elements/map.py +80 -37
- streamlit/elements/markdown.py +50 -3
- streamlit/elements/media.py +5 -7
- streamlit/elements/metric.py +34 -6
- streamlit/elements/pdf.py +2 -4
- streamlit/elements/plotly_chart.py +197 -20
- streamlit/elements/progress.py +2 -4
- streamlit/elements/space.py +113 -0
- streamlit/elements/spinner.py +1 -1
- streamlit/elements/text.py +20 -3
- streamlit/elements/toast.py +2 -0
- streamlit/elements/vega_charts.py +356 -149
- streamlit/elements/widgets/audio_input.py +12 -11
- streamlit/elements/widgets/button.py +280 -43
- streamlit/elements/widgets/button_group.py +60 -9
- streamlit/elements/widgets/camera_input.py +3 -5
- streamlit/elements/widgets/chat.py +307 -43
- streamlit/elements/widgets/color_picker.py +8 -1
- streamlit/elements/widgets/data_editor.py +88 -44
- streamlit/elements/widgets/file_uploader.py +9 -11
- streamlit/elements/widgets/multiselect.py +4 -3
- streamlit/elements/widgets/number_input.py +4 -4
- streamlit/elements/widgets/radio.py +10 -3
- streamlit/elements/widgets/select_slider.py +8 -5
- streamlit/elements/widgets/selectbox.py +6 -3
- streamlit/elements/widgets/slider.py +38 -42
- streamlit/elements/widgets/text_widgets.py +2 -0
- streamlit/elements/widgets/time_widgets.py +587 -21
- streamlit/elements/write.py +27 -6
- streamlit/emojis.py +1 -1
- streamlit/errors.py +137 -0
- streamlit/git_util.py +1 -1
- streamlit/hello/hello.py +8 -0
- streamlit/hello/utils.py +2 -1
- streamlit/material_icon_names.py +1 -1
- streamlit/navigation/page.py +11 -1
- streamlit/net_util.py +2 -2
- streamlit/proto/Alert_pb2.pyi +3 -3
- streamlit/proto/AppPage_pb2.pyi +7 -1
- streamlit/proto/ArrowData_pb2.py +27 -0
- streamlit/proto/ArrowData_pb2.pyi +52 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +7 -1
- streamlit/proto/ArrowVegaLiteChart_pb2.pyi +7 -1
- streamlit/proto/Arrow_pb2.py +10 -10
- streamlit/proto/Arrow_pb2.pyi +19 -12
- streamlit/proto/AudioInput_pb2.pyi +7 -1
- streamlit/proto/Audio_pb2.pyi +7 -1
- streamlit/proto/AuthRedirect_pb2.pyi +7 -1
- streamlit/proto/AutoRerun_pb2.pyi +7 -1
- streamlit/proto/BackMsg_pb2.py +4 -2
- streamlit/proto/BackMsg_pb2.pyi +34 -4
- streamlit/proto/Balloons_pb2.pyi +7 -1
- streamlit/proto/BidiComponent_pb2.py +34 -0
- streamlit/proto/BidiComponent_pb2.pyi +159 -0
- streamlit/proto/Block_pb2.py +7 -7
- streamlit/proto/Block_pb2.pyi +39 -36
- streamlit/proto/BokehChart_pb2.pyi +7 -1
- streamlit/proto/ButtonGroup_pb2.pyi +9 -9
- streamlit/proto/Button_pb2.py +2 -2
- streamlit/proto/Button_pb2.pyi +11 -2
- streamlit/proto/CameraInput_pb2.pyi +7 -1
- streamlit/proto/ChatInput_pb2.py +6 -6
- streamlit/proto/ChatInput_pb2.pyi +18 -6
- streamlit/proto/Checkbox_pb2.pyi +3 -3
- streamlit/proto/ClientState_pb2.pyi +10 -4
- streamlit/proto/Code_pb2.pyi +7 -1
- streamlit/proto/ColorPicker_pb2.pyi +7 -1
- streamlit/proto/Common_pb2.py +3 -3
- streamlit/proto/Common_pb2.pyi +35 -23
- streamlit/proto/Components_pb2.pyi +19 -13
- streamlit/proto/DataFrame_pb2.pyi +55 -49
- streamlit/proto/DateInput_pb2.pyi +7 -1
- streamlit/proto/DateTimeInput_pb2.py +28 -0
- streamlit/proto/DateTimeInput_pb2.pyi +92 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +10 -4
- streamlit/proto/DeckGlJsonChart_pb2.pyi +12 -6
- streamlit/proto/Delta_pb2.pyi +7 -1
- streamlit/proto/DocString_pb2.pyi +10 -4
- streamlit/proto/DownloadButton_pb2.py +2 -2
- streamlit/proto/DownloadButton_pb2.pyi +16 -2
- streamlit/proto/Element_pb2.py +7 -3
- streamlit/proto/Element_pb2.pyi +33 -5
- streamlit/proto/Empty_pb2.pyi +7 -1
- streamlit/proto/Exception_pb2.pyi +7 -1
- streamlit/proto/Favicon_pb2.pyi +7 -1
- streamlit/proto/FileUploader_pb2.pyi +7 -1
- streamlit/proto/ForwardMsg_pb2.py +12 -10
- streamlit/proto/ForwardMsg_pb2.pyi +42 -15
- streamlit/proto/GapSize_pb2.pyi +4 -4
- streamlit/proto/GitInfo_pb2.pyi +3 -3
- streamlit/proto/GraphVizChart_pb2.pyi +7 -1
- streamlit/proto/Heading_pb2.pyi +7 -1
- streamlit/proto/HeightConfig_pb2.py +2 -2
- streamlit/proto/HeightConfig_pb2.pyi +13 -4
- streamlit/proto/Html_pb2.py +2 -2
- streamlit/proto/Html_pb2.pyi +11 -2
- streamlit/proto/IFrame_pb2.pyi +7 -1
- streamlit/proto/Image_pb2.pyi +10 -4
- streamlit/proto/Json_pb2.pyi +7 -1
- streamlit/proto/LabelVisibilityMessage_pb2.pyi +3 -3
- streamlit/proto/LinkButton_pb2.py +2 -2
- streamlit/proto/LinkButton_pb2.pyi +15 -2
- streamlit/proto/Logo_pb2.pyi +7 -1
- streamlit/proto/Markdown_pb2.pyi +3 -3
- streamlit/proto/Metric_pb2.pyi +7 -7
- streamlit/proto/MetricsEvent_pb2.pyi +10 -4
- streamlit/proto/MultiSelect_pb2.pyi +7 -1
- streamlit/proto/NamedDataSet_pb2.pyi +7 -1
- streamlit/proto/Navigation_pb2.pyi +3 -3
- streamlit/proto/NewSession_pb2.py +18 -18
- streamlit/proto/NewSession_pb2.pyi +59 -40
- streamlit/proto/NumberInput_pb2.pyi +3 -3
- streamlit/proto/PageConfig_pb2.pyi +7 -7
- streamlit/proto/PageInfo_pb2.pyi +7 -1
- streamlit/proto/PageLink_pb2.py +2 -2
- streamlit/proto/PageLink_pb2.pyi +11 -2
- streamlit/proto/PageNotFound_pb2.pyi +7 -1
- streamlit/proto/PageProfile_pb2.pyi +13 -7
- streamlit/proto/PagesChanged_pb2.pyi +7 -1
- streamlit/proto/ParentMessage_pb2.pyi +7 -1
- streamlit/proto/PlotlyChart_pb2.py +8 -6
- streamlit/proto/PlotlyChart_pb2.pyi +9 -7
- streamlit/proto/Progress_pb2.pyi +7 -1
- streamlit/proto/Radio_pb2.pyi +7 -1
- streamlit/proto/RootContainer_pb2.pyi +1 -1
- streamlit/proto/Selectbox_pb2.pyi +7 -1
- streamlit/proto/SessionEvent_pb2.pyi +7 -1
- streamlit/proto/SessionStatus_pb2.pyi +7 -1
- streamlit/proto/Skeleton_pb2.pyi +3 -3
- streamlit/proto/Slider_pb2.pyi +5 -5
- streamlit/proto/Snow_pb2.pyi +7 -1
- streamlit/proto/Space_pb2.py +27 -0
- streamlit/proto/Space_pb2.pyi +48 -0
- streamlit/proto/Spinner_pb2.pyi +7 -1
- streamlit/proto/TextAlignmentConfig_pb2.py +29 -0
- streamlit/proto/TextAlignmentConfig_pb2.pyi +68 -0
- streamlit/proto/TextArea_pb2.pyi +7 -1
- streamlit/proto/TextInput_pb2.pyi +3 -3
- streamlit/proto/Text_pb2.pyi +7 -1
- streamlit/proto/TimeInput_pb2.pyi +7 -1
- streamlit/proto/Toast_pb2.pyi +7 -1
- streamlit/proto/VegaLiteChart_pb2.pyi +7 -1
- streamlit/proto/Video_pb2.pyi +6 -6
- streamlit/proto/WidgetStates_pb2.py +2 -2
- streamlit/proto/WidgetStates_pb2.pyi +23 -7
- streamlit/proto/WidthConfig_pb2.py +2 -2
- streamlit/proto/WidthConfig_pb2.pyi +13 -4
- streamlit/proto/openmetrics_data_model_pb2.pyi +52 -52
- streamlit/runtime/app_session.py +65 -2
- streamlit/runtime/caching/cache_data_api.py +5 -5
- streamlit/runtime/caching/cache_errors.py +4 -1
- streamlit/runtime/caching/cache_resource_api.py +5 -4
- streamlit/runtime/caching/cache_utils.py +3 -2
- streamlit/runtime/caching/cached_message_replay.py +3 -3
- streamlit/runtime/caching/hashing.py +4 -5
- streamlit/runtime/caching/legacy_cache_api.py +2 -1
- streamlit/runtime/connection_factory.py +1 -3
- streamlit/runtime/download_data_util.py +53 -0
- streamlit/runtime/forward_msg_queue.py +5 -1
- streamlit/runtime/fragment.py +2 -1
- streamlit/runtime/media_file_manager.py +178 -2
- streamlit/runtime/memory_media_file_storage.py +1 -1
- streamlit/runtime/metrics_util.py +91 -3
- streamlit/runtime/runtime.py +14 -0
- streamlit/runtime/scriptrunner/exec_code.py +2 -1
- streamlit/runtime/scriptrunner/script_runner.py +5 -3
- streamlit/runtime/scriptrunner_utils/script_run_context.py +3 -6
- streamlit/runtime/secrets.py +2 -4
- streamlit/runtime/session_manager.py +3 -1
- streamlit/runtime/state/common.py +30 -5
- streamlit/runtime/state/presentation.py +85 -0
- streamlit/runtime/state/query_params.py +80 -29
- streamlit/runtime/state/safe_session_state.py +2 -2
- streamlit/runtime/state/session_state.py +221 -17
- streamlit/runtime/state/widgets.py +19 -3
- streamlit/runtime/websocket_session_manager.py +3 -1
- streamlit/source_util.py +2 -2
- streamlit/static/index.html +2 -2
- streamlit/static/manifest.json +557 -239
- streamlit/static/static/css/{index.CIiu7Ygf.css → index.BpABIXK9.css} +1 -1
- streamlit/static/static/css/index.DgR7E2CV.css +1 -0
- streamlit/static/static/js/{ErrorOutline.esm.DUpR0_Ka.js → ErrorOutline.esm.ZJDbmVTx.js} +1 -1
- streamlit/static/static/js/{FileDownload.esm.CN4j9-1w.js → FileDownload.esm.Dx0vI3vH.js} +1 -1
- streamlit/static/static/js/{FileHelper.CaIUKG91.js → FileHelper.B7Ero7qQ.js} +3 -3
- streamlit/static/static/js/{FormClearHelper.DTcdrasw.js → FormClearHelper.CG2XN1_g.js} +1 -1
- streamlit/static/static/js/IFrameUtil.DefezniK.js +1 -0
- streamlit/static/static/js/InputInstructions.Cj5-1zf6.js +1 -0
- streamlit/static/static/js/Particles.BfWfv0Aw.js +1 -0
- streamlit/static/static/js/{ProgressBar.DetlP5aY.js → ProgressBar.CGQ8OgfO.js} +2 -2
- streamlit/static/static/js/StreamlitSyntaxHighlighter.DTKLpwhl.js +20 -0
- streamlit/static/static/js/{Toolbar.C77ar7rq.js → Toolbar.B2qFUmd9.js} +1 -1
- streamlit/static/static/js/_arrayIncludes.B19Iyn2B.js +1 -0
- streamlit/static/static/js/_baseIndexOf.BTknn6Gb.js +1 -0
- streamlit/static/static/js/{base-input.BQft14La.js → base-input.o9tL8MDP.js} +4 -4
- streamlit/static/static/js/{checkbox.yZOfXCeX.js → checkbox.0BeV1IBL.js} +1 -1
- streamlit/static/static/js/{createSuper.Dh9w1cs8.js → createSuper.RBO59fEm.js} +1 -1
- streamlit/static/static/js/data-grid-overlay-editor.CiTkUy0t.js +1 -0
- streamlit/static/static/js/{downloader.MeHtkq8r.js → downloader.DwNZg3Mw.js} +1 -1
- streamlit/static/static/js/embed.XT9xNd3F.js +195 -0
- streamlit/static/static/js/{es6.VpBPGCnM.js → es6.x9KsYQg-.js} +2 -2
- streamlit/static/static/js/{iframeResizer.contentWindow.yMw_ARIL.js → iframeResizer.contentWindow.ZVXpMPi0.js} +1 -1
- streamlit/static/static/js/index.5VPOamri.js +1 -0
- streamlit/static/static/js/index.8HslT92O.js +14 -0
- streamlit/static/static/js/index.AnXMIBz3.js +7 -0
- streamlit/static/static/js/index.B0yp3bM1.js +6 -0
- streamlit/static/static/js/index.B1fRb5wF.js +1 -0
- streamlit/static/static/js/index.B527JZdO.js +3 -0
- streamlit/static/static/js/index.BHgV-yW4.js +1 -0
- streamlit/static/static/js/index.BQr-XwGV.js +1 -0
- streamlit/static/static/js/index.BTtmaLDB.js +1 -0
- streamlit/static/static/js/index.BWB_91TA.js +1 -0
- streamlit/static/static/js/index.BfEKaEmw.js +1 -0
- streamlit/static/static/js/index.BfXjTO8b.js +1 -0
- streamlit/static/static/js/index.Bjy4NRu9.js +3 -0
- streamlit/static/static/js/index.Bu5JWpT_.js +1 -0
- streamlit/static/static/js/index.BuCx76ZV.js +1 -0
- streamlit/static/static/js/index.BxjzhVUb.js +2 -0
- streamlit/static/static/js/index.By55VdPY.js +1 -0
- streamlit/static/static/js/index.CF5MxTbK.js +1 -0
- streamlit/static/static/js/index.CLmq_z9K.js +1 -0
- streamlit/static/static/js/index.CNH4rdSz.js +1 -0
- streamlit/static/static/js/{index.B0H9IXUJ.js → index.CTgm_-jO.js} +10 -41
- streamlit/static/static/js/index.C_rK-Swb.js +188 -0
- streamlit/static/static/js/index.CjozwSzS.js +1 -0
- streamlit/static/static/js/{index.CH1tqnSs.js → index.CkGVt6-G.js} +1 -1
- streamlit/static/static/js/index.CuvXOyER.js +2 -0
- streamlit/static/static/js/{index.FFOzOWzC.js → index.CyUHWoCC.js} +2 -2
- streamlit/static/static/js/index.CyroQtI4.js +2 -0
- streamlit/static/static/js/index.D6HmkoDm.js +263 -0
- streamlit/static/static/js/index.DAqCNvsO.js +1 -0
- streamlit/static/static/js/index.DB_w_CZQ.js +1 -0
- streamlit/static/static/js/index.DBalctjj.js +2 -0
- streamlit/static/static/js/index.DK0RFJUG.js +11 -0
- streamlit/static/static/js/index.DMxc2XFp.js +151 -0
- streamlit/static/static/js/index.DO5utP74.js +2 -0
- streamlit/static/static/js/index.DS7lf09n.js +1 -0
- streamlit/static/static/js/index.DWexTVLY.js +1 -0
- streamlit/static/static/js/index.DXxnU5ej.js +1 -0
- streamlit/static/static/js/index.DcU3uDvB.js +2 -0
- streamlit/static/static/js/index.DlltaH7J.js +1 -0
- streamlit/static/static/js/index.DpNTZz82.js +27 -0
- streamlit/static/static/js/index.Dr9HIhQw.js +1 -0
- streamlit/static/static/js/index.DsgAU5lc.js +1 -0
- streamlit/static/static/js/{index.64ejlaaT.js → index.KfXqjDYy.js} +1 -1
- streamlit/static/static/js/index.PaidgjCs.js +1 -0
- streamlit/static/static/js/index.RJZuWCGA.js +1 -0
- streamlit/static/static/js/{index.Ctn27_AE.js → index.hbeqcRTn.js} +53 -122
- streamlit/static/static/js/index.q5hIQwAY.js +1 -0
- streamlit/static/static/js/index.rORSX6IW.js +1 -0
- streamlit/static/static/js/index.uSX757_v.js +1 -0
- streamlit/static/static/js/index.x_QRaLMd.js +1 -0
- streamlit/static/static/js/{input.s6pjQ49A.js → input.D5oh9-aB.js} +2 -2
- streamlit/static/static/js/main.q9oGOg0H.js +13 -0
- streamlit/static/static/js/{memory.Cuvsdfrl.js → memory.5kCSFUJS.js} +1 -1
- streamlit/static/static/js/moment.C3j7ZXd7.js +4 -0
- streamlit/static/static/js/number-overlay-editor.Cn_LsK8N.js +9 -0
- streamlit/static/static/js/pandasStylerUtils.BqhXt51_.js +1 -0
- streamlit/static/static/js/{possibleConstructorReturn.CqidKeei.js → possibleConstructorReturn.DD9NK1Z8.js} +1 -1
- streamlit/static/static/js/record.B-tDciZb.js +1 -0
- streamlit/static/static/js/{sandbox.CCQREcJx.js → sandbox.DACSyz29.js} +1 -1
- streamlit/static/static/js/styled-components.C3R090At.js +1 -0
- streamlit/static/static/js/threshold.Q1mXg5rX.js +1 -0
- streamlit/static/static/js/throttle.B0GR3Iyz.js +1 -0
- streamlit/static/static/js/{timepicker.mkJF97Bb.js → timepicker.BdhzPxrv.js} +1 -1
- streamlit/static/static/js/timer.C2hYhUse.js +1 -0
- streamlit/static/static/js/{toConsumableArray.De7I7KVR.js → toConsumableArray.Db2pdqM2.js} +1 -1
- streamlit/static/static/js/uniqueId.CtqIr-Yh.js +1 -0
- streamlit/static/static/js/urls.BwSlolu9.js +1 -0
- streamlit/static/static/js/{useBasicWidgetState.CedkNjUW.js → useBasicWidgetState.Bfp6TnSw.js} +1 -1
- streamlit/static/static/js/useIntlLocale.hRV75Xgj.js +12 -0
- streamlit/static/static/js/{useTextInputAutoExpand.Ca7w8dVs.js → useTextInputAutoExpand.QepX7n8Y.js} +1 -1
- streamlit/static/static/js/useUpdateUiValue.DHx8TzX6.js +1 -0
- streamlit/static/static/js/useWaveformController.WxVzpzEX.js +1 -0
- streamlit/static/static/js/value.B4vHRSi7.js +1 -0
- streamlit/static/static/js/wavesurfer.esm.vI8Eid4k.js +73 -0
- streamlit/static/static/js/withCalculatedWidth.DcKeRSWJ.js +1 -0
- streamlit/static/static/js/withFullScreenWrapper.CrHddARq.js +1 -0
- streamlit/static/static/media/MaterialSymbols-Rounded.C7IFxh57.woff2 +0 -0
- streamlit/string_util.py +9 -4
- streamlit/testing/v1/app_test.py +17 -2
- streamlit/testing/v1/element_tree.py +85 -9
- streamlit/testing/v1/util.py +2 -2
- streamlit/type_util.py +3 -4
- streamlit/url_util.py +1 -3
- streamlit/user_info.py +1 -2
- streamlit/util.py +3 -1
- streamlit/watcher/event_based_path_watcher.py +23 -12
- streamlit/watcher/local_sources_watcher.py +11 -1
- streamlit/watcher/path_watcher.py +9 -6
- streamlit/watcher/polling_path_watcher.py +4 -1
- streamlit/watcher/util.py +2 -2
- streamlit/web/bootstrap.py +24 -0
- streamlit/web/cli.py +51 -22
- streamlit/web/server/bidi_component_request_handler.py +193 -0
- streamlit/web/server/component_file_utils.py +97 -0
- streamlit/web/server/component_request_handler.py +8 -21
- streamlit/web/server/oauth_authlib_routes.py +5 -2
- streamlit/web/server/oidc_mixin.py +3 -1
- streamlit/web/server/routes.py +2 -2
- streamlit/web/server/server.py +9 -0
- streamlit/web/server/server_util.py +3 -1
- streamlit/web/server/upload_file_request_handler.py +19 -1
- {streamlit-1.50.0.dist-info → streamlit-1.52.0.dist-info}/METADATA +10 -7
- streamlit-1.52.0.dist-info/RECORD +620 -0
- streamlit/static/static/css/index.CHEnSPGk.css +0 -1
- streamlit/static/static/js/Hooks.BRba_Own.js +0 -1
- streamlit/static/static/js/InputInstructions.xnSDuYeQ.js +0 -1
- streamlit/static/static/js/Particles.CElH0XX2.js +0 -1
- streamlit/static/static/js/data-grid-overlay-editor.DcuHuCyW.js +0 -1
- streamlit/static/static/js/index.6xX1278W.js +0 -975
- streamlit/static/static/js/index.B-hiXRzw.js +0 -1
- streamlit/static/static/js/index.B4cAbHP6.js +0 -1
- streamlit/static/static/js/index.B4dUQfni.js +0 -1
- streamlit/static/static/js/index.BPQo7BKk.js +0 -1
- streamlit/static/static/js/index.Baqa90pe.js +0 -2
- streamlit/static/static/js/index.Bj9JgOEC.js +0 -1
- streamlit/static/static/js/index.BjCwMzj4.js +0 -3
- streamlit/static/static/js/index.Bm3VbPB5.js +0 -1
- streamlit/static/static/js/index.Bxz2yX3P.js +0 -1
- streamlit/static/static/js/index.BycLveZ4.js +0 -1
- streamlit/static/static/js/index.C9BdUqTi.js +0 -1
- streamlit/static/static/js/index.CFMf5_ez.js +0 -197
- streamlit/static/static/js/index.CGYqqs6j.js +0 -1
- streamlit/static/static/js/index.CMItVsFA.js +0 -1
- streamlit/static/static/js/index.CTBk8Vk2.js +0 -1
- streamlit/static/static/js/index.CiAQIz1H.js +0 -7
- streamlit/static/static/js/index.Cj7DSzVR.js +0 -73
- streamlit/static/static/js/index.Ck8rQ9OL.js +0 -1
- streamlit/static/static/js/index.ClELlchS.js +0 -1617
- streamlit/static/static/js/index.Cnpi3o3E.js +0 -1
- streamlit/static/static/js/index.D2QEXQq_.js +0 -1
- streamlit/static/static/js/index.DH71Ezyj.js +0 -1
- streamlit/static/static/js/index.DHh-U0dK.js +0 -3
- streamlit/static/static/js/index.DK7hD7_w.js +0 -1
- streamlit/static/static/js/index.DKv_lNO7.js +0 -2
- streamlit/static/static/js/index.DNLrMXgm.js +0 -12
- streamlit/static/static/js/index.DW0Grddz.js +0 -1
- streamlit/static/static/js/index.Dbe-Q3C-.js +0 -2
- streamlit/static/static/js/index.DcPNYEUo.js +0 -1
- streamlit/static/static/js/index.DuxqVQpd.js +0 -1
- streamlit/static/static/js/index.GRUzrudl.js +0 -1
- streamlit/static/static/js/number-overlay-editor.DdgVR5m3.js +0 -9
- streamlit/static/static/js/uniqueId.RI1LJdtz.js +0 -1
- streamlit/static/static/js/useUpdateUiValue.DeXelfRH.js +0 -1
- streamlit/static/static/js/withFullScreenWrapper.C3561XxJ.js +0 -1
- streamlit/static/static/media/MaterialSymbols-Rounded.DeCZgS-4.woff2 +0 -0
- streamlit-1.50.0.dist-info/RECORD +0 -557
- {streamlit-1.50.0.data → streamlit-1.52.0.data}/scripts/streamlit.cmd +0 -0
- {streamlit-1.50.0.dist-info → streamlit-1.52.0.dist-info}/WHEEL +0 -0
- {streamlit-1.50.0.dist-info → streamlit-1.52.0.dist-info}/entry_points.txt +0 -0
- {streamlit-1.50.0.dist-info → streamlit-1.52.0.dist-info}/top_level.txt +0 -0
|
@@ -16,26 +16,29 @@
|
|
|
16
16
|
|
|
17
17
|
from __future__ import annotations
|
|
18
18
|
|
|
19
|
+
from collections.abc import Callable
|
|
19
20
|
from dataclasses import dataclass, field
|
|
20
21
|
from typing import (
|
|
22
|
+
TYPE_CHECKING,
|
|
21
23
|
Any,
|
|
22
|
-
Callable,
|
|
23
24
|
Final,
|
|
24
25
|
Generic,
|
|
25
26
|
Literal,
|
|
27
|
+
TypeAlias,
|
|
28
|
+
TypeGuard,
|
|
26
29
|
TypeVar,
|
|
27
|
-
Union,
|
|
28
30
|
cast,
|
|
29
31
|
get_args,
|
|
30
32
|
)
|
|
31
33
|
|
|
32
|
-
from typing_extensions import TypeAlias, TypeGuard
|
|
33
|
-
|
|
34
34
|
from streamlit import util
|
|
35
35
|
from streamlit.errors import (
|
|
36
36
|
StreamlitAPIException,
|
|
37
37
|
)
|
|
38
38
|
|
|
39
|
+
if TYPE_CHECKING:
|
|
40
|
+
from streamlit.runtime.state.session_state import SessionState
|
|
41
|
+
|
|
39
42
|
GENERATED_ELEMENT_ID_PREFIX: Final = "$$ID"
|
|
40
43
|
TESTING_KEY = "$$STREAMLIT_INTERNAL_KEY_TESTING"
|
|
41
44
|
|
|
@@ -44,7 +47,7 @@ T = TypeVar("T")
|
|
|
44
47
|
T_co = TypeVar("T_co", covariant=True)
|
|
45
48
|
|
|
46
49
|
|
|
47
|
-
WidgetArgs: TypeAlias =
|
|
50
|
+
WidgetArgs: TypeAlias = tuple[Any, ...] | list[Any]
|
|
48
51
|
WidgetKwargs: TypeAlias = dict[str, Any]
|
|
49
52
|
WidgetCallback: TypeAlias = Callable[..., None]
|
|
50
53
|
|
|
@@ -93,6 +96,7 @@ ValueFieldName: TypeAlias = Literal[
|
|
|
93
96
|
"file_uploader_state_value",
|
|
94
97
|
"int_value",
|
|
95
98
|
"json_value",
|
|
99
|
+
"json_trigger_value",
|
|
96
100
|
"string_value",
|
|
97
101
|
"trigger_value",
|
|
98
102
|
"string_trigger_value",
|
|
@@ -104,6 +108,13 @@ def is_array_value_field_name(obj: object) -> TypeGuard[ArrayValueFieldName]:
|
|
|
104
108
|
return obj in _ARRAY_VALUE_FIELD_NAMES
|
|
105
109
|
|
|
106
110
|
|
|
111
|
+
# Optional hook that allows a widget to customize how its value should be
|
|
112
|
+
# presented in `st.session_state` without altering the underlying stored value
|
|
113
|
+
# or callback semantics. The presenter receives the widget's base value and the
|
|
114
|
+
# SessionState instance in case it needs to access additional widget state.
|
|
115
|
+
WidgetValuePresenter: TypeAlias = Callable[[Any, "SessionState"], Any]
|
|
116
|
+
|
|
117
|
+
|
|
107
118
|
@dataclass(frozen=True)
|
|
108
119
|
class WidgetMetadata(Generic[T]):
|
|
109
120
|
"""Metadata associated with a single widget. Immutable."""
|
|
@@ -117,11 +128,25 @@ class WidgetMetadata(Generic[T]):
|
|
|
117
128
|
# Widget callbacks are called at the start of a script run, before the
|
|
118
129
|
# body of the script is executed.
|
|
119
130
|
callback: WidgetCallback | None = None
|
|
131
|
+
|
|
132
|
+
# An optional dictionary of event names to user-code callbacks. These are
|
|
133
|
+
# invoked when the corresponding widget event occurs. Callbacks are called
|
|
134
|
+
# at the start of a script run, before the body of the script is executed.
|
|
135
|
+
# Right now, multiple callbacks are only supported for widgets with a
|
|
136
|
+
# `value_type` of `json_value` or `json_trigger_value`. The keys in this
|
|
137
|
+
# dictionary should correspond to keys in the widget's JSON state.
|
|
138
|
+
callbacks: dict[str, WidgetCallback] | None = None
|
|
120
139
|
callback_args: WidgetArgs | None = None
|
|
121
140
|
callback_kwargs: WidgetKwargs | None = None
|
|
122
141
|
|
|
123
142
|
fragment_id: str | None = None
|
|
124
143
|
|
|
144
|
+
# Optional presenter hook used for customizing the user-visible value in
|
|
145
|
+
# st.session_state. This is intended for advanced widgets (e.g. Custom
|
|
146
|
+
# Components v2) that need to synthesize a presentation-only value from
|
|
147
|
+
# multiple internal widget states.
|
|
148
|
+
presenter: WidgetValuePresenter | None = None
|
|
149
|
+
|
|
125
150
|
def __repr__(self) -> str:
|
|
126
151
|
return util.repr_(self)
|
|
127
152
|
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
# Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
from __future__ import annotations
|
|
16
|
+
|
|
17
|
+
from typing import TYPE_CHECKING, Any, Final
|
|
18
|
+
|
|
19
|
+
from streamlit.logger import get_logger
|
|
20
|
+
|
|
21
|
+
_LOGGER: Final = get_logger(__name__)
|
|
22
|
+
|
|
23
|
+
if TYPE_CHECKING:
|
|
24
|
+
from streamlit.runtime.state.session_state import SessionState
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
def apply_presenter(
|
|
28
|
+
session_state: SessionState, widget_id: str, base_value: Any
|
|
29
|
+
) -> Any:
|
|
30
|
+
"""Return the user-visible value for a widget if it has a ``presenter``.
|
|
31
|
+
|
|
32
|
+
If the widget's metadata defines a ``presenter`` callable, it is used to
|
|
33
|
+
transform the stored value into its presentation form. Any exception raised
|
|
34
|
+
while resolving metadata or invoking the presenter is swallowed and
|
|
35
|
+
``base_value`` is returned, so presentation never interferes with core
|
|
36
|
+
behavior.
|
|
37
|
+
|
|
38
|
+
Notes
|
|
39
|
+
-----
|
|
40
|
+
Presentation is applied exclusively for user-facing access paths such as:
|
|
41
|
+
- `st.session_state[... ]` via `SessionState.__getitem__`
|
|
42
|
+
- `SessionState.filtered_state`
|
|
43
|
+
|
|
44
|
+
Internal serialization paths (for example `WStates.as_widget_states()` and
|
|
45
|
+
`SessionState.get_widget_states()`) must operate on base (unpresented)
|
|
46
|
+
values to ensure stable and lossless serialization. Do not use
|
|
47
|
+
`apply_presenter` in serialization code paths.
|
|
48
|
+
|
|
49
|
+
Parameters
|
|
50
|
+
----------
|
|
51
|
+
session_state : SessionState
|
|
52
|
+
The current session state object that holds widget state and metadata.
|
|
53
|
+
widget_id : str
|
|
54
|
+
The identifier of the widget whose value is being presented.
|
|
55
|
+
base_value : Any
|
|
56
|
+
The raw value stored for the widget.
|
|
57
|
+
|
|
58
|
+
Returns
|
|
59
|
+
-------
|
|
60
|
+
Any
|
|
61
|
+
The value that should be shown to the user.
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
try:
|
|
65
|
+
meta = session_state._get_widget_metadata(widget_id)
|
|
66
|
+
presenter = getattr(meta, "presenter", None) if meta is not None else None
|
|
67
|
+
if presenter is None:
|
|
68
|
+
return base_value
|
|
69
|
+
|
|
70
|
+
# Ensure the presenter is callable to avoid silently failing on a
|
|
71
|
+
# TypeError when attempting to invoke a non-callable value.
|
|
72
|
+
if not callable(presenter):
|
|
73
|
+
_LOGGER.warning(
|
|
74
|
+
"Widget '%s' has a non-callable presenter (%r); returning base value.",
|
|
75
|
+
widget_id,
|
|
76
|
+
presenter,
|
|
77
|
+
)
|
|
78
|
+
return base_value
|
|
79
|
+
try:
|
|
80
|
+
return presenter(base_value, session_state)
|
|
81
|
+
except Exception:
|
|
82
|
+
return base_value
|
|
83
|
+
except Exception:
|
|
84
|
+
# If metadata is unavailable or any other error occurs, degrade gracefully.
|
|
85
|
+
return base_value
|
|
@@ -14,18 +14,21 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
from collections.abc import Iterable, Iterator, MutableMapping
|
|
17
|
+
from collections.abc import Iterable, Iterator, Mapping, MutableMapping
|
|
18
18
|
from dataclasses import dataclass, field
|
|
19
19
|
from typing import TYPE_CHECKING, Final, cast
|
|
20
20
|
from urllib import parse
|
|
21
21
|
|
|
22
|
-
from streamlit.errors import StreamlitAPIException
|
|
22
|
+
from streamlit.errors import StreamlitAPIException, StreamlitQueryParamDictValueError
|
|
23
23
|
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
|
24
24
|
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
|
25
25
|
|
|
26
26
|
if TYPE_CHECKING:
|
|
27
27
|
from _typeshed import SupportsKeysAndGetItem
|
|
28
28
|
|
|
29
|
+
QueryParamValue = str | Iterable[str]
|
|
30
|
+
QueryParamsInput = Mapping[str, QueryParamValue] | Iterable[tuple[str, QueryParamValue]]
|
|
31
|
+
|
|
29
32
|
|
|
30
33
|
EMBED_QUERY_PARAM: Final[str] = "embed"
|
|
31
34
|
EMBED_OPTIONS_QUERY_PARAM: Final[str] = "embed_options"
|
|
@@ -47,7 +50,9 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
47
50
|
self._ensure_single_query_api_used()
|
|
48
51
|
|
|
49
52
|
return iter(
|
|
50
|
-
key
|
|
53
|
+
key
|
|
54
|
+
for key in self._query_params
|
|
55
|
+
if key.lower() not in EMBED_QUERY_PARAMS_KEYS
|
|
51
56
|
)
|
|
52
57
|
|
|
53
58
|
def __getitem__(self, key: str) -> str:
|
|
@@ -56,7 +61,7 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
56
61
|
If the key is not present, raise KeyError.
|
|
57
62
|
"""
|
|
58
63
|
self._ensure_single_query_api_used()
|
|
59
|
-
if key in EMBED_QUERY_PARAMS_KEYS:
|
|
64
|
+
if key.lower() in EMBED_QUERY_PARAMS_KEYS:
|
|
60
65
|
raise KeyError(missing_key_error_message(key))
|
|
61
66
|
|
|
62
67
|
try:
|
|
@@ -73,29 +78,15 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
73
78
|
|
|
74
79
|
def __setitem__(self, key: str, value: str | Iterable[str]) -> None:
|
|
75
80
|
self._ensure_single_query_api_used()
|
|
76
|
-
self.
|
|
81
|
+
self._set_item_internal(key, value)
|
|
77
82
|
self._send_query_param_msg()
|
|
78
83
|
|
|
79
|
-
def
|
|
80
|
-
|
|
81
|
-
raise StreamlitAPIException(
|
|
82
|
-
f"You cannot set a query params key `{key}` to a dictionary."
|
|
83
|
-
)
|
|
84
|
-
|
|
85
|
-
if key in EMBED_QUERY_PARAMS_KEYS:
|
|
86
|
-
raise StreamlitAPIException(
|
|
87
|
-
"Query param embed and embed_options (case-insensitive) cannot be set programmatically."
|
|
88
|
-
)
|
|
89
|
-
# Type checking users should handle the string serialization themselves
|
|
90
|
-
# We will accept any type for the list and serialize to str just in case
|
|
91
|
-
if isinstance(value, Iterable) and not isinstance(value, str):
|
|
92
|
-
self._query_params[key] = [str(item) for item in value]
|
|
93
|
-
else:
|
|
94
|
-
self._query_params[key] = str(value)
|
|
84
|
+
def _set_item_internal(self, key: str, value: str | Iterable[str]) -> None:
|
|
85
|
+
_set_item_in_dict(self._query_params, key, value)
|
|
95
86
|
|
|
96
87
|
def __delitem__(self, key: str) -> None:
|
|
97
88
|
self._ensure_single_query_api_used()
|
|
98
|
-
if key in EMBED_QUERY_PARAMS_KEYS:
|
|
89
|
+
if key.lower() in EMBED_QUERY_PARAMS_KEYS:
|
|
99
90
|
raise KeyError(missing_key_error_message(key))
|
|
100
91
|
try:
|
|
101
92
|
del self._query_params[key]
|
|
@@ -116,17 +107,17 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
116
107
|
if hasattr(other, "keys") and hasattr(other, "__getitem__"):
|
|
117
108
|
other = cast("SupportsKeysAndGetItem[str, str | Iterable[str]]", other)
|
|
118
109
|
for key in other.keys(): # noqa: SIM118
|
|
119
|
-
self.
|
|
110
|
+
self._set_item_internal(key, other[key])
|
|
120
111
|
else:
|
|
121
112
|
for key, value in other:
|
|
122
|
-
self.
|
|
113
|
+
self._set_item_internal(key, value)
|
|
123
114
|
for key, value in kwds.items():
|
|
124
|
-
self.
|
|
115
|
+
self._set_item_internal(key, value)
|
|
125
116
|
self._send_query_param_msg()
|
|
126
117
|
|
|
127
118
|
def get_all(self, key: str) -> list[str]:
|
|
128
119
|
self._ensure_single_query_api_used()
|
|
129
|
-
if key not in self._query_params or key in EMBED_QUERY_PARAMS_KEYS:
|
|
120
|
+
if key not in self._query_params or key.lower() in EMBED_QUERY_PARAMS_KEYS:
|
|
130
121
|
return []
|
|
131
122
|
value = self._query_params[key]
|
|
132
123
|
return value if isinstance(value, list) else [value]
|
|
@@ -134,7 +125,11 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
134
125
|
def __len__(self) -> int:
|
|
135
126
|
self._ensure_single_query_api_used()
|
|
136
127
|
return len(
|
|
137
|
-
{
|
|
128
|
+
{
|
|
129
|
+
key
|
|
130
|
+
for key in self._query_params
|
|
131
|
+
if key.lower() not in EMBED_QUERY_PARAMS_KEYS
|
|
132
|
+
}
|
|
138
133
|
)
|
|
139
134
|
|
|
140
135
|
def __str__(self) -> str:
|
|
@@ -165,7 +160,7 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
165
160
|
return {
|
|
166
161
|
key: self[key]
|
|
167
162
|
for key in self._query_params
|
|
168
|
-
if key not in EMBED_QUERY_PARAMS_KEYS
|
|
163
|
+
if key.lower() not in EMBED_QUERY_PARAMS_KEYS
|
|
169
164
|
}
|
|
170
165
|
|
|
171
166
|
def from_dict(
|
|
@@ -190,7 +185,7 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
190
185
|
self._query_params = {
|
|
191
186
|
key: value
|
|
192
187
|
for key, value in self._query_params.items()
|
|
193
|
-
if key in EMBED_QUERY_PARAMS_KEYS and preserve_embed
|
|
188
|
+
if key.lower() in EMBED_QUERY_PARAMS_KEYS and preserve_embed
|
|
194
189
|
}
|
|
195
190
|
|
|
196
191
|
def _ensure_single_query_api_used(self) -> None:
|
|
@@ -202,3 +197,59 @@ class QueryParams(MutableMapping[str, str]):
|
|
|
202
197
|
|
|
203
198
|
def missing_key_error_message(key: str) -> str:
|
|
204
199
|
return f'st.query_params has no key "{key}".'
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
def _set_item_in_dict(
|
|
203
|
+
target_dict: dict[str, list[str] | str], key: str, value: str | Iterable[str]
|
|
204
|
+
) -> None:
|
|
205
|
+
"""Set an item in a dictionary."""
|
|
206
|
+
if isinstance(value, dict):
|
|
207
|
+
raise StreamlitQueryParamDictValueError(key)
|
|
208
|
+
|
|
209
|
+
if key.lower() in EMBED_QUERY_PARAMS_KEYS:
|
|
210
|
+
raise StreamlitAPIException(
|
|
211
|
+
"Query param embed and embed_options (case-insensitive) cannot be set programmatically."
|
|
212
|
+
)
|
|
213
|
+
# Type checking users should handle the string serialization themselves
|
|
214
|
+
# We will accept any type for the list and serialize to str just in case
|
|
215
|
+
if isinstance(value, Iterable) and not isinstance(value, str):
|
|
216
|
+
target_dict[key] = [str(item) for item in value]
|
|
217
|
+
else:
|
|
218
|
+
target_dict[key] = str(value)
|
|
219
|
+
|
|
220
|
+
|
|
221
|
+
def process_query_params(
|
|
222
|
+
query_params: Iterable[tuple[str, str | Iterable[str]]]
|
|
223
|
+
| SupportsKeysAndGetItem[str, str | Iterable[str]],
|
|
224
|
+
) -> str:
|
|
225
|
+
"""Convert query params into a URL-encoded query string."""
|
|
226
|
+
processed_params: dict[str, list[str] | str] = {}
|
|
227
|
+
|
|
228
|
+
if hasattr(query_params, "keys") and hasattr(query_params, "__getitem__"):
|
|
229
|
+
query_params = cast(
|
|
230
|
+
"SupportsKeysAndGetItem[str, str | Iterable[str]]", query_params
|
|
231
|
+
)
|
|
232
|
+
for key in query_params.keys(): # noqa: SIM118
|
|
233
|
+
value = query_params[key]
|
|
234
|
+
_set_item_in_dict(processed_params, key, value)
|
|
235
|
+
else:
|
|
236
|
+
for key, value in query_params:
|
|
237
|
+
if key in processed_params:
|
|
238
|
+
# If the key already exists, we need to accumulate the values.
|
|
239
|
+
if isinstance(value, dict):
|
|
240
|
+
raise StreamlitQueryParamDictValueError(key)
|
|
241
|
+
|
|
242
|
+
current_val = processed_params[key]
|
|
243
|
+
if not isinstance(current_val, list):
|
|
244
|
+
current_val = [current_val]
|
|
245
|
+
|
|
246
|
+
if isinstance(value, Iterable) and not isinstance(value, str):
|
|
247
|
+
current_val.extend([str(item) for item in value])
|
|
248
|
+
else:
|
|
249
|
+
current_val.append(str(value))
|
|
250
|
+
|
|
251
|
+
processed_params[key] = current_val
|
|
252
|
+
else:
|
|
253
|
+
_set_item_in_dict(processed_params, key, value)
|
|
254
|
+
|
|
255
|
+
return parse.urlencode(processed_params, doseq=True)
|
|
@@ -16,10 +16,10 @@ from __future__ import annotations
|
|
|
16
16
|
|
|
17
17
|
import threading
|
|
18
18
|
from contextlib import contextmanager
|
|
19
|
-
from typing import TYPE_CHECKING, Any
|
|
19
|
+
from typing import TYPE_CHECKING, Any
|
|
20
20
|
|
|
21
21
|
if TYPE_CHECKING:
|
|
22
|
-
from collections.abc import Iterator
|
|
22
|
+
from collections.abc import Callable, Iterator
|
|
23
23
|
|
|
24
24
|
from streamlit.proto.WidgetStates_pb2 import WidgetState as WidgetStateProto
|
|
25
25
|
from streamlit.proto.WidgetStates_pb2 import WidgetStates as WidgetStatesProto
|