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,537 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2026)
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # http://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ from __future__ import annotations
16
+
17
+ import json
18
+ from collections.abc import Mapping
19
+ from typing import TYPE_CHECKING, Any, cast
20
+
21
+ from streamlit.components.v2.bidi_component.constants import (
22
+ EVENT_DELIM,
23
+ INTERNAL_COMPONENT_NAME,
24
+ )
25
+ from streamlit.components.v2.bidi_component.serialization import (
26
+ BidiComponentSerde,
27
+ deserialize_trigger_list,
28
+ serialize_mixed_data,
29
+ )
30
+ from streamlit.components.v2.bidi_component.state import (
31
+ BidiComponentResult,
32
+ unwrap_component_state,
33
+ )
34
+ from streamlit.components.v2.presentation import make_bidi_component_presenter
35
+ from streamlit.dataframe_util import (
36
+ DataFormat,
37
+ convert_anything_to_arrow_bytes,
38
+ determine_data_format,
39
+ )
40
+ from streamlit.elements.lib.form_utils import current_form_id
41
+ from streamlit.elements.lib.layout_utils import (
42
+ Height,
43
+ LayoutConfig,
44
+ Width,
45
+ validate_width,
46
+ )
47
+ from streamlit.elements.lib.policies import check_cache_replay_rules
48
+ from streamlit.elements.lib.utils import compute_and_register_element_id, to_key
49
+ from streamlit.errors import (
50
+ BidiComponentInvalidCallbackNameError,
51
+ BidiComponentInvalidDefaultKeyError,
52
+ BidiComponentInvalidIdError,
53
+ BidiComponentUnserializableDataError,
54
+ )
55
+ from streamlit.proto.ArrowData_pb2 import ArrowData as ArrowDataProto
56
+ from streamlit.proto.BidiComponent_pb2 import BidiComponent as BidiComponentProto
57
+ from streamlit.proto.BidiComponent_pb2 import MixedData as MixedDataProto
58
+ from streamlit.runtime.metrics_util import gather_metrics
59
+ from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
60
+ from streamlit.runtime.state import register_widget
61
+ from streamlit.util import calc_md5
62
+
63
+ if TYPE_CHECKING:
64
+ from streamlit.components.v2.types import (
65
+ BidiComponentData,
66
+ BidiComponentDefaults,
67
+ BidiComponentKey,
68
+ ComponentIsolateStyles,
69
+ )
70
+
71
+ if TYPE_CHECKING:
72
+ # Define DeltaGenerator for type checking the dg property
73
+ from streamlit.delta_generator import DeltaGenerator
74
+ from streamlit.runtime.state.common import WidgetCallback
75
+
76
+
77
+ def _make_trigger_id(base: str, event: str) -> str:
78
+ """Construct the per-event *trigger widget* identifier.
79
+
80
+ The widget ID for a trigger is derived from the *base* component ID plus
81
+ an *event* name. We join those two parts with :py:const:`EVENT_DELIM` and
82
+ perform a couple of validations so that downstream logic can always split
83
+ the identifier unambiguously.
84
+
85
+ Trigger widgets are marked as internal by prefixing with an internal key prefix,
86
+ so they won't be exposed in `st.session_state` to end users.
87
+
88
+ Parameters
89
+ ----------
90
+ base
91
+ The unique, framework-assigned ID of the component instance.
92
+ event
93
+ The event name as provided by either the frontend or the developer
94
+ (e.g., "click", "change").
95
+
96
+ Returns
97
+ -------
98
+ str
99
+ The composite widget ID in the form ``"$$STREAMLIT_INTERNAL_KEY_{base}__{event}"``
100
+ where ``__`` is the delimiter.
101
+
102
+ Raises
103
+ ------
104
+ StreamlitAPIException
105
+ If either `base` or `event` already contains the delimiter sequence.
106
+
107
+ """
108
+ from streamlit.runtime.state.session_state import STREAMLIT_INTERNAL_KEY_PREFIX
109
+
110
+ if EVENT_DELIM in base:
111
+ raise BidiComponentInvalidIdError("base", EVENT_DELIM)
112
+ if EVENT_DELIM in event:
113
+ raise BidiComponentInvalidIdError("event", EVENT_DELIM)
114
+
115
+ return f"{STREAMLIT_INTERNAL_KEY_PREFIX}_{base}{EVENT_DELIM}{event}"
116
+
117
+
118
+ class BidiComponentMixin:
119
+ """Mixin class for the bidi_component DeltaGenerator method."""
120
+
121
+ def _canonicalize_json_for_identity(self, payload: str) -> str:
122
+ """Return a deterministic JSON string for identity comparisons.
123
+
124
+ Payloads that cannot be parsed (or re-serialized) are returned as-is to
125
+ avoid mutating developer data.
126
+ """
127
+
128
+ if not payload:
129
+ return payload
130
+
131
+ try:
132
+ parsed = json.loads(payload)
133
+ except (TypeError, ValueError):
134
+ return payload
135
+
136
+ try:
137
+ return json.dumps(parsed, sort_keys=True)
138
+ except (TypeError, ValueError):
139
+ return payload
140
+
141
+ def _canonical_json_digest_for_identity(self, payload: str) -> str:
142
+ """Return the hash of the canonicalized JSON payload for identity use.
143
+
144
+ Hashing keeps the kwargs passed to ``compute_and_register_element_id``
145
+ small even when the JSON payload is very large, while still changing the
146
+ identity whenever the canonical JSON content changes.
147
+ """
148
+
149
+ canonical = self._canonicalize_json_for_identity(payload)
150
+ return calc_md5(canonical)
151
+
152
+ def _build_bidi_identity_kwargs(
153
+ self,
154
+ *,
155
+ component_name: str,
156
+ isolate_styles: bool,
157
+ width: Width,
158
+ height: Height,
159
+ proto: BidiComponentProto,
160
+ data: BidiComponentData = None,
161
+ default: BidiComponentDefaults = None,
162
+ ) -> dict[str, Any]:
163
+ """Build deterministic identity kwargs for ID computation.
164
+
165
+ Construct a stable mapping of identity-relevant properties for
166
+ ``compute_and_register_element_id``. This includes structural
167
+ properties (name, style isolation, layout), default state values, and
168
+ an explicit, typed handling of the ``BidiComponent`` ``oneof data``
169
+ field to ensure unkeyed components change identity when their
170
+ serialized payload or defaults change.
171
+
172
+ Parameters
173
+ ----------
174
+ component_name : str
175
+ The registered component name.
176
+ isolate_styles : bool
177
+ Whether the component styles are rendered in a Shadow DOM.
178
+ width : Width
179
+ Desired width configuration passed to the component.
180
+ height : Height
181
+ Desired height configuration passed to the component.
182
+ proto : BidiComponentProto
183
+ The populated component protobuf. Its ``data`` oneof determines
184
+ which serialized payload (JSON, Arrow, bytes, or Mixed) contributes
185
+ to identity.
186
+ data : BidiComponentData, optional
187
+ The raw data passed to the component. Used to optimize identity
188
+ calculation for JSON payloads by avoiding a parse/serialize cycle.
189
+ When omitted, the helper falls back to canonicalizing the JSON
190
+ content stored on the protobuf.
191
+ default : BidiComponentDefaults, optional
192
+ The default state mapping for the component instance. Defaults are
193
+ included in the identity for unkeyed components so that changing
194
+ default values produces a new backend identity. When a user key is
195
+ provided with ``key_as_main_identity=True``, these defaults are
196
+ ignored by :func:`compute_and_register_element_id`.
197
+
198
+ Returns
199
+ -------
200
+ dict[str, Any]
201
+ A mapping of deterministic values to be forwarded into
202
+ ``compute_and_register_element_id``.
203
+
204
+ Raises
205
+ ------
206
+ RuntimeError
207
+ If an unhandled ``oneof data`` variant is encountered (guards
208
+ against adding new fields without updating identity computation).
209
+ """
210
+ identity: dict[str, Any] = {
211
+ "component_name": component_name,
212
+ "isolate_styles": isolate_styles,
213
+ "width": width,
214
+ "height": height,
215
+ "default": default,
216
+ }
217
+
218
+ data_field = proto.WhichOneof("data")
219
+ if data_field is None:
220
+ return identity
221
+
222
+ if data_field == "json":
223
+ # Canonicalize only for identity so unkeyed widgets don't churn when
224
+ # dict insertion order changes.
225
+ #
226
+ # Optimization: Use raw `data` if available to avoid the overhead of
227
+ # parsing `proto.json` back into a dict.
228
+ canonical_digest = None
229
+
230
+ if data is not None:
231
+ try:
232
+ canonical = json.dumps(data, sort_keys=True)
233
+ canonical_digest = calc_md5(canonical)
234
+ except (TypeError, ValueError):
235
+ # Fallback to existing logic if direct dump fails
236
+ pass
237
+
238
+ if canonical_digest is None:
239
+ canonical_digest = self._canonical_json_digest_for_identity(proto.json)
240
+
241
+ identity["json"] = canonical_digest
242
+ elif data_field == "arrow_data":
243
+ # Hash large payloads instead of shoving raw bytes through the ID
244
+ # hasher for performance.
245
+ identity["arrow_data"] = calc_md5(proto.arrow_data.data)
246
+ elif data_field == "bytes":
247
+ # Same story for arbitrary bytes payloads: content-address the data
248
+ # so identity changes track real mutations without re-hashing the
249
+ # whole blob every run.
250
+ identity["bytes"] = calc_md5(proto.bytes)
251
+ elif data_field == "mixed":
252
+ mixed: MixedDataProto = proto.mixed
253
+ # Add the JSON content of the MixedData to the identity.
254
+ identity["mixed_json"] = self._canonical_json_digest_for_identity(
255
+ mixed.json
256
+ )
257
+ # Add the sorted content-addressed ref IDs of the Arrow blobs to the identity.
258
+ # Unlike other data types where we include actual bytes, here we only include
259
+ # the blob keys. This is sufficient because keys are MD5 hashes of the blob
260
+ # content (content-addressed), so identical content produces identical keys.
261
+ identity["mixed_arrow_blobs"] = ",".join(sorted(mixed.arrow_blobs.keys()))
262
+ else:
263
+ raise RuntimeError(
264
+ f"Unhandled BidiComponent.data oneof field: {data_field}"
265
+ )
266
+
267
+ return identity
268
+
269
+ @gather_metrics("_bidi_component")
270
+ def _bidi_component(
271
+ self,
272
+ component_name: str,
273
+ key: BidiComponentKey = None,
274
+ isolate_styles: ComponentIsolateStyles = True,
275
+ data: BidiComponentData = None,
276
+ default: BidiComponentDefaults = None,
277
+ width: Width = "stretch",
278
+ height: Height = "content",
279
+ **kwargs: WidgetCallback | None,
280
+ ) -> BidiComponentResult:
281
+ """Add a bidirectional component instance to the app.
282
+
283
+ This method uses a component that has already been registered with the
284
+ application.
285
+
286
+ Parameters
287
+ ----------
288
+ component_name
289
+ The name of the registered component to use. The component's HTML,
290
+ CSS, and JavaScript will be loaded from the registry.
291
+ key
292
+ An optional string to use as the unique key for the component.
293
+ If this is omitted, a key will be generated based on the
294
+ component's execution sequence.
295
+ isolate_styles
296
+ Whether to sandbox the component's styles in a shadow root.
297
+ Defaults to True.
298
+ data
299
+ Data to pass to the component. This can be any JSON-serializable
300
+ data, or a pandas DataFrame, NumPy array, or other dataframe-like
301
+ object that can be serialized to Arrow.
302
+ default
303
+ A dictionary of default values for the component's state properties.
304
+ These defaults are applied only when the state key doesn't exist
305
+ in session state. Keys must correspond to valid state names (those
306
+ with `on_*_change` callbacks). Trigger values do not support
307
+ defaults.
308
+ width
309
+ The desired width of the component. This can be one of "stretch",
310
+ "content", or a number of pixels.
311
+ height
312
+ The desired height of the component. This can be one of "stretch",
313
+ "content", or a number of pixels.
314
+ **kwargs
315
+ Keyword arguments to pass to the component. Callbacks can be passed
316
+ here, with the naming convention `on_{event_name}_change`.
317
+
318
+ Returns
319
+ -------
320
+ BidiComponentResult
321
+ A dictionary-like object that holds the component's state and
322
+ trigger values.
323
+
324
+ Raises
325
+ ------
326
+ ValueError
327
+ If the component name is not found in the registry.
328
+ StreamlitAPIException
329
+ If the component does not have the required JavaScript or HTML
330
+ content, or if the provided data cannot be serialized.
331
+
332
+ """
333
+ check_cache_replay_rules()
334
+
335
+ key = to_key(key)
336
+ ctx = get_script_run_ctx()
337
+
338
+ if ctx is None:
339
+ # Create an empty state with the default value and return it
340
+ return BidiComponentResult({}, {})
341
+
342
+ # Get the component definition from the registry
343
+ from streamlit.runtime import Runtime
344
+
345
+ registry = Runtime.instance().bidi_component_registry
346
+ component_def = registry.get(component_name)
347
+
348
+ if component_def is None:
349
+ raise ValueError(f"Component '{component_name}' is not registered")
350
+
351
+ # ------------------------------------------------------------------
352
+ # 1. Parse user-supplied callbacks
353
+ # ------------------------------------------------------------------
354
+ # Event-specific callbacks follow the pattern ``on_<event>_change``.
355
+ # We deliberately *do not* support the legacy generic ``on_change``
356
+ # or ``on_<event>`` forms.
357
+ callbacks_by_event: dict[str, WidgetCallback] = {}
358
+ for kwarg_key, kwarg_value in list(kwargs.items()):
359
+ if not callable(kwarg_value):
360
+ continue
361
+
362
+ if kwarg_key.startswith("on_") and kwarg_key.endswith("_change"):
363
+ # Preferred pattern: on_<event>_change
364
+ event_name = kwarg_key[3:-7] # strip prefix + suffix
365
+ else:
366
+ # Not an event callback we recognize - skip.
367
+ continue
368
+
369
+ if not event_name or event_name == "_":
370
+ raise BidiComponentInvalidCallbackNameError(kwarg_key)
371
+
372
+ callbacks_by_event[event_name] = kwarg_value
373
+
374
+ # ------------------------------------------------------------------
375
+ # 2. Validate default keys against registered callbacks
376
+ # ------------------------------------------------------------------
377
+ if default is not None:
378
+ for state_key in default:
379
+ if state_key not in callbacks_by_event:
380
+ raise BidiComponentInvalidDefaultKeyError(
381
+ state_key, list(callbacks_by_event.keys())
382
+ )
383
+
384
+ # Set up the component proto
385
+ bidi_component_proto = BidiComponentProto()
386
+ bidi_component_proto.component_name = component_name
387
+ bidi_component_proto.isolate_styles = isolate_styles
388
+ bidi_component_proto.js_content = component_def.js_content or ""
389
+ bidi_component_proto.js_source_path = component_def.js_url or ""
390
+ bidi_component_proto.html_content = component_def.html_content or ""
391
+ bidi_component_proto.css_content = component_def.css_content or ""
392
+ bidi_component_proto.css_source_path = component_def.css_url or ""
393
+
394
+ validate_width(width, allow_content=True)
395
+ layout_config = LayoutConfig(width=width, height=height)
396
+
397
+ if data is not None:
398
+ try:
399
+ # 1. Raw byte payloads - forward as-is.
400
+ if isinstance(data, (bytes, bytearray)):
401
+ bidi_component_proto.bytes = bytes(data)
402
+
403
+ # 2. Mapping-like structures (e.g. plain dict) - check for mixed data.
404
+ elif isinstance(data, (Mapping, list, tuple)):
405
+ serialize_mixed_data(data, bidi_component_proto)
406
+
407
+ # 3. Dataframe-like structures - attempt Arrow serialization.
408
+ else:
409
+ data_format = determine_data_format(data)
410
+
411
+ if data_format != DataFormat.UNKNOWN:
412
+ arrow_bytes = convert_anything_to_arrow_bytes(data)
413
+
414
+ arrow_data_proto = ArrowDataProto()
415
+ arrow_data_proto.data = arrow_bytes
416
+
417
+ bidi_component_proto.arrow_data.CopyFrom(arrow_data_proto)
418
+ else:
419
+ # Fallback to JSON.
420
+ bidi_component_proto.json = json.dumps(data)
421
+ except Exception:
422
+ # As a last resort attempt JSON serialization so that we don't
423
+ # silently drop developer data.
424
+ try:
425
+ bidi_component_proto.json = json.dumps(data)
426
+ except Exception:
427
+ raise BidiComponentUnserializableDataError()
428
+ bidi_component_proto.form_id = current_form_id(self.dg)
429
+
430
+ # Build identity kwargs for the component instance now that the proto is
431
+ # populated.
432
+ identity_kwargs = self._build_bidi_identity_kwargs(
433
+ component_name=component_name,
434
+ isolate_styles=isolate_styles,
435
+ width=width,
436
+ height=height,
437
+ proto=bidi_component_proto,
438
+ data=data,
439
+ default=default,
440
+ )
441
+ # Compute a unique ID for this component instance now that the proto is
442
+ # populated.
443
+ computed_id = compute_and_register_element_id(
444
+ "bidi_component",
445
+ user_key=key,
446
+ key_as_main_identity=True,
447
+ dg=self.dg,
448
+ **identity_kwargs,
449
+ )
450
+ bidi_component_proto.id = computed_id
451
+
452
+ # Instantiate the Serde for this component instance
453
+ serde = BidiComponentSerde(default=default)
454
+
455
+ # ------------------------------------------------------------------
456
+ # 3. Prepare IDs and register widgets
457
+ # ------------------------------------------------------------------
458
+
459
+ # Compute trigger aggregator id from the base id
460
+ def _make_trigger_aggregator_id(base: str) -> str:
461
+ return _make_trigger_id(base, "events")
462
+
463
+ aggregator_id = _make_trigger_aggregator_id(computed_id)
464
+
465
+ # With generalized runtime dispatch, we can attach per-key callbacks
466
+ # directly to the state widget by passing the callbacks mapping.
467
+ # We also register a presenter to shape the user-visible session_state.
468
+ # Allowed state keys are the ones that have callbacks registered.
469
+ allowed_state_keys = (
470
+ set(callbacks_by_event.keys()) if callbacks_by_event else None
471
+ )
472
+ presenter = make_bidi_component_presenter(
473
+ aggregator_id,
474
+ computed_id,
475
+ allowed_state_keys,
476
+ )
477
+
478
+ component_state = register_widget(
479
+ bidi_component_proto.id,
480
+ deserializer=serde.deserialize,
481
+ serializer=serde.serialize,
482
+ ctx=ctx,
483
+ callbacks=callbacks_by_event or None,
484
+ value_type="json_value",
485
+ presenter=presenter,
486
+ )
487
+
488
+ # ------------------------------------------------------------------
489
+ # 4. Register a single *trigger aggregator* widget
490
+ # ------------------------------------------------------------------
491
+ trigger_vals: dict[str, Any] = {}
492
+
493
+ trig_state = register_widget(
494
+ aggregator_id,
495
+ deserializer=deserialize_trigger_list, # always returns list or None
496
+ serializer=lambda v: json.dumps(v), # send dict as JSON
497
+ ctx=ctx,
498
+ callbacks=callbacks_by_event or None,
499
+ value_type="json_trigger_value",
500
+ )
501
+
502
+ # Surface per-event trigger values derived from the aggregator payload list.
503
+ payloads: list[object] = trig_state.value or []
504
+
505
+ event_to_value: dict[str, Any] = {}
506
+ for payload in payloads:
507
+ if isinstance(payload, dict):
508
+ ev = payload.get("event")
509
+ if isinstance(ev, str):
510
+ event_to_value[ev] = payload.get("value")
511
+
512
+ for evt_name in callbacks_by_event:
513
+ trigger_vals[evt_name] = event_to_value.get(evt_name)
514
+
515
+ # Note: We intentionally do not inspect SessionState for additional
516
+ # trigger widget IDs here because doing so can raise KeyErrors when
517
+ # widgets are freshly registered but their values haven't been
518
+ # populated yet. Only the triggers explicitly registered above are
519
+ # included in the result object.
520
+
521
+ # ------------------------------------------------------------------
522
+ # 5. Enqueue proto and assemble the result object
523
+ # ------------------------------------------------------------------
524
+ self.dg._enqueue(
525
+ INTERNAL_COMPONENT_NAME,
526
+ bidi_component_proto,
527
+ layout_config=layout_config,
528
+ )
529
+
530
+ state_vals = unwrap_component_state(component_state.value)
531
+
532
+ return BidiComponentResult(state_vals, trigger_vals)
533
+
534
+ @property
535
+ def dg(self) -> DeltaGenerator:
536
+ """Get our DeltaGenerator."""
537
+ return cast("DeltaGenerator", self)