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,21 +16,19 @@ from __future__ import annotations
16
16
 
17
17
  import json
18
18
  import pickle
19
- from collections.abc import Iterator, KeysView, MutableMapping
19
+ from collections.abc import Iterator, KeysView, Mapping, MutableMapping
20
20
  from copy import deepcopy
21
21
  from dataclasses import dataclass, field, replace
22
22
  from typing import (
23
23
  TYPE_CHECKING,
24
24
  Any,
25
25
  Final,
26
- Union,
26
+ TypeAlias,
27
27
  cast,
28
28
  )
29
29
 
30
- from typing_extensions import TypeAlias
31
-
32
- import streamlit as st
33
30
  from streamlit import config, util
31
+ from streamlit.delta_generator_singletons import get_dg_singleton_instance
34
32
  from streamlit.errors import StreamlitAPIException, UnserializableSessionStateError
35
33
  from streamlit.proto.WidgetStates_pb2 import WidgetState as WidgetStateProto
36
34
  from streamlit.proto.WidgetStates_pb2 import WidgetStates as WidgetStatesProto
@@ -39,11 +37,14 @@ from streamlit.runtime.state.common import (
39
37
  RegisterWidgetResult,
40
38
  T,
41
39
  ValueFieldName,
40
+ WidgetArgs,
41
+ WidgetCallback,
42
42
  WidgetMetadata,
43
43
  is_array_value_field_name,
44
44
  is_element_id,
45
45
  is_keyed_element_id,
46
46
  )
47
+ from streamlit.runtime.state.presentation import apply_presenter
47
48
  from streamlit.runtime.state.query_params import QueryParams
48
49
  from streamlit.runtime.stats import CacheStat, CacheStatsProvider, group_stats
49
50
 
@@ -71,7 +72,7 @@ class Value:
71
72
  value: Any
72
73
 
73
74
 
74
- WState: TypeAlias = Union[Value, Serialized]
75
+ WState: TypeAlias = Value | Serialized
75
76
 
76
77
 
77
78
  @dataclass
@@ -228,7 +229,7 @@ class WStates(MutableMapping[str, Any]):
228
229
  if is_array_value_field_name(field):
229
230
  arr = getattr(widget, field)
230
231
  arr.data.extend(serialized)
231
- elif field == "json_value":
232
+ elif field in {"json_value", "json_trigger_value"}:
232
233
  setattr(widget, field, json.dumps(serialized))
233
234
  elif field == "file_uploader_state_value":
234
235
  widget.file_uploader_state_value.CopyFrom(serialized)
@@ -401,7 +402,7 @@ class SessionState:
401
402
 
402
403
  @property
403
404
  def filtered_state(self) -> dict[str, Any]:
404
- """The combined session and widget state, excluding keyless widgets."""
405
+ """The combined session and widget state, excluding keyless widgets and internal widgets."""
405
406
 
406
407
  wid_key_map = self._key_id_mapper.id_key_mapping
407
408
 
@@ -414,9 +415,10 @@ class SessionState:
414
415
  for k in self._keys():
415
416
  if not is_element_id(k) and not _is_internal_key(k):
416
417
  state[k] = self[k]
417
- elif is_keyed_element_id(k):
418
+ elif is_keyed_element_id(k) and not _is_internal_key(k):
418
419
  try:
419
420
  key = wid_key_map[k]
421
+ # Value returned by __getitem__ is already presented.
420
422
  state[key] = self[k]
421
423
  except KeyError:
422
424
  # Widget id no longer maps to a key, it is a not yet
@@ -466,7 +468,12 @@ class SessionState:
466
468
  # the "key" is a raw widget id, so get its associated user key for lookup
467
469
  key = wid_key_map[widget_id]
468
470
  try:
469
- return self._getitem(widget_id, key)
471
+ base_value = self._getitem(widget_id, key)
472
+ return (
473
+ apply_presenter(self, widget_id, base_value)
474
+ if widget_id is not None
475
+ else base_value
476
+ )
470
477
  except KeyError:
