streamlit-nightly 1.43.2.dev20250307__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 (563) hide show
  1. streamlit/__init__.py +306 -0
  2. streamlit/__main__.py +20 -0
  3. streamlit/auth_util.py +218 -0
  4. streamlit/cli_util.py +105 -0
  5. streamlit/column_config.py +56 -0
  6. streamlit/commands/__init__.py +13 -0
  7. streamlit/commands/echo.py +126 -0
  8. streamlit/commands/execution_control.py +238 -0
  9. streamlit/commands/experimental_query_params.py +169 -0
  10. streamlit/commands/logo.py +189 -0
  11. streamlit/commands/navigation.py +385 -0
  12. streamlit/commands/page_config.py +311 -0
  13. streamlit/components/__init__.py +13 -0
  14. streamlit/components/lib/__init__.py +13 -0
  15. streamlit/components/lib/local_component_registry.py +84 -0
  16. streamlit/components/types/__init__.py +13 -0
  17. streamlit/components/types/base_component_registry.py +99 -0
  18. streamlit/components/types/base_custom_component.py +150 -0
  19. streamlit/components/v1/__init__.py +31 -0
  20. streamlit/components/v1/component_arrow.py +141 -0
  21. streamlit/components/v1/component_registry.py +130 -0
  22. streamlit/components/v1/components.py +38 -0
  23. streamlit/components/v1/custom_component.py +243 -0
  24. streamlit/config.py +1513 -0
  25. streamlit/config_option.py +311 -0
  26. streamlit/config_util.py +177 -0
  27. streamlit/connections/__init__.py +28 -0
  28. streamlit/connections/base_connection.py +174 -0
  29. streamlit/connections/snowflake_connection.py +562 -0
  30. streamlit/connections/snowpark_connection.py +213 -0
  31. streamlit/connections/sql_connection.py +425 -0
  32. streamlit/connections/util.py +97 -0
  33. streamlit/cursor.py +210 -0
  34. streamlit/dataframe_util.py +1416 -0
  35. streamlit/delta_generator.py +602 -0
  36. streamlit/delta_generator_singletons.py +204 -0
  37. streamlit/deprecation_util.py +209 -0
  38. streamlit/development.py +21 -0
  39. streamlit/elements/__init__.py +13 -0
  40. streamlit/elements/alert.py +234 -0
  41. streamlit/elements/arrow.py +962 -0
  42. streamlit/elements/balloons.py +47 -0
  43. streamlit/elements/bokeh_chart.py +133 -0
  44. streamlit/elements/code.py +114 -0
  45. streamlit/elements/deck_gl_json_chart.py +546 -0
  46. streamlit/elements/dialog_decorator.py +267 -0
  47. streamlit/elements/doc_string.py +558 -0
  48. streamlit/elements/empty.py +130 -0
  49. streamlit/elements/exception.py +331 -0
  50. streamlit/elements/form.py +354 -0
  51. streamlit/elements/graphviz_chart.py +150 -0
  52. streamlit/elements/heading.py +302 -0
  53. streamlit/elements/html.py +105 -0
  54. streamlit/elements/iframe.py +191 -0
  55. streamlit/elements/image.py +196 -0
  56. streamlit/elements/json.py +139 -0
  57. streamlit/elements/layouts.py +879 -0
  58. streamlit/elements/lib/__init__.py +13 -0
  59. streamlit/elements/lib/built_in_chart_utils.py +1157 -0
  60. streamlit/elements/lib/color_util.py +263 -0
  61. streamlit/elements/lib/column_config_utils.py +542 -0
  62. streamlit/elements/lib/column_types.py +2188 -0
  63. streamlit/elements/lib/dialog.py +147 -0
  64. streamlit/elements/lib/dicttools.py +154 -0
  65. streamlit/elements/lib/event_utils.py +37 -0
  66. streamlit/elements/lib/file_uploader_utils.py +66 -0
  67. streamlit/elements/lib/form_utils.py +77 -0
  68. streamlit/elements/lib/image_utils.py +441 -0
  69. streamlit/elements/lib/js_number.py +105 -0
  70. streamlit/elements/lib/mutable_status_container.py +183 -0
  71. streamlit/elements/lib/options_selector_utils.py +250 -0
  72. streamlit/elements/lib/pandas_styler_utils.py +274 -0
  73. streamlit/elements/lib/policies.py +194 -0
  74. streamlit/elements/lib/streamlit_plotly_theme.py +207 -0
  75. streamlit/elements/lib/subtitle_utils.py +176 -0
  76. streamlit/elements/lib/utils.py +250 -0
  77. streamlit/elements/map.py +508 -0
  78. streamlit/elements/markdown.py +277 -0
  79. streamlit/elements/media.py +793 -0
  80. streamlit/elements/metric.py +301 -0
  81. streamlit/elements/plotly_chart.py +546 -0
  82. streamlit/elements/progress.py +156 -0
  83. streamlit/elements/pyplot.py +194 -0
  84. streamlit/elements/snow.py +47 -0
  85. streamlit/elements/spinner.py +113 -0
  86. streamlit/elements/text.py +76 -0
  87. streamlit/elements/toast.py +98 -0
  88. streamlit/elements/vega_charts.py +1984 -0
  89. streamlit/elements/widgets/__init__.py +13 -0
  90. streamlit/elements/widgets/audio_input.py +310 -0
  91. streamlit/elements/widgets/button.py +1123 -0
  92. streamlit/elements/widgets/button_group.py +1008 -0
  93. streamlit/elements/widgets/camera_input.py +263 -0
  94. streamlit/elements/widgets/chat.py +647 -0
  95. streamlit/elements/widgets/checkbox.py +352 -0
  96. streamlit/elements/widgets/color_picker.py +265 -0
  97. streamlit/elements/widgets/data_editor.py +983 -0
  98. streamlit/elements/widgets/file_uploader.py +486 -0
  99. streamlit/elements/widgets/multiselect.py +338 -0
  100. streamlit/elements/widgets/number_input.py +545 -0
  101. streamlit/elements/widgets/radio.py +407 -0
  102. streamlit/elements/widgets/select_slider.py +437 -0
  103. streamlit/elements/widgets/selectbox.py +366 -0
  104. streamlit/elements/widgets/slider.py +880 -0
  105. streamlit/elements/widgets/text_widgets.py +628 -0
  106. streamlit/elements/widgets/time_widgets.py +970 -0
  107. streamlit/elements/write.py +574 -0
  108. streamlit/emojis.py +34 -0
  109. streamlit/env_util.py +61 -0
  110. streamlit/error_util.py +105 -0
  111. streamlit/errors.py +452 -0
  112. streamlit/external/__init__.py +13 -0
  113. streamlit/external/langchain/__init__.py +23 -0
  114. streamlit/external/langchain/streamlit_callback_handler.py +406 -0
  115. streamlit/file_util.py +247 -0
  116. streamlit/git_util.py +173 -0
  117. streamlit/hello/__init__.py +13 -0
  118. streamlit/hello/animation_demo.py +82 -0
  119. streamlit/hello/dataframe_demo.py +71 -0
  120. streamlit/hello/hello.py +37 -0
  121. streamlit/hello/mapping_demo.py +114 -0
  122. streamlit/hello/plotting_demo.py +55 -0
  123. streamlit/hello/streamlit_app.py +55 -0
  124. streamlit/hello/utils.py +28 -0
  125. streamlit/logger.py +130 -0
  126. streamlit/material_icon_names.py +25 -0
  127. streamlit/navigation/__init__.py +13 -0
  128. streamlit/navigation/page.py +302 -0
  129. streamlit/net_util.py +125 -0
  130. streamlit/platform.py +33 -0
  131. streamlit/proto/Alert_pb2.py +29 -0
  132. streamlit/proto/Alert_pb2.pyi +90 -0
  133. streamlit/proto/AppPage_pb2.py +27 -0
  134. streamlit/proto/AppPage_pb2.pyi +64 -0
  135. streamlit/proto/ArrowNamedDataSet_pb2.py +28 -0
  136. streamlit/proto/ArrowNamedDataSet_pb2.pyi +57 -0
  137. streamlit/proto/ArrowVegaLiteChart_pb2.py +29 -0
  138. streamlit/proto/ArrowVegaLiteChart_pb2.pyi +84 -0
  139. streamlit/proto/Arrow_pb2.py +33 -0
  140. streamlit/proto/Arrow_pb2.pyi +188 -0
  141. streamlit/proto/AudioInput_pb2.py +28 -0
  142. streamlit/proto/AudioInput_pb2.pyi +58 -0
  143. streamlit/proto/Audio_pb2.py +27 -0
  144. streamlit/proto/Audio_pb2.pyi +58 -0
  145. streamlit/proto/AuthRedirect_pb2.py +27 -0
  146. streamlit/proto/AuthRedirect_pb2.pyi +41 -0
  147. streamlit/proto/AutoRerun_pb2.py +27 -0
  148. streamlit/proto/AutoRerun_pb2.pyi +45 -0
  149. streamlit/proto/BackMsg_pb2.py +29 -0
  150. streamlit/proto/BackMsg_pb2.pyi +105 -0
  151. streamlit/proto/Balloons_pb2.py +27 -0
  152. streamlit/proto/Balloons_pb2.pyi +43 -0
  153. streamlit/proto/Block_pb2.py +53 -0
  154. streamlit/proto/Block_pb2.pyi +322 -0
  155. streamlit/proto/BokehChart_pb2.py +27 -0
  156. streamlit/proto/BokehChart_pb2.pyi +49 -0
  157. streamlit/proto/ButtonGroup_pb2.py +36 -0
  158. streamlit/proto/ButtonGroup_pb2.pyi +169 -0
  159. streamlit/proto/Button_pb2.py +27 -0
  160. streamlit/proto/Button_pb2.pyi +71 -0
  161. streamlit/proto/CameraInput_pb2.py +28 -0
  162. streamlit/proto/CameraInput_pb2.pyi +58 -0
  163. streamlit/proto/ChatInput_pb2.py +31 -0
  164. streamlit/proto/ChatInput_pb2.pyi +111 -0
  165. streamlit/proto/Checkbox_pb2.py +30 -0
  166. streamlit/proto/Checkbox_pb2.pyi +90 -0
  167. streamlit/proto/ClientState_pb2.py +30 -0
  168. streamlit/proto/ClientState_pb2.pyi +90 -0
  169. streamlit/proto/Code_pb2.py +27 -0
  170. streamlit/proto/Code_pb2.pyi +55 -0
  171. streamlit/proto/ColorPicker_pb2.py +28 -0
  172. streamlit/proto/ColorPicker_pb2.pyi +67 -0
  173. streamlit/proto/Common_pb2.py +51 -0
  174. streamlit/proto/Common_pb2.pyi +293 -0
  175. streamlit/proto/Components_pb2.py +35 -0
  176. streamlit/proto/Components_pb2.pyi +172 -0
  177. streamlit/proto/DataFrame_pb2.py +56 -0
  178. streamlit/proto/DataFrame_pb2.pyi +397 -0
  179. streamlit/proto/DateInput_pb2.py +28 -0
  180. streamlit/proto/DateInput_pb2.pyi +83 -0
  181. streamlit/proto/DeckGlJsonChart_pb2.py +29 -0
  182. streamlit/proto/DeckGlJsonChart_pb2.pyi +102 -0
  183. streamlit/proto/Delta_pb2.py +31 -0
  184. streamlit/proto/Delta_pb2.pyi +74 -0
  185. streamlit/proto/DocString_pb2.py +29 -0
  186. streamlit/proto/DocString_pb2.pyi +93 -0
  187. streamlit/proto/DownloadButton_pb2.py +27 -0
  188. streamlit/proto/DownloadButton_pb2.pyi +70 -0
  189. streamlit/proto/Element_pb2.py +78 -0
  190. streamlit/proto/Element_pb2.pyi +312 -0
  191. streamlit/proto/Empty_pb2.py +27 -0
  192. streamlit/proto/Empty_pb2.pyi +36 -0
  193. streamlit/proto/Exception_pb2.py +27 -0
  194. streamlit/proto/Exception_pb2.pyi +72 -0
  195. streamlit/proto/Favicon_pb2.py +27 -0
  196. streamlit/proto/Favicon_pb2.pyi +40 -0
  197. streamlit/proto/FileUploader_pb2.py +28 -0
  198. streamlit/proto/FileUploader_pb2.pyi +78 -0
  199. streamlit/proto/ForwardMsg_pb2.py +53 -0
  200. streamlit/proto/ForwardMsg_pb2.pyi +293 -0
  201. streamlit/proto/GitInfo_pb2.py +29 -0
  202. streamlit/proto/GitInfo_pb2.pyi +83 -0
  203. streamlit/proto/GraphVizChart_pb2.py +27 -0
  204. streamlit/proto/GraphVizChart_pb2.pyi +53 -0
  205. streamlit/proto/Heading_pb2.py +27 -0
  206. streamlit/proto/Heading_pb2.pyi +56 -0
  207. streamlit/proto/Html_pb2.py +27 -0
  208. streamlit/proto/Html_pb2.pyi +42 -0
  209. streamlit/proto/IFrame_pb2.py +27 -0
  210. streamlit/proto/IFrame_pb2.pyi +59 -0
  211. streamlit/proto/Image_pb2.py +29 -0
  212. streamlit/proto/Image_pb2.pyi +84 -0
  213. streamlit/proto/Json_pb2.py +27 -0
  214. streamlit/proto/Json_pb2.pyi +53 -0
  215. streamlit/proto/LabelVisibilityMessage_pb2.py +29 -0
  216. streamlit/proto/LabelVisibilityMessage_pb2.pyi +68 -0
  217. streamlit/proto/LinkButton_pb2.py +27 -0
  218. streamlit/proto/LinkButton_pb2.pyi +58 -0
  219. streamlit/proto/Logo_pb2.py +27 -0
  220. streamlit/proto/Logo_pb2.pyi +51 -0
  221. streamlit/proto/Markdown_pb2.py +29 -0
  222. streamlit/proto/Markdown_pb2.pyi +86 -0
  223. streamlit/proto/Metric_pb2.py +32 -0
  224. streamlit/proto/Metric_pb2.pyi +101 -0
  225. streamlit/proto/MetricsEvent_pb2.py +30 -0
  226. streamlit/proto/MetricsEvent_pb2.pyi +200 -0
  227. streamlit/proto/MultiSelect_pb2.py +28 -0
  228. streamlit/proto/MultiSelect_pb2.pyi +81 -0
  229. streamlit/proto/NamedDataSet_pb2.py +28 -0
  230. streamlit/proto/NamedDataSet_pb2.pyi +59 -0
  231. streamlit/proto/Navigation_pb2.py +30 -0
  232. streamlit/proto/Navigation_pb2.pyi +84 -0
  233. streamlit/proto/NewSession_pb2.py +51 -0
  234. streamlit/proto/NewSession_pb2.pyi +481 -0
  235. streamlit/proto/NumberInput_pb2.py +30 -0
  236. streamlit/proto/NumberInput_pb2.pyi +121 -0
  237. streamlit/proto/PageConfig_pb2.py +33 -0
  238. streamlit/proto/PageConfig_pb2.pyi +126 -0
  239. streamlit/proto/PageInfo_pb2.py +27 -0
  240. streamlit/proto/PageInfo_pb2.pyi +43 -0
  241. streamlit/proto/PageLink_pb2.py +27 -0
  242. streamlit/proto/PageLink_pb2.pyi +63 -0
  243. streamlit/proto/PageNotFound_pb2.py +27 -0
  244. streamlit/proto/PageNotFound_pb2.pyi +42 -0
  245. streamlit/proto/PageProfile_pb2.py +31 -0
  246. streamlit/proto/PageProfile_pb2.pyi +127 -0
  247. streamlit/proto/PagesChanged_pb2.py +28 -0
  248. streamlit/proto/PagesChanged_pb2.pyi +48 -0
  249. streamlit/proto/ParentMessage_pb2.py +27 -0
  250. streamlit/proto/ParentMessage_pb2.pyi +46 -0
  251. streamlit/proto/PlotlyChart_pb2.py +31 -0
  252. streamlit/proto/PlotlyChart_pb2.pyi +131 -0
  253. streamlit/proto/Progress_pb2.py +27 -0
  254. streamlit/proto/Progress_pb2.pyi +43 -0
  255. streamlit/proto/Radio_pb2.py +28 -0
  256. streamlit/proto/Radio_pb2.pyi +84 -0
  257. streamlit/proto/RootContainer_pb2.py +27 -0
  258. streamlit/proto/RootContainer_pb2.pyi +56 -0
  259. streamlit/proto/Selectbox_pb2.py +28 -0
  260. streamlit/proto/Selectbox_pb2.pyi +80 -0
  261. streamlit/proto/SessionEvent_pb2.py +28 -0
  262. streamlit/proto/SessionEvent_pb2.pyi +62 -0
  263. streamlit/proto/SessionStatus_pb2.py +27 -0
  264. streamlit/proto/SessionStatus_pb2.pyi +57 -0
  265. streamlit/proto/Skeleton_pb2.py +29 -0
  266. streamlit/proto/Skeleton_pb2.pyi +71 -0
  267. streamlit/proto/Slider_pb2.py +32 -0
  268. streamlit/proto/Slider_pb2.pyi +142 -0
  269. streamlit/proto/Snow_pb2.py +27 -0
  270. streamlit/proto/Snow_pb2.pyi +43 -0
  271. streamlit/proto/Spinner_pb2.py +27 -0
  272. streamlit/proto/Spinner_pb2.pyi +49 -0
  273. streamlit/proto/TextArea_pb2.py +28 -0
  274. streamlit/proto/TextArea_pb2.pyi +80 -0
  275. streamlit/proto/TextInput_pb2.py +30 -0
  276. streamlit/proto/TextInput_pb2.pyi +107 -0
  277. streamlit/proto/Text_pb2.py +27 -0
  278. streamlit/proto/Text_pb2.pyi +46 -0
  279. streamlit/proto/TimeInput_pb2.py +28 -0
  280. streamlit/proto/TimeInput_pb2.pyi +74 -0
  281. streamlit/proto/Toast_pb2.py +27 -0
  282. streamlit/proto/Toast_pb2.pyi +45 -0
  283. streamlit/proto/VegaLiteChart_pb2.py +29 -0
  284. streamlit/proto/VegaLiteChart_pb2.pyi +71 -0
  285. streamlit/proto/Video_pb2.py +31 -0
  286. streamlit/proto/Video_pb2.pyi +117 -0
  287. streamlit/proto/WidgetStates_pb2.py +31 -0
  288. streamlit/proto/WidgetStates_pb2.pyi +126 -0
  289. streamlit/proto/__init__.py +15 -0
  290. streamlit/proto/openmetrics_data_model_pb2.py +60 -0
  291. streamlit/proto/openmetrics_data_model_pb2.pyi +522 -0
  292. streamlit/py.typed +0 -0
  293. streamlit/runtime/__init__.py +50 -0
  294. streamlit/runtime/app_session.py +982 -0
  295. streamlit/runtime/caching/__init__.py +98 -0
  296. streamlit/runtime/caching/cache_data_api.py +665 -0
  297. streamlit/runtime/caching/cache_errors.py +142 -0
  298. streamlit/runtime/caching/cache_resource_api.py +527 -0
  299. streamlit/runtime/caching/cache_type.py +33 -0
  300. streamlit/runtime/caching/cache_utils.py +523 -0
  301. streamlit/runtime/caching/cached_message_replay.py +290 -0
  302. streamlit/runtime/caching/hashing.py +637 -0
  303. streamlit/runtime/caching/legacy_cache_api.py +169 -0
  304. streamlit/runtime/caching/storage/__init__.py +29 -0
  305. streamlit/runtime/caching/storage/cache_storage_protocol.py +239 -0
  306. streamlit/runtime/caching/storage/dummy_cache_storage.py +60 -0
  307. streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +145 -0
  308. streamlit/runtime/caching/storage/local_disk_cache_storage.py +223 -0
  309. streamlit/runtime/connection_factory.py +436 -0
  310. streamlit/runtime/context.py +280 -0
  311. streamlit/runtime/credentials.py +364 -0
  312. streamlit/runtime/forward_msg_cache.py +296 -0
  313. streamlit/runtime/forward_msg_queue.py +240 -0
  314. streamlit/runtime/fragment.py +477 -0
  315. streamlit/runtime/media_file_manager.py +234 -0
  316. streamlit/runtime/media_file_storage.py +143 -0
  317. streamlit/runtime/memory_media_file_storage.py +181 -0
  318. streamlit/runtime/memory_session_storage.py +77 -0
  319. streamlit/runtime/memory_uploaded_file_manager.py +138 -0
  320. streamlit/runtime/metrics_util.py +486 -0
  321. streamlit/runtime/pages_manager.py +165 -0
  322. streamlit/runtime/runtime.py +792 -0
  323. streamlit/runtime/runtime_util.py +106 -0
  324. streamlit/runtime/script_data.py +46 -0
  325. streamlit/runtime/scriptrunner/__init__.py +38 -0
  326. streamlit/runtime/scriptrunner/exec_code.py +159 -0
  327. streamlit/runtime/scriptrunner/magic.py +273 -0
  328. streamlit/runtime/scriptrunner/magic_funcs.py +32 -0
  329. streamlit/runtime/scriptrunner/script_cache.py +89 -0
  330. streamlit/runtime/scriptrunner/script_runner.py +756 -0
  331. streamlit/runtime/scriptrunner_utils/__init__.py +19 -0
  332. streamlit/runtime/scriptrunner_utils/exceptions.py +48 -0
  333. streamlit/runtime/scriptrunner_utils/script_requests.py +307 -0
  334. streamlit/runtime/scriptrunner_utils/script_run_context.py +287 -0
  335. streamlit/runtime/secrets.py +534 -0
  336. streamlit/runtime/session_manager.py +394 -0
  337. streamlit/runtime/state/__init__.py +41 -0
  338. streamlit/runtime/state/common.py +191 -0
  339. streamlit/runtime/state/query_params.py +205 -0
  340. streamlit/runtime/state/query_params_proxy.py +218 -0
  341. streamlit/runtime/state/safe_session_state.py +138 -0
  342. streamlit/runtime/state/session_state.py +772 -0
  343. streamlit/runtime/state/session_state_proxy.py +153 -0
  344. streamlit/runtime/state/widgets.py +135 -0
  345. streamlit/runtime/stats.py +109 -0
  346. streamlit/runtime/uploaded_file_manager.py +148 -0
  347. streamlit/runtime/websocket_session_manager.py +167 -0
  348. streamlit/source_util.py +98 -0
  349. streamlit/static/favicon.png +0 -0
  350. streamlit/static/index.html +61 -0
  351. streamlit/static/static/css/index.Bmkmz40k.css +1 -0
  352. streamlit/static/static/css/index.DpJG_94W.css +1 -0
  353. streamlit/static/static/css/index.DzuxGC_t.css +1 -0
  354. streamlit/static/static/js/FileDownload.esm.Bp9m5jrx.js +1 -0
  355. streamlit/static/static/js/FileHelper.D_3pbilj.js +5 -0
  356. streamlit/static/static/js/FormClearHelper.Ct2rwLXo.js +1 -0
  357. streamlit/static/static/js/Hooks.BKdzj5MJ.js +1 -0
  358. streamlit/static/static/js/InputInstructions.DB3QGNJP.js +1 -0
  359. streamlit/static/static/js/ProgressBar.D40A5xc2.js +2 -0
  360. streamlit/static/static/js/RenderInPortalIfExists.DLUCooTN.js +1 -0
  361. streamlit/static/static/js/Toolbar.BiGGIQun.js +1 -0
  362. streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +1 -0
  363. streamlit/static/static/js/base-input.CQBQT24M.js +4 -0
  364. streamlit/static/static/js/checkbox.Buj8gd_M.js +9 -0
  365. streamlit/static/static/js/createDownloadLinkElement.DZMwyjvU.js +1 -0
  366. streamlit/static/static/js/createSuper.CesK3I23.js +1 -0
  367. streamlit/static/static/js/data-grid-overlay-editor.B69OOFM4.js +1 -0
  368. streamlit/static/static/js/downloader.BZQhlBNT.js +1 -0
  369. streamlit/static/static/js/es6.D9Zhqujy.js +2 -0
  370. streamlit/static/static/js/iframeResizer.contentWindow.CAzcBpCC.js +1 -0
  371. streamlit/static/static/js/index.08vcOOvb.js +1 -0
  372. streamlit/static/static/js/index.0uqKfJUS.js +1 -0
  373. streamlit/static/static/js/index.B02M5u69.js +203 -0
  374. streamlit/static/static/js/index.B7mcZKMx.js +1 -0
  375. streamlit/static/static/js/index.BAQDHFA_.js +1 -0
  376. streamlit/static/static/js/index.BI60cMVr.js +2 -0
  377. streamlit/static/static/js/index.BLug2inK.js +1 -0
  378. streamlit/static/static/js/index.BM6TMY8g.js +2 -0
  379. streamlit/static/static/js/index.BZ9p1t7G.js +1 -0
  380. streamlit/static/static/js/index.BZqa87a1.js +2 -0
  381. streamlit/static/static/js/index.BcsRUzZZ.js +1 -0
  382. streamlit/static/static/js/index.BgVMiY_P.js +197 -0
  383. streamlit/static/static/js/index.BtuGy7By.js +6 -0
  384. streamlit/static/static/js/index.BuDuBmrs.js +1 -0
  385. streamlit/static/static/js/index.BvXU2oKV.js +1 -0
  386. streamlit/static/static/js/index.BxcwPacT.js +73 -0
  387. streamlit/static/static/js/index.CWX8KB81.js +1 -0
  388. streamlit/static/static/js/index.CXzZTo_q.js +1 -0
  389. streamlit/static/static/js/index.CcRWp_KL.js +1 -0
  390. streamlit/static/static/js/index.Cd-_xe55.js +3 -0
  391. streamlit/static/static/js/index.CdG2PXln.js +4537 -0
  392. streamlit/static/static/js/index.CjXvXmcP.js +1 -0
  393. streamlit/static/static/js/index.D1HZENZx.js +776 -0
  394. streamlit/static/static/js/index.D21Efo64.js +1617 -0
  395. streamlit/static/static/js/index.D9WgGVBx.js +7 -0
  396. streamlit/static/static/js/index.DEcsHtvb.js +12 -0
  397. streamlit/static/static/js/index.DFeMfr_K.js +1 -0
  398. streamlit/static/static/js/index.DHFBoItz.js +1 -0
  399. streamlit/static/static/js/index.D_PrBKnJ.js +3 -0
  400. streamlit/static/static/js/index.DmuRkekN.js +3855 -0
  401. streamlit/static/static/js/index.Do6eY8sf.js +1 -0
  402. streamlit/static/static/js/index.Dz3lP2P-.js +1 -0
  403. streamlit/static/static/js/index.Dz_UqF-s.js +1 -0
  404. streamlit/static/static/js/index.GkSUsPhJ.js +1 -0
  405. streamlit/static/static/js/index.H1U1IC_d.js +3 -0
  406. streamlit/static/static/js/index.g6p_4DPr.js +1 -0
  407. streamlit/static/static/js/index.g9x_GKss.js +1 -0
  408. streamlit/static/static/js/index.zo9jm08y.js +1 -0
  409. streamlit/static/static/js/input.DnaFglHq.js +2 -0
  410. streamlit/static/static/js/inputUtils.CQWz5UKz.js +1 -0
  411. streamlit/static/static/js/memory.Crb9x4-F.js +1 -0
  412. streamlit/static/static/js/mergeWith.ouAz0sK3.js +1 -0
  413. streamlit/static/static/js/number-overlay-editor._UaN-O48.js +9 -0
  414. streamlit/static/static/js/possibleConstructorReturn.CtGjGFHz.js +1 -0
  415. streamlit/static/static/js/sandbox.CBybYOhV.js +1 -0
  416. streamlit/static/static/js/sprintf.D7DtBTRn.js +1 -0
  417. streamlit/static/static/js/textarea.Cb_uJt5U.js +2 -0
  418. streamlit/static/static/js/threshold.DjX0wlsa.js +1 -0
  419. streamlit/static/static/js/timepicker.DKT7pfoF.js +4 -0
  420. streamlit/static/static/js/timer.CAwTRJ_g.js +1 -0
  421. streamlit/static/static/js/toConsumableArray.05Ikp13-.js +3 -0
  422. streamlit/static/static/js/uniqueId.D2FMWUEI.js +1 -0
  423. streamlit/static/static/js/useBasicWidgetState.urnZLANY.js +1 -0
  424. streamlit/static/static/js/useOnInputChange.BOKIIdJ1.js +1 -0
  425. streamlit/static/static/js/value.CgPGBV_l.js +1 -0
  426. streamlit/static/static/js/withFullScreenWrapper.C_N8J0Xx.js +1 -0
  427. streamlit/static/static/media/KaTeX_AMS-Regular.BQhdFMY1.woff2 +0 -0
  428. streamlit/static/static/media/KaTeX_AMS-Regular.DMm9YOAa.woff +0 -0
  429. streamlit/static/static/media/KaTeX_AMS-Regular.DRggAlZN.ttf +0 -0
  430. streamlit/static/static/media/KaTeX_Caligraphic-Bold.ATXxdsX0.ttf +0 -0
  431. streamlit/static/static/media/KaTeX_Caligraphic-Bold.BEiXGLvX.woff +0 -0
  432. streamlit/static/static/media/KaTeX_Caligraphic-Bold.Dq_IR9rO.woff2 +0 -0
  433. streamlit/static/static/media/KaTeX_Caligraphic-Regular.CTRA-rTL.woff +0 -0
  434. streamlit/static/static/media/KaTeX_Caligraphic-Regular.Di6jR-x-.woff2 +0 -0
  435. streamlit/static/static/media/KaTeX_Caligraphic-Regular.wX97UBjC.ttf +0 -0
  436. streamlit/static/static/media/KaTeX_Fraktur-Bold.BdnERNNW.ttf +0 -0
  437. streamlit/static/static/media/KaTeX_Fraktur-Bold.BsDP51OF.woff +0 -0
  438. streamlit/static/static/media/KaTeX_Fraktur-Bold.CL6g_b3V.woff2 +0 -0
  439. streamlit/static/static/media/KaTeX_Fraktur-Regular.CB_wures.ttf +0 -0
  440. streamlit/static/static/media/KaTeX_Fraktur-Regular.CTYiF6lA.woff2 +0 -0
  441. streamlit/static/static/media/KaTeX_Fraktur-Regular.Dxdc4cR9.woff +0 -0
  442. streamlit/static/static/media/KaTeX_Main-Bold.Cx986IdX.woff2 +0 -0
  443. streamlit/static/static/media/KaTeX_Main-Bold.Jm3AIy58.woff +0 -0
  444. streamlit/static/static/media/KaTeX_Main-Bold.waoOVXN0.ttf +0 -0
  445. streamlit/static/static/media/KaTeX_Main-BoldItalic.DxDJ3AOS.woff2 +0 -0
  446. streamlit/static/static/media/KaTeX_Main-BoldItalic.DzxPMmG6.ttf +0 -0
  447. streamlit/static/static/media/KaTeX_Main-BoldItalic.SpSLRI95.woff +0 -0
  448. streamlit/static/static/media/KaTeX_Main-Italic.3WenGoN9.ttf +0 -0
  449. streamlit/static/static/media/KaTeX_Main-Italic.BMLOBm91.woff +0 -0
  450. streamlit/static/static/media/KaTeX_Main-Italic.NWA7e6Wa.woff2 +0 -0
  451. streamlit/static/static/media/KaTeX_Main-Regular.B22Nviop.woff2 +0 -0
  452. streamlit/static/static/media/KaTeX_Main-Regular.Dr94JaBh.woff +0 -0
  453. streamlit/static/static/media/KaTeX_Main-Regular.ypZvNtVU.ttf +0 -0
  454. streamlit/static/static/media/KaTeX_Math-BoldItalic.B3XSjfu4.ttf +0 -0
  455. streamlit/static/static/media/KaTeX_Math-BoldItalic.CZnvNsCZ.woff2 +0 -0
  456. streamlit/static/static/media/KaTeX_Math-BoldItalic.iY-2wyZ7.woff +0 -0
  457. streamlit/static/static/media/KaTeX_Math-Italic.DA0__PXp.woff +0 -0
  458. streamlit/static/static/media/KaTeX_Math-Italic.flOr_0UB.ttf +0 -0
  459. streamlit/static/static/media/KaTeX_Math-Italic.t53AETM-.woff2 +0 -0
  460. streamlit/static/static/media/KaTeX_SansSerif-Bold.CFMepnvq.ttf +0 -0
  461. streamlit/static/static/media/KaTeX_SansSerif-Bold.D1sUS0GD.woff2 +0 -0
  462. streamlit/static/static/media/KaTeX_SansSerif-Bold.DbIhKOiC.woff +0 -0
  463. streamlit/static/static/media/KaTeX_SansSerif-Italic.C3H0VqGB.woff2 +0 -0
  464. streamlit/static/static/media/KaTeX_SansSerif-Italic.DN2j7dab.woff +0 -0
  465. streamlit/static/static/media/KaTeX_SansSerif-Italic.YYjJ1zSn.ttf +0 -0
  466. streamlit/static/static/media/KaTeX_SansSerif-Regular.BNo7hRIc.ttf +0 -0
  467. streamlit/static/static/media/KaTeX_SansSerif-Regular.CS6fqUqJ.woff +0 -0
  468. streamlit/static/static/media/KaTeX_SansSerif-Regular.DDBCnlJ7.woff2 +0 -0
  469. streamlit/static/static/media/KaTeX_Script-Regular.C5JkGWo-.ttf +0 -0
  470. streamlit/static/static/media/KaTeX_Script-Regular.D3wIWfF6.woff2 +0 -0
  471. streamlit/static/static/media/KaTeX_Script-Regular.D5yQViql.woff +0 -0
  472. streamlit/static/static/media/KaTeX_Size1-Regular.C195tn64.woff +0 -0
  473. streamlit/static/static/media/KaTeX_Size1-Regular.Dbsnue_I.ttf +0 -0
  474. streamlit/static/static/media/KaTeX_Size1-Regular.mCD8mA8B.woff2 +0 -0
  475. streamlit/static/static/media/KaTeX_Size2-Regular.B7gKUWhC.ttf +0 -0
  476. streamlit/static/static/media/KaTeX_Size2-Regular.Dy4dx90m.woff2 +0 -0
  477. streamlit/static/static/media/KaTeX_Size2-Regular.oD1tc_U0.woff +0 -0
  478. streamlit/static/static/media/KaTeX_Size3-Regular.CTq5MqoE.woff +0 -0
  479. streamlit/static/static/media/KaTeX_Size3-Regular.DgpXs0kz.ttf +0 -0
  480. streamlit/static/static/media/KaTeX_Size4-Regular.BF-4gkZK.woff +0 -0
  481. streamlit/static/static/media/KaTeX_Size4-Regular.DWFBv043.ttf +0 -0
  482. streamlit/static/static/media/KaTeX_Size4-Regular.Dl5lxZxV.woff2 +0 -0
  483. streamlit/static/static/media/KaTeX_Typewriter-Regular.C0xS9mPB.woff +0 -0
  484. streamlit/static/static/media/KaTeX_Typewriter-Regular.CO6r4hn1.woff2 +0 -0
  485. streamlit/static/static/media/KaTeX_Typewriter-Regular.D3Ib7_Hf.ttf +0 -0
  486. streamlit/static/static/media/MaterialSymbols-Rounded.DcZbplWk.woff2 +0 -0
  487. streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
  488. streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
  489. streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
  490. streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
  491. streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
  492. streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
  493. streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
  494. streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
  495. streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
  496. streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
  497. streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
  498. streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
  499. streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
  500. streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
  501. streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
  502. streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
  503. streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
  504. streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
  505. streamlit/static/static/media/balloon-0.Czj7AKwE.png +0 -0
  506. streamlit/static/static/media/balloon-1.CNvFFrND.png +0 -0
  507. streamlit/static/static/media/balloon-2.DTvC6B1t.png +0 -0
  508. streamlit/static/static/media/balloon-3.CgSk4tbL.png +0 -0
  509. streamlit/static/static/media/balloon-4.mbtFrzxf.png +0 -0
  510. streamlit/static/static/media/balloon-5.CSwkUfRA.png +0 -0
  511. streamlit/static/static/media/fireworks.B4d-_KUe.gif +0 -0
  512. streamlit/static/static/media/flake-0.DgWaVvm5.png +0 -0
  513. streamlit/static/static/media/flake-1.B2r5AHMK.png +0 -0
  514. streamlit/static/static/media/flake-2.BnWSExPC.png +0 -0
  515. streamlit/static/static/media/snowflake.JU2jBHL8.svg +11 -0
  516. streamlit/string_util.py +203 -0
  517. streamlit/temporary_directory.py +56 -0
  518. streamlit/testing/__init__.py +13 -0
  519. streamlit/testing/v1/__init__.py +17 -0
  520. streamlit/testing/v1/app_test.py +1050 -0
  521. streamlit/testing/v1/element_tree.py +2083 -0
  522. streamlit/testing/v1/local_script_runner.py +180 -0
  523. streamlit/testing/v1/util.py +53 -0
  524. streamlit/time_util.py +75 -0
  525. streamlit/type_util.py +460 -0
  526. streamlit/url_util.py +122 -0
  527. streamlit/user_info.py +519 -0
  528. streamlit/util.py +72 -0
  529. streamlit/vendor/__init__.py +0 -0
  530. streamlit/vendor/pympler/__init__.py +0 -0
  531. streamlit/vendor/pympler/asizeof.py +2869 -0
  532. streamlit/version.py +18 -0
  533. streamlit/watcher/__init__.py +28 -0
  534. streamlit/watcher/event_based_path_watcher.py +406 -0
  535. streamlit/watcher/folder_black_list.py +82 -0
  536. streamlit/watcher/local_sources_watcher.py +233 -0
  537. streamlit/watcher/path_watcher.py +185 -0
  538. streamlit/watcher/polling_path_watcher.py +124 -0
  539. streamlit/watcher/util.py +207 -0
  540. streamlit/web/__init__.py +13 -0
  541. streamlit/web/bootstrap.py +353 -0
  542. streamlit/web/cache_storage_manager_config.py +38 -0
  543. streamlit/web/cli.py +369 -0
  544. streamlit/web/server/__init__.py +26 -0
  545. streamlit/web/server/app_static_file_handler.py +93 -0
  546. streamlit/web/server/authlib_tornado_integration.py +60 -0
  547. streamlit/web/server/browser_websocket_handler.py +246 -0
  548. streamlit/web/server/component_request_handler.py +116 -0
  549. streamlit/web/server/media_file_handler.py +141 -0
  550. streamlit/web/server/oauth_authlib_routes.py +176 -0
  551. streamlit/web/server/oidc_mixin.py +108 -0
  552. streamlit/web/server/routes.py +295 -0
  553. streamlit/web/server/server.py +479 -0
  554. streamlit/web/server/server_util.py +161 -0
  555. streamlit/web/server/stats_request_handler.py +95 -0
  556. streamlit/web/server/upload_file_request_handler.py +137 -0
  557. streamlit/web/server/websocket_headers.py +56 -0
  558. streamlit_nightly-1.43.2.dev20250307.data/scripts/streamlit.cmd +16 -0
  559. streamlit_nightly-1.43.2.dev20250307.dist-info/METADATA +207 -0
  560. streamlit_nightly-1.43.2.dev20250307.dist-info/RECORD +563 -0
  561. streamlit_nightly-1.43.2.dev20250307.dist-info/WHEEL +5 -0
  562. streamlit_nightly-1.43.2.dev20250307.dist-info/entry_points.txt +2 -0
  563. streamlit_nightly-1.43.2.dev20250307.dist-info/top_level.txt +1 -0
