streamlit-nightly 1.45.1.dev20250510__py3-none-any.whl → 1.45.2.dev20250512__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 (126) hide show
  1. streamlit/commands/experimental_query_params.py +1 -1
  2. streamlit/commands/navigation.py +1 -4
  3. streamlit/commands/page_config.py +6 -26
  4. streamlit/config.py +9 -11
  5. streamlit/config_util.py +1 -1
  6. streamlit/connections/sql_connection.py +1 -1
  7. streamlit/dataframe_util.py +50 -51
  8. streamlit/elements/arrow.py +1 -1
  9. streamlit/elements/deck_gl_json_chart.py +1 -4
  10. streamlit/elements/doc_string.py +1 -4
  11. streamlit/elements/exception.py +5 -7
  12. streamlit/elements/layouts.py +4 -3
  13. streamlit/elements/lib/built_in_chart_utils.py +9 -14
  14. streamlit/elements/lib/pandas_styler_utils.py +6 -8
  15. streamlit/elements/map.py +2 -8
  16. streamlit/elements/markdown.py +1 -4
  17. streamlit/elements/media.py +50 -2
  18. streamlit/elements/metric.py +9 -10
  19. streamlit/elements/widgets/audio_input.py +1 -4
  20. streamlit/elements/widgets/camera_input.py +1 -4
  21. streamlit/elements/widgets/chat.py +52 -5
  22. streamlit/elements/widgets/data_editor.py +1 -1
  23. streamlit/elements/widgets/slider.py +3 -4
  24. streamlit/elements/widgets/time_widgets.py +1 -4
  25. streamlit/env_util.py +2 -7
  26. streamlit/errors.py +1 -14
  27. streamlit/logger.py +4 -5
  28. streamlit/proto/Audio_pb2.py +4 -3
  29. streamlit/proto/Audio_pb2.pyi +8 -1
  30. streamlit/proto/Block_pb2.py +5 -5
  31. streamlit/proto/Block_pb2.pyi +7 -1
  32. streamlit/proto/ChatInput_pb2.py +8 -7
  33. streamlit/proto/ChatInput_pb2.pyi +10 -1
  34. streamlit/proto/PageConfig_pb2.py +7 -7
  35. streamlit/proto/PageConfig_pb2.pyi +5 -1
  36. streamlit/proto/Video_pb2.py +8 -7
  37. streamlit/proto/Video_pb2.pyi +8 -1
  38. streamlit/runtime/app_session.py +1 -1
  39. streamlit/runtime/caching/hashing.py +8 -8
  40. streamlit/runtime/credentials.py +5 -4
  41. streamlit/runtime/memory_media_file_storage.py +5 -4
  42. streamlit/runtime/metrics_util.py +1 -1
  43. streamlit/runtime/scriptrunner/script_runner.py +1 -1
  44. streamlit/runtime/scriptrunner_utils/script_run_context.py +0 -15
  45. streamlit/runtime/state/query_params.py +2 -4
  46. streamlit/runtime/state/session_state.py +15 -15
  47. streamlit/static/index.html +1 -1
  48. streamlit/static/static/js/{ErrorOutline.esm.BewaDzzJ.js → ErrorOutline.esm.Cfhrjz42.js} +1 -1
  49. streamlit/static/static/js/{FileDownload.esm.D6ilL7v-.js → FileDownload.esm.BN5DkI-d.js} +1 -1
  50. streamlit/static/static/js/{FileHelper.q7erXtkb.js → FileHelper.BWWhRdUs.js} +1 -1
  51. streamlit/static/static/js/{FormClearHelper.Dd0v0IXt.js → FormClearHelper.CHPGUkGG.js} +1 -1
  52. streamlit/static/static/js/{Hooks.CchmJZGs.js → Hooks.DjxyUmgD.js} +1 -1
  53. streamlit/static/static/js/{InputInstructions.DI9h4PJ7.js → InputInstructions.Bkai2tFZ.js} +1 -1
  54. streamlit/static/static/js/{ProgressBar.DfcVR_JA.js → ProgressBar.DFiqS51i.js} +1 -1
  55. streamlit/static/static/js/{RenderInPortalIfExists.BAkT-LV5.js → RenderInPortalIfExists.DWTzV71R.js} +1 -1
  56. streamlit/static/static/js/{Toolbar.CNzefYiX.js → Toolbar.Dk2A3VxL.js} +1 -1
  57. streamlit/static/static/js/{base-input.BmA1ZV9Y.js → base-input.DfiT3r4p.js} +1 -1
  58. streamlit/static/static/js/{checkbox.mT4TKcAG.js → checkbox.DLXFjls2.js} +1 -1
  59. streamlit/static/static/js/{createSuper.Duo43uhY.js → createSuper.n2DV0o-4.js} +1 -1
  60. streamlit/static/static/js/{data-grid-overlay-editor.CY3l_gmP.js → data-grid-overlay-editor.v1LF25Ml.js} +1 -1
  61. streamlit/static/static/js/{downloader.CM5asV91.js → downloader.CI8EFE9Y.js} +1 -1
  62. streamlit/static/static/js/{es6.uiOeU51e.js → es6.CH6Tf3Uw.js} +2 -2
  63. streamlit/static/static/js/{iframeResizer.contentWindow.ClkMmI3q.js → iframeResizer.contentWindow.VCjyiSg6.js} +1 -1
  64. streamlit/static/static/js/{index.wiodyGjO.js → index.7XN_jSTW.js} +1 -1
  65. streamlit/static/static/js/{index.JA6OF_5t.js → index.9p279joF.js} +1 -1
  66. streamlit/static/static/js/{index.D56z-_rt.js → index.B-Q1qQil.js} +1 -1
  67. streamlit/static/static/js/{index.3d64wPzr.js → index.B1j5m20t.js} +1 -1
  68. streamlit/static/static/js/{index.BWubePhz.js → index.BEE4v1Vc.js} +1 -1
  69. streamlit/static/static/js/{index.C6tuB1Tp.js → index.BFEA8ufN.js} +1 -1
  70. streamlit/static/static/js/{index.BPK3aPVr.js → index.BROoC18J.js} +1 -1
  71. streamlit/static/static/js/{index.BnmoQ0mJ.js → index.BWVpiUBA.js} +1 -1
  72. streamlit/static/static/js/{index.DLO5_tVd.js → index.BgY_Js0s.js} +1 -1
  73. streamlit/static/static/js/{index.DAEzs_UL.js → index.C1P3O0oI.js} +1 -1
  74. streamlit/static/static/js/index.C1TEsRV0.js +779 -0
  75. streamlit/static/static/js/{index.DLyB6OQM.js → index.C9ORVZvA.js} +1 -1
  76. streamlit/static/static/js/{index.IqYlA3jn.js → index.CR4eM0Q3.js} +1 -1
  77. streamlit/static/static/js/{index.DeLPvnoy.js → index.CXpQxU0G.js} +1 -1
  78. streamlit/static/static/js/{index.Dhu_cVNQ.js → index.Cdsxte9t.js} +1 -1
  79. streamlit/static/static/js/{index.CB8SwV8L.js → index.CmsMgepL.js} +1 -1
  80. streamlit/static/static/js/{index.D6AKDy4z.js → index.D1An7GDs.js} +1 -1
  81. streamlit/static/static/js/{index.WlA_Ju7i.js → index.D1DxKfIm.js} +1 -1
  82. streamlit/static/static/js/{index.DNWXtL99.js → index.DKsDSPTo.js} +1 -1
  83. streamlit/static/static/js/{index.C1_voZpt.js → index.DMDjQhhk.js} +1 -1
  84. streamlit/static/static/js/{index.D9lEoddJ.js → index.DM_jnlWC.js} +1 -1
  85. streamlit/static/static/js/{index.Dj8nqcpI.js → index.DUU38l7N.js} +1 -1
  86. streamlit/static/static/js/{index.blwBIOHe.js → index.DXDmqevk.js} +1 -1
  87. streamlit/static/static/js/{index.DeeFVG0Y.js → index.D_Bv6KD1.js} +1 -1
  88. streamlit/static/static/js/{index.B2EfQ-qM.js → index.DcH46Eo2.js} +1 -1
  89. streamlit/static/static/js/{index.SW3uv22k.js → index.DgeyRl4J.js} +1 -1
  90. streamlit/static/static/js/{index.B6y8ns6u.js → index.DoM9A12Z.js} +1 -1
  91. streamlit/static/static/js/{index.BArkjssT.js → index.LqvX_Kr6.js} +1 -1
  92. streamlit/static/static/js/{index.CXmZFP__.js → index.Ovig-AMR.js} +62 -62
  93. streamlit/static/static/js/{index.BmBUBll0.js → index.SPkHHODG.js} +1 -1
  94. streamlit/static/static/js/{index.DbgE46VI.js → index.STF1QdPr.js} +1 -1
  95. streamlit/static/static/js/{index.B-oXGsp7.js → index.ZuW7Olhm.js} +1 -1
  96. streamlit/static/static/js/{index.CYAmxIg2.js → index.hFB9saa3.js} +1 -1
  97. streamlit/static/static/js/{index.D-zMZsin.js → index.jZkr87Ly.js} +1 -1
  98. streamlit/static/static/js/{index.B5wTpdet.js → index.nmbrjghZ.js} +1 -1
  99. streamlit/static/static/js/{index.1tDlzcmX.js → index.uN3TP5oq.js} +1 -1
  100. streamlit/static/static/js/{index.DpWg6flp.js → index.uhNJX5pn.js} +1 -1
  101. streamlit/static/static/js/{input.B3uNJm6d.js → input.BAfiLByr.js} +1 -1
  102. streamlit/static/static/js/{memory.BWtwV556.js → memory.CvD1KGKJ.js} +1 -1
  103. streamlit/static/static/js/{mergeWith.BeTmYGS_.js → mergeWith.Dy4BuY-h.js} +1 -1
  104. streamlit/static/static/js/{number-overlay-editor.MW9-6kFx.js → number-overlay-editor.Bl84FLfp.js} +1 -1
  105. streamlit/static/static/js/{possibleConstructorReturn.ZgHiGHSO.js → possibleConstructorReturn.gffiKeDQ.js} +1 -1
  106. streamlit/static/static/js/{sandbox.BZyTt4zT.js → sandbox.BXw8ya9t.js} +1 -1
  107. streamlit/static/static/js/{textarea.CgvEg9Xi.js → textarea.DNNNKi6n.js} +1 -1
  108. streamlit/static/static/js/{timepicker.CHPC9KOb.js → timepicker.CgHlrhoy.js} +1 -1
  109. streamlit/static/static/js/{toConsumableArray.6GvveewD.js → toConsumableArray.MtZ-3vir.js} +1 -1
  110. streamlit/static/static/js/{uniqueId.BV5h1uCx.js → uniqueId.CFcd6g0d.js} +1 -1
  111. streamlit/static/static/js/{useBasicWidgetState.DzE2MsN8.js → useBasicWidgetState.DadZUraL.js} +1 -1
  112. streamlit/static/static/js/{useOnInputChange.sGAnyCSU.js → useOnInputChange.V6d5TCFH.js} +1 -1
  113. streamlit/static/static/js/{withFullScreenWrapper.Bh08pTH8.js → withFullScreenWrapper.8qpius26.js} +1 -1
  114. streamlit/string_util.py +1 -4
  115. streamlit/testing/v1/element_tree.py +5 -4
  116. streamlit/testing/v1/local_script_runner.py +1 -4
  117. streamlit/type_util.py +2 -5
  118. streamlit/watcher/path_watcher.py +2 -5
  119. streamlit/watcher/polling_path_watcher.py +7 -6
  120. {streamlit_nightly-1.45.1.dev20250510.dist-info → streamlit_nightly-1.45.2.dev20250512.dist-info}/METADATA +1 -1
  121. {streamlit_nightly-1.45.1.dev20250510.dist-info → streamlit_nightly-1.45.2.dev20250512.dist-info}/RECORD +125 -125
  122. streamlit/static/static/js/index.PoIwzrI7.js +0 -779
  123. {streamlit_nightly-1.45.1.dev20250510.data → streamlit_nightly-1.45.2.dev20250512.data}/scripts/streamlit.cmd +0 -0
  124. {streamlit_nightly-1.45.1.dev20250510.dist-info → streamlit_nightly-1.45.2.dev20250512.dist-info}/WHEEL +0 -0
  125. {streamlit_nightly-1.45.1.dev20250510.dist-info → streamlit_nightly-1.45.2.dev20250512.dist-info}/entry_points.txt +0 -0
  126. {streamlit_nightly-1.45.1.dev20250510.dist-info → streamlit_nightly-1.45.2.dev20250512.dist-info}/top_level.txt +0 -0
