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
@@ -12,8 +12,6 @@
12
12
  # See the License for the specific language governing permissions and
13
13
  # limitations under the License.
14
14
 
15
- """Streamlit support for Plotly charts."""
16
-
17
15
  from __future__ import annotations
18
16
 
19
17
  import json
@@ -23,23 +21,35 @@ from typing import (
23
21
  Any,
24
22
  Final,
25
23
  Literal,
24
+ TypeAlias,
26
25
  TypedDict,
27
26
  Union,
28
27
  cast,
29
28
  overload,
30
29
  )
31
30
 
32
- from typing_extensions import Required, TypeAlias
31
+ from typing_extensions import Required
33
32
 
34
33
  from streamlit import type_util
35
- from streamlit.deprecation_util import show_deprecation_warning
34
+ from streamlit.deprecation_util import (
35
+ make_deprecated_name_warning,
36
+ show_deprecation_warning,
37
+ )
36
38
  from streamlit.elements.lib.form_utils import current_form_id
39
+ from streamlit.elements.lib.layout_utils import (
40
+ Height,
41
+ LayoutConfig,
42
+ Width,
43
+ validate_height,
44
+ validate_width,
45
+ )
37
46
  from streamlit.elements.lib.policies import check_widget_policies
38
47
  from streamlit.elements.lib.streamlit_plotly_theme import (
39
48
  configure_streamlit_plotly_theme,
40
49
  )
41
50
  from streamlit.elements.lib.utils import Key, compute_and_register_element_id, to_key
42
51
  from streamlit.errors import StreamlitAPIException
52
+ from streamlit.logger import get_logger
43
53
  from streamlit.proto.PlotlyChart_pb2 import PlotlyChart as PlotlyChartProto
44
54
  from streamlit.runtime.metrics_util import gather_metrics
45
55
  from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
