streamlit 1.50.0__py3-none-any.whl → 1.52.0__py3-none-any.whl

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