@@ -12,9 +12,10 @@ from google.protobuf.internal import builder as _builder
12
12
  _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
+ from streamlit.proto import WidthConfig_pb2 as streamlit_dot_proto_dot_WidthConfig__pb2
15
16
 
16
17
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fstreamlit/proto/ChatInput.proto\"\xd0\x02\n\tChatInput\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0bplaceholder\x18\x02 \x01(\t\x12\x11\n\tmax_chars\x18\x03 \x01(\r\x12\x10\n\x08\x64isabled\x18\x04 \x01(\x08\x12\r\n\x05value\x18\x05 \x01(\t\x12\x11\n\tset_value\x18\x06 \x01(\x08\x12\x0f\n\x07\x64\x65\x66\x61ult\x18\x07 \x01(\t\x12%\n\x08position\x18\x08 \x01(\x0e\x32\x13.ChatInput.Position\x12*\n\x0b\x61\x63\x63\x65pt_file\x18\t \x01(\x0e\x32\x15.ChatInput.AcceptFile\x12\x11\n\tfile_type\x18\n \x03(\t\x12\x1a\n\x12max_upload_size_mb\x18\x0b \x01(\x05\"\x16\n\x08Position\x12\n\n\x06\x42OTTOM\x10\x00\"0\n\nAcceptFile\x12\x08\n\x04NONE\x10\x00\x12\n\n\x06SINGLE\x10\x01\x12\x0c\n\x08MULTIPLE\x10\x02\x42.\n\x1c\x63om.snowflake.apps.streamlitB\x0e\x43hatInputProtob\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1fstreamlit/proto/ChatInput.proto\x1a!streamlit/proto/WidthConfig.proto\"\x94\x03\n\tChatInput\x12\n\n\x02id\x18\x01 \x01(\t\x12\x13\n\x0bplaceholder\x18\x02 \x01(\t\x12\x11\n\tmax_chars\x18\x03 \x01(\r\x12\x10\n\x08\x64isabled\x18\x04 \x01(\x08\x12\r\n\x05value\x18\x05 \x01(\t\x12\x11\n\tset_value\x18\x06 \x01(\x08\x12\x0f\n\x07\x64\x65\x66\x61ult\x18\x07 \x01(\t\x12%\n\x08position\x18\x08 \x01(\x0e\x32\x13.ChatInput.Position\x12*\n\x0b\x61\x63\x63\x65pt_file\x18\t \x01(\x0e\x32\x15.ChatInput.AcceptFile\x12\x11\n\tfile_type\x18\n \x03(\t\x12\x1a\n\x12max_upload_size_mb\x18\x0b \x01(\x05\x12\x31\n\x0cwidth_config\x18\x0c \x01(\x0b\x32\x16.streamlit.WidthConfigH\x00\x88\x01\x01\"\x16\n\x08Position\x12\n\n\x06\x42OTTOM\x10\x00\"0\n\nAcceptFile\x12\x08\n\x04NONE\x10\x00\x12\n\n\x06SINGLE\x10\x01\x12\x0c\n\x08MULTIPLE\x10\x02\x42\x0f\n\r_width_configB.\n\x1c\x63om.snowflake.apps.streamlitB\x0e\x43hatInputProtob\x06proto3')
18
19
 