@@ -76,6 +86,8 @@ FigureOrData: TypeAlias = Union[
76
86
  SelectionMode: TypeAlias = Literal["lasso", "points", "box"]
77
87
  _SELECTION_MODES: Final[set[SelectionMode]] = {"lasso", "points", "box"}
78
88
 
89
+ _LOGGER: Final = get_logger(__name__)
90
+
79
91
 
80
92
  class PlotlySelectionState(TypedDict, total=False):
81
93
  """
@@ -267,13 +279,109 @@ def parse_selection_mode(
267
279
  return set(parsed_selection_modes)
268
280
 
269
281
 
282
+ def _resolve_content_width(width: Width, figure: Any) -> Width:
283
+ """Resolve "content" width by inspecting the figure's layout width.
284
+
285
+ For content width, we check if the plotly figure has an explicit width
286
+ in its layout. If so, we use that as a pixel width. If not, we default
287
+ to 700 pixels which matches the plotly.js default width.
288
+
289
+ Args
290
+ ----
291
+ width : Width
292
+ The original width parameter
293
+ figure : Any
294
+ The plotly figure object (Figure, dict, or other supported formats)
295
+
296
+ Returns
297
+ -------
298
+ Width
299
+ The resolved width (either original width, figure width as pixels, or 700)
300
+ """
301
+
302
+ if width != "content":
303
+ return width
304
+
305
+ # Extract width from the figure's layout
306
+ # plotly.tools.mpl_to_plotly() returns Figure objects with .layout attribute
307
+ # plotly.tools.return_figure_from_figure_or_data() returns dictionaries
308
+ figure_width = None
309
+ if isinstance(figure, dict):
310
+ figure_width = figure.get("layout", {}).get("width")
311
+ else:
312
+ # Handle Figure objects from matplotlib conversion
313
+ try:
314
+ figure_width = figure.layout.width
315
+ except (AttributeError, TypeError):
316
+ _LOGGER.debug("Could not parse width from figure")
317
+
318
+ if (
319
+ figure_width is not None
320
+ and isinstance(figure_width, (int, float))
321
+ and figure_width > 0
322
+ ):
323
+ return int(figure_width)
324
+
325
+ # Default to 700 pixels (plotly.js default) when no width is specified
326
+ return 700
327
+
328
+
329
+ def _resolve_content_height(height: Height, figure: Any) -> Height:
330
+ """Resolve "content" height by inspecting the figure's layout height.
331
+
332
+ For content height, we check if the plotly figure has an explicit height
333
+ in its layout. If so, we use that as a pixel height. If not, we default
334
+ to 450 pixels which matches the plotly.js default height.
335
+
336
+ Args
337
+ ----
338
+ height : Height
339
+ The original height parameter
340
+ figure : Any
341
+ The plotly figure object (Figure, dict, or other supported formats)
342
+
343
+ Returns
344
+ -------
345
+ Height
346
+ The resolved height (either original height, figure height as pixels, or 450)
347
+ """
348
+
349
+ if height != "content":
350
+ return height
351
+
352
+ # Extract height from the figure's layout
353
+ # plotly.tools.mpl_to_plotly() returns Figure objects with .layout attribute
354
+ # plotly.tools.return_figure_from_figure_or_data() returns dictionaries
355
+ figure_height = None
356
+ if isinstance(figure, dict):
357
+ figure_height = figure.get("layout", {}).get("height")
358
+ else:
359
+ # Handle Figure objects from matplotlib conversion
360
+ try:
361
+ figure_height = figure.layout.height
362
+ except (AttributeError, TypeError):
363
+ _LOGGER.debug("Could not parse height from figure")
364
+
365
+ if (
366
+ figure_height is not None
367
+ and isinstance(figure_height, (int, float))
368
+ and figure_height > 0
369
+ ):
370
+ return int(figure_height)
371
+
372
+ # Default to 450 pixels (plotly.js default) when no height is specified
373
+ return 450
374
+
375
+
270
376
  class PlotlyMixin:
271
377
  @overload
272
378
  def plotly_chart(
273
379
  self,
274
380
  figure_or_data: FigureOrData,
275
- use_container_width: bool = True,
381
+ use_container_width: bool | None = None,
276
382
  *,
383
+ width: Width = "stretch",
384
+ height: Height = "content",
277
385
  theme: Literal["streamlit"] | None = "streamlit",
278
386
  key: Key | None = None,
279
387
  on_select: Literal["ignore"], # No default value here to make it work with mypy
@@ -289,8 +397,10 @@ class PlotlyMixin:
289
397
  def plotly_chart(
290
398
  self,
291
399
  figure_or_data: FigureOrData,
292
- use_container_width: bool = True,
400
+ use_container_width: bool | None = None,
293
401
  *,
402
+ width: Width = "stretch",
403
+ height: Height = "content",
294
404
  theme: Literal["streamlit"] | None = "streamlit",
295
405
  key: Key | None = None,
296
406
  on_select: Literal["rerun"] | WidgetCallback = "rerun",
@@ -306,8 +416,10 @@ class PlotlyMixin:
306
416
  def plotly_chart(
307
417
  self,
308
418
  figure_or_data: FigureOrData,
309
- use_container_width: bool = True,
419
+ use_container_width: bool | None = None,
310
420
  *,
421
+ width: Width = "stretch",
422
+ height: Height = "content",
311
423
  theme: Literal["streamlit"] | None = "streamlit",
312
424
  key: Key | None = None,
313
425
  on_select: Literal["rerun", "ignore"] | WidgetCallback = "ignore",
@@ -357,13 +469,46 @@ class PlotlyMixin:
357
469
  render in SVG mode when passed to ``st.plotly_chart``:
358
470
  ``px.line(df, x="x", y="y", render_mode="svg")``.
359
471
 
360
- use_container_width : bool
472
+ width : "stretch", "content", or int
473
+ The width of the chart element. This can be one of the following:
474
+
475
+ - ``"stretch"`` (default): The width of the element matches the
476
+ width of the parent container.
477
+ - ``"content"``: The width of the element matches the width of its
478
+ content, but doesn't exceed the width of the parent container.
479
+ - An integer specifying the width in pixels: The element has a
480
+ fixed width. If the specified width is greater than the width of
481
+ the parent container, the width of the element matches the width
482
+ of the parent container.
483
+
484
+ height : "content", "stretch", or int
485
+ The height of the chart element. This can be one of the following:
486
+
487
+ - ``"content"`` (default): The height of the element matches the
488
+ height of its content.
489
+ - ``"stretch"``: The height of the element matches the height of
490
+ its content or the height of the parent container, whichever is
491
+ larger. If the element is not in a parent container, the height
492
+ of the element matches the height of its content.
493
+ - An integer specifying the height in pixels: The element has a
494
+ fixed height. If the content is larger than the specified
495
+ height, scrolling is enabled.
496
+
497
+ use_container_width : bool or None
361
498
  Whether to override the figure's native width with the width of
362
- the parent container. If ``use_container_width`` is ``True`` (default),
363
- Streamlit sets the width of the figure to match the width of the parent
364
- container. If ``use_container_width`` is ``False``, Streamlit sets the
365
- width of the chart to fit its contents according to the plotting library,
366
- up to the width of the parent container.
499
+ the parent container. This can be one of the following:
500
+
501
+ - ``None`` (default): Streamlit will use the value of ``width``.
502
+ - ``True``: Streamlit sets the width of the figure to match the
503
+ width of the parent container.
504
+ - ``False``: Streamlit sets the width of the figure to fit its
505
+ contents according to the plotting library, up to the width of
506
+ the parent container.
507
+
508
+ .. deprecated::
509
+ ``use_container_width`` is deprecated and will be removed in a
510
+ future release. For ``use_container_width=True``, use
511
+ ``width="stretch"``.
367
512
 
368
513
  theme : "streamlit" or None
369
514
  The theme of the chart. If ``theme`` is ``"streamlit"`` (default),
@@ -497,6 +642,26 @@ class PlotlyMixin:
497
642
  height: 550px
498
643
 
499
644
  """
645
+ if use_container_width is not None:
646
+ show_deprecation_warning(
647
+ make_deprecated_name_warning(
648
+ "use_container_width",
649
+ "width",
650
+ "2025-12-31",
651
+ "For `use_container_width=True`, use `width='stretch'`. "
652
+ "For `use_container_width=False`, use `width='content'`.",
653
+ include_st_prefix=False,
654
+ ),
655
+ show_in_browser=False,
656
+ )
657
+ if use_container_width:
658
+ width = "stretch"
659
+ elif not isinstance(width, int):
660
+ width = "content"
661
+
662
+ validate_width(width, allow_content=True)
663
+ validate_height(height, allow_content=True)
664
+
500
665
  import plotly.io
501
666
  import plotly.tools
502
667
 
@@ -506,9 +671,10 @@ class PlotlyMixin:
506
671
 
507
672
  if kwargs:
508
673
  show_deprecation_warning(
509
- "The keyword arguments have been deprecated and will be removed "
510
- "in a future release. Use `config` instead to specify Plotly "
511
- "configuration options."
674
+ "Variable keyword arguments for `st.plotly_chart` have been "
675
+ "deprecated and will be removed in a future release. Use the "
676
+ "`config` argument instead to specify Plotly configuration "
677
+ "options."
512
678
  )
513
679
 
514
680
  if theme not in ["streamlit", None]:
@@ -549,7 +715,6 @@ class PlotlyMixin:
549
715
  )
