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,1093 @@
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 Sequence
18
+ from dataclasses import dataclass
19
+ from datetime import date, datetime, time, timedelta, timezone, tzinfo
20
+ from numbers import Integral, Real
21
+ from textwrap import dedent
22
+ from typing import (
23
+ TYPE_CHECKING,
24
+ Any,
25
+ Final,
26
+ TypeAlias,
27
+ TypedDict,
28
+ TypeVar,
29
+ cast,
30
+ overload,
31
+ )
32
+
33
+ from streamlit.elements.lib.form_utils import current_form_id
34
+ from streamlit.elements.lib.js_number import JSNumber, JSNumberBoundsException
35
+ from streamlit.elements.lib.layout_utils import LayoutConfig, validate_width
36
+ from streamlit.elements.lib.policies import (
37
+ check_widget_policies,
38
+ maybe_raise_label_warnings,
39
+ )
40
+ from streamlit.elements.lib.utils import (
41
+ Key,
42
+ LabelVisibility,
43
+ compute_and_register_element_id,
44
+ get_label_visibility_proto_value,
45
+ to_key,
46
+ )
47
+ from streamlit.errors import (
48
+ StreamlitAPIException,
49
+ StreamlitValueAboveMaxError,
50
+ StreamlitValueBelowMinError,
51
+ )
52
+ from streamlit.proto.Slider_pb2 import Slider as SliderProto
53
+ from streamlit.runtime.metrics_util import gather_metrics
54
+ from streamlit.runtime.scriptrunner import ScriptRunContext, get_script_run_ctx
55
+ from streamlit.runtime.state import (
56
+ BindOption,
57
+ WidgetArgs,
58
+ WidgetCallback,
59
+ WidgetKwargs,
60
+ get_session_state,
61
+ register_widget,
62
+ )
63
+
64
+ if TYPE_CHECKING:
65
+ from streamlit.delta_generator import DeltaGenerator
66
+ from streamlit.elements.lib.column_types import DateTimeFormat, NumberFormat
67
+ from streamlit.elements.lib.layout_utils import WidthWithoutContent
68
+
69
+ SliderNumericT = TypeVar("SliderNumericT", int, float)
70
+ SliderDatelikeT = TypeVar("SliderDatelikeT", date, time, datetime)
71
+
72
+ SliderNumericSpanT: TypeAlias = (
73
+ list[SliderNumericT]
74
+ | tuple[()]
75
+ | tuple[SliderNumericT]
76
+ | tuple[SliderNumericT, SliderNumericT]
77
+ )
78
+ SliderDatelikeSpanT: TypeAlias = (
79
+ list[SliderDatelikeT]
80
+ | tuple[()]
81
+ | tuple[SliderDatelikeT]
82
+ | tuple[SliderDatelikeT, SliderDatelikeT]
83
+ )
84
+
85
+ StepNumericT: TypeAlias = SliderNumericT
86
+ StepDatelikeT: TypeAlias = timedelta
87
+
88
+ SliderStep: TypeAlias = int | float | timedelta
89
+ SliderScalar: TypeAlias = int | float | date | time | datetime
90
+ SliderValueT = TypeVar("SliderValueT", int, float, date, time, datetime)
91
+ SliderValueGeneric: TypeAlias = SliderValueT | Sequence[SliderValueT]
92
+ SliderValue: TypeAlias = (
93
+ SliderValueGeneric[int]
94
+ | SliderValueGeneric[float]
95
+ | SliderValueGeneric[date]
96
+ | SliderValueGeneric[time]
97
+ | SliderValueGeneric[datetime]
98
+ )
99
+ SliderReturnGeneric: TypeAlias = (
100
+ SliderValueT | tuple[SliderValueT] | tuple[SliderValueT, SliderValueT]
101
+ )
102
+ SliderReturn: TypeAlias = (
103
+ SliderReturnGeneric[int]
104
+ | SliderReturnGeneric[float]
105
+ | SliderReturnGeneric[date]
106
+ | SliderReturnGeneric[time]
107
+ | SliderReturnGeneric[datetime]
108
+ )
109
+
110
+ SECONDS_TO_MICROS: Final = 1000 * 1000
111
+ DAYS_TO_MICROS: Final = 24 * 60 * 60 * SECONDS_TO_MICROS
112
+
113
+ UTC_EPOCH: Final = datetime(1970, 1, 1, tzinfo=timezone.utc)
114
+
115
+ SUPPORTED_TYPES: Final = {
116
+ Integral: SliderProto.INT,
117
+ Real: SliderProto.FLOAT,
118
+ datetime: SliderProto.DATETIME,
119
+ date: SliderProto.DATE,
120
+ time: SliderProto.TIME,
121
+ }
122
+ TIMELIKE_TYPES: Final = (SliderProto.DATETIME, SliderProto.TIME, SliderProto.DATE)
123
+
124
+
125
+ def _time_to_datetime(time_: time) -> datetime:
126
+ # Note, here we pick an arbitrary date well after Unix epoch.
127
+ # This prevents pre-epoch timezone issues (https://bugs.python.org/issue36759)
128
+ # We're dropping the date from datetime later, anyway.
129
+ return datetime.combine(date(2000, 1, 1), time_)
130
+
131
+
132
+ def _date_to_datetime(date_: date) -> datetime:
133
+ return datetime.combine(date_, time())
134
+
135
+
136
+ def _delta_to_micros(delta: timedelta) -> int:
137
+ return (
138
+ delta.microseconds
139
+ + delta.seconds * SECONDS_TO_MICROS
140
+ + delta.days * DAYS_TO_MICROS
141
+ )
142
+
143
+
144
+ def _datetime_to_micros(dt: datetime) -> int:
145
+ # The frontend is not aware of timezones and only expects a UTC-based
146
+ # timestamp (in microseconds). Since we want to show the date/time exactly
147
+ # as it is in the given datetime object, we just set the tzinfo to UTC and
148
+ # do not do any timezone conversions. Only the backend knows about
149
+ # original timezone and will replace the UTC timestamp in the deserialization.
150
+ utc_dt = dt.replace(tzinfo=timezone.utc)
151
+ return _delta_to_micros(utc_dt - UTC_EPOCH)
152
+
153
+
154
+ def _micros_to_datetime(micros: int, orig_tz: tzinfo | None) -> datetime:
155
+ """Restore times/datetimes to original timezone (dates are always naive)."""
156
+ utc_dt = UTC_EPOCH + timedelta(microseconds=micros)
157
+ # Add the original timezone. No conversion is required here,
158
+ # since in the serialization, we also just replace the timestamp with UTC.
159
+ return utc_dt.replace(tzinfo=orig_tz)
160
+
161
+
162
+ class SliderDefaultValues(TypedDict):
163
+ min_value: SliderScalar
164
+ max_value: SliderScalar
165
+ step: SliderStep
166
+ format: str
167
+
168
+
169
+ @dataclass
170
+ class SliderSerde:
171
+ value: list[float]
172
+ data_type: int
173
+ single_value: bool
174
+ orig_tz: tzinfo | None
175
+ min_value: float
176
+ max_value: float
177
+
178
+ def deserialize_single_value(self, value: float) -> SliderScalar:
179
+ if self.data_type == SliderProto.INT:
180
+ return int(value)
181
+ if self.data_type == SliderProto.DATETIME:
182
+ return _micros_to_datetime(int(value), self.orig_tz)
183
+ if self.data_type == SliderProto.DATE:
184
+ return _micros_to_datetime(int(value), self.orig_tz).date()
185
+ if self.data_type == SliderProto.TIME:
186
+ return (
187
+ _micros_to_datetime(int(value), self.orig_tz)
188
+ .time()
189
+ .replace(tzinfo=self.orig_tz)
190
+ )
191
+ return value
192
+
193
+ def deserialize(self, ui_value: list[float] | None) -> Any:
194
+ if ui_value is not None:
195
+ val = ui_value
196
+ expected_len = 1 if self.single_value else 2
197
+ if len(val) != expected_len:
198
+ # Wrong number of values (e.g. single URL param for a range
199
+ # slider); fall back to default so the URL param is cleared.
200
+ val = self.value
201
+ else:
202
+ # Reset to default if any value is outside [min_value, max_value].
203
+ # This rejects out-of-range values seeded from URL query params;
204
+ # a no-op for frontend values since the UI enforces bounds.
205
+ # TODO(query-params): URL values that pass bounds checking but
206
+ # don't align to the step (e.g., ?val=0.15 with step=0.1) are
207
+ # accepted as-is. Consider snapping to the nearest valid step
208
+ # for consistency with the UI.
209
+ for v in val:
210
+ if v < self.min_value or v > self.max_value:
211
+ val = self.value
212
+ break
213
+ else:
214
+ # Widget has not been used; fallback to the original value,
215
+ val = self.value
216
+
217
+ # The widget always returns a float array, so fix the return type if necessary
218
+ deserialized_values = [self.deserialize_single_value(v) for v in val]
219
+ return (
220
+ deserialized_values[0] if self.single_value else tuple(deserialized_values)
221
+ )
222
+
223
+ def serialize(self, v: Any) -> list[Any]:
224
+ range_value = isinstance(v, (list, tuple))
225
+ # Convert to list to handle tuples
226
+ processed_value = list(v) if range_value else [v]
227
+
228
+ if self.data_type == SliderProto.DATE:
229
+ return [
230
+ _datetime_to_micros(_date_to_datetime(val)) for val in processed_value
231
+ ]
232
+ if self.data_type == SliderProto.TIME:
233
+ return [
234
+ _datetime_to_micros(_time_to_datetime(val)) for val in processed_value
235
+ ]
236
+ if self.data_type == SliderProto.DATETIME:
237
+ return [_datetime_to_micros(val) for val in processed_value]
238
+ # For numeric types, ensure they are floats if not already
239
+ return [float(val) for val in processed_value]
240
+
241
+
242
+ class SliderMixin:
243
+ # If min/max/value/step are not provided, then we return an int.
244
+ # if ONLY step is provided, then it must be an int and we return an int.
245
+ @overload
246
+ def slider(
247
+ self,
248
+ label: str,
249
+ min_value: None = None,
250
+ max_value: None = None,
251
+ value: None = None,
252
+ step: int | None = None,
253
+ format: str | NumberFormat | None = None,
254
+ key: Key | None = None,
255
+ help: str | None = None,
256
+ on_change: WidgetCallback | None = None,
257
+ args: WidgetArgs | None = None,
258
+ kwargs: WidgetKwargs | None = None,
259
+ *,
260
+ disabled: bool = False,
261
+ label_visibility: LabelVisibility = "visible",
262
+ width: WidthWithoutContent = "stretch",
263
+ bind: BindOption = None,
264
+ ) -> int: ...
265
+
266
+ # If min-value or max_value is provided and a numeric type, and value (if provided)
267
+ # is a singular numeric, return the same numeric type.
268
+ @overload
269
+ def slider(
270
+ self,
271
+ label: str,
272
+ min_value: SliderNumericT | None = None,
273
+ max_value: SliderNumericT | None = None,
274
+ value: SliderNumericT | None = None,
275
+ step: StepNumericT[SliderNumericT] | None = None,
276
+ format: str | NumberFormat | None = None,
277
+ key: Key | None = None,
278
+ help: str | None = None,
279
+ on_change: WidgetCallback | None = None,
280
+ args: WidgetArgs | None = None,
281
+ kwargs: WidgetKwargs | None = None,
282
+ *,
283
+ disabled: bool = False,
284
+ label_visibility: LabelVisibility = "visible",
285
+ width: WidthWithoutContent = "stretch",
286
+ bind: BindOption = None,
287
+ ) -> SliderNumericT: ...
288
+
289
+ # If value is provided and a sequence of numeric type,
290
+ # return a tuple of the same numeric type.
291
+ @overload
292
+ def slider(
293
+ self,
294
+ label: str,
295
+ min_value: SliderNumericT | None = None,
296
+ max_value: SliderNumericT | None = None,
297
+ *,
298
+ value: SliderNumericSpanT[SliderNumericT],
299
+ step: StepNumericT[SliderNumericT] | None = None,
300
+ format: str | NumberFormat | None = None,
301
+ key: Key | None = None,
302
+ help: str | None = None,
303
+ on_change: WidgetCallback | None = None,
304
+ args: WidgetArgs | None = None,
305
+ kwargs: WidgetKwargs | None = None,
306
+ disabled: bool = False,
307
+ label_visibility: LabelVisibility = "visible",
308
+ width: WidthWithoutContent = "stretch",
309
+ bind: BindOption = None,
310
+ ) -> tuple[SliderNumericT, SliderNumericT]: ...
311
+
312
+ # If value is provided positionally and a sequence of numeric type,
313
+ # return a tuple of the same numeric type.
314
+ @overload
315
+ def slider(
316
+ self,
317
+ label: str,
318
+ min_value: SliderNumericT,
319
+ max_value: SliderNumericT,
320
+ value: SliderNumericSpanT[SliderNumericT],
321
+ step: StepNumericT[SliderNumericT] | None = None,
322
+ format: str | NumberFormat | None = None,
323
+ key: Key | None = None,
324
+ help: str | None = None,
325
+ on_change: WidgetCallback | None = None,
326
+ args: WidgetArgs | None = None,
327
+ kwargs: WidgetKwargs | None = None,
328
+ *,
329
+ disabled: bool = False,
330
+ label_visibility: LabelVisibility = "visible",
331
+ width: WidthWithoutContent = "stretch",
332
+ bind: BindOption = None,
333
+ ) -> tuple[SliderNumericT, SliderNumericT]: ...
334
+
335
+ # If min-value is provided and a datelike type, and value (if provided)
336
+ # is a singular datelike, return the same datelike type.
337
+ @overload
338
+ def slider(
339
+ self,
340
+ label: str,
341
+ min_value: SliderDatelikeT,
342
+ max_value: SliderDatelikeT | None = None,
343
+ value: SliderDatelikeT | None = None,
344
+ step: StepDatelikeT | None = None,
345
+ format: str | DateTimeFormat | None = None,
346
+ key: Key | None = None,
347
+ help: str | None = None,
348
+ on_change: WidgetCallback | None = None,
349
+ args: WidgetArgs | None = None,
350
+ kwargs: WidgetKwargs | None = None,
351
+ *,
352
+ disabled: bool = False,
353
+ label_visibility: LabelVisibility = "visible",
354
+ width: WidthWithoutContent = "stretch",
355
+ bind: BindOption = None,
356
+ ) -> SliderDatelikeT: ...
357
+
358
+ # If max-value is provided and a datelike type, and value (if provided)
359
+ # is a singular datelike, return the same datelike type.
360
+ @overload
361
+ def slider(
362
+ self,
363
+ label: str,
364
+ min_value: None = None,
365
+ *,
366
+ max_value: SliderDatelikeT,
367
+ value: SliderDatelikeT | None = None,
368
+ step: StepDatelikeT | None = None,
369
+ format: str | DateTimeFormat | None = None,
370
+ key: Key | None = None,
371
+ help: str | None = None,
372
+ on_change: WidgetCallback | None = None,
373
+ args: WidgetArgs | None = None,
374
+ kwargs: WidgetKwargs | None = None,
375
+ disabled: bool = False,
376
+ label_visibility: LabelVisibility = "visible",
377
+ width: WidthWithoutContent = "stretch",
378
+ bind: BindOption = None,
379
+ ) -> SliderDatelikeT: ...
380
+
381
+ # If value is provided and a datelike type, return the same datelike type.
382
+ @overload
383
+ def slider(
384
+ self,
385
+ label: str,
386
+ min_value: None = None,
387
+ max_value: None = None,
388
+ *,
389
+ value: SliderDatelikeT,
390
+ step: StepDatelikeT | None = None,
391
+ format: str | DateTimeFormat | None = None,
392
+ key: Key | None = None,
393
+ help: str | None = None,
394
+ on_change: WidgetCallback | None = None,
395
+ args: WidgetArgs | None = None,
396
+ kwargs: WidgetKwargs | None = None,
397
+ disabled: bool = False,
398
+ label_visibility: LabelVisibility = "visible",
399
+ width: WidthWithoutContent = "stretch",
400
+ bind: BindOption = None,
401
+ ) -> SliderDatelikeT: ...
402
+
403
+ # If value is provided and a sequence of datelike type,
404
+ # return a tuple of the same datelike type.
405
+ @overload
406
+ def slider(
407
+ self,
408
+ label: str,
409
+ min_value: SliderDatelikeT | None = None,
410
+ max_value: SliderDatelikeT | None = None,
411
+ *,
412
+ value: list[SliderDatelikeT]
413
+ | tuple[SliderDatelikeT]
414
+ | tuple[SliderDatelikeT, SliderDatelikeT],
415
+ step: StepDatelikeT | None = None,
416
+ format: str | DateTimeFormat | None = None,
417
+ key: Key | None = None,
418
+ help: str | None = None,
419
+ on_change: WidgetCallback | None = None,
420
+ args: WidgetArgs | None = None,
421
+ kwargs: WidgetKwargs | None = None,
422
+ disabled: bool = False,
423
+ label_visibility: LabelVisibility = "visible",
424
+ width: WidthWithoutContent = "stretch",
425
+ bind: BindOption = None,
426
+ ) -> tuple[SliderDatelikeT, SliderDatelikeT]: ...
427
+
428
+ # If value is provided positionally and a sequence of datelike type,
429
+ # return a tuple of the same datelike type.
430
+ @overload
431
+ def slider(
432
+ self,
433
+ label: str,
434
+ min_value: SliderDatelikeT,
435
+ max_value: SliderDatelikeT,
436
+ value: SliderDatelikeSpanT[SliderDatelikeT],
437
+ /,
438
+ step: StepDatelikeT | None = None,
439
+ format: str | DateTimeFormat | None = None,
440
+ key: Key | None = None,
441
+ help: str | None = None,
442
+ on_change: WidgetCallback | None = None,
443
+ args: WidgetArgs | None = None,
444
+ kwargs: WidgetKwargs | None = None,
445
+ *,
446
+ disabled: bool = False,
447
+ label_visibility: LabelVisibility = "visible",
448
+ width: WidthWithoutContent = "stretch",
449
+ bind: BindOption = None,
450
+ ) -> tuple[SliderDatelikeT, SliderDatelikeT]: ...
451
+
452
+ # https://github.com/python/mypy/issues/17614
453
+ @gather_metrics("slider") # type: ignore[misc]
454
+ def slider(
455
+ self,
456
+ label: str,
457
+ min_value: SliderScalar | None = None,
458
+ max_value: SliderScalar | None = None,
459
+ value: SliderValue | None = None,
460
+ step: SliderStep | None = None,
461
+ format: str | None = None,
462
+ key: Key | None = None,
463
+ help: str | None = None,
464
+ on_change: WidgetCallback | None = None,
465
+ args: WidgetArgs | None = None,
466
+ kwargs: WidgetKwargs | None = None,
467
+ *, # keyword-only arguments:
468
+ disabled: bool = False,
469
+ label_visibility: LabelVisibility = "visible",
470
+ width: WidthWithoutContent = "stretch",
471
+ bind: BindOption = None,
472
+ ) -> Any:
473
+ r"""Display a slider widget.
474
+
475
+ This supports int, float, date, time, and datetime types.
476
+
477
+ This also allows you to render a range slider by passing a two-element
478
+ tuple or list as the ``value``.
479
+
480
+ The difference between ``st.slider`` and ``st.select_slider`` is that
481
+ ``slider`` only accepts numerical or date/time data and takes a range as
482
+ input, while ``select_slider`` accepts any datatype and takes an iterable
483
+ set of options.
484
+
485
+ .. note::
486
+ Integer values exceeding +/- ``(1<<53) - 1`` cannot be accurately
487
+ stored or returned by the widget due to serialization constraints
488
+ between the Python server and JavaScript client. You must handle
489
+ such numbers as floats, leading to a loss in precision.
490
+
491
+ Parameters
492
+ ----------
493
+ label : str
494
+ A short label explaining to the user what this slider is for.
495
+ The label can optionally contain GitHub-flavored Markdown of the
496
+ following types: Bold, Italics, Strikethroughs, Inline Code, Links,
497
+ and Images. Images display like icons, with a max height equal to
498
+ the font height.
499
+
500
+ Unsupported Markdown elements are unwrapped so only their children
501
+ (text contents) render. Display unsupported elements as literal
502
+ characters by backslash-escaping them. E.g.,
503
+ ``"1\. Not an ordered list"``.
504
+
505
+ See the ``body`` parameter of |st.markdown|_ for additional,
506
+ supported Markdown directives.
507
+
508
+ For accessibility reasons, you should never set an empty label, but
509
+ you can hide it with ``label_visibility`` if needed. In the future,
510
+ we may disallow empty labels by raising an exception.
511
+
512
+ .. |st.markdown| replace:: ``st.markdown``
513
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
514
+
515
+ min_value : a supported type or None
516
+ The minimum permitted value.
517
+ If this is ``None`` (default), the minimum value depends on the
518
+ type as follows:
519
+
520
+ - integer: ``0``
521
+ - float: ``0.0``
522
+ - date or datetime: ``value - timedelta(days=14)``
523
+ - time: ``time.min``
524
+
525
+ max_value : a supported type or None
526
+ The maximum permitted value.
527
+ If this is ``None`` (default), the maximum value depends on the
528
+ type as follows:
529
+
530
+ - integer: ``100``
531
+ - float: ``1.0``
532
+ - date or datetime: ``value + timedelta(days=14)``
533
+ - time: ``time.max``
534
+
535
+ value : a supported type or a tuple/list of supported types or None
536
+ The value of the slider when it first renders. If a tuple/list
537
+ of two values is passed here, then a range slider with those lower
538
+ and upper bounds is rendered. For example, if set to `(1, 10)` the
539
+ slider will have a selectable range between 1 and 10.
540
+ This defaults to ``min_value``. If the type is not otherwise
541
+ specified in any of the numeric parameters, the widget will have an
542
+ integer value.
543
+
544
+ step : int, float, timedelta, or None
545
+ The stepping interval.
546
+ Defaults to 1 if the value is an int, 0.01 if a float,
547
+ timedelta(days=1) if a date/datetime, timedelta(minutes=15) if a time
548
+ (or if max_value - min_value < 1 day)
549
+
550
+ format : str or None
551
+ A printf-style format string or a predefined format name controlling
552
+ how the interface should display values. This does not impact the
553
+ return value.
554
+
555
+ For integers and floats, you can use a printf-style format string
556
+ or one of the following predefined formats:
557
+
558
+ - ``"plain"``: Show the full number without formatting (e.g. ``1234.567``).
559
+ - ``"localized"``: Show the number in the user's locale format (e.g. ``1,234.567``).
560
+ - ``"percent"``: Show as a percentage (e.g. ``50%`` from ``0.5``).
561
+ - ``"dollar"``: Show as US dollars (e.g. ``$1,234.57``).
562
+ - ``"euro"``: Show as euros (e.g. ``€1,234.57``).
563
+ - ``"yen"``: Show as Japanese yen (e.g. ``¥1,235``).
564
+ - ``"compact"``: Show in compact notation (e.g. ``1.2K``).
565
+ - ``"scientific"``: Show in scientific notation (e.g. ``1.235E3``).
566
+ - ``"engineering"``: Show in engineering notation (e.g. ``1.235E3``).
567
+ - ``"accounting"``: Show in accounting format with parentheses for negatives.
568
+ - ``"bytes"``: Show in byte units (e.g. ``1.2KB``).
569
+
570
+ For information about printf-style format strings, see
571
+ `sprintf.js
572
+ <https://github.com/alexei/sprintf.js?tab=readme-ov-file#format-specification>`_.
573
+ For example, ``format="%0.1f"`` adjusts the displayed decimal
574
+ precision to only show one digit after the decimal. Use ``,`` for
575
+ thousand separators (e.g. ``"%,d"`` yields ``"1,234"``).
576
+
577
+ For datetimes, dates, and times, you can use a momentJS format string
578
+ or one of the following predefined formats:
579
+
580
+ - ``"localized"``: Show in the user's locale format.
581
+ - ``"distance"``: Show as relative time (e.g. ``"2 hours ago"``).
582
+ - ``"calendar"``: Show as calendar time (e.g. ``"Tomorrow 12:00"``).
583
+ Works best with datetime values. For date-only values, displays
584
+ relative day names (e.g. ``"Yesterday"``). For time-only values,
585
+ this format may produce unexpected results.
586
+ - ``"iso8601"``: Show in ISO 8601 format.
587
+
588
+ For information about momentJS format strings, see
589
+ `momentJS <https://momentjs.com/docs/#/displaying/format/>`_.
590
+ For example, ``format="ddd ha"`` adjusts the displayed datetime to
591
+ show the day of the week and the hour ("Tue 8pm").
592
+
593
+ key : str or int
594
+ An optional string or integer to use as the unique key for the widget.
595
+ If this is omitted, a key will be generated for the widget
596
+ based on its content. No two widgets may have the same key.
597
+
598
+ help : str or None
599
+ A tooltip that gets displayed next to the widget label. Streamlit
600
+ only displays the tooltip when ``label_visibility="visible"``. If
601
+ this is ``None`` (default), no tooltip is displayed.
602
+
603
+ The tooltip can optionally contain GitHub-flavored Markdown,
604
+ including the Markdown directives described in the ``body``
605
+ parameter of ``st.markdown``.
606
+
607
+ on_change : callable
608
+ An optional callback invoked when this slider's value changes.
609
+
610
+ args : list or tuple
611
+ An optional list or tuple of args to pass to the callback.
612
+
613
+ kwargs : dict
614
+ An optional dict of kwargs to pass to the callback.
615
+
616
+ disabled : bool
617
+ An optional boolean that disables the slider if set to ``True``.
618
+ The default is ``False``.
619
+
620
+ label_visibility : "visible", "hidden", or "collapsed"
621
+ The visibility of the label. The default is ``"visible"``. If this
622
+ is ``"hidden"``, Streamlit displays an empty spacer instead of the
623
+ label, which can help keep the widget aligned with other widgets.
624
+ If this is ``"collapsed"``, Streamlit displays no label or spacer.
625
+
626
+ width : "stretch" or int
627
+ The width of the slider widget. This can be one of the
628
+ following:
629
+
630
+ - ``"stretch"`` (default): The width of the widget matches the
631
+ width of the parent container.
632
+ - An integer specifying the width in pixels: The widget has a
633
+ fixed width. If the specified width is greater than the width of
634
+ the parent container, the width of the widget matches the width
635
+ of the parent container.
636
+
637
+ bind : "query-params" or None
638
+ If set to ``"query-params"``, the widget's value will be synced
639
+ with a URL query parameter. When the widget value changes, the URL
640
+ is updated; when the page loads with a query parameter, the widget
641
+ is initialized from it. Out-of-range URL values (outside
642
+ ``min_value``/``max_value``) are ignored, reverting the widget to
643
+ its default value. Range sliders use repeated parameters
644
+ (e.g., ``?key=10&key=90``). Requires a ``key`` to be set, which
645
+ will be used as the query parameter name. The default is ``None``.
646
+
647
+ Returns
648
+ -------
649
+ int/float/date/time/datetime or tuple of int/float/date/time/datetime
650
+ The current value of the slider widget. The return type will match
651
+ the data type of the value parameter.
652
+
653
+ Examples
654
+ --------
655
+ >>> import streamlit as st
656
+ >>>
657
+ >>> age = st.slider("How old are you?", 0, 130, 25)
658
+ >>> st.write("I'm ", age, "years old")
659
+
660
+ And here's an example of a range slider:
661
+
662
+ >>> import streamlit as st
663
+ >>>
664
+ >>> values = st.slider("Select a range of values", 0.0, 100.0, (25.0, 75.0))
665
+ >>> st.write("Values:", values)
666
+
667
+ This is a range time slider:
668
+
669
+ >>> import streamlit as st
670
+ >>> from datetime import time
671
+ >>>
672
+ >>> appointment = st.slider(
673
+ ... "Schedule your appointment:", value=(time(11, 30), time(12, 45))
674
+ ... )
675
+ >>> st.write("You're scheduled for:", appointment)
676
+
677
+ Finally, a datetime slider:
678
+
679
+ >>> import streamlit as st
680
+ >>> from datetime import datetime
681
+ >>>
682
+ >>> start_time = st.slider(
683
+ ... "When do you start?",
684
+ ... value=datetime(2020, 1, 1, 9, 30),
685
+ ... format="MM/DD/YY - hh:mm",
686
+ ... )
687
+ >>> st.write("Start time:", start_time)
688
+
689
+ .. output::
690
+ https://doc-slider.streamlit.app/
691
+ height: 300px
692
+
693
+ """
694
+ ctx = get_script_run_ctx()
695
+ return self._slider(
696
+ label=label,
697
+ min_value=min_value,
698
+ max_value=max_value,
699
+ value=value,
700
+ step=step,
701
+ format=format,
702
+ key=key,
703
+ help=help,
704
+ on_change=on_change,
705
+ args=args,
706
+ kwargs=kwargs,
707
+ disabled=disabled,
708
+ label_visibility=label_visibility,
709
+ width=width,
710
+ bind=bind,
711
+ ctx=ctx,
712
+ )
713
+
714
+ def _slider(
715
+ self,
716
+ label: str,
717
+ min_value: Any = None,
718
+ max_value: Any = None,
719
+ value: Any = None,
720
+ step: Any = None,
721
+ format: str | None = None,
722
+ key: Key | None = None,
723
+ help: str | None = None,
724
+ on_change: WidgetCallback | None = None,
725
+ args: WidgetArgs | None = None,
726
+ kwargs: WidgetKwargs | None = None,
727
+ *, # keyword-only arguments:
728
+ disabled: bool = False,
729
+ label_visibility: LabelVisibility = "visible",
730
+ width: WidthWithoutContent = "stretch",
731
+ bind: BindOption = None,
732
+ ctx: ScriptRunContext | None = None,
733
+ ) -> SliderReturn:
734
+ key = to_key(key)
735
+
736
+ check_widget_policies(
737
+ self.dg,
738
+ key,
739
+ on_change,
740
+ default_value=value,
741
+ )
742
+ maybe_raise_label_warnings(label, label_visibility)
743
+
744
+ element_id = compute_and_register_element_id(
745
+ "slider",
746
+ user_key=key,
747
+ # Treat the provided key as the main identity; only include
748
+ # changes to the value-shaping arguments in the identity
749
+ # computation as those can invalidate the current value.
750
+ key_as_main_identity={"min_value", "max_value", "step"},
751
+ dg=self.dg,
752
+ label=label,
753
+ min_value=min_value,
754
+ max_value=max_value,
755
+ value=value,
756
+ step=step,
757
+ format=format,
758
+ help=help,
759
+ width=width,
760
+ )
761
+
762
+ if value is None:
763
+ # We need to know if this is a single or range slider, but don't have
764
+ # a default value, so we check if session_state can tell us.
765
+ # We already calculated the id, so there is no risk of this causing
766
+ # the id to change.
767
+
768
+ single_value = True
769
+
770
+ session_state = get_session_state().filtered_state
771
+
772
+ if key is not None and key in session_state:
773
+ state_value = session_state[key]
774
+ single_value = isinstance(state_value, tuple(SUPPORTED_TYPES.keys()))
775
+
776
+ if single_value:
777
+ value = min_value if min_value is not None else 0
778
+ else:
779
+ mn = min_value if min_value is not None else 0
780
+ mx = max_value if max_value is not None else 100
781
+ value = [mn, mx]
782
+
783
+ # Ensure that the value is either a single value or a range of values.
784
+ single_value = isinstance(value, tuple(SUPPORTED_TYPES.keys()))
785
+ range_value = isinstance(value, (list, tuple)) and len(value) in {0, 1, 2}
786
+ if not single_value and not range_value:
787
+ raise StreamlitAPIException(
788
+ "Slider value should either be an int/float/datetime or a list/tuple of "
789
+ "0 to 2 ints/floats/datetimes"
790
+ )
791
+
792
+ # Simplify future logic by always making value a list
793
+ prepared_value: Sequence[SliderScalar] = [value] if single_value else value # ty: ignore[invalid-assignment]
794
+
795
+ def value_to_generic_type(v: Any) -> SliderProto.DataType.ValueType:
796
+ if isinstance(v, Integral):
797
+ return SUPPORTED_TYPES[Integral]
798
+ if isinstance(v, Real):
799
+ return SUPPORTED_TYPES[Real]
800
+ return SUPPORTED_TYPES[type(v)]
801
+
802
+ def all_same_type(items: Any) -> bool:
803
+ return len(set(map(value_to_generic_type, items))) < 2
804
+
805
+ if not all_same_type(prepared_value):
806
+ raise StreamlitAPIException(
807
+ "Slider tuple/list components must be of the same type.\n"
808
+ f"But were: {list(map(type, prepared_value))}"
809
+ )
810
+
811
+ data_type = (
812
+ SliderProto.INT
813
+ if len(prepared_value) == 0
814
+ else value_to_generic_type(prepared_value[0])
815
+ )
816
+
817
+ datetime_min: datetime | time = time.min
818
+ datetime_max: datetime | time = time.max
819
+ if data_type == SliderProto.TIME:
820
+ prepared_value = cast("Sequence[time]", prepared_value)
821
+
822
+ datetime_min = time.min.replace(tzinfo=prepared_value[0].tzinfo)
823
+ datetime_max = time.max.replace(tzinfo=prepared_value[0].tzinfo)
824
+ if data_type in {SliderProto.DATETIME, SliderProto.DATE}:
825
+ prepared_value = cast("Sequence[datetime]", prepared_value)
826
+
827
+ datetime_min = prepared_value[0] - timedelta(days=14)
828
+ datetime_max = prepared_value[0] + timedelta(days=14)
829
+
830
+ defaults: Final[dict[SliderProto.DataType.ValueType, dict[str, Any]]] = {
831
+ SliderProto.INT: {
832
+ "min_value": 0,
833
+ "max_value": 100,
834
+ "step": 1,
835
+ "format": "%d",
836
+ },
837
+ SliderProto.FLOAT: {
838
+ "min_value": 0.0,
839
+ "max_value": 1.0,
840
+ "step": 0.01,
841
+ "format": "%0.2f",
842
+ },
843
+ SliderProto.DATETIME: {
844
+ "min_value": datetime_min,
845
+ "max_value": datetime_max,
846
+ "step": timedelta(days=1),
847
+ "format": "YYYY-MM-DD",
848
+ },
849
+ SliderProto.DATE: {
850
+ "min_value": datetime_min,
851
+ "max_value": datetime_max,
852
+ "step": timedelta(days=1),
853
+ "format": "YYYY-MM-DD",
854
+ },
855
+ SliderProto.TIME: {
856
+ "min_value": datetime_min,
857
+ "max_value": datetime_max,
858
+ "step": timedelta(minutes=15),
859
+ "format": "HH:mm",
860
+ },
861
+ }
862
+
863
+ if min_value is None:
864
+ min_value = defaults[data_type]["min_value"]
865
+ if max_value is None:
866
+ max_value = defaults[data_type]["max_value"]
867
+ if step is None:
868
+ step = defaults[data_type]["step"]
869
+ if data_type in {
870
+ SliderProto.DATETIME,
871
+ SliderProto.DATE,
872
+ } and max_value - min_value < timedelta(days=1):
873
+ step = timedelta(minutes=15)
874
+ if format is None:
875
+ format = cast("str", defaults[data_type]["format"]) # noqa: A001
876
+
877
+ if step == 0:
878
+ raise StreamlitAPIException(
879
+ "Slider components cannot be passed a `step` of 0."
880
+ )
881
+
882
+ # Ensure that all arguments are of the same type.
883
+ slider_args = [min_value, max_value, step]
884
+ int_args = all(isinstance(a, Integral) for a in slider_args)
885
+ float_args = all(
886
+ isinstance(a, Real) and not isinstance(a, Integral) for a in slider_args
887
+ )
888
+ # When min and max_value are the same timelike, step should be a timedelta
889
+ timelike_args = (
890
+ data_type in TIMELIKE_TYPES
891
+ and isinstance(step, timedelta)
892
+ and type(min_value) is type(max_value)
893
+ )
894
+
895
+ if not int_args and not float_args and not timelike_args:
896
+ msg = (
897
+ "Slider value arguments must be of matching types."
898
+ f"\n`min_value` has {type(min_value).__name__} type."
899
+ f"\n`max_value` has {type(max_value).__name__} type."
900
+ f"\n`step` has {type(step).__name__} type."
901
+ )
902
+ raise StreamlitAPIException(msg)
903
+
904
+ # Ensure that the value matches arguments' types.
905
+ all_ints = data_type == SliderProto.INT and int_args
906
+ all_floats = data_type == SliderProto.FLOAT and float_args
907
+ all_timelikes = data_type in TIMELIKE_TYPES and timelike_args
908
+
909
+ if not all_ints and not all_floats and not all_timelikes:
910
+ msg = (
911
+ "Both value and arguments must be of the same type."
912
+ f"\n`value` has {type(value).__name__} type."
913
+ f"\n`min_value` has {type(min_value).__name__} type."
914
+ f"\n`max_value` has {type(max_value).__name__} type."
915
+ )
916
+ raise StreamlitAPIException(msg)
917
+
918
+ # Ensure that min <= value(s) <= max, adjusting the bounds as necessary.
919
+ min_value = min(min_value, max_value)
920
+ max_value = max(min_value, max_value)
921
+ if len(prepared_value) == 1:
922
+ min_value = min(prepared_value[0], min_value)
923
+ max_value = max(prepared_value[0], max_value)
924
+ elif len(prepared_value) == 2:
925
+ start, end = prepared_value
926
+ if start > end: # type: ignore[operator]
927
+ # Swap start and end, since they seem reversed
928
+ start, end = end, start
929
+ prepared_value = start, end
930
+ min_value = min(start, min_value)
931
+ max_value = max(end, max_value)
932
+ else:
933
+ # Empty list, so let's just use the outer bounds
934
+ prepared_value = [min_value, max_value]
935
+
936
+ # Bounds checks. JSNumber produces human-readable exceptions that
937
+ # we simply re-package as StreamlitAPIExceptions.
938
+ # (We check `min_value` and `max_value` here; `value` and `step` are
939
+ # already known to be in the [min_value, max_value] range.)
940
+ try:
941
+ if all_ints:
942
+ JSNumber.validate_int_bounds(min_value, "`min_value`")
943
+ JSNumber.validate_int_bounds(max_value, "`max_value`")
944
+ elif all_floats:
945
+ JSNumber.validate_float_bounds(min_value, "`min_value`")
946
+ JSNumber.validate_float_bounds(max_value, "`max_value`")
947
+ elif all_timelikes:
948
+ # No validation yet. TODO: check between 0001-01-01 to 9999-12-31
949
+ pass
950
+ except JSNumberBoundsException as e:
951
+ raise StreamlitAPIException(str(e))
952
+
953
+ orig_tz = None
954
+ # Convert dates or times into datetimes
955
+ if data_type == SliderProto.TIME:
956
+ prepared_value = cast("Sequence[time]", prepared_value)
957
+ min_value = cast("time", min_value)
958
+ max_value = cast("time", max_value)
959
+
960
+ prepared_value = list(map(_time_to_datetime, prepared_value))
961
+ min_value = _time_to_datetime(min_value)
962
+ max_value = _time_to_datetime(max_value)
963
+
964
+ if data_type == SliderProto.DATE:
965
+ prepared_value = cast("Sequence[date]", prepared_value)
966
+ min_value = cast("date", min_value)
967
+ max_value = cast("date", max_value)
968
+
969
+ prepared_value = list(map(_date_to_datetime, prepared_value))
970
+ min_value = _date_to_datetime(min_value)
971
+ max_value = _date_to_datetime(max_value)
972
+
973
+ # The frontend will error if the values are equal, so checking here
974
+ # lets us produce a nicer python error message and stack trace.
975
+ if min_value == max_value:
976
+ raise StreamlitAPIException(
977
+ "Slider `min_value` must be less than the `max_value`."
978
+ f"\nThe values were {min_value} and {max_value}."
979
+ )
980
+
981
+ # Now, convert to microseconds (so we can serialize datetime to a long)
982
+ if data_type in TIMELIKE_TYPES:
983
+ prepared_value = cast("Sequence[datetime]", prepared_value)
984
+ min_value = cast("datetime", min_value)
985
+ max_value = cast("datetime", max_value)
986
+ step = cast("timedelta", step)
987
+
988
+ # Restore times/datetimes to original timezone (dates are always naive)
989
+ orig_tz = (
990
+ prepared_value[0].tzinfo
991
+ if data_type in {SliderProto.TIME, SliderProto.DATETIME}
992
+ else None
993
+ )
994
+
995
+ prepared_value = list(map(_datetime_to_micros, prepared_value))
996
+ min_value = _datetime_to_micros(min_value)
997
+ max_value = _datetime_to_micros(max_value)
998
+ step = _delta_to_micros(step)
999
+
1000
+ # At this point, prepared_value is expected to be a list of floats:
1001
+ prepared_value = cast("list[float]", prepared_value)
1002
+
1003
+ # It would be great if we could guess the number of decimal places from
1004
+ # the `step` argument, but this would only be meaningful if step were a
1005
+ # decimal. As a possible improvement we could make this function accept
1006
+ # decimals and/or use some heuristics for floats.
1007
+
1008
+ slider_proto = SliderProto()
1009
+ slider_proto.type = SliderProto.Type.SLIDER
1010
+ slider_proto.id = element_id
1011
+ slider_proto.label = label
1012
+ slider_proto.format = format
1013
+ slider_proto.default[:] = prepared_value
1014
+ slider_proto.min = min_value
1015
+ slider_proto.max = max_value
1016
+ slider_proto.step = cast("float", step)
1017
+ slider_proto.data_type = data_type
1018
+ slider_proto.options[:] = []
1019
+ slider_proto.form_id = current_form_id(self.dg)
1020
+ slider_proto.disabled = disabled
1021
+ slider_proto.label_visibility.value = get_label_visibility_proto_value(
1022
+ label_visibility
1023
+ )
1024
+
1025
+ if help is not None:
1026
+ slider_proto.help = dedent(help)
1027
+
1028
+ if bind and key:
1029
+ slider_proto.query_param_key = str(key)
1030
+
1031
+ serde = SliderSerde(
1032
+ prepared_value,
1033
+ data_type,
1034
+ single_value,
1035
+ orig_tz,
1036
+ # Proto min/max are always serialized as doubles (dates/times
1037
+ # become microsecond floats), so the cast is safe here.
1038
+ min_value=cast("float", slider_proto.min), # type: ignore[redundant-cast]
1039
+ max_value=cast("float", slider_proto.max), # type: ignore[redundant-cast]
1040
+ )
1041
+
1042
+ widget_state = register_widget(
1043
+ slider_proto.id,
1044
+ on_change_handler=on_change,
1045
+ args=args,
1046
+ kwargs=kwargs,
1047
+ deserializer=serde.deserialize,
1048
+ serializer=serde.serialize,
1049
+ ctx=ctx,
1050
+ value_type="double_array_value",
1051
+ bind=bind,
1052
+ # Sliders always have a value (no empty/cleared state in the UI),
1053
+ # so disallow empty URL params (e.g., ?key=).
1054
+ clearable=False,
1055
+ )
1056
+
1057
+ if widget_state.value_changed:
1058
+ # Min/Max bounds checks when the value is updated.
1059
+ serialized_values = serde.serialize(widget_state.value)
1060
+ slider_min = slider_proto.min
1061
+ slider_max = slider_proto.max
1062
+ if not isinstance(slider_min, (int, float)) or not isinstance(
1063
+ slider_max, (int, float)
1064
+ ):
1065
+ raise StreamlitAPIException("Slider bounds must be numeric.")
1066
+ for serialized_value in serialized_values:
1067
+ # Use the deserialized values for more readable error messages for dates/times
1068
+ deserialized_value = serde.deserialize_single_value(serialized_value)
1069
+
1070
+ if serialized_value < slider_min:
1071
+ raise StreamlitValueBelowMinError(
1072
+ value=deserialized_value,
1073
+ min_value=serde.deserialize_single_value(slider_min),
1074
+ )
1075
+ if serialized_value > slider_max:
1076
+ raise StreamlitValueAboveMaxError(
1077
+ value=deserialized_value,
1078
+ max_value=serde.deserialize_single_value(slider_max),
1079
+ )
1080
+
1081
+ slider_proto.value[:] = serialized_values
1082
+ slider_proto.set_value = True
1083
+
1084
+ validate_width(width)
1085
+ layout_config = LayoutConfig(width=width)
1086
+
1087
+ self.dg._enqueue("slider", slider_proto, layout_config=layout_config)
1088
+ return cast("SliderReturn", widget_state.value)
1089
+
1090
+ @property
1091
+ def dg(self) -> DeltaGenerator:
1092
+ """Get our DeltaGenerator."""
1093
+ return cast("DeltaGenerator", self)