19
20
  _globals = globals()
20
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -22,10 +23,10 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.ChatInput_p
22
23
  if not _descriptor._USE_C_DESCRIPTORS:
23
24
  _globals['DESCRIPTOR']._loaded_options = None
24
25
  _globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\016ChatInputProto'
25
- _globals['_CHATINPUT']._serialized_start=36
26
- _globals['_CHATINPUT']._serialized_end=372
27
- _globals['_CHATINPUT_POSITION']._serialized_start=300
28
- _globals['_CHATINPUT_POSITION']._serialized_end=322
29
- _globals['_CHATINPUT_ACCEPTFILE']._serialized_start=324
30
- _globals['_CHATINPUT_ACCEPTFILE']._serialized_end=372
26
+ _globals['_CHATINPUT']._serialized_start=71
27
+ _globals['_CHATINPUT']._serialized_end=475
28
+ _globals['_CHATINPUT_POSITION']._serialized_start=386
29
+ _globals['_CHATINPUT_POSITION']._serialized_end=408
30
+ _globals['_CHATINPUT_ACCEPTFILE']._serialized_start=410
31
+ _globals['_CHATINPUT_ACCEPTFILE']._serialized_end=458
31
32
  # @@protoc_insertion_point(module_scope)
@@ -23,6 +23,7 @@ import google.protobuf.descriptor
23
23
  import google.protobuf.internal.containers
24
24
  import google.protobuf.internal.enum_type_wrapper
25
25
  import google.protobuf.message
26
+ import streamlit.proto.WidthConfig_pb2
26
27
  import sys
27
28
  import typing
28
29
 
@@ -76,6 +77,7 @@ class ChatInput(google.protobuf.message.Message):
76
77
  ACCEPT_FILE_FIELD_NUMBER: builtins.int
77
78
  FILE_TYPE_FIELD_NUMBER: builtins.int
78
79
  MAX_UPLOAD_SIZE_MB_FIELD_NUMBER: builtins.int
80
+ WIDTH_CONFIG_FIELD_NUMBER: builtins.int
79
81
  id: builtins.str
80
82
  placeholder: builtins.str
81
83
  max_chars: builtins.int
@@ -91,6 +93,10 @@ class ChatInput(google.protobuf.message.Message):
91
93
  def file_type(self) -> google.protobuf.internal.containers.RepeatedScalarFieldContainer[builtins.str]:
92
94
  """Supported file types: For example: ["png","jpg","img"]"""
93
95
 
96
+ @property
97
+ def width_config(self) -> streamlit.proto.WidthConfig_pb2.WidthConfig:
98
+ """Optional width configuration for the ChatInput"""
99
+
94
100
  def __init__(
95
101
  self,
96
102
  *,
@@ -105,7 +111,10 @@ class ChatInput(google.protobuf.message.Message):
105
111
  accept_file: global___ChatInput.AcceptFile.ValueType = ...,
106
112
  file_type: collections.abc.Iterable[builtins.str] | None = ...,
107
113
  max_upload_size_mb: builtins.int = ...,
114
+ width_config: streamlit.proto.WidthConfig_pb2.WidthConfig | None = ...,
108
115
  ) -> None: ...
109
- def ClearField(self, field_name: typing.Literal["accept_file", b"accept_file", "default", b"default", "disabled", b"disabled", "file_type", b"file_type", "id", b"id", "max_chars", b"max_chars", "max_upload_size_mb", b"max_upload_size_mb", "placeholder", b"placeholder", "position", b"position", "set_value", b"set_value", "value", b"value"]) -> None: ...
116
+ def HasField(self, field_name: typing.Literal["_width_config", b"_width_config", "width_config", b"width_config"]) -> builtins.bool: ...
117
+ def ClearField(self, field_name: typing.Literal["_width_config", b"_width_config", "accept_file", b"accept_file", "default", b"default", "disabled", b"disabled", "file_type", b"file_type", "id", b"id", "max_chars", b"max_chars", "max_upload_size_mb", b"max_upload_size_mb", "placeholder", b"placeholder", "position", b"position", "set_value", b"set_value", "value", b"value", "width_config", b"width_config"]) -> None: ...
118
+ def WhichOneof(self, oneof_group: typing.Literal["_width_config", b"_width_config"]) -> typing.Literal["width_config"] | None: ...
110
119
 
111
120
  global___ChatInput = ChatInput
@@ -14,7 +14,7 @@ _sym_db = _symbol_database.Default()
14
14
 
15
15
 
16
16
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/PageConfig.proto\"\x97\x03\n\nPageConfig\x12\r\n\x05title\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x61vicon\x18\x02 \x01(\t\x12\"\n\x06layout\x18\x03 \x01(\x0e\x32\x12.PageConfig.Layout\x12\x37\n\x15initial_sidebar_state\x18\x04 \x01(\x0e\x32\x18.PageConfig.SidebarState\x12)\n\nmenu_items\x18\x05 \x01(\x0b\x32\x15.PageConfig.MenuItems\x1a\x87\x01\n\tMenuItems\x12\x14\n\x0cget_help_url\x18\x01 \x01(\t\x12\x15\n\rhide_get_help\x18\x02 \x01(\x08\x12\x18\n\x10report_a_bug_url\x18\x03 \x01(\t\x12\x19\n\x11hide_report_a_bug\x18\x04 \x01(\x08\x12\x18\n\x10\x61\x62out_section_md\x18\x05 \x01(\t\" \n\x06Layout\x12\x0c\n\x08\x43\x45NTERED\x10\x00\x12\x08\n\x04WIDE\x10\x01\"5\n\x0cSidebarState\x12\x08\n\x04\x41UTO\x10\x00\x12\x0c\n\x08\x45XPANDED\x10\x01\x12\r\n\tCOLLAPSED\x10\x02\x42/\n\x1c\x63om.snowflake.apps.streamlitB\x0fPageConfigProtob\x06proto3')
17
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/PageConfig.proto\"\xaf\x03\n\nPageConfig\x12\r\n\x05title\x18\x01 \x01(\t\x12\x0f\n\x07\x66\x61vicon\x18\x02 \x01(\t\x12\"\n\x06layout\x18\x03 \x01(\x0e\x32\x12.PageConfig.Layout\x12\x37\n\x15initial_sidebar_state\x18\x04 \x01(\x0e\x32\x18.PageConfig.SidebarState\x12)\n\nmenu_items\x18\x05 \x01(\x0b\x32\x15.PageConfig.MenuItems\x1a\x9f\x01\n\tMenuItems\x12\x14\n\x0cget_help_url\x18\x01 \x01(\t\x12\x15\n\rhide_get_help\x18\x02 \x01(\x08\x12\x18\n\x10report_a_bug_url\x18\x03 \x01(\t\x12\x19\n\x11hide_report_a_bug\x18\x04 \x01(\x08\x12\x18\n\x10\x61\x62out_section_md\x18\x05 \x01(\t\x12\x16\n\x0e\x63lear_about_md\x18\x06 \x01(\x08\" \n\x06Layout\x12\x0c\n\x08\x43\x45NTERED\x10\x00\x12\x08\n\x04WIDE\x10\x01\"5\n\x0cSidebarState\x12\x08\n\x04\x41UTO\x10\x00\x12\x0c\n\x08\x45XPANDED\x10\x01\x12\r\n\tCOLLAPSED\x10\x02\x42/\n\x1c\x63om.snowflake.apps.streamlitB\x0fPageConfigProtob\x06proto3')
18
18
 
19
19
  _globals = globals()
20
20
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -23,11 +23,11 @@ if not _descriptor._USE_C_DESCRIPTORS:
23
23
  _globals['DESCRIPTOR']._loaded_options = None
24
24
  _globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\017PageConfigProto'
25
25
  _globals['_PAGECONFIG']._serialized_start=37
26
- _globals['_PAGECONFIG']._serialized_end=444
26
+ _globals['_PAGECONFIG']._serialized_end=468
27
27
  _globals['_PAGECONFIG_MENUITEMS']._serialized_start=220
28
- _globals['_PAGECONFIG_MENUITEMS']._serialized_end=355
29
- _globals['_PAGECONFIG_LAYOUT']._serialized_start=357
30
- _globals['_PAGECONFIG_LAYOUT']._serialized_end=389
31
- _globals['_PAGECONFIG_SIDEBARSTATE']._serialized_start=391
32
- _globals['_PAGECONFIG_SIDEBARSTATE']._serialized_end=444
28
+ _globals['_PAGECONFIG_MENUITEMS']._serialized_end=379
29
+ _globals['_PAGECONFIG_LAYOUT']._serialized_start=381
30
+ _globals['_PAGECONFIG_LAYOUT']._serialized_end=413
31
+ _globals['_PAGECONFIG_SIDEBARSTATE']._serialized_start=415
32
+ _globals['_PAGECONFIG_SIDEBARSTATE']._serialized_end=468
33
33
  # @@protoc_insertion_point(module_scope)
@@ -84,11 +84,14 @@ class PageConfig(google.protobuf.message.Message):
84
84
  REPORT_A_BUG_URL_FIELD_NUMBER: builtins.int
85
85
  HIDE_REPORT_A_BUG_FIELD_NUMBER: builtins.int
86
86
  ABOUT_SECTION_MD_FIELD_NUMBER: builtins.int
87
+ CLEAR_ABOUT_MD_FIELD_NUMBER: builtins.int
87
88
  get_help_url: builtins.str
88
89
  hide_get_help: builtins.bool
89
90
  report_a_bug_url: builtins.str
90
91
  hide_report_a_bug: builtins.bool
91
92
  about_section_md: builtins.str
93
+ clear_about_md: builtins.bool
94
+ """For multiple calls to set_page_config, clears set about markdown"""
92
95
  def __init__(
93
96
  self,
94
97
  *,
@@ -97,8 +100,9 @@ class PageConfig(google.protobuf.message.Message):
97
100
  report_a_bug_url: builtins.str = ...,
98
101
  hide_report_a_bug: builtins.bool = ...,
99
102
  about_section_md: builtins.str = ...,
103
+ clear_about_md: builtins.bool = ...,
100
104
  ) -> None: ...
101
- def ClearField(self, field_name: typing.Literal["about_section_md", b"about_section_md", "get_help_url", b"get_help_url", "hide_get_help", b"hide_get_help", "hide_report_a_bug", b"hide_report_a_bug", "report_a_bug_url", b"report_a_bug_url"]) -> None: ...
105
+ def ClearField(self, field_name: typing.Literal["about_section_md", b"about_section_md", "clear_about_md", b"clear_about_md", "get_help_url", b"get_help_url", "hide_get_help", b"hide_get_help", "hide_report_a_bug", b"hide_report_a_bug", "report_a_bug_url", b"report_a_bug_url"]) -> None: ...
102
106
 
103
107
  TITLE_FIELD_NUMBER: builtins.int
104
108
  FAVICON_FIELD_NUMBER: builtins.int
@@ -12,9 +12,10 @@ from google.protobuf.internal import builder as _builder
12
12
  _sym_db = _symbol_database.Default()
13
13
 
14
14
 
15
+ from streamlit.proto import WidthConfig_pb2 as streamlit_dot_proto_dot_WidthConfig__pb2
15
16
 
16
17
 
17
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Video.proto\"+\n\rSubtitleTrack\x12\r\n\x05label\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\"\x87\x02\n\x05Video\x12\x0b\n\x03url\x18\x06 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x05\x12\x19\n\x04type\x18\x05 \x01(\x0e\x32\x0b.Video.Type\x12!\n\tsubtitles\x18\x07 \x03(\x0b\x32\x0e.SubtitleTrack\x12\x10\n\x08\x65nd_time\x18\x08 \x01(\x05\x12\x0c\n\x04loop\x18\t \x01(\x08\x12\x10\n\x08\x61utoplay\x18\n \x01(\x08\x12\r\n\x05muted\x18\x0b \x01(\x08\x12\n\n\x02id\x18\x0c \x01(\t\"2\n\x04Type\x12\n\n\x06UNUSED\x10\x00\x12\n\n\x06NATIVE\x10\x01\x12\x12\n\x0eYOUTUBE_IFRAME\x10\x02J\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05R\x06\x66ormatR\x04\x64\x61taB*\n\x1c\x63om.snowflake.apps.streamlitB\nVideoProtob\x06proto3')
18
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1bstreamlit/proto/Video.proto\x1a!streamlit/proto/WidthConfig.proto\"+\n\rSubtitleTrack\x12\r\n\x05label\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\"\xcb\x02\n\x05Video\x12\x0b\n\x03url\x18\x06 \x01(\t\x12\x12\n\nstart_time\x18\x03 \x01(\x05\x12\x19\n\x04type\x18\x05 \x01(\x0e\x32\x0b.Video.Type\x12!\n\tsubtitles\x18\x07 \x03(\x0b\x32\x0e.SubtitleTrack\x12\x10\n\x08\x65nd_time\x18\x08 \x01(\x05\x12\x0c\n\x04loop\x18\t \x01(\x08\x12\x10\n\x08\x61utoplay\x18\n \x01(\x08\x12\r\n\x05muted\x18\x0b \x01(\x08\x12\n\n\x02id\x18\x0c \x01(\t\x12\x31\n\x0cwidth_config\x18\r \x01(\x0b\x32\x16.streamlit.WidthConfigH\x00\x88\x01\x01\"2\n\x04Type\x12\n\n\x06UNUSED\x10\x00\x12\n\n\x06NATIVE\x10\x01\x12\x12\n\x0eYOUTUBE_IFRAME\x10\x02\x42\x0f\n\r_width_configJ\x04\x08\x01\x10\x02J\x04\x08\x02\x10\x03J\x04\x08\x04\x10\x05R\x06\x66ormatR\x04\x64\x61taB*\n\x1c\x63om.snowflake.apps.streamlitB\nVideoProtob\x06proto3')
18
19
 
19
20
  _globals = globals()
20
21
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
@@ -22,10 +23,10 @@ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.Video_pb2',
22
23
  if not _descriptor._USE_C_DESCRIPTORS:
23
24
  _globals['DESCRIPTOR']._loaded_options = None
24
25
  _globals['DESCRIPTOR']._serialized_options = b'\n\034com.snowflake.apps.streamlitB\nVideoProto'
25
- _globals['_SUBTITLETRACK']._serialized_start=31
26
- _globals['_SUBTITLETRACK']._serialized_end=74
27
- _globals['_VIDEO']._serialized_start=77
28
- _globals['_VIDEO']._serialized_end=340
29
- _globals['_VIDEO_TYPE']._serialized_start=258
30
- _globals['_VIDEO_TYPE']._serialized_end=308
26
+ _globals['_SUBTITLETRACK']._serialized_start=66
27
+ _globals['_SUBTITLETRACK']._serialized_end=109
28
+ _globals['_VIDEO']._serialized_start=112
29
+ _globals['_VIDEO']._serialized_end=443
30
+ _globals['_VIDEO_TYPE']._serialized_start=344
31
+ _globals['_VIDEO_TYPE']._serialized_end=394
31
32
  # @@protoc_insertion_point(module_scope)
@@ -23,6 +23,7 @@ import google.protobuf.descriptor
23
23
  import google.protobuf.internal.containers
24
24
  import google.protobuf.internal.enum_type_wrapper
25
25
  import google.protobuf.message
26
+ import streamlit.proto.WidthConfig_pb2
26
27
  import sys
27
28
  import typing
28
29
 
@@ -82,6 +83,7 @@ class Video(google.protobuf.message.Message):
82
83
  AUTOPLAY_FIELD_NUMBER: builtins.int
83
84
  MUTED_FIELD_NUMBER: builtins.int
84
85
  ID_FIELD_NUMBER: builtins.int
86
+ WIDTH_CONFIG_FIELD_NUMBER: builtins.int
85
87
  url: builtins.str
86
88
  """A url pointing to a video file"""
87
89
  start_time: builtins.int
@@ -99,6 +101,8 @@ class Video(google.protobuf.message.Message):
99
101
  def subtitles(self) -> google.protobuf.internal.containers.RepeatedCompositeFieldContainer[global___SubtitleTrack]:
100
102
  """Repeated field for subtitle tracks"""
101
103
 
104
+ @property
105
+ def width_config(self) -> streamlit.proto.WidthConfig_pb2.WidthConfig: ...
102
106
  def __init__(
103
107
  self,
104
108
  *,
@@ -111,7 +115,10 @@ class Video(google.protobuf.message.Message):
111
115
  autoplay: builtins.bool = ...,
112
116
  muted: builtins.bool = ...,
113
117
  id: builtins.str = ...,
118
+ width_config: streamlit.proto.WidthConfig_pb2.WidthConfig | None = ...,
114
119
  ) -> None: ...
115
- def ClearField(self, field_name: typing.Literal["autoplay", b"autoplay", "end_time", b"end_time", "id", b"id", "loop", b"loop", "muted", b"muted", "start_time", b"start_time", "subtitles", b"subtitles", "type", b"type", "url", b"url"]) -> None: ...
120
+ def HasField(self, field_name: typing.Literal["_width_config", b"_width_config", "width_config", b"width_config"]) -> builtins.bool: ...
121
+ def ClearField(self, field_name: typing.Literal["_width_config", b"_width_config", "autoplay", b"autoplay", "end_time", b"end_time", "id", b"id", "loop", b"loop", "muted", b"muted", "start_time", b"start_time", "subtitles", b"subtitles", "type", b"type", "url", b"url", "width_config", b"width_config"]) -> None: ...
122
+ def WhichOneof(self, oneof_group: typing.Literal["_width_config", b"_width_config"]) -> typing.Literal["width_config"] | None: ...
116
123
 
117
124
  global___Video = Video
@@ -905,7 +905,7 @@ def _get_toolbar_mode() -> Config.ToolbarMode.ValueType:
905
905
  Config.ToolbarMode, config_value.upper()
906
906
  )
907
907
  if enum_value is None:
908
- allowed_values = ", ".join(k.lower() for k in Config.ToolbarMode.keys())
908
+ allowed_values = ", ".join(k.lower() for k in Config.ToolbarMode.keys()) # noqa: SIM118
909
909
  raise ValueError(
910
910
  f"Config {config_key!r} expects to have one of "
911
911
  f"the following values: {allowed_values}. "
@@ -136,10 +136,11 @@ If you think this is actually a Streamlit bug, please
136
136
  elif self.cache_type is CacheType.DATA:
137
137
  decorator_name = "@st.cache_data"
138
138
 
139
- if hasattr(self.hash_func, "__name__"):
140
- hash_func_name = f"`{self.hash_func.__name__}()`"
141
- else:
142
- hash_func_name = "a function"
139
+ hash_func_name = (
140
+ f"`{self.hash_func.__name__}()`"
141
+ if hasattr(self.hash_func, "__name__")
142
+ else "a function"
143
+ )
143
144
 
144
145
  return {
145
146
  "orig_exception_desc": str(orig_exc),
@@ -313,9 +314,8 @@ class _CacheFuncHasher:
313
314
  key = (tname, _key(obj))
314
315
 
315
316
  # Memoize if possible.
316
- if key[1] is not NoResult:
317
- if key in self._hashes:
318
- return self._hashes[key]
317
+ if key[1] is not NoResult and key in self._hashes:
318
+ return self._hashes[key]
319
319
 
320
320
  # Break recursive cycles.
321
321
  if obj in hash_stacks.current:
@@ -362,7 +362,7 @@ class _CacheFuncHasher:
362
362
  # deep, so we don't try to hash them at all.
363
363
  return self.to_bytes(id(obj))
364
364
 
365
- if isinstance(obj, bytes) or isinstance(obj, bytearray):
365
+ if isinstance(obj, (bytes, bytearray)):
366
366
  return obj
367
367
 
368
368
  if type_util.get_fqn_type(obj) in self._hash_funcs:
@@ -29,10 +29,11 @@ from streamlit.logger import get_logger
29
29
  _LOGGER: Final = get_logger(__name__)
30
30
 
31
31
 
32
- if env_util.IS_WINDOWS:
33
- _CONFIG_FILE_PATH = r"%userprofile%/.streamlit/config.toml"
34
- else:
35
- _CONFIG_FILE_PATH = "~/.streamlit/config.toml"
32
+ _CONFIG_FILE_PATH = (
33
+ r"%userprofile%/.streamlit/config.toml"
34
+ if env_util.IS_WINDOWS
35
+ else "~/.streamlit/config.toml"
36
+ )
36
37
 
37
38
 
38
39
  class _Activation(NamedTuple):
@@ -110,10 +110,11 @@ class MemoryMediaFileStorage(MediaFileStorage, CacheStatsProvider):
110
110
  ) -> str:
111
111
  """Add a file to the manager and return its ID."""
112
112
  file_data: bytes
113
- if isinstance(path_or_data, str):
114
- file_data = self._read_file(path_or_data)
115
- else:
116
- file_data = path_or_data
113
+ file_data = (
114
+ self._read_file(path_or_data)
115
+ if isinstance(path_or_data, str)
116
+ else path_or_data
117
+ )
117
118
 
118
119
  # Because our file_ids are stable, if we already have a file with the
119
120
  # given ID, we don't need to create a new one.
@@ -487,7 +487,7 @@ def create_page_profile_message(
487
487
  # Collect all config options that have been manually set
488
488
  config_options: set[str] = set()
489
489
  if config._config_options:
490
- for option_name in config._config_options.keys():
490
+ for option_name in config._config_options:
491
491
  if not config.is_manually_set(option_name):
492
492
  # We only care about manually defined options
493
493
  continue
@@ -139,7 +139,7 @@ def _mpa_v1(main_script_path: str) -> None:
139
139
  for page in pages
140
140
  if page.name.endswith(".py")
141
141
  and not page.name.startswith(".")
142
- and not page.name == "__init__.py"
142
+ and page.name != "__init__.py"
143
143
  ],
144
144
  key=page_sort_key,
145
145
  )