550
716
 
551
717
  plotly_chart_proto = PlotlyChartProto()
552
- plotly_chart_proto.use_container_width = use_container_width
553
718
  plotly_chart_proto.theme = theme or ""
554
719
  plotly_chart_proto.form_id = current_form_id(self.dg)
555
720
 
@@ -572,9 +737,14 @@ class PlotlyMixin:
572
737
  selection_mode=selection_mode,
573
738
  is_selection_activated=is_selection_activated,
574
739
  theme=theme,
575
- use_container_width=use_container_width,
740
+ width=width,
741
+ height=height,
576
742
  )
577
743
 
744
+ # Handle "content" width and height by inspecting the figure's natural dimensions
745
+ final_width = _resolve_content_width(width, figure)
746
+ final_height = _resolve_content_height(height, figure)
747
+
578
748
  if is_selection_activated:
579
749
  # Selections are activated, treat plotly chart as a widget:
580
750
  plotly_chart_proto.selection_mode.extend(
@@ -592,9 +762,16 @@ class PlotlyMixin:
592
762
  value_type="string_value",
593
763
  )
594
764
 
595
- self.dg._enqueue("plotly_chart", plotly_chart_proto)
765
+ layout_config = LayoutConfig(width=final_width, height=final_height)
766
+ self.dg._enqueue(
767
+ "plotly_chart", plotly_chart_proto, layout_config=layout_config
768
+ )
596
769
  return widget_state.value