@@ -0,0 +1,880 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2025)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ from 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
+ TypeVar,
27
+ Union,
28
+ cast,
29
+ overload,
30
+ )
31
+
32
+ from typing_extensions import TypeAlias
33
+
34
+ from streamlit.elements.lib.form_utils import current_form_id
35
+ from streamlit.elements.lib.js_number import JSNumber, JSNumberBoundsException
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
+ WidgetArgs,
57
+ WidgetCallback,
58
+ WidgetKwargs,
59
+ get_session_state,
60
+ register_widget,
61
+ )
62
+
63
+ if TYPE_CHECKING:
64
+ from streamlit.delta_generator import DeltaGenerator
65
+
66
+ SliderNumericT = TypeVar("SliderNumericT", int, float)
67
+ SliderDatelikeT = TypeVar("SliderDatelikeT", date, time, datetime)
68
+
69
+ SliderNumericSpanT: TypeAlias = Union[
70
+ list[SliderNumericT],
71
+ tuple[()],
72
+ tuple[SliderNumericT],
73
+ tuple[SliderNumericT, SliderNumericT],
74
+ ]
75
+ SliderDatelikeSpanT: TypeAlias = Union[
76
+ list[SliderDatelikeT],
77
+ tuple[()],
78
+ tuple[SliderDatelikeT],
79
+ tuple[SliderDatelikeT, SliderDatelikeT],
80
+ ]
81
+
82
+ StepNumericT: TypeAlias = SliderNumericT
83
+ StepDatelikeT: TypeAlias = timedelta
84
+
85
+ SliderStep = Union[int, float, timedelta]
86
+ SliderScalar = Union[int, float, date, time, datetime]
87
+ SliderValueT = TypeVar("SliderValueT", int, float, date, time, datetime)
88
+ SliderValueGeneric: TypeAlias = Union[
89
+ SliderValueT,
90
+ Sequence[SliderValueT],
91
+ ]
92
+ SliderValue: TypeAlias = Union[
93
+ SliderValueGeneric[int],
94
+ SliderValueGeneric[float],
95
+ SliderValueGeneric[date],
96
+ SliderValueGeneric[time],
97
+ SliderValueGeneric[datetime],
98
+ ]
99
+ SliderReturnGeneric: TypeAlias = Union[
100
+ SliderValueT,
101
+ tuple[SliderValueT],
102
+ tuple[SliderValueT, SliderValueT],
103
+ ]
104
+ SliderReturn: TypeAlias = Union[
105
+ SliderReturnGeneric[int],
106
+ SliderReturnGeneric[float],
107
+ SliderReturnGeneric[date],
108
+ SliderReturnGeneric[time],
109
+ SliderReturnGeneric[datetime],
110
+ ]
111
+
112
+ SECONDS_TO_MICROS: Final = 1000 * 1000
113
+ DAYS_TO_MICROS: Final = 24 * 60 * 60 * SECONDS_TO_MICROS
114
+
115
+ UTC_EPOCH: Final = datetime(1970, 1, 1, tzinfo=timezone.utc)
116
+
117
+
118
+ def _time_to_datetime(time_: time) -> datetime:
119
+ # Note, here we pick an arbitrary date well after Unix epoch.
120
+ # This prevents pre-epoch timezone issues (https://bugs.python.org/issue36759)
121
+ # We're dropping the date from datetime later, anyway.
122
+ return datetime.combine(date(2000, 1, 1), time_)
123
+
124
+
125
+ def _date_to_datetime(date_: date) -> datetime:
126
+ return datetime.combine(date_, time())
127
+
128
+
129
+ def _delta_to_micros(delta: timedelta) -> int:
130
+ return (
131
+ delta.microseconds
132
+ + delta.seconds * SECONDS_TO_MICROS
133
+ + delta.days * DAYS_TO_MICROS
134
+ )
135
+
136
+
137
+ def _datetime_to_micros(dt: datetime) -> int:
138
+ # The frontend is not aware of timezones and only expects a UTC-based
139
+ # timestamp (in microseconds). Since we want to show the date/time exactly
140
+ # as it is in the given datetime object, we just set the tzinfo to UTC and
141
+ # do not do any timezone conversions. Only the backend knows about
142
+ # original timezone and will replace the UTC timestamp in the deserialization.
143
+ utc_dt = dt.replace(tzinfo=timezone.utc)
144
+ return _delta_to_micros(utc_dt - UTC_EPOCH)
145
+
146
+
147
+ def _micros_to_datetime(micros: int, orig_tz: tzinfo | None) -> datetime:
148
+ """Restore times/datetimes to original timezone (dates are always naive)"""
149
+ utc_dt = UTC_EPOCH + timedelta(microseconds=micros)
150
+ # Add the original timezone. No conversion is required here,
151
+ # since in the serialization, we also just replace the timestamp with UTC.
152
+ return utc_dt.replace(tzinfo=orig_tz)
153
+
154
+
155
+ @dataclass
156
+ class SliderSerde:
157
+ value: list[float]
158
+ data_type: int
159
+ single_value: bool
160
+ orig_tz: tzinfo | None
161
+
162
+ def deserialize_single_value(self, value: float):
163
+ if self.data_type == SliderProto.INT:
164
+ return int(value)
165
+ if self.data_type == SliderProto.DATETIME:
166
+ return _micros_to_datetime(int(value), self.orig_tz)
167
+ if self.data_type == SliderProto.DATE:
168
+ return _micros_to_datetime(int(value), self.orig_tz).date()
169
+ if self.data_type == SliderProto.TIME:
170
+ return (
171
+ _micros_to_datetime(int(value), self.orig_tz)
172
+ .time()
173
+ .replace(tzinfo=self.orig_tz)
174
+ )
175
+ return value
176
+
177
+ def deserialize(self, ui_value: list[float] | None, widget_id: str = ""):
178
+ if ui_value is not None:
179
+ val = ui_value
180
+ else:
181
+ # Widget has not been used; fallback to the original value,
182
+ val = self.value
183
+
184
+ # The widget always returns a float array, so fix the return type if necessary
185
+ val = [self.deserialize_single_value(v) for v in val]
186
+ return val[0] if self.single_value else tuple(val)
187
+
188
+ def serialize(self, v: Any) -> list[Any]:
189
+ range_value = isinstance(v, (list, tuple))
190
+ value = list(v) if range_value else [v]
191
+ if self.data_type == SliderProto.DATE:
192
+ value = [_datetime_to_micros(_date_to_datetime(v)) for v in value]
193
+ if self.data_type == SliderProto.TIME:
194
+ value = [_datetime_to_micros(_time_to_datetime(v)) for v in value]
195
+ if self.data_type == SliderProto.DATETIME:
196
+ value = [_datetime_to_micros(v) for v in value]
197
+ return value
198
+
199
+
200
+ class SliderMixin:
201
+ # For easier readability, all the arguments with un-changing types across these overload signatures have been
202
+ # collapsed onto a single line.
203
+
204
+ # fmt: off
205
+ # If min/max/value/step are not provided, then we return an int.
206
+ # if ONLY step is provided, then it must be an int and we return an int.
207
+ @overload
208
+ def slider(
209
+ self,
210
+ label: str,
211
+ min_value: None = None,
212
+ max_value: None = None,
213
+ value: None = None,
214
+ step: int | None = None,
215
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
216
+ ) -> int:
217
+ ...
218
+
219
+ # If min-value or max_value is provided and a numeric type, and value (if provided)
220
+ # is a singular numeric, return the same numeric type.
221
+ @overload
222
+ def slider(
223
+ self,
224
+ label: str,
225
+ min_value: SliderNumericT | None = None,
226
+ max_value: SliderNumericT | None = None,
227
+ value: SliderNumericT | None = None,
228
+ step: StepNumericT[SliderNumericT] | None = None,
229
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
230
+ ) -> SliderNumericT:
231
+ ...
232
+
233
+ # If value is provided and a sequence of numeric type,
234
+ # return a tuple of the same numeric type.
235
+ @overload
236
+ def slider(
237
+ self,
238
+ label: str,
239
+ min_value: SliderNumericT | None = None,
240
+ max_value: SliderNumericT | None = None,
241
+ *,
242
+ value: SliderNumericSpanT[SliderNumericT],
243
+ step: StepNumericT[SliderNumericT] | None = None,
244
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
245
+ ) -> tuple[SliderNumericT, SliderNumericT]:
246
+ ...
247
+
248
+ # If value is provided positionally and a sequence of numeric type,
249
+ # return a tuple of the same numeric type.
250
+ @overload
251
+ def slider(
252
+ self,
253
+ label: str,
254
+ min_value: SliderNumericT,
255
+ max_value: SliderNumericT,
256
+ value: SliderNumericSpanT[SliderNumericT],
257
+ /,
258
+ step: StepNumericT[SliderNumericT] | None = None,
259
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
260
+ ) -> tuple[SliderNumericT, SliderNumericT]:
261
+ ...
262
+
263
+ # If min-value is provided and a datelike type, and value (if provided)
264
+ # is a singular datelike, return the same datelike type.
265
+ @overload
266
+ def slider(
267
+ self,
268
+ label: str,
269
+ min_value: SliderDatelikeT,
270
+ max_value: SliderDatelikeT | None = None,
271
+ value: SliderDatelikeT | None = None,
272
+ step: StepDatelikeT | None = None,
273
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
274
+ ) -> SliderDatelikeT:
275
+ ...
276
+
277
+ # If max-value is provided and a datelike type, and value (if provided)
278
+ # is a singular datelike, return the same datelike type.
279
+ @overload
280
+ def slider(
281
+ self,
282
+ label: str,
283
+ min_value: SliderDatelikeT | None = None,
284
+ *,
285
+ max_value: SliderDatelikeT,
286
+ value: SliderDatelikeT | None = None,
287
+ step: StepDatelikeT | None = None,
288
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
289
+ ) -> SliderDatelikeT:
290
+ ...
291
+
292
+ # If value is provided and a datelike type, return the same datelike type.
293
+ @overload
294
+ def slider(
295
+ self,
296
+ label: str,
297
+ min_value: SliderDatelikeT | None = None,
298
+ max_value: SliderDatelikeT | None = None,
299
+ *,
300
+ value: SliderDatelikeT,
301
+ step: StepDatelikeT | None = None,
302
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
303
+ ) -> SliderDatelikeT:
304
+ ...
305
+
306
+ # If value is provided and a sequence of datelike type,
307
+ # return a tuple of the same datelike type.
308
+ @overload
309
+ def slider(
310
+ self,
311
+ label: str,
312
+ min_value: SliderDatelikeT | None = None,
313
+ max_value: SliderDatelikeT | None = None,
314
+ *,
315
+ value: SliderDatelikeSpanT[SliderDatelikeT],
316
+ step: StepDatelikeT | None = None,
317
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, disabled: bool = False, label_visibility: LabelVisibility = "visible"
318
+ ) -> tuple[SliderDatelikeT, SliderDatelikeT]:
319
+ ...
320
+
321
+ # If value is provided positionally and a sequence of datelike type,
322
+ # return a tuple of the same datelike type.
323
+ @overload
324
+ def slider(
325
+ self,
326
+ label: str,
327
+ min_value: SliderDatelikeT,
328
+ max_value: SliderDatelikeT,
329
+ value: SliderDatelikeSpanT[SliderDatelikeT],
330
+ /,
331
+ step: StepDatelikeT | None = None,
332
+ format: str | None = None, key: Key | None = None, help: str | None = None, on_change: WidgetCallback | None = None, args: WidgetArgs | None = None, kwargs: WidgetKwargs | None = None, *, disabled: bool = False, label_visibility: LabelVisibility = "visible"
333
+ ) -> tuple[SliderDatelikeT, SliderDatelikeT]:
334
+ ...
335
+
336
+ # fmt: on
337
+
338
+ # https://github.com/python/mypy/issues/17614
339
+ @gather_metrics("slider") # type: ignore[misc]
340
+ def slider(
341
+ self,
342
+ label: str,
343
+ min_value: SliderScalar | None = None,
344
+ max_value: SliderScalar | None = None,
345
+ value: SliderValue | None = None,
346
+ step: SliderStep | None = None,
347
+ format: str | None = None,
348
+ key: Key | None = None,
349
+ help: str | None = None,
350
+ on_change: WidgetCallback | None = None,
351
+ args: WidgetArgs | None = None,
352
+ kwargs: WidgetKwargs | None = None,
353
+ *, # keyword-only arguments:
354
+ disabled: bool = False,
355
+ label_visibility: LabelVisibility = "visible",
356
+ ) -> Any:
357
+ r"""Display a slider widget.
358
+
359
+ This supports int, float, date, time, and datetime types.
360
+
361
+ This also allows you to render a range slider by passing a two-element
362
+ tuple or list as the ``value``.
363
+
364
+ The difference between ``st.slider`` and ``st.select_slider`` is that
365
+ ``slider`` only accepts numerical or date/time data and takes a range as
366
+ input, while ``select_slider`` accepts any datatype and takes an iterable
367
+ set of options.
368
+
369
+ .. note::
370
+ Integer values exceeding +/- ``(1<<53) - 1`` cannot be accurately
371
+ stored or returned by the widget due to serialization contstraints
372
+ between the Python server and JavaScript client. You must handle
373
+ such numbers as floats, leading to a loss in precision.
374
+
375
+ Parameters
376
+ ----------
377
+ label : str
378
+ A short label explaining to the user what this slider is for.
379
+ The label can optionally contain GitHub-flavored Markdown of the
380
+ following types: Bold, Italics, Strikethroughs, Inline Code, Links,
381
+ and Images. Images display like icons, with a max height equal to
382
+ the font height.
383
+
384
+ Unsupported Markdown elements are unwrapped so only their children
385
+ (text contents) render. Display unsupported elements as literal
386
+ characters by backslash-escaping them. E.g.,
387
+ ``"1\. Not an ordered list"``.
388
+
389
+ See the ``body`` parameter of |st.markdown|_ for additional,
390
+ supported Markdown directives.
391
+
392
+ For accessibility reasons, you should never set an empty label, but
393
+ you can hide it with ``label_visibility`` if needed. In the future,
394
+ we may disallow empty labels by raising an exception.
395
+
396
+ .. |st.markdown| replace:: ``st.markdown``
397
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
398
+
399
+ min_value : a supported type or None
400
+ The minimum permitted value.
401
+ Defaults to 0 if the value is an int, 0.0 if a float,
402
+ value - timedelta(days=14) if a date/datetime, time.min if a time
403
+
404
+ max_value : a supported type or None
405
+ The maximum permitted value.
406
+ Defaults to 100 if the value is an int, 1.0 if a float,
407
+ value + timedelta(days=14) if a date/datetime, time.max if a time
408
+
409
+ value : a supported type or a tuple/list of supported types or None
410
+ The value of the slider when it first renders. If a tuple/list
411
+ of two values is passed here, then a range slider with those lower
412
+ and upper bounds is rendered. For example, if set to `(1, 10)` the
413
+ slider will have a selectable range between 1 and 10.
414
+ Defaults to min_value.
415
+
416
+ step : int, float, timedelta, or None
417
+ The stepping interval.
418
+ Defaults to 1 if the value is an int, 0.01 if a float,
419
+ timedelta(days=1) if a date/datetime, timedelta(minutes=15) if a time
420
+ (or if max_value - min_value < 1 day)
421
+
422
+ format : str or None
423
+ A printf-style format string controlling how the interface should
424
+ display numbers. This does not impact the return value.
425
+
426
+ For information about formatting integers and floats, see
427
+ `sprintf.js
428
+ <https://github.com/alexei/sprintf.js?tab=readme-ov-file#format-specification>`_.
429
+ For example, ``format="%0.1f"`` adjusts the displayed decimal
430
+ precision to only show one digit after the decimal.
431
+
432
+ For information about formatting datetimes, dates, and times, see
433
+ `momentJS <https://momentjs.com/docs/#/displaying/format/>`_.
434
+ For example, ``format="ddd ha"`` adjusts the displayed datetime to
435
+ show the day of the week and the hour ("Tue 8pm").
436
+
437
+ key : str or int
438
+ An optional string or integer to use as the unique key for the widget.
439
+ If this is omitted, a key will be generated for the widget
440
+ based on its content. No two widgets may have the same key.
441
+
442
+ help : str or None
443
+ A tooltip that gets displayed next to the widget label. Streamlit
444
+ only displays the tooltip when ``label_visibility="visible"``. If
445
+ this is ``None`` (default), no tooltip is displayed.
446
+
447
+ The tooltip can optionally contain GitHub-flavored Markdown,
448
+ including the Markdown directives described in the ``body``
449
+ parameter of ``st.markdown``.
450
+
451
+ on_change : callable
452
+ An optional callback invoked when this slider's value changes.
453
+
454
+ args : tuple
455
+ An optional tuple of args to pass to the callback.
456
+
457
+ kwargs : dict
458
+ An optional dict of kwargs to pass to the callback.
459
+
460
+ disabled : bool
461
+ An optional boolean that disables the slider if set to ``True``.
462
+ The default is ``False``.
463
+
464
+ label_visibility : "visible", "hidden", or "collapsed"
465
+ The visibility of the label. The default is ``"visible"``. If this
466
+ is ``"hidden"``, Streamlit displays an empty spacer instead of the
467
+ label, which can help keep the widget alligned with other widgets.
468
+ If this is ``"collapsed"``, Streamlit displays no label or spacer.
469
+
470
+
471
+ Returns
472
+ -------
473
+ int/float/date/time/datetime or tuple of int/float/date/time/datetime
474
+ The current value of the slider widget. The return type will match
475
+ the data type of the value parameter.
476
+
477
+ Examples
478
+ --------
479
+ >>> import streamlit as st
480
+ >>>
481
+ >>> age = st.slider("How old are you?", 0, 130, 25)
482
+ >>> st.write("I'm ", age, "years old")
483
+
484
+ And here's an example of a range slider:
485
+
486
+ >>> import streamlit as st
487
+ >>>
488
+ >>> values = st.slider("Select a range of values", 0.0, 100.0, (25.0, 75.0))
489
+ >>> st.write("Values:", values)
490
+
491
+ This is a range time slider:
492
+
493
+ >>> import streamlit as st
494
+ >>> from datetime import time
495
+ >>>
496
+ >>> appointment = st.slider(
497
+ ... "Schedule your appointment:", value=(time(11, 30), time(12, 45))
498
+ ... )
499
+ >>> st.write("You're scheduled for:", appointment)
500
+
501
+ Finally, a datetime slider:
502
+
503
+ >>> import streamlit as st
504
+ >>> from datetime import datetime
505
+ >>>
506
+ >>> start_time = st.slider(
507
+ ... "When do you start?",
508
+ ... value=datetime(2020, 1, 1, 9, 30),
509
+ ... format="MM/DD/YY - hh:mm",
510
+ ... )
511
+ >>> st.write("Start time:", start_time)
512
+
513
+ .. output::
514
+ https://doc-slider.streamlit.app/
515
+ height: 300px
516
+
517
+ """
518
+ ctx = get_script_run_ctx()
519
+ return self._slider(
520
+ label=label,
521
+ min_value=min_value,
522
+ max_value=max_value,
523
+ value=value,
524
+ step=step,
525
+ format=format,
526
+ key=key,
527
+ help=help,
528
+ on_change=on_change,
529
+ args=args,
530
+ kwargs=kwargs,
531
+ disabled=disabled,
532
+ label_visibility=label_visibility,
533
+ ctx=ctx,
534
+ )
535
+
536
+ def _slider(
537
+ self,
538
+ label: str,
539
+ min_value=None,
540
+ max_value=None,
541
+ value=None,
542
+ step=None,
543
+ format: str | None = None,
544
+ key: Key | None = None,
545
+ help: str | None = None,
546
+ on_change: WidgetCallback | None = None,
547
+ args: WidgetArgs | None = None,
548
+ kwargs: WidgetKwargs | None = None,
549
+ *, # keyword-only arguments:
550
+ disabled: bool = False,
551
+ label_visibility: LabelVisibility = "visible",
552
+ ctx: ScriptRunContext | None = None,
553
+ ) -> SliderReturn:
554
+ key = to_key(key)
555
+
556
+ check_widget_policies(
557
+ self.dg,
558
+ key,
559
+ on_change,
560
+ default_value=value,
561
+ )
562
+ maybe_raise_label_warnings(label, label_visibility)
563
+
564
+ element_id = compute_and_register_element_id(
565
+ "slider",
566
+ user_key=key,
567
+ form_id=current_form_id(self.dg),
568
+ label=label,
569
+ min_value=min_value,
570
+ max_value=max_value,
571
+ value=value,
572
+ step=step,
573
+ format=format,
574
+ help=help,
575
+ )
576
+
577
+ SUPPORTED_TYPES = {
578
+ Integral: SliderProto.INT,
579
+ Real: SliderProto.FLOAT,
580
+ datetime: SliderProto.DATETIME,
581
+ date: SliderProto.DATE,
582
+ time: SliderProto.TIME,
583
+ }
584
+ TIMELIKE_TYPES = (SliderProto.DATETIME, SliderProto.TIME, SliderProto.DATE)
585
+
586
+ if value is None:
587
+ # We need to know if this is a single or range slider, but don't have
588
+ # a default value, so we check if session_state can tell us.
589
+ # We already calcluated the id, so there is no risk of this causing
590
+ # the id to change.
591
+
592
+ single_value = True
593
+
594
+ session_state = get_session_state().filtered_state
595
+
596
+ if key is not None and key in session_state:
597
+ state_value = session_state[key]
598
+ single_value = isinstance(state_value, tuple(SUPPORTED_TYPES.keys()))
599
+
600
+ if single_value:
601
+ value = min_value if min_value is not None else 0
602
+ else:
603
+ mn = min_value if min_value is not None else 0
604
+ mx = max_value if max_value is not None else 100
605
+ value = [mn, mx]
606
+
607
+ # Ensure that the value is either a single value or a range of values.
608
+ single_value = isinstance(value, tuple(SUPPORTED_TYPES.keys()))
609
+ range_value = isinstance(value, (list, tuple)) and len(value) in (0, 1, 2)
610
+ if not single_value and not range_value:
611
+ raise StreamlitAPIException(
612
+ "Slider value should either be an int/float/datetime or a list/tuple of "
613
+ "0 to 2 ints/floats/datetimes"
614
+ )
615
+
616
+ # Simplify future logic by always making value a list
617
+ if single_value:
618
+ value = [value]
619
+
620
+ def value_to_generic_type(v):
621
+ if isinstance(v, Integral):
622
+ return SUPPORTED_TYPES[Integral]
623
+ elif isinstance(v, Real):
624
+ return SUPPORTED_TYPES[Real]
625
+ else:
626
+ return SUPPORTED_TYPES[type(v)]
627
+
628
+ def all_same_type(items):
629
+ return len(set(map(value_to_generic_type, items))) < 2
630
+
631
+ if not all_same_type(value):
632
+ raise StreamlitAPIException(
633
+ "Slider tuple/list components must be of the same type.\n"
634
+ f"But were: {list(map(type, value))}"
635
+ )
636
+
637
+ if len(value) == 0:
638
+ data_type = SliderProto.INT
639
+ else:
640
+ data_type = value_to_generic_type(value[0])
641
+
642
+ datetime_min = time.min
643
+ datetime_max = time.max
644
+ if data_type == SliderProto.TIME:
645
+ datetime_min = time.min.replace(tzinfo=value[0].tzinfo)
646
+ datetime_max = time.max.replace(tzinfo=value[0].tzinfo)
647
+ if data_type in (SliderProto.DATETIME, SliderProto.DATE):
648
+ datetime_min = value[0] - timedelta(days=14)
649
+ datetime_max = value[0] + timedelta(days=14)
650
+
651
+ DEFAULTS = {
652
+ SliderProto.INT: {
653
+ "min_value": 0,
654
+ "max_value": 100,
655
+ "step": 1,
656
+ "format": "%d",
657
+ },
658
+ SliderProto.FLOAT: {
659
+ "min_value": 0.0,
660
+ "max_value": 1.0,
661
+ "step": 0.01,
662
+ "format": "%0.2f",
663
+ },
664
+ SliderProto.DATETIME: {
665
+ "min_value": datetime_min,
666
+ "max_value": datetime_max,
667
+ "step": timedelta(days=1),
668
+ "format": "YYYY-MM-DD",
669
+ },
670
+ SliderProto.DATE: {
671
+ "min_value": datetime_min,
672
+ "max_value": datetime_max,
673
+ "step": timedelta(days=1),
674
+ "format": "YYYY-MM-DD",
675
+ },
676
+ SliderProto.TIME: {
677
+ "min_value": datetime_min,
678
+ "max_value": datetime_max,
679
+ "step": timedelta(minutes=15),
680
+ "format": "HH:mm",
681
+ },
682
+ }
683
+
684
+ if min_value is None:
685
+ min_value = DEFAULTS[data_type]["min_value"]
686
+ if max_value is None:
687
+ max_value = DEFAULTS[data_type]["max_value"]
688
+ if step is None:
689
+ step = DEFAULTS[data_type]["step"]
690
+ if data_type in (
691
+ SliderProto.DATETIME,
692
+ SliderProto.DATE,
693
+ ) and max_value - min_value < timedelta(days=1):
694
+ step = timedelta(minutes=15)
695
+ if format is None:
696
+ format = cast(str, DEFAULTS[data_type]["format"])
697
+
698
+ if step == 0:
699
+ raise StreamlitAPIException(
700
+ "Slider components cannot be passed a `step` of 0."
701
+ )
702
+
703
+ # Ensure that all arguments are of the same type.
704
+ slider_args = [min_value, max_value, step]
705
+ int_args = all(isinstance(a, Integral) for a in slider_args)
706
+ float_args = all(
707
+ isinstance(a, Real) and not isinstance(a, Integral) for a in slider_args
708
+ )
709
+ # When min and max_value are the same timelike, step should be a timedelta
710
+ timelike_args = (
711
+ data_type in TIMELIKE_TYPES
712
+ and isinstance(step, timedelta)
713
+ and type(min_value) is type(max_value)
714
+ )
715
+
716
+ if not int_args and not float_args and not timelike_args:
717
+ raise StreamlitAPIException(
718
+ "Slider value arguments must be of matching types."
719
+ "\n`min_value` has %(min_type)s type."
720
+ "\n`max_value` has %(max_type)s type."
721
+ "\n`step` has %(step)s type."
722
+ % {
723
+ "min_type": type(min_value).__name__,
724
+ "max_type": type(max_value).__name__,
725
+ "step": type(step).__name__,
726
+ }
727
+ )
728
+
729
+ # Ensure that the value matches arguments' types.
730
+ all_ints = data_type == SliderProto.INT and int_args
731
+ all_floats = data_type == SliderProto.FLOAT and float_args
732
+ all_timelikes = data_type in TIMELIKE_TYPES and timelike_args
733
+
734
+ if not all_ints and not all_floats and not all_timelikes:
735
+ raise StreamlitAPIException(
736
+ "Both value and arguments must be of the same type."
737
+ "\n`value` has %(value_type)s type."
738
+ "\n`min_value` has %(min_type)s type."
739
+ "\n`max_value` has %(max_type)s type."
740
+ % {
741
+ "value_type": type(value).__name__,
742
+ "min_type": type(min_value).__name__,
743
+ "max_type": type(max_value).__name__,
744
+ }
745
+ )
746
+
747
+ # Ensure that min <= value(s) <= max, adjusting the bounds as necessary.
748
+ min_value = min(min_value, max_value)
749
+ max_value = max(min_value, max_value)
750
+ if len(value) == 1:
751
+ min_value = min(value[0], min_value)
752
+ max_value = max(value[0], max_value)
753
+ elif len(value) == 2:
754
+ start, end = value
755
+ if start > end:
756
+ # Swap start and end, since they seem reversed
757
+ start, end = end, start
758
+ value = start, end
759
+ min_value = min(start, min_value)
760
+ max_value = max(end, max_value)
761
+ else:
762
+ # Empty list, so let's just use the outer bounds
763
+ value = [min_value, max_value]
764
+
765
+ # Bounds checks. JSNumber produces human-readable exceptions that
766
+ # we simply re-package as StreamlitAPIExceptions.
767
+ # (We check `min_value` and `max_value` here; `value` and `step` are
768
+ # already known to be in the [min_value, max_value] range.)
769
+ try:
770
+ if all_ints:
771
+ JSNumber.validate_int_bounds(min_value, "`min_value`")
772
+ JSNumber.validate_int_bounds(max_value, "`max_value`")
773
+ elif all_floats:
774
+ JSNumber.validate_float_bounds(min_value, "`min_value`")
775
+ JSNumber.validate_float_bounds(max_value, "`max_value`")
776
+ elif all_timelikes:
777
+ # No validation yet. TODO: check between 0001-01-01 to 9999-12-31
778
+ pass
779
+ except JSNumberBoundsException as e:
780
+ raise StreamlitAPIException(str(e))
781
+
782
+ orig_tz = None
783
+ # Convert dates or times into datetimes
784
+ if data_type == SliderProto.TIME:
785
+ value = list(map(_time_to_datetime, value))
786
+ min_value = _time_to_datetime(min_value)
787
+ max_value = _time_to_datetime(max_value)
788
+
789
+ if data_type == SliderProto.DATE:
790
+ value = list(map(_date_to_datetime, value))
791
+ min_value = _date_to_datetime(min_value)
792
+ max_value = _date_to_datetime(max_value)
793
+
794
+ # The frontend will error if the values are equal, so checking here
795
+ # lets us produce a nicer python error message and stack trace.
796
+ if min_value == max_value:
797
+ raise StreamlitAPIException(
798
+ "Slider `min_value` must be less than the `max_value`."
799
+ f"\nThe values were {min_value} and {max_value}."
800
+ )
801
+
802
+ # Now, convert to microseconds (so we can serialize datetime to a long)
803
+ if data_type in TIMELIKE_TYPES:
804
+ # Restore times/datetimes to original timezone (dates are always naive)
805
+ orig_tz = (
806
+ value[0].tzinfo
807
+ if data_type in (SliderProto.TIME, SliderProto.DATETIME)
808
+ else None
809
+ )
810
+
811
+ value = list(map(_datetime_to_micros, value))
812
+ min_value = _datetime_to_micros(min_value)
813
+ max_value = _datetime_to_micros(max_value)
814
+ step = _delta_to_micros(cast(timedelta, step))
815
+
816
+ # It would be great if we could guess the number of decimal places from
817
+ # the `step` argument, but this would only be meaningful if step were a
818
+ # decimal. As a possible improvement we could make this function accept
819
+ # decimals and/or use some heuristics for floats.
820
+
821
+ slider_proto = SliderProto()
822
+ slider_proto.type = SliderProto.Type.SLIDER
823
+ slider_proto.id = element_id
824
+ slider_proto.label = label
825
+ slider_proto.format = format
826
+ slider_proto.default[:] = value
827
+ slider_proto.min = min_value
828
+ slider_proto.max = max_value
829
+ slider_proto.step = cast(float, step)
830
+ slider_proto.data_type = data_type
831
+ slider_proto.options[:] = []
832
+ slider_proto.form_id = current_form_id(self.dg)
833
+ slider_proto.disabled = disabled
834
+ slider_proto.label_visibility.value = get_label_visibility_proto_value(
835
+ label_visibility
836
+ )
837
+
838
+ if help is not None:
839
+ slider_proto.help = dedent(help)
840
+
841
+ serde = SliderSerde(value, data_type, single_value, orig_tz)
842
+
843
+ widget_state = register_widget(
844
+ slider_proto.id,
845
+ on_change_handler=on_change,
846
+ args=args,
847
+ kwargs=kwargs,
848
+ deserializer=serde.deserialize,
849
+ serializer=serde.serialize,
850
+ ctx=ctx,
851
+ value_type="double_array_value",
852
+ )
853
+
854
+ if widget_state.value_changed:
855
+ # Min/Max bounds checks when the value is updated.
856
+ serialized_values = serde.serialize(widget_state.value)
857
+ for value in serialized_values:
858
+ # Use the deserialized values for more readable error messages for dates/times
859
+ deserialized_value = serde.deserialize_single_value(value)
860
+ if value < slider_proto.min:
861
+ raise StreamlitValueBelowMinError(
862
+ value=deserialized_value,
863
+ min_value=serde.deserialize_single_value(slider_proto.min),
864
+ )
865
+ if value > slider_proto.max:
866
+ raise StreamlitValueAboveMaxError(
867
+ value=deserialized_value,
868
+ max_value=serde.deserialize_single_value(slider_proto.max),
869
+ )
870
+
871
+ slider_proto.value[:] = serialized_values
872
+ slider_proto.set_value = True
873
+
874
+ self.dg._enqueue("slider", slider_proto)
875
+ return cast(SliderReturn, widget_state.value)
876
+
877
+ @property
878
+ def dg(self) -> DeltaGenerator:
879
+ """Get our DeltaGenerator."""
880
+ return cast("DeltaGenerator", self)