streamlit-nightly 1.43.2.dev20250307__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 +306 -0
- streamlit/__main__.py +20 -0
- streamlit/auth_util.py +218 -0
- streamlit/cli_util.py +105 -0
- streamlit/column_config.py +56 -0
- streamlit/commands/__init__.py +13 -0
- streamlit/commands/echo.py +126 -0
- streamlit/commands/execution_control.py +238 -0
- streamlit/commands/experimental_query_params.py +169 -0
- streamlit/commands/logo.py +189 -0
- streamlit/commands/navigation.py +385 -0
- streamlit/commands/page_config.py +311 -0
- streamlit/components/__init__.py +13 -0
- streamlit/components/lib/__init__.py +13 -0
- streamlit/components/lib/local_component_registry.py +84 -0
- streamlit/components/types/__init__.py +13 -0
- streamlit/components/types/base_component_registry.py +99 -0
- streamlit/components/types/base_custom_component.py +150 -0
- streamlit/components/v1/__init__.py +31 -0
- streamlit/components/v1/component_arrow.py +141 -0
- streamlit/components/v1/component_registry.py +130 -0
- streamlit/components/v1/components.py +38 -0
- streamlit/components/v1/custom_component.py +243 -0
- streamlit/config.py +1513 -0
- streamlit/config_option.py +311 -0
- streamlit/config_util.py +177 -0
- streamlit/connections/__init__.py +28 -0
- streamlit/connections/base_connection.py +174 -0
- streamlit/connections/snowflake_connection.py +562 -0
- streamlit/connections/snowpark_connection.py +213 -0
- streamlit/connections/sql_connection.py +425 -0
- streamlit/connections/util.py +97 -0
- streamlit/cursor.py +210 -0
- streamlit/dataframe_util.py +1416 -0
- streamlit/delta_generator.py +602 -0
- streamlit/delta_generator_singletons.py +204 -0
- streamlit/deprecation_util.py +209 -0
- streamlit/development.py +21 -0
- streamlit/elements/__init__.py +13 -0
- streamlit/elements/alert.py +234 -0
- streamlit/elements/arrow.py +962 -0
- streamlit/elements/balloons.py +47 -0
- streamlit/elements/bokeh_chart.py +133 -0
- streamlit/elements/code.py +114 -0
- streamlit/elements/deck_gl_json_chart.py +546 -0
- streamlit/elements/dialog_decorator.py +267 -0
- streamlit/elements/doc_string.py +558 -0
- streamlit/elements/empty.py +130 -0
- streamlit/elements/exception.py +331 -0
- streamlit/elements/form.py +354 -0
- streamlit/elements/graphviz_chart.py +150 -0
- streamlit/elements/heading.py +302 -0
- streamlit/elements/html.py +105 -0
- streamlit/elements/iframe.py +191 -0
- streamlit/elements/image.py +196 -0
- streamlit/elements/json.py +139 -0
- streamlit/elements/layouts.py +879 -0
- streamlit/elements/lib/__init__.py +13 -0
- streamlit/elements/lib/built_in_chart_utils.py +1157 -0
- streamlit/elements/lib/color_util.py +263 -0
- streamlit/elements/lib/column_config_utils.py +542 -0
- streamlit/elements/lib/column_types.py +2188 -0
- streamlit/elements/lib/dialog.py +147 -0
- streamlit/elements/lib/dicttools.py +154 -0
- streamlit/elements/lib/event_utils.py +37 -0
- streamlit/elements/lib/file_uploader_utils.py +66 -0
- streamlit/elements/lib/form_utils.py +77 -0
- streamlit/elements/lib/image_utils.py +441 -0
- streamlit/elements/lib/js_number.py +105 -0
- streamlit/elements/lib/mutable_status_container.py +183 -0
- streamlit/elements/lib/options_selector_utils.py +250 -0
- streamlit/elements/lib/pandas_styler_utils.py +274 -0
- streamlit/elements/lib/policies.py +194 -0
- streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
- streamlit/elements/lib/subtitle_utils.py +176 -0
- streamlit/elements/lib/utils.py +250 -0
- streamlit/elements/map.py +508 -0
- streamlit/elements/markdown.py +277 -0
- streamlit/elements/media.py +793 -0
- streamlit/elements/metric.py +301 -0
- streamlit/elements/plotly_chart.py +546 -0
- streamlit/elements/progress.py +156 -0
- streamlit/elements/pyplot.py +194 -0
- streamlit/elements/snow.py +47 -0
- streamlit/elements/spinner.py +113 -0
- streamlit/elements/text.py +76 -0
- streamlit/elements/toast.py +98 -0
- streamlit/elements/vega_charts.py +1984 -0
- streamlit/elements/widgets/__init__.py +13 -0
- streamlit/elements/widgets/audio_input.py +310 -0
- streamlit/elements/widgets/button.py +1123 -0
- streamlit/elements/widgets/button_group.py +1008 -0
- streamlit/elements/widgets/camera_input.py +263 -0
- streamlit/elements/widgets/chat.py +647 -0
- streamlit/elements/widgets/checkbox.py +352 -0
- streamlit/elements/widgets/color_picker.py +265 -0
- streamlit/elements/widgets/data_editor.py +983 -0
- streamlit/elements/widgets/file_uploader.py +486 -0
- streamlit/elements/widgets/multiselect.py +338 -0
- streamlit/elements/widgets/number_input.py +545 -0
- streamlit/elements/widgets/radio.py +407 -0
- streamlit/elements/widgets/select_slider.py +437 -0
- streamlit/elements/widgets/selectbox.py +366 -0
- streamlit/elements/widgets/slider.py +880 -0
- streamlit/elements/widgets/text_widgets.py +628 -0
- streamlit/elements/widgets/time_widgets.py +970 -0
- streamlit/elements/write.py +574 -0
- streamlit/emojis.py +34 -0
- streamlit/env_util.py +61 -0
- streamlit/error_util.py +105 -0
- streamlit/errors.py +452 -0
- streamlit/external/__init__.py +13 -0
- streamlit/external/langchain/__init__.py +23 -0
- streamlit/external/langchain/streamlit_callback_handler.py +406 -0
- streamlit/file_util.py +247 -0
- streamlit/git_util.py +173 -0
- streamlit/hello/__init__.py +13 -0
- streamlit/hello/animation_demo.py +82 -0
- streamlit/hello/dataframe_demo.py +71 -0
- streamlit/hello/hello.py +37 -0
- streamlit/hello/mapping_demo.py +114 -0
- streamlit/hello/plotting_demo.py +55 -0
- streamlit/hello/streamlit_app.py +55 -0
- streamlit/hello/utils.py +28 -0
- streamlit/logger.py +130 -0
- streamlit/material_icon_names.py +25 -0
- streamlit/navigation/__init__.py +13 -0
- streamlit/navigation/page.py +302 -0
- streamlit/net_util.py +125 -0
- streamlit/platform.py +33 -0
- streamlit/proto/Alert_pb2.py +29 -0
- streamlit/proto/Alert_pb2.pyi +90 -0
- streamlit/proto/AppPage_pb2.py +27 -0
- streamlit/proto/AppPage_pb2.pyi +64 -0
- streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
- streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
- streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
- streamlit/proto/Arrow_pb2.py +33 -0
- streamlit/proto/Arrow_pb2.pyi +188 -0
- streamlit/proto/AudioInput_pb2.py +28 -0
- streamlit/proto/AudioInput_pb2.pyi +58 -0
- streamlit/proto/Audio_pb2.py +27 -0
- streamlit/proto/Audio_pb2.pyi +58 -0
- streamlit/proto/AuthRedirect_pb2.py +27 -0
- streamlit/proto/AuthRedirect_pb2.pyi +41 -0
- streamlit/proto/AutoRerun_pb2.py +27 -0
- streamlit/proto/AutoRerun_pb2.pyi +45 -0
- streamlit/proto/BackMsg_pb2.py +29 -0
- streamlit/proto/BackMsg_pb2.pyi +105 -0
- streamlit/proto/Balloons_pb2.py +27 -0
- streamlit/proto/Balloons_pb2.pyi +43 -0
- streamlit/proto/Block_pb2.py +53 -0
- streamlit/proto/Block_pb2.pyi +322 -0
- streamlit/proto/BokehChart_pb2.py +27 -0
- streamlit/proto/BokehChart_pb2.pyi +49 -0
- streamlit/proto/ButtonGroup_pb2.py +36 -0
- streamlit/proto/ButtonGroup_pb2.pyi +169 -0
- streamlit/proto/Button_pb2.py +27 -0
- streamlit/proto/Button_pb2.pyi +71 -0
- streamlit/proto/CameraInput_pb2.py +28 -0
- streamlit/proto/CameraInput_pb2.pyi +58 -0
- streamlit/proto/ChatInput_pb2.py +31 -0
- streamlit/proto/ChatInput_pb2.pyi +111 -0
- streamlit/proto/Checkbox_pb2.py +30 -0
- streamlit/proto/Checkbox_pb2.pyi +90 -0
- streamlit/proto/ClientState_pb2.py +30 -0
- streamlit/proto/ClientState_pb2.pyi +90 -0
- streamlit/proto/Code_pb2.py +27 -0
- streamlit/proto/Code_pb2.pyi +55 -0
- streamlit/proto/ColorPicker_pb2.py +28 -0
- streamlit/proto/ColorPicker_pb2.pyi +67 -0
- streamlit/proto/Common_pb2.py +51 -0
- streamlit/proto/Common_pb2.pyi +293 -0
- streamlit/proto/Components_pb2.py +35 -0
- streamlit/proto/Components_pb2.pyi +172 -0
- streamlit/proto/DataFrame_pb2.py +56 -0
- streamlit/proto/DataFrame_pb2.pyi +397 -0
- streamlit/proto/DateInput_pb2.py +28 -0
- streamlit/proto/DateInput_pb2.pyi +83 -0
- streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
- streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
- streamlit/proto/Delta_pb2.py +31 -0
- streamlit/proto/Delta_pb2.pyi +74 -0
- streamlit/proto/DocString_pb2.py +29 -0
- streamlit/proto/DocString_pb2.pyi +93 -0
- streamlit/proto/DownloadButton_pb2.py +27 -0
- streamlit/proto/DownloadButton_pb2.pyi +70 -0
- streamlit/proto/Element_pb2.py +78 -0
- streamlit/proto/Element_pb2.pyi +312 -0
- streamlit/proto/Empty_pb2.py +27 -0
- streamlit/proto/Empty_pb2.pyi +36 -0
- streamlit/proto/Exception_pb2.py +27 -0
- streamlit/proto/Exception_pb2.pyi +72 -0
- streamlit/proto/Favicon_pb2.py +27 -0
- streamlit/proto/Favicon_pb2.pyi +40 -0
- streamlit/proto/FileUploader_pb2.py +28 -0
- streamlit/proto/FileUploader_pb2.pyi +78 -0
- streamlit/proto/ForwardMsg_pb2.py +53 -0
- streamlit/proto/ForwardMsg_pb2.pyi +293 -0
- streamlit/proto/GitInfo_pb2.py +29 -0
- streamlit/proto/GitInfo_pb2.pyi +83 -0
- streamlit/proto/GraphVizChart_pb2.py +27 -0
- streamlit/proto/GraphVizChart_pb2.pyi +53 -0
- streamlit/proto/Heading_pb2.py +27 -0
- streamlit/proto/Heading_pb2.pyi +56 -0
- streamlit/proto/Html_pb2.py +27 -0
- streamlit/proto/Html_pb2.pyi +42 -0
- streamlit/proto/IFrame_pb2.py +27 -0
- streamlit/proto/IFrame_pb2.pyi +59 -0
- streamlit/proto/Image_pb2.py +29 -0
- streamlit/proto/Image_pb2.pyi +84 -0
- streamlit/proto/Json_pb2.py +27 -0
- streamlit/proto/Json_pb2.pyi +53 -0
- streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
- streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
- streamlit/proto/LinkButton_pb2.py +27 -0
- streamlit/proto/LinkButton_pb2.pyi +58 -0
- streamlit/proto/Logo_pb2.py +27 -0
- streamlit/proto/Logo_pb2.pyi +51 -0
- streamlit/proto/Markdown_pb2.py +29 -0
- streamlit/proto/Markdown_pb2.pyi +86 -0
- streamlit/proto/Metric_pb2.py +32 -0
- streamlit/proto/Metric_pb2.pyi +101 -0
- streamlit/proto/MetricsEvent_pb2.py +30 -0
- streamlit/proto/MetricsEvent_pb2.pyi +200 -0
- streamlit/proto/MultiSelect_pb2.py +28 -0
- streamlit/proto/MultiSelect_pb2.pyi +81 -0
- streamlit/proto/NamedDataSet_pb2.py +28 -0
- streamlit/proto/NamedDataSet_pb2.pyi +59 -0
- streamlit/proto/Navigation_pb2.py +30 -0
- streamlit/proto/Navigation_pb2.pyi +84 -0
- streamlit/proto/NewSession_pb2.py +51 -0
- streamlit/proto/NewSession_pb2.pyi +481 -0
- streamlit/proto/NumberInput_pb2.py +30 -0
- streamlit/proto/NumberInput_pb2.pyi +121 -0
- streamlit/proto/PageConfig_pb2.py +33 -0
- streamlit/proto/PageConfig_pb2.pyi +126 -0
- streamlit/proto/PageInfo_pb2.py +27 -0
- streamlit/proto/PageInfo_pb2.pyi +43 -0
- streamlit/proto/PageLink_pb2.py +27 -0
- streamlit/proto/PageLink_pb2.pyi +63 -0
- streamlit/proto/PageNotFound_pb2.py +27 -0
- streamlit/proto/PageNotFound_pb2.pyi +42 -0
- streamlit/proto/PageProfile_pb2.py +31 -0
- streamlit/proto/PageProfile_pb2.pyi +127 -0
- streamlit/proto/PagesChanged_pb2.py +28 -0
- streamlit/proto/PagesChanged_pb2.pyi +48 -0
- streamlit/proto/ParentMessage_pb2.py +27 -0
- streamlit/proto/ParentMessage_pb2.pyi +46 -0
- streamlit/proto/PlotlyChart_pb2.py +31 -0
- streamlit/proto/PlotlyChart_pb2.pyi +131 -0
- streamlit/proto/Progress_pb2.py +27 -0
- streamlit/proto/Progress_pb2.pyi +43 -0
- streamlit/proto/Radio_pb2.py +28 -0
- streamlit/proto/Radio_pb2.pyi +84 -0
- streamlit/proto/RootContainer_pb2.py +27 -0
- streamlit/proto/RootContainer_pb2.pyi +56 -0
- streamlit/proto/Selectbox_pb2.py +28 -0
- streamlit/proto/Selectbox_pb2.pyi +80 -0
- streamlit/proto/SessionEvent_pb2.py +28 -0
- streamlit/proto/SessionEvent_pb2.pyi +62 -0
- streamlit/proto/SessionStatus_pb2.py +27 -0
- streamlit/proto/SessionStatus_pb2.pyi +57 -0
- streamlit/proto/Skeleton_pb2.py +29 -0
- streamlit/proto/Skeleton_pb2.pyi +71 -0
- streamlit/proto/Slider_pb2.py +32 -0
- streamlit/proto/Slider_pb2.pyi +142 -0
- streamlit/proto/Snow_pb2.py +27 -0
- streamlit/proto/Snow_pb2.pyi +43 -0
- streamlit/proto/Spinner_pb2.py +27 -0
- streamlit/proto/Spinner_pb2.pyi +49 -0
- streamlit/proto/TextArea_pb2.py +28 -0
- streamlit/proto/TextArea_pb2.pyi +80 -0
- streamlit/proto/TextInput_pb2.py +30 -0
- streamlit/proto/TextInput_pb2.pyi +107 -0
- streamlit/proto/Text_pb2.py +27 -0
- streamlit/proto/Text_pb2.pyi +46 -0
- streamlit/proto/TimeInput_pb2.py +28 -0
- streamlit/proto/TimeInput_pb2.pyi +74 -0
- streamlit/proto/Toast_pb2.py +27 -0
- streamlit/proto/Toast_pb2.pyi +45 -0
- streamlit/proto/VegaLiteChart_pb2.py +29 -0
- streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
- streamlit/proto/Video_pb2.py +31 -0
- streamlit/proto/Video_pb2.pyi +117 -0
- streamlit/proto/WidgetStates_pb2.py +31 -0
- streamlit/proto/WidgetStates_pb2.pyi +126 -0
- streamlit/proto/__init__.py +15 -0
- streamlit/proto/openmetrics_data_model_pb2.py +60 -0
- streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
- streamlit/py.typed +0 -0
- streamlit/runtime/__init__.py +50 -0
- streamlit/runtime/app_session.py +982 -0
- streamlit/runtime/caching/__init__.py +98 -0
- streamlit/runtime/caching/cache_data_api.py +665 -0
- streamlit/runtime/caching/cache_errors.py +142 -0
- streamlit/runtime/caching/cache_resource_api.py +527 -0
- streamlit/runtime/caching/cache_type.py +33 -0
- streamlit/runtime/caching/cache_utils.py +523 -0
- streamlit/runtime/caching/cached_message_replay.py +290 -0
- streamlit/runtime/caching/hashing.py +637 -0
- streamlit/runtime/caching/legacy_cache_api.py +169 -0
- streamlit/runtime/caching/storage/__init__.py +29 -0
- streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
- streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
- streamlit/runtime/connection_factory.py +436 -0
- streamlit/runtime/context.py +280 -0
- streamlit/runtime/credentials.py +364 -0
- streamlit/runtime/forward_msg_cache.py +296 -0
- streamlit/runtime/forward_msg_queue.py +240 -0
- streamlit/runtime/fragment.py +477 -0
- streamlit/runtime/media_file_manager.py +234 -0
- streamlit/runtime/media_file_storage.py +143 -0
- streamlit/runtime/memory_media_file_storage.py +181 -0
- streamlit/runtime/memory_session_storage.py +77 -0
- streamlit/runtime/memory_uploaded_file_manager.py +138 -0
- streamlit/runtime/metrics_util.py +486 -0
- streamlit/runtime/pages_manager.py +165 -0
- streamlit/runtime/runtime.py +792 -0
- streamlit/runtime/runtime_util.py +106 -0
- streamlit/runtime/script_data.py +46 -0
- streamlit/runtime/scriptrunner/__init__.py +38 -0
- streamlit/runtime/scriptrunner/exec_code.py +159 -0
- streamlit/runtime/scriptrunner/magic.py +273 -0
- streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
- streamlit/runtime/scriptrunner/script_cache.py +89 -0
- streamlit/runtime/scriptrunner/script_runner.py +756 -0
- streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
- streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
- streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
- streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
- streamlit/runtime/secrets.py +534 -0
- streamlit/runtime/session_manager.py +394 -0
- streamlit/runtime/state/__init__.py +41 -0
- streamlit/runtime/state/common.py +191 -0
- streamlit/runtime/state/query_params.py +205 -0
- streamlit/runtime/state/query_params_proxy.py +218 -0
- streamlit/runtime/state/safe_session_state.py +138 -0
- streamlit/runtime/state/session_state.py +772 -0
- streamlit/runtime/state/session_state_proxy.py +153 -0
- streamlit/runtime/state/widgets.py +135 -0
- streamlit/runtime/stats.py +109 -0
- streamlit/runtime/uploaded_file_manager.py +148 -0
- streamlit/runtime/websocket_session_manager.py +167 -0
- streamlit/source_util.py +98 -0
- streamlit/static/favicon.png +0 -0
- streamlit/static/index.html +61 -0
- streamlit/static/static/css/index.Bmkmz40k.css +1 -0
- streamlit/static/static/css/index.DpJG_94W.css +1 -0
- streamlit/static/static/css/index.DzuxGC_t.css +1 -0
- streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
- streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
- streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
- streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
- streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
- streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
- streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
- streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
- streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
- streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
- streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
- streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
- streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
- streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
- streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
- streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
- streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
- streamlit/static/static/js/index.08vcOOvb.js +1 -0
- streamlit/static/static/js/index.0uqKfJUS.js +1 -0
- streamlit/static/static/js/index.B02M5u69.js +203 -0
- streamlit/static/static/js/index.B7mcZKMx.js +1 -0
- streamlit/static/static/js/index.BAQDHFA_.js +1 -0
- streamlit/static/static/js/index.BI60cMVr.js +2 -0
- streamlit/static/static/js/index.BLug2inK.js +1 -0
- streamlit/static/static/js/index.BM6TMY8g.js +2 -0
- streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
- streamlit/static/static/js/index.BZqa87a1.js +2 -0
- streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
- streamlit/static/static/js/index.BgVMiY_P.js +197 -0
- streamlit/static/static/js/index.BtuGy7By.js +6 -0
- streamlit/static/static/js/index.BuDuBmrs.js +1 -0
- streamlit/static/static/js/index.BvXU2oKV.js +1 -0
- streamlit/static/static/js/index.BxcwPacT.js +73 -0
- streamlit/static/static/js/index.CWX8KB81.js +1 -0
- streamlit/static/static/js/index.CXzZTo_q.js +1 -0
- streamlit/static/static/js/index.CcRWp_KL.js +1 -0
- streamlit/static/static/js/index.Cd-_xe55.js +3 -0
- streamlit/static/static/js/index.CdG2PXln.js +4537 -0
- streamlit/static/static/js/index.CjXvXmcP.js +1 -0
- streamlit/static/static/js/index.D1HZENZx.js +776 -0
- streamlit/static/static/js/index.D21Efo64.js +1617 -0
- streamlit/static/static/js/index.D9WgGVBx.js +7 -0
- streamlit/static/static/js/index.DEcsHtvb.js +12 -0
- streamlit/static/static/js/index.DFeMfr_K.js +1 -0
- streamlit/static/static/js/index.DHFBoItz.js +1 -0
- streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
- streamlit/static/static/js/index.DmuRkekN.js +3855 -0
- streamlit/static/static/js/index.Do6eY8sf.js +1 -0
- streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
- streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
- streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
- streamlit/static/static/js/index.H1U1IC_d.js +3 -0
- streamlit/static/static/js/index.g6p_4DPr.js +1 -0
- streamlit/static/static/js/index.g9x_GKss.js +1 -0
- streamlit/static/static/js/index.zo9jm08y.js +1 -0
- streamlit/static/static/js/input.DnaFglHq.js +2 -0
- streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
- streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
- streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
- streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
- streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
- streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
- streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
- streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
- streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
- streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
- streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
- streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
- streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
- streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
- streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
- streamlit/static/static/js/value.CgPGBV_l.js +1 -0
- streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
- streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
- streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
- streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
- streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
- streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
- streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
- streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
- streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
- streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
- streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
- streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
- streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
- streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
- streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
- streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
- streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
- streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
- streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
- streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
- streamlit/string_util.py +203 -0
- streamlit/temporary_directory.py +56 -0
- streamlit/testing/__init__.py +13 -0
- streamlit/testing/v1/__init__.py +17 -0
- streamlit/testing/v1/app_test.py +1050 -0
- streamlit/testing/v1/element_tree.py +2083 -0
- streamlit/testing/v1/local_script_runner.py +180 -0
- streamlit/testing/v1/util.py +53 -0
- streamlit/time_util.py +75 -0
- streamlit/type_util.py +460 -0
- streamlit/url_util.py +122 -0
- streamlit/user_info.py +519 -0
- streamlit/util.py +72 -0
- streamlit/vendor/__init__.py +0 -0
- streamlit/vendor/pympler/__init__.py +0 -0
- streamlit/vendor/pympler/asizeof.py +2869 -0
- streamlit/version.py +18 -0
- streamlit/watcher/__init__.py +28 -0
- streamlit/watcher/event_based_path_watcher.py +406 -0
- streamlit/watcher/folder_black_list.py +82 -0
- streamlit/watcher/local_sources_watcher.py +233 -0
- streamlit/watcher/path_watcher.py +185 -0
- streamlit/watcher/polling_path_watcher.py +124 -0
- streamlit/watcher/util.py +207 -0
- streamlit/web/__init__.py +13 -0
- streamlit/web/bootstrap.py +353 -0
- streamlit/web/cache_storage_manager_config.py +38 -0
- streamlit/web/cli.py +369 -0
- streamlit/web/server/__init__.py +26 -0
- streamlit/web/server/app_static_file_handler.py +93 -0
- streamlit/web/server/authlib_tornado_integration.py +60 -0
- streamlit/web/server/browser_websocket_handler.py +246 -0
- streamlit/web/server/component_request_handler.py +116 -0
- streamlit/web/server/media_file_handler.py +141 -0
- streamlit/web/server/oauth_authlib_routes.py +176 -0
- streamlit/web/server/oidc_mixin.py +108 -0
- streamlit/web/server/routes.py +295 -0
- streamlit/web/server/server.py +479 -0
- streamlit/web/server/server_util.py +161 -0
- streamlit/web/server/stats_request_handler.py +95 -0
- streamlit/web/server/upload_file_request_handler.py +137 -0
- streamlit/web/server/websocket_headers.py +56 -0
- streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
- streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,546 @@
|
|
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
|
+
"""Streamlit support for Plotly charts."""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
import json
|
20
|
+
from dataclasses import dataclass
|
21
|
+
from typing import (
|
22
|
+
TYPE_CHECKING,
|
23
|
+
Any,
|
24
|
+
Final,
|
25
|
+
Literal,
|
26
|
+
TypedDict,
|
27
|
+
Union,
|
28
|
+
cast,
|
29
|
+
overload,
|
30
|
+
)
|
31
|
+
|
32
|
+
from typing_extensions import TypeAlias
|
33
|
+
|
34
|
+
from streamlit import type_util
|
35
|
+
from streamlit.deprecation_util import show_deprecation_warning
|
36
|
+
from streamlit.elements.lib.event_utils import AttributeDictionary
|
37
|
+
from streamlit.elements.lib.form_utils import current_form_id
|
38
|
+
from streamlit.elements.lib.policies import check_widget_policies
|
39
|
+
from streamlit.elements.lib.streamlit_plotly_theme import (
|
40
|
+
configure_streamlit_plotly_theme,
|
41
|
+
)
|
42
|
+
from streamlit.elements.lib.utils import Key, compute_and_register_element_id, to_key
|
43
|
+
from streamlit.errors import StreamlitAPIException
|
44
|
+
from streamlit.proto.PlotlyChart_pb2 import PlotlyChart as PlotlyChartProto
|
45
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
46
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
47
|
+
from streamlit.runtime.state import WidgetCallback, register_widget
|
48
|
+
|
49
|
+
if TYPE_CHECKING:
|
50
|
+
from collections.abc import Iterable
|
51
|
+
|
52
|
+
import matplotlib
|
53
|
+
import plotly.graph_objs as go
|
54
|
+
from plotly.basedatatypes import BaseFigure
|
55
|
+
|
56
|
+
from streamlit.delta_generator import DeltaGenerator
|
57
|
+
|
58
|
+
# We need to configure the Plotly theme before any Plotly figures are created:
|
59
|
+
configure_streamlit_plotly_theme()
|
60
|
+
|
61
|
+
_AtomicFigureOrData: TypeAlias = Union[
|
62
|
+
"go.Figure",
|
63
|
+
"go.Data",
|
64
|
+
]
|
65
|
+
FigureOrData: TypeAlias = Union[
|
66
|
+
_AtomicFigureOrData,
|
67
|
+
list[_AtomicFigureOrData],
|
68
|
+
# It is kind of hard to figure out exactly what kind of dict is supported
|
69
|
+
# here, as plotly hasn't embraced typing yet. This version is chosen to
|
70
|
+
# align with the docstring.
|
71
|
+
dict[str, _AtomicFigureOrData],
|
72
|
+
"BaseFigure",
|
73
|
+
"matplotlib.figure.Figure",
|
74
|
+
]
|
75
|
+
|
76
|
+
SelectionMode: TypeAlias = Literal["lasso", "points", "box"]
|
77
|
+
_SELECTION_MODES: Final[set[SelectionMode]] = {"lasso", "points", "box"}
|
78
|
+
|
79
|
+
|
80
|
+
class PlotlySelectionState(TypedDict, total=False):
|
81
|
+
"""
|
82
|
+
The schema for the Plotly chart selection state.
|
83
|
+
|
84
|
+
The selection state is stored in a dictionary-like object that supports both
|
85
|
+
key and attribute notation. Selection states cannot be programmatically
|
86
|
+
changed or set through Session State.
|
87
|
+
|
88
|
+
Attributes
|
89
|
+
----------
|
90
|
+
points : list[dict[str, Any]]
|
91
|
+
The selected data points in the chart, including the data points
|
92
|
+
selected by the box and lasso mode. The data includes the values
|
93
|
+
associated to each point and a point index used to populate
|
94
|
+
``point_indices``. If additional information has been assigned to your
|
95
|
+
points, such as size or legend group, this is also included.
|
96
|
+
|
97
|
+
point_indices : list[int]
|
98
|
+
The numerical indices of all selected data points in the chart. The
|
99
|
+
details of each identified point are included in ``points``.
|
100
|
+
|
101
|
+
box : list[dict[str, Any]]
|
102
|
+
The metadata related to the box selection. This includes the
|
103
|
+
coordinates of the selected area.
|
104
|
+
|
105
|
+
lasso : list[dict[str, Any]]
|
106
|
+
The metadata related to the lasso selection. This includes the
|
107
|
+
coordinates of the selected area.
|
108
|
+
|
109
|
+
Example
|
110
|
+
-------
|
111
|
+
When working with more complicated graphs, the ``points`` attribute
|
112
|
+
displays additional information. Try selecting points in the following
|
113
|
+
example:
|
114
|
+
|
115
|
+
>>> import streamlit as st
|
116
|
+
>>> import plotly.express as px
|
117
|
+
>>>
|
118
|
+
>>> df = px.data.iris()
|
119
|
+
>>> fig = px.scatter(
|
120
|
+
... df,
|
121
|
+
... x="sepal_width",
|
122
|
+
... y="sepal_length",
|
123
|
+
... color="species",
|
124
|
+
... size="petal_length",
|
125
|
+
... hover_data=["petal_width"],
|
126
|
+
... )
|
127
|
+
>>>
|
128
|
+
>>> event = st.plotly_chart(fig, key="iris", on_select="rerun")
|
129
|
+
>>>
|
130
|
+
>>> event.selection
|
131
|
+
|
132
|
+
.. output::
|
133
|
+
https://doc-chart-events-plotly-selection-state.streamlit.app
|
134
|
+
height: 600px
|
135
|
+
|
136
|
+
This is an example of the selection state when selecting a single point:
|
137
|
+
|
138
|
+
>>> {
|
139
|
+
>>> "points": [
|
140
|
+
>>> {
|
141
|
+
>>> "curve_number": 2,
|
142
|
+
>>> "point_number": 9,
|
143
|
+
>>> "point_index": 9,
|
144
|
+
>>> "x": 3.6,
|
145
|
+
>>> "y": 7.2,
|
146
|
+
>>> "customdata": [
|
147
|
+
>>> 2.5
|
148
|
+
>>> ],
|
149
|
+
>>> "marker_size": 6.1,
|
150
|
+
>>> "legendgroup": "virginica"
|
151
|
+
>>> }
|
152
|
+
>>> ],
|
153
|
+
>>> "point_indices": [
|
154
|
+
>>> 9
|
155
|
+
>>> ],
|
156
|
+
>>> "box": [],
|
157
|
+
>>> "lasso": []
|
158
|
+
>>> }
|
159
|
+
|
160
|
+
"""
|
161
|
+
|
162
|
+
points: list[dict[str, Any]]
|
163
|
+
point_indices: list[int]
|
164
|
+
box: list[dict[str, Any]]
|
165
|
+
lasso: list[dict[str, Any]]
|
166
|
+
|
167
|
+
|
168
|
+
class PlotlyState(TypedDict, total=False):
|
169
|
+
"""
|
170
|
+
The schema for the Plotly chart event state.
|
171
|
+
|
172
|
+
The event state is stored in a dictionary-like object that supports both
|
173
|
+
key and attribute notation. Event states cannot be programmatically
|
174
|
+
changed or set through Session State.
|
175
|
+
|
176
|
+
Only selection events are supported at this time.
|
177
|
+
|
178
|
+
Attributes
|
179
|
+
----------
|
180
|
+
selection : dict
|
181
|
+
The state of the ``on_select`` event. This attribute returns a
|
182
|
+
dictionary-like object that supports both key and attribute notation.
|
183
|
+
The attributes are described by the ``PlotlySelectionState`` dictionary
|
184
|
+
schema.
|
185
|
+
|
186
|
+
Example
|
187
|
+
-------
|
188
|
+
Try selecting points by any of the three available methods (direct click,
|
189
|
+
box, or lasso). The current selection state is available through Session
|
190
|
+
State or as the output of the chart function.
|
191
|
+
|
192
|
+
>>> import streamlit as st
|
193
|
+
>>> import plotly.express as px
|
194
|
+
>>>
|
195
|
+
>>> df = px.data.iris() # iris is a pandas DataFrame
|
196
|
+
>>> fig = px.scatter(df, x="sepal_width", y="sepal_length")
|
197
|
+
>>>
|
198
|
+
>>> event = st.plotly_chart(fig, key="iris", on_select="rerun")
|
199
|
+
>>>
|
200
|
+
>>> event
|
201
|
+
|
202
|
+
.. output::
|
203
|
+
https://doc-chart-events-plotly-state.streamlit.app
|
204
|
+
height: 600px
|
205
|
+
|
206
|
+
"""
|
207
|
+
|
208
|
+
selection: PlotlySelectionState
|
209
|
+
|
210
|
+
|
211
|
+
@dataclass
|
212
|
+
class PlotlyChartSelectionSerde:
|
213
|
+
"""PlotlyChartSelectionSerde is used to serialize and deserialize the Plotly Chart
|
214
|
+
selection state.
|
215
|
+
"""
|
216
|
+
|
217
|
+
def deserialize(self, ui_value: str | None, widget_id: str = "") -> PlotlyState:
|
218
|
+
empty_selection_state: PlotlyState = {
|
219
|
+
"selection": {
|
220
|
+
"points": [],
|
221
|
+
"point_indices": [],
|
222
|
+
"box": [],
|
223
|
+
"lasso": [],
|
224
|
+
},
|
225
|
+
}
|
226
|
+
|
227
|
+
selection_state = (
|
228
|
+
empty_selection_state
|
229
|
+
if ui_value is None
|
230
|
+
else cast(PlotlyState, AttributeDictionary(json.loads(ui_value)))
|
231
|
+
)
|
232
|
+
|
233
|
+
if "selection" not in selection_state:
|
234
|
+
selection_state = empty_selection_state
|
235
|
+
|
236
|
+
return cast(PlotlyState, AttributeDictionary(selection_state))
|
237
|
+
|
238
|
+
def serialize(self, selection_state: PlotlyState) -> str:
|
239
|
+
return json.dumps(selection_state, default=str)
|
240
|
+
|
241
|
+
|
242
|
+
def parse_selection_mode(
|
243
|
+
selection_mode: SelectionMode | Iterable[SelectionMode],
|
244
|
+
) -> set[PlotlyChartProto.SelectionMode.ValueType]:
|
245
|
+
"""Parse and check the user provided selection modes."""
|
246
|
+
if isinstance(selection_mode, str):
|
247
|
+
# Only a single selection mode was passed
|
248
|
+
selection_mode_set = {selection_mode}
|
249
|
+
else:
|
250
|
+
# Multiple selection modes were passed
|
251
|
+
selection_mode_set = set(selection_mode)
|
252
|
+
|
253
|
+
if not selection_mode_set.issubset(_SELECTION_MODES):
|
254
|
+
raise StreamlitAPIException(
|
255
|
+
f"Invalid selection mode: {selection_mode}. "
|
256
|
+
f"Valid options are: {_SELECTION_MODES}"
|
257
|
+
)
|
258
|
+
|
259
|
+
parsed_selection_modes = []
|
260
|
+
for selection_mode in selection_mode_set:
|
261
|
+
if selection_mode == "points":
|
262
|
+
parsed_selection_modes.append(PlotlyChartProto.SelectionMode.POINTS)
|
263
|
+
elif selection_mode == "lasso":
|
264
|
+
parsed_selection_modes.append(PlotlyChartProto.SelectionMode.LASSO)
|
265
|
+
elif selection_mode == "box":
|
266
|
+
parsed_selection_modes.append(PlotlyChartProto.SelectionMode.BOX)
|
267
|
+
return set(parsed_selection_modes)
|
268
|
+
|
269
|
+
|
270
|
+
class PlotlyMixin:
|
271
|
+
@overload
|
272
|
+
def plotly_chart(
|
273
|
+
self,
|
274
|
+
figure_or_data: FigureOrData,
|
275
|
+
use_container_width: bool = True,
|
276
|
+
*,
|
277
|
+
theme: Literal["streamlit"] | None = "streamlit",
|
278
|
+
key: Key | None = None,
|
279
|
+
on_select: Literal["ignore"], # No default value here to make it work with mypy
|
280
|
+
selection_mode: SelectionMode | Iterable[SelectionMode] = (
|
281
|
+
"points",
|
282
|
+
"box",
|
283
|
+
"lasso",
|
284
|
+
),
|
285
|
+
**kwargs: Any,
|
286
|
+
) -> DeltaGenerator: ...
|
287
|
+
|
288
|
+
@overload
|
289
|
+
def plotly_chart(
|
290
|
+
self,
|
291
|
+
figure_or_data: FigureOrData,
|
292
|
+
use_container_width: bool = True,
|
293
|
+
*,
|
294
|
+
theme: Literal["streamlit"] | None = "streamlit",
|
295
|
+
key: Key | None = None,
|
296
|
+
on_select: Literal["rerun"] | WidgetCallback = "rerun",
|
297
|
+
selection_mode: SelectionMode | Iterable[SelectionMode] = (
|
298
|
+
"points",
|
299
|
+
"box",
|
300
|
+
"lasso",
|
301
|
+
),
|
302
|
+
**kwargs: Any,
|
303
|
+
) -> PlotlyState: ...
|
304
|
+
|
305
|
+
@gather_metrics("plotly_chart")
|
306
|
+
def plotly_chart(
|
307
|
+
self,
|
308
|
+
figure_or_data: FigureOrData,
|
309
|
+
use_container_width: bool = True,
|
310
|
+
*,
|
311
|
+
theme: Literal["streamlit"] | None = "streamlit",
|
312
|
+
key: Key | None = None,
|
313
|
+
on_select: Literal["rerun", "ignore"] | WidgetCallback = "ignore",
|
314
|
+
selection_mode: SelectionMode | Iterable[SelectionMode] = (
|
315
|
+
"points",
|
316
|
+
"box",
|
317
|
+
"lasso",
|
318
|
+
),
|
319
|
+
**kwargs: Any,
|
320
|
+
) -> DeltaGenerator | PlotlyState:
|
321
|
+
"""Display an interactive Plotly chart.
|
322
|
+
|
323
|
+
`Plotly <https://plot.ly/python>`_ is a charting library for Python.
|
324
|
+
The arguments to this function closely follow the ones for Plotly's
|
325
|
+
``plot()`` function.
|
326
|
+
|
327
|
+
To show Plotly charts in Streamlit, call ``st.plotly_chart`` wherever
|
328
|
+
you would call Plotly's ``py.plot`` or ``py.iplot``.
|
329
|
+
|
330
|
+
.. Important::
|
331
|
+
You must install ``plotly`` to use this command. Your app's
|
332
|
+
performance may be enhanced by installing ``orjson`` as well.
|
333
|
+
|
334
|
+
Parameters
|
335
|
+
----------
|
336
|
+
figure_or_data : plotly.graph_objs.Figure, plotly.graph_objs.Data,\
|
337
|
+
or dict/list of plotly.graph_objs.Figure/Data
|
338
|
+
|
339
|
+
The Plotly ``Figure`` or ``Data`` object to render. See
|
340
|
+
https://plot.ly/python/ for examples of graph descriptions.
|
341
|
+
|
342
|
+
use_container_width : bool
|
343
|
+
Whether to override the figure's native width with the width of
|
344
|
+
the parent container. If ``use_container_width`` is ``True`` (default),
|
345
|
+
Streamlit sets the width of the figure to match the width of the parent
|
346
|
+
container. If ``use_container_width`` is ``False``, Streamlit sets the
|
347
|
+
width of the chart to fit its contents according to the plotting library,
|
348
|
+
up to the width of the parent container.
|
349
|
+
|
350
|
+
theme : "streamlit" or None
|
351
|
+
The theme of the chart. If ``theme`` is ``"streamlit"`` (default),
|
352
|
+
Streamlit uses its own design default. If ``theme`` is ``None``,
|
353
|
+
Streamlit falls back to the default behavior of the library.
|
354
|
+
|
355
|
+
key : str
|
356
|
+
An optional string to use for giving this element a stable
|
357
|
+
identity. If ``key`` is ``None`` (default), this element's identity
|
358
|
+
will be determined based on the values of the other parameters.
|
359
|
+
|
360
|
+
Additionally, if selections are activated and ``key`` is provided,
|
361
|
+
Streamlit will register the key in Session State to store the
|
362
|
+
selection state. The selection state is read-only.
|
363
|
+
|
364
|
+
on_select : "ignore" or "rerun" or callable
|
365
|
+
How the figure should respond to user selection events. This
|
366
|
+
controls whether or not the figure behaves like an input widget.
|
367
|
+
``on_select`` can be one of the following:
|
368
|
+
|
369
|
+
- ``"ignore"`` (default): Streamlit will not react to any selection
|
370
|
+
events in the chart. The figure will not behave like an input
|
371
|
+
widget.
|
372
|
+
|
373
|
+
- ``"rerun"``: Streamlit will rerun the app when the user selects
|
374
|
+
data in the chart. In this case, ``st.plotly_chart`` will return
|
375
|
+
the selection data as a dictionary.
|
376
|
+
|
377
|
+
- A ``callable``: Streamlit will rerun the app and execute the
|
378
|
+
``callable`` as a callback function before the rest of the app.
|
379
|
+
In this case, ``st.plotly_chart`` will return the selection data
|
380
|
+
as a dictionary.
|
381
|
+
|
382
|
+
selection_mode : "points", "box", "lasso" or an Iterable of these
|
383
|
+
The selection mode of the chart. This can be one of the following:
|
384
|
+
|
385
|
+
- ``"points"``: The chart will allow selections based on individual
|
386
|
+
data points.
|
387
|
+
- ``"box"``: The chart will allow selections based on rectangular
|
388
|
+
areas.
|
389
|
+
- ``"lasso"``: The chart will allow selections based on freeform
|
390
|
+
areas.
|
391
|
+
- An ``Iterable`` of the above options: The chart will allow
|
392
|
+
selections based on the modes specified.
|
393
|
+
|
394
|
+
All selections modes are activated by default.
|
395
|
+
|
396
|
+
**kwargs
|
397
|
+
Any argument accepted by Plotly's ``plot()`` function.
|
398
|
+
|
399
|
+
Returns
|
400
|
+
-------
|
401
|
+
element or dict
|
402
|
+
If ``on_select`` is ``"ignore"`` (default), this command returns an
|
403
|
+
internal placeholder for the chart element. Otherwise, this command
|
404
|
+
returns a dictionary-like object that supports both key and
|
405
|
+
attribute notation. The attributes are described by the
|
406
|
+
``PlotlyState`` dictionary schema.
|
407
|
+
|
408
|
+
Example
|
409
|
+
-------
|
410
|
+
The example below comes straight from the examples at
|
411
|
+
https://plot.ly/python. Note that ``plotly.figure_factory`` requires
|
412
|
+
``scipy`` to run.
|
413
|
+
|
414
|
+
>>> import streamlit as st
|
415
|
+
>>> import numpy as np
|
416
|
+
>>> import plotly.figure_factory as ff
|
417
|
+
>>>
|
418
|
+
>>> # Add histogram data
|
419
|
+
>>> x1 = np.random.randn(200) - 2
|
420
|
+
>>> x2 = np.random.randn(200)
|
421
|
+
>>> x3 = np.random.randn(200) + 2
|
422
|
+
>>>
|
423
|
+
>>> # Group data together
|
424
|
+
>>> hist_data = [x1, x2, x3]
|
425
|
+
>>>
|
426
|
+
>>> group_labels = ['Group 1', 'Group 2', 'Group 3']
|
427
|
+
>>>
|
428
|
+
>>> # Create distplot with custom bin_size
|
429
|
+
>>> fig = ff.create_distplot(
|
430
|
+
... hist_data, group_labels, bin_size=[.1, .25, .5])
|
431
|
+
>>>
|
432
|
+
>>> # Plot!
|
433
|
+
>>> st.plotly_chart(fig)
|
434
|
+
|
435
|
+
.. output::
|
436
|
+
https://doc-plotly-chart.streamlit.app/
|
437
|
+
height: 550px
|
438
|
+
|
439
|
+
"""
|
440
|
+
import plotly.io
|
441
|
+
import plotly.tools
|
442
|
+
|
443
|
+
# NOTE: "figure_or_data" is the name used in Plotly's .plot() method
|
444
|
+
# for their main parameter. I don't like the name, but it's best to
|
445
|
+
# keep it in sync with what Plotly calls it.
|
446
|
+
|
447
|
+
if "sharing" in kwargs:
|
448
|
+
show_deprecation_warning(
|
449
|
+
"The `sharing` parameter has been deprecated and will be removed "
|
450
|
+
"in a future release. Plotly charts will always be rendered using "
|
451
|
+
"Streamlit's offline mode."
|
452
|
+
)
|
453
|
+
|
454
|
+
if theme not in ["streamlit", None]:
|
455
|
+
raise StreamlitAPIException(
|
456
|
+
f'You set theme="{theme}" while Streamlit charts only support '
|
457
|
+
"theme=”streamlit” or theme=None to fallback to the default "
|
458
|
+
"library theme."
|
459
|
+
)
|
460
|
+
|
461
|
+
if on_select not in ["ignore", "rerun"] and not callable(on_select):
|
462
|
+
raise StreamlitAPIException(
|
463
|
+
f"You have passed {on_select} to `on_select`. But only 'ignore', "
|
464
|
+
"'rerun', or a callable is supported."
|
465
|
+
)
|
466
|
+
|
467
|
+
key = to_key(key)
|
468
|
+
is_selection_activated = on_select != "ignore"
|
469
|
+
|
470
|
+
if is_selection_activated:
|
471
|
+
# Run some checks that are only relevant when selections are activated
|
472
|
+
|
473
|
+
is_callback = callable(on_select)
|
474
|
+
check_widget_policies(
|
475
|
+
self.dg,
|
476
|
+
key,
|
477
|
+
on_change=cast(WidgetCallback, on_select) if is_callback else None,
|
478
|
+
default_value=None,
|
479
|
+
writes_allowed=False,
|
480
|
+
enable_check_callback_rules=is_callback,
|
481
|
+
)
|
482
|
+
|
483
|
+
if type_util.is_type(figure_or_data, "matplotlib.figure.Figure"):
|
484
|
+
# Convert matplotlib figure to plotly figure:
|
485
|
+
figure = plotly.tools.mpl_to_plotly(figure_or_data)
|
486
|
+
else:
|
487
|
+
figure = plotly.tools.return_figure_from_figure_or_data(
|
488
|
+
figure_or_data, validate_figure=True
|
489
|
+
)
|
490
|
+
|
491
|
+
plotly_chart_proto = PlotlyChartProto()
|
492
|
+
plotly_chart_proto.use_container_width = use_container_width
|
493
|
+
plotly_chart_proto.theme = theme or ""
|
494
|
+
plotly_chart_proto.form_id = current_form_id(self.dg)
|
495
|
+
|
496
|
+
config = dict(kwargs.get("config", {}))
|
497
|
+
# Copy over some kwargs to config dict. Plotly does the same in plot().
|
498
|
+
config.setdefault("showLink", kwargs.get("show_link", False))
|
499
|
+
config.setdefault("linkText", kwargs.get("link_text", False))
|
500
|
+
|
501
|
+
plotly_chart_proto.spec = plotly.io.to_json(figure, validate=False)
|
502
|
+
plotly_chart_proto.config = json.dumps(config)
|
503
|
+
|
504
|
+
ctx = get_script_run_ctx()
|
505
|
+
|
506
|
+
# We are computing the widget id for all plotly uses
|
507
|
+
# to also allow non-widget Plotly charts to keep their state
|
508
|
+
# when the frontend component gets unmounted and remounted.
|
509
|
+
plotly_chart_proto.id = compute_and_register_element_id(
|
510
|
+
"plotly_chart",
|
511
|
+
user_key=key,
|
512
|
+
form_id=plotly_chart_proto.form_id,
|
513
|
+
plotly_spec=plotly_chart_proto.spec,
|
514
|
+
plotly_config=plotly_chart_proto.config,
|
515
|
+
selection_mode=selection_mode,
|
516
|
+
is_selection_activated=is_selection_activated,
|
517
|
+
theme=theme,
|
518
|
+
use_container_width=use_container_width,
|
519
|
+
)
|
520
|
+
|
521
|
+
if is_selection_activated:
|
522
|
+
# Selections are activated, treat plotly chart as a widget:
|
523
|
+
plotly_chart_proto.selection_mode.extend(
|
524
|
+
parse_selection_mode(selection_mode)
|
525
|
+
)
|
526
|
+
|
527
|
+
serde = PlotlyChartSelectionSerde()
|
528
|
+
|
529
|
+
widget_state = register_widget(
|
530
|
+
plotly_chart_proto.id,
|
531
|
+
on_change_handler=on_select if callable(on_select) else None,
|
532
|
+
deserializer=serde.deserialize,
|
533
|
+
serializer=serde.serialize,
|
534
|
+
ctx=ctx,
|
535
|
+
value_type="string_value",
|
536
|
+
)
|
537
|
+
|
538
|
+
self.dg._enqueue("plotly_chart", plotly_chart_proto)
|
539
|
+
return cast(PlotlyState, widget_state.value)
|
540
|
+
else:
|
541
|
+
return self.dg._enqueue("plotly_chart", plotly_chart_proto)
|
542
|
+
|
543
|
+
@property
|
544
|
+
def dg(self) -> DeltaGenerator:
|
545
|
+
"""Get our DeltaGenerator."""
|
546
|
+
return cast("DeltaGenerator", self)
|
@@ -0,0 +1,156 @@
|
|
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
|
+
import math
|
18
|
+
from typing import TYPE_CHECKING, Union, cast
|
19
|
+
|
20
|
+
from typing_extensions import TypeAlias
|
21
|
+
|
22
|
+
from streamlit.errors import StreamlitAPIException
|
23
|
+
from streamlit.proto.Progress_pb2 import Progress as ProgressProto
|
24
|
+
from streamlit.string_util import clean_text
|
25
|
+
|
26
|
+
if TYPE_CHECKING:
|
27
|
+
from streamlit.delta_generator import DeltaGenerator
|
28
|
+
|
29
|
+
|
30
|
+
# Currently, equates to just float, but we can't use `numbers.Real` due to
|
31
|
+
# https://github.com/python/mypy/issues/3186
|
32
|
+
FloatOrInt: TypeAlias = Union[int, float]
|
33
|
+
|
34
|
+
|
35
|
+
def _check_float_between(value: float, low: float = 0.0, high: float = 1.0) -> bool:
|
36
|
+
"""
|
37
|
+
Checks given value is 'between' the bounds of [low, high],
|
38
|
+
considering close values around bounds are acceptable input
|
39
|
+
|
40
|
+
Notes
|
41
|
+
-----
|
42
|
+
This check is required for handling values that are slightly above or below the
|
43
|
+
acceptable range, for example -0.0000000000021, 1.0000000000000013.
|
44
|
+
These values are little off the conventional 0.0 <= x <= 1.0 condition
|
45
|
+
due to floating point operations, but should still be considered acceptable input.
|
46
|
+
|
47
|
+
Parameters
|
48
|
+
----------
|
49
|
+
value : float
|
50
|
+
low : float
|
51
|
+
high : float
|
52
|
+
|
53
|
+
"""
|
54
|
+
return (
|
55
|
+
(low <= value <= high)
|
56
|
+
or math.isclose(value, low, rel_tol=1e-9, abs_tol=1e-9)
|
57
|
+
or math.isclose(value, high, rel_tol=1e-9, abs_tol=1e-9)
|
58
|
+
)
|
59
|
+
|
60
|
+
|
61
|
+
def _get_value(value):
|
62
|
+
if isinstance(value, int):
|
63
|
+
if 0 <= value <= 100:
|
64
|
+
return value
|
65
|
+
else:
|
66
|
+
raise StreamlitAPIException(
|
67
|
+
"Progress Value has invalid value [0, 100]: %d" % value
|
68
|
+
)
|
69
|
+
|
70
|
+
elif isinstance(value, float):
|
71
|
+
if _check_float_between(value, low=0.0, high=1.0):
|
72
|
+
return int(value * 100)
|
73
|
+
else:
|
74
|
+
raise StreamlitAPIException(
|
75
|
+
"Progress Value has invalid value [0.0, 1.0]: %f" % value
|
76
|
+
)
|
77
|
+
else:
|
78
|
+
raise StreamlitAPIException(
|
79
|
+
"Progress Value has invalid type: %s" % type(value).__name__
|
80
|
+
)
|
81
|
+
|
82
|
+
|
83
|
+
def _get_text(text: str | None) -> str | None:
|
84
|
+
if text is None:
|
85
|
+
return None
|
86
|
+
if isinstance(text, str):
|
87
|
+
return clean_text(text)
|
88
|
+
raise StreamlitAPIException(
|
89
|
+
f"Progress Text is of type {str(type(text))}, which is not an accepted type."
|
90
|
+
"Text only accepts: str. Please convert the text to an accepted type."
|
91
|
+
)
|
92
|
+
|
93
|
+
|
94
|
+
class ProgressMixin:
|
95
|
+
def progress(self, value: FloatOrInt, text: str | None = None) -> DeltaGenerator:
|
96
|
+
r"""Display a progress bar.
|
97
|
+
|
98
|
+
Parameters
|
99
|
+
----------
|
100
|
+
value : int or float
|
101
|
+
0 <= value <= 100 for int
|
102
|
+
|
103
|
+
0.0 <= value <= 1.0 for float
|
104
|
+
|
105
|
+
text : str or None
|
106
|
+
A message to display above the progress bar. The text can optionally
|
107
|
+
contain GitHub-flavored Markdown of the following types: Bold, Italics,
|
108
|
+
Strikethroughs, Inline Code, Links, and Images. Images display like
|
109
|
+
icons, with a max height equal to the font height.
|
110
|
+
|
111
|
+
Unsupported Markdown elements are unwrapped so only their children
|
112
|
+
(text contents) render. Display unsupported elements as literal
|
113
|
+
characters by backslash-escaping them. E.g.,
|
114
|
+
``"1\. Not an ordered list"``.
|
115
|
+
|
116
|
+
See the ``body`` parameter of |st.markdown|_ for additional,
|
117
|
+
supported Markdown directives.
|
118
|
+
|
119
|
+
.. |st.markdown| replace:: ``st.markdown``
|
120
|
+
.. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
|
121
|
+
|
122
|
+
Example
|
123
|
+
-------
|
124
|
+
Here is an example of a progress bar increasing over time and disappearing when it reaches completion:
|
125
|
+
|
126
|
+
>>> import streamlit as st
|
127
|
+
>>> import time
|
128
|
+
>>>
|
129
|
+
>>> progress_text = "Operation in progress. Please wait."
|
130
|
+
>>> my_bar = st.progress(0, text=progress_text)
|
131
|
+
>>>
|
132
|
+
>>> for percent_complete in range(100):
|
133
|
+
... time.sleep(0.01)
|
134
|
+
... my_bar.progress(percent_complete + 1, text=progress_text)
|
135
|
+
>>> time.sleep(1)
|
136
|
+
>>> my_bar.empty()
|
137
|
+
>>>
|
138
|
+
>>> st.button("Rerun")
|
139
|
+
|
140
|
+
.. output::
|
141
|
+
https://doc-status-progress.streamlit.app/
|
142
|
+
height: 220px
|
143
|
+
|
144
|
+
"""
|
145
|
+
# TODO: standardize numerical type checking across st.* functions.
|
146
|
+
progress_proto = ProgressProto()
|
147
|
+
progress_proto.value = _get_value(value)
|
148
|
+
text = _get_text(text)
|
149
|
+
if text is not None:
|
150
|
+
progress_proto.text = text
|
151
|
+
return self.dg._enqueue("progress", progress_proto)
|
152
|
+
|
153
|
+
@property
|
154
|
+
def dg(self) -> DeltaGenerator:
|
155
|
+
"""Get our DeltaGenerator."""
|
156
|
+
return cast("DeltaGenerator", self)
|