597
- return self.dg._enqueue("plotly_chart", plotly_chart_proto)
770
+
771
+ layout_config = LayoutConfig(width=final_width, height=final_height)
772
+ return self.dg._enqueue(
773
+ "plotly_chart", plotly_chart_proto, layout_config=layout_config
774
+ )
598
775
 
599
776
  @property
600
777
  def dg(self) -> DeltaGenerator:
@@ -15,9 +15,7 @@
15
15
  from __future__ import annotations
16
16
 
17
17
  import math
18
- from typing import TYPE_CHECKING, Union, cast
19
-
20
- from typing_extensions import TypeAlias
18
+ from typing import TYPE_CHECKING, TypeAlias, cast
21
19
 
22
20
  from streamlit.elements.lib.layout_utils import LayoutConfig, validate_width
23
21
  from streamlit.errors import StreamlitAPIException
@@ -31,7 +29,7 @@ if TYPE_CHECKING:
31
29
 
32
30
  # Currently, equates to just float, but we can't use `numbers.Real` due to
33
31
  # https://github.com/python/mypy/issues/3186
34
- FloatOrInt: TypeAlias = Union[int, float]
32
+ FloatOrInt: TypeAlias = int | float
35
33
 
36
34
 
37
35
  def _check_float_between(value: float, low: float = 0.0, high: float = 1.0) -> bool:
@@ -0,0 +1,113 @@
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, cast
18
+
19
+ from streamlit.elements.lib.layout_utils import (
20
+ LayoutConfig,
21
+ SpaceSize,
22
+ validate_space_size,
23
+ )
24
+ from streamlit.proto.Space_pb2 import Space as SpaceProto
25
+ from streamlit.runtime.metrics_util import gather_metrics
26
+
27
+ if TYPE_CHECKING:
28
+ from streamlit.delta_generator import DeltaGenerator
29
+
30
+
31
+ class SpaceMixin:
32
+ @gather_metrics("space")
33
+ def space(
34
+ self,
35
+ size: SpaceSize = "small",
36
+ ) -> DeltaGenerator:
37
+ """Add vertical or horizontal space.
38
+
39
+ This command adds space in the direction of its parent container. In
40
+ a vertical layout, it adds vertical space. In a horizontal layout, it
41
+ adds horizontal space.
42
+
43
+ Parameters
44
+ ----------
45
+ size : "small", "medium", "large", "stretch", or int
46
+ The size of the space. This can be one of the following values:
47
+
48
+ - ``"small"`` (default): 0.75rem, which is the height of a widget
49
+ label. This is useful for aligning buttons with labeled widgets.
50
+ - ``"medium"``: 2.5rem, which is the height of a button or
51
+ (unlabeled) input field.
52
+ - ``"large"``: 4.25rem, which is the height of a labeled input
53
+ field or unlabeled media widget, like `st.file_uploader`.
54
+ - ``"stretch"``: Expands to fill remaining space in the container.
55
+ - An integer: Fixed size in pixels.
56
+
57
+ Examples
58
+ --------
59
+ **Example 1: Use vertical space to align elements**
60
+
61
+ Use small spaces to replace label heights. Use medium spaces to replace
62
+ two label heights or a button.
63
+
64
+ >>> import streamlit as st
65
+ >>>
66
+ >>> left, middle, right = st.columns(3)
67
+ >>>
68
+ >>> left.space("medium")
69
+ >>> left.button("Left button", width="stretch")
70
+ >>>
71
+ >>> middle.space("small")
72
+ >>> middle.text_input("Middle input")
73
+ >>>
74
+ >>> right.audio_input("Right uploader")
75
+
76
+ .. output::
77
+ https://doc-space-vertical.streamlit.app/
78
+ height: 260px
79
+
80
+ **Example 2: Add horizontal space in a container**
81
+
82
+ Use stretch space to float elements left and right.
83
+
84
+ >>> import streamlit as st
85
+ >>>
86
+ >>> with st.container(horizontal=True):
87
+ ... st.button("Left")
88
+ ... st.space("stretch")
89
+ ... st.button("Right")
90
+
91
+ .. output::
92
+ https://doc-space-horizontal.streamlit.app/
93
+ height: 200px
94
+
95
+ """
96
+ space_proto = SpaceProto()
97
+
98
+ validate_space_size(size)
99
+
100
+ # In vertical layouts, size controls height.
101
+ # In horizontal layouts, size controls width.
102
+ # We set both width and height configs to the same size value.
103
+ # The frontend uses FlexContext to determine container direction and
104
+ # applies ONLY the relevant dimension (width for horizontal, height for vertical)
105
+ # to avoid unintended cross-axis spacing.
106
+ layout_config = LayoutConfig(width=size, height=size)
107
+
108
+ return self.dg._enqueue("space", space_proto, layout_config=layout_config)
109
+
110
+ @property
111
+ def dg(self) -> DeltaGenerator:
112
+ """Get our DeltaGenerator."""
113
+ return cast("DeltaGenerator", self)
@@ -88,7 +88,7 @@ def spinner(
88
88
  >>> st.success("Done!")
89
89
  >>> st.button("Rerun")
90
90
 
91
- .. output ::
91
+ .. output::
92
92
  https://doc-spinner.streamlit.app/
93
93
  height: 210px
94
94
 
@@ -23,7 +23,7 @@ from streamlit.string_util import clean_text
23
23
 
24
24
  if TYPE_CHECKING:
25
25
  from streamlit.delta_generator import DeltaGenerator
26
- from streamlit.elements.lib.layout_utils import Width
26
+ from streamlit.elements.lib.layout_utils import TextAlignment, Width
27
27
  from streamlit.type_util import SupportsStr
28
28
 
29
29
 
@@ -35,6 +35,7 @@ class TextMixin:
35
35
  *, # keyword-only arguments:
36
36
  help: str | None = None,
37
37
  width: Width = "content",
38
+ text_alignment: TextAlignment = "left",
38
39
  ) -> DeltaGenerator:
