streamlit-data-editor-plus 0.1.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 (456) hide show
  1. streamlit/__init__.py +292 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +583 -0
  4. streamlit/cli_util.py +107 -0
  5. streamlit/column_config.py +60 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +128 -0
  8. streamlit/commands/execution_control.py +318 -0
  9. streamlit/commands/logo.py +250 -0
  10. streamlit/commands/navigation.py +430 -0
  11. streamlit/commands/page_config.py +335 -0
  12. streamlit/components/__init__.py +13 -0
  13. streamlit/components/lib/__init__.py +13 -0
  14. streamlit/components/lib/local_component_registry.py +84 -0
  15. streamlit/components/types/__init__.py +13 -0
  16. streamlit/components/types/base_component_registry.py +99 -0
  17. streamlit/components/types/base_custom_component.py +158 -0
  18. streamlit/components/v1/__init__.py +29 -0
  19. streamlit/components/v1/component_arrow.py +141 -0
  20. streamlit/components/v1/component_registry.py +147 -0
  21. streamlit/components/v1/components.py +38 -0
  22. streamlit/components/v1/custom_component.py +239 -0
  23. streamlit/components/v2/__init__.py +531 -0
  24. streamlit/components/v2/bidi_component/__init__.py +20 -0
  25. streamlit/components/v2/bidi_component/constants.py +29 -0
  26. streamlit/components/v2/bidi_component/main.py +537 -0
  27. streamlit/components/v2/bidi_component/serialization.py +272 -0
  28. streamlit/components/v2/bidi_component/state.py +92 -0
  29. streamlit/components/v2/component_definition_resolver.py +143 -0
  30. streamlit/components/v2/component_file_watcher.py +403 -0
  31. streamlit/components/v2/component_manager.py +439 -0
  32. streamlit/components/v2/component_manifest_handler.py +122 -0
  33. streamlit/components/v2/component_path_utils.py +233 -0
  34. streamlit/components/v2/component_registry.py +426 -0
  35. streamlit/components/v2/get_bidi_component_manager.py +51 -0
  36. streamlit/components/v2/manifest_scanner.py +620 -0
  37. streamlit/components/v2/presentation.py +198 -0
  38. streamlit/components/v2/types.py +317 -0
  39. streamlit/config.py +2977 -0
  40. streamlit/config_option.py +319 -0
  41. streamlit/config_util.py +887 -0
  42. streamlit/connections/__init__.py +32 -0
  43. streamlit/connections/base_connection.py +215 -0
  44. streamlit/connections/snowflake_connection.py +765 -0
  45. streamlit/connections/snowpark_connection.py +213 -0
  46. streamlit/connections/sql_connection.py +427 -0
  47. streamlit/connections/util.py +97 -0
  48. streamlit/cursor.py +314 -0
  49. streamlit/dataframe_util.py +1434 -0
  50. streamlit/delta_generator.py +696 -0
  51. streamlit/delta_generator_singletons.py +243 -0
  52. streamlit/deprecation_util.py +253 -0
  53. streamlit/development.py +21 -0
  54. streamlit/elements/__init__.py +13 -0
  55. streamlit/elements/alert.py +341 -0
  56. streamlit/elements/arrow.py +1065 -0
  57. streamlit/elements/balloons.py +47 -0
  58. streamlit/elements/bokeh_chart.py +75 -0
  59. streamlit/elements/code.py +154 -0
  60. streamlit/elements/deck_gl_json_chart.py +627 -0
  61. streamlit/elements/dialog_decorator.py +320 -0
  62. streamlit/elements/empty.py +130 -0
  63. streamlit/elements/exception.py +370 -0
  64. streamlit/elements/form.py +481 -0
  65. streamlit/elements/graphviz_chart.py +226 -0
  66. streamlit/elements/heading.py +407 -0
  67. streamlit/elements/help.py +565 -0
  68. streamlit/elements/html.py +189 -0
  69. streamlit/elements/iframe.py +245 -0
  70. streamlit/elements/image.py +221 -0
  71. streamlit/elements/json.py +171 -0
  72. streamlit/elements/layouts.py +1534 -0
  73. streamlit/elements/lib/__init__.py +13 -0
  74. streamlit/elements/lib/built_in_chart_utils.py +1316 -0
  75. streamlit/elements/lib/color_util.py +272 -0
  76. streamlit/elements/lib/column_config_utils.py +555 -0
  77. streamlit/elements/lib/column_types.py +2699 -0
  78. streamlit/elements/lib/dialog.py +212 -0
  79. streamlit/elements/lib/dicttools.py +152 -0
  80. streamlit/elements/lib/file_uploader_utils.py +91 -0
  81. streamlit/elements/lib/form_utils.py +77 -0
  82. streamlit/elements/lib/image_utils.py +447 -0
  83. streamlit/elements/lib/js_number.py +105 -0
  84. streamlit/elements/lib/layout_utils.py +325 -0
  85. streamlit/elements/lib/mutable_expander_container.py +73 -0
  86. streamlit/elements/lib/mutable_popover_container.py +73 -0
  87. streamlit/elements/lib/mutable_status_container.py +194 -0
  88. streamlit/elements/lib/mutable_tab_container.py +73 -0
  89. streamlit/elements/lib/options_selector_utils.py +480 -0
  90. streamlit/elements/lib/pandas_styler_utils.py +302 -0
  91. streamlit/elements/lib/policies.py +198 -0
  92. streamlit/elements/lib/shortcut_utils.py +152 -0
  93. streamlit/elements/lib/streamlit_plotly_theme.py +206 -0
  94. streamlit/elements/lib/subtitle_utils.py +175 -0
  95. streamlit/elements/lib/utils.py +274 -0
  96. streamlit/elements/map.py +526 -0
  97. streamlit/elements/markdown.py +529 -0
  98. streamlit/elements/media.py +843 -0
  99. streamlit/elements/metric.py +529 -0
  100. streamlit/elements/pdf.py +190 -0
  101. streamlit/elements/plotly_chart.py +779 -0
  102. streamlit/elements/progress.py +172 -0
  103. streamlit/elements/pyplot.py +240 -0
  104. streamlit/elements/snow.py +47 -0
  105. streamlit/elements/space.py +121 -0
  106. streamlit/elements/spinner.py +152 -0
  107. streamlit/elements/table.py +240 -0
  108. streamlit/elements/text.py +113 -0
  109. streamlit/elements/toast.py +175 -0
  110. streamlit/elements/vega_charts.py +2510 -0
  111. streamlit/elements/widgets/__init__.py +13 -0
  112. streamlit/elements/widgets/audio_input.py +334 -0
  113. streamlit/elements/widgets/button.py +1559 -0
  114. streamlit/elements/widgets/button_group.py +1061 -0
  115. streamlit/elements/widgets/camera_input.py +281 -0
  116. streamlit/elements/widgets/chat.py +1028 -0
  117. streamlit/elements/widgets/checkbox.py +420 -0
  118. streamlit/elements/widgets/color_picker.py +329 -0
  119. streamlit/elements/widgets/data_editor.py +1168 -0
  120. streamlit/elements/widgets/data_editor_plus.py +902 -0
  121. streamlit/elements/widgets/feedback.py +322 -0
  122. streamlit/elements/widgets/file_uploader.py +592 -0
  123. streamlit/elements/widgets/multiselect.py +654 -0
  124. streamlit/elements/widgets/number_input.py +719 -0
  125. streamlit/elements/widgets/radio.py +551 -0
  126. streamlit/elements/widgets/select_slider.py +568 -0
  127. streamlit/elements/widgets/selectbox.py +680 -0
  128. streamlit/elements/widgets/slider.py +1093 -0
  129. streamlit/elements/widgets/text_widgets.py +779 -0
  130. streamlit/elements/widgets/time_widgets.py +1712 -0
  131. streamlit/elements/write.py +585 -0
  132. streamlit/emojis.py +34 -0
  133. streamlit/env_util.py +56 -0
  134. streamlit/error_util.py +112 -0
  135. streamlit/errors.py +680 -0
  136. streamlit/external/__init__.py +13 -0
  137. streamlit/external/langchain/__init__.py +23 -0
  138. streamlit/external/langchain/streamlit_callback_handler.py +410 -0
  139. streamlit/file_util.py +266 -0
  140. streamlit/git_util.py +200 -0
  141. streamlit/hello/__init__.py +13 -0
  142. streamlit/hello/__pycache__/__init__.cpython-312.pyc +0 -0
  143. streamlit/hello/__pycache__/streamlit_app.cpython-312.pyc +0 -0
  144. streamlit/hello/animation_demo.py +82 -0
  145. streamlit/hello/dataframe_demo.py +71 -0
  146. streamlit/hello/hello.py +46 -0
  147. streamlit/hello/mapping_demo.py +113 -0
  148. streamlit/hello/plotting_demo.py +62 -0
  149. streamlit/hello/streamlit_app.py +57 -0
  150. streamlit/hello/utils.py +30 -0
  151. streamlit/logger.py +129 -0
  152. streamlit/material_icon_names.py +25 -0
  153. streamlit/navigation/__init__.py +13 -0
  154. streamlit/navigation/page.py +365 -0
  155. streamlit/net_util.py +125 -0
  156. streamlit/path_security.py +98 -0
  157. streamlit/platform.py +31 -0
  158. streamlit/proto/Alert_pb2.py +28 -0
  159. streamlit/proto/Alert_pb2.pyi +100 -0
  160. streamlit/proto/AppPage_pb2.py +25 -0
  161. streamlit/proto/AppPage_pb2.pyi +75 -0
  162. streamlit/proto/ArrowData_pb2.py +27 -0
  163. streamlit/proto/ArrowData_pb2.pyi +103 -0
  164. streamlit/proto/ArrowNamedDataSet_pb2.py +26 -0
  165. streamlit/proto/ArrowNamedDataSet_pb2.pyi +65 -0
  166. streamlit/proto/AudioInput_pb2.py +26 -0
  167. streamlit/proto/AudioInput_pb2.pyi +72 -0
  168. streamlit/proto/Audio_pb2.py +26 -0
  169. streamlit/proto/Audio_pb2.pyi +75 -0
  170. streamlit/proto/AuthRedirect_pb2.py +25 -0
  171. streamlit/proto/AuthRedirect_pb2.pyi +48 -0
  172. streamlit/proto/AutoRerun_pb2.py +25 -0
  173. streamlit/proto/AutoRerun_pb2.pyi +52 -0
  174. streamlit/proto/BackMsg_pb2.py +29 -0
  175. streamlit/proto/BackMsg_pb2.pyi +132 -0
  176. streamlit/proto/Balloons_pb2.py +25 -0
  177. streamlit/proto/Balloons_pb2.pyi +48 -0
  178. streamlit/proto/BidiComponent_pb2.py +32 -0
  179. streamlit/proto/BidiComponent_pb2.pyi +176 -0
  180. streamlit/proto/Block_pb2.py +62 -0
  181. streamlit/proto/Block_pb2.pyi +518 -0
  182. streamlit/proto/ButtonGroup_pb2.py +32 -0
  183. streamlit/proto/ButtonGroup_pb2.pyi +157 -0
  184. streamlit/proto/ButtonLikeIconPosition_pb2.py +25 -0
  185. streamlit/proto/ButtonLikeIconPosition_pb2.pyi +47 -0
  186. streamlit/proto/Button_pb2.py +26 -0
  187. streamlit/proto/Button_pb2.pyi +82 -0
  188. streamlit/proto/CameraInput_pb2.py +26 -0
  189. streamlit/proto/CameraInput_pb2.pyi +66 -0
  190. streamlit/proto/ChatInput_pb2.py +27 -0
  191. streamlit/proto/ChatInput_pb2.pyi +113 -0
  192. streamlit/proto/Checkbox_pb2.py +28 -0
  193. streamlit/proto/Checkbox_pb2.pyi +99 -0
  194. streamlit/proto/ClientState_pb2.py +28 -0
  195. streamlit/proto/ClientState_pb2.pyi +137 -0
  196. streamlit/proto/Code_pb2.py +25 -0
  197. streamlit/proto/Code_pb2.pyi +59 -0
  198. streamlit/proto/ColorPicker_pb2.py +26 -0
  199. streamlit/proto/ColorPicker_pb2.pyi +82 -0
  200. streamlit/proto/Common_pb2.py +49 -0
  201. streamlit/proto/Common_pb2.pyi +325 -0
  202. streamlit/proto/Components_pb2.py +33 -0
  203. streamlit/proto/Components_pb2.pyi +196 -0
  204. streamlit/proto/Dataframe_pb2.py +30 -0
  205. streamlit/proto/Dataframe_pb2.pyi +172 -0
  206. streamlit/proto/DateInput_pb2.py +26 -0
  207. streamlit/proto/DateInput_pb2.pyi +91 -0
  208. streamlit/proto/DateTimeInput_pb2.py +26 -0
  209. streamlit/proto/DateTimeInput_pb2.pyi +94 -0
  210. streamlit/proto/DeckGlJsonChart_pb2.py +27 -0
  211. streamlit/proto/DeckGlJsonChart_pb2.pyi +91 -0
  212. streamlit/proto/Delta_pb2.py +29 -0
  213. streamlit/proto/Delta_pb2.pyi +82 -0
  214. streamlit/proto/DownloadButton_pb2.py +26 -0
  215. streamlit/proto/DownloadButton_pb2.pyi +92 -0
  216. streamlit/proto/Element_pb2.py +81 -0
  217. streamlit/proto/Element_pb2.pyi +348 -0
  218. streamlit/proto/Empty_pb2.py +25 -0
  219. streamlit/proto/Empty_pb2.pyi +42 -0
  220. streamlit/proto/Exception_pb2.py +26 -0
  221. streamlit/proto/Exception_pb2.pyi +88 -0
  222. streamlit/proto/Favicon_pb2.py +25 -0
  223. streamlit/proto/Favicon_pb2.pyi +47 -0
  224. streamlit/proto/Feedback_pb2.py +27 -0
  225. streamlit/proto/Feedback_pb2.pyi +93 -0
  226. streamlit/proto/FileUploader_pb2.py +26 -0
  227. streamlit/proto/FileUploader_pb2.pyi +90 -0
  228. streamlit/proto/ForwardMsg_pb2.py +48 -0
  229. streamlit/proto/ForwardMsg_pb2.pyi +296 -0
  230. streamlit/proto/GapSize_pb2.py +27 -0
  231. streamlit/proto/GapSize_pb2.pyi +82 -0
  232. streamlit/proto/GitInfo_pb2.py +27 -0
  233. streamlit/proto/GitInfo_pb2.pyi +84 -0
  234. streamlit/proto/GraphVizChart_pb2.py +25 -0
  235. streamlit/proto/GraphVizChart_pb2.pyi +56 -0
  236. streamlit/proto/Heading_pb2.py +25 -0
  237. streamlit/proto/Heading_pb2.pyi +63 -0
  238. streamlit/proto/HeightConfig_pb2.py +25 -0
  239. streamlit/proto/HeightConfig_pb2.pyi +61 -0
  240. streamlit/proto/Help_pb2.py +27 -0
  241. streamlit/proto/Help_pb2.pyi +104 -0
  242. streamlit/proto/Html_pb2.py +25 -0
  243. streamlit/proto/Html_pb2.pyi +52 -0
  244. streamlit/proto/IFrame_pb2.py +25 -0
  245. streamlit/proto/IFrame_pb2.pyi +68 -0
  246. streamlit/proto/Image_pb2.py +27 -0
  247. streamlit/proto/Image_pb2.pyi +73 -0
  248. streamlit/proto/Json_pb2.py +25 -0
  249. streamlit/proto/Json_pb2.pyi +63 -0
  250. streamlit/proto/LabelVisibility_pb2.py +27 -0
  251. streamlit/proto/LabelVisibility_pb2.pyi +69 -0
  252. streamlit/proto/LinkButton_pb2.py +26 -0
  253. streamlit/proto/LinkButton_pb2.pyi +76 -0
  254. streamlit/proto/Logo_pb2.py +27 -0
  255. streamlit/proto/Logo_pb2.pyi +82 -0
  256. streamlit/proto/Markdown_pb2.py +27 -0
  257. streamlit/proto/Markdown_pb2.pyi +83 -0
  258. streamlit/proto/Metric_pb2.py +32 -0
  259. streamlit/proto/Metric_pb2.pyi +145 -0
  260. streamlit/proto/MetricsEvent_pb2.py +28 -0
  261. streamlit/proto/MetricsEvent_pb2.pyi +224 -0
  262. streamlit/proto/MultiSelect_pb2.py +26 -0
  263. streamlit/proto/MultiSelect_pb2.pyi +108 -0
  264. streamlit/proto/Navigation_pb2.py +28 -0
  265. streamlit/proto/Navigation_pb2.pyi +89 -0
  266. streamlit/proto/NewSession_pb2.py +47 -0
  267. streamlit/proto/NewSession_pb2.pyi +753 -0
  268. streamlit/proto/NumberInput_pb2.py +28 -0
  269. streamlit/proto/NumberInput_pb2.pyi +138 -0
  270. streamlit/proto/PageConfig_pb2.py +33 -0
  271. streamlit/proto/PageConfig_pb2.pyi +179 -0
  272. streamlit/proto/PageInfo_pb2.py +25 -0
  273. streamlit/proto/PageInfo_pb2.pyi +50 -0
  274. streamlit/proto/PageLink_pb2.py +26 -0
  275. streamlit/proto/PageLink_pb2.pyi +80 -0
  276. streamlit/proto/PageNotFound_pb2.py +25 -0
  277. streamlit/proto/PageNotFound_pb2.pyi +49 -0
  278. streamlit/proto/PageProfile_pb2.py +29 -0
  279. streamlit/proto/PageProfile_pb2.pyi +146 -0
  280. streamlit/proto/ParentMessage_pb2.py +25 -0
  281. streamlit/proto/ParentMessage_pb2.pyi +53 -0
  282. streamlit/proto/PlotlyChart_pb2.py +27 -0
  283. streamlit/proto/PlotlyChart_pb2.pyi +96 -0
  284. streamlit/proto/Progress_pb2.py +25 -0
  285. streamlit/proto/Progress_pb2.pyi +50 -0
  286. streamlit/proto/Radio_pb2.py +26 -0
  287. streamlit/proto/Radio_pb2.pyi +104 -0
  288. streamlit/proto/RootContainer_pb2.py +25 -0
  289. streamlit/proto/RootContainer_pb2.pyi +56 -0
  290. streamlit/proto/Selectbox_pb2.py +26 -0
  291. streamlit/proto/Selectbox_pb2.pyi +107 -0
  292. streamlit/proto/SessionEvent_pb2.py +26 -0
  293. streamlit/proto/SessionEvent_pb2.pyi +72 -0
  294. streamlit/proto/SessionStatus_pb2.py +25 -0
  295. streamlit/proto/SessionStatus_pb2.pyi +64 -0
  296. streamlit/proto/Skeleton_pb2.py +27 -0
  297. streamlit/proto/Skeleton_pb2.pyi +75 -0
  298. streamlit/proto/Slider_pb2.py +30 -0
  299. streamlit/proto/Slider_pb2.pyi +161 -0
  300. streamlit/proto/Snow_pb2.py +25 -0
  301. streamlit/proto/Snow_pb2.pyi +48 -0
  302. streamlit/proto/Space_pb2.py +25 -0
  303. streamlit/proto/Space_pb2.pyi +48 -0
  304. streamlit/proto/Spinner_pb2.py +25 -0
  305. streamlit/proto/Spinner_pb2.pyi +56 -0
  306. streamlit/proto/Table_pb2.py +28 -0
  307. streamlit/proto/Table_pb2.pyi +83 -0
  308. streamlit/proto/TextAlignmentConfig_pb2.py +27 -0
  309. streamlit/proto/TextAlignmentConfig_pb2.pyi +69 -0
  310. streamlit/proto/TextArea_pb2.py +26 -0
  311. streamlit/proto/TextArea_pb2.pyi +97 -0
  312. streamlit/proto/TextInput_pb2.py +28 -0
  313. streamlit/proto/TextInput_pb2.pyi +124 -0
  314. streamlit/proto/Text_pb2.py +25 -0
  315. streamlit/proto/Text_pb2.pyi +53 -0
  316. streamlit/proto/TimeInput_pb2.py +26 -0
  317. streamlit/proto/TimeInput_pb2.pyi +86 -0
  318. streamlit/proto/Toast_pb2.py +25 -0
  319. streamlit/proto/Toast_pb2.pyi +64 -0
  320. streamlit/proto/Transient_pb2.py +26 -0
  321. streamlit/proto/Transient_pb2.pyi +53 -0
  322. streamlit/proto/VegaLiteChart_pb2.py +27 -0
  323. streamlit/proto/VegaLiteChart_pb2.pyi +92 -0
  324. streamlit/proto/Video_pb2.py +30 -0
  325. streamlit/proto/Video_pb2.pyi +129 -0
  326. streamlit/proto/WidgetStates_pb2.py +31 -0
  327. streamlit/proto/WidgetStates_pb2.pyi +157 -0
  328. streamlit/proto/WidthConfig_pb2.py +25 -0
  329. streamlit/proto/WidthConfig_pb2.pyi +61 -0
  330. streamlit/proto/__init__.py +15 -0
  331. streamlit/proto/openmetrics_data_model_pb2.py +58 -0
  332. streamlit/proto/openmetrics_data_model_pb2.pyi +558 -0
  333. streamlit/py.typed +0 -0
  334. streamlit/runtime/__init__.py +50 -0
  335. streamlit/runtime/app_session.py +1302 -0
  336. streamlit/runtime/caching/__init__.py +118 -0
  337. streamlit/runtime/caching/cache_data_api.py +775 -0
  338. streamlit/runtime/caching/cache_errors.py +143 -0
  339. streamlit/runtime/caching/cache_resource_api.py +756 -0
  340. streamlit/runtime/caching/cache_type.py +33 -0
  341. streamlit/runtime/caching/cache_utils.py +601 -0
  342. streamlit/runtime/caching/cached_message_replay.py +290 -0
  343. streamlit/runtime/caching/hashing.py +655 -0
  344. streamlit/runtime/caching/legacy_cache_api.py +170 -0
  345. streamlit/runtime/caching/storage/__init__.py +29 -0
  346. streamlit/runtime/caching/storage/cache_storage_protocol.py +236 -0
  347. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  348. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +159 -0
  349. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  350. streamlit/runtime/caching/ttl_cleanup_cache.py +85 -0
  351. streamlit/runtime/connection_factory.py +498 -0
  352. streamlit/runtime/context.py +449 -0
  353. streamlit/runtime/context_util.py +49 -0
  354. streamlit/runtime/credentials.py +355 -0
  355. streamlit/runtime/download_data_util.py +53 -0
  356. streamlit/runtime/forward_msg_cache.py +101 -0
  357. streamlit/runtime/forward_msg_queue.py +263 -0
  358. streamlit/runtime/fragment.py +441 -0
  359. streamlit/runtime/media_file_manager.py +409 -0
  360. streamlit/runtime/media_file_storage.py +143 -0
  361. streamlit/runtime/memory_media_file_storage.py +201 -0
  362. streamlit/runtime/memory_session_storage.py +77 -0
  363. streamlit/runtime/memory_uploaded_file_manager.py +149 -0
  364. streamlit/runtime/metrics_util.py +612 -0
  365. streamlit/runtime/pages_manager.py +160 -0
  366. streamlit/runtime/runtime.py +775 -0
  367. streamlit/runtime/runtime_util.py +108 -0
  368. streamlit/runtime/script_data.py +46 -0
  369. streamlit/runtime/scriptrunner/__init__.py +38 -0
  370. streamlit/runtime/scriptrunner/exec_code.py +167 -0
  371. streamlit/runtime/scriptrunner/magic.py +277 -0
  372. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  373. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  374. streamlit/runtime/scriptrunner/script_runner.py +805 -0
  375. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  376. streamlit/runtime/scriptrunner_utils/exceptions.py +44 -0
  377. streamlit/runtime/scriptrunner_utils/script_requests.py +311 -0
  378. streamlit/runtime/scriptrunner_utils/script_run_context.py +277 -0
  379. streamlit/runtime/secrets.py +533 -0
  380. streamlit/runtime/session_manager.py +430 -0
  381. streamlit/runtime/state/__init__.py +47 -0
  382. streamlit/runtime/state/common.py +256 -0
  383. streamlit/runtime/state/presentation.py +85 -0
  384. streamlit/runtime/state/query_params.py +767 -0
  385. streamlit/runtime/state/query_params_proxy.py +222 -0
  386. streamlit/runtime/state/safe_session_state.py +146 -0
  387. streamlit/runtime/state/session_state.py +1299 -0
  388. streamlit/runtime/state/session_state_proxy.py +153 -0
  389. streamlit/runtime/state/widgets.py +197 -0
  390. streamlit/runtime/stats.py +356 -0
  391. streamlit/runtime/theme_util.py +148 -0
  392. streamlit/runtime/uploaded_file_manager.py +152 -0
  393. streamlit/runtime/websocket_session_manager.py +301 -0
  394. streamlit/source_util.py +97 -0
  395. streamlit/starlette.py +34 -0
  396. streamlit/string_util.py +264 -0
  397. streamlit/temporary_directory.py +67 -0
  398. streamlit/testing/__init__.py +13 -0
  399. streamlit/testing/v1/__init__.py +17 -0
  400. streamlit/testing/v1/app_test.py +1089 -0
  401. streamlit/testing/v1/element_tree.py +2272 -0
  402. streamlit/testing/v1/local_script_runner.py +176 -0
  403. streamlit/testing/v1/util.py +61 -0
  404. streamlit/time_util.py +73 -0
  405. streamlit/type_util.py +480 -0
  406. streamlit/url_util.py +120 -0
  407. streamlit/user_info.py +698 -0
  408. streamlit/util.py +108 -0
  409. streamlit/vendor/__init__.py +0 -0
  410. streamlit/vendor/pympler/__init__.py +0 -0
  411. streamlit/vendor/pympler/asizeof.py +2870 -0
  412. streamlit/version.py +18 -0
  413. streamlit/watcher/__init__.py +28 -0
  414. streamlit/watcher/event_based_path_watcher.py +500 -0
  415. streamlit/watcher/folder_black_list.py +82 -0
  416. streamlit/watcher/local_sources_watcher.py +297 -0
  417. streamlit/watcher/path_watcher.py +244 -0
  418. streamlit/watcher/polling_path_watcher.py +138 -0
  419. streamlit/watcher/util.py +223 -0
  420. streamlit/web/__init__.py +13 -0
  421. streamlit/web/bootstrap.py +463 -0
  422. streamlit/web/cache_storage_manager_config.py +38 -0
  423. streamlit/web/cli.py +465 -0
  424. streamlit/web/server/__init__.py +30 -0
  425. streamlit/web/server/app_discovery.py +422 -0
  426. streamlit/web/server/app_static_file_handler.py +102 -0
  427. streamlit/web/server/authlib_tornado_integration.py +125 -0
  428. streamlit/web/server/bidi_component_request_handler.py +193 -0
  429. streamlit/web/server/browser_websocket_handler.py +341 -0
  430. streamlit/web/server/component_file_utils.py +105 -0
  431. streamlit/web/server/component_request_handler.py +107 -0
  432. streamlit/web/server/media_file_handler.py +148 -0
  433. streamlit/web/server/oauth_authlib_routes.py +314 -0
  434. streamlit/web/server/oidc_mixin.py +138 -0
  435. streamlit/web/server/routes.py +257 -0
  436. streamlit/web/server/server.py +555 -0
  437. streamlit/web/server/server_util.py +235 -0
  438. streamlit/web/server/starlette/__init__.py +23 -0
  439. streamlit/web/server/starlette/starlette_app.py +541 -0
  440. streamlit/web/server/starlette/starlette_app_utils.py +306 -0
  441. streamlit/web/server/starlette/starlette_auth_routes.py +584 -0
  442. streamlit/web/server/starlette/starlette_gzip_middleware.py +121 -0
  443. streamlit/web/server/starlette/starlette_path_security_middleware.py +97 -0
  444. streamlit/web/server/starlette/starlette_routes.py +884 -0
  445. streamlit/web/server/starlette/starlette_server.py +496 -0
  446. streamlit/web/server/starlette/starlette_server_config.py +55 -0
  447. streamlit/web/server/starlette/starlette_static_routes.py +181 -0
  448. streamlit/web/server/starlette/starlette_websocket.py +560 -0
  449. streamlit/web/server/stats_request_handler.py +116 -0
  450. streamlit/web/server/upload_file_request_handler.py +158 -0
  451. streamlit/web/server/websocket_headers.py +56 -0
  452. streamlit_data_editor_plus-0.1.0.dist-info/METADATA +76 -0
  453. streamlit_data_editor_plus-0.1.0.dist-info/RECORD +456 -0
  454. streamlit_data_editor_plus-0.1.0.dist-info/WHEEL +5 -0
  455. streamlit_data_editor_plus-0.1.0.dist-info/entry_points.txt +2 -0
  456. streamlit_data_editor_plus-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,779 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
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 dataclasses import dataclass
18
+ from textwrap import dedent
19
+ from typing import TYPE_CHECKING, Literal, cast, overload
20
+
21
+ from streamlit.elements.lib.form_utils import current_form_id
22
+ from streamlit.elements.lib.layout_utils import (
23
+ Height,
24
+ LayoutConfig,
25
+ WidthWithoutContent,
26
+ validate_height,
27
+ validate_width,
28
+ )
29
+ from streamlit.elements.lib.policies import (
30
+ check_widget_policies,
31
+ maybe_raise_label_warnings,
32
+ )
33
+ from streamlit.elements.lib.utils import (
34
+ Key,
35
+ LabelVisibility,
36
+ compute_and_register_element_id,
37
+ get_label_visibility_proto_value,
38
+ to_key,
39
+ )
40
+ from streamlit.errors import StreamlitAPIException
41
+ from streamlit.proto.TextArea_pb2 import TextArea as TextAreaProto
42
+ from streamlit.proto.TextInput_pb2 import TextInput as TextInputProto
43
+ from streamlit.runtime.metrics_util import gather_metrics
44
+ from streamlit.runtime.scriptrunner import ScriptRunContext, get_script_run_ctx
45
+ from streamlit.runtime.state import (
46
+ BindOption,
47
+ WidgetArgs,
48
+ WidgetCallback,
49
+ WidgetKwargs,
50
+ get_session_state,
51
+ register_widget,
52
+ )
53
+ from streamlit.string_util import validate_icon_or_emoji
54
+ from streamlit.type_util import SupportsStr
55
+
56
+ if TYPE_CHECKING:
57
+ from streamlit.delta_generator import DeltaGenerator
58
+ from streamlit.type_util import SupportsStr
59
+
60
+
61
+ @dataclass
62
+ class TextInputSerde:
63
+ value: str | None
64
+ max_chars: int | None = None
65
+
66
+ def deserialize(self, ui_value: str | None) -> str | None:
67
+ result = ui_value if ui_value is not None else self.value
68
+ if result is not None and self.max_chars is not None:
69
+ result = result[: self.max_chars]
70
+ return result
71
+
72
+ def serialize(self, v: str | None) -> str | None:
73
+ return v
74
+
75
+
76
+ @dataclass
77
+ class TextAreaSerde:
78
+ value: str | None
79
+ max_chars: int | None = None
80
+
81
+ def deserialize(self, ui_value: str | None) -> str | None:
82
+ result = ui_value if ui_value is not None else self.value
83
+ if result is not None and self.max_chars is not None:
84
+ result = result[: self.max_chars]
85
+ return result
86
+
87
+ def serialize(self, v: str | None) -> str | None:
88
+ return v
89
+
90
+
91
+ class TextWidgetsMixin:
92
+ @overload
93
+ def text_input(
94
+ self,
95
+ label: str,
96
+ value: str = "",
97
+ max_chars: int | None = None,
98
+ key: Key | None = None,
99
+ type: Literal["default", "password"] = "default",
100
+ help: str | None = None,
101
+ autocomplete: str | None = None,
102
+ on_change: WidgetCallback | None = None,
103
+ args: WidgetArgs | None = None,
104
+ kwargs: WidgetKwargs | None = None,
105
+ *, # keyword-only arguments:
106
+ placeholder: str | None = None,
107
+ disabled: bool = False,
108
+ label_visibility: LabelVisibility = "visible",
109
+ icon: str | None = None,
110
+ width: WidthWithoutContent = "stretch",
111
+ bind: BindOption = None,
112
+ ) -> str:
113
+ pass
114
+
115
+ @overload
116
+ def text_input(
117
+ self,
118
+ label: str,
119
+ value: SupportsStr | None = None,
120
+ max_chars: int | None = None,
121
+ key: Key | None = None,
122
+ type: Literal["default", "password"] = "default",
123
+ help: str | None = None,
124
+ autocomplete: str | None = None,
125
+ on_change: WidgetCallback | None = None,
126
+ args: WidgetArgs | None = None,
127
+ kwargs: WidgetKwargs | None = None,
128
+ *, # keyword-only arguments:
129
+ placeholder: str | None = None,
130
+ disabled: bool = False,
131
+ label_visibility: LabelVisibility = "visible",
132
+ icon: str | None = None,
133
+ width: WidthWithoutContent = "stretch",
134
+ bind: BindOption = None,
135
+ ) -> str | None:
136
+ pass
137
+
138
+ @gather_metrics("text_input")
139
+ def text_input(
140
+ self,
141
+ label: str,
142
+ value: str | SupportsStr | None = "",
143
+ max_chars: int | None = None,
144
+ key: Key | None = None,
145
+ type: Literal["default", "password"] = "default",
146
+ help: str | None = None,
147
+ autocomplete: str | None = None,
148
+ on_change: WidgetCallback | None = None,
149
+ args: WidgetArgs | None = None,
150
+ kwargs: WidgetKwargs | None = None,
151
+ *, # keyword-only arguments:
152
+ placeholder: str | None = None,
153
+ disabled: bool = False,
154
+ label_visibility: LabelVisibility = "visible",
155
+ icon: str | None = None,
156
+ width: WidthWithoutContent = "stretch",
157
+ bind: BindOption = None,
158
+ ) -> str | None:
159
+ r"""Display a single-line text input widget.
160
+
161
+ Parameters
162
+ ----------
163
+ label : str
164
+ A short label explaining to the user what this input is for.
165
+ The label can optionally contain GitHub-flavored Markdown of the
166
+ following types: Bold, Italics, Strikethroughs, Inline Code, Links,
167
+ and Images. Images display like icons, with a max height equal to
168
+ the font height.
169
+
170
+ Unsupported Markdown elements are unwrapped so only their children
171
+ (text contents) render. Display unsupported elements as literal
172
+ characters by backslash-escaping them. E.g.,
173
+ ``"1\. Not an ordered list"``.
174
+
175
+ See the ``body`` parameter of |st.markdown|_ for additional,
176
+ supported Markdown directives.
177
+
178
+ For accessibility reasons, you should never set an empty label, but
179
+ you can hide it with ``label_visibility`` if needed. In the future,
180
+ we may disallow empty labels by raising an exception.
181
+
182
+ .. |st.markdown| replace:: ``st.markdown``
183
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
184
+
185
+ value : object or None
186
+ The text value of this widget when it first renders. This will be
187
+ cast to str internally. If ``None``, will initialize empty and
188
+ return ``None`` until the user provides input. Defaults to empty string.
189
+
190
+ max_chars : int or None
191
+ Max number of characters allowed in text input.
192
+
193
+ key : str or int
194
+ An optional string or integer to use as the unique key for the widget.
195
+ If this is omitted, a key will be generated for the widget
196
+ based on its content. No two widgets may have the same key.
197
+
198
+ type : "default" or "password"
199
+ The type of the text input. This can be either "default" (for
200
+ a regular text input), or "password" (for a text input that
201
+ masks the user's typed value). Defaults to "default".
202
+
203
+ help : str or None
204
+ A tooltip that gets displayed next to the widget label. Streamlit
205
+ only displays the tooltip when ``label_visibility="visible"``. If
206
+ this is ``None`` (default), no tooltip is displayed.
207
+
208
+ The tooltip can optionally contain GitHub-flavored Markdown,
209
+ including the Markdown directives described in the ``body``
210
+ parameter of ``st.markdown``.
211
+
212
+ autocomplete : str
213
+ An optional value that will be passed to the <input> element's
214
+ autocomplete property. If unspecified, this value will be set to
215
+ "new-password" for "password" inputs, and the empty string for
216
+ "default" inputs. For more details, see https://developer.mozilla.org/en-US/docs/Web/HTML/Attributes/autocomplete
217
+
218
+ on_change : callable
219
+ An optional callback invoked when this text input's value changes.
220
+
221
+ args : list or tuple
222
+ An optional list or tuple of args to pass to the callback.
223
+
224
+ kwargs : dict
225
+ An optional dict of kwargs to pass to the callback.
226
+
227
+ placeholder : str or None
228
+ An optional string displayed when the text input is empty. If None,
229
+ no text is displayed.
230
+
231
+ disabled : bool
232
+ An optional boolean that disables the text input if set to
233
+ ``True``. The default is ``False``.
234
+
235
+ label_visibility : "visible", "hidden", or "collapsed"
236
+ The visibility of the label. The default is ``"visible"``. If this
237
+ is ``"hidden"``, Streamlit displays an empty spacer instead of the
238
+ label, which can help keep the widget aligned with other widgets.
239
+
240
+ icon : str, None
241
+ An optional emoji or icon to display within the input field to the
242
+ left of the value. If ``icon`` is ``None`` (default), no icon is
243
+ displayed. If ``icon`` is a string, the following options are
244
+ valid:
245
+
246
+ - A single-character emoji. For example, you can set ``icon="🚨"``
247
+ or ``icon="🔥"``. Emoji short codes are not supported.
248
+
249
+ - An icon from the Material Symbols library (rounded style) in the
250
+ format ``":material/icon_name:"`` where "icon_name" is the name
251
+ of the icon in snake case.
252
+
253
+ For example, ``icon=":material/thumb_up:"`` will display the
254
+ Thumb Up icon. Find additional icons in the `Material Symbols \
255
+ <https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded>`_
256
+ font library.
257
+
258
+ - ``"spinner"``: Displays a spinner as an icon.
259
+
260
+ width : "stretch" or int
261
+ The width of the text input widget. This can be one of the
262
+ following:
263
+
264
+ - ``"stretch"`` (default): The width of the widget matches the
265
+ width of the parent container.
266
+ - An integer specifying the width in pixels: The widget has a
267
+ fixed width. If the specified width is greater than the width of
268
+ the parent container, the width of the widget matches the width
269
+ of the parent container.
270
+
271
+ bind : "query-params" or None
272
+ If set to ``"query-params"``, the widget's value will be synced
273
+ with a URL query parameter. When the widget value changes, the URL
274
+ is updated; when the page loads with a query parameter, the widget
275
+ is initialized from it. Requires a ``key`` to be set, which will
276
+ be used as the query parameter name. The default is ``None``.
277
+
278
+ Cannot be used with ``type="password"`` (passwords must not appear
279
+ in URLs).
280
+
281
+ Returns
282
+ -------
283
+ str or None
284
+ The current value of the text input widget or ``None`` if no value has been
285
+ provided by the user.
286
+
287
+ Example
288
+ -------
289
+ >>> import streamlit as st
290
+ >>>
291
+ >>> title = st.text_input("Movie title", "Life of Brian")
292
+ >>> st.write("The current movie title is", title)
293
+
294
+ .. output::
295
+ https://doc-text-input.streamlit.app/
296
+ height: 260px
297
+
298
+ """
299
+ ctx = get_script_run_ctx()
300
+ return self._text_input(
301
+ label=label,
302
+ value=value,
303
+ max_chars=max_chars,
304
+ key=key,
305
+ type=type,
306
+ help=help,
307
+ autocomplete=autocomplete,
308
+ on_change=on_change,
309
+ args=args,
310
+ kwargs=kwargs,
311
+ placeholder=placeholder,
312
+ disabled=disabled,
313
+ label_visibility=label_visibility,
314
+ icon=icon,
315
+ width=width,
316
+ bind=bind,
317
+ ctx=ctx,
318
+ )
319
+
320
+ def _text_input(
321
+ self,
322
+ label: str,
323
+ value: SupportsStr | None = "",
324
+ max_chars: int | None = None,
325
+ key: Key | None = None,
326
+ type: str = "default",
327
+ help: str | None = None,
328
+ autocomplete: str | None = None,
329
+ on_change: WidgetCallback | None = None,
330
+ args: WidgetArgs | None = None,
331
+ kwargs: WidgetKwargs | None = None,
332
+ *, # keyword-only arguments:
333
+ placeholder: str | None = None,
334
+ disabled: bool = False,
335
+ label_visibility: LabelVisibility = "visible",
336
+ icon: str | None = None,
337
+ width: WidthWithoutContent = "stretch",
338
+ bind: BindOption = None,
339
+ ctx: ScriptRunContext | None = None,
340
+ ) -> str | None:
341
+ key = to_key(key)
342
+
343
+ check_widget_policies(
344
+ self.dg,
345
+ key,
346
+ on_change,
347
+ default_value=None if value == "" else value,
348
+ )
349
+ maybe_raise_label_warnings(label, label_visibility)
350
+
351
+ # Make sure value is always string or None:
352
+ value = str(value) if value is not None else None
353
+
354
+ element_id = compute_and_register_element_id(
355
+ "text_input",
356
+ user_key=key,
357
+ # Explicitly whitelist max_chars to make sure the ID changes when it changes
358
+ # since the widget value might become invalid based on a different max_chars
359
+ key_as_main_identity={"max_chars"},
360
+ dg=self.dg,
361
+ label=label,
362
+ value=value,
363
+ max_chars=max_chars,
364
+ type=type,
365
+ help=help,
366
+ autocomplete=autocomplete,
367
+ placeholder=str(placeholder),
368
+ icon=icon,
369
+ width=width,
370
+ )
371
+
372
+ session_state = get_session_state().filtered_state
373
+ if key is not None and key in session_state and session_state[key] is None:
374
+ value = None
375
+
376
+ text_input_proto = TextInputProto()
377
+ text_input_proto.id = element_id
378
+ text_input_proto.label = label
379
+ if value is not None:
380
+ text_input_proto.default = value
381
+ text_input_proto.form_id = current_form_id(self.dg)
382
+ text_input_proto.disabled = disabled
383
+ text_input_proto.label_visibility.value = get_label_visibility_proto_value(
384
+ label_visibility
385
+ )
386
+
387
+ if help is not None:
388
+ text_input_proto.help = dedent(help)
389
+
390
+ if max_chars is not None:
391
+ text_input_proto.max_chars = max_chars
392
+
393
+ if placeholder is not None:
394
+ text_input_proto.placeholder = str(placeholder)
395
+
396
+ if icon is not None:
397
+ text_input_proto.icon = validate_icon_or_emoji(icon)
398
+
399
+ if type == "default":
400
+ text_input_proto.type = TextInputProto.DEFAULT
401
+ elif type == "password":
402
+ text_input_proto.type = TextInputProto.PASSWORD
403
+ else:
404
+ raise StreamlitAPIException(
405
+ f"'{type}' is not a valid text_input type. Valid types are 'default' and 'password'."
406
+ )
407
+
408
+ # Marshall the autocomplete param. If unspecified, this will be
409
+ # set to "new-password" for password inputs.
410
+ if autocomplete is None:
411
+ autocomplete = "new-password" if type == "password" else ""
412
+ text_input_proto.autocomplete = autocomplete
413
+
414
+ # Prevent binding password inputs to query params (exposes secrets in URL)
415
+ if bind == "query-params" and type == "password":
416
+ raise StreamlitAPIException(
417
+ "Cannot use `bind='query-params'` with `type='password'`. "
418
+ "Password values must not appear in URLs."
419
+ )
420
+
421
+ # Set query param key if bound
422
+ if bind == "query-params" and key is not None:
423
+ text_input_proto.query_param_key = str(key)
424
+
425
+ serde = TextInputSerde(value, max_chars)
426
+
427
+ widget_state = register_widget(
428
+ text_input_proto.id,
429
+ on_change_handler=on_change,
430
+ args=args,
431
+ kwargs=kwargs,
432
+ deserializer=serde.deserialize,
433
+ serializer=serde.serialize,
434
+ ctx=ctx,
435
+ value_type="string_value",
436
+ bind=bind,
437
+ # Text input is clearable (empty string is a valid value)
438
+ clearable=True,
439
+ )
440
+
441
+ if widget_state.value_changed:
442
+ if widget_state.value is not None:
443
+ text_input_proto.value = widget_state.value
444
+ text_input_proto.set_value = True
445
+
446
+ validate_width(width)
447
+ layout_config = LayoutConfig(width=width)
448
+
449
+ self.dg._enqueue("text_input", text_input_proto, layout_config=layout_config)
450
+ return widget_state.value
451
+
452
+ @overload
453
+ def text_area(
454
+ self,
455
+ label: str,
456
+ value: str = "",
457
+ height: Height | None = None,
458
+ max_chars: int | None = None,
459
+ key: Key | None = None,
460
+ help: str | None = None,
461
+ on_change: WidgetCallback | None = None,
462
+ args: WidgetArgs | None = None,
463
+ kwargs: WidgetKwargs | None = None,
464
+ *, # keyword-only arguments:
465
+ placeholder: str | None = None,
466
+ disabled: bool = False,
467
+ label_visibility: LabelVisibility = "visible",
468
+ width: WidthWithoutContent = "stretch",
469
+ bind: BindOption = None,
470
+ ) -> str:
471
+ pass
472
+
473
+ @overload
474
+ def text_area(
475
+ self,
476
+ label: str,
477
+ value: SupportsStr | None = None,
478
+ height: Height | None = None,
479
+ max_chars: int | None = None,
480
+ key: Key | None = None,
481
+ help: str | None = None,
482
+ on_change: WidgetCallback | None = None,
483
+ args: WidgetArgs | None = None,
484
+ kwargs: WidgetKwargs | None = None,
485
+ *, # keyword-only arguments:
486
+ placeholder: str | None = None,
487
+ disabled: bool = False,
488
+ label_visibility: LabelVisibility = "visible",
489
+ width: WidthWithoutContent = "stretch",
490
+ bind: BindOption = None,
491
+ ) -> str | None:
492
+ pass
493
+
494
+ @gather_metrics("text_area")
495
+ def text_area(
496
+ self,
497
+ label: str,
498
+ value: str | SupportsStr | None = "",
499
+ height: Height | None = None,
500
+ max_chars: int | None = None,
501
+ key: Key | None = None,
502
+ help: str | None = None,
503
+ on_change: WidgetCallback | None = None,
504
+ args: WidgetArgs | None = None,
505
+ kwargs: WidgetKwargs | None = None,
506
+ *, # keyword-only arguments:
507
+ placeholder: str | None = None,
508
+ disabled: bool = False,
509
+ label_visibility: LabelVisibility = "visible",
510
+ width: WidthWithoutContent = "stretch",
511
+ bind: BindOption = None,
512
+ ) -> str | None:
513
+ r"""Display a multi-line text input widget.
514
+
515
+ Parameters
516
+ ----------
517
+ label : str
518
+ A short label explaining to the user what this input is for.
519
+ The label can optionally contain GitHub-flavored Markdown of the
520
+ following types: Bold, Italics, Strikethroughs, Inline Code, Links,
521
+ and Images. Images display like icons, with a max height equal to
522
+ the font height.
523
+
524
+ Unsupported Markdown elements are unwrapped so only their children
525
+ (text contents) render. Display unsupported elements as literal
526
+ characters by backslash-escaping them. E.g.,
527
+ ``"1\. Not an ordered list"``.
528
+
529
+ See the ``body`` parameter of |st.markdown|_ for additional,
530
+ supported Markdown directives.
531
+
532
+ For accessibility reasons, you should never set an empty label, but
533
+ you can hide it with ``label_visibility`` if needed. In the future,
534
+ we may disallow empty labels by raising an exception.
535
+
536
+ .. |st.markdown| replace:: ``st.markdown``
537
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
538
+
539
+ value : object or None
540
+ The text value of this widget when it first renders. This will be
541
+ cast to str internally. If ``None``, will initialize empty and
542
+ return ``None`` until the user provides input. Defaults to empty string.
543
+
544
+ height : "content", "stretch", int, or None
545
+ The height of the text area widget. This can be one of the
546
+ following:
547
+
548
+ - ``None`` (default): The height of the widget fits three lines.
549
+ - ``"content"``: The height of the widget matches the
550
+ height of its content.
551
+ - ``"stretch"``: The height of the widget matches the height of
552
+ its content or the height of the parent container, whichever is
553
+ larger. If the widget is not in a parent container, the height
554
+ of the widget matches the height of its content.
555
+ - An integer specifying the height in pixels: The widget has a
556
+ fixed height. If the content is larger than the specified
557
+ height, scrolling is enabled.
558
+
559
+ The widget's height can't be smaller than the height of two lines.
560
+ When ``label_visibility="collapsed"``, the minimum height is 68
561
+ pixels. Otherwise, the minimum height is 98 pixels.
562
+
563
+ max_chars : int or None
564
+ Maximum number of characters allowed in text area.
565
+
566
+ key : str or int
567
+ An optional string or integer to use as the unique key for the widget.
568
+ If this is omitted, a key will be generated for the widget
569
+ based on its content. No two widgets may have the same key.
570
+
571
+ help : str or None
572
+ A tooltip that gets displayed next to the widget label. Streamlit
573
+ only displays the tooltip when ``label_visibility="visible"``. If
574
+ this is ``None`` (default), no tooltip is displayed.
575
+
576
+ The tooltip can optionally contain GitHub-flavored Markdown,
577
+ including the Markdown directives described in the ``body``
578
+ parameter of ``st.markdown``.
579
+
580
+ on_change : callable
581
+ An optional callback invoked when this text_area's value changes.
582
+
583
+ args : list or tuple
584
+ An optional list or tuple of args to pass to the callback.
585
+
586
+ kwargs : dict
587
+ An optional dict of kwargs to pass to the callback.
588
+
589
+ placeholder : str or None
590
+ An optional string displayed when the text area is empty. If None,
591
+ no text is displayed.
592
+
593
+ disabled : bool
594
+ An optional boolean that disables the text area if set to ``True``.
595
+ The default is ``False``.
596
+
597
+ label_visibility : "visible", "hidden", or "collapsed"
598
+ The visibility of the label. The default is ``"visible"``. If this
599
+ is ``"hidden"``, Streamlit displays an empty spacer instead of the
600
+ label, which can help keep the widget aligned with other widgets.
601
+ If this is ``"collapsed"``, Streamlit displays no label or spacer.
602
+
603
+ width : "stretch" or int
604
+ The width of the text area widget. This can be one of the
605
+ following:
606
+
607
+ - ``"stretch"`` (default): The width of the widget matches the
608
+ width of the parent container.
609
+ - An integer specifying the width in pixels: The widget has a
610
+ fixed width. If the specified width is greater than the width of
611
+ the parent container, the width of the widget matches the width
612
+ of the parent container.
613
+
614
+ bind : "query-params" or None
615
+ If set to ``"query-params"``, the widget's value will be synced
616
+ with a URL query parameter. When the widget value changes, the URL
617
+ is updated; when the page loads with a query parameter, the widget
618
+ is initialized from it. Requires a ``key`` to be set, which will
619
+ be used as the query parameter name. The default is ``None``.
620
+
621
+ Returns
622
+ -------
623
+ str or None
624
+ The current value of the text area widget or ``None`` if no value has been
625
+ provided by the user.
626
+
627
+ Example
628
+ -------
629
+ >>> import streamlit as st
630
+ >>>
631
+ >>> txt = st.text_area(
632
+ ... "Text to analyze",
633
+ ... "It was the best of times, it was the worst of times, it was the age of "
634
+ ... "wisdom, it was the age of foolishness, it was the epoch of belief, it "
635
+ ... "was the epoch of incredulity, it was the season of Light, it was the "
636
+ ... "season of Darkness, it was the spring of hope, it was the winter of "
637
+ ... "despair, (...)",
638
+ ... )
639
+ >>>
640
+ >>> st.write(f"You wrote {len(txt)} characters.")
641
+
642
+ .. output::
643
+ https://doc-text-area.streamlit.app/
644
+ height: 300px
645
+
646
+ """
647
+ ctx = get_script_run_ctx()
648
+ return self._text_area(
649
+ label=label,
650
+ value=value,
651
+ height=height,
652
+ max_chars=max_chars,
653
+ key=key,
654
+ help=help,
655
+ on_change=on_change,
656
+ args=args,
657
+ kwargs=kwargs,
658
+ placeholder=placeholder,
659
+ disabled=disabled,
660
+ label_visibility=label_visibility,
661
+ width=width,
662
+ bind=bind,
663
+ ctx=ctx,
664
+ )
665
+
666
+ def _text_area(
667
+ self,
668
+ label: str,
669
+ value: SupportsStr | None = "",
670
+ height: Height | None = None,
671
+ max_chars: int | None = None,
672
+ key: Key | None = None,
673
+ help: str | None = None,
674
+ on_change: WidgetCallback | None = None,
675
+ args: WidgetArgs | None = None,
676
+ kwargs: WidgetKwargs | None = None,
677
+ *, # keyword-only arguments:
678
+ placeholder: str | None = None,
679
+ disabled: bool = False,
680
+ label_visibility: LabelVisibility = "visible",
681
+ width: WidthWithoutContent = "stretch",
682
+ bind: BindOption = None,
683
+ ctx: ScriptRunContext | None = None,
684
+ ) -> str | None:
685
+ key = to_key(key)
686
+
687
+ check_widget_policies(
688
+ self.dg,
689
+ key,
690
+ on_change,
691
+ default_value=None if value == "" else value,
692
+ )
693
+ maybe_raise_label_warnings(label, label_visibility)
694
+
695
+ value = str(value) if value is not None else None
696
+
697
+ element_id = compute_and_register_element_id(
698
+ "text_area",
699
+ user_key=key,
700
+ # Explicitly whitelist max_chars to make sure the ID changes when it changes
701
+ # since the widget value might become invalid based on a different max_chars
702
+ key_as_main_identity={"max_chars"},
703
+ dg=self.dg,
704
+ label=label,
705
+ value=value,
706
+ height=height,
707
+ max_chars=max_chars,
708
+ help=help,
709
+ placeholder=str(placeholder),
710
+ width=width,
711
+ )
712
+
713
+ session_state = get_session_state().filtered_state
714
+ if key is not None and key in session_state and session_state[key] is None:
715
+ value = None
716
+
717
+ text_area_proto = TextAreaProto()
718
+ text_area_proto.id = element_id
719
+ text_area_proto.label = label
720
+ if value is not None:
721
+ text_area_proto.default = value
722
+ text_area_proto.form_id = current_form_id(self.dg)
723
+ text_area_proto.disabled = disabled
724
+ text_area_proto.label_visibility.value = get_label_visibility_proto_value(
725
+ label_visibility
726
+ )
727
+
728
+ if help is not None:
729
+ text_area_proto.help = dedent(help)
730
+
731
+ if max_chars is not None:
732
+ text_area_proto.max_chars = max_chars
733
+
734
+ if placeholder is not None:
735
+ text_area_proto.placeholder = str(placeholder)
736
+
737
+ # Set query param key if bound
738
+ if bind == "query-params" and key is not None:
739
+ text_area_proto.query_param_key = str(key)
740
+
741
+ serde = TextAreaSerde(value, max_chars)
742
+ widget_state = register_widget(
743
+ text_area_proto.id,
744
+ on_change_handler=on_change,
745
+ args=args,
746
+ kwargs=kwargs,
747
+ deserializer=serde.deserialize,
748
+ serializer=serde.serialize,
749
+ ctx=ctx,
750
+ value_type="string_value",
751
+ bind=bind,
752
+ # Text area is clearable (empty string is a valid value)
753
+ clearable=True,
754
+ )
755
+
756
+ if widget_state.value_changed:
757
+ if widget_state.value is not None:
758
+ text_area_proto.value = widget_state.value
759
+ text_area_proto.set_value = True
760
+
761
+ validate_width(width)
762
+ if height is not None:
763
+ validate_height(height, allow_content=True)
764
+ else:
765
+ # We want to maintain the same approximately three lines of text height
766
+ # for the text input when the label is collapsed.
767
+ # These numbers are for the entire element including the label and
768
+ # padding.
769
+ height = 122 if label_visibility != "collapsed" else 94
770
+
771
+ layout_config = LayoutConfig(width=width, height=height)
772
+
773
+ self.dg._enqueue("text_area", text_area_proto, layout_config=layout_config)
774
+ return widget_state.value
775
+
776
+ @property
777
+ def dg(self) -> DeltaGenerator:
778
+ """Get our DeltaGenerator."""
779
+ return cast("DeltaGenerator", self)