471
478
  raise KeyError(_missing_key_error_message(key))
472
479
 
@@ -576,19 +583,210 @@ class SessionState:
576
583
  self._call_callbacks()
577
584
 
578
585
  def _call_callbacks(self) -> None:
579
- """Call any callback associated with each widget whose value
580
- changed between the previous and current script runs.
581
- """
586
+ """Call callbacks for widgets whose value changed or whose trigger fired."""
582
587
  from streamlit.runtime.scriptrunner import RerunException
583
588
 
584
- changed_widget_ids = [
585
- wid for wid in self._new_widget_state if self._widget_changed(wid)
589
+ # Path 1: single callback.
590
+ changed_widget_ids_for_single_callback = [
591
+ wid
592
+ for wid in self._new_widget_state
593
+ if self._widget_changed(wid)
594
+ and (metadata := self._new_widget_state.widget_metadata.get(wid))
595
+ is not None
596
+ and metadata.callback is not None
586
597
  ]
587
- for wid in changed_widget_ids:
598
+
599
+ for wid in changed_widget_ids_for_single_callback:
588
600
  try:
589
601
  self._new_widget_state.call_callback(wid)
590
602
  except RerunException: # noqa: PERF203
591
- st.warning("Calling st.rerun() within a callback is a no-op.")
603
+ get_dg_singleton_instance().main_dg.warning(
604
+ "Calling st.rerun() within a callback is a no-op."
605
+ )
606
+
607
+ # Path 2: multiple callbacks.
608
+ widget_ids_to_process = list(self._new_widget_state.states.keys())
609
+
610
+ for wid in widget_ids_to_process:
611
+ metadata = self._new_widget_state.widget_metadata.get(wid)
612
+ if not metadata or metadata.callbacks is None:
613
+ continue
614
+
615
+ args = metadata.callback_args or ()
616
+ kwargs = metadata.callback_kwargs or {}
617
+
618
+ # 1) Trigger dispatch: bool + JSON trigger aggregator
619
+ self._dispatch_trigger_callbacks(wid, metadata, args, kwargs)
620
+
621
+ # 2) JSON value change dispatch
622
+ if metadata.value_type == "json_value":
623
+ self._dispatch_json_change_callbacks(wid, metadata, args, kwargs)
624
+
625
+ def _execute_widget_callback(
626
+ self,
627
+ callback_fn: WidgetCallback,
628
+ cb_metadata: WidgetMetadata[Any],
629
+ cb_args: WidgetArgs,
630
+ cb_kwargs: dict[str, Any],
631
+ ) -> None:
632
+ """Execute a widget callback with fragment-aware context.
633
+
634
+ If the widget belongs to a fragment, temporarily marks the current
635
+ script context as being inside a fragment callback to adapt rerun
636
+ semantics. Attempts to call ``st.rerun()`` inside a widget callback are
637
+ converted to a user-visible warning and treated as a no-op.
638
+
639
+ Parameters
640
+ ----------
641
+ callback_fn : WidgetCallback
642
+ The user-provided callback to execute.
643
+ cb_metadata : WidgetMetadata[Any]
644
+ Metadata of the widget associated with the callback.
645
+ cb_args : WidgetArgs
646
+ Positional arguments passed to the callback.
647
+ cb_kwargs : dict[str, Any]
648
+ Keyword arguments passed to the callback.
649
+ """
650
+ from streamlit.runtime.scriptrunner import RerunException
651
+
652
+ ctx = get_script_run_ctx()
653
+ if ctx and cb_metadata.fragment_id is not None:
654
+ ctx.in_fragment_callback = True
655
+ try:
656
+ callback_fn(*cb_args, **cb_kwargs)
657
+ except RerunException:
658
+ get_dg_singleton_instance().main_dg.warning(
659
+ "Calling st.rerun() within a callback is a no-op."
660
+ )
661
+ finally:
662
+ ctx.in_fragment_callback = False
663
+ else:
664
+ try:
665
+ callback_fn(*cb_args, **cb_kwargs)
666
+ except RerunException:
667
+ get_dg_singleton_instance().main_dg.warning(
668
+ "Calling st.rerun() within a callback is a no-op."
669
+ )
670
+
671
+ def _dispatch_trigger_callbacks(
672
+ self,
673
+ wid: str,
674
+ metadata: WidgetMetadata[Any],
675
+ args: WidgetArgs,
676
+ kwargs: dict[str, Any],
677
+ ) -> None:
678
+ """Dispatch trigger-style callbacks for a widget.
679
+
680
+ Handles the JSON trigger aggregator. The JSON payload may be a single
681
+ event dict or a list of event dicts; each event must contain an
682
+ ``"event"`` field that maps to the corresponding callback name in
683
+ ``metadata.callbacks``.
684
+
685
+ Examples
686
+ --------
687
+ A component with a "submit" callback:
688
+
689
+ >>> metadata.callbacks = {"submit": on_submit}
690
+
691
+ The frontend can send a single event payload:
692
+
693
+ >>> {"event": "submit", "value": "payload"}
694
+
695
+ Or a list of event payloads to be processed in order:
696
+
697
+ >>> [{"event": "edit", ...}, {"event": "submit", ...}]
698
+
699
+ Parameters
700
+ ----------
701
+ wid : str
702
+ The widget ID.
703
+ metadata : WidgetMetadata[Any]
704
+ Metadata for the widget, including registered callbacks.
705
+ args : WidgetArgs
706
+ Positional arguments forwarded to the callback.
707
+ kwargs : dict[str, Any]
708
+ Keyword arguments forwarded to the callback.
709
+ """
710
+ widget_proto_state = self._new_widget_state.get_serialized(wid)
711
+ if not widget_proto_state:
712
+ return
713
+
714
+ # JSON trigger aggregator: value is deserialized by metadata.deserializer
715
+ if widget_proto_state.json_trigger_value:
716
+ try:
717
+ deserialized = self._new_widget_state[wid]
718
+ except KeyError:
719
+ deserialized = None
720
+
721
+ payloads: list[object]
722
+ if isinstance(deserialized, list):
723
+ payloads = deserialized
724
+ else:
725
+ payloads = [deserialized]
726
+
727
+ for payload in payloads:
728
+ if isinstance(payload, dict):
729
+ event_name = cast("Mapping[str, object]", payload).get("event")
730
+ if isinstance(event_name, str) and metadata.callbacks:
731
+ cb = metadata.callbacks.get(event_name)
732
+ if cb is not None:
733
+ self._execute_widget_callback(cb, metadata, args, kwargs)
734
+
735
+ def _dispatch_json_change_callbacks(
736
+ self,
737
+ wid: str,
738
+ metadata: WidgetMetadata[Any],
739
+ args: WidgetArgs,
740
+ kwargs: dict[str, Any],
741
+ ) -> None:
742
+ """Dispatch change callbacks for JSON-valued widgets.
743
+
744
+ Computes a shallow diff between the new and old JSON maps and invokes
745
+ callbacks for keys that changed or were added/removed.
746
+
747
+ Parameters
748
+ ----------
749
+ wid : str
750
+ The widget ID.
751
+ metadata : WidgetMetadata[Any]
752
+ Metadata for the widget, including registered callbacks.
753
+ args : WidgetArgs
754
+ Positional arguments forwarded to the callback.
755
+ kwargs : dict[str, Any]
756
+ Keyword arguments forwarded to the callback.
757
+ """
758
+ if not metadata.callbacks:
759
+ return
760
+
761
+ try:
762
+ new_val = self._new_widget_state.get(wid)
763
+ except KeyError:
764
+ new_val = None
765
+ old_val = self._old_state.get(wid)
766
+
767
+ def unwrap(obj: object) -> dict[str, object]:
768
+ if not isinstance(obj, dict):
769
+ return {}
770
+
771
+ obj = cast("dict[str, Any]", obj)
772
+ if set(obj.keys()) == {"value"}:
773
+ value = obj.get("value")
774
+ if isinstance(value, dict):
775
+ return dict(value) # shallow copy
776
+
777
+ return dict(obj)
778
+
779
+ new_map = unwrap(new_val)
780
+ old_map = unwrap(old_val)
781
+
782
+ if new_map or old_map:
783
+ all_keys = new_map.keys() | old_map.keys()
784
+ changed_keys = {k for k in all_keys if old_map.get(k) != new_map.get(k)}
785
+
786
+ for key in changed_keys:
787
+ cb = metadata.callbacks.get(key)
788
+ if cb is not None:
789
+ self._execute_widget_callback(cb, metadata, args, kwargs)
592
790
 
593
791
  def _widget_changed(self, widget_id: str) -> bool:
594
792
  """True if the given widget's value changed between the previous
@@ -623,6 +821,7 @@ class SessionState:
623
821
  elif metadata.value_type in {
624
822
  "string_trigger_value",
625
823
  "chat_input_value",
824
+ "json_trigger_value",
626
825
  }:
627
826
  self._new_widget_state[state_id] = Value(None)
628
827
 
@@ -634,6 +833,7 @@ class SessionState:
634
833
  elif metadata.value_type in {
635
834
  "string_trigger_value",
636
835
  "chat_input_value",
836
+ "json_trigger_value",
637
837
  }:
638
838
  self._old_state[state_id] = None
639
839
 
@@ -663,6 +863,10 @@ class SessionState:
663
863
  )
664
864
  }
665
865
 
866
+ def _get_widget_metadata(self, widget_id: str) -> WidgetMetadata[Any] | None:
867
+ """Return the metadata for a widget id from the current widget state."""
868
+ return self._new_widget_state.widget_metadata.get(widget_id)
869
+
666
870
  def _set_widget_metadata(self, widget_metadata: WidgetMetadata[Any]) -> None:
667
871
  """Set a widget's metadata."""
668
872
  widget_id = widget_metadata.id
@@ -16,6 +16,7 @@ from __future__ import annotations
16
16
 
17
17
  from typing import TYPE_CHECKING
18
18
 
19
+ from streamlit.errors import StreamlitAPIException
19
20
  from streamlit.runtime.state.common import (
20
21
  RegisterWidgetResult,
21
22
  T,
@@ -26,6 +27,7 @@ from streamlit.runtime.state.common import (
26
27
  WidgetKwargs,
27
28
  WidgetMetadata,
28
29
  WidgetSerializer,
30
+ WidgetValuePresenter,
29
31
  user_key_from_element_id,
30
32
  )
31
33
 
@@ -39,10 +41,12 @@ def register_widget(
39
41
  deserializer: WidgetDeserializer[T],
40
42
  serializer: WidgetSerializer[T],
41
43
  ctx: ScriptRunContext | None,
44
+ callbacks: dict[str, WidgetCallback] | None = None,
42
45
  on_change_handler: WidgetCallback | None = None,
43
46
  args: WidgetArgs | None = None,
44
47
  kwargs: WidgetKwargs | None = None,
45
48
  value_type: ValueFieldName,
49
+ presenter: WidgetValuePresenter | None = None,
46
50
  ) -> RegisterWidgetResult[T]:
47
51
  """Register a widget with Streamlit, and return its current value.
48
52
  NOTE: This function should be called after the proto has been filled.
@@ -58,13 +62,15 @@ def register_widget(
58
62
  Called to convert a widget's value to its protobuf representation.
59
63
  ctx : ScriptRunContext or None
60
64
  Used to ensure uniqueness of widget IDs, and to look up widget values.
65
+ callbacks : dict[str, WidgetCallback] or None
66
+ A dictionary of callbacks for multi-callback support.
61
67
  on_change_handler : WidgetCallback or None
62
68
  An optional callback invoked when the widget's value changes.
63
69
  args : WidgetArgs or None
64
- args to pass to on_change_handler when invoked
70
+ Positional arguments to pass to the `on_change_handler` or `callbacks`.
65
71
  kwargs : WidgetKwargs or None
66
- kwargs to pass to on_change_handler when invoked
67
- value_type: ValueType
72
+ Keyword arguments to pass to the `on_change_handler` or `callbacks`.
73
+ value_type: ValueFieldName
68
74
  The value_type the widget is going to use.
69
75
  We use this information to start with a best-effort guess for the value_type
70
76
  of each widget. Once we actually receive a proto for a widget from the
@@ -72,6 +78,9 @@ def register_widget(
72
78
  not able to always rely on the proto as the type may be needed earlier.
73
79
  Thankfully, in these cases (when value_type == "trigger_value"), the static
74
80
  table here being slightly inaccurate should never pose a problem.
81
+ presenter : WidgetValuePresenter or None
82
+ An optional hook that allows a widget to customize how its value should be
83
+ presented.
75
84
 
76
85
 
77
86
  Returns
@@ -98,6 +107,11 @@ def register_widget(
98
107
  For both paths a widget return value is provided, allowing the widgets
99
108
  to be used in a non-streamlit setting.
100
109
  """
110
+ if on_change_handler is not None and callbacks is not None:
111
+ raise StreamlitAPIException(
112
+ "Cannot provide both `on_change` and `callbacks` to a widget."
113
+ )
114
+
101
115
  # Create the widget's updated metadata, and register it with session_state.
102
116
  metadata = WidgetMetadata(
103
117
  element_id,
@@ -105,9 +119,11 @@ def register_widget(
105
119
  serializer,
106
120
  value_type=value_type,
107
121
  callback=on_change_handler,
122
+ callbacks=callbacks,
108
123
  callback_args=args,
109
124
  callback_kwargs=kwargs,
110
125
  fragment_id=ctx.current_fragment_id if ctx else None,
126
+ presenter=presenter,
111
127
  )
112
128
  return register_widget_from_metadata(metadata, ctx)
113
129
 
@@ -14,7 +14,7 @@
14
14
 
15
15
  from __future__ import annotations
16
16
 
17
- from typing import TYPE_CHECKING, Callable, Final, cast
17
+ from typing import TYPE_CHECKING, Final, cast
18
18
 
19
19
  from streamlit.logger import get_logger
20
20
  from streamlit.runtime.app_session import AppSession
@@ -27,6 +27,8 @@ from streamlit.runtime.session_manager import (
27
27
  )
28
28
 
29
29
  if TYPE_CHECKING:
30
+ from collections.abc import Callable
31
+
30
32
  from streamlit.runtime.script_data import ScriptData
31
33
  from streamlit.runtime.scriptrunner.script_cache import ScriptCache
32
34
  from streamlit.runtime.uploaded_file_manager import UploadedFileManager
streamlit/source_util.py CHANGED
@@ -15,9 +15,9 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import re
18
- from typing import TYPE_CHECKING, TextIO, TypedDict
18
+ from typing import TYPE_CHECKING, TextIO, TypeAlias, TypedDict
19
19
 
20
- from typing_extensions import NotRequired, TypeAlias
20
+ from typing_extensions import NotRequired
21
21
 
22
22
  from streamlit.string_util import extract_leading_emoji
23
23
 
@@ -37,8 +37,8 @@
37
37
  <script>
38
38
  window.prerenderReady = false
39
39
  </script>
40
- <script type="module" crossorigin src="./static/js/index.6xX1278W.js"></script>
41
- <link rel="stylesheet" crossorigin href="./static/css/index.CIiu7Ygf.css">
40
+ <script type="module" crossorigin src="./static/js/index.DMxc2XFp.js"></script>
41
+ <link rel="stylesheet" crossorigin href="./static/css/index.BpABIXK9.css">
42
42
  </head>
43
43
  <body>
44
44
  <noscript>You need to enable JavaScript to run this app.</noscript>