39
40
  r"""Write text without Markdown or HTML parsing.
40
41
 
@@ -69,13 +70,29 @@ class TextMixin:
69
70
  the parent container, the width of the element matches the width
70
71
  of the parent container.
71
72
 
73
+ text_alignment : "left", "center", "right", or "justify"
74
+ The horizontal alignment of the text within the element. This can
75
+ be one of the following:
76
+
77
+ - ``"left"`` (default): Text is aligned to the left edge.
78
+ - ``"center"``: Text is centered.
79
+ - ``"right"``: Text is aligned to the right edge.
80
+ - ``"justify"``: Text is justified (stretched to fill the available
81
+ width with the last line left-aligned).
82
+
83
+ .. note::
84
+ For text alignment to have a visible effect, the element's
85
+ width must be wider than its content. If you use
86
+ ``width="content"`` with short text, the alignment may not be
87
+ noticeable.
88
+
72
89
  Example
73
90
  -------
74
91
  >>> import streamlit as st
75
92
  >>>
76
93
  >>> st.text("This is text\n[and more text](that's not a Markdown link).")
77
94
 
78
- .. output ::
95
+ .. output::
79
96
  https://doc-text.streamlit.app/
80
97
  height: 220px
81
98
 
@@ -86,7 +103,7 @@ class TextMixin:
86
103
  text_proto.help = help
87
104
 
88
105
  validate_width(width, allow_content=True)
89
- layout_config = LayoutConfig(width=width)
106
+ layout_config = LayoutConfig(width=width, text_alignment=text_alignment)
90
107
 
91
108
  return self.dg._enqueue("text", text_proto, layout_config=layout_config)
92
109
 
@@ -80,6 +80,8 @@ class ToastMixin:
80
80
  <https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded>`_
81
81
  font library.
82
82
 
83
+ - ``"spinner"``: Displays a spinner as an icon.
84
+
83
85
  duration : "short", "long", "infinite", or int
84
86
  The time to display the toast message. This can be one of the
85
87
  following: