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,250 @@
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
+ """Handle App logos."""
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import Literal
20
+
21
+ from streamlit import url_util
22
+ from streamlit.elements.lib.image_utils import AtomicImage, image_to_url
23
+ from streamlit.elements.lib.layout_utils import LayoutConfig
24
+ from streamlit.errors import StreamlitAPIException
25
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
26
+ from streamlit.proto.Logo_pb2 import Logo as LogoProto
27
+ from streamlit.runtime.metrics_util import gather_metrics
28
+ from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
29
+ from streamlit.string_util import is_emoji, validate_material_icon
30
+
31
+
32
+ def _invalid_logo_text(field_name: str) -> str:
33
+ return (
34
+ f"The {field_name} passed to st.logo is invalid - See "
35
+ "[documentation](https://docs.streamlit.io/develop/api-reference/media/st.logo) "
36
+ "for more information on valid types"
37
+ )
38
+
39
+
40
+ def _process_logo_image(
41
+ image: AtomicImage | str, image_id: str
42
+ ) -> tuple[LogoProto.ImageType.ValueType, str]:
43
+ """Detects the image type and prepares the image data for the frontend.
44
+
45
+ Parameters
46
+ ----------
47
+ image :
48
+ The image that was provided by the user. Can be an image file,
49
+ emoji, or material icon string.
50
+ image_id : str
51
+ The image ID used when serving local images via the media file manager.
52
+
53
+ Returns
54
+ -------
55
+ tuple[ImageType, str]
56
+ The detected image type and the prepared image data.
57
+
58
+ Raises
59
+ ------
60
+ StreamlitAPIException
61
+ If the image is an empty string or a plain text string that is not
62
+ a valid file path, URL, emoji, or material icon.
63
+ """
64
+ ImageType = LogoProto.ImageType # noqa: N806
65
+
66
+ # Check if it's a material icon
67
+ if isinstance(image, str) and image.startswith(":material"):
68
+ return ImageType.ICON, validate_material_icon(image)
69
+
70
+ # Check if it's an emoji
71
+ if isinstance(image, str) and is_emoji(image):
72
+ return ImageType.EMOJI, image
73
+
74
+ # Otherwise, treat it as an image file
75
+ image_url = image_to_url(
76
+ image,
77
+ layout_config=LayoutConfig(width="content"),
78
+ clamp=False,
79
+ channels="RGB",
80
+ output_format="auto",
81
+ image_id=image_id,
82
+ )
83
+ return ImageType.IMAGE, image_url
84
+
85
+
86
+ @gather_metrics("logo")
87
+ def logo(
88
+ image: AtomicImage | str,
89
+ *, # keyword-only args:
90
+ size: Literal["small", "medium", "large"] = "medium",
91
+ link: str | None = None,
92
+ icon_image: AtomicImage | str | None = None,
93
+ ) -> None:
94
+ r"""
95
+ Renders a logo in the upper-left corner of your app and its sidebar.
96
+
97
+ If ``st.logo`` is called multiple times within a page, Streamlit will
98
+ render the image passed in the last call. For the most consistent results,
99
+ call ``st.logo`` early in your page script and choose an image that works
100
+ well in both light and dark mode. Avoid empty margins around your image.
101
+
102
+ If your logo does not work well for both light and dark mode, consider
103
+ setting the theme and hiding the settings menu from users with the
104
+ `configuration option <https://docs.streamlit.io/develop/api-reference/configuration/config.toml>`_
105
+ ``client.toolbarMode="minimal"``.
106
+
107
+ If a user clicks the logo, they are redirected to your app's home page.
108
+
109
+ Parameters
110
+ ----------
111
+ image : Anything supported by st.image (except list) or str
112
+ The image to display in the upper-left corner of your app and its
113
+ sidebar. If ``icon_image`` is also provided, then Streamlit will only
114
+ display ``image`` in the sidebar.
115
+
116
+ ``image`` can be any of the types supported by |st.image|_ except
117
+ a list. Additionally, the following strings are valid:
118
+
119
+ - A single-character emoji. For example, you can set ``image="🏠"``
120
+ or ``image="🚀"``. Emoji short codes are not supported.
121
+
122
+ - An icon from the Material Symbols library (rounded style) in the
123
+ format ``":material/icon_name:"`` where "icon_name" is the name
124
+ of the icon in snake case.
125
+
126
+ For example, ``image=":material/home:"`` will display the
127
+ Home icon. Find additional icons in the `Material Symbols \
128
+ <https://fonts.google.com/icons?icon.set=Material+Symbols&icon.style=Rounded>`_
129
+ font library.
130
+
131
+ Streamlit scales the image to a max height set by ``size`` and a max
132
+ width to fit within the sidebar.
133
+
134
+ .. |st.image| replace:: ``st.image``
135
+ .. _st.image: https://docs.streamlit.io/develop/api-reference/media/st.image
136
+
137
+ size : "small", "medium", or "large"
138
+ The size of the image displayed in the upper-left corner of the app and its
139
+ sidebar. The possible values are as follows:
140
+
141
+ - ``"small"``: 20px max height
142
+ - ``"medium"`` (default): 24px max height
143
+ - ``"large"``: 32px max height
144
+
145
+ link : str or None
146
+ The external URL to open when a user clicks on the logo. The URL must
147
+ start with "\http://" or "\https://". If ``link`` is ``None`` (default),
148
+ the logo will not include a hyperlink.
149
+
150
+ icon_image : Anything supported by st.image (except list), str, or None
151
+ An optional, typically smaller image to replace ``image`` in the
152
+ upper-left corner when the sidebar is closed. This can be any of the
153
+ types allowed for the ``image`` parameter. If ``icon_image`` is
154
+ ``None`` (default), Streamlit will always display ``image`` in the
155
+ upper-left corner, regardless of whether the sidebar is open or closed.
156
+ Otherwise, Streamlit will render ``icon_image`` in the upper-left
157
+ corner of the app when the sidebar is closed.
158
+
159
+ Streamlit scales the image to a max height set by ``size`` and a max
160
+ width to fit within the sidebar. If the sidebar is closed, the max
161
+ width is retained from when it was last open.
162
+
163
+ For best results, pass a wide or horizontal image to ``image`` and a
164
+ square image to ``icon_image``. Or, pass a square image to ``image``
165
+ and leave ``icon_image=None``.
166
+
167
+ Examples
168
+ --------
169
+ A common design practice is to use a wider logo in the sidebar, and a
170
+ smaller, icon-styled logo in your app's main body.
171
+
172
+ >>> import streamlit as st
173
+ >>>
174
+ >>> st.logo(
175
+ ... LOGO_URL_LARGE,
176
+ ... link="https://streamlit.io/gallery",
177
+ ... icon_image=LOGO_URL_SMALL,
178
+ ... )
179
+
180
+ Try switching logos around in the following example:
181
+
182
+ >>> import streamlit as st
183
+ >>>
184
+ >>> HORIZONTAL_RED = "images/horizontal_red.png"
185
+ >>> ICON_RED = "images/icon_red.png"
186
+ >>> HORIZONTAL_BLUE = "images/horizontal_blue.png"
187
+ >>> ICON_BLUE = "images/icon_blue.png"
188
+ >>>
189
+ >>> options = [HORIZONTAL_RED, ICON_RED, HORIZONTAL_BLUE, ICON_BLUE]
190
+ >>> sidebar_logo = st.selectbox("Sidebar logo", options, 0)
191
+ >>> main_body_logo = st.selectbox("Main body logo", options, 1)
192
+ >>>
193
+ >>> st.logo(sidebar_logo, icon_image=main_body_logo)
194
+ >>> st.sidebar.markdown("Hi!")
195
+
196
+ .. output::
197
+ https://doc-logo.streamlit.app/
198
+ height: 300px
199
+
200
+ """
201
+
202
+ ctx = get_script_run_ctx()
203
+ if ctx is None:
204
+ return
205
+
206
+ fwd_msg = ForwardMsg()
207
+
208
+ try:
209
+ image_type, image_value = _process_logo_image(image, "logo")
210
+ fwd_msg.logo.image = image_value
211
+ fwd_msg.logo.image_type = image_type
212
+ except Exception as ex:
213
+ raise StreamlitAPIException(_invalid_logo_text("image")) from ex
214
+
215
+ if link:
216
+ # Handle external links:
217
+ if url_util.is_url(link, ("http", "https")):
218
+ fwd_msg.logo.link = link
219
+ else:
220
+ raise StreamlitAPIException(
221
+ f"Invalid link: {link} - the link param supports external links only and must "
222
+ f"start with either http:// or https://."
223
+ )
224
+
225
+ if icon_image:
226
+ try:
227
+ icon_image_type, icon_image_value = _process_logo_image(
228
+ icon_image, "icon-image"
229
+ )
230
+ fwd_msg.logo.icon_image = icon_image_value
231
+ fwd_msg.logo.icon_image_type = icon_image_type
232
+ except Exception as ex:
233
+ raise StreamlitAPIException(_invalid_logo_text("icon_image")) from ex
234
+
235
+ def validate_size(size: str) -> str:
236
+ if isinstance(size, str):
237
+ image_size = size.lower()
238
+ valid_sizes = ["small", "medium", "large"]
239
+
240
+ if image_size in valid_sizes:
241
+ return image_size
242
+
243
+ raise StreamlitAPIException(
244
+ f'The size argument to st.logo must be "small", "medium", or "large". \n'
245
+ f"The argument passed was {size}."
246
+ )
247
+
248
+ fwd_msg.logo.size = validate_size(size)
249
+
250
+ ctx.enqueue(fwd_msg)
@@ -0,0 +1,430 @@
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 collections.abc import Callable, Mapping, Sequence
18
+ from pathlib import Path
19
+ from typing import TYPE_CHECKING, Literal, TypeAlias
20
+
21
+ from streamlit import config
22
+ from streamlit.errors import StreamlitAPIException
23
+ from streamlit.navigation.page import StreamlitPage
24
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
25
+ from streamlit.proto.Navigation_pb2 import Navigation as NavigationProto
26
+ from streamlit.runtime.metrics_util import gather_metrics
27
+ from streamlit.runtime.pages_manager import PagesManager
28
+ from streamlit.runtime.scriptrunner_utils.script_run_context import (
29
+ ScriptRunContext,
30
+ get_script_run_ctx,
31
+ )
32
+ from streamlit.string_util import is_emoji
33
+
34
+ if TYPE_CHECKING:
35
+ from streamlit.source_util import PageHash, PageInfo
36
+
37
+ SectionHeader: TypeAlias = str
38
+ PageType: TypeAlias = str | Path | Callable[[], None] | StreamlitPage
39
+
40
+
41
+ def convert_to_streamlit_page(
42
+ page_input: PageType,
43
+ ) -> StreamlitPage:
44
+ """Convert various input types to StreamlitPage objects."""
45
+ if isinstance(page_input, StreamlitPage):
46
+ return page_input
47
+
48
+ if isinstance(page_input, str):
49
+ return StreamlitPage(page_input)
50
+
51
+ if isinstance(page_input, Path):
52
+ return StreamlitPage(page_input)
53
+
54
+ if callable(page_input):
55
+ # Convert function to StreamlitPage
56
+ return StreamlitPage(page_input)
57
+
58
+ raise StreamlitAPIException(
59
+ f"Invalid page type: {type(page_input)}. Must be either a string path, "
60
+ "a pathlib.Path, a callable function, or a st.Page object."
61
+ )
62
+
63
+
64
+ def pages_from_nav_sections(
65
+ nav_sections: dict[SectionHeader, list[StreamlitPage]],
66
+ ) -> list[StreamlitPage]:
67
+ page_list = []
68
+ for pages in nav_sections.values():
69
+ page_list.extend(pages.copy())
70
+
71
+ return page_list
72
+
73
+
74
+ def send_page_not_found(ctx: ScriptRunContext) -> None:
75
+ msg = ForwardMsg()
76
+ msg.page_not_found.page_name = ""
77
+ ctx.enqueue(msg)
78
+
79
+
80
+ @gather_metrics("navigation")
81
+ def navigation(
82
+ pages: Sequence[PageType] | Mapping[SectionHeader, Sequence[PageType]],
83
+ *,
84
+ position: Literal["sidebar", "hidden", "top"] = "sidebar",
85
+ expanded: bool = False,
86
+ ) -> StreamlitPage:
87
+ """
88
+ Configure the available pages in a multipage app.
89
+
90
+ Call ``st.navigation`` in your entrypoint file to define the available
91
+ pages for your app. ``st.navigation`` returns the current page, which can
92
+ be executed using ``.run()`` method.
93
+
94
+ When using ``st.navigation``, your entrypoint file (the file passed to
95
+ ``streamlit run``) acts like a router or frame of common elements around
96
+ each of your pages. Streamlit executes the entrypoint file with every app
97
+ rerun. To execute the current page, you must call the ``.run()`` method on
98
+ the ``StreamlitPage`` object returned by ``st.navigation``.
99
+
100
+ The set of available pages can be updated with each rerun for dynamic
101
+ navigation. By default, ``st.navigation`` displays the available pages in
102
+ the sidebar if there is more than one page. This behavior can be changed
103
+ using the ``position`` keyword argument.
104
+
105
+ As soon as any session of your app executes the ``st.navigation`` command,
106
+ your app will ignore the ``pages/`` directory (across all sessions).
107
+
108
+ Parameters
109
+ ----------
110
+ pages : Sequence[page-like], Mapping[str, Sequence[page-like]]
111
+ The available pages for the app.
112
+
113
+ To create a navigation menu with no sections or page groupings,
114
+ ``pages`` must be a list of page-like objects. Page-like objects are
115
+ anything that can be passed to ``st.Page`` or a ``StreamlitPage``
116
+ object returned by ``st.Page``.
117
+
118
+ To create labeled sections or page groupings within the navigation
119
+ menu, ``pages`` must be a dictionary. Each key is the label of a
120
+ section and each value is the list of page-like objects for
121
+ that section. If you use ``position="top"``, each grouping will be a
122
+ collapsible item in the navigation menu. For top navigation, if you use
123
+ an empty string as a section header, the pages in that section will be
124
+ displayed at the beginning of the menu before the collapsible sections.
125
+
126
+ When you use a string or path as a page-like object, they are
127
+ internally passed to ``st.Page`` and converted to ``StreamlitPage``
128
+ objects. In this case, the page will have the default title, icon, and
129
+ path inferred from its path or filename. To customize these attributes
130
+ for your page, initialize your page with ``st.Page``.
131
+
132
+ position : "sidebar", "top", or "hidden"
133
+ The position of the navigation menu. If this is ``"sidebar"``
134
+ (default), the navigation widget appears at the top of the sidebar. If
135
+ this is ``"top"``, the navigation appears in the top header of the app.
136
+ If this is ``"hidden"``, the navigation widget is not displayed.
137
+
138
+ If there is only one page in ``pages``, the navigation will be hidden
139
+ for any value of ``position``.
140
+
141
+ expanded : bool
142
+ Whether the navigation menu should be expanded. If this is ``False``
143
+ (default), the navigation menu will be collapsed and will include a
144
+ button to view more options when there are too many pages to display.
145
+ If this is ``True``, the navigation menu will always be expanded; no
146
+ button to collapse the menu will be displayed.
147
+
148
+ If ``st.navigation`` changes from ``expanded=True`` to
149
+ ``expanded=False`` on a rerun, the menu will stay expanded and a
150
+ collapse button will be displayed.
151
+
152
+ The parameter is only used when ``position="sidebar"``.
153
+
154
+ Returns
155
+ -------
156
+ StreamlitPage
157
+ The current page selected by the user. To run the page, you must use
158
+ the ``.run()`` method on it.
159
+
160
+ Examples
161
+ --------
162
+ The following examples show different possible entrypoint files, each named
163
+ ``streamlit_app.py``. An entrypoint file is passed to ``streamlit run``. It
164
+ manages your app's navigation and serves as a router between pages.
165
+
166
+ **Example 1: Use a callable or Python file as a page**
167
+
168
+ You can declare pages from callables or file paths. If you pass callables
169
+ or paths to ``st.navigation`` as a page-like objects, they are internally
170
+ converted to ``StreamlitPage`` objects using ``st.Page``. In this case, the
171
+ page titles, icons, and paths are inferred from the file or callable names.
172
+
173
+ ``page_1.py`` (in the same directory as your entrypoint file):
174
+
175
+ >>> import streamlit as st
176
+ >>>
177
+ >>> st.title("Page 1")
178
+
179
+ ``streamlit_app.py``:
180
+
181
+ >>> import streamlit as st
182
+ >>>
183
+ >>> def page_2():
184
+ ... st.title("Page 2")
185
+ >>>
186
+ >>> pg = st.navigation(["page_1.py", page_2])
187
+ >>> pg.run()
188
+
189
+ .. output::
190
+ https://doc-navigation-example-1.streamlit.app/
191
+ height: 200px
192
+
193
+ **Example 2: Group pages into sections and customize them with ``st.Page``**
194
+
195
+ You can use a dictionary to create sections within your navigation menu. In
196
+ the following example, each page is similar to Page 1 in Example 1, and all
197
+ pages are in the same directory. However, you can use Python files from
198
+ anywhere in your repository. ``st.Page`` is used to give each page a custom
199
+ title. For more information, see |st.Page|_.
200
+
201
+ Directory structure:
202
+
203
+ >>> your_repository/
204
+ >>> ├── create_account.py
205
+ >>> ├── learn.py
206
+ >>> ├── manage_account.py
207
+ >>> ├── streamlit_app.py
208
+ >>> └── trial.py
209
+
210
+ ``streamlit_app.py``:
211
+
212
+ >>> import streamlit as st
213
+ >>>
214
+ >>> pages = {
215
+ ... "Your account": [
216
+ ... st.Page("create_account.py", title="Create your account"),
217
+ ... st.Page("manage_account.py", title="Manage your account"),
218
+ ... ],
219
+ ... "Resources": [
220
+ ... st.Page("learn.py", title="Learn about us"),
221
+ ... st.Page("trial.py", title="Try it out"),
222
+ ... ],
223
+ ... }
224
+ >>>
225
+ >>> pg = st.navigation(pages)
226
+ >>> pg.run()
227
+
228
+ .. output::
229
+ https://doc-navigation-example-2.streamlit.app/
230
+ height: 300px
231
+
232
+
233
+ **Example 3: Use top navigation**
234
+
235
+ You can use the ``position`` parameter to place the navigation at the top
236
+ of the app. This is useful for apps with a lot of pages because it allows
237
+ you to create collapsible sections for each group of pages. The following
238
+ example uses the same directory structure as Example 2 and shows how to
239
+ create a top navigation menu.
240
+
241
+ ``streamlit_app.py``:
242
+
243
+ >>> import streamlit as st
244
+ >>>
245
+ >>> pages = {
246
+ ... "Your account": [
247
+ ... st.Page("create_account.py", title="Create your account"),
248
+ ... st.Page("manage_account.py", title="Manage your account"),
249
+ ... ],
250
+ ... "Resources": [
251
+ ... st.Page("learn.py", title="Learn about us"),
252
+ ... st.Page("trial.py", title="Try it out"),
253
+ ... ],
254
+ ... }
255
+ >>>
256
+ >>> pg = st.navigation(pages, position="top")
257
+ >>> pg.run()
258
+
259
+ .. output::
260
+ https://doc-navigation-top.streamlit.app/
261
+ height: 300px
262
+
263
+ **Example 4: Stateful widgets across multiple pages**
264
+
265
+ Call widget functions in your entrypoint file when you want a widget to be
266
+ stateful across pages. Assign keys to your common widgets and access their
267
+ values through Session State within your pages.
268
+
269
+ ``streamlit_app.py``:
270
+
271
+ >>> import streamlit as st
272
+ >>>
273
+ >>> def page1():
274
+ >>> st.write(st.session_state.foo)
275
+ >>>
276
+ >>> def page2():
277
+ >>> st.write(st.session_state.bar)
278
+ >>>
279
+ >>> # Widgets shared by all the pages
280
+ >>> st.sidebar.selectbox("Foo", ["A", "B", "C"], key="foo")
281
+ >>> st.sidebar.checkbox("Bar", key="bar")
282
+ >>>
283
+ >>> pg = st.navigation([page1, page2])
284
+ >>> pg.run()
285
+
286
+ .. output::
287
+ https://doc-navigation-multipage-widgets.streamlit.app/
288
+ height: 350px
289
+
290
+ .. |st.Page| replace:: ``st.Page``
291
+ .. _st.Page: https://docs.streamlit.io/develop/api-reference/navigation/st.page
292
+
293
+ """
294
+ # Validate position parameter
295
+ if not isinstance(position, str) or position not in {"sidebar", "hidden", "top"}:
296
+ raise StreamlitAPIException(
297
+ f'Invalid position "{position}". '
298
+ 'The position parameter must be one of "sidebar", "hidden", or "top".'
299
+ )
300
+
301
+ # Disable the use of the pages feature (ie disregard v1 behavior of Multipage Apps)
302
+ PagesManager.uses_pages_directory = False
303
+
304
+ return _navigation(pages, position=position, expanded=expanded)
305
+
306
+
307
+ def _navigation(
308
+ pages: Sequence[PageType] | Mapping[SectionHeader, Sequence[PageType]],
309
+ *,
310
+ position: Literal["sidebar", "hidden", "top"],
311
+ expanded: bool,
312
+ ) -> StreamlitPage:
313
+ if isinstance(pages, Sequence):
314
+ converted_pages = [convert_to_streamlit_page(p) for p in pages]
315
+ nav_sections = {"": converted_pages}
316
+ else:
317
+ nav_sections = {
318
+ section: [convert_to_streamlit_page(p) for p in section_pages]
319
+ for section, section_pages in pages.items()
320
+ }
321
+ page_list = pages_from_nav_sections(nav_sections)
322
+
323
+ if not page_list:
324
+ raise StreamlitAPIException(
325
+ "`st.navigation` must be called with at least one `st.Page`."
326
+ )
327
+
328
+ default_page = None
329
+ pagehash_to_pageinfo: dict[PageHash, PageInfo] = {}
330
+
331
+ # Get the default page.
332
+ for section_header in nav_sections:
333
+ for page in nav_sections[section_header]:
334
+ if page._default:
335
+ if default_page is not None:
336
+ raise StreamlitAPIException(
337
+ "Multiple Pages specified with `default=True`. "
338
+ "At most one Page can be set to default."
339
+ )
340
+ default_page = page
341
+
342
+ if default_page is None:
343
+ default_page = page_list[0]
344
+ default_page._default = True
345
+
346
+ ctx = get_script_run_ctx()
347
+ if not ctx:
348
+ # This should never run in Streamlit, but we want to make sure that
349
+ # the function always returns a page
350
+ default_page._can_be_called = True
351
+ return default_page
352
+
353
+ # Build the pagehash-to-pageinfo mapping.
354
+ for section_header in nav_sections:
355
+ for page in nav_sections[section_header]:
356
+ script_path = str(page._page) if isinstance(page._page, Path) else ""
357
+
358
+ script_hash = page._script_hash
359
+ if script_hash in pagehash_to_pageinfo:
360
+ # The page script hash is solely based on the url path
361
+ # So duplicate page script hashes are due to duplicate url paths
362
+ raise StreamlitAPIException(
363
+ f"Multiple Pages specified with URL pathname {page.url_path}. "
364
+ "URL pathnames must be unique. The url pathname may be "
365
+ "inferred from the filename, callable name, or title."
366
+ )
367
+
368
+ pagehash_to_pageinfo[script_hash] = {
369
+ "page_script_hash": script_hash,
370
+ "page_name": page.title,
371
+ "icon": page.icon,
372
+ "script_path": script_path,
373
+ "url_pathname": page.url_path,
374
+ }
375
+
376
+ msg = ForwardMsg()
377
+ # Handle position logic correctly
378
+ if position == "hidden":
379
+ msg.navigation.position = NavigationProto.Position.HIDDEN
380
+ elif position == "top":
381
+ msg.navigation.position = NavigationProto.Position.TOP
382
+ elif position == "sidebar":
383
+ # Only apply config override if position is sidebar
384
+ if config.get_option("client.showSidebarNavigation") is False:
385
+ msg.navigation.position = NavigationProto.Position.HIDDEN
386
+ else:
387
+ msg.navigation.position = NavigationProto.Position.SIDEBAR
388
+
389
+ msg.navigation.expanded = expanded
390
+ msg.navigation.sections[:] = nav_sections.keys()
391
+ for section_header in nav_sections:
392
+ for page in nav_sections[section_header]:
393
+ p = msg.navigation.app_pages.add()
394
+ p.page_script_hash = page._script_hash
395
+ p.page_name = page.title
396
+ p.icon = f"emoji:{page.icon}" if is_emoji(page.icon) else page.icon
397
+ p.is_default = page._default
398
+ p.section_header = section_header
399
+ p.url_pathname = page.url_path
400
+ p.is_hidden = page._visibility == "hidden"
401
+
402
+ # Inform our page manager about the set of pages we have
403
+ ctx.pages_manager.set_pages(pagehash_to_pageinfo)
404
+ found_page = ctx.pages_manager.get_page_script(
405
+ fallback_page_hash=default_page._script_hash
406
+ )
407
+
408
+ page_to_return = None
409
+ if found_page:
410
+ found_page_script_hash = found_page["page_script_hash"]
411
+ matching_pages = [
412
+ p for p in page_list if p._script_hash == found_page_script_hash
413
+ ]
414
+ if len(matching_pages) > 0:
415
+ page_to_return = matching_pages[0]
416
+
417
+ if not page_to_return:
418
+ send_page_not_found(ctx)
419
+ page_to_return = default_page
420
+
421
+ # Ordain the page that can be called
422
+ page_to_return._can_be_called = True
423
+ msg.navigation.page_script_hash = page_to_return._script_hash
424
+ # Set the current page script hash to the page that is going to be executed
425
+ ctx.set_mpa_v2_page(page_to_return._script_hash)
426
+
427
+ # This will either navigation or yield if the page is not found
428
+ ctx.enqueue(msg)
429
+
430
+ return page_to_return