streamlit 1.45.1__py3-none-any.whl → 1.46.1__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.
- streamlit/__init__.py +5 -1
- streamlit/auth_util.py +12 -12
- streamlit/cli_util.py +4 -3
- streamlit/column_config.py +11 -9
- streamlit/commands/echo.py +6 -4
- streamlit/commands/execution_control.py +33 -32
- streamlit/commands/experimental_query_params.py +2 -2
- streamlit/commands/logo.py +9 -4
- streamlit/commands/navigation.py +61 -18
- streamlit/commands/page_config.py +57 -47
- streamlit/components/types/base_custom_component.py +7 -7
- streamlit/components/v1/component_registry.py +7 -3
- streamlit/components/v1/components.py +1 -1
- streamlit/components/v1/custom_component.py +8 -8
- streamlit/config.py +289 -144
- streamlit/config_option.py +19 -15
- streamlit/config_util.py +29 -23
- streamlit/connections/__init__.py +2 -2
- streamlit/connections/base_connection.py +5 -5
- streamlit/connections/snowflake_connection.py +13 -11
- streamlit/connections/snowpark_connection.py +3 -3
- streamlit/connections/sql_connection.py +20 -18
- streamlit/connections/util.py +2 -2
- streamlit/cursor.py +6 -6
- streamlit/dataframe_util.py +52 -52
- streamlit/delta_generator.py +46 -48
- streamlit/delta_generator_singletons.py +3 -3
- streamlit/deprecation_util.py +6 -6
- streamlit/elements/alert.py +37 -29
- streamlit/elements/arrow.py +40 -22
- streamlit/elements/code.py +46 -13
- streamlit/elements/deck_gl_json_chart.py +38 -27
- streamlit/elements/dialog_decorator.py +3 -4
- streamlit/elements/doc_string.py +64 -58
- streamlit/elements/exception.py +23 -27
- streamlit/elements/form.py +41 -0
- streamlit/elements/graphviz_chart.py +1 -1
- streamlit/elements/heading.py +60 -9
- streamlit/elements/html.py +3 -4
- streamlit/elements/image.py +8 -9
- streamlit/elements/json.py +21 -2
- streamlit/elements/layouts.py +120 -31
- streamlit/elements/lib/built_in_chart_utils.py +96 -73
- streamlit/elements/lib/color_util.py +3 -3
- streamlit/elements/lib/column_config_utils.py +2 -4
- streamlit/elements/lib/column_types.py +14 -8
- streamlit/elements/lib/dialog.py +9 -5
- streamlit/elements/lib/image_utils.py +39 -40
- streamlit/elements/lib/js_number.py +4 -4
- streamlit/elements/lib/layout_utils.py +65 -1
- streamlit/elements/lib/mutable_status_container.py +14 -3
- streamlit/elements/lib/options_selector_utils.py +22 -12
- streamlit/elements/lib/pandas_styler_utils.py +25 -21
- streamlit/elements/lib/policies.py +6 -5
- streamlit/elements/lib/streamlit_plotly_theme.py +54 -53
- streamlit/elements/lib/subtitle_utils.py +6 -9
- streamlit/elements/lib/utils.py +20 -5
- streamlit/elements/map.py +32 -56
- streamlit/elements/markdown.py +101 -12
- streamlit/elements/media.py +78 -21
- streamlit/elements/metric.py +32 -16
- streamlit/elements/plotly_chart.py +15 -15
- streamlit/elements/progress.py +33 -15
- streamlit/elements/spinner.py +31 -6
- streamlit/elements/text.py +21 -1
- streamlit/elements/toast.py +1 -2
- streamlit/elements/vega_charts.py +54 -23
- streamlit/elements/widgets/audio_input.py +24 -7
- streamlit/elements/widgets/button.py +26 -19
- streamlit/elements/widgets/button_group.py +10 -15
- streamlit/elements/widgets/camera_input.py +27 -7
- streamlit/elements/widgets/chat.py +91 -38
- streamlit/elements/widgets/checkbox.py +45 -4
- streamlit/elements/widgets/color_picker.py +40 -17
- streamlit/elements/widgets/data_editor.py +76 -37
- streamlit/elements/widgets/file_uploader.py +42 -13
- streamlit/elements/widgets/multiselect.py +7 -10
- streamlit/elements/widgets/number_input.py +123 -47
- streamlit/elements/widgets/radio.py +59 -13
- streamlit/elements/widgets/select_slider.py +35 -30
- streamlit/elements/widgets/selectbox.py +56 -9
- streamlit/elements/widgets/slider.py +190 -99
- streamlit/elements/widgets/text_widgets.py +54 -8
- streamlit/elements/widgets/time_widgets.py +53 -14
- streamlit/elements/write.py +5 -8
- streamlit/env_util.py +2 -7
- streamlit/error_util.py +16 -9
- streamlit/errors.py +69 -48
- streamlit/external/langchain/streamlit_callback_handler.py +10 -5
- streamlit/file_util.py +27 -10
- streamlit/git_util.py +29 -24
- streamlit/hello/animation_demo.py +9 -9
- streamlit/hello/dataframe_demo.py +5 -5
- streamlit/hello/hello.py +1 -0
- streamlit/hello/mapping_demo.py +7 -8
- streamlit/hello/plotting_demo.py +3 -3
- streamlit/hello/streamlit_app.py +28 -26
- streamlit/hello/utils.py +2 -1
- streamlit/logger.py +10 -11
- streamlit/navigation/page.py +11 -8
- streamlit/proto/Audio_pb2.py +4 -3
- streamlit/proto/Audio_pb2.pyi +8 -1
- streamlit/proto/Block_pb2.py +38 -29
- streamlit/proto/Block_pb2.pyi +72 -4
- streamlit/proto/ClientState_pb2.py +4 -4
- streamlit/proto/ClientState_pb2.pyi +7 -2
- streamlit/proto/Code_pb2.py +4 -2
- streamlit/proto/Code_pb2.pyi +1 -0
- streamlit/proto/DataFrame_pb2.pyi +1 -1
- streamlit/proto/DeckGlJsonChart_pb2.pyi +1 -1
- streamlit/proto/Element_pb2.py +5 -3
- streamlit/proto/Element_pb2.pyi +20 -3
- streamlit/proto/GapSize_pb2.py +29 -0
- streamlit/proto/GapSize_pb2.pyi +70 -0
- streamlit/proto/HeightConfig_pb2.py +27 -0
- streamlit/proto/HeightConfig_pb2.pyi +48 -0
- streamlit/proto/NamedDataSet_pb2.pyi +1 -1
- streamlit/proto/Navigation_pb2.py +3 -3
- streamlit/proto/Navigation_pb2.pyi +4 -0
- streamlit/proto/NewSession_pb2.py +18 -16
- streamlit/proto/NewSession_pb2.pyi +29 -3
- streamlit/proto/PageConfig_pb2.py +7 -7
- streamlit/proto/PageConfig_pb2.pyi +21 -1
- streamlit/proto/Video_pb2.py +8 -7
- streamlit/proto/Video_pb2.pyi +8 -1
- streamlit/proto/WidthConfig_pb2.py +2 -2
- streamlit/proto/WidthConfig_pb2.pyi +15 -1
- streamlit/runtime/__init__.py +1 -1
- streamlit/runtime/app_session.py +53 -40
- streamlit/runtime/caching/__init__.py +9 -9
- streamlit/runtime/caching/cache_data_api.py +36 -30
- streamlit/runtime/caching/cache_errors.py +4 -4
- streamlit/runtime/caching/cache_resource_api.py +8 -8
- streamlit/runtime/caching/cache_utils.py +15 -14
- streamlit/runtime/caching/cached_message_replay.py +14 -8
- streamlit/runtime/caching/hashing.py +91 -97
- streamlit/runtime/caching/legacy_cache_api.py +2 -2
- streamlit/runtime/caching/storage/cache_storage_protocol.py +1 -1
- streamlit/runtime/caching/storage/dummy_cache_storage.py +1 -1
- streamlit/runtime/caching/storage/in_memory_cache_storage_wrapper.py +12 -14
- streamlit/runtime/caching/storage/local_disk_cache_storage.py +6 -6
- streamlit/runtime/connection_factory.py +36 -36
- streamlit/runtime/context.py +58 -9
- streamlit/runtime/credentials.py +29 -40
- streamlit/runtime/forward_msg_queue.py +11 -11
- streamlit/runtime/fragment.py +7 -7
- streamlit/runtime/media_file_manager.py +3 -4
- streamlit/runtime/memory_media_file_storage.py +6 -5
- streamlit/runtime/memory_uploaded_file_manager.py +2 -2
- streamlit/runtime/metrics_util.py +11 -12
- streamlit/runtime/pages_manager.py +4 -6
- streamlit/runtime/runtime.py +8 -6
- streamlit/runtime/runtime_util.py +7 -6
- streamlit/runtime/scriptrunner/__init__.py +4 -4
- streamlit/runtime/scriptrunner/exec_code.py +12 -5
- streamlit/runtime/scriptrunner/magic.py +16 -12
- streamlit/runtime/scriptrunner/script_cache.py +1 -1
- streamlit/runtime/scriptrunner/script_runner.py +53 -29
- streamlit/runtime/scriptrunner_utils/exceptions.py +1 -1
- streamlit/runtime/scriptrunner_utils/script_requests.py +7 -4
- streamlit/runtime/scriptrunner_utils/script_run_context.py +10 -23
- streamlit/runtime/secrets.py +40 -35
- streamlit/runtime/session_manager.py +2 -1
- streamlit/runtime/state/__init__.py +5 -5
- streamlit/runtime/state/common.py +2 -2
- streamlit/runtime/state/query_params.py +13 -15
- streamlit/runtime/state/query_params_proxy.py +17 -13
- streamlit/runtime/state/safe_session_state.py +2 -2
- streamlit/runtime/state/session_state.py +52 -34
- streamlit/runtime/stats.py +2 -2
- streamlit/runtime/uploaded_file_manager.py +1 -1
- streamlit/runtime/websocket_session_manager.py +10 -6
- streamlit/source_util.py +8 -6
- streamlit/static/index.html +3 -17
- streamlit/static/manifest.json +1180 -0
- streamlit/static/static/css/{index.DqDwtg6_.css → index.CJVRHjQZ.css} +1 -1
- streamlit/static/static/js/{ErrorOutline.esm.DU9IrB3M.js → ErrorOutline.esm.DitPpe1Y.js} +1 -1
- streamlit/static/static/js/{FileDownload.esm.P9rKwKo8.js → FileDownload.esm.AI3watX9.js} +1 -1
- streamlit/static/static/js/{FileHelper.D7RMkx0e.js → FileHelper.kt7mhnu8.js} +5 -5
- streamlit/static/static/js/{FormClearHelper.B67tgll0.js → FormClearHelper.D1M9GM_c.js} +1 -1
- streamlit/static/static/js/{Hooks.ncTJktu9.js → Hooks.BGwHKeUc.js} +1 -1
- streamlit/static/static/js/{InputInstructions.D-Y8geDN.js → InputInstructions.DaZ89mzH.js} +1 -1
- streamlit/static/static/js/{ProgressBar.B-kexwwD.js → ProgressBar.C0zPMe-p.js} +2 -2
- streamlit/static/static/js/{RenderInPortalIfExists.BgaoZgep.js → RenderInPortalIfExists.Ox8gQvdz.js} +1 -1
- streamlit/static/static/js/Toolbar.KhlcEc0K.js +1 -0
- streamlit/static/static/js/UploadFileInfo.0DCkpDDf.js +6 -0
- streamlit/static/static/js/{base-input.BoAa1U94.js → base-input.BJ4qsfSq.js} +4 -4
- streamlit/static/static/js/{checkbox.Z6iSfe5F.js → checkbox.DSDh78Xz.js} +2 -2
- streamlit/static/static/js/{createSuper.B4oGDYRm.js → createSuper.wQ9SIXEJ.js} +1 -1
- streamlit/static/static/js/{data-grid-overlay-editor.msYws2Ou.js → data-grid-overlay-editor.DvbdPJ15.js} +1 -1
- streamlit/static/static/js/{downloader.kc14n2Hv.js → downloader.CD9rzih5.js} +1 -1
- streamlit/static/static/js/{es6.CxQz807-.js → es6.48Q9Qjgb.js} +2 -2
- streamlit/static/static/js/{iframeResizer.contentWindow.B19u0ONI.js → iframeResizer.contentWindow.CKdem3Bn.js} +1 -1
- streamlit/static/static/js/{index.LaIasviC.js → index.6md5Qhod.js} +1 -1
- streamlit/static/static/js/index.7hy6AeJ1.js +1 -0
- streamlit/static/static/js/index.B4CGJiBW.js +1 -0
- streamlit/static/static/js/index.B8oW0ZTD.js +1 -0
- streamlit/static/static/js/index.BU6RnlHI.js +73 -0
- streamlit/static/static/js/index.BUq9Wcf8.js +197 -0
- streamlit/static/static/js/{index.BFz9U2y0.js → index.BXXo-Yoj.js} +1 -1
- streamlit/static/static/js/index.Bae9H0OS.js +1 -0
- streamlit/static/static/js/{index.-5ruC9At.js → index.BhTl2Uyb.js} +1 -1
- streamlit/static/static/js/{index.BpILzHf_.js → index.BiSaCB1o.js} +20 -20
- streamlit/static/static/js/{index.xNQq3Ei5.js → index.BulSAJ9z.js} +1 -1
- streamlit/static/static/js/{index.9V1KdxfP.js → index.Bv-EuTKR.js} +1 -1
- streamlit/static/static/js/index.BvMLYCHi.js +1 -0
- streamlit/static/static/js/index.C1NIn1Y2.js +783 -0
- streamlit/static/static/js/index.CP-fthOJ.js +2 -0
- streamlit/static/static/js/{index.BoigZiu7.js → index.CS9guO3p.js} +1 -1
- streamlit/static/static/js/index.CYTBHth8.js +1 -0
- streamlit/static/static/js/{index.CmTAF0dM.js → index.CcJufcuD.js} +1 -1
- streamlit/static/static/js/index.CnENU1yn.js +1 -0
- streamlit/static/static/js/index.Cns13qBb.js +1 -0
- streamlit/static/static/js/index.Ct_xXq7w.js +1 -0
- streamlit/static/static/js/{index.BqfdT8-Q.js → index.CxGSemHL.js} +1 -1
- streamlit/static/static/js/index.D5S0ldVb.js +1 -0
- streamlit/static/static/js/index.D72B_ksb.js +2 -0
- streamlit/static/static/js/index.DI4yZ27M.js +1 -0
- streamlit/static/static/js/index.DN51vLxR.js +1 -0
- streamlit/static/static/js/index.DRtq5dka.js +1 -0
- streamlit/static/static/js/{index.BHXxWdde.js → index.DX-oiXlb.js} +1 -1
- streamlit/static/static/js/index.DlFE4_Aq.js +12 -0
- streamlit/static/static/js/{index.BHGGDa8K.js → index.J7BJwXOi.js} +2 -2
- streamlit/static/static/js/index.Jg38kJPP.js +1 -0
- streamlit/static/static/js/index.JhIO6abf.js +3 -0
- streamlit/static/static/js/{index.DeB9iKFW.js → index.NkRcWwc5.js} +255 -255
- streamlit/static/static/js/{index.BGga-hcS.js → index.prekPLrm.js} +25 -25
- streamlit/static/static/js/{index.BRXmLIsC.js → index.wyzngKUE.js} +1 -1
- streamlit/static/static/js/index.xW7mVdI8.js +1 -0
- streamlit/static/static/js/index.yk07dYGx.js +1 -0
- streamlit/static/static/js/{input.DsCfafm0.js → input.CxKZ5Wrc.js} +2 -2
- streamlit/static/static/js/{memory.nY_lMTtu.js → memory.DeZ9VUvl.js} +1 -1
- streamlit/static/static/js/{mergeWith.B_7zmsM4.js → mergeWith.CVkhrWUb.js} +1 -1
- streamlit/static/static/js/{number-overlay-editor.CSeVhHRU.js → number-overlay-editor.Bpkm3nTq.js} +1 -1
- streamlit/static/static/js/{possibleConstructorReturn.nNhsvgRd.js → possibleConstructorReturn.CIDCId52.js} +1 -1
- streamlit/static/static/js/{sandbox.Cgm3iuL6.js → sandbox.TrkMaokR.js} +1 -1
- streamlit/static/static/js/{textarea.BR8rlyih.js → textarea.QKjxR64N.js} +2 -2
- streamlit/static/static/js/{timepicker.w4XhAenH.js → timepicker.DJYmE1dK.js} +1 -1
- streamlit/static/static/js/{toConsumableArray.CgkEPBwD.js → toConsumableArray.BZoworE-.js} +1 -1
- streamlit/static/static/js/{uniqueId.j-1rlNNH.js → uniqueId.O0UbJ2Bu.js} +1 -1
- streamlit/static/static/js/{useBasicWidgetState.zXY9CjFS.js → useBasicWidgetState.Ci89jaH5.js} +1 -1
- streamlit/static/static/js/useOnInputChange.Cxh6ExEn.js +1 -0
- streamlit/static/static/js/{withFullScreenWrapper.Ov13692o.js → withFullScreenWrapper.iW37lS8Z.js} +1 -1
- streamlit/static/static/media/SourceCodeVF-Italic.ttf.Ba1oaZG1.woff2 +0 -0
- streamlit/static/static/media/SourceCodeVF-Upright.ttf.BjWn63N-.woff2 +0 -0
- streamlit/static/static/media/SourceSansVF-Italic.ttf.Bt9VkdQ3.woff2 +0 -0
- streamlit/static/static/media/SourceSansVF-Upright.ttf.BsWL4Kly.woff2 +0 -0
- streamlit/static/static/media/SourceSerifVariable-Italic.ttf.CVdzAtxO.woff2 +0 -0
- streamlit/static/static/media/SourceSerifVariable-Roman.ttf.mdpVL9bi.woff2 +0 -0
- streamlit/string_util.py +14 -19
- streamlit/temporary_directory.py +13 -4
- streamlit/testing/v1/app_test.py +15 -10
- streamlit/testing/v1/element_tree.py +157 -178
- streamlit/testing/v1/local_script_runner.py +11 -15
- streamlit/testing/v1/util.py +11 -4
- streamlit/type_util.py +8 -12
- streamlit/url_util.py +1 -1
- streamlit/user_info.py +6 -5
- streamlit/util.py +25 -1
- streamlit/vendor/pympler/asizeof.py +3 -2
- streamlit/watcher/event_based_path_watcher.py +21 -2
- streamlit/watcher/folder_black_list.py +2 -2
- streamlit/watcher/local_sources_watcher.py +64 -18
- streamlit/watcher/path_watcher.py +6 -10
- streamlit/watcher/polling_path_watcher.py +8 -7
- streamlit/watcher/util.py +7 -6
- streamlit/web/bootstrap.py +16 -14
- streamlit/web/cli.py +52 -45
- streamlit/web/server/__init__.py +7 -3
- streamlit/web/server/app_static_file_handler.py +1 -1
- streamlit/web/server/authlib_tornado_integration.py +9 -4
- streamlit/web/server/browser_websocket_handler.py +8 -2
- streamlit/web/server/component_request_handler.py +14 -10
- streamlit/web/server/media_file_handler.py +14 -7
- streamlit/web/server/oauth_authlib_routes.py +41 -9
- streamlit/web/server/oidc_mixin.py +35 -17
- streamlit/web/server/routes.py +32 -22
- streamlit/web/server/server.py +13 -24
- streamlit/web/server/server_util.py +43 -9
- streamlit/web/server/stats_request_handler.py +7 -5
- streamlit/web/server/upload_file_request_handler.py +22 -19
- streamlit/web/server/websocket_headers.py +1 -1
- {streamlit-1.45.1.dist-info → streamlit-1.46.1.dist-info}/METADATA +4 -4
- streamlit-1.46.1.dist-info/RECORD +559 -0
- {streamlit-1.45.1.dist-info → streamlit-1.46.1.dist-info}/WHEEL +1 -1
- streamlit/elements/lib/event_utils.py +0 -39
- streamlit/static/static/js/Toolbar.D9RUZv9G.js +0 -1
- streamlit/static/static/js/UploadFileInfo.C-jY39rj.js +0 -1
- streamlit/static/static/js/index.8jhZBWF2.js +0 -3
- streamlit/static/static/js/index.BCx3C6e_.js +0 -1
- streamlit/static/static/js/index.BRuTz_S4.js +0 -1
- streamlit/static/static/js/index.Bcru_ti-.js +0 -1
- streamlit/static/static/js/index.Bl1FMJRd.js +0 -1
- streamlit/static/static/js/index.C1z8KpLA.js +0 -779
- streamlit/static/static/js/index.C32I2PUe.js +0 -2
- streamlit/static/static/js/index.C5GnDRB7.js +0 -1
- streamlit/static/static/js/index.CG4qPaaW.js +0 -2
- streamlit/static/static/js/index.C_msmT1u.js +0 -1
- streamlit/static/static/js/index.CbeNTdd6.js +0 -1
- streamlit/static/static/js/index.CnGQVJcw.js +0 -12
- streamlit/static/static/js/index.CopVVq4l.js +0 -1
- streamlit/static/static/js/index.CtXupx4d.js +0 -197
- streamlit/static/static/js/index.DGmCchO7.js +0 -1
- streamlit/static/static/js/index.DH6zBk0e.js +0 -1
- streamlit/static/static/js/index.DHVlVWsm.js +0 -1
- streamlit/static/static/js/index.DRKIVBoi.js +0 -1
- streamlit/static/static/js/index.DUd-lFXx.js +0 -73
- streamlit/static/static/js/index.D_uRBA4B.js +0 -1
- streamlit/static/static/js/index.QHNfgPJd.js +0 -1
- streamlit/static/static/js/index.a-RJocYL.js +0 -1
- streamlit/static/static/js/index.cvz4B1gy.js +0 -1
- streamlit/static/static/js/index.t--hEgTQ.js +0 -6
- streamlit/static/static/js/useOnInputChange.z04u96A8.js +0 -1
- streamlit/static/static/media/SourceCodePro-Bold.CFEfr7-q.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-BoldItalic.C-LkFXxa.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Italic.CxFOx7N-.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-Regular.CBOlD63d.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBold.CFHwW3Wd.woff2 +0 -0
- streamlit/static/static/media/SourceCodePro-SemiBoldItalic.Cg2yRu82.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Bold.-6c9oR8J.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-BoldItalic.DmM_grLY.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Italic.I1ipWe7Q.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-Regular.DZLUzqI4.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBold.sKQIyTMz.woff2 +0 -0
- streamlit/static/static/media/SourceSansPro-SemiBoldItalic.C0wP0icr.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Bold.8TUnKj4x.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-BoldItalic.CBVO7Ve7.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Italic.DkFgL2HZ.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-Regular.CNJNET2S.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBold.CHyh9GC5.woff2 +0 -0
- streamlit/static/static/media/SourceSerifPro-SemiBoldItalic.CBtz8sWN.woff2 +0 -0
- streamlit-1.45.1.dist-info/RECORD +0 -568
- {streamlit-1.45.1.data → streamlit-1.46.1.data}/scripts/streamlit.cmd +0 -0
- {streamlit-1.45.1.dist-info → streamlit-1.46.1.dist-info}/entry_points.txt +0 -0
- {streamlit-1.45.1.dist-info → streamlit-1.46.1.dist-info}/top_level.txt +0 -0
streamlit/elements/arrow.py
CHANGED
|
@@ -37,7 +37,6 @@ from streamlit.elements.lib.column_config_utils import (
|
|
|
37
37
|
process_config_mapping,
|
|
38
38
|
update_column_config,
|
|
39
39
|
)
|
|
40
|
-
from streamlit.elements.lib.event_utils import AttributeDictionary
|
|
41
40
|
from streamlit.elements.lib.form_utils import current_form_id
|
|
42
41
|
from streamlit.elements.lib.pandas_styler_utils import marshall_styler
|
|
43
42
|
from streamlit.elements.lib.policies import check_widget_policies
|
|
@@ -51,6 +50,7 @@ from streamlit.runtime.scriptrunner_utils.script_run_context import (
|
|
|
51
50
|
get_script_run_ctx,
|
|
52
51
|
)
|
|
53
52
|
from streamlit.runtime.state import WidgetCallback, register_widget
|
|
53
|
+
from streamlit.util import AttributeDictionary
|
|
54
54
|
|
|
55
55
|
if TYPE_CHECKING:
|
|
56
56
|
from collections.abc import Hashable, Iterable
|
|
@@ -93,7 +93,7 @@ class DataframeSelectionState(TypedDict, total=False):
|
|
|
93
93
|
The selected rows, identified by their integer position. The integer
|
|
94
94
|
positions match the original dataframe, even if the user sorts the
|
|
95
95
|
dataframe in their browser. For a ``pandas.DataFrame``, you can
|
|
96
|
-
retrieve data from its
|
|
96
|
+
retrieve data from its integer position using methods like ``.iloc[]``
|
|
97
97
|
or ``.iat[]``.
|
|
98
98
|
columns : list[str]
|
|
99
99
|
The selected columns, identified by their names.
|
|
@@ -160,7 +160,7 @@ class DataframeState(TypedDict, total=False):
|
|
|
160
160
|
class DataframeSelectionSerde:
|
|
161
161
|
"""DataframeSelectionSerde is used to serialize and deserialize the dataframe selection state."""
|
|
162
162
|
|
|
163
|
-
def deserialize(self, ui_value: str | None
|
|
163
|
+
def deserialize(self, ui_value: str | None) -> DataframeState:
|
|
164
164
|
empty_selection_state: DataframeState = {
|
|
165
165
|
"selection": {
|
|
166
166
|
"rows": [],
|
|
@@ -208,14 +208,14 @@ def parse_selection_mode(
|
|
|
208
208
|
)
|
|
209
209
|
|
|
210
210
|
parsed_selection_modes = []
|
|
211
|
-
for
|
|
212
|
-
if
|
|
211
|
+
for mode in selection_mode_set:
|
|
212
|
+
if mode == "single-row":
|
|
213
213
|
parsed_selection_modes.append(ArrowProto.SelectionMode.SINGLE_ROW)
|
|
214
|
-
elif
|
|
214
|
+
elif mode == "multi-row":
|
|
215
215
|
parsed_selection_modes.append(ArrowProto.SelectionMode.MULTI_ROW)
|
|
216
|
-
elif
|
|
216
|
+
elif mode == "single-column":
|
|
217
217
|
parsed_selection_modes.append(ArrowProto.SelectionMode.SINGLE_COLUMN)
|
|
218
|
-
elif
|
|
218
|
+
elif mode == "multi-column":
|
|
219
219
|
parsed_selection_modes.append(ArrowProto.SelectionMode.MULTI_COLUMN)
|
|
220
220
|
return set(parsed_selection_modes)
|
|
221
221
|
|
|
@@ -327,7 +327,7 @@ class ArrowMixin:
|
|
|
327
327
|
Desired height of the dataframe expressed in pixels. If ``height``
|
|
328
328
|
is ``None`` (default), Streamlit sets the height to show at most
|
|
329
329
|
ten rows. Vertical scrolling within the dataframe element is
|
|
330
|
-
enabled when the height does not
|
|
330
|
+
enabled when the height does not accommodate all rows.
|
|
331
331
|
|
|
332
332
|
use_container_width : bool
|
|
333
333
|
Whether to override ``width`` with the width of the parent
|
|
@@ -370,7 +370,7 @@ class ArrowMixin:
|
|
|
370
370
|
|
|
371
371
|
- A column type within ``st.column_config``: Streamlit applies the
|
|
372
372
|
defined configuration to the column. For example, use
|
|
373
|
-
``st.column_config.NumberColumn("Dollar values
|
|
373
|
+
``st.column_config.NumberColumn("Dollar values", format="$ %d")``
|
|
374
374
|
to change the displayed name of the column to "Dollar values"
|
|
375
375
|
and add a "$" prefix in each cell. For more info on the
|
|
376
376
|
available column types and config options, see
|
|
@@ -563,7 +563,7 @@ class ArrowMixin:
|
|
|
563
563
|
if use_container_width is None:
|
|
564
564
|
# If use_container_width was not explicitly set by the user, we set
|
|
565
565
|
# it to True if width was not set explicitly, and False otherwise.
|
|
566
|
-
use_container_width =
|
|
566
|
+
use_container_width = width is None
|
|
567
567
|
|
|
568
568
|
proto.use_container_width = use_container_width
|
|
569
569
|
|
|
@@ -623,6 +623,7 @@ class ArrowMixin:
|
|
|
623
623
|
"dataframe",
|
|
624
624
|
user_key=key,
|
|
625
625
|
form_id=proto.form_id,
|
|
626
|
+
dg=self.dg,
|
|
626
627
|
data=proto.data,
|
|
627
628
|
width=width,
|
|
628
629
|
height=height,
|
|
@@ -645,8 +646,7 @@ class ArrowMixin:
|
|
|
645
646
|
)
|
|
646
647
|
self.dg._enqueue("arrow_data_frame", proto)
|
|
647
648
|
return cast("DataframeState", widget_state.value)
|
|
648
|
-
|
|
649
|
-
return self.dg._enqueue("arrow_data_frame", proto)
|
|
649
|
+
return self.dg._enqueue("arrow_data_frame", proto)
|
|
650
650
|
|
|
651
651
|
@gather_metrics("table")
|
|
652
652
|
def table(self, data: Data = None) -> DeltaGenerator:
|
|
@@ -733,7 +733,7 @@ class ArrowMixin:
|
|
|
733
733
|
return self.dg._enqueue("arrow_table", proto)
|
|
734
734
|
|
|
735
735
|
@gather_metrics("add_rows")
|
|
736
|
-
def add_rows(self, data: Data = None, **kwargs) -> DeltaGenerator | None:
|
|
736
|
+
def add_rows(self, data: Data = None, **kwargs: Any) -> DeltaGenerator | None:
|
|
737
737
|
"""Concatenate a dataframe to the bottom of the current one.
|
|
738
738
|
|
|
739
739
|
Parameters
|
|
@@ -789,7 +789,7 @@ class ArrowMixin:
|
|
|
789
789
|
... )
|
|
790
790
|
>>> my_chart.add_rows(some_fancy_name=df2) # <-- name used as keyword
|
|
791
791
|
|
|
792
|
-
"""
|
|
792
|
+
""" # noqa: E501
|
|
793
793
|
return _arrow_add_rows(self.dg, data, **kwargs)
|
|
794
794
|
|
|
795
795
|
@property
|
|
@@ -823,9 +823,7 @@ def _prep_data_for_add_rows(
|
|
|
823
823
|
def _arrow_add_rows(
|
|
824
824
|
dg: DeltaGenerator,
|
|
825
825
|
data: Data = None,
|
|
826
|
-
**kwargs:
|
|
827
|
-
DataFrame | npt.NDArray[Any] | Iterable[Any] | dict[Hashable, Any] | None
|
|
828
|
-
),
|
|
826
|
+
**kwargs: DataFrame | npt.NDArray[Any] | Iterable[Any] | dict[Hashable, Any] | None,
|
|
829
827
|
) -> DeltaGenerator | None:
|
|
830
828
|
"""Concatenate a dataframe to the bottom of the current one.
|
|
831
829
|
|
|
@@ -909,6 +907,25 @@ def _arrow_add_rows(
|
|
|
909
907
|
and dg._cursor.props["add_rows_metadata"].last_index is None
|
|
910
908
|
):
|
|
911
909
|
st_method = getattr(dg, dg._cursor.props["add_rows_metadata"].chart_command)
|
|
910
|
+
metadata = dg._cursor.props["add_rows_metadata"]
|
|
911
|
+
|
|
912
|
+
# Pass the styling properties stored in add_rows_metadata
|
|
913
|
+
# to the new element call.
|
|
914
|
+
kwargs = {}
|
|
915
|
+
if metadata.color is not None:
|
|
916
|
+
kwargs["color"] = metadata.color
|
|
917
|
+
if metadata.width is not None:
|
|
918
|
+
kwargs["width"] = metadata.width
|
|
919
|
+
if metadata.height is not None:
|
|
920
|
+
kwargs["height"] = metadata.height
|
|
921
|
+
if metadata.stack is not None:
|
|
922
|
+
kwargs["stack"] = metadata.stack
|
|
923
|
+
|
|
924
|
+
if metadata.chart_command == "bar_chart":
|
|
925
|
+
kwargs["horizontal"] = metadata.horizontal
|
|
926
|
+
|
|
927
|
+
kwargs["use_container_width"] = metadata.use_container_width
|
|
928
|
+
|
|
912
929
|
st_method(data, **kwargs)
|
|
913
930
|
return None
|
|
914
931
|
|
|
@@ -948,14 +965,15 @@ def marshall(proto: ArrowProto, data: Data, default_uuid: str | None = None) ->
|
|
|
948
965
|
This attribute is optional and only used for pandas.Styler, other elements
|
|
949
966
|
(e.g. charts) can ignore it.
|
|
950
967
|
|
|
951
|
-
"""
|
|
968
|
+
""" # noqa: E501
|
|
952
969
|
|
|
953
970
|
if dataframe_util.is_pandas_styler(data):
|
|
954
971
|
# default_uuid is a string only if the data is a `Styler`,
|
|
955
972
|
# and `None` otherwise.
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
973
|
+
if not isinstance(default_uuid, str):
|
|
974
|
+
raise StreamlitAPIException(
|
|
975
|
+
"Default UUID must be a string for Styler data."
|
|
976
|
+
)
|
|
959
977
|
marshall_styler(proto, data, default_uuid)
|
|
960
978
|
|
|
961
979
|
proto.data = dataframe_util.convert_anything_to_arrow_bytes(data)
|
streamlit/elements/code.py
CHANGED
|
@@ -14,11 +14,17 @@
|
|
|
14
14
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
import re
|
|
18
|
+
from typing import TYPE_CHECKING, Literal, cast
|
|
19
|
+
|
|
20
|
+
from streamlit.elements.lib.layout_utils import (
|
|
21
|
+
LayoutConfig,
|
|
22
|
+
WidthWithoutContent,
|
|
23
|
+
validate_height,
|
|
24
|
+
validate_width,
|
|
25
|
+
)
|
|
19
26
|
from streamlit.proto.Code_pb2 import Code as CodeProto
|
|
20
27
|
from streamlit.runtime.metrics_util import gather_metrics
|
|
21
|
-
from streamlit.string_util import clean_text
|
|
22
28
|
|
|
23
29
|
if TYPE_CHECKING:
|
|
24
30
|
from streamlit.delta_generator import DeltaGenerator
|
|
@@ -34,7 +40,8 @@ class CodeMixin:
|
|
|
34
40
|
*,
|
|
35
41
|
line_numbers: bool = False,
|
|
36
42
|
wrap_lines: bool = False,
|
|
37
|
-
height: int | None =
|
|
43
|
+
height: int | Literal["content"] | None = "content",
|
|
44
|
+
width: WidthWithoutContent = "stretch",
|
|
38
45
|
) -> DeltaGenerator:
|
|
39
46
|
"""Display a code block with optional syntax highlighting.
|
|
40
47
|
|
|
@@ -61,11 +68,31 @@ class CodeMixin:
|
|
|
61
68
|
An optional boolean indicating whether to wrap lines. This defaults
|
|
62
69
|
to ``False``.
|
|
63
70
|
|
|
64
|
-
height :
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
71
|
+
height : "content" or int
|
|
72
|
+
The height of the code block element. This can be one of the following:
|
|
73
|
+
|
|
74
|
+
- ``"content"`` (default): The height of the element matches the
|
|
75
|
+
height of its content.
|
|
76
|
+
- An integer specifying the height in pixels: The element has a
|
|
77
|
+
fixed height. If the content is larger than the specified
|
|
78
|
+
height, scrolling is enabled.
|
|
79
|
+
|
|
80
|
+
.. note::
|
|
81
|
+
Use scrolling containers sparingly. If you use scrolling
|
|
82
|
+
containers, avoid heights that exceed 500 pixels. Otherwise,
|
|
83
|
+
the scroll surface of the container might cover the majority of
|
|
84
|
+
the screen on mobile devices, which makes it hard to scroll the
|
|
85
|
+
rest of the app.
|
|
86
|
+
|
|
87
|
+
width : "stretch" or int
|
|
88
|
+
The width of the code block element. This can be one of the following:
|
|
89
|
+
|
|
90
|
+
- ``"stretch"`` (default): The width of the element matches the
|
|
91
|
+
width of the parent container.
|
|
92
|
+
- An integer specifying the width in pixels: The element has a
|
|
93
|
+
fixed width. If the specified width is greater than the width of
|
|
94
|
+
the parent container, the width of the element matches the width
|
|
95
|
+
of the parent container.
|
|
69
96
|
|
|
70
97
|
Examples
|
|
71
98
|
--------
|
|
@@ -100,13 +127,19 @@ class CodeMixin:
|
|
|
100
127
|
height: 380px
|
|
101
128
|
"""
|
|
102
129
|
code_proto = CodeProto()
|
|
103
|
-
code_proto.code_text =
|
|
130
|
+
code_proto.code_text = re.sub(r"\n\Z", "", re.sub(r"\A\n", "", str(body)))
|
|
104
131
|
code_proto.language = language or "plaintext"
|
|
105
132
|
code_proto.show_line_numbers = line_numbers
|
|
106
133
|
code_proto.wrap_lines = wrap_lines
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
134
|
+
|
|
135
|
+
if height is None:
|
|
136
|
+
height = "content"
|
|
137
|
+
else:
|
|
138
|
+
validate_height(height, allow_content=True)
|
|
139
|
+
validate_width(width)
|
|
140
|
+
layout_config = LayoutConfig(height=height, width=width)
|
|
141
|
+
|
|
142
|
+
return self.dg._enqueue("code", code_proto, layout_config=layout_config)
|
|
110
143
|
|
|
111
144
|
@property
|
|
112
145
|
def dg(self) -> DeltaGenerator:
|
|
@@ -29,7 +29,6 @@ from typing import (
|
|
|
29
29
|
from typing_extensions import TypeAlias
|
|
30
30
|
|
|
31
31
|
from streamlit import config
|
|
32
|
-
from streamlit.elements.lib.event_utils import AttributeDictionary
|
|
33
32
|
from streamlit.elements.lib.form_utils import current_form_id
|
|
34
33
|
from streamlit.elements.lib.policies import check_widget_policies
|
|
35
34
|
from streamlit.elements.lib.utils import Key, compute_and_register_element_id, to_key
|
|
@@ -41,6 +40,7 @@ from streamlit.runtime.state import (
|
|
|
41
40
|
WidgetCallback,
|
|
42
41
|
register_widget,
|
|
43
42
|
)
|
|
43
|
+
from streamlit.util import AttributeDictionary
|
|
44
44
|
|
|
45
45
|
if TYPE_CHECKING:
|
|
46
46
|
from collections.abc import Iterable, Mapping
|
|
@@ -91,10 +91,10 @@ def parse_selection_mode(
|
|
|
91
91
|
)
|
|
92
92
|
|
|
93
93
|
parsed_selection_modes = []
|
|
94
|
-
for
|
|
95
|
-
if
|
|
94
|
+
for mode in selection_mode_set:
|
|
95
|
+
if mode == "single-object":
|
|
96
96
|
parsed_selection_modes.append(PydeckProto.SelectionMode.SINGLE_OBJECT)
|
|
97
|
-
elif
|
|
97
|
+
elif mode == "multi-object":
|
|
98
98
|
parsed_selection_modes.append(PydeckProto.SelectionMode.MULTI_OBJECT)
|
|
99
99
|
return set(parsed_selection_modes)
|
|
100
100
|
|
|
@@ -233,7 +233,7 @@ class PydeckState(TypedDict, total=False):
|
|
|
233
233
|
class PydeckSelectionSerde:
|
|
234
234
|
"""PydeckSelectionSerde is used to serialize and deserialize the Pydeck selection state."""
|
|
235
235
|
|
|
236
|
-
def deserialize(self, ui_value: str | None
|
|
236
|
+
def deserialize(self, ui_value: str | None) -> PydeckState:
|
|
237
237
|
empty_selection_state: PydeckState = {
|
|
238
238
|
"selection": {
|
|
239
239
|
"indices": {},
|
|
@@ -268,8 +268,9 @@ class PydeckMixin:
|
|
|
268
268
|
height: int | None = None,
|
|
269
269
|
selection_mode: Literal[
|
|
270
270
|
"single-object"
|
|
271
|
-
], # Selection mode will only be activated by on_select param
|
|
272
|
-
|
|
271
|
+
], # Selection mode will only be activated by on_select param; default value here to make it work with mypy
|
|
272
|
+
# No default value here to make it work with mypy
|
|
273
|
+
on_select: Literal["ignore"],
|
|
273
274
|
key: Key | None = None,
|
|
274
275
|
) -> DeltaGenerator: ...
|
|
275
276
|
|
|
@@ -308,21 +309,26 @@ class PydeckMixin:
|
|
|
308
309
|
- DeckGL docs: https://github.com/uber/deck.gl/tree/master/docs
|
|
309
310
|
- DeckGL JSON docs: https://github.com/uber/deck.gl/tree/master/modules/json
|
|
310
311
|
|
|
311
|
-
When using this command,
|
|
312
|
-
content.
|
|
313
|
-
|
|
314
|
-
or
|
|
312
|
+
When using this command, a service called Carto_ provides the map tiles to render
|
|
313
|
+
map content. If you're using advanced PyDeck features you may need to obtain
|
|
314
|
+
an API key from Carto first. You can do that as
|
|
315
|
+
``pydeck.Deck(api_keys={"carto": YOUR_KEY})`` or by setting the CARTO_API_KEY
|
|
316
|
+
environment variable. See `PyDeck's documentation`_ for more information.
|
|
315
317
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
use of Mapbox is governed by Mapbox's Terms of Use.
|
|
318
|
+
Another common provider for map tiles is Mapbox_. If you prefer to use that,
|
|
319
|
+
you'll need to create an account at https://mapbox.com and specify your Mapbox
|
|
320
|
+
key when creating the ``pydeck.Deck`` object. You can do that as
|
|
321
|
+
``pydeck.Deck(api_keys={"mapbox": YOUR_KEY})`` or by setting the MAPBOX_API_KEY
|
|
322
|
+
environment variable.
|
|
322
323
|
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
https://
|
|
324
|
+
.. _Carto: https://carto.com
|
|
325
|
+
.. _Mapbox: https://mapbox.com
|
|
326
|
+
.. _PyDeck's documentation: https://deckgl.readthedocs.io/en/latest/deck.html
|
|
327
|
+
|
|
328
|
+
Carto and Mapbox are third-party products and Streamlit accepts no responsibility
|
|
329
|
+
or liability of any kind for Carto or Mapbox, or for any content or information
|
|
330
|
+
made available by Carto or Mapbox. The use of Carto or Mapbox is governed by
|
|
331
|
+
their respective Terms of Use.
|
|
326
332
|
|
|
327
333
|
Parameters
|
|
328
334
|
----------
|
|
@@ -408,7 +414,7 @@ class PydeckMixin:
|
|
|
408
414
|
>>>
|
|
409
415
|
>>> st.pydeck_chart(
|
|
410
416
|
... pdk.Deck(
|
|
411
|
-
... map_style=None,
|
|
417
|
+
... map_style=None, # Use Streamlit theme to pick map style
|
|
412
418
|
... initial_view_state=pdk.ViewState(
|
|
413
419
|
... latitude=37.76,
|
|
414
420
|
... longitude=-122.4,
|
|
@@ -450,10 +456,7 @@ class PydeckMixin:
|
|
|
450
456
|
|
|
451
457
|
ctx = get_script_run_ctx()
|
|
452
458
|
|
|
453
|
-
if pydeck_obj is None
|
|
454
|
-
spec = json.dumps(EMPTY_MAP)
|
|
455
|
-
else:
|
|
456
|
-
spec = pydeck_obj.to_json()
|
|
459
|
+
spec = json.dumps(EMPTY_MAP) if pydeck_obj is None else pydeck_obj.to_json()
|
|
457
460
|
|
|
458
461
|
pydeck_proto.json = spec
|
|
459
462
|
pydeck_proto.use_container_width = use_container_width
|
|
@@ -467,7 +470,13 @@ class PydeckMixin:
|
|
|
467
470
|
if tooltip:
|
|
468
471
|
pydeck_proto.tooltip = json.dumps(tooltip)
|
|
469
472
|
|
|
470
|
-
|
|
473
|
+
# Get the Mapbox key from the PyDeck object first, and then fallback to the
|
|
474
|
+
# old mapbox.token config option.
|
|
475
|
+
|
|
476
|
+
mapbox_token = getattr(pydeck_obj, "mapbox_key", None)
|
|
477
|
+
if mapbox_token is None or mapbox_token == "":
|
|
478
|
+
mapbox_token = config.get_option("mapbox.token")
|
|
479
|
+
|
|
471
480
|
if mapbox_token:
|
|
472
481
|
pydeck_proto.mapbox_token = mapbox_token
|
|
473
482
|
|
|
@@ -476,7 +485,8 @@ class PydeckMixin:
|
|
|
476
485
|
|
|
477
486
|
if on_select not in ["ignore", "rerun"] and not callable(on_select):
|
|
478
487
|
raise StreamlitAPIException(
|
|
479
|
-
f"You have passed {on_select} to `on_select`.
|
|
488
|
+
f"You have passed {on_select} to `on_select`. "
|
|
489
|
+
"But only 'ignore', 'rerun', or a callable is supported."
|
|
480
490
|
)
|
|
481
491
|
|
|
482
492
|
if is_selection_activated:
|
|
@@ -498,6 +508,7 @@ class PydeckMixin:
|
|
|
498
508
|
pydeck_proto.id = compute_and_register_element_id(
|
|
499
509
|
"deck_gl_json_chart",
|
|
500
510
|
user_key=key,
|
|
511
|
+
dg=self.dg,
|
|
501
512
|
is_selection_activated=is_selection_activated,
|
|
502
513
|
selection_mode=selection_mode,
|
|
503
514
|
use_container_width=use_container_width,
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
from __future__ import annotations
|
|
16
16
|
|
|
17
17
|
from functools import wraps
|
|
18
|
-
from typing import TYPE_CHECKING, Callable, TypeVar, cast, overload
|
|
18
|
+
from typing import TYPE_CHECKING, Any, Callable, TypeVar, cast, overload
|
|
19
19
|
|
|
20
20
|
from streamlit.delta_generator_singletons import (
|
|
21
21
|
get_dg_singleton_instance,
|
|
@@ -74,7 +74,7 @@ def _dialog_decorator(
|
|
|
74
74
|
)
|
|
75
75
|
|
|
76
76
|
@wraps(non_optional_func)
|
|
77
|
-
def wrap(*args, **kwargs) -> None:
|
|
77
|
+
def wrap(*args: Any, **kwargs: Any) -> None:
|
|
78
78
|
_assert_no_nested_dialogs()
|
|
79
79
|
# Call the Dialog on the event_dg because it lives outside of the normal
|
|
80
80
|
# Streamlit UI flow. For example, if it is called from the sidebar, it should
|
|
@@ -97,7 +97,6 @@ def _dialog_decorator(
|
|
|
97
97
|
# if the dialog should be closed, st.rerun() has to be called
|
|
98
98
|
# (same behavior as with st.fragment)
|
|
99
99
|
_ = non_optional_func(*args, **kwargs)
|
|
100
|
-
return None
|
|
101
100
|
|
|
102
101
|
# the fragment decorator has multiple return types so that you can pass
|
|
103
102
|
# arguments to it. Here we know the return type, so we cast
|
|
@@ -110,7 +109,7 @@ def _dialog_decorator(
|
|
|
110
109
|
|
|
111
110
|
with dialog:
|
|
112
111
|
fragmented_dialog_content()
|
|
113
|
-
return
|
|
112
|
+
return
|
|
114
113
|
|
|
115
114
|
return cast("F", wrap)
|
|
116
115
|
|