@@ -33,7 +33,6 @@ from typing_extensions import TypeAlias
33
33
  from streamlit.errors import (
34
34
  NoSessionContext,
35
35
  StreamlitAPIException,
36
- StreamlitSetPageConfigMustBeFirstCommandError,
37
36
  )
38
37
  from streamlit.logger import get_logger
39
38
  from streamlit.runtime.forward_msg_cache import (
@@ -98,7 +97,6 @@ class ScriptRunContext:
98
97
  command_tracking_deactivated: bool = False
99
98
  tracked_commands: list[Command] = field(default_factory=list)
100
99
  tracked_commands_counter: Counter[str] = field(default_factory=collections.Counter)
101
- _set_page_config_allowed: bool = True
102
100
  _has_script_started: bool = False
103
101
  widget_ids_this_run: set[str] = field(default_factory=set)
104
102
  widget_user_keys_this_run: set[str] = field(default_factory=set)
@@ -159,8 +157,6 @@ class ScriptRunContext:
159
157
  self.context_info = context_info
160
158
  self.pages_manager.set_current_page_script_hash(page_script_hash)
161
159
  self._active_script_hash = self.pages_manager.main_script_hash
162
- # Permit set_page_config when the ScriptRunContext is reused on a rerun
163
- self._set_page_config_allowed = True
164
160
  self._has_script_started = False
165
161
  self.command_tracking_deactivated: bool = False
166
162
  self.tracked_commands = []
@@ -190,17 +186,6 @@ class ScriptRunContext:
190
186
 
191
187
  def enqueue(self, msg: ForwardMsg) -> None:
192
188
  """Enqueue a ForwardMsg for this context's session."""
193
- if msg.HasField("page_config_changed") and not self._set_page_config_allowed:
194
- raise StreamlitSetPageConfigMustBeFirstCommandError()
195
-
196
- # We want to disallow set_page config if one of the following occurs:
197
- # - set_page_config was called on this message
198
- # - The script has already started and a different st call occurs (a delta)
199
- if msg.HasField("page_config_changed") or (
200
- msg.HasField("delta") and self._has_script_started
201
- ):
202
- self._set_page_config_allowed = False
203
-
204
189
  msg.metadata.active_script_hash = self.active_script_hash
205
190
 
206
191
  # We populate the hash and cacheable field for all messages.
@@ -47,9 +47,7 @@ class QueryParams(MutableMapping[str, str]):
47
47
  self._ensure_single_query_api_used()
48
48
 
49
49
  return iter(
50
- key
51
- for key in self._query_params.keys()
52
- if key not in EMBED_QUERY_PARAMS_KEYS
50
+ key for key in self._query_params if key not in EMBED_QUERY_PARAMS_KEYS
53
51
  )
54
52
 
55
53
  def __getitem__(self, key: str) -> str:
@@ -116,7 +114,7 @@ class QueryParams(MutableMapping[str, str]):
116
114
  # to ensure only one one ForwardMsg is sent.
117
115
  self._ensure_single_query_api_used()
118
116
  if hasattr(other, "keys") and hasattr(other, "__getitem__"):
119
- for key in other.keys():
117
+ for key in other.keys(): # noqa: SIM118
120
118
  self.__set_item_internal(key, other[key])
121
119
  else:
122
120
  for key, value in other:
@@ -249,7 +249,7 @@ class WStates(MutableMapping[str, Any]):
249
249
  """Return a list of serialized widget values for each widget with a value."""
250
250
  states = [
251
251
  self.get_serialized(widget_id)
252
- for widget_id in self.states.keys()
252
+ for widget_id in self.states
253
253
  if self.get_serialized(widget_id)
254
254
  ]
255
255
  states = cast("list[WidgetStateProto]", states)
@@ -429,10 +429,10 @@ class SessionState:
429
429
  for widgets that don't have user_keys defined, and which aren't
430
430
  exposed to user code).
