streamlit-nightly 1.34.1.dev20240505__py2.py3-none-any.whl → 1.34.1.dev20240507__py2.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 (65) hide show
  1. streamlit/__init__.py +1 -0
  2. streamlit/commands/logo.py +107 -0
  3. streamlit/components/v1/component_registry.py +8 -3
  4. streamlit/proto/ForwardMsg_pb2.py +10 -9
  5. streamlit/proto/ForwardMsg_pb2.pyi +9 -3
  6. streamlit/proto/Logo_pb2.py +26 -0
  7. streamlit/proto/Logo_pb2.pyi +51 -0
  8. streamlit/runtime/app_session.py +2 -6
  9. streamlit/runtime/forward_msg_queue.py +23 -3
  10. streamlit/runtime/runtime.py +0 -2
  11. streamlit/runtime/state/query_params.py +4 -2
  12. streamlit/runtime/state/query_params_proxy.py +11 -5
  13. streamlit/runtime/state/session_state_proxy.py +11 -3
  14. streamlit/runtime/websocket_session_manager.py +0 -2
  15. streamlit/static/asset-manifest.json +23 -23
  16. streamlit/static/index.html +1 -1
  17. streamlit/static/static/js/1168.7452e363.chunk.js +1 -0
  18. streamlit/static/static/js/1307.0f0cca93.chunk.js +1 -0
  19. streamlit/static/static/js/1792.8bd6ce2a.chunk.js +1 -0
  20. streamlit/static/static/js/1955.426e67ca.chunk.js +2 -0
  21. streamlit/static/static/js/2178.90362aae.chunk.js +1 -0
  22. streamlit/static/static/js/{2469.3e9c3ce9.chunk.js → 2469.09ea79bb.chunk.js} +1 -1
  23. streamlit/static/static/js/{7217.d970c074.chunk.js → 2736.4336e2b9.chunk.js} +1 -1
  24. streamlit/static/static/js/3092.21bb8f7b.chunk.js +1 -0
  25. streamlit/static/static/js/329.464ed8ec.chunk.js +2 -0
  26. streamlit/static/static/js/3513.ebc278c4.chunk.js +1 -0
  27. streamlit/static/static/js/4113.9b2db2e3.chunk.js +1 -0
  28. streamlit/static/static/js/{4477.e10e4373.chunk.js → 4477.1bd49702.chunk.js} +1 -1
  29. streamlit/static/static/js/5249.f2f4070d.chunk.js +1 -0
  30. streamlit/static/static/js/5441.5bacdeda.chunk.js +1 -0
  31. streamlit/static/static/js/6853.93dd1c4c.chunk.js +1 -0
  32. streamlit/static/static/js/{7323.2808d029.chunk.js → 7323.b74cc85b.chunk.js} +2 -2
  33. streamlit/static/static/js/7805.acc6316a.chunk.js +1 -0
  34. streamlit/static/static/js/8427.bd0a7cf3.chunk.js +1 -0
  35. streamlit/static/static/js/8477.de889fe5.chunk.js +1 -0
  36. streamlit/static/static/js/{8492.3e609489.chunk.js → 8492.0d93bd08.chunk.js} +1 -1
  37. streamlit/static/static/js/8536.f8de3d9a.chunk.js +1 -0
  38. streamlit/static/static/js/main.b84b6de2.js +2 -0
  39. {streamlit_nightly-1.34.1.dev20240505.dist-info → streamlit_nightly-1.34.1.dev20240507.dist-info}/METADATA +2 -2
  40. {streamlit_nightly-1.34.1.dev20240505.dist-info → streamlit_nightly-1.34.1.dev20240507.dist-info}/RECORD +48 -45
  41. streamlit/static/static/js/1168.fc5c673b.chunk.js +0 -1
  42. streamlit/static/static/js/1307.8ea033f1.chunk.js +0 -1
  43. streamlit/static/static/js/1792.b8efa879.chunk.js +0 -1
  44. streamlit/static/static/js/2736.914069e5.chunk.js +0 -2
  45. streamlit/static/static/js/3061.67758376.chunk.js +0 -1
  46. streamlit/static/static/js/3092.bc07c48b.chunk.js +0 -1
  47. streamlit/static/static/js/3513.e3e7300a.chunk.js +0 -1
  48. streamlit/static/static/js/4113.1e7eff4d.chunk.js +0 -1
  49. streamlit/static/static/js/4253.749d5244.chunk.js +0 -2
  50. streamlit/static/static/js/5441.71804c26.chunk.js +0 -1
  51. streamlit/static/static/js/6150.427a30f5.chunk.js +0 -1
  52. streamlit/static/static/js/6853.3cbd385e.chunk.js +0 -1
  53. streamlit/static/static/js/7805.51638fbc.chunk.js +0 -1
  54. streamlit/static/static/js/8427.65ddaf36.chunk.js +0 -1
  55. streamlit/static/static/js/8477.7419a0aa.chunk.js +0 -1
  56. streamlit/static/static/js/8536.f13dff49.chunk.js +0 -1
  57. streamlit/static/static/js/main.3b0201f6.js +0 -2
  58. /streamlit/static/static/js/{4253.749d5244.chunk.js.LICENSE.txt → 1955.426e67ca.chunk.js.LICENSE.txt} +0 -0
  59. /streamlit/static/static/js/{2736.914069e5.chunk.js.LICENSE.txt → 329.464ed8ec.chunk.js.LICENSE.txt} +0 -0
  60. /streamlit/static/static/js/{7323.2808d029.chunk.js.LICENSE.txt → 7323.b74cc85b.chunk.js.LICENSE.txt} +0 -0
  61. /streamlit/static/static/js/{main.3b0201f6.js.LICENSE.txt → main.b84b6de2.js.LICENSE.txt} +0 -0
  62. {streamlit_nightly-1.34.1.dev20240505.data → streamlit_nightly-1.34.1.dev20240507.data}/scripts/streamlit.cmd +0 -0
  63. {streamlit_nightly-1.34.1.dev20240505.dist-info → streamlit_nightly-1.34.1.dev20240507.dist-info}/WHEEL +0 -0
  64. {streamlit_nightly-1.34.1.dev20240505.dist-info → streamlit_nightly-1.34.1.dev20240507.dist-info}/entry_points.txt +0 -0
  65. {streamlit_nightly-1.34.1.dev20240505.dist-info → streamlit_nightly-1.34.1.dev20240507.dist-info}/top_level.txt +0 -0
streamlit/__init__.py CHANGED
@@ -104,6 +104,7 @@ from streamlit.commands.experimental_query_params import (
104
104
  import streamlit.column_config as _column_config
105
105
  from streamlit.echo import echo as echo
106
106
  from streamlit.runtime.legacy_caching import cache as _cache
107
+ from streamlit.commands.logo import logo as logo
107
108
  from streamlit.elements.spinner import spinner as spinner
108
109
  from streamlit.commands.page_config import set_page_config as set_page_config
109
110
  from streamlit.commands.execution_control import (
@@ -0,0 +1,107 @@
1
+ # Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
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
+ """Handle App logos"""
16
+
17
+ from __future__ import annotations
18
+
19
+ from typing import TYPE_CHECKING
20
+
21
+ from streamlit import url_util
22
+ from streamlit.elements.image import AtomicImage, WidthBehaviour, image_to_url
23
+ from streamlit.errors import StreamlitAPIException
24
+ from streamlit.proto.ForwardMsg_pb2 import ForwardMsg
25
+ from streamlit.runtime.metrics_util import gather_metrics
26
+ from streamlit.runtime.scriptrunner import get_script_run_ctx
27
+
28
+ if TYPE_CHECKING:
29
+ from PIL import Image
30
+
31
+
32
+ def _invalid_logo_text(field_name: str):
33
+ return f"The {field_name} passed to st.logo is invalid - See [documentation](https://docs.streamlit.io/library/api-reference/layout/st.logo) for more information on valid types"
34
+
35
+
36
+ @gather_metrics("logo")
37
+ def logo(
38
+ image: AtomicImage,
39
+ *, # keyword-only args:
40
+ link: str | None = None,
41
+ icon_image: AtomicImage | None = None,
42
+ ) -> None:
43
+ """
44
+ Renders logos in the main and sidebar sections of the page
45
+
46
+ Parameters
47
+ ----------
48
+ image: Anything supported by st.image or str
49
+ The app logo to be displayed in the top left corner of the sidebar of your app
50
+ (as well as the main section if icon_image param is not provided).
51
+ link : str or None
52
+ The external url to be opened when a user clicks on the logo (must start with
53
+ http:// or https://)
54
+ icon_image: numpy.ndarray, BytesIO, str, or None
55
+ The app logo to be displayed in the top left corner of the main section of your
56
+ app.
57
+
58
+ Example
59
+ -------
60
+ >>> import streamlit as st
61
+ >>>
62
+ >>> st.logo(streamlit_full, link="https://streamlit.io/gallery", icon_image=streamlit_small)
63
+ """
64
+
65
+ ctx = get_script_run_ctx()
66
+ if ctx is None:
67
+ return
68
+
69
+ fwd_msg = ForwardMsg()
70
+
71
+ try:
72
+ image_url = image_to_url(
73
+ image,
74
+ width=WidthBehaviour.AUTO,
75
+ clamp=False,
76
+ channels="RGB",
77
+ output_format="auto",
78
+ image_id="logo",
79
+ )
80
+ fwd_msg.logo.image = image_url
81
+ except Exception:
82
+ raise StreamlitAPIException(_invalid_logo_text("image"))
83
+
84
+ if link:
85
+ # Handle external links:
86
+ if url_util.is_url(link, ("http", "https")):
87
+ fwd_msg.logo.link = link
88
+ else:
89
+ raise StreamlitAPIException(
90
+ f"Invalid link: {link} - the link param supports external links only and must start with either http:// or https://."
91
+ )
92
+
93
+ if icon_image:
94
+ try:
95
+ icon_image_url = image_to_url(
96
+ icon_image,
97
+ width=WidthBehaviour.AUTO,
98
+ clamp=False,
99
+ channels="RGB",
100
+ output_format="auto",
101
+ image_id="icon-image",
102
+ )
103
+ fwd_msg.logo.icon_image = icon_image_url
104
+ except Exception:
105
+ raise StreamlitAPIException(_invalid_logo_text("icon_image"))
106
+
107
+ ctx.enqueue(fwd_msg)
@@ -21,6 +21,7 @@ from types import FrameType
21
21
  from streamlit.components.types.base_component_registry import BaseComponentRegistry
22
22
  from streamlit.components.v1.custom_component import CustomComponent
23
23
  from streamlit.runtime import get_instance
24
+ from streamlit.runtime.scriptrunner import get_script_run_ctx
24
25
 
25
26
 
26
27
  def _get_module_name(caller_frame: FrameType) -> str:
@@ -47,7 +48,9 @@ def declare_component(
47
48
  path: str | None = None,
48
49
  url: str | None = None,
49
50
  ) -> CustomComponent:
50
- """Create and register a custom component.
51
+ """Create a custom component and register it if there is a ScriptRun context.
52
+
53
+ The component is not registered when there is no ScriptRun context; this can happen when CustomComponents are executed as standalone commands, e.g. for testing.
51
54
 
52
55
  Parameters
53
56
  ----------
@@ -84,8 +87,10 @@ def declare_component(
84
87
  component = CustomComponent(
85
88
  name=component_name, path=path, url=url, module_name=module_name
86
89
  )
87
- get_instance().component_registry.register_component(component)
88
-
90
+ # the ctx can be None if a custom component script is run outside of Streamlit, e.g. via 'python ...'
91
+ ctx = get_script_run_ctx()
92
+ if ctx is not None:
93
+ get_instance().component_registry.register_component(component)
89
94
  return component
90
95
 
91
96
 
@@ -15,6 +15,7 @@ from streamlit.proto import AutoRerun_pb2 as streamlit_dot_proto_dot_AutoRerun__
15
15
  from streamlit.proto import Common_pb2 as streamlit_dot_proto_dot_Common__pb2
16
16
  from streamlit.proto import Delta_pb2 as streamlit_dot_proto_dot_Delta__pb2
17
17
  from streamlit.proto import GitInfo_pb2 as streamlit_dot_proto_dot_GitInfo__pb2
18
+ from streamlit.proto import Logo_pb2 as streamlit_dot_proto_dot_Logo__pb2
18
19
  from streamlit.proto import NewSession_pb2 as streamlit_dot_proto_dot_NewSession__pb2
19
20
  from streamlit.proto import PageConfig_pb2 as streamlit_dot_proto_dot_PageConfig__pb2
20
21
  from streamlit.proto import PageInfo_pb2 as streamlit_dot_proto_dot_PageInfo__pb2
@@ -26,7 +27,7 @@ from streamlit.proto import SessionEvent_pb2 as streamlit_dot_proto_dot_SessionE
26
27
  from streamlit.proto import SessionStatus_pb2 as streamlit_dot_proto_dot_SessionStatus__pb2
27
28
 
28
29
 
29
- DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/ForwardMsg.proto\x1a\x1fstreamlit/proto/AutoRerun.proto\x1a\x1cstreamlit/proto/Common.proto\x1a\x1bstreamlit/proto/Delta.proto\x1a\x1dstreamlit/proto/GitInfo.proto\x1a streamlit/proto/NewSession.proto\x1a streamlit/proto/PageConfig.proto\x1a\x1estreamlit/proto/PageInfo.proto\x1a!streamlit/proto/PageProfile.proto\x1a\"streamlit/proto/PageNotFound.proto\x1a\"streamlit/proto/PagesChanged.proto\x1a#streamlit/proto/ParentMessage.proto\x1a\"streamlit/proto/SessionEvent.proto\x1a#streamlit/proto/SessionStatus.proto\"\xe5\x06\n\nForwardMsg\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12%\n\x08metadata\x18\x02 \x01(\x0b\x32\x13.ForwardMsgMetadata\x12\"\n\x0bnew_session\x18\x04 \x01(\x0b\x32\x0b.NewSessionH\x00\x12\x17\n\x05\x64\x65lta\x18\x05 \x01(\x0b\x32\x06.DeltaH\x00\x12&\n\x11page_info_changed\x18\x0c \x01(\x0b\x32\t.PageInfoH\x00\x12*\n\x13page_config_changed\x18\r \x01(\x0b\x32\x0b.PageConfigH\x00\x12;\n\x0fscript_finished\x18\x06 \x01(\x0e\x32 .ForwardMsg.ScriptFinishedStatusH\x00\x12$\n\x10git_info_changed\x18\x0e \x01(\x0b\x32\x08.GitInfoH\x00\x12$\n\x0cpage_profile\x18\x12 \x01(\x0b\x32\x0c.PageProfileH\x00\x12\x30\n\x16session_status_changed\x18\t \x01(\x0b\x32\x0e.SessionStatusH\x00\x12&\n\rsession_event\x18\n \x01(\x0b\x32\r.SessionEventH\x00\x12\'\n\x0epage_not_found\x18\x0f \x01(\x0b\x32\r.PageNotFoundH\x00\x12&\n\rpages_changed\x18\x10 \x01(\x0b\x32\r.PagesChangedH\x00\x12/\n\x12\x66ile_urls_response\x18\x13 \x01(\x0b\x32\x11.FileURLsResponseH\x00\x12 \n\nauto_rerun\x18\x15 \x01(\x0b\x32\n.AutoRerunH\x00\x12(\n\x0eparent_message\x18\x14 \x01(\x0b\x32\x0e.ParentMessageH\x00\x12\x12\n\x08ref_hash\x18\x0b \x01(\tH\x00\x12\x1d\n\x15\x64\x65\x62ug_last_backmsg_id\x18\x11 \x01(\t\"\x98\x01\n\x14ScriptFinishedStatus\x12\x19\n\x15\x46INISHED_SUCCESSFULLY\x10\x00\x12\x1f\n\x1b\x46INISHED_WITH_COMPILE_ERROR\x10\x01\x12\x1c\n\x18\x46INISHED_EARLY_FOR_RERUN\x10\x02\x12&\n\"FINISHED_FRAGMENT_RUN_SUCCESSFULLY\x10\x03\x42\x06\n\x04typeJ\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"r\n\x12\x46orwardMsgMetadata\x12\x11\n\tcacheable\x18\x01 \x01(\x08\x12\x12\n\ndelta_path\x18\x02 \x03(\r\x12\x35\n\x16\x65lement_dimension_spec\x18\x03 \x01(\x0b\x32\x15.ElementDimensionSpec\"5\n\x14\x45lementDimensionSpec\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\rB/\n\x1c\x63om.snowflake.apps.streamlitB\x0f\x46orwardMsgProtob\x06proto3')
30
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/ForwardMsg.proto\x1a\x1fstreamlit/proto/AutoRerun.proto\x1a\x1cstreamlit/proto/Common.proto\x1a\x1bstreamlit/proto/Delta.proto\x1a\x1dstreamlit/proto/GitInfo.proto\x1a\x1astreamlit/proto/Logo.proto\x1a streamlit/proto/NewSession.proto\x1a streamlit/proto/PageConfig.proto\x1a\x1estreamlit/proto/PageInfo.proto\x1a!streamlit/proto/PageProfile.proto\x1a\"streamlit/proto/PageNotFound.proto\x1a\"streamlit/proto/PagesChanged.proto\x1a#streamlit/proto/ParentMessage.proto\x1a\"streamlit/proto/SessionEvent.proto\x1a#streamlit/proto/SessionStatus.proto\"\xfc\x06\n\nForwardMsg\x12\x0c\n\x04hash\x18\x01 \x01(\t\x12%\n\x08metadata\x18\x02 \x01(\x0b\x32\x13.ForwardMsgMetadata\x12\"\n\x0bnew_session\x18\x04 \x01(\x0b\x32\x0b.NewSessionH\x00\x12\x17\n\x05\x64\x65lta\x18\x05 \x01(\x0b\x32\x06.DeltaH\x00\x12&\n\x11page_info_changed\x18\x0c \x01(\x0b\x32\t.PageInfoH\x00\x12*\n\x13page_config_changed\x18\r \x01(\x0b\x32\x0b.PageConfigH\x00\x12;\n\x0fscript_finished\x18\x06 \x01(\x0e\x32 .ForwardMsg.ScriptFinishedStatusH\x00\x12$\n\x10git_info_changed\x18\x0e \x01(\x0b\x32\x08.GitInfoH\x00\x12$\n\x0cpage_profile\x18\x12 \x01(\x0b\x32\x0c.PageProfileH\x00\x12\x30\n\x16session_status_changed\x18\t \x01(\x0b\x32\x0e.SessionStatusH\x00\x12&\n\rsession_event\x18\n \x01(\x0b\x32\r.SessionEventH\x00\x12\'\n\x0epage_not_found\x18\x0f \x01(\x0b\x32\r.PageNotFoundH\x00\x12&\n\rpages_changed\x18\x10 \x01(\x0b\x32\r.PagesChangedH\x00\x12/\n\x12\x66ile_urls_response\x18\x13 \x01(\x0b\x32\x11.FileURLsResponseH\x00\x12 \n\nauto_rerun\x18\x15 \x01(\x0b\x32\n.AutoRerunH\x00\x12\x15\n\x04logo\x18\x16 \x01(\x0b\x32\x05.LogoH\x00\x12(\n\x0eparent_message\x18\x14 \x01(\x0b\x32\x0e.ParentMessageH\x00\x12\x12\n\x08ref_hash\x18\x0b \x01(\tH\x00\x12\x1d\n\x15\x64\x65\x62ug_last_backmsg_id\x18\x11 \x01(\t\"\x98\x01\n\x14ScriptFinishedStatus\x12\x19\n\x15\x46INISHED_SUCCESSFULLY\x10\x00\x12\x1f\n\x1b\x46INISHED_WITH_COMPILE_ERROR\x10\x01\x12\x1c\n\x18\x46INISHED_EARLY_FOR_RERUN\x10\x02\x12&\n\"FINISHED_FRAGMENT_RUN_SUCCESSFULLY\x10\x03\x42\x06\n\x04typeJ\x04\x08\x07\x10\x08J\x04\x08\x08\x10\t\"r\n\x12\x46orwardMsgMetadata\x12\x11\n\tcacheable\x18\x01 \x01(\x08\x12\x12\n\ndelta_path\x18\x02 \x03(\r\x12\x35\n\x16\x65lement_dimension_spec\x18\x03 \x01(\x0b\x32\x15.ElementDimensionSpec\"5\n\x14\x45lementDimensionSpec\x12\r\n\x05width\x18\x01 \x01(\r\x12\x0e\n\x06height\x18\x02 \x01(\rB/\n\x1c\x63om.snowflake.apps.streamlitB\x0f\x46orwardMsgProtob\x06proto3')
30
31
 
31
32
  _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
32
33
  _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.ForwardMsg_pb2', globals())
@@ -34,12 +35,12 @@ if _descriptor._USE_C_DESCRIPTORS == False:
34
35
 
35
36
  DESCRIPTOR._options = None
36
37
  DESCRIPTOR._serialized_options = b'\n\034com.snowflake.apps.streamlitB\017ForwardMsgProto'
37
- _FORWARDMSG._serialized_start=477
38
- _FORWARDMSG._serialized_end=1346
39
- _FORWARDMSG_SCRIPTFINISHEDSTATUS._serialized_start=1174
40
- _FORWARDMSG_SCRIPTFINISHEDSTATUS._serialized_end=1326
41
- _FORWARDMSGMETADATA._serialized_start=1348
42
- _FORWARDMSGMETADATA._serialized_end=1462
43
- _ELEMENTDIMENSIONSPEC._serialized_start=1464
44
- _ELEMENTDIMENSIONSPEC._serialized_end=1517
38
+ _FORWARDMSG._serialized_start=505
39
+ _FORWARDMSG._serialized_end=1397
40
+ _FORWARDMSG_SCRIPTFINISHEDSTATUS._serialized_start=1225
41
+ _FORWARDMSG_SCRIPTFINISHEDSTATUS._serialized_end=1377
42
+ _FORWARDMSGMETADATA._serialized_start=1399
43
+ _FORWARDMSGMETADATA._serialized_end=1513
44
+ _ELEMENTDIMENSIONSPEC._serialized_start=1515
45
+ _ELEMENTDIMENSIONSPEC._serialized_end=1568
45
46
  # @@protoc_insertion_point(module_scope)
@@ -26,6 +26,7 @@ import streamlit.proto.AutoRerun_pb2
26
26
  import streamlit.proto.Common_pb2
27
27
  import streamlit.proto.Delta_pb2
28
28
  import streamlit.proto.GitInfo_pb2
29
+ import streamlit.proto.Logo_pb2
29
30
  import streamlit.proto.NewSession_pb2
30
31
  import streamlit.proto.PageConfig_pb2
31
32
  import streamlit.proto.PageInfo_pb2
@@ -92,6 +93,7 @@ class ForwardMsg(google.protobuf.message.Message):
92
93
  PAGES_CHANGED_FIELD_NUMBER: builtins.int
93
94
  FILE_URLS_RESPONSE_FIELD_NUMBER: builtins.int
94
95
  AUTO_RERUN_FIELD_NUMBER: builtins.int
96
+ LOGO_FIELD_NUMBER: builtins.int
95
97
  PARENT_MESSAGE_FIELD_NUMBER: builtins.int
96
98
  REF_HASH_FIELD_NUMBER: builtins.int
97
99
  DEBUG_LAST_BACKMSG_ID_FIELD_NUMBER: builtins.int
@@ -131,6 +133,9 @@ class ForwardMsg(google.protobuf.message.Message):
131
133
  @property
132
134
  def auto_rerun(self) -> streamlit.proto.AutoRerun_pb2.AutoRerun: ...
133
135
  @property
136
+ def logo(self) -> streamlit.proto.Logo_pb2.Logo:
137
+ """App logo message"""
138
+ @property
134
139
  def parent_message(self) -> streamlit.proto.ParentMessage_pb2.ParentMessage:
135
140
  """Platform - message to host"""
136
141
  ref_hash: builtins.str
@@ -162,13 +167,14 @@ class ForwardMsg(google.protobuf.message.Message):
162
167
  pages_changed: streamlit.proto.PagesChanged_pb2.PagesChanged | None = ...,
163
168
  file_urls_response: streamlit.proto.Common_pb2.FileURLsResponse | None = ...,
164
169
  auto_rerun: streamlit.proto.AutoRerun_pb2.AutoRerun | None = ...,
170
+ logo: streamlit.proto.Logo_pb2.Logo | None = ...,
165
171
  parent_message: streamlit.proto.ParentMessage_pb2.ParentMessage | None = ...,
166
172
  ref_hash: builtins.str = ...,
167
173
  debug_last_backmsg_id: builtins.str = ...,
168
174
  ) -> None: ...
169
- def HasField(self, field_name: typing_extensions.Literal["auto_rerun", b"auto_rerun", "delta", b"delta", "file_urls_response", b"file_urls_response", "git_info_changed", b"git_info_changed", "metadata", b"metadata", "new_session", b"new_session", "page_config_changed", b"page_config_changed", "page_info_changed", b"page_info_changed", "page_not_found", b"page_not_found", "page_profile", b"page_profile", "pages_changed", b"pages_changed", "parent_message", b"parent_message", "ref_hash", b"ref_hash", "script_finished", b"script_finished", "session_event", b"session_event", "session_status_changed", b"session_status_changed", "type", b"type"]) -> builtins.bool: ...
170
- def ClearField(self, field_name: typing_extensions.Literal["auto_rerun", b"auto_rerun", "debug_last_backmsg_id", b"debug_last_backmsg_id", "delta", b"delta", "file_urls_response", b"file_urls_response", "git_info_changed", b"git_info_changed", "hash", b"hash", "metadata", b"metadata", "new_session", b"new_session", "page_config_changed", b"page_config_changed", "page_info_changed", b"page_info_changed", "page_not_found", b"page_not_found", "page_profile", b"page_profile", "pages_changed", b"pages_changed", "parent_message", b"parent_message", "ref_hash", b"ref_hash", "script_finished", b"script_finished", "session_event", b"session_event", "session_status_changed", b"session_status_changed", "type", b"type"]) -> None: ...
171
- def WhichOneof(self, oneof_group: typing_extensions.Literal["type", b"type"]) -> typing_extensions.Literal["new_session", "delta", "page_info_changed", "page_config_changed", "script_finished", "git_info_changed", "page_profile", "session_status_changed", "session_event", "page_not_found", "pages_changed", "file_urls_response", "auto_rerun", "parent_message", "ref_hash"] | None: ...
175
+ def HasField(self, field_name: typing_extensions.Literal["auto_rerun", b"auto_rerun", "delta", b"delta", "file_urls_response", b"file_urls_response", "git_info_changed", b"git_info_changed", "logo", b"logo", "metadata", b"metadata", "new_session", b"new_session", "page_config_changed", b"page_config_changed", "page_info_changed", b"page_info_changed", "page_not_found", b"page_not_found", "page_profile", b"page_profile", "pages_changed", b"pages_changed", "parent_message", b"parent_message", "ref_hash", b"ref_hash", "script_finished", b"script_finished", "session_event", b"session_event", "session_status_changed", b"session_status_changed", "type", b"type"]) -> builtins.bool: ...
176
+ def ClearField(self, field_name: typing_extensions.Literal["auto_rerun", b"auto_rerun", "debug_last_backmsg_id", b"debug_last_backmsg_id", "delta", b"delta", "file_urls_response", b"file_urls_response", "git_info_changed", b"git_info_changed", "hash", b"hash", "logo", b"logo", "metadata", b"metadata", "new_session", b"new_session", "page_config_changed", b"page_config_changed", "page_info_changed", b"page_info_changed", "page_not_found", b"page_not_found", "page_profile", b"page_profile", "pages_changed", b"pages_changed", "parent_message", b"parent_message", "ref_hash", b"ref_hash", "script_finished", b"script_finished", "session_event", b"session_event", "session_status_changed", b"session_status_changed", "type", b"type"]) -> None: ...
177
+ def WhichOneof(self, oneof_group: typing_extensions.Literal["type", b"type"]) -> typing_extensions.Literal["new_session", "delta", "page_info_changed", "page_config_changed", "script_finished", "git_info_changed", "page_profile", "session_status_changed", "session_event", "page_not_found", "pages_changed", "file_urls_response", "auto_rerun", "logo", "parent_message", "ref_hash"] | None: ...
172
178
 
173
179
  global___ForwardMsg = ForwardMsg
174
180
 
@@ -0,0 +1,26 @@
1
+ # -*- coding: utf-8 -*-
2
+ # Generated by the protocol buffer compiler. DO NOT EDIT!
3
+ # source: streamlit/proto/Logo.proto
4
+ """Generated protocol buffer code."""
5
+ from google.protobuf.internal import builder as _builder
6
+ from google.protobuf import descriptor as _descriptor
7
+ from google.protobuf import descriptor_pool as _descriptor_pool
8
+ from google.protobuf import symbol_database as _symbol_database
9
+ # @@protoc_insertion_point(imports)
10
+
11
+ _sym_db = _symbol_database.Default()
12
+
13
+
14
+
15
+
16
+ DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x1astreamlit/proto/Logo.proto\"7\n\x04Logo\x12\r\n\x05image\x18\x01 \x01(\t\x12\x0c\n\x04link\x18\x02 \x01(\t\x12\x12\n\nicon_image\x18\x03 \x01(\tB)\n\x1c\x63om.snowflake.apps.streamlitB\tLogoProtob\x06proto3')
17
+
18
+ _builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals())
19
+ _builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'streamlit.proto.Logo_pb2', globals())
20
+ if _descriptor._USE_C_DESCRIPTORS == False:
21
+
22
+ DESCRIPTOR._options = None
23
+ DESCRIPTOR._serialized_options = b'\n\034com.snowflake.apps.streamlitB\tLogoProto'
24
+ _LOGO._serialized_start=30
25
+ _LOGO._serialized_end=85
26
+ # @@protoc_insertion_point(module_scope)
@@ -0,0 +1,51 @@
1
+ """
2
+ @generated by mypy-protobuf. Do not edit manually!
3
+ isort:skip_file
4
+ *!
5
+ Copyright (c) Streamlit Inc. (2018-2022) Snowflake Inc. (2022-2024)
6
+
7
+ Licensed under the Apache License, Version 2.0 (the "License");
8
+ you may not use this file except in compliance with the License.
9
+ You may obtain a copy of the License at
10
+
11
+ http://www.apache.org/licenses/LICENSE-2.0
12
+
13
+ Unless required by applicable law or agreed to in writing, software
14
+ distributed under the License is distributed on an "AS IS" BASIS,
15
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ See the License for the specific language governing permissions and
17
+ limitations under the License.
18
+ """
19
+ import builtins
20
+ import google.protobuf.descriptor
21
+ import google.protobuf.message
22
+ import sys
23
+
24
+ if sys.version_info >= (3, 8):
25
+ import typing as typing_extensions
26
+ else:
27
+ import typing_extensions
28
+
29
+ DESCRIPTOR: google.protobuf.descriptor.FileDescriptor
30
+
31
+ class Logo(google.protobuf.message.Message):
32
+ """Handle the logo for an app"""
33
+
34
+ DESCRIPTOR: google.protobuf.descriptor.Descriptor
35
+
36
+ IMAGE_FIELD_NUMBER: builtins.int
37
+ LINK_FIELD_NUMBER: builtins.int
38
+ ICON_IMAGE_FIELD_NUMBER: builtins.int
39
+ image: builtins.str
40
+ link: builtins.str
41
+ icon_image: builtins.str
42
+ def __init__(
43
+ self,
44
+ *,
45
+ image: builtins.str = ...,
46
+ link: builtins.str = ...,
47
+ icon_image: builtins.str = ...,
48
+ ) -> None: ...
49
+ def ClearField(self, field_name: typing_extensions.Literal["icon_image", b"icon_image", "image", b"image", "link", b"link"]) -> None: ...
50
+
51
+ global___Logo = Logo
@@ -83,7 +83,6 @@ class AppSession:
83
83
  uploaded_file_manager: UploadedFileManager,
84
84
  script_cache: ScriptCache,
85
85
  message_enqueued_callback: Callable[[], None] | None,
86
- local_sources_watcher: LocalSourcesWatcher,
87
86
  user_info: dict[str, str | None],
88
87
  session_id_override: str | None = None,
89
88
  ) -> None:
@@ -105,9 +104,6 @@ class AppSession:
105
104
  message_enqueued_callback
106
105
  After enqueuing a message, this callable notification will be invoked.
107
106
 
108
- local_sources_watcher
109
- The file watcher that lets the session know local files have changed.
110
-
111
107
  user_info
112
108
  A dict that contains information about the current user. For now,
113
109
  it only contains the user's email address.
@@ -144,7 +140,7 @@ class AppSession:
144
140
  # due to the source code changing we need to pass in the previous client state.
145
141
  self._client_state = ClientState()
146
142
 
147
- self._local_sources_watcher: LocalSourcesWatcher | None = local_sources_watcher
143
+ self._local_sources_watcher: LocalSourcesWatcher | None = None
148
144
  self._stop_config_listener: Callable[[], bool] | None = None
149
145
  self._stop_pages_listener: Callable[[], None] | None = None
150
146
 
@@ -465,7 +461,7 @@ class AppSession:
465
461
  self._local_sources_watcher.update_watched_pages()
466
462
 
467
463
  def _clear_queue(self) -> None:
468
- self._browser_queue.clear()
464
+ self._browser_queue.clear(retain_lifecycle_msgs=True)
469
465
 
470
466
  def _on_scriptrunner_event(
471
467
  self,
@@ -79,9 +79,29 @@ class ForwardMsgQueue:
79
79
  self._delta_index_map[delta_key] = len(self._queue)
80
80
  self._queue.append(msg)
81
81
 
82
- def clear(self) -> None:
83
- """Clear the queue."""
84
- self._queue = []
82
+ def clear(self, retain_lifecycle_msgs: bool = False) -> None:
83
+ """Clear the queue, potentially retaining lifecycle messages.
84
+
85
+ The retain_lifecycle_msgs argument exists because in some cases (in particular
86
+ when a currently running script is interrupted by a new BackMsg), we don't want
87
+ to remove certain messages from the queue as doing so may cause the client to
88
+ not hear about important script lifecycle events (such as the script being
89
+ stopped early in order to be rerun).
90
+ """
91
+ if not retain_lifecycle_msgs:
92
+ self._queue = []
93
+ else:
94
+ self._queue = [
95
+ msg
96
+ for msg in self._queue
97
+ if msg.WhichOneof("type")
98
+ in {
99
+ "script_finished",
100
+ "session_status_changed",
101
+ "parent_message",
102
+ }
103
+ ]
104
+
85
105
  self._delta_index_map = dict()
86
106
 
87
107
  def flush(self) -> list[ForwardMsg]:
@@ -61,7 +61,6 @@ from streamlit.runtime.state import (
61
61
  from streamlit.runtime.stats import StatsManager
62
62
  from streamlit.runtime.uploaded_file_manager import UploadedFileManager
63
63
  from streamlit.runtime.websocket_session_manager import WebsocketSessionManager
64
- from streamlit.watcher import LocalSourcesWatcher
65
64
 
66
65
  if TYPE_CHECKING:
67
66
  from streamlit.runtime.caching.storage import CacheStorageManager
@@ -563,7 +562,6 @@ class Runtime:
563
562
  uploaded_file_manager=self._uploaded_file_mgr,
564
563
  script_cache=self._script_cache,
565
564
  message_enqueued_callback=self._enqueued_some_message,
566
- local_sources_watcher=LocalSourcesWatcher(self._main_script_path),
567
565
  user_info={"email": "test@test.com"},
568
566
  )
569
567
 
@@ -98,7 +98,8 @@ class QueryParams(MutableMapping[str, str]):
98
98
 
99
99
  def update(
100
100
  self,
101
- other: Iterable[tuple[str, str]] | SupportsKeysAndGetItem[str, str] = (),
101
+ other: Iterable[tuple[str, str | Iterable[str]]]
102
+ | SupportsKeysAndGetItem[str, str | Iterable[str]] = (),
102
103
  /,
103
104
  **kwds: str,
104
105
  ):
@@ -164,7 +165,8 @@ class QueryParams(MutableMapping[str, str]):
164
165
 
165
166
  def from_dict(
166
167
  self,
167
- _dict: Iterable[tuple[str, str]] | SupportsKeysAndGetItem[str, str],
168
+ _dict: Iterable[tuple[str, str | Iterable[str]]]
169
+ | SupportsKeysAndGetItem[str, str | Iterable[str]],
168
170
  ):
169
171
  self._ensure_single_query_api_used()
170
172
  old_value = self._query_params.copy()
@@ -72,17 +72,19 @@ class QueryParamsProxy(MutableMapping[str, str]):
72
72
  raise AttributeError(missing_key_error_message(key))
73
73
 
74
74
  @overload
75
- def update(self, mapping: SupportsKeysAndGetItem[str, str], /, **kwds: str) -> None:
75
+ def update(
76
+ self, mapping: SupportsKeysAndGetItem[str, str | Iterable[str]], /, **kwds: str
77
+ ) -> None:
76
78
  ...
77
79
 
78
80
  @overload
79
81
  def update(
80
- self, keys_and_values: Iterable[tuple[str, str]], /, **kwds: str
82
+ self, keys_and_values: Iterable[tuple[str, str | Iterable[str]]], /, **kwds: str
81
83
  ) -> None:
82
84
  ...
83
85
 
84
86
  @overload
85
- def update(self, **kwds: str) -> None:
87
+ def update(self, **kwds: str | Iterable[str]) -> None:
86
88
  ...
87
89
 
88
90
  def update(self, other=(), /, **kwds):
@@ -163,11 +165,15 @@ class QueryParamsProxy(MutableMapping[str, str]):
163
165
  return qp.to_dict()
164
166
 
165
167
  @overload
166
- def from_dict(self, keys_and_values: Iterable[tuple[str, str]]) -> None:
168
+ def from_dict(
169
+ self, keys_and_values: Iterable[tuple[str, str | Iterable[str]]]
170
+ ) -> None:
167
171
  ...
168
172
 
169
173
  @overload
170
- def from_dict(self, mapping: SupportsKeysAndGetItem[str, str]) -> None:
174
+ def from_dict(
175
+ self, mapping: SupportsKeysAndGetItem[str, str | Iterable[str]]
176
+ ) -> None:
171
177
  ...
172
178
 
173
179
  @gather_metrics("query_params.from_dict")
@@ -28,6 +28,8 @@ _LOGGER: Final = _logger.get_logger(__name__)
28
28
 
29
29
 
30
30
  _state_use_warning_already_displayed: bool = False
31
+ # The mock session state is used as a fallback if the script is run without `streamlit run`
32
+ _mock_session_state: SafeSessionState | None = None
31
33
 
32
34
 
33
35
  def get_session_state() -> SafeSessionState:
@@ -42,8 +44,8 @@ def get_session_state() -> SafeSessionState:
42
44
 
43
45
  ctx = get_script_run_ctx()
44
46
 
45
- # If there is no script run context because the script is run bare, have
46
- # session state act as an always empty dictionary, and print a warning.
47
+ # If there is no script run context because the script is run bare, we
48
+ # use a global mock session state version to allow bare script execution (via python script.py)
47
49
  if ctx is None:
48
50
  if not _state_use_warning_already_displayed:
49
51
  _state_use_warning_already_displayed = True
@@ -51,7 +53,13 @@ def get_session_state() -> SafeSessionState:
51
53
  _LOGGER.warning(
52
54
  "Session state does not function when running a script without `streamlit run`"
53
55
  )
54
- return SafeSessionState(SessionState(), lambda: None)
56
+
57
+ global _mock_session_state
58
+
59
+ if _mock_session_state is None:
60
+ # Lazy initialize the mock session state
61
+ _mock_session_state = SafeSessionState(SessionState(), lambda: None)
62
+ return _mock_session_state
55
63
  return ctx.session_state
56
64
 
57
65
 
@@ -28,7 +28,6 @@ from streamlit.runtime.session_manager import (
28
28
  SessionStorage,
29
29
  )
30
30
  from streamlit.runtime.uploaded_file_manager import UploadedFileManager
31
- from streamlit.watcher import LocalSourcesWatcher
32
31
 
33
32
  _LOGGER: Final = get_logger(__name__)
34
33
 
@@ -100,7 +99,6 @@ class WebsocketSessionManager(SessionManager):
100
99
  uploaded_file_manager=self._uploaded_file_mgr,
101
100
  script_cache=self._script_cache,
102
101
  message_enqueued_callback=self._message_enqueued_callback,
103
- local_sources_watcher=LocalSourcesWatcher(script_data.main_script_path),
104
102
  user_info=user_info,
105
103
  session_id_override=session_id_override,
106
104
  )
@@ -1,37 +1,37 @@
1
1
  {
2
2
  "files": {
3
3
  "main.css": "./static/css/main.3aaaea00.css",
4
- "main.js": "./static/js/main.3b0201f6.js",
4
+ "main.js": "./static/js/main.b84b6de2.js",
5
5
  "static/js/9336.2d95d840.chunk.js": "./static/js/9336.2d95d840.chunk.js",
6
6
  "static/js/9330.2b4c99e0.chunk.js": "./static/js/9330.2b4c99e0.chunk.js",
7
- "static/js/7217.d970c074.chunk.js": "./static/js/7217.d970c074.chunk.js",
7
+ "static/js/2736.4336e2b9.chunk.js": "./static/js/2736.4336e2b9.chunk.js",
8
8
  "static/js/3301.1d1b10bb.chunk.js": "./static/js/3301.1d1b10bb.chunk.js",
9
9
  "static/css/3092.95a45cfe.chunk.css": "./static/css/3092.95a45cfe.chunk.css",
10
- "static/js/3092.bc07c48b.chunk.js": "./static/js/3092.bc07c48b.chunk.js",
10
+ "static/js/3092.21bb8f7b.chunk.js": "./static/js/3092.21bb8f7b.chunk.js",
11
11
  "static/css/5441.e3b876c5.chunk.css": "./static/css/5441.e3b876c5.chunk.css",
12
- "static/js/5441.71804c26.chunk.js": "./static/js/5441.71804c26.chunk.js",
13
- "static/js/8427.65ddaf36.chunk.js": "./static/js/8427.65ddaf36.chunk.js",
14
- "static/js/7323.2808d029.chunk.js": "./static/js/7323.2808d029.chunk.js",
15
- "static/js/8536.f13dff49.chunk.js": "./static/js/8536.f13dff49.chunk.js",
16
- "static/js/7805.51638fbc.chunk.js": "./static/js/7805.51638fbc.chunk.js",
12
+ "static/js/5441.5bacdeda.chunk.js": "./static/js/5441.5bacdeda.chunk.js",
13
+ "static/js/8427.bd0a7cf3.chunk.js": "./static/js/8427.bd0a7cf3.chunk.js",
14
+ "static/js/7323.b74cc85b.chunk.js": "./static/js/7323.b74cc85b.chunk.js",
15
+ "static/js/8536.f8de3d9a.chunk.js": "./static/js/8536.f8de3d9a.chunk.js",
16
+ "static/js/7805.acc6316a.chunk.js": "./static/js/7805.acc6316a.chunk.js",
17
17
  "static/js/4500.b6f348d1.chunk.js": "./static/js/4500.b6f348d1.chunk.js",
18
- "static/js/1307.8ea033f1.chunk.js": "./static/js/1307.8ea033f1.chunk.js",
19
- "static/js/2469.3e9c3ce9.chunk.js": "./static/js/2469.3e9c3ce9.chunk.js",
20
- "static/js/4113.1e7eff4d.chunk.js": "./static/js/4113.1e7eff4d.chunk.js",
21
- "static/js/1168.fc5c673b.chunk.js": "./static/js/1168.fc5c673b.chunk.js",
18
+ "static/js/1307.0f0cca93.chunk.js": "./static/js/1307.0f0cca93.chunk.js",
19
+ "static/js/2469.09ea79bb.chunk.js": "./static/js/2469.09ea79bb.chunk.js",
20
+ "static/js/4113.9b2db2e3.chunk.js": "./static/js/4113.9b2db2e3.chunk.js",
21
+ "static/js/1168.7452e363.chunk.js": "./static/js/1168.7452e363.chunk.js",
22
22
  "static/js/178.7bea8c5d.chunk.js": "./static/js/178.7bea8c5d.chunk.js",
23
- "static/js/1792.b8efa879.chunk.js": "./static/js/1792.b8efa879.chunk.js",
24
- "static/js/3513.e3e7300a.chunk.js": "./static/js/3513.e3e7300a.chunk.js",
23
+ "static/js/1792.8bd6ce2a.chunk.js": "./static/js/1792.8bd6ce2a.chunk.js",
24
+ "static/js/3513.ebc278c4.chunk.js": "./static/js/3513.ebc278c4.chunk.js",
25
25
  "static/js/7602.e8abc06b.chunk.js": "./static/js/7602.e8abc06b.chunk.js",
26
26
  "static/js/6013.64cd6d28.chunk.js": "./static/js/6013.64cd6d28.chunk.js",
27
- "static/js/8492.3e609489.chunk.js": "./static/js/8492.3e609489.chunk.js",
27
+ "static/js/8492.0d93bd08.chunk.js": "./static/js/8492.0d93bd08.chunk.js",
28
28
  "static/js/4177.69f9f18d.chunk.js": "./static/js/4177.69f9f18d.chunk.js",
29
29
  "static/js/1451.3b0a3e31.chunk.js": "./static/js/1451.3b0a3e31.chunk.js",
30
30
  "static/js/2634.1249dc7a.chunk.js": "./static/js/2634.1249dc7a.chunk.js",
31
31
  "static/js/1074.73973756.chunk.js": "./static/js/1074.73973756.chunk.js",
32
- "static/js/8477.7419a0aa.chunk.js": "./static/js/8477.7419a0aa.chunk.js",
33
- "static/js/6853.3cbd385e.chunk.js": "./static/js/6853.3cbd385e.chunk.js",
34
- "static/js/4477.e10e4373.chunk.js": "./static/js/4477.e10e4373.chunk.js",
32
+ "static/js/8477.de889fe5.chunk.js": "./static/js/8477.de889fe5.chunk.js",
33
+ "static/js/6853.93dd1c4c.chunk.js": "./static/js/6853.93dd1c4c.chunk.js",
34
+ "static/js/4477.1bd49702.chunk.js": "./static/js/4477.1bd49702.chunk.js",
35
35
  "static/js/4319.bf1c86bf.chunk.js": "./static/js/4319.bf1c86bf.chunk.js",
36
36
  "static/js/5106.44f0ff51.chunk.js": "./static/js/5106.44f0ff51.chunk.js",
37
37
  "static/js/4666.c4b22a63.chunk.js": "./static/js/4666.c4b22a63.chunk.js",
@@ -50,18 +50,18 @@
50
50
  "static/js/9656.8c935274.chunk.js": "./static/js/9656.8c935274.chunk.js",
51
51
  "static/js/8570.6de19120.chunk.js": "./static/js/8570.6de19120.chunk.js",
52
52
  "static/js/7142.83028745.chunk.js": "./static/js/7142.83028745.chunk.js",
53
- "static/js/3061.67758376.chunk.js": "./static/js/3061.67758376.chunk.js",
53
+ "static/js/2178.90362aae.chunk.js": "./static/js/2178.90362aae.chunk.js",
54
54
  "static/css/3466.8b8f33d6.chunk.css": "./static/css/3466.8b8f33d6.chunk.css",
55
55
  "static/js/3466.05d62820.chunk.js": "./static/js/3466.05d62820.chunk.js",
56
56
  "static/js/7483.64f23be7.chunk.js": "./static/js/7483.64f23be7.chunk.js",
57
- "static/js/6150.427a30f5.chunk.js": "./static/js/6150.427a30f5.chunk.js",
58
- "static/js/4253.749d5244.chunk.js": "./static/js/4253.749d5244.chunk.js",
57
+ "static/js/5249.f2f4070d.chunk.js": "./static/js/5249.f2f4070d.chunk.js",
58
+ "static/js/1955.426e67ca.chunk.js": "./static/js/1955.426e67ca.chunk.js",
59
59
  "static/js/5791.9a42fb4b.chunk.js": "./static/js/5791.9a42fb4b.chunk.js",
60
60
  "static/js/5117.04bfe5d3.chunk.js": "./static/js/5117.04bfe5d3.chunk.js",
61
61
  "static/js/2187.9469f035.chunk.js": "./static/js/2187.9469f035.chunk.js",
62
62
  "static/js/1479.6709db03.chunk.js": "./static/js/1479.6709db03.chunk.js",
63
+ "static/js/329.464ed8ec.chunk.js": "./static/js/329.464ed8ec.chunk.js",
63
64
  "static/js/4132.49bf3f2c.chunk.js": "./static/js/4132.49bf3f2c.chunk.js",
64
- "static/js/2736.914069e5.chunk.js": "./static/js/2736.914069e5.chunk.js",
65
65
  "static/js/937.a1248039.chunk.js": "./static/js/937.a1248039.chunk.js",
66
66
  "static/media/MaterialSymbols-Outlined.woff2": "./static/media/MaterialSymbols-Outlined.909d2dce4aba724ad02f.woff2",
67
67
  "static/media/fireworks.gif": "./static/media/fireworks.0906f02ea43f1018a6d2.gif",
@@ -153,6 +153,6 @@
153
153
  },
154
154
  "entrypoints": [
155
155
  "static/css/main.3aaaea00.css",
156
- "static/js/main.3b0201f6.js"
156
+ "static/js/main.b84b6de2.js"
157
157
  ]
158
158
  }
@@ -1 +1 @@
1
- <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><link rel="shortcut icon" href="./favicon.png"/><link rel="preload" href="./static/media/SourceSansPro-Regular.0d69e5ff5e92ac64a0c9.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-SemiBold.abed79cd0df1827e18cf.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-Bold.118dea98980e20a81ced.woff2" as="font" type="font/woff2" crossorigin><title>Streamlit</title><script>window.prerenderReady=!1</script><script defer="defer" src="./static/js/main.3b0201f6.js"></script><link href="./static/css/main.3aaaea00.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1
+ <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><link rel="shortcut icon" href="./favicon.png"/><link rel="preload" href="./static/media/SourceSansPro-Regular.0d69e5ff5e92ac64a0c9.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-SemiBold.abed79cd0df1827e18cf.woff2" as="font" type="font/woff2" crossorigin><link rel="preload" href="./static/media/SourceSansPro-Bold.118dea98980e20a81ced.woff2" as="font" type="font/woff2" crossorigin><title>Streamlit</title><script>window.prerenderReady=!1</script><script defer="defer" src="./static/js/main.b84b6de2.js"></script><link href="./static/css/main.3aaaea00.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>