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.
Files changed (563) hide show
  1. streamlit/__init__.py +306 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +218 -0
  4. streamlit/cli_util.py +105 -0
  5. streamlit/column_config.py +56 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +126 -0
  8. streamlit/commands/execution_control.py +238 -0
  9. streamlit/commands/experimental_query_params.py +169 -0
  10. streamlit/commands/logo.py +189 -0
  11. streamlit/commands/navigation.py +385 -0
  12. streamlit/commands/page_config.py +311 -0
  13. streamlit/components/__init__.py +13 -0
  14. streamlit/components/lib/__init__.py +13 -0
  15. streamlit/components/lib/local_component_registry.py +84 -0
  16. streamlit/components/types/__init__.py +13 -0
  17. streamlit/components/types/base_component_registry.py +99 -0
  18. streamlit/components/types/base_custom_component.py +150 -0
  19. streamlit/components/v1/__init__.py +31 -0
  20. streamlit/components/v1/component_arrow.py +141 -0
  21. streamlit/components/v1/component_registry.py +130 -0
  22. streamlit/components/v1/components.py +38 -0
  23. streamlit/components/v1/custom_component.py +243 -0
  24. streamlit/config.py +1513 -0
  25. streamlit/config_option.py +311 -0
  26. streamlit/config_util.py +177 -0
  27. streamlit/connections/__init__.py +28 -0
  28. streamlit/connections/base_connection.py +174 -0
  29. streamlit/connections/snowflake_connection.py +562 -0
  30. streamlit/connections/snowpark_connection.py +213 -0
  31. streamlit/connections/sql_connection.py +425 -0
  32. streamlit/connections/util.py +97 -0
  33. streamlit/cursor.py +210 -0
  34. streamlit/dataframe_util.py +1416 -0
  35. streamlit/delta_generator.py +602 -0
  36. streamlit/delta_generator_singletons.py +204 -0
  37. streamlit/deprecation_util.py +209 -0
  38. streamlit/development.py +21 -0
  39. streamlit/elements/__init__.py +13 -0
  40. streamlit/elements/alert.py +234 -0
  41. streamlit/elements/arrow.py +962 -0
  42. streamlit/elements/balloons.py +47 -0
  43. streamlit/elements/bokeh_chart.py +133 -0
  44. streamlit/elements/code.py +114 -0
  45. streamlit/elements/deck_gl_json_chart.py +546 -0
  46. streamlit/elements/dialog_decorator.py +267 -0
  47. streamlit/elements/doc_string.py +558 -0
  48. streamlit/elements/empty.py +130 -0
  49. streamlit/elements/exception.py +331 -0
  50. streamlit/elements/form.py +354 -0
  51. streamlit/elements/graphviz_chart.py +150 -0
  52. streamlit/elements/heading.py +302 -0
  53. streamlit/elements/html.py +105 -0
  54. streamlit/elements/iframe.py +191 -0
  55. streamlit/elements/image.py +196 -0
  56. streamlit/elements/json.py +139 -0
  57. streamlit/elements/layouts.py +879 -0
  58. streamlit/elements/lib/__init__.py +13 -0
  59. streamlit/elements/lib/built_in_chart_utils.py +1157 -0
  60. streamlit/elements/lib/color_util.py +263 -0
  61. streamlit/elements/lib/column_config_utils.py +542 -0
  62. streamlit/elements/lib/column_types.py +2188 -0
  63. streamlit/elements/lib/dialog.py +147 -0
  64. streamlit/elements/lib/dicttools.py +154 -0
  65. streamlit/elements/lib/event_utils.py +37 -0
  66. streamlit/elements/lib/file_uploader_utils.py +66 -0
  67. streamlit/elements/lib/form_utils.py +77 -0
  68. streamlit/elements/lib/image_utils.py +441 -0
  69. streamlit/elements/lib/js_number.py +105 -0
  70. streamlit/elements/lib/mutable_status_container.py +183 -0
  71. streamlit/elements/lib/options_selector_utils.py +250 -0
  72. streamlit/elements/lib/pandas_styler_utils.py +274 -0
  73. streamlit/elements/lib/policies.py +194 -0
  74. streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
  75. streamlit/elements/lib/subtitle_utils.py +176 -0
  76. streamlit/elements/lib/utils.py +250 -0
  77. streamlit/elements/map.py +508 -0
  78. streamlit/elements/markdown.py +277 -0
  79. streamlit/elements/media.py +793 -0
  80. streamlit/elements/metric.py +301 -0
  81. streamlit/elements/plotly_chart.py +546 -0
  82. streamlit/elements/progress.py +156 -0
  83. streamlit/elements/pyplot.py +194 -0
  84. streamlit/elements/snow.py +47 -0
  85. streamlit/elements/spinner.py +113 -0
  86. streamlit/elements/text.py +76 -0
  87. streamlit/elements/toast.py +98 -0
  88. streamlit/elements/vega_charts.py +1984 -0
  89. streamlit/elements/widgets/__init__.py +13 -0
  90. streamlit/elements/widgets/audio_input.py +310 -0
  91. streamlit/elements/widgets/button.py +1123 -0
  92. streamlit/elements/widgets/button_group.py +1008 -0
  93. streamlit/elements/widgets/camera_input.py +263 -0
  94. streamlit/elements/widgets/chat.py +647 -0
  95. streamlit/elements/widgets/checkbox.py +352 -0
  96. streamlit/elements/widgets/color_picker.py +265 -0
  97. streamlit/elements/widgets/data_editor.py +983 -0
  98. streamlit/elements/widgets/file_uploader.py +486 -0
  99. streamlit/elements/widgets/multiselect.py +338 -0
  100. streamlit/elements/widgets/number_input.py +545 -0
  101. streamlit/elements/widgets/radio.py +407 -0
  102. streamlit/elements/widgets/select_slider.py +437 -0
  103. streamlit/elements/widgets/selectbox.py +366 -0
  104. streamlit/elements/widgets/slider.py +880 -0
  105. streamlit/elements/widgets/text_widgets.py +628 -0
  106. streamlit/elements/widgets/time_widgets.py +970 -0
  107. streamlit/elements/write.py +574 -0
  108. streamlit/emojis.py +34 -0
  109. streamlit/env_util.py +61 -0
  110. streamlit/error_util.py +105 -0
  111. streamlit/errors.py +452 -0
  112. streamlit/external/__init__.py +13 -0
  113. streamlit/external/langchain/__init__.py +23 -0
  114. streamlit/external/langchain/streamlit_callback_handler.py +406 -0
  115. streamlit/file_util.py +247 -0
  116. streamlit/git_util.py +173 -0
  117. streamlit/hello/__init__.py +13 -0
  118. streamlit/hello/animation_demo.py +82 -0
  119. streamlit/hello/dataframe_demo.py +71 -0
  120. streamlit/hello/hello.py +37 -0
  121. streamlit/hello/mapping_demo.py +114 -0
  122. streamlit/hello/plotting_demo.py +55 -0
  123. streamlit/hello/streamlit_app.py +55 -0
  124. streamlit/hello/utils.py +28 -0
  125. streamlit/logger.py +130 -0
  126. streamlit/material_icon_names.py +25 -0
  127. streamlit/navigation/__init__.py +13 -0
  128. streamlit/navigation/page.py +302 -0
  129. streamlit/net_util.py +125 -0
  130. streamlit/platform.py +33 -0
  131. streamlit/proto/Alert_pb2.py +29 -0
  132. streamlit/proto/Alert_pb2.pyi +90 -0
  133. streamlit/proto/AppPage_pb2.py +27 -0
  134. streamlit/proto/AppPage_pb2.pyi +64 -0
  135. streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
  136. streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
  137. streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
  138. streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
  139. streamlit/proto/Arrow_pb2.py +33 -0
  140. streamlit/proto/Arrow_pb2.pyi +188 -0
  141. streamlit/proto/AudioInput_pb2.py +28 -0
  142. streamlit/proto/AudioInput_pb2.pyi +58 -0
  143. streamlit/proto/Audio_pb2.py +27 -0
  144. streamlit/proto/Audio_pb2.pyi +58 -0
  145. streamlit/proto/AuthRedirect_pb2.py +27 -0
  146. streamlit/proto/AuthRedirect_pb2.pyi +41 -0
  147. streamlit/proto/AutoRerun_pb2.py +27 -0
  148. streamlit/proto/AutoRerun_pb2.pyi +45 -0
  149. streamlit/proto/BackMsg_pb2.py +29 -0
  150. streamlit/proto/BackMsg_pb2.pyi +105 -0
  151. streamlit/proto/Balloons_pb2.py +27 -0
  152. streamlit/proto/Balloons_pb2.pyi +43 -0
  153. streamlit/proto/Block_pb2.py +53 -0
  154. streamlit/proto/Block_pb2.pyi +322 -0
  155. streamlit/proto/BokehChart_pb2.py +27 -0
  156. streamlit/proto/BokehChart_pb2.pyi +49 -0
  157. streamlit/proto/ButtonGroup_pb2.py +36 -0
  158. streamlit/proto/ButtonGroup_pb2.pyi +169 -0
  159. streamlit/proto/Button_pb2.py +27 -0
  160. streamlit/proto/Button_pb2.pyi +71 -0
  161. streamlit/proto/CameraInput_pb2.py +28 -0
  162. streamlit/proto/CameraInput_pb2.pyi +58 -0
  163. streamlit/proto/ChatInput_pb2.py +31 -0
  164. streamlit/proto/ChatInput_pb2.pyi +111 -0
  165. streamlit/proto/Checkbox_pb2.py +30 -0
  166. streamlit/proto/Checkbox_pb2.pyi +90 -0
  167. streamlit/proto/ClientState_pb2.py +30 -0
  168. streamlit/proto/ClientState_pb2.pyi +90 -0
  169. streamlit/proto/Code_pb2.py +27 -0
  170. streamlit/proto/Code_pb2.pyi +55 -0
  171. streamlit/proto/ColorPicker_pb2.py +28 -0
  172. streamlit/proto/ColorPicker_pb2.pyi +67 -0
  173. streamlit/proto/Common_pb2.py +51 -0
  174. streamlit/proto/Common_pb2.pyi +293 -0
  175. streamlit/proto/Components_pb2.py +35 -0
  176. streamlit/proto/Components_pb2.pyi +172 -0
  177. streamlit/proto/DataFrame_pb2.py +56 -0
  178. streamlit/proto/DataFrame_pb2.pyi +397 -0
  179. streamlit/proto/DateInput_pb2.py +28 -0
  180. streamlit/proto/DateInput_pb2.pyi +83 -0
  181. streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
  182. streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
  183. streamlit/proto/Delta_pb2.py +31 -0
  184. streamlit/proto/Delta_pb2.pyi +74 -0
  185. streamlit/proto/DocString_pb2.py +29 -0
  186. streamlit/proto/DocString_pb2.pyi +93 -0
  187. streamlit/proto/DownloadButton_pb2.py +27 -0
  188. streamlit/proto/DownloadButton_pb2.pyi +70 -0
  189. streamlit/proto/Element_pb2.py +78 -0
  190. streamlit/proto/Element_pb2.pyi +312 -0
  191. streamlit/proto/Empty_pb2.py +27 -0
  192. streamlit/proto/Empty_pb2.pyi +36 -0
  193. streamlit/proto/Exception_pb2.py +27 -0
  194. streamlit/proto/Exception_pb2.pyi +72 -0
  195. streamlit/proto/Favicon_pb2.py +27 -0
  196. streamlit/proto/Favicon_pb2.pyi +40 -0
  197. streamlit/proto/FileUploader_pb2.py +28 -0
  198. streamlit/proto/FileUploader_pb2.pyi +78 -0
  199. streamlit/proto/ForwardMsg_pb2.py +53 -0
  200. streamlit/proto/ForwardMsg_pb2.pyi +293 -0
  201. streamlit/proto/GitInfo_pb2.py +29 -0
  202. streamlit/proto/GitInfo_pb2.pyi +83 -0
  203. streamlit/proto/GraphVizChart_pb2.py +27 -0
  204. streamlit/proto/GraphVizChart_pb2.pyi +53 -0
  205. streamlit/proto/Heading_pb2.py +27 -0
  206. streamlit/proto/Heading_pb2.pyi +56 -0
  207. streamlit/proto/Html_pb2.py +27 -0
  208. streamlit/proto/Html_pb2.pyi +42 -0
  209. streamlit/proto/IFrame_pb2.py +27 -0
  210. streamlit/proto/IFrame_pb2.pyi +59 -0
  211. streamlit/proto/Image_pb2.py +29 -0
  212. streamlit/proto/Image_pb2.pyi +84 -0
  213. streamlit/proto/Json_pb2.py +27 -0
  214. streamlit/proto/Json_pb2.pyi +53 -0
  215. streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
  216. streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
  217. streamlit/proto/LinkButton_pb2.py +27 -0
  218. streamlit/proto/LinkButton_pb2.pyi +58 -0
  219. streamlit/proto/Logo_pb2.py +27 -0
  220. streamlit/proto/Logo_pb2.pyi +51 -0
  221. streamlit/proto/Markdown_pb2.py +29 -0
  222. streamlit/proto/Markdown_pb2.pyi +86 -0
  223. streamlit/proto/Metric_pb2.py +32 -0
  224. streamlit/proto/Metric_pb2.pyi +101 -0
  225. streamlit/proto/MetricsEvent_pb2.py +30 -0
  226. streamlit/proto/MetricsEvent_pb2.pyi +200 -0
  227. streamlit/proto/MultiSelect_pb2.py +28 -0
  228. streamlit/proto/MultiSelect_pb2.pyi +81 -0
  229. streamlit/proto/NamedDataSet_pb2.py +28 -0
  230. streamlit/proto/NamedDataSet_pb2.pyi +59 -0
  231. streamlit/proto/Navigation_pb2.py +30 -0
  232. streamlit/proto/Navigation_pb2.pyi +84 -0
  233. streamlit/proto/NewSession_pb2.py +51 -0
  234. streamlit/proto/NewSession_pb2.pyi +481 -0
  235. streamlit/proto/NumberInput_pb2.py +30 -0
  236. streamlit/proto/NumberInput_pb2.pyi +121 -0
  237. streamlit/proto/PageConfig_pb2.py +33 -0
  238. streamlit/proto/PageConfig_pb2.pyi +126 -0
  239. streamlit/proto/PageInfo_pb2.py +27 -0
  240. streamlit/proto/PageInfo_pb2.pyi +43 -0
  241. streamlit/proto/PageLink_pb2.py +27 -0
  242. streamlit/proto/PageLink_pb2.pyi +63 -0
  243. streamlit/proto/PageNotFound_pb2.py +27 -0
  244. streamlit/proto/PageNotFound_pb2.pyi +42 -0
  245. streamlit/proto/PageProfile_pb2.py +31 -0
  246. streamlit/proto/PageProfile_pb2.pyi +127 -0
  247. streamlit/proto/PagesChanged_pb2.py +28 -0
  248. streamlit/proto/PagesChanged_pb2.pyi +48 -0
  249. streamlit/proto/ParentMessage_pb2.py +27 -0
  250. streamlit/proto/ParentMessage_pb2.pyi +46 -0
  251. streamlit/proto/PlotlyChart_pb2.py +31 -0
  252. streamlit/proto/PlotlyChart_pb2.pyi +131 -0
  253. streamlit/proto/Progress_pb2.py +27 -0
  254. streamlit/proto/Progress_pb2.pyi +43 -0
  255. streamlit/proto/Radio_pb2.py +28 -0
  256. streamlit/proto/Radio_pb2.pyi +84 -0
  257. streamlit/proto/RootContainer_pb2.py +27 -0
  258. streamlit/proto/RootContainer_pb2.pyi +56 -0
  259. streamlit/proto/Selectbox_pb2.py +28 -0
  260. streamlit/proto/Selectbox_pb2.pyi +80 -0
  261. streamlit/proto/SessionEvent_pb2.py +28 -0
  262. streamlit/proto/SessionEvent_pb2.pyi +62 -0
  263. streamlit/proto/SessionStatus_pb2.py +27 -0
  264. streamlit/proto/SessionStatus_pb2.pyi +57 -0
  265. streamlit/proto/Skeleton_pb2.py +29 -0
  266. streamlit/proto/Skeleton_pb2.pyi +71 -0
  267. streamlit/proto/Slider_pb2.py +32 -0
  268. streamlit/proto/Slider_pb2.pyi +142 -0
  269. streamlit/proto/Snow_pb2.py +27 -0
  270. streamlit/proto/Snow_pb2.pyi +43 -0
  271. streamlit/proto/Spinner_pb2.py +27 -0
  272. streamlit/proto/Spinner_pb2.pyi +49 -0
  273. streamlit/proto/TextArea_pb2.py +28 -0
  274. streamlit/proto/TextArea_pb2.pyi +80 -0
  275. streamlit/proto/TextInput_pb2.py +30 -0
  276. streamlit/proto/TextInput_pb2.pyi +107 -0
  277. streamlit/proto/Text_pb2.py +27 -0
  278. streamlit/proto/Text_pb2.pyi +46 -0
  279. streamlit/proto/TimeInput_pb2.py +28 -0
  280. streamlit/proto/TimeInput_pb2.pyi +74 -0
  281. streamlit/proto/Toast_pb2.py +27 -0
  282. streamlit/proto/Toast_pb2.pyi +45 -0
  283. streamlit/proto/VegaLiteChart_pb2.py +29 -0
  284. streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
  285. streamlit/proto/Video_pb2.py +31 -0
  286. streamlit/proto/Video_pb2.pyi +117 -0
  287. streamlit/proto/WidgetStates_pb2.py +31 -0
  288. streamlit/proto/WidgetStates_pb2.pyi +126 -0
  289. streamlit/proto/__init__.py +15 -0
  290. streamlit/proto/openmetrics_data_model_pb2.py +60 -0
  291. streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
  292. streamlit/py.typed +0 -0
  293. streamlit/runtime/__init__.py +50 -0
  294. streamlit/runtime/app_session.py +982 -0
  295. streamlit/runtime/caching/__init__.py +98 -0
  296. streamlit/runtime/caching/cache_data_api.py +665 -0
  297. streamlit/runtime/caching/cache_errors.py +142 -0
  298. streamlit/runtime/caching/cache_resource_api.py +527 -0
  299. streamlit/runtime/caching/cache_type.py +33 -0
  300. streamlit/runtime/caching/cache_utils.py +523 -0
  301. streamlit/runtime/caching/cached_message_replay.py +290 -0
  302. streamlit/runtime/caching/hashing.py +637 -0
  303. streamlit/runtime/caching/legacy_cache_api.py +169 -0
  304. streamlit/runtime/caching/storage/__init__.py +29 -0
  305. streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
  306. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  307. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
  308. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  309. streamlit/runtime/connection_factory.py +436 -0
  310. streamlit/runtime/context.py +280 -0
  311. streamlit/runtime/credentials.py +364 -0
  312. streamlit/runtime/forward_msg_cache.py +296 -0
  313. streamlit/runtime/forward_msg_queue.py +240 -0
  314. streamlit/runtime/fragment.py +477 -0
  315. streamlit/runtime/media_file_manager.py +234 -0
  316. streamlit/runtime/media_file_storage.py +143 -0
  317. streamlit/runtime/memory_media_file_storage.py +181 -0
  318. streamlit/runtime/memory_session_storage.py +77 -0
  319. streamlit/runtime/memory_uploaded_file_manager.py +138 -0
  320. streamlit/runtime/metrics_util.py +486 -0
  321. streamlit/runtime/pages_manager.py +165 -0
  322. streamlit/runtime/runtime.py +792 -0
  323. streamlit/runtime/runtime_util.py +106 -0
  324. streamlit/runtime/script_data.py +46 -0
  325. streamlit/runtime/scriptrunner/__init__.py +38 -0
  326. streamlit/runtime/scriptrunner/exec_code.py +159 -0
  327. streamlit/runtime/scriptrunner/magic.py +273 -0
  328. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  329. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  330. streamlit/runtime/scriptrunner/script_runner.py +756 -0
  331. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  332. streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
  333. streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
  334. streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
  335. streamlit/runtime/secrets.py +534 -0
  336. streamlit/runtime/session_manager.py +394 -0
  337. streamlit/runtime/state/__init__.py +41 -0
  338. streamlit/runtime/state/common.py +191 -0
  339. streamlit/runtime/state/query_params.py +205 -0
  340. streamlit/runtime/state/query_params_proxy.py +218 -0
  341. streamlit/runtime/state/safe_session_state.py +138 -0
  342. streamlit/runtime/state/session_state.py +772 -0
  343. streamlit/runtime/state/session_state_proxy.py +153 -0
  344. streamlit/runtime/state/widgets.py +135 -0
  345. streamlit/runtime/stats.py +109 -0
  346. streamlit/runtime/uploaded_file_manager.py +148 -0
  347. streamlit/runtime/websocket_session_manager.py +167 -0
  348. streamlit/source_util.py +98 -0
  349. streamlit/static/favicon.png +0 -0
  350. streamlit/static/index.html +61 -0
  351. streamlit/static/static/css/index.Bmkmz40k.css +1 -0
  352. streamlit/static/static/css/index.DpJG_94W.css +1 -0
  353. streamlit/static/static/css/index.DzuxGC_t.css +1 -0
  354. streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
  355. streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
  356. streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
  357. streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
  358. streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
  359. streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
  360. streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
  361. streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
  362. streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
  363. streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
  364. streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
  365. streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
  366. streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
  367. streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
  368. streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
  369. streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
  370. streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
  371. streamlit/static/static/js/index.08vcOOvb.js +1 -0
  372. streamlit/static/static/js/index.0uqKfJUS.js +1 -0
  373. streamlit/static/static/js/index.B02M5u69.js +203 -0
  374. streamlit/static/static/js/index.B7mcZKMx.js +1 -0
  375. streamlit/static/static/js/index.BAQDHFA_.js +1 -0
  376. streamlit/static/static/js/index.BI60cMVr.js +2 -0
  377. streamlit/static/static/js/index.BLug2inK.js +1 -0
  378. streamlit/static/static/js/index.BM6TMY8g.js +2 -0
  379. streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
  380. streamlit/static/static/js/index.BZqa87a1.js +2 -0
  381. streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
  382. streamlit/static/static/js/index.BgVMiY_P.js +197 -0
  383. streamlit/static/static/js/index.BtuGy7By.js +6 -0
  384. streamlit/static/static/js/index.BuDuBmrs.js +1 -0
  385. streamlit/static/static/js/index.BvXU2oKV.js +1 -0
  386. streamlit/static/static/js/index.BxcwPacT.js +73 -0
  387. streamlit/static/static/js/index.CWX8KB81.js +1 -0
  388. streamlit/static/static/js/index.CXzZTo_q.js +1 -0
  389. streamlit/static/static/js/index.CcRWp_KL.js +1 -0
  390. streamlit/static/static/js/index.Cd-_xe55.js +3 -0
  391. streamlit/static/static/js/index.CdG2PXln.js +4537 -0
  392. streamlit/static/static/js/index.CjXvXmcP.js +1 -0
  393. streamlit/static/static/js/index.D1HZENZx.js +776 -0
  394. streamlit/static/static/js/index.D21Efo64.js +1617 -0
  395. streamlit/static/static/js/index.D9WgGVBx.js +7 -0
  396. streamlit/static/static/js/index.DEcsHtvb.js +12 -0
  397. streamlit/static/static/js/index.DFeMfr_K.js +1 -0
  398. streamlit/static/static/js/index.DHFBoItz.js +1 -0
  399. streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
  400. streamlit/static/static/js/index.DmuRkekN.js +3855 -0
  401. streamlit/static/static/js/index.Do6eY8sf.js +1 -0
  402. streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
  403. streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
  404. streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
  405. streamlit/static/static/js/index.H1U1IC_d.js +3 -0
  406. streamlit/static/static/js/index.g6p_4DPr.js +1 -0
  407. streamlit/static/static/js/index.g9x_GKss.js +1 -0
  408. streamlit/static/static/js/index.zo9jm08y.js +1 -0
  409. streamlit/static/static/js/input.DnaFglHq.js +2 -0
  410. streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
  411. streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
  412. streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
  413. streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
  414. streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
  415. streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
  416. streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
  417. streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
  418. streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
  419. streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
  420. streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
  421. streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
  422. streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
  423. streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
  424. streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
  425. streamlit/static/static/js/value.CgPGBV_l.js +1 -0
  426. streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
  427. streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
  428. streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
  429. streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
  430. streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
  431. streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
  432. streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
  433. streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
  434. streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
  435. streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
  436. streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
  437. streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
  438. streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
  439. streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
  440. streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
  441. streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
  442. streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
  443. streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
  444. streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
  445. streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
  446. streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
  447. streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
  448. streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
  449. streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
  450. streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
  451. streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
  452. streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
  453. streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
  454. streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
  455. streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
  456. streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
  457. streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
  458. streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
  459. streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
  460. streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
  461. streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
  462. streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
  463. streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
  464. streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
  465. streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
  466. streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
  467. streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
  468. streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
  469. streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
  470. streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
  471. streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
  472. streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
  473. streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
  474. streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
  475. streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
  476. streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
  477. streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
  478. streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
  479. streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
  480. streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
  481. streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
  482. streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
  483. streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
  484. streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
  485. streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
  486. streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
  487. streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
  488. streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
  489. streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
  490. streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
  491. streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
  492. streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
  493. streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
  494. streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
  495. streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
  496. streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
  497. streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
  498. streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
  499. streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
  500. streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
  501. streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
  502. streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
  503. streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
  504. streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
  505. streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
  506. streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
  507. streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
  508. streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
  509. streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
  510. streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
  511. streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
  512. streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
  513. streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
  514. streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
  515. streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
  516. streamlit/string_util.py +203 -0
  517. streamlit/temporary_directory.py +56 -0
  518. streamlit/testing/__init__.py +13 -0
  519. streamlit/testing/v1/__init__.py +17 -0
  520. streamlit/testing/v1/app_test.py +1050 -0
  521. streamlit/testing/v1/element_tree.py +2083 -0
  522. streamlit/testing/v1/local_script_runner.py +180 -0
  523. streamlit/testing/v1/util.py +53 -0
  524. streamlit/time_util.py +75 -0
  525. streamlit/type_util.py +460 -0
  526. streamlit/url_util.py +122 -0
  527. streamlit/user_info.py +519 -0
  528. streamlit/util.py +72 -0
  529. streamlit/vendor/__init__.py +0 -0
  530. streamlit/vendor/pympler/__init__.py +0 -0
  531. streamlit/vendor/pympler/asizeof.py +2869 -0
  532. streamlit/version.py +18 -0
  533. streamlit/watcher/__init__.py +28 -0
  534. streamlit/watcher/event_based_path_watcher.py +406 -0
  535. streamlit/watcher/folder_black_list.py +82 -0
  536. streamlit/watcher/local_sources_watcher.py +233 -0
  537. streamlit/watcher/path_watcher.py +185 -0
  538. streamlit/watcher/polling_path_watcher.py +124 -0
  539. streamlit/watcher/util.py +207 -0
  540. streamlit/web/__init__.py +13 -0
  541. streamlit/web/bootstrap.py +353 -0
  542. streamlit/web/cache_storage_manager_config.py +38 -0
  543. streamlit/web/cli.py +369 -0
  544. streamlit/web/server/__init__.py +26 -0
  545. streamlit/web/server/app_static_file_handler.py +93 -0
  546. streamlit/web/server/authlib_tornado_integration.py +60 -0
  547. streamlit/web/server/browser_websocket_handler.py +246 -0
  548. streamlit/web/server/component_request_handler.py +116 -0
  549. streamlit/web/server/media_file_handler.py +141 -0
  550. streamlit/web/server/oauth_authlib_routes.py +176 -0
  551. streamlit/web/server/oidc_mixin.py +108 -0
  552. streamlit/web/server/routes.py +295 -0
  553. streamlit/web/server/server.py +479 -0
  554. streamlit/web/server/server_util.py +161 -0
  555. streamlit/web/server/stats_request_handler.py +95 -0
  556. streamlit/web/server/upload_file_request_handler.py +137 -0
  557. streamlit/web/server/websocket_headers.py +56 -0
  558. streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
  559. streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
  560. streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
  561. streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
  562. streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
  563. 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)