431
431
  """
432
- old_keys = {self._get_widget_id(k) for k in self._old_state.keys()}
432
+ old_keys = {self._get_widget_id(k) for k in self._old_state}
433
433
  new_widget_keys = set(self._new_widget_state.keys())
434
434
  new_session_state_keys = {
435
- self._get_widget_id(k) for k in self._new_session_state.keys()
435
+ self._get_widget_id(k) for k in self._new_session_state
436
436
  }
437
437
  return old_keys | new_widget_keys | new_session_state_keys
438
438
 
@@ -729,19 +729,19 @@ class SessionState:
729
729
  We use pickleability as the metric for serializability, and test for
730
730
  pickleability by just trying it.
731
731
  """
732
- try:
733
- for k in self:
732
+ for k in self:
733
+ try:
734
734
  pickle.dumps(self[k])
735
- except Exception as e:
736
- err_msg = (
737
- f"Cannot serialize the value (of type `{type(self[k])}`) of '{k}' in "
738
- "st.session_state. Streamlit has been configured to use "
739
- "[pickle](https://docs.python.org/3/library/pickle.html) to "
740
- "serialize session_state values. Please convert the value to a "
741
- "pickle-serializable type. To learn more about this behavior, "
742
- "see [our docs](https://docs.streamlit.io/knowledge-base/using-streamlit/serializable-session-state)."
743
- )
744
- raise UnserializableSessionStateError(err_msg) from e
735
+ except Exception as e: # noqa: PERF203
736
+ err_msg = (
737
+ f"Cannot serialize the value (of type `{type(self[k])}`) of '{k}' in "
738
+ "st.session_state. Streamlit has been configured to use "
739
+ "[pickle](https://docs.python.org/3/library/pickle.html) to "
740
+ "serialize session_state values. Please convert the value to a "
741
+ "pickle-serializable type. To learn more about this behavior, "
742
+ "see [our docs](https://docs.streamlit.io/knowledge-base/using-streamlit/serializable-session-state)."
743
+ )
744
+ raise UnserializableSessionStateError(err_msg) from e
745
745
 
746
746
  def maybe_check_serializable(self) -> None:
747
747
  """Verify that session state can be serialized, if the relevant config
@@ -51,7 +51,7 @@
51
51
  <script>
52
52
  window.prerenderReady = false
53
53
  </script>
54
- <script type="module" crossorigin src="./static/js/index.PoIwzrI7.js"></script>
54
+ <script type="module" crossorigin src="./static/js/index.C1TEsRV0.js"></script>
55
55
  <link rel="stylesheet" crossorigin href="./static/css/index.C6rq3aMZ.css">
56
56
  </head>
57
57
  <body>
@@ -1 +1 @@
1
- import{r,E as a,_ as n}from"./index.PoIwzrI7.js";var i=r.forwardRef(function(e,t){var o={fill:"currentColor",xmlns:"http://www.w3.org/2000/svg"};return r.createElement(a,n({iconAttrs:o,iconVerticalAlign:"middle",iconViewBox:"0 0 24 24"},e,{ref:t}),r.createElement("path",{d:"M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}))});i.displayName="ErrorOutline";export{i as E};
1
+ import{r,E as a,_ as n}from"./index.C1TEsRV0.js";var i=r.forwardRef(function(e,t){var o={fill:"currentColor",xmlns:"http://www.w3.org/2000/svg"};return r.createElement(a,n({iconAttrs:o,iconVerticalAlign:"middle",iconViewBox:"0 0 24 24"},e,{ref:t}),r.createElement("path",{d:"M11 15h2v2h-2v-2zm0-8h2v6h-2V7zm.99-5C6.47 2 2 6.48 2 12s4.47 10 9.99 10C17.52 22 22 17.52 22 12S17.52 2 11.99 2zM12 20c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z"}))});i.displayName="ErrorOutline";export{i as E};
@@ -1 +1 @@
1
- import{r as e,E as n,_ as a}from"./index.PoIwzrI7.js";var o=e.forwardRef(function(t,r){var l={fill:"currentColor",xmlns:"http://www.w3.org/2000/svg"};return e.createElement(n,a({iconAttrs:l,iconVerticalAlign:"middle",iconViewBox:"0 0 24 24"},t,{ref:r}),e.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),e.createElement("path",{d:"M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z"}))});o.displayName="Delete";var i=e.forwardRef(function(t,r){var l={fill:"currentColor",xmlns:"http://www.w3.org/2000/svg"};return e.createElement(n,a({iconAttrs:l,iconVerticalAlign:"middle",iconViewBox:"0 0 24 24"},t,{ref:r}),e.createElement("rect",{width:24,height:24,fill:"none"}),e.createElement("path",{d:"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4l-1.41-1.41L13 12.17V4h-2v8.17L8.41 9.59 7 11l5 5 5-5z"}))});i.displayName="FileDownload";export{o as D,i as F};
1
+ import{r as e,E as n,_ as a}from"./index.C1TEsRV0.js";var o=e.forwardRef(function(t,r){var l={fill:"currentColor",xmlns:"http://www.w3.org/2000/svg"};return e.createElement(n,a({iconAttrs:l,iconVerticalAlign:"middle",iconViewBox:"0 0 24 24"},t,{ref:r}),e.createElement("path",{fill:"none",d:"M0 0h24v24H0V0z"}),e.createElement("path",{d:"M16 9v10H8V9h8m-1.5-6h-5l-1 1H5v2h14V4h-3.5l-1-1zM18 7H6v12c0 1.1.9 2 2 2h8c1.1 0 2-.9 2-2V7z"}))});o.displayName="Delete";var i=e.forwardRef(function(t,r){var l={fill:"currentColor",xmlns:"http://www.w3.org/2000/svg"};return e.createElement(n,a({iconAttrs:l,iconVerticalAlign:"middle",iconViewBox:"0 0 24 24"},t,{ref:r}),e.createElement("rect",{width:24,height:24,fill:"none"}),e.createElement("path",{d:"M18 15v3H6v-3H4v3c0 1.1.9 2 2 2h12c1.1 0 2-.9 2-2v-3h-2zm-1-4l-1.41-1.41L13 12.17V4h-2v8.17L8.41 9.59 7 11l5 5 5-5z"}))});i.displayName="FileDownload";export{o as D,i as F};