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,568 @@
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 textwrap import dedent
18
+ from typing import (
19
+ TYPE_CHECKING,
20
+ Any,
21
+ Generic,
22
+ TypeGuard,
23
+ TypeVar,
24
+ cast,
25
+ overload,
26
+ )
27
+
28
+ from streamlit.dataframe_util import OptionSequence, convert_anything_to_list
29
+ from streamlit.elements.lib.form_utils import current_form_id
30
+ from streamlit.elements.lib.layout_utils import LayoutConfig, validate_width
31
+ from streamlit.elements.lib.options_selector_utils import (
32
+ create_mappings,
33
+ index_,
34
+ maybe_coerce_enum,
35
+ maybe_coerce_enum_sequence,
36
+ validate_and_sync_range_value_with_options,
37
+ validate_and_sync_value_with_options,
38
+ )
39
+ from streamlit.elements.lib.policies import (
40
+ check_widget_policies,
41
+ maybe_raise_label_warnings,
42
+ )
43
+ from streamlit.elements.lib.utils import (
44
+ Key,
45
+ LabelVisibility,
46
+ compute_and_register_element_id,
47
+ get_label_visibility_proto_value,
48
+ save_for_app_testing,
49
+ to_key,
50
+ )
51
+ from streamlit.errors import StreamlitAPIException
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
+ register_widget,
61
+ )
62
+ from streamlit.type_util import check_python_comparable
63
+
64
+ if TYPE_CHECKING:
65
+ from collections.abc import Callable, Sequence
66
+
67
+ from streamlit.delta_generator import DeltaGenerator
68
+ from streamlit.elements.lib.layout_utils import WidthWithoutContent
69
+ from streamlit.runtime.state.common import RegisterWidgetResult
70
+
71
+ T = TypeVar("T")
72
+
73
+
74
+ def _is_range_value(value: T | Sequence[T]) -> TypeGuard[Sequence[T]]:
75
+ return isinstance(value, (list, tuple))
76
+
77
+
78
+ class SelectSliderSerde(Generic[T]):
79
+ """Serializer/deserializer for select_slider widget values.
80
+
81
+ Uses formatted option strings for robust handling of dynamic option changes.
82
+ """
83
+
84
+ def __init__(
85
+ self,
86
+ options: Sequence[T],
87
+ *,
88
+ formatted_option_to_index: dict[str, int],
89
+ default_indices: list[int],
90
+ format_func: Callable[[Any], str] = str,
91
+ ) -> None:
92
+ self.options = options
93
+ self.formatted_option_to_index = formatted_option_to_index
94
+ self.default_indices = default_indices
95
+ self.format_func = format_func
96
+
97
+ def _get_default(self, is_range: bool) -> T | tuple[T, T]:
98
+ """Return the default value based on default_indices."""
99
+ if is_range or len(self.default_indices) >= 2:
100
+ end_idx = (
101
+ self.default_indices[1]
102
+ if len(self.default_indices) > 1
103
+ else len(self.options) - 1
104
+ )
105
+ return (self.options[self.default_indices[0]], self.options[end_idx])
106
+ return self.options[self.default_indices[0]]
107
+
108
+ def serialize(self, v: T | tuple[T, T] | list[T]) -> list[str]:
109
+ """Convert option value(s) to formatted string list."""
110
+ # Check if v is a single option (handles options that are tuples/lists)
111
+ try:
112
+ formatted = self.format_func(v)
113
+ if formatted in self.formatted_option_to_index:
114
+ return [formatted]
115
+ except Exception: # noqa: S110
116
+ pass
117
+
118
+ # Handle as range/sequence
119
+ if isinstance(v, (tuple, list)):
120
+ return [self.format_func(x) for x in v]
121
+
122
+ return [self.format_func(v)]
123
+
124
+ def deserialize(self, ui_value: list[str] | None) -> T | tuple[T, T]:
125
+ """Convert formatted string list back to option value(s)."""
126
+ is_range = len(self.default_indices) >= 2
127
+
128
+ if not ui_value:
129
+ return self._get_default(is_range=is_range)
130
+
131
+ expected_len = 2 if is_range else 1
132
+ if len(ui_value) != expected_len:
133
+ # Wrong number of values (e.g. single URL param for a range
134
+ # select_slider); fall back to default so the URL param is cleared.
135
+ return self._get_default(is_range=is_range)
136
+
137
+ # Look up each string value
138
+ results: list[tuple[int, T]] = []
139
+ for i, s in enumerate(ui_value):
140
+ idx = self.formatted_option_to_index.get(s)
141
+ if idx is not None and idx < len(self.options):
142
+ results.append((idx, self.options[idx]))
143
+ else:
144
+ # Fallback to default for this position
145
+ default_idx = self.default_indices[
146
+ min(i, len(self.default_indices) - 1)
147
+ ]
148
+ results.append((default_idx, self.options[default_idx]))
149
+
150
+ if is_range:
151
+ # Ensure start <= end by returning deserialized range value in ascending order
152
+ if results[0][0] > results[1][0]:
153
+ return (results[1][1], results[0][1])
154
+ return (results[0][1], results[1][1])
155
+
156
+ return results[0][1]
157
+
158
+
159
+ class SelectSliderMixin:
160
+ @overload
161
+ def select_slider(
162
+ self,
163
+ label: str,
164
+ options: OptionSequence[T],
165
+ value: tuple[T, T] | list[T],
166
+ format_func: Callable[[Any], Any] = str,
167
+ key: Key | None = None,
168
+ help: str | None = None,
169
+ on_change: WidgetCallback | None = None,
170
+ args: WidgetArgs | None = None,
171
+ kwargs: WidgetKwargs | None = None,
172
+ *, # keyword-only arguments:
173
+ disabled: bool = False,
174
+ label_visibility: LabelVisibility = "visible",
175
+ width: WidthWithoutContent = "stretch",
176
+ bind: BindOption = None,
177
+ ) -> tuple[T, T]: ...
178
+
179
+ @overload
180
+ def select_slider(
181
+ self,
182
+ label: str,
183
+ options: OptionSequence[T] = (),
184
+ value: T | None = None,
185
+ format_func: Callable[[Any], Any] = str,
186
+ key: Key | None = None,
187
+ help: str | None = None,
188
+ on_change: WidgetCallback | None = None,
189
+ args: WidgetArgs | None = None,
190
+ kwargs: WidgetKwargs | None = None,
191
+ *, # keyword-only arguments:
192
+ disabled: bool = False,
193
+ label_visibility: LabelVisibility = "visible",
194
+ width: WidthWithoutContent = "stretch",
195
+ bind: BindOption = None,
196
+ ) -> T: ...
197
+
198
+ @gather_metrics("select_slider")
199
+ def select_slider(
200
+ self,
201
+ label: str,
202
+ options: OptionSequence[T] = (),
203
+ value: T | Sequence[T] | None = None,
204
+ format_func: Callable[[Any], Any] = str,
205
+ key: Key | None = None,
206
+ help: str | None = None,
207
+ on_change: WidgetCallback | None = None,
208
+ args: WidgetArgs | None = None,
209
+ kwargs: WidgetKwargs | None = None,
210
+ *, # keyword-only arguments:
211
+ disabled: bool = False,
212
+ label_visibility: LabelVisibility = "visible",
213
+ width: WidthWithoutContent = "stretch",
214
+ bind: BindOption = None,
215
+ ) -> T | tuple[T, T]:
216
+ r"""
217
+ Display a slider widget to select items from a list.
218
+
219
+ This also allows you to render a range slider by passing a two-element
220
+ tuple or list as the ``value``.
221
+
222
+ The difference between ``st.select_slider`` and ``st.slider`` is that
223
+ ``select_slider`` accepts any datatype and takes an iterable set of
224
+ options, while ``st.slider`` only accepts numerical or date/time data and
225
+ takes a range as input.
226
+
227
+ Parameters
228
+ ----------
229
+ label : str
230
+ A short label explaining to the user what this slider is for.
231
+ The label can optionally contain GitHub-flavored Markdown of the
232
+ following types: Bold, Italics, Strikethroughs, Inline Code, Links,
233
+ and Images. Images display like icons, with a max height equal to
234
+ the font height.
235
+
236
+ Unsupported Markdown elements are unwrapped so only their children
237
+ (text contents) render. Display unsupported elements as literal
238
+ characters by backslash-escaping them. E.g.,
239
+ ``"1\. Not an ordered list"``.
240
+
241
+ See the ``body`` parameter of |st.markdown|_ for additional,
242
+ supported Markdown directives.
243
+
244
+ For accessibility reasons, you should never set an empty label, but
245
+ you can hide it with ``label_visibility`` if needed. In the future,
246
+ we may disallow empty labels by raising an exception.
247
+
248
+ .. |st.markdown| replace:: ``st.markdown``
249
+ .. _st.markdown: https://docs.streamlit.io/develop/api-reference/text/st.markdown
250
+
251
+ options : Iterable
252
+ Labels for the select options in an ``Iterable``. This can be a
253
+ ``list``, ``set``, or anything supported by ``st.dataframe``. If
254
+ ``options`` is dataframe-like, the first column will be used. Each
255
+ label will be cast to ``str`` internally by default.
256
+
257
+ Each item in the iterable can optionally contain GitHub-flavored
258
+ Markdown, subject to the same limitations described in the
259
+ ``label`` parameter.
260
+
261
+ value : a supported type or a tuple/list of supported types or None
262
+ The value of the slider when it first renders. If a tuple/list
263
+ of two values is passed here, then a range slider with those lower
264
+ and upper bounds is rendered. For example, if set to `(1, 10)` the
265
+ slider will have a selectable range between 1 and 10.
266
+ Defaults to first option.
267
+
268
+ format_func : function
269
+ Function to modify the display of the labels from the options.
270
+ argument. It receives the option as an argument and its output
271
+ will be cast to str.
272
+
273
+ key : str or int
274
+ An optional string or integer to use as the unique key for the widget.
275
+ If this is omitted, a key will be generated for the widget
276
+ based on its content. No two widgets may have the same key.
277
+
278
+ help : str or None
279
+ A tooltip that gets displayed next to the widget label. Streamlit
280
+ only displays the tooltip when ``label_visibility="visible"``. If
281
+ this is ``None`` (default), no tooltip is displayed.
282
+
283
+ The tooltip can optionally contain GitHub-flavored Markdown,
284
+ including the Markdown directives described in the ``body``
285
+ parameter of ``st.markdown``.
286
+
287
+ on_change : callable
288
+ An optional callback invoked when this select_slider's value changes.
289
+
290
+ args : list or tuple
291
+ An optional list or tuple of args to pass to the callback.
292
+
293
+ kwargs : dict
294
+ An optional dict of kwargs to pass to the callback.
295
+
296
+ disabled : bool
297
+ An optional boolean that disables the select slider if set to
298
+ ``True``. The default is ``False``.
299
+
300
+ label_visibility : "visible", "hidden", or "collapsed"
301
+ The visibility of the label. The default is ``"visible"``. If this
302
+ is ``"hidden"``, Streamlit displays an empty spacer instead of the
303
+ label, which can help keep the widget aligned with other widgets.
304
+ If this is ``"collapsed"``, Streamlit displays no label or spacer.
305
+
306
+ width : "stretch" or int
307
+ The width of the slider widget. This can be one of the
308
+ following:
309
+
310
+ - ``"stretch"`` (default): The width of the widget matches the
311
+ width of the parent container.
312
+ - An integer specifying the width in pixels: The widget has a
313
+ fixed width. If the specified width is greater than the width of
314
+ the parent container, the width of the widget matches the width
315
+ of the parent container.
316
+
317
+ bind : "query-params" or None
318
+ If set to ``"query-params"``, the widget's value will be synced
319
+ with a URL query parameter. When the widget value changes, the URL
320
+ is updated; when the page loads with a query parameter, the widget
321
+ is initialized from it. Invalid URL options are auto-corrected to
322
+ the closest valid state. Range select sliders use repeated
323
+ parameters (e.g., ``?key=red&key=blue``). Requires a ``key`` to
324
+ be set, which will be used as the query parameter name. The
325
+ default is ``None``.
326
+
327
+ Returns
328
+ -------
329
+ any value or tuple of any value
330
+ The current value of the slider widget. The return type will match
331
+ the data type of the value parameter.
332
+
333
+ This contains copies of the selected options, not the originals.
334
+
335
+ Examples
336
+ --------
337
+ >>> import streamlit as st
338
+ >>>
339
+ >>> color = st.select_slider(
340
+ ... "Select a color of the rainbow",
341
+ ... options=[
342
+ ... "red",
343
+ ... "orange",
344
+ ... "yellow",
345
+ ... "green",
346
+ ... "blue",
347
+ ... "indigo",
348
+ ... "violet",
349
+ ... ],
350
+ ... )
351
+ >>> st.write("My favorite color is", color)
352
+
353
+ And here's an example of a range select slider:
354
+
355
+ >>> import streamlit as st
356
+ >>>
357
+ >>> start_color, end_color = st.select_slider(
358
+ ... "Select a range of color wavelength",
359
+ ... options=[
360
+ ... "red",
361
+ ... "orange",
362
+ ... "yellow",
363
+ ... "green",
364
+ ... "blue",
365
+ ... "indigo",
366
+ ... "violet",
367
+ ... ],
368
+ ... value=("red", "blue"),
369
+ ... )
370
+ >>> st.write("You selected wavelengths between", start_color, "and", end_color)
371
+
372
+ .. output::
373
+ https://doc-select-slider.streamlit.app/
374
+ height: 450px
375
+
376
+ """
377
+ ctx = get_script_run_ctx()
378
+ return self._select_slider(
379
+ label=label,
380
+ options=options,
381
+ value=value,
382
+ format_func=format_func,
383
+ key=key,
384
+ help=help,
385
+ on_change=on_change,
386
+ args=args,
387
+ kwargs=kwargs,
388
+ disabled=disabled,
389
+ label_visibility=label_visibility,
390
+ ctx=ctx,
391
+ width=width,
392
+ bind=bind,
393
+ )
394
+
395
+ def _select_slider(
396
+ self,
397
+ label: str,
398
+ options: OptionSequence[T] = (),
399
+ value: T | Sequence[T] | None = None,
400
+ format_func: Callable[[Any], Any] = str,
401
+ key: Key | None = None,
402
+ help: str | None = None,
403
+ on_change: WidgetCallback | None = None,
404
+ args: WidgetArgs | None = None,
405
+ kwargs: WidgetKwargs | None = None,
406
+ disabled: bool = False,
407
+ label_visibility: LabelVisibility = "visible",
408
+ ctx: ScriptRunContext | None = None,
409
+ width: WidthWithoutContent = "stretch",
410
+ bind: BindOption = None,
411
+ ) -> T | tuple[T, T]:
412
+ key = to_key(key)
413
+
414
+ check_widget_policies(
415
+ self.dg,
416
+ key,
417
+ on_change,
418
+ default_value=value,
419
+ )
420
+ maybe_raise_label_warnings(label, label_visibility)
421
+
422
+ opt = convert_anything_to_list(options)
423
+ check_python_comparable(opt)
424
+
425
+ if len(opt) == 0:
426
+ raise StreamlitAPIException("The `options` argument needs to be non-empty")
427
+
428
+ def as_index_list(v: Any) -> list[int]:
429
+ if _is_range_value(v):
430
+ slider_value = [index_(opt, val) for val in v]
431
+ start, end = slider_value
432
+ if start > end:
433
+ slider_value = [end, start]
434
+ return slider_value
435
+ # Simplify future logic by always making value a list
436
+ try:
437
+ return [index_(opt, v)]
438
+ except ValueError:
439
+ if value is not None:
440
+ raise
441
+
442
+ return [0]
443
+
444
+ # Convert element to index of the elements
445
+ slider_value = as_index_list(value)
446
+
447
+ # Create formatted options and mapping for string-based storage
448
+ formatted_options, formatted_option_to_option_index = create_mappings(
449
+ opt, format_func
450
+ )
451
+
452
+ element_id = compute_and_register_element_id(
453
+ "select_slider",
454
+ user_key=key,
455
+ key_as_main_identity=True,
456
+ dg=self.dg,
457
+ label=label,
458
+ options=formatted_options,
459
+ value=slider_value,
460
+ help=help,
461
+ width=width,
462
+ )
463
+
464
+ slider_proto = SliderProto()
465
+ slider_proto.id = element_id
466
+ slider_proto.type = SliderProto.Type.SELECT_SLIDER
467
+ slider_proto.label = label
468
+ slider_proto.format = "%s"
469
+ slider_proto.default[:] = slider_value
470
+ slider_proto.min = 0
471
+ slider_proto.max = len(opt) - 1
472
+ slider_proto.step = 1 # default for index changes
473
+ slider_proto.data_type = SliderProto.INT
474
+ slider_proto.options[:] = formatted_options
475
+ slider_proto.form_id = current_form_id(self.dg)
476
+ slider_proto.disabled = disabled
477
+ slider_proto.label_visibility.value = get_label_visibility_proto_value(
478
+ label_visibility
479
+ )
480
+ if help is not None:
481
+ slider_proto.help = dedent(help)
482
+
483
+ if bind and key:
484
+ slider_proto.query_param_key = str(key)
485
+
486
+ validate_width(width)
487
+ layout_config = LayoutConfig(width=width)
488
+
489
+ serde = SelectSliderSerde(
490
+ opt,
491
+ formatted_option_to_index=formatted_option_to_option_index,
492
+ default_indices=slider_value,
493
+ format_func=format_func,
494
+ )
495
+
496
+ widget_state = register_widget(
497
+ slider_proto.id,
498
+ on_change_handler=on_change,
499
+ args=args,
500
+ kwargs=kwargs,
501
+ deserializer=serde.deserialize,
502
+ serializer=serde.serialize,
503
+ ctx=ctx,
504
+ value_type="string_array_value",
505
+ bind=bind,
506
+ # Select sliders always have a value (no empty/cleared state in
507
+ # the UI), so disallow empty URL params (e.g., ?key=).
508
+ clearable=False,
509
+ # Skip URL dedup: ?color=red&color=red is a valid zero-width
510
+ # range. Single-mode duplicates are handled by validation.
511
+ allow_url_duplicates=True,
512
+ )
513
+ if isinstance(widget_state.value, tuple):
514
+ widget_state = maybe_coerce_enum_sequence(
515
+ cast("RegisterWidgetResult[tuple[T, T]]", widget_state), options, opt
516
+ )
517
+ else:
518
+ widget_state = maybe_coerce_enum(widget_state, options, opt)
519
+
520
+ # Validate the current value against the new options.
521
+ # If the value is no longer valid (not in options), reset to default.
522
+ # This handles the case where options change dynamically and the
523
+ # previously selected value is no longer available.
524
+ # Determine if we're dealing with a range value based on the actual
525
+ # widget state value, not just the value parameter (range can come from
526
+ # session state even when value param is None).
527
+ actual_is_range = isinstance(widget_state.value, tuple)
528
+ if actual_is_range:
529
+ # Range value: validate using range-specific function.
530
+ range_value = cast("tuple[T, T]", widget_state.value)
531
+ validated_range, value_needs_reset = (
532
+ validate_and_sync_range_value_with_options(
533
+ range_value,
534
+ opt,
535
+ slider_value,
536
+ key,
537
+ format_func,
538
+ )
539
+ )
540
+ current_value: T | tuple[T, T] = validated_range
541
+ else:
542
+ # Single value: use the standard validation function.
543
+ validated_single, value_needs_reset = validate_and_sync_value_with_options(
544
+ widget_state.value,
545
+ opt,
546
+ slider_value[0],
547
+ key,
548
+ format_func,
549
+ )
550
+ # validated_single is guaranteed to be T (not None) because
551
+ # deserialize() always returns a default value, never None.
552
+ current_value = cast("T", validated_single)
553
+
554
+ if value_needs_reset or widget_state.value_changed:
555
+ serialized_value = serde.serialize(current_value)
556
+ slider_proto.raw_value[:] = serialized_value
557
+ slider_proto.set_value = True
558
+
559
+ if ctx:
560
+ save_for_app_testing(ctx, element_id, format_func)
561
+
562
+ self.dg._enqueue("slider", slider_proto, layout_config=layout_config)
563
+ return current_value
564
+
565
+ @property
566
+ def dg(self) -> DeltaGenerator:
567
+ """Get our DeltaGenerator."""
568
+ return cast("DeltaGenerator", self)