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,189 @@
|
|
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
|
+
"""Handle App logos"""
|
16
|
+
|
17
|
+
from __future__ import annotations
|
18
|
+
|
19
|
+
from typing import Literal
|
20
|
+
|
21
|
+
from streamlit import url_util
|
22
|
+
from streamlit.elements.lib.image_utils import AtomicImage, WidthBehavior, image_to_url
|
23
|
+
from streamlit.errors import StreamlitAPIException
|
24
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
25
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
26
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
27
|
+
|
28
|
+
|
29
|
+
def _invalid_logo_text(field_name: str):
|
30
|
+
return f"The {field_name} passed to st.logo is invalid - See [documentation](https://docs.streamlit.io/develop/api-reference/media/st.logo) for more information on valid types"
|
31
|
+
|
32
|
+
|
33
|
+
@gather_metrics("logo")
|
34
|
+
def logo(
|
35
|
+
image: AtomicImage,
|
36
|
+
*, # keyword-only args:
|
37
|
+
size: Literal["small", "medium", "large"] = "medium",
|
38
|
+
link: str | None = None,
|
39
|
+
icon_image: AtomicImage | None = None,
|
40
|
+
) -> None:
|
41
|
+
"""
|
42
|
+
Renders a logo in the upper-left corner of your app and its sidebar.
|
43
|
+
|
44
|
+
If ``st.logo`` is called multiple times within a page, Streamlit will
|
45
|
+
render the image passed in the last call. For the most consistent results,
|
46
|
+
call ``st.logo`` early in your page script and choose an image that works
|
47
|
+
well in both light and dark mode. Avoid empty margins around your image.
|
48
|
+
|
49
|
+
If your logo does not work well for both light and dark mode, consider
|
50
|
+
setting the theme and hiding the settings menu from users with the
|
51
|
+
`configuration option <https://docs.streamlit.io/develop/api-reference/configuration/config.toml>`_
|
52
|
+
``client.toolbarMode="minimal"``.
|
53
|
+
|
54
|
+
Parameters
|
55
|
+
----------
|
56
|
+
image: Anything supported by st.image (except list)
|
57
|
+
The image to display in the upper-left corner of your app and its
|
58
|
+
sidebar. This can be any of the types supported by |st.image|_ except
|
59
|
+
a list. If ``icon_image`` is also provided, then Streamlit will only
|
60
|
+
display ``image`` in the sidebar.
|
61
|
+
|
62
|
+
Streamlit scales the image to a max height set by ``size`` and a max
|
63
|
+
width to fit within the sidebar.
|
64
|
+
|
65
|
+
.. |st.image| replace:: ``st.image``
|
66
|
+
.. _st.image: https://docs.streamlit.io/develop/api-reference/media/st.image
|
67
|
+
|
68
|
+
size: "small", "medium", or "large"
|
69
|
+
The size of the image displayed in the upper-left corner of the app and its
|
70
|
+
sidebar. The possible values are as follows:
|
71
|
+
|
72
|
+
- ``"small"``: 20px max height
|
73
|
+
- ``"medium"`` (default): 24px max height
|
74
|
+
- ``"large"``: 32px max height
|
75
|
+
|
76
|
+
link : str or None
|
77
|
+
The external URL to open when a user clicks on the logo. The URL must
|
78
|
+
start with "\\http://" or "\\https://". If ``link`` is ``None`` (default),
|
79
|
+
the logo will not include a hyperlink.
|
80
|
+
icon_image: Anything supported by st.image (except list) or None
|
81
|
+
An optional, typically smaller image to replace ``image`` in the
|
82
|
+
upper-left corner when the sidebar is closed. This can be any of the
|
83
|
+
types supported by ``st.image`` except a list. If ``icon_image`` is
|
84
|
+
``None`` (default), Streamlit will always display ``image`` in the
|
85
|
+
upper-left corner, regardless of whether the sidebar is open or closed.
|
86
|
+
Otherwise, Streamlit will render ``icon_image`` in the upper-left
|
87
|
+
corner of the app when the sidebar is closed.
|
88
|
+
|
89
|
+
Streamlit scales the image to a max height set by ``size`` and a max
|
90
|
+
width to fit within the sidebar. If the sidebar is closed, the max
|
91
|
+
width is retained from when it was last open.
|
92
|
+
|
93
|
+
For best results, pass a wide or horizontal image to ``image`` and a
|
94
|
+
square image to ``icon_image``. Or, pass a square image to ``image``
|
95
|
+
and leave ``icon_image=None``.
|
96
|
+
|
97
|
+
Examples
|
98
|
+
--------
|
99
|
+
A common design practice is to use a wider logo in the sidebar, and a
|
100
|
+
smaller, icon-styled logo in your app's main body.
|
101
|
+
|
102
|
+
>>> import streamlit as st
|
103
|
+
>>>
|
104
|
+
>>> st.logo(
|
105
|
+
... LOGO_URL_LARGE,
|
106
|
+
... link="https://streamlit.io/gallery",
|
107
|
+
... icon_image=LOGO_URL_SMALL,
|
108
|
+
... )
|
109
|
+
|
110
|
+
Try switching logos around in the following example:
|
111
|
+
|
112
|
+
>>> import streamlit as st
|
113
|
+
>>>
|
114
|
+
>>> HORIZONTAL_RED = "images/horizontal_red.png"
|
115
|
+
>>> ICON_RED = "images/icon_red.png"
|
116
|
+
>>> HORIZONTAL_BLUE = "images/horizontal_blue.png"
|
117
|
+
>>> ICON_BLUE = "images/icon_blue.png"
|
118
|
+
>>>
|
119
|
+
>>> options = [HORIZONTAL_RED, ICON_RED, HORIZONTAL_BLUE, ICON_BLUE]
|
120
|
+
>>> sidebar_logo = st.selectbox("Sidebar logo", options, 0)
|
121
|
+
>>> main_body_logo = st.selectbox("Main body logo", options, 1)
|
122
|
+
>>>
|
123
|
+
>>> st.logo(sidebar_logo, icon_image=main_body_logo)
|
124
|
+
>>> st.sidebar.markdown("Hi!")
|
125
|
+
|
126
|
+
.. output::
|
127
|
+
https://doc-logo.streamlit.app/
|
128
|
+
height: 300px
|
129
|
+
|
130
|
+
"""
|
131
|
+
|
132
|
+
ctx = get_script_run_ctx()
|
133
|
+
if ctx is None:
|
134
|
+
return
|
135
|
+
|
136
|
+
fwd_msg = ForwardMsg()
|
137
|
+
|
138
|
+
try:
|
139
|
+
image_url = image_to_url(
|
140
|
+
image,
|
141
|
+
width=WidthBehavior.AUTO,
|
142
|
+
clamp=False,
|
143
|
+
channels="RGB",
|
144
|
+
output_format="auto",
|
145
|
+
image_id="logo",
|
146
|
+
)
|
147
|
+
fwd_msg.logo.image = image_url
|
148
|
+
except Exception as ex:
|
149
|
+
raise StreamlitAPIException(_invalid_logo_text("image")) from ex
|
150
|
+
|
151
|
+
if link:
|
152
|
+
# Handle external links:
|
153
|
+
if url_util.is_url(link, ("http", "https")):
|
154
|
+
fwd_msg.logo.link = link
|
155
|
+
else:
|
156
|
+
raise StreamlitAPIException(
|
157
|
+
f"Invalid link: {link} - the link param supports external links only and must start with either http:// or https://."
|
158
|
+
)
|
159
|
+
|
160
|
+
if icon_image:
|
161
|
+
try:
|
162
|
+
icon_image_url = image_to_url(
|
163
|
+
icon_image,
|
164
|
+
width=WidthBehavior.AUTO,
|
165
|
+
clamp=False,
|
166
|
+
channels="RGB",
|
167
|
+
output_format="auto",
|
168
|
+
image_id="icon-image",
|
169
|
+
)
|
170
|
+
fwd_msg.logo.icon_image = icon_image_url
|
171
|
+
except Exception as ex:
|
172
|
+
raise StreamlitAPIException(_invalid_logo_text("icon_image")) from ex
|
173
|
+
|
174
|
+
def validate_size(size):
|
175
|
+
if isinstance(size, str):
|
176
|
+
image_size = size.lower()
|
177
|
+
valid_sizes = ["small", "medium", "large"]
|
178
|
+
|
179
|
+
if image_size in valid_sizes:
|
180
|
+
return image_size
|
181
|
+
|
182
|
+
raise StreamlitAPIException(
|
183
|
+
f'The size argument to st.logo must be "small", "medium", or "large". \n'
|
184
|
+
f"The argument passed was {size}."
|
185
|
+
)
|
186
|
+
|
187
|
+
fwd_msg.logo.size = validate_size(size)
|
188
|
+
|
189
|
+
ctx.enqueue(fwd_msg)
|
@@ -0,0 +1,385 @@
|
|
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 collections.abc import Mapping, Sequence
|
18
|
+
from pathlib import Path
|
19
|
+
from typing import TYPE_CHECKING, Callable, Literal, Union
|
20
|
+
|
21
|
+
from typing_extensions import TypeAlias
|
22
|
+
|
23
|
+
from streamlit import config
|
24
|
+
from streamlit.errors import StreamlitAPIException
|
25
|
+
from streamlit.navigation.page import StreamlitPage
|
26
|
+
from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
|
27
|
+
from streamlit.proto.Navigation_pb2 import Navigation as NavigationProto
|
28
|
+
from streamlit.runtime.metrics_util import gather_metrics
|
29
|
+
from streamlit.runtime.pages_manager import PagesManager
|
30
|
+
from streamlit.runtime.scriptrunner_utils.script_run_context import (
|
31
|
+
ScriptRunContext,
|
32
|
+
get_script_run_ctx,
|
33
|
+
)
|
34
|
+
|
35
|
+
if TYPE_CHECKING:
|
36
|
+
from streamlit.source_util import PageHash, PageInfo
|
37
|
+
|
38
|
+
SectionHeader: TypeAlias = str
|
39
|
+
PageType: TypeAlias = Union[str, Path, Callable[[], None], StreamlitPage]
|
40
|
+
|
41
|
+
|
42
|
+
def convert_to_streamlit_page(
|
43
|
+
page_input: PageType,
|
44
|
+
) -> StreamlitPage:
|
45
|
+
"""Convert various input types to StreamlitPage objects."""
|
46
|
+
if isinstance(page_input, StreamlitPage):
|
47
|
+
return page_input
|
48
|
+
|
49
|
+
if isinstance(page_input, str):
|
50
|
+
return StreamlitPage(page_input)
|
51
|
+
|
52
|
+
if isinstance(page_input, Path):
|
53
|
+
return StreamlitPage(page_input)
|
54
|
+
|
55
|
+
if callable(page_input):
|
56
|
+
# Convert function to StreamlitPage
|
57
|
+
return StreamlitPage(page_input)
|
58
|
+
|
59
|
+
raise StreamlitAPIException(
|
60
|
+
f"Invalid page type: {type(page_input)}. Must be either a string path, "
|
61
|
+
"a pathlib.Path, a callable function, or a st.Page object."
|
62
|
+
)
|
63
|
+
|
64
|
+
|
65
|
+
def pages_from_nav_sections(
|
66
|
+
nav_sections: dict[SectionHeader, list[StreamlitPage]],
|
67
|
+
) -> list[StreamlitPage]:
|
68
|
+
page_list = []
|
69
|
+
for pages in nav_sections.values():
|
70
|
+
for page in pages:
|
71
|
+
page_list.append(page)
|
72
|
+
|
73
|
+
return page_list
|
74
|
+
|
75
|
+
|
76
|
+
def send_page_not_found(ctx: ScriptRunContext):
|
77
|
+
msg = ForwardMsg()
|
78
|
+
msg.page_not_found.page_name = ""
|
79
|
+
ctx.enqueue(msg)
|
80
|
+
|
81
|
+
|
82
|
+
@gather_metrics("navigation")
|
83
|
+
def navigation(
|
84
|
+
pages: Sequence[PageType] | Mapping[SectionHeader, Sequence[PageType]],
|
85
|
+
*,
|
86
|
+
position: Literal["sidebar", "hidden"] = "sidebar",
|
87
|
+
expanded: bool = False,
|
88
|
+
) -> StreamlitPage:
|
89
|
+
"""
|
90
|
+
Configure the available pages in a multipage app.
|
91
|
+
|
92
|
+
Call ``st.navigation`` in your entrypoint file to define the available
|
93
|
+
pages for your app. ``st.navigation`` returns the current page, which can
|
94
|
+
be executed using ``.run()`` method.
|
95
|
+
|
96
|
+
When using ``st.navigation``, your entrypoint file (the file passed to
|
97
|
+
``streamlit run``) acts like a router or frame of common elements around
|
98
|
+
each of your pages. Streamlit executes the entrypoint file with every app
|
99
|
+
rerun. To execute the current page, you must call the ``.run()`` method on
|
100
|
+
the ``StreamlitPage`` object returned by ``st.navigation``.
|
101
|
+
|
102
|
+
The set of available pages can be updated with each rerun for dynamic
|
103
|
+
navigation. By default, ``st.navigation`` displays the available pages in
|
104
|
+
the sidebar if there is more than one page. This behavior can be changed
|
105
|
+
using the ``position`` keyword argument.
|
106
|
+
|
107
|
+
As soon as any session of your app executes the ``st.navigation`` command,
|
108
|
+
your app will ignore the ``pages/`` directory (across all sessions).
|
109
|
+
|
110
|
+
Parameters
|
111
|
+
----------
|
112
|
+
pages : Sequence[page-like], Mapping[str, Sequence[page-like]]
|
113
|
+
The available pages for the app.
|
114
|
+
|
115
|
+
To create a navigation menu with no sections or page groupings,
|
116
|
+
``pages`` must be a list of page-like objects. Page-like objects are
|
117
|
+
anything that can be passed to ``st.Page`` or a ``StreamlitPage``
|
118
|
+
object returned by ``st.Page``.
|
119
|
+
|
120
|
+
To create labeled sections or page groupings within the navigation
|
121
|
+
menu, ``pages`` must be a dictionary. Each key is the label of a
|
122
|
+
section and each value is the list of page-like objects for
|
123
|
+
that section.
|
124
|
+
|
125
|
+
When you use a string or path as a page-like object, they are
|
126
|
+
internally passed to ``st.Page`` and converted to ``StreamlitPage``
|
127
|
+
objects. In this case, the page will have the default title, icon, and
|
128
|
+
path inferred from its path or filename. To customize these attributes
|
129
|
+
for your page, initialize your page with ``st.Page``.
|
130
|
+
|
131
|
+
position : "sidebar" or "hidden"
|
132
|
+
The position of the navigation menu. If this is ``"sidebar"``
|
133
|
+
(default), the navigation widget appears at the top of the sidebar. If
|
134
|
+
this is ``"hidden"``, the navigation widget is not displayed.
|
135
|
+
|
136
|
+
If there is only one page in ``pages``, the navigation will be hidden
|
137
|
+
for any value of ``position``.
|
138
|
+
|
139
|
+
expanded : bool
|
140
|
+
Whether the navigation menu should be expanded. If this is ``False``
|
141
|
+
(default), the navigation menu will be collapsed and will include a
|
142
|
+
button to view more options when there are too many pages to display.
|
143
|
+
If this is ``True``, the navigation menu will always be expanded; no
|
144
|
+
button to collapse the menu will be displayed.
|
145
|
+
|
146
|
+
If ``st.navigation`` changes from ``expanded=True`` to
|
147
|
+
``expanded=False`` on a rerun, the menu will stay expanded and a
|
148
|
+
collapse button will be displayed.
|
149
|
+
|
150
|
+
Returns
|
151
|
+
-------
|
152
|
+
StreamlitPage
|
153
|
+
The current page selected by the user. To run the page, you must use
|
154
|
+
the ``.run()`` method on it.
|
155
|
+
|
156
|
+
Examples
|
157
|
+
--------
|
158
|
+
The following examples show different possible entrypoint files, each named
|
159
|
+
``streamlit_app.py``. An entrypoint file is passed to ``streamlit run``. It
|
160
|
+
manages your app's navigation and serves as a router between pages.
|
161
|
+
|
162
|
+
**Example 1: Use a callable or Python file as a page**
|
163
|
+
|
164
|
+
You can declare pages from callables or file paths. If you pass callables
|
165
|
+
or paths to ``st.navigation`` as a page-like objects, they are internally
|
166
|
+
converted to ``StreamlitPage`` objects using ``st.Page``. In this case, the
|
167
|
+
page titles, icons, and paths are inferred from the file or callable names.
|
168
|
+
|
169
|
+
``page_1.py`` (in the same directory as your entrypoint file):
|
170
|
+
|
171
|
+
>>> import streamlit as st
|
172
|
+
>>>
|
173
|
+
>>> st.title("Page 1")
|
174
|
+
|
175
|
+
``streamlit_app.py``:
|
176
|
+
|
177
|
+
>>> import streamlit as st
|
178
|
+
>>>
|
179
|
+
>>> def page_2():
|
180
|
+
... st.title("Page 2")
|
181
|
+
>>>
|
182
|
+
>>> pg = st.navigation(["page_1.py", page_2])
|
183
|
+
>>> pg.run()
|
184
|
+
|
185
|
+
.. output::
|
186
|
+
https://doc-navigation-example-1.streamlit.app/
|
187
|
+
height: 200px
|
188
|
+
|
189
|
+
**Example 2: Group pages into sections and customize them with ``st.Page``**
|
190
|
+
|
191
|
+
You can use a dictionary to create sections within your navigation menu. In
|
192
|
+
the following example, each page is similar to Page 1 in Example 1, and all
|
193
|
+
pages are in the same directory. However, you can use Python files from
|
194
|
+
anywhere in your repository. ``st.Page`` is used to give each page a custom
|
195
|
+
title. For more information, see |st.Page|_.
|
196
|
+
|
197
|
+
Directory structure:
|
198
|
+
|
199
|
+
>>> your_repository/
|
200
|
+
>>> ├── create_account.py
|
201
|
+
>>> ├── learn.py
|
202
|
+
>>> ├── manage_account.py
|
203
|
+
>>> ├── streamlit_app.py
|
204
|
+
>>> └── trial.py
|
205
|
+
|
206
|
+
``streamlit_app.py``:
|
207
|
+
|
208
|
+
>>> import streamlit as st
|
209
|
+
>>>
|
210
|
+
>>> pages = {
|
211
|
+
... "Your account": [
|
212
|
+
... st.Page("create_account.py", title="Create your account"),
|
213
|
+
... st.Page("manage_account.py", title="Manage your account"),
|
214
|
+
... ],
|
215
|
+
... "Resources": [
|
216
|
+
... st.Page("learn.py", title="Learn about us"),
|
217
|
+
... st.Page("trial.py", title="Try it out"),
|
218
|
+
... ],
|
219
|
+
... }
|
220
|
+
>>>
|
221
|
+
>>> pg = st.navigation(pages)
|
222
|
+
>>> pg.run()
|
223
|
+
|
224
|
+
.. output::
|
225
|
+
https://doc-navigation-example-2.streamlit.app/
|
226
|
+
height: 300px
|
227
|
+
|
228
|
+
**Example 3: Stateful widgets across multiple pages**
|
229
|
+
|
230
|
+
Call widget functions in your entrypoint file when you want a widget to be
|
231
|
+
stateful across pages. Assign keys to your common widgets and access their
|
232
|
+
values through Session State within your pages.
|
233
|
+
|
234
|
+
``streamlit_app.py``:
|
235
|
+
|
236
|
+
>>> import streamlit as st
|
237
|
+
>>>
|
238
|
+
>>> def page1():
|
239
|
+
>>> st.write(st.session_state.foo)
|
240
|
+
>>>
|
241
|
+
>>> def page2():
|
242
|
+
>>> st.write(st.session_state.bar)
|
243
|
+
>>>
|
244
|
+
>>> # Widgets shared by all the pages
|
245
|
+
>>> st.sidebar.selectbox("Foo", ["A", "B", "C"], key="foo")
|
246
|
+
>>> st.sidebar.checkbox("Bar", key="bar")
|
247
|
+
>>>
|
248
|
+
>>> pg = st.navigation([page1, page2])
|
249
|
+
>>> pg.run()
|
250
|
+
|
251
|
+
.. output::
|
252
|
+
https://doc-navigation-multipage-widgets.streamlit.app/
|
253
|
+
height: 350px
|
254
|
+
|
255
|
+
.. |st.Page| replace:: ``st.Page``
|
256
|
+
.. _st.Page: https://docs.streamlit.io/develop/api-reference/navigation/st.page
|
257
|
+
|
258
|
+
"""
|
259
|
+
# Disable the use of the pages feature (ie disregard v1 behavior of Multipage Apps)
|
260
|
+
PagesManager.uses_pages_directory = False
|
261
|
+
|
262
|
+
return _navigation(pages, position=position, expanded=expanded)
|
263
|
+
|
264
|
+
|
265
|
+
def _navigation(
|
266
|
+
pages: Sequence[PageType] | Mapping[SectionHeader, Sequence[PageType]],
|
267
|
+
*,
|
268
|
+
position: Literal["sidebar", "hidden"],
|
269
|
+
expanded: bool,
|
270
|
+
) -> StreamlitPage:
|
271
|
+
if isinstance(pages, Sequence):
|
272
|
+
converted_pages = [convert_to_streamlit_page(p) for p in pages]
|
273
|
+
nav_sections = {"": converted_pages}
|
274
|
+
else:
|
275
|
+
nav_sections = {
|
276
|
+
section: [convert_to_streamlit_page(p) for p in section_pages]
|
277
|
+
for section, section_pages in pages.items()
|
278
|
+
}
|
279
|
+
page_list = pages_from_nav_sections(nav_sections)
|
280
|
+
|
281
|
+
if not page_list:
|
282
|
+
raise StreamlitAPIException(
|
283
|
+
"`st.navigation` must be called with at least one `st.Page`."
|
284
|
+
)
|
285
|
+
|
286
|
+
default_page = None
|
287
|
+
pagehash_to_pageinfo: dict[PageHash, PageInfo] = {}
|
288
|
+
|
289
|
+
# Get the default page.
|
290
|
+
for section_header in nav_sections:
|
291
|
+
for page in nav_sections[section_header]:
|
292
|
+
if page._default:
|
293
|
+
if default_page is not None:
|
294
|
+
raise StreamlitAPIException(
|
295
|
+
"Multiple Pages specified with `default=True`. "
|
296
|
+
"At most one Page can be set to default."
|
297
|
+
)
|
298
|
+
default_page = page
|
299
|
+
|
300
|
+
if default_page is None:
|
301
|
+
default_page = page_list[0]
|
302
|
+
default_page._default = True
|
303
|
+
|
304
|
+
ctx = get_script_run_ctx()
|
305
|
+
if not ctx:
|
306
|
+
# This should never run in Streamlit, but we want to make sure that
|
307
|
+
# the function always returns a page
|
308
|
+
default_page._can_be_called = True
|
309
|
+
return default_page
|
310
|
+
|
311
|
+
# Build the pagehash-to-pageinfo mapping.
|
312
|
+
for section_header in nav_sections:
|
313
|
+
for page in nav_sections[section_header]:
|
314
|
+
if isinstance(page._page, Path):
|
315
|
+
script_path = str(page._page)
|
316
|
+
else:
|
317
|
+
script_path = ""
|
318
|
+
|
319
|
+
script_hash = page._script_hash
|
320
|
+
if script_hash in pagehash_to_pageinfo:
|
321
|
+
# The page script hash is soley based on the url path
|
322
|
+
# So duplicate page script hashes are due to duplicate url paths
|
323
|
+
raise StreamlitAPIException(
|
324
|
+
f"Multiple Pages specified with URL pathname {page.url_path}. "
|
325
|
+
"URL pathnames must be unique. The url pathname may be "
|
326
|
+
"inferred from the filename, callable name, or title."
|
327
|
+
)
|
328
|
+
|
329
|
+
pagehash_to_pageinfo[script_hash] = {
|
330
|
+
"page_script_hash": script_hash,
|
331
|
+
"page_name": page.title,
|
332
|
+
"icon": page.icon,
|
333
|
+
"script_path": script_path,
|
334
|
+
"url_pathname": page.url_path,
|
335
|
+
}
|
336
|
+
|
337
|
+
msg = ForwardMsg()
|
338
|
+
if position == "hidden":
|
339
|
+
msg.navigation.position = NavigationProto.Position.HIDDEN
|
340
|
+
elif config.get_option("client.showSidebarNavigation") is False:
|
341
|
+
msg.navigation.position = NavigationProto.Position.HIDDEN
|
342
|
+
else:
|
343
|
+
msg.navigation.position = NavigationProto.Position.SIDEBAR
|
344
|
+
|
345
|
+
msg.navigation.expanded = expanded
|
346
|
+
msg.navigation.sections[:] = nav_sections.keys()
|
347
|
+
for section_header in nav_sections:
|
348
|
+
for page in nav_sections[section_header]:
|
349
|
+
p = msg.navigation.app_pages.add()
|
350
|
+
p.page_script_hash = page._script_hash
|
351
|
+
p.page_name = page.title
|
352
|
+
p.icon = page.icon
|
353
|
+
p.is_default = page._default
|
354
|
+
p.section_header = section_header
|
355
|
+
p.url_pathname = page.url_path
|
356
|
+
|
357
|
+
# Inform our page manager about the set of pages we have
|
358
|
+
ctx.pages_manager.set_pages(pagehash_to_pageinfo)
|
359
|
+
found_page = ctx.pages_manager.get_page_script(
|
360
|
+
fallback_page_hash=default_page._script_hash
|
361
|
+
)
|
362
|
+
|
363
|
+
page_to_return = None
|
364
|
+
if found_page:
|
365
|
+
found_page_script_hash = found_page["page_script_hash"]
|
366
|
+
matching_pages = [
|
367
|
+
p for p in page_list if p._script_hash == found_page_script_hash
|
368
|
+
]
|
369
|
+
if len(matching_pages) > 0:
|
370
|
+
page_to_return = matching_pages[0]
|
371
|
+
|
372
|
+
if not page_to_return:
|
373
|
+
send_page_not_found(ctx)
|
374
|
+
page_to_return = default_page
|
375
|
+
|
376
|
+
# Ordain the page that can be called
|
377
|
+
page_to_return._can_be_called = True
|
378
|
+
msg.navigation.page_script_hash = page_to_return._script_hash
|
379
|
+
# Set the current page script hash to the page that is going to be executed
|
380
|
+
ctx.set_mpa_v2_page(page_to_return._script_hash)
|
381
|
+
|
382
|
+
# This will either navigation or yield if the page is not found
|
383
|
+
ctx.enqueue(msg)
|
384
|
+
|
385
|
+
return page_to_return
|