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,627 @@
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
+ import json
18
+ from dataclasses import dataclass
19
+ from typing import (
20
+ TYPE_CHECKING,
21
+ Any,
22
+ Final,
23
+ Literal,
24
+ TypeAlias,
25
+ TypedDict,
26
+ cast,
27
+ overload,
28
+ )
29
+
30
+ from streamlit import config
31
+ from streamlit.deprecation_util import (
32
+ make_deprecated_name_warning,
33
+ show_deprecation_warning,
34
+ )
35
+ from streamlit.elements.lib.form_utils import current_form_id
36
+ from streamlit.elements.lib.layout_utils import (
37
+ HeightWithoutContent,
38
+ LayoutConfig,
39
+ WidthWithoutContent,
40
+ validate_height,
41
+ validate_width,
42
+ )
43
+ from streamlit.elements.lib.policies import check_widget_policies
44
+ from streamlit.elements.lib.utils import Key, compute_and_register_element_id, to_key
45
+ from streamlit.errors import StreamlitAPIException
46
+ from streamlit.proto.DeckGlJsonChart_pb2 import DeckGlJsonChart as PydeckProto
47
+ from streamlit.runtime.metrics_util import gather_metrics
48
+ from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
49
+ from streamlit.runtime.state import (
50
+ WidgetCallback,
51
+ register_widget,
52
+ )
53
+ from streamlit.util import AttributeDictionary
54
+
55
+ if TYPE_CHECKING:
56
+ from collections.abc import Iterable, Mapping
57
+
58
+ from pydeck import Deck
59
+
60
+ from streamlit.delta_generator import DeltaGenerator
61
+
62
+
63
+ # Mapping used when no data is passed.
64
+ EMPTY_MAP: Final[Mapping[str, Any]] = {
65
+ "initialViewState": {"latitude": 0, "longitude": 0, "pitch": 0, "zoom": 1},
66
+ }
67
+
68
+ SelectionMode: TypeAlias = Literal["single-object", "multi-object"]
69
+ _SELECTION_MODES: Final[set[SelectionMode]] = {
70
+ "single-object",
71
+ "multi-object",
72
+ }
73
+
74
+
75
+ def parse_selection_mode(
76
+ selection_mode: SelectionMode | Iterable[SelectionMode],
77
+ ) -> set[PydeckProto.SelectionMode.ValueType]:
78
+ """Parse and check the user provided selection modes."""
79
+ if isinstance(selection_mode, str):
80
+ # Only a single selection mode was passed
81
+ selection_mode_set = {selection_mode}
82
+ else:
83
+ # Multiple selection modes were passed.
84
+ # This is not yet supported as a functionality, but the infra is here to
85
+ # support it in the future!
86
+ # @see DeckGlJsonChart.tsx
87
+ raise StreamlitAPIException(
88
+ f"Invalid selection mode: {selection_mode}. ",
89
+ "Selection mode must be a single value, but got a set instead.",
90
+ )
91
+
92
+ if not selection_mode_set.issubset(_SELECTION_MODES):
93
+ raise StreamlitAPIException(
94
+ f"Invalid selection mode: {selection_mode}. "
95
+ f"Valid options are: {_SELECTION_MODES}"
96
+ )
97
+
98
+ if selection_mode_set.issuperset({"single-object", "multi-object"}):
99
+ raise StreamlitAPIException(
100
+ "Only one of `single-object` or `multi-object` can be selected as selection mode."
101
+ )
102
+
103
+ parsed_selection_modes = []
104
+ for mode in selection_mode_set:
105
+ if mode == "single-object":
106
+ parsed_selection_modes.append(PydeckProto.SelectionMode.SINGLE_OBJECT)
107
+ elif mode == "multi-object":
108
+ parsed_selection_modes.append(PydeckProto.SelectionMode.MULTI_OBJECT)
109
+ return set(parsed_selection_modes)
110
+
111
+
112
+ class PydeckSelectionState(TypedDict, total=False):
113
+ r"""
114
+ The schema for the PyDeck chart selection state.
115
+
116
+ The selection state is stored in a dictionary-like object that supports
117
+ both key and attribute notation. Selection states cannot be
118
+ programmatically changed or set through Session State.
119
+
120
+ You must define ``id`` in ``pydeck.Layer`` to ensure statefulness when
121
+ using selections with ``st.pydeck_chart``.
122
+
123
+ Attributes
124
+ ----------
125
+ indices : dict[str, list[int]]
126
+ A dictionary of selected objects by layer. Each key in the dictionary
127
+ is a layer id, and each value is a list of object indices within that
128
+ layer.
129
+ objects : dict[str, list[dict[str, Any]]]
130
+ A dictionary of object attributes by layer. Each key in the dictionary
131
+ is a layer id, and each value is a list of metadata dictionaries for
132
+ the selected objects in that layer.
133
+
134
+ Examples
135
+ --------
136
+ The following example has multi-object selection enabled. The chart
137
+ displays US state capitals by population (2023 US Census estimate). You
138
+ can access this `data
139
+ <https://github.com/streamlit/docs/blob/main/python/api-examples-source/data/capitals.csv>`_
140
+ from GitHub.
141
+
142
+ >>> import streamlit as st
143
+ >>> import pydeck
144
+ >>> import pandas as pd
145
+ >>>
146
+ >>> capitals = pd.read_csv(
147
+ ... "capitals.csv",
148
+ ... header=0,
149
+ ... names=[
150
+ ... "Capital",
151
+ ... "State",
152
+ ... "Abbreviation",
153
+ ... "Latitude",
154
+ ... "Longitude",
155
+ ... "Population",
156
+ ... ],
157
+ ... )
158
+ >>> capitals["size"] = capitals.Population / 10
159
+ >>>
160
+ >>> point_layer = pydeck.Layer(
161
+ ... "ScatterplotLayer",
162
+ ... data=capitals,
163
+ ... id="capital-cities",
164
+ ... get_position=["Longitude", "Latitude"],
165
+ ... get_color="[255, 75, 75]",
166
+ ... pickable=True,
167
+ ... auto_highlight=True,
168
+ ... get_radius="size",
169
+ ... )
170
+ >>>
171
+ >>> view_state = pydeck.ViewState(
172
+ ... latitude=40, longitude=-117, controller=True, zoom=2.4, pitch=30
173
+ ... )
174
+ >>>
175
+ >>> chart = pydeck.Deck(
176
+ ... point_layer,
177
+ ... initial_view_state=view_state,
178
+ ... tooltip={"text": "{Capital}, {Abbreviation}\nPopulation: {Population}"},
179
+ ... )
180
+ >>>
181
+ >>> event = st.pydeck_chart(chart, on_select="rerun", selection_mode="multi-object")
182
+ >>>
183
+ >>> event.selection
184
+
185
+ .. output::
186
+ https://doc-pydeck-event-state-selections.streamlit.app/
187
+ height: 700px
188
+
189
+ This is an example of the selection state when selecting a single object
190
+ from a layer with id, ``"captial-cities"``:
191
+
192
+ >>> {
193
+ >>> "indices":{
194
+ >>> "capital-cities":[
195
+ >>> 2
196
+ >>> ]
197
+ >>> },
198
+ >>> "objects":{
199
+ >>> "capital-cities":[
200
+ >>> {
201
+ >>> "Abbreviation":" AZ"
202
+ >>> "Capital":"Phoenix"
203
+ >>> "Latitude":33.448457
204
+ >>> "Longitude":-112.073844
205
+ >>> "Population":1650070
206
+ >>> "State":" Arizona"
207
+ >>> "size":165007.0
208
+ >>> }
209
+ >>> ]
210
+ >>> }
211
+ >>> }
212
+
213
+ """
214
+
215
+ indices: dict[str, list[int]]
216
+ objects: dict[str, list[dict[str, Any]]]
217
+
218
+
219
+ class PydeckState(TypedDict, total=False):
220
+ """
221
+ The schema for the PyDeck event state.
222
+
223
+ The event state is stored in a dictionary-like object that supports both
224
+ key and attribute notation. Event states cannot be programmatically changed
225
+ or set through Session State.
226
+
227
+ Only selection events are supported at this time.
228
+
229
+ Attributes
230
+ ----------
231
+ selection : dict
232
+ The state of the ``on_select`` event. This attribute returns a
233
+ dictionary-like object that supports both key and attribute notation.
234
+ The attributes are described by the ``PydeckSelectionState``
235
+ dictionary schema.
236
+
237
+ """
238
+
239
+ selection: PydeckSelectionState
240
+
241
+
242
+ @dataclass
243
+ class PydeckSelectionSerde:
244
+ """PydeckSelectionSerde is used to serialize and deserialize the Pydeck selection state."""
245
+
246
+ def deserialize(self, ui_value: str | None) -> PydeckState:
247
+ empty_selection_state: PydeckState = {
248
+ "selection": {
249
+ "indices": {},
250
+ "objects": {},
251
+ }
252
+ }
253
+
254
+ selection_state = (
255
+ empty_selection_state if ui_value is None else json.loads(ui_value)
256
+ )
257
+
258
+ # We have seen some situations where the ui_value was just an empty
259
+ # dict, so we want to ensure that it always returns the empty state in
260
+ # case this happens.
261
+ if "selection" not in selection_state:
262
+ selection_state = empty_selection_state
263
+
264
+ return cast("PydeckState", AttributeDictionary(selection_state))
265
+
266
+ def serialize(self, selection_state: PydeckState) -> str:
267
+ return json.dumps(selection_state, default=str)
268
+
269
+
270
+ class PydeckMixin:
271
+ @overload
272
+ def pydeck_chart(
273
+ self,
274
+ pydeck_obj: Deck | None = None,
275
+ *,
276
+ width: WidthWithoutContent = "stretch",
277
+ use_container_width: bool | None = None,
278
+ height: HeightWithoutContent = 500,
279
+ selection_mode: Literal[
280
+ "single-object"
281
+ ], # Selection mode will only be activated by on_select param; default value here to make it work with mypy
282
+ # No default value here to make it work with mypy
283
+ on_select: Literal["ignore"],
284
+ key: Key | None = None,
285
+ ) -> DeltaGenerator: ...
286
+
287
+ @overload
288
+ def pydeck_chart(
289
+ self,
290
+ pydeck_obj: Deck | None = None,
291
+ *,
292
+ width: WidthWithoutContent = "stretch",
293
+ use_container_width: bool | None = None,
294
+ height: HeightWithoutContent = 500,
295
+ selection_mode: SelectionMode = "single-object",
296
+ on_select: Literal["rerun"] | WidgetCallback = "rerun",
297
+ key: Key | None = None,
298
+ ) -> PydeckState: ...
299
+
300
+ @gather_metrics("pydeck_chart")
301
+ def pydeck_chart(
302
+ self,
303
+ pydeck_obj: Deck | None = None,
304
+ *,
305
+ width: WidthWithoutContent = "stretch",
306
+ use_container_width: bool | None = None,
307
+ height: HeightWithoutContent = 500,
308
+ selection_mode: SelectionMode = "single-object",
309
+ on_select: Literal["rerun", "ignore"] | WidgetCallback = "ignore",
310
+ key: Key | None = None,
311
+ ) -> DeltaGenerator | PydeckState:
312
+ """Draw a chart using the PyDeck library.
313
+
314
+ This supports 3D maps, point clouds, and more! More info about PyDeck
315
+ at https://deckgl.readthedocs.io/en/latest/.
316
+
317
+ These docs are also quite useful:
318
+
319
+ - DeckGL docs: https://github.com/uber/deck.gl/tree/master/docs
320
+ - DeckGL JSON docs: https://github.com/uber/deck.gl/tree/master/modules/json
321
+
322
+ When using this command, a service called Carto_ provides the map tiles to render
323
+ map content. If you're using advanced PyDeck features you may need to obtain
324
+ an API key from Carto first. You can do that as
325
+ ``pydeck.Deck(api_keys={"carto": YOUR_KEY})`` or by setting the CARTO_API_KEY
326
+ environment variable. See `PyDeck's documentation`_ for more information.
327
+
328
+ Another common provider for map tiles is Mapbox_. If you prefer to use that,
329
+ you'll need to create an account at https://mapbox.com and specify your Mapbox
330
+ key when creating the ``pydeck.Deck`` object. You can do that as
331
+ ``pydeck.Deck(api_keys={"mapbox": YOUR_KEY})`` or by setting the MAPBOX_API_KEY
332
+ environment variable.
333
+
334
+ .. _Carto: https://carto.com
335
+ .. _Mapbox: https://mapbox.com
336
+ .. _PyDeck's documentation: https://deckgl.readthedocs.io/en/latest/deck.html
337
+
338
+ Carto and Mapbox are third-party products and Streamlit accepts no responsibility
339
+ or liability of any kind for Carto or Mapbox, or for any content or information
340
+ made available by Carto or Mapbox. The use of Carto or Mapbox is governed by
341
+ their respective Terms of Use.
342
+
343
+ .. note::
344
+ Pydeck uses two WebGL contexts per chart, and different browsers
345
+ have different limits on the number of WebGL contexts per page.
346
+ If you exceed this limit, the oldest contexts will be dropped to
347
+ make room for the new ones. To avoid this limitation in most
348
+ browsers, don't display more than eight Pydeck charts on a single
349
+ page.
350
+
351
+ Parameters
352
+ ----------
353
+ pydeck_obj : pydeck.Deck or None
354
+ Object specifying the PyDeck chart to draw.
355
+ width : "stretch" or int
356
+ The width of the chart element. This can be one of the following:
357
+
358
+ - ``"stretch"`` (default): The width of the element matches the
359
+ width of the parent container.
360
+ - An integer specifying the width in pixels: The element has a
361
+ fixed width. If the specified width is greater than the width of
362
+ the parent container, the width of the element matches the width
363
+ of the parent container.
364
+
365
+ use_container_width : bool or None
366
+ Whether to override the chart's native width with the width of
367
+ the parent container. This can be one of the following:
368
+
369
+ - ``None`` (default): Streamlit will use the chart's default behavior.
370
+ - ``True``: Streamlit sets the width of the chart to match the
371
+ width of the parent container.
372
+ - ``False``: Streamlit sets the width of the chart to fit its
373
+ contents according to the plotting library, up to the width of
374
+ the parent container.
375
+
376
+ .. deprecated::
377
+ ``use_container_width`` is deprecated and will be removed in a
378
+ future release. For ``use_container_width=True``, use
379
+ ``width="stretch"``.
380
+
381
+ height : "stretch" or int
382
+ The height of the chart element. This can be one of the following:
383
+
384
+ - An integer specifying the height in pixels: The element has a
385
+ fixed height. If the content is larger than the specified
386
+ height, scrolling is enabled. This is ``500`` by default.
387
+ - ``"stretch"``: The height of the element matches the height of
388
+ its content or the height of the parent container, whichever is
389
+ larger. If the element is not in a parent container, the height
390
+ of the element matches the height of its content.
391
+
392
+ on_select : "ignore" or "rerun" or callable
393
+ How the figure should respond to user selection events. This controls
394
+ whether or not the chart behaves like an input widget.
395
+ ``on_select`` can be one of the following:
396
+
397
+ - ``"ignore"`` (default): Streamlit will not react to any selection
398
+ events in the chart. The figure will not behave like an
399
+ input widget.
400
+ - ``"rerun"``: Streamlit will rerun the app when the user selects
401
+ data in the chart. In this case, ``st.pydeck_chart`` will return
402
+ the selection data as a dictionary.
403
+ - A ``callable``: Streamlit will rerun the app and execute the callable
404
+ as a callback function before the rest of the app. In this case,
405
+ ``st.pydeck_chart`` will return the selection data as a
406
+ dictionary.
407
+
408
+ If ``on_select`` is not ``"ignore"``, all layers must have a
409
+ declared ``id`` to keep the chart stateful across reruns.
410
+ selection_mode : "single-object" or "multi-object"
411
+ The selection mode of the chart. This can be one of the following:
412
+
413
+ - ``"single-object"`` (default): Only one object can be selected at
414
+ a time.
415
+ - ``"multi-object"``: Multiple objects can be selected at a time.
416
+
417
+ key : str
418
+ An optional string to use for giving this element a stable
419
+ identity. If ``key`` is ``None`` (default), this element's identity
420
+ will be determined based on the values of the other parameters.
421
+
422
+ Additionally, if selections are activated and ``key`` is provided,
423
+ Streamlit will register the key in Session State to store the
424
+ selection state. The selection state is read-only.
425
+
426
+ Returns
427
+ -------
428
+ element or dict
429
+ If ``on_select`` is ``"ignore"`` (default), this command returns an
430
+ internal placeholder for the chart element. Otherwise, this method
431
+ returns a dictionary-like object that supports both key and
432
+ attribute notation. The attributes are described by the
433
+ ``PydeckState`` dictionary schema.
434
+
435
+ Example
436
+ -------
437
+ Here's a chart using a HexagonLayer and a ScatterplotLayer. It uses either the
438
+ light or dark map style, based on which Streamlit theme is currently active:
439
+
440
+ >>> import pandas as pd
441
+ >>> import pydeck as pdk
442
+ >>> import streamlit as st
443
+ >>> from numpy.random import default_rng as rng
444
+ >>>
445
+ >>> df = pd.DataFrame(
446
+ ... rng(0).standard_normal((1000, 2)) / [50, 50] + [37.76, -122.4],
447
+ ... columns=["lat", "lon"],
448
+ ... )
449
+ >>>
450
+ >>> st.pydeck_chart(
451
+ ... pdk.Deck(
452
+ ... map_style=None, # Use Streamlit theme to pick map style
453
+ ... initial_view_state=pdk.ViewState(
454
+ ... latitude=37.76,
455
+ ... longitude=-122.4,
456
+ ... zoom=11,
457
+ ... pitch=50,
458
+ ... ),
459
+ ... layers=[
460
+ ... pdk.Layer(
461
+ ... "HexagonLayer",
462
+ ... data=df,
463
+ ... get_position="[lon, lat]",
464
+ ... radius=200,
465
+ ... elevation_scale=4,
466
+ ... elevation_range=[0, 1000],
467
+ ... pickable=True,
468
+ ... extruded=True,
469
+ ... ),
470
+ ... pdk.Layer(
471
+ ... "ScatterplotLayer",
472
+ ... data=df,
473
+ ... get_position="[lon, lat]",
474
+ ... get_color="[200, 30, 0, 160]",
475
+ ... get_radius=200,
476
+ ... ),
477
+ ... ],
478
+ ... )
479
+ ... )
480
+
481
+ .. output::
482
+ https://doc-pydeck-chart.streamlit.app/
483
+ height: 530px
484
+
485
+ .. note::
486
+ To make the PyDeck chart's style consistent with Streamlit's theme,
487
+ you can set ``map_style=None`` in the ``pydeck.Deck`` object.
488
+
489
+ """
490
+ if use_container_width is not None:
491
+ show_deprecation_warning(
492
+ make_deprecated_name_warning(
493
+ "use_container_width",
494
+ "width",
495
+ "2025-12-31",
496
+ "For `use_container_width=True`, use `width='stretch'`. "
497
+ "For `use_container_width=False`, specify an integer width.",
498
+ include_st_prefix=False,
499
+ ),
500
+ show_in_browser=False,
501
+ )
502
+ if use_container_width:
503
+ width = "stretch"
504
+ # Otherwise keep the provided width.
505
+
506
+ validate_width(width, allow_content=False)
507
+ validate_height(height, allow_content=False)
508
+
509
+ pydeck_proto = PydeckProto()
510
+
511
+ ctx = get_script_run_ctx()
512
+
513
+ spec = json.dumps(EMPTY_MAP) if pydeck_obj is None else pydeck_obj.to_json()
514
+
515
+ pydeck_proto.json = spec
516
+
517
+ tooltip = _get_pydeck_tooltip(pydeck_obj)
518
+ if tooltip:
519
+ pydeck_proto.tooltip = json.dumps(tooltip)
520
+
521
+ # Get the Mapbox key from the PyDeck object first, and then fallback to the
522
+ # old mapbox.token config option.
523
+
524
+ mapbox_token = getattr(pydeck_obj, "mapbox_key", None)
525
+ if mapbox_token is None or mapbox_token == "":
526
+ mapbox_token = config.get_option("mapbox.token")
527
+
528
+ if mapbox_token:
529
+ pydeck_proto.mapbox_token = mapbox_token
530
+
531
+ key = to_key(key)
532
+ is_selection_activated = on_select != "ignore"
533
+
534
+ if on_select not in {"ignore", "rerun"} and not callable(on_select):
535
+ raise StreamlitAPIException(
536
+ f"You have passed {on_select} to `on_select`. "
537
+ "But only 'ignore', 'rerun', or a callable is supported."
538
+ )
539
+
540
+ if is_selection_activated:
541
+ # Selections are activated, treat Pydeck as a widget:
542
+ pydeck_proto.selection_mode.extend(parse_selection_mode(selection_mode))
543
+
544
+ # Run some checks that are only relevant when selections are activated
545
+ is_callback = callable(on_select)
546
+ check_widget_policies(
547
+ self.dg,
548
+ key,
549
+ on_change=cast("WidgetCallback", on_select) if is_callback else None,
550
+ default_value=None,
551
+ writes_allowed=False,
552
+ enable_check_callback_rules=is_callback,
553
+ )
554
+ pydeck_proto.form_id = current_form_id(self.dg)
555
+
556
+ pydeck_proto.id = compute_and_register_element_id(
557
+ "deck_gl_json_chart",
558
+ user_key=key,
559
+ # When a key is provided, only selection_mode affects the element ID.
560
+ # This allows selection state to persist across data/spec changes.
561
+ # Note: This can lead to orphaned selections if data length shrinks,
562
+ # but the frontend handles this by sanitizing invalid indices.
563
+ key_as_main_identity={"selection_mode"},
564
+ dg=self.dg,
565
+ is_selection_activated=is_selection_activated,
566
+ selection_mode=selection_mode,
567
+ use_container_width=use_container_width,
568
+ spec=spec,
569
+ )
570
+
571
+ serde = PydeckSelectionSerde()
572
+
573
+ widget_state = register_widget(
574
+ pydeck_proto.id,
575
+ ctx=ctx,
576
+ deserializer=serde.deserialize,
577
+ on_change_handler=on_select if callable(on_select) else None,
578
+ serializer=serde.serialize,
579
+ value_type="string_value",
580
+ )
581
+
582
+ layout_config = LayoutConfig(width=width, height=height)
583
+ self.dg._enqueue(
584
+ "deck_gl_json_chart", pydeck_proto, layout_config=layout_config
585
+ )
586
+
587
+ return widget_state.value
588
+
589
+ layout_config = LayoutConfig(width=width, height=height)
590
+ return self.dg._enqueue(
591
+ "deck_gl_json_chart", pydeck_proto, layout_config=layout_config
592
+ )
593
+
594
+ @property
595
+ def dg(self) -> DeltaGenerator:
596
+ """Get our DeltaGenerator."""
597
+ return cast("DeltaGenerator", self)
598
+
599
+
600
+ def _get_pydeck_width(pydeck_obj: Deck | None) -> int | None:
601
+ """Extract the width from a pydeck Deck object, if specified."""
602
+ if pydeck_obj is None:
603
+ return None
604
+
605
+ width = getattr(pydeck_obj, "width", None)
606
+ if width is not None and isinstance(width, (int, float)):
607
+ return int(width)
608
+
609
+ return None
610
+
611
+
612
+ def _get_pydeck_tooltip(pydeck_obj: Deck | None) -> dict[str, str] | None:
613
+ if pydeck_obj is None:
614
+ return None
615
+
616
+ # For pydeck <0.8.1 or pydeck>=0.8.1 when jupyter extra is installed.
617
+ desk_widget = getattr(pydeck_obj, "deck_widget", None)
618
+ if desk_widget is not None and isinstance(desk_widget.tooltip, dict):
619
+ return desk_widget.tooltip
620
+
621
+ # For pydeck >=0.8.1 when jupyter extra is not installed.
622
+ # For details, see: https://github.com/visgl/deck.gl/pull/7125/files
623
+ tooltip = getattr(pydeck_obj, "_tooltip", None)
624
+ if tooltip is not None and isinstance(tooltip, dict):
625
+ return cast("dict[str, str]", tooltip)
626
+
627
+ return None