streamlit-nightly 1.46.1.dev20250623__py3-none-any.whl → 1.46.1.dev20250625__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/components/types/base_custom_component.py +2 -4
- streamlit/components/v1/component_registry.py +15 -2
- streamlit/config.py +27 -0
- streamlit/elements/arrow.py +5 -5
- streamlit/elements/code.py +6 -4
- streamlit/elements/metric.py +20 -2
- streamlit/elements/widgets/multiselect.py +27 -1
- streamlit/proto/NewSession_pb2.py +16 -16
- streamlit/proto/NewSession_pb2.pyi +7 -2
- streamlit/static/index.html +1 -1
- streamlit/static/manifest.json +214 -214
- streamlit/static/static/js/{ErrorOutline.esm.6jfnPRv8.js → ErrorOutline.esm.Ca4_C74G.js} +1 -1
- streamlit/static/static/js/{FileDownload.esm.Cnl6nXhQ.js → FileDownload.esm.BEXpx-NN.js} +1 -1
- streamlit/static/static/js/{FileHelper.cSMax3oI.js → FileHelper.B4GGzKqK.js} +1 -1
- streamlit/static/static/js/{FormClearHelper.4d5unoV3.js → FormClearHelper.CpsBciie.js} +1 -1
- streamlit/static/static/js/{Hooks.DZueJ4q3.js → Hooks.DsIXUDOP.js} +1 -1
- streamlit/static/static/js/{InputInstructions.TPKmOf1e.js → InputInstructions.Dh8ccyYH.js} +1 -1
- streamlit/static/static/js/{ProgressBar.9KpGrB3q.js → ProgressBar.C57HogTe.js} +2 -2
- streamlit/static/static/js/{RenderInPortalIfExists.B6RP7YdE.js → RenderInPortalIfExists.JT5A_75h.js} +1 -1
- streamlit/static/static/js/{Toolbar.D6JzrqIQ.js → Toolbar.BZBwHk6r.js} +1 -1
- streamlit/static/static/js/{base-input.Bnn6NZuq.js → base-input.C3m059Ja.js} +4 -4
- streamlit/static/static/js/{checkbox.B02sfadZ.js → checkbox.Bz1HY8hS.js} +1 -1
- streamlit/static/static/js/{createSuper.SaBC7ngU.js → createSuper.BgXZoFPR.js} +1 -1
- streamlit/static/static/js/{data-grid-overlay-editor.BLEevpKv.js → data-grid-overlay-editor.DHAXzOWr.js} +1 -1
- streamlit/static/static/js/{downloader.D-PXYVMM.js → downloader.DXmvN319.js} +1 -1
- streamlit/static/static/js/{es6.Do8H78Dr.js → es6.Dg-Jfu-r.js} +2 -2
- streamlit/static/static/js/{iframeResizer.contentWindow.DaJOnu7q.js → iframeResizer.contentWindow.BqWlTWPM.js} +1 -1
- streamlit/static/static/js/{index.0fF-8FTP.js → index.04JkG8Km.js} +1 -1
- streamlit/static/static/js/{index.DLIUt_5s.js → index.1o7GFmH9.js} +1 -1
- streamlit/static/static/js/{index.C_sZeM1t.js → index.B-IWkE_m.js} +1 -1
- streamlit/static/static/js/{index.Ur6r0Scb.js → index.B5HCKYGs.js} +2 -2
- streamlit/static/static/js/{index.GQSrzYvF.js → index.BEHais2d.js} +70 -71
- streamlit/static/static/js/{index.Bd-qicCf.js → index.BSduVAl-.js} +1 -1
- streamlit/static/static/js/{index.DdZFxK5_.js → index.BUpHFScA.js} +1 -1
- streamlit/static/static/js/index.B_GGKi7h.js +1 -0
- streamlit/static/static/js/{index.CakTEdtN.js → index.BgcFXG8Y.js} +1 -1
- streamlit/static/static/js/{index.CEKUbLdO.js → index.BgoLThsY.js} +1 -1
- streamlit/static/static/js/{index.DC2Olf5i.js → index.Bpq_TVP8.js} +1 -1
- streamlit/static/static/js/{index.B24flF1W.js → index.BqfEAvp0.js} +1 -1
- streamlit/static/static/js/{index.BzMniOtq.js → index.C-C4puTW.js} +1 -1
- streamlit/static/static/js/{index.pvWqfcnM.js → index.C6WBb5UI.js} +1 -1
- streamlit/static/static/js/{index.CI88kTQV.js → index.C8kJiudO.js} +1 -1
- streamlit/static/static/js/{index.BtrfeCpV.js → index.C9-NSIWy.js} +1 -1
- streamlit/static/static/js/{index.CvLo0WJS.js → index.CF7xf0Kc.js} +60 -60
- streamlit/static/static/js/{index.BCrknDkt.js → index.CIgyykei.js} +2 -2
- streamlit/static/static/js/{index.DSL_L5gy.js → index.CL0g79ua.js} +1 -1
- streamlit/static/static/js/{index.CPO9FnfH.js → index.CLutgZmA.js} +1 -1
- streamlit/static/static/js/{index.agUYkS1G.js → index.CWNrL7gF.js} +1 -1
- streamlit/static/static/js/{index.CWjjjpBo.js → index.Cob2CEOY.js} +2 -2
- streamlit/static/static/js/{index.CTa7TVdK.js → index.CuNbzfuD.js} +1 -1
- streamlit/static/static/js/{index.DAjyn_pv.js → index.CxdFkXN7.js} +1 -1
- streamlit/static/static/js/{index.DwRhVQCG.js → index.D6NDAr7R.js} +1 -1
- streamlit/static/static/js/{index.G-xNC_zR.js → index.D8Opklrn.js} +1 -1
- streamlit/static/static/js/{index.DFoPqIqm.js → index.DPwE86ME.js} +2 -2
- streamlit/static/static/js/index.DSVau5_M.js +1 -0
- streamlit/static/static/js/{index.CJ3PXy05.js → index.D_AaeKaM.js} +1 -1
- streamlit/static/static/js/{index.CRVtayit.js → index.De84gVwH.js} +1 -1
- streamlit/static/static/js/{index.Dii3Kpb1.js → index.DkawoLEN.js} +1 -1
- streamlit/static/static/js/index.DyESyaCa.js +1 -0
- streamlit/static/static/js/index.PYYOff5g.js +1 -0
- streamlit/static/static/js/{index.HuXynmwU.js → index.Q4yOipZt.js} +2 -2
- streamlit/static/static/js/{index.AoD39gIA.js → index.lctgkaZQ.js} +1 -1
- streamlit/static/static/js/index.tO_5FrTQ.js +1 -0
- streamlit/static/static/js/{index.DAD1VX9u.js → index.wwMXYz4o.js} +1 -1
- streamlit/static/static/js/{input.BsbIu3V-.js → input.G0_SQaLD.js} +2 -2
- streamlit/static/static/js/{memory.DLgZAYR-.js → memory.B6tpNh1r.js} +1 -1
- streamlit/static/static/js/{mergeWith.dTGwC2vZ.js → mergeWith.BIMOGvX0.js} +1 -1
- streamlit/static/static/js/{number-overlay-editor.1fvDrqrD.js → number-overlay-editor.BGVzFv7I.js} +1 -1
- streamlit/static/static/js/{possibleConstructorReturn.Dk_wv59O.js → possibleConstructorReturn.Bk9dXD1L.js} +1 -1
- streamlit/static/static/js/{sandbox.Cg6lG2Sf.js → sandbox.DWWQ1lBu.js} +1 -1
- streamlit/static/static/js/{textarea.DBC27xex.js → textarea.FHoad42C.js} +2 -2
- streamlit/static/static/js/{timepicker.7h0iYUgW.js → timepicker.yc5xqDUF.js} +1 -1
- streamlit/static/static/js/{toConsumableArray.B_hGxMM4.js → toConsumableArray.DfbSd22b.js} +1 -1
- streamlit/static/static/js/{uniqueId.OfTwqNZo.js → uniqueId.C03hvAF0.js} +1 -1
- streamlit/static/static/js/{useBasicWidgetState.BwLEUZab.js → useBasicWidgetState.DxtD7xs-.js} +1 -1
- streamlit/static/static/js/{useOnInputChange.dALPpkgr.js → useOnInputChange.DqPkFylT.js} +1 -1
- streamlit/static/static/js/{withFullScreenWrapper.CYjEH_RX.js → withFullScreenWrapper.CAwHwFP9.js} +1 -1
- streamlit/web/server/server.py +5 -6
- {streamlit_nightly-1.46.1.dev20250623.dist-info → streamlit_nightly-1.46.1.dev20250625.dist-info}/METADATA +1 -1
- {streamlit_nightly-1.46.1.dev20250623.dist-info → streamlit_nightly-1.46.1.dev20250625.dist-info}/RECORD +84 -84
- streamlit/static/static/js/index.-Vk-JZRg.js +0 -1
- streamlit/static/static/js/index.CtwU5Nda.js +0 -1
- streamlit/static/static/js/index.DIWyCwyy.js +0 -1
- streamlit/static/static/js/index.DRY0GdE8.js +0 -1
- streamlit/static/static/js/index.jvvQMO9i.js +0 -1
- {streamlit_nightly-1.46.1.dev20250623.data → streamlit_nightly-1.46.1.dev20250625.data}/scripts/streamlit.cmd +0 -0
- {streamlit_nightly-1.46.1.dev20250623.dist-info → streamlit_nightly-1.46.1.dev20250625.dist-info}/WHEEL +0 -0
- {streamlit_nightly-1.46.1.dev20250623.dist-info → streamlit_nightly-1.46.1.dev20250625.dist-info}/entry_points.txt +0 -0
- {streamlit_nightly-1.46.1.dev20250623.dist-info → streamlit_nightly-1.46.1.dev20250625.dist-info}/top_level.txt +0 -0
@@ -41,10 +41,8 @@ class BaseCustomComponent(ABC):
|
|
41
41
|
url: str | None = None,
|
42
42
|
module_name: str | None = None,
|
43
43
|
) -> None:
|
44
|
-
if
|
45
|
-
raise StreamlitAPIException(
|
46
|
-
"Either 'path' or 'url' must be set, but not both."
|
47
|
-
)
|
44
|
+
if path is None and url is None:
|
45
|
+
raise StreamlitAPIException("Either 'path' or 'url' must be set.")
|
48
46
|
|
49
47
|
self._name = name
|
50
48
|
self._path = path
|
@@ -19,6 +19,7 @@ import os
|
|
19
19
|
from pathlib import Path
|
20
20
|
from typing import TYPE_CHECKING
|
21
21
|
|
22
|
+
from streamlit import config
|
22
23
|
from streamlit.components.v1.custom_component import CustomComponent
|
23
24
|
from streamlit.runtime import get_instance
|
24
25
|
from streamlit.runtime.scriptrunner_utils.script_run_context import get_script_run_ctx
|
@@ -77,12 +78,15 @@ def declare_component(
|
|
77
78
|
The path to serve the component's frontend files from. The path should
|
78
79
|
be absolute. If ``path`` is ``None`` (default), Streamlit will serve
|
79
80
|
the component from the location in ``url``. Either ``path`` or ``url``
|
80
|
-
must be specified,
|
81
|
+
must be specified. If both are specified, then ``url`` will take
|
82
|
+
precedence.
|
81
83
|
|
82
84
|
url: str or None
|
83
85
|
The URL that the component is served from. If ``url`` is ``None``
|
84
86
|
(default), Streamlit will serve the component from the location in
|
85
|
-
``path``. Either ``path`` or ``url`` must be specified
|
87
|
+
``path``. Either ``path`` or ``url`` must be specified. If both are
|
88
|
+
specified, then ``url`` will take precedence.
|
89
|
+
|
86
90
|
|
87
91
|
Returns
|
88
92
|
-------
|
@@ -109,6 +113,15 @@ def declare_component(
|
|
109
113
|
# Build the component name.
|
110
114
|
component_name = f"{module_name}.{name}"
|
111
115
|
|
116
|
+
# NOTE: We intentionally don't mention this behavior in this function's
|
117
|
+
# docstring as we're only using it internally for now (the config option
|
118
|
+
# is also hidden). This should be properly documented if/when we do decide
|
119
|
+
# to expose it more publicly.
|
120
|
+
if not url and (
|
121
|
+
component_base_path := config.get_option("server.customComponentBaseUrlPath")
|
122
|
+
):
|
123
|
+
url = f"{component_base_path}/{component_name}/"
|
124
|
+
|
112
125
|
# Create our component object, and register it.
|
113
126
|
component = CustomComponent(
|
114
127
|
name=component_name, path=path, url=url, module_name=module_name
|
streamlit/config.py
CHANGED
@@ -825,6 +825,19 @@ _create_option(
|
|
825
825
|
type_=str,
|
826
826
|
)
|
827
827
|
|
828
|
+
_create_option(
|
829
|
+
"server.customComponentBaseUrlPath",
|
830
|
+
description="""
|
831
|
+
The base path for the URL where Streamlit should serve custom
|
832
|
+
components. If this config var is set and a call to ``declare_component``
|
833
|
+
does not specify a URL, the component's URL will be set to
|
834
|
+
``f"{server.customComponentBaseUrlPath}/{component_name}/"``.
|
835
|
+
""",
|
836
|
+
default_val="",
|
837
|
+
type_=str,
|
838
|
+
visibility="hidden",
|
839
|
+
)
|
840
|
+
|
828
841
|
# TODO: Rename to server.enableCorsProtection.
|
829
842
|
_create_option(
|
830
843
|
"server.enableCORS",
|
@@ -1210,6 +1223,20 @@ _create_theme_options(
|
|
1210
1223
|
""",
|
1211
1224
|
)
|
1212
1225
|
|
1226
|
+
_create_theme_options(
|
1227
|
+
"codeFontWeight",
|
1228
|
+
categories=["theme"],
|
1229
|
+
description="""
|
1230
|
+
The font weight for code blocks and code text.
|
1231
|
+
|
1232
|
+
This applies to inline code, code blocks (ex: `st.code`), and font in `st.json` and `st.help`.
|
1233
|
+
Valid values are 100-900, in increments of 100.
|
1234
|
+
|
1235
|
+
When unset, the default code font weight will be 400.
|
1236
|
+
""",
|
1237
|
+
type_=int,
|
1238
|
+
)
|
1239
|
+
|
1213
1240
|
_create_theme_options(
|
1214
1241
|
"headingFont",
|
1215
1242
|
categories=["theme", CustomThemeCategories.SIDEBAR],
|
streamlit/elements/arrow.py
CHANGED
@@ -305,11 +305,11 @@ class ArrowMixin:
|
|
305
305
|
|
306
306
|
If ``data`` is a ``pandas.Styler``, it will be used to style its
|
307
307
|
underlying ``pandas.DataFrame``. Streamlit supports custom cell
|
308
|
-
values and
|
309
|
-
styling options, like bar charts, hovering, and
|
310
|
-
these styling options, use column configuration
|
311
|
-
number formatting from ``column_config`` always
|
312
|
-
over text and number formatting from ``pandas.Styler``.
|
308
|
+
values, colors, and font weights. It does not support some of the
|
309
|
+
more exotic styling options, like bar charts, hovering, and
|
310
|
+
captions. For these styling options, use column configuration
|
311
|
+
instead. Text and number formatting from ``column_config`` always
|
312
|
+
takes precedence over text and number formatting from ``pandas.Styler``.
|
313
313
|
|
314
314
|
Collection-like objects include all Python-native ``Collection``
|
315
315
|
types, such as ``dict``, ``list``, and ``set``.
|
streamlit/elements/code.py
CHANGED
@@ -20,7 +20,7 @@ from typing import TYPE_CHECKING, cast
|
|
20
20
|
from streamlit.elements.lib.layout_utils import (
|
21
21
|
Height,
|
22
22
|
LayoutConfig,
|
23
|
-
|
23
|
+
Width,
|
24
24
|
validate_height,
|
25
25
|
validate_width,
|
26
26
|
)
|
@@ -42,7 +42,7 @@ class CodeMixin:
|
|
42
42
|
line_numbers: bool = False,
|
43
43
|
wrap_lines: bool = False,
|
44
44
|
height: Height | None = "content",
|
45
|
-
width:
|
45
|
+
width: Width = "stretch",
|
46
46
|
) -> DeltaGenerator:
|
47
47
|
"""Display a code block with optional syntax highlighting.
|
48
48
|
|
@@ -85,11 +85,13 @@ class CodeMixin:
|
|
85
85
|
the screen on mobile devices, which makes it hard to scroll the
|
86
86
|
rest of the app.
|
87
87
|
|
88
|
-
width : "stretch" or int
|
88
|
+
width : "stretch", "content", or int
|
89
89
|
The width of the code block element. This can be one of the following:
|
90
90
|
|
91
91
|
- ``"stretch"`` (default): The width of the element matches the
|
92
92
|
width of the parent container.
|
93
|
+
- ``"content"``: The width of the element matches the width of its
|
94
|
+
content, but doesn't exceed the width of the parent container.
|
93
95
|
- An integer specifying the width in pixels: The element has a
|
94
96
|
fixed width. If the specified width is greater than the width of
|
95
97
|
the parent container, the width of the element matches the width
|
@@ -137,7 +139,7 @@ class CodeMixin:
|
|
137
139
|
height = "content"
|
138
140
|
else:
|
139
141
|
validate_height(height, allow_content=True)
|
140
|
-
validate_width(width)
|
142
|
+
validate_width(width, allow_content=True)
|
141
143
|
layout_config = LayoutConfig(height=height, width=width)
|
142
144
|
|
143
145
|
return self.dg._enqueue("code", code_proto, layout_config=layout_config)
|
streamlit/elements/metric.py
CHANGED
@@ -20,7 +20,13 @@ from typing import TYPE_CHECKING, Any, Literal, Union, cast
|
|
20
20
|
|
21
21
|
from typing_extensions import TypeAlias
|
22
22
|
|
23
|
-
from streamlit.elements.lib.layout_utils import
|
23
|
+
from streamlit.elements.lib.layout_utils import (
|
24
|
+
Height,
|
25
|
+
LayoutConfig,
|
26
|
+
Width,
|
27
|
+
validate_height,
|
28
|
+
validate_width,
|
29
|
+
)
|
24
30
|
from streamlit.elements.lib.policies import maybe_raise_label_warnings
|
25
31
|
from streamlit.elements.lib.utils import (
|
26
32
|
LabelVisibility,
|
@@ -60,6 +66,7 @@ class MetricMixin:
|
|
60
66
|
label_visibility: LabelVisibility = "visible",
|
61
67
|
border: bool = False,
|
62
68
|
width: Width = "stretch",
|
69
|
+
height: Height = "content",
|
63
70
|
) -> DeltaGenerator:
|
64
71
|
r"""Display a metric in big bold font, with an optional indicator of how the metric changed.
|
65
72
|
|
@@ -124,6 +131,16 @@ class MetricMixin:
|
|
124
131
|
``False`` (default), no border is shown. If this is ``True``, a
|
125
132
|
border is shown.
|
126
133
|
|
134
|
+
height : "content", "stretch", or int
|
135
|
+
The height of the metric element. This can be one of the following:
|
136
|
+
|
137
|
+
- ``"content"`` (default): The height of the element matches the
|
138
|
+
height of its content, but doesn't exceed the height of the
|
139
|
+
parent container.
|
140
|
+
- ``"stretch"``: The height of the element matches the height of the
|
141
|
+
parent container.
|
142
|
+
- An integer specifying the height in pixels.
|
143
|
+
|
127
144
|
width : "stretch", "content", or int
|
128
145
|
The width of the metric element. This can be one of the following:
|
129
146
|
|
@@ -218,8 +235,9 @@ class MetricMixin:
|
|
218
235
|
label_visibility
|
219
236
|
)
|
220
237
|
|
238
|
+
validate_height(height, allow_content=True)
|
221
239
|
validate_width(width, allow_content=True)
|
222
|
-
layout_config = LayoutConfig(width=width)
|
240
|
+
layout_config = LayoutConfig(width=width, height=height)
|
223
241
|
|
224
242
|
return self.dg._enqueue("metric", metric_proto, layout_config=layout_config)
|
225
243
|
|
@@ -20,6 +20,11 @@ from typing import TYPE_CHECKING, Any, Callable, Generic, Literal, cast, overloa
|
|
20
20
|
|
21
21
|
from streamlit.dataframe_util import OptionSequence, convert_anything_to_list
|
22
22
|
from streamlit.elements.lib.form_utils import current_form_id
|
23
|
+
from streamlit.elements.lib.layout_utils import (
|
24
|
+
LayoutConfig,
|
25
|
+
WidthWithoutContent,
|
26
|
+
validate_width,
|
27
|
+
)
|
23
28
|
from streamlit.elements.lib.options_selector_utils import (
|
24
29
|
convert_to_sequence_and_check_comparable,
|
25
30
|
create_mappings,
|
@@ -170,6 +175,7 @@ class MultiSelectMixin:
|
|
170
175
|
disabled: bool = False,
|
171
176
|
label_visibility: LabelVisibility = "visible",
|
172
177
|
accept_new_options: Literal[False] = False,
|
178
|
+
width: WidthWithoutContent = "stretch",
|
173
179
|
) -> list[T]: ...
|
174
180
|
|
175
181
|
@overload
|
@@ -190,6 +196,7 @@ class MultiSelectMixin:
|
|
190
196
|
disabled: bool = False,
|
191
197
|
label_visibility: LabelVisibility = "visible",
|
192
198
|
accept_new_options: Literal[True] = True,
|
199
|
+
width: WidthWithoutContent = "stretch",
|
193
200
|
) -> list[T | str]: ...
|
194
201
|
|
195
202
|
@overload
|
@@ -210,6 +217,7 @@ class MultiSelectMixin:
|
|
210
217
|
disabled: bool = False,
|
211
218
|
label_visibility: LabelVisibility = "visible",
|
212
219
|
accept_new_options: bool = False,
|
220
|
+
width: WidthWithoutContent = "stretch",
|
213
221
|
) -> list[T] | list[T | str]: ...
|
214
222
|
|
215
223
|
@gather_metrics("multiselect")
|
@@ -230,6 +238,7 @@ class MultiSelectMixin:
|
|
230
238
|
disabled: bool = False,
|
231
239
|
label_visibility: LabelVisibility = "visible",
|
232
240
|
accept_new_options: Literal[False, True] | bool = False,
|
241
|
+
width: WidthWithoutContent = "stretch",
|
233
242
|
) -> list[T] | list[T | str]:
|
234
243
|
r"""Display a multiselect widget.
|
235
244
|
The multiselect widget starts as empty.
|
@@ -332,6 +341,17 @@ class MultiSelectMixin:
|
|
332
341
|
can't be added if a case-insensitive match is already selected. The
|
333
342
|
``max_selections`` argument is still enforced.
|
334
343
|
|
344
|
+
width : "stretch" or int
|
345
|
+
The width of the multiselect widget. This can be one of the
|
346
|
+
following:
|
347
|
+
|
348
|
+
- ``"stretch"`` (default): The width of the widget matches the
|
349
|
+
width of the parent container.
|
350
|
+
- An integer specifying the width in pixels: The widget has a
|
351
|
+
fixed width. If the specified width is greater than the width of
|
352
|
+
the parent container, the width of the widget matches the width
|
353
|
+
of the parent container.
|
354
|
+
|
335
355
|
Returns
|
336
356
|
-------
|
337
357
|
list
|
@@ -397,6 +417,7 @@ class MultiSelectMixin:
|
|
397
417
|
disabled=disabled,
|
398
418
|
label_visibility=label_visibility,
|
399
419
|
accept_new_options=accept_new_options,
|
420
|
+
width=width,
|
400
421
|
ctx=ctx,
|
401
422
|
)
|
402
423
|
|
@@ -417,6 +438,7 @@ class MultiSelectMixin:
|
|
417
438
|
disabled: bool = False,
|
418
439
|
label_visibility: LabelVisibility = "visible",
|
419
440
|
accept_new_options: bool = False,
|
441
|
+
width: WidthWithoutContent = "stretch",
|
420
442
|
ctx: ScriptRunContext | None = None,
|
421
443
|
) -> list[T] | list[T | str]:
|
422
444
|
key = to_key(key)
|
@@ -457,6 +479,7 @@ class MultiSelectMixin:
|
|
457
479
|
max_selections=max_selections,
|
458
480
|
placeholder=placeholder,
|
459
481
|
accept_new_options=accept_new_options,
|
482
|
+
width=width,
|
460
483
|
)
|
461
484
|
|
462
485
|
proto = MultiSelectProto()
|
@@ -503,10 +526,13 @@ class MultiSelectMixin:
|
|
503
526
|
proto.raw_values[:] = serde.serialize(widget_state.value)
|
504
527
|
proto.set_value = True
|
505
528
|
|
529
|
+
validate_width(width)
|
530
|
+
layout_config = LayoutConfig(width=width)
|
531
|
+
|
506
532
|
if ctx:
|
507
533
|
save_for_app_testing(ctx, element_id, format_func)
|
508
534
|
|
509
|
-
self.dg._enqueue(widget_name, proto)
|
535
|
+
self.dg._enqueue(widget_name, proto, layout_config=layout_config)
|
510
536
|
|
511
537
|
return widget_state.value
|
512
538
|
|
@@ -16,7 +16,7 @@ from streamlit.proto import AppPage_pb2 as streamlit_dot_proto_dot_AppPage__pb2
|
|
16
16
|
from streamlit.proto import SessionStatus_pb2 as streamlit_dot_proto_dot_SessionStatus__pb2
|
17
17
|
|
18
18
|
|
19
|
-
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/NewSession.proto\x1a\x1dstreamlit/proto/AppPage.proto\x1a#streamlit/proto/SessionStatus.proto\"\xa5\x02\n\nNewSession\x12\x1f\n\ninitialize\x18\x01 \x01(\x0b\x32\x0b.Initialize\x12\x15\n\rscript_run_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x18\n\x10main_script_path\x18\x04 \x01(\t\x12\x17\n\x06\x63onfig\x18\x06 \x01(\x0b\x32\x07.Config\x12(\n\x0c\x63ustom_theme\x18\x07 \x01(\x0b\x32\x12.CustomThemeConfig\x12\x1b\n\tapp_pages\x18\x08 \x03(\x0b\x32\x08.AppPage\x12\x18\n\x10page_script_hash\x18\t \x01(\t\x12\x1d\n\x15\x66ragment_ids_this_run\x18\n \x03(\t\x12\x18\n\x10main_script_hash\x18\x0b \x01(\tJ\x04\x08\x05\x10\x06\"\xba\x01\n\nInitialize\x12\x1c\n\tuser_info\x18\x01 \x01(\x0b\x32\t.UserInfo\x12*\n\x10\x65nvironment_info\x18\x03 \x01(\x0b\x32\x10.EnvironmentInfo\x12&\n\x0esession_status\x18\x04 \x01(\x0b\x32\x0e.SessionStatus\x12\x14\n\x0c\x63ommand_line\x18\x05 \x01(\t\x12\x12\n\nsession_id\x18\x06 \x01(\t\x12\x10\n\x08is_hello\x18\x07 \x01(\x08\"\x97\x02\n\x06\x43onfig\x12\x1a\n\x12gather_usage_stats\x18\x02 \x01(\x08\x12\x1e\n\x16max_cached_message_age\x18\x03 \x01(\x05\x12\x14\n\x0cmapbox_token\x18\x04 \x01(\t\x12\x19\n\x11\x61llow_run_on_save\x18\x05 \x01(\x08\x12\x14\n\x0chide_top_bar\x18\x06 \x01(\x08\x12\x18\n\x10hide_sidebar_nav\x18\x07 \x01(\x08\x12)\n\x0ctoolbar_mode\x18\x08 \x01(\x0e\x32\x13.Config.ToolbarMode\"?\n\x0bToolbarMode\x12\x08\n\x04\x41UTO\x10\x00\x12\r\n\tDEVELOPER\x10\x01\x12\n\n\x06VIEWER\x10\x02\x12\x0b\n\x07MINIMAL\x10\x03J\x04\x08\x01\x10\x02\"\
|
19
|
+
DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n streamlit/proto/NewSession.proto\x1a\x1dstreamlit/proto/AppPage.proto\x1a#streamlit/proto/SessionStatus.proto\"\xa5\x02\n\nNewSession\x12\x1f\n\ninitialize\x18\x01 \x01(\x0b\x32\x0b.Initialize\x12\x15\n\rscript_run_id\x18\x02 \x01(\t\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x18\n\x10main_script_path\x18\x04 \x01(\t\x12\x17\n\x06\x63onfig\x18\x06 \x01(\x0b\x32\x07.Config\x12(\n\x0c\x63ustom_theme\x18\x07 \x01(\x0b\x32\x12.CustomThemeConfig\x12\x1b\n\tapp_pages\x18\x08 \x03(\x0b\x32\x08.AppPage\x12\x18\n\x10page_script_hash\x18\t \x01(\t\x12\x1d\n\x15\x66ragment_ids_this_run\x18\n \x03(\t\x12\x18\n\x10main_script_hash\x18\x0b \x01(\tJ\x04\x08\x05\x10\x06\"\xba\x01\n\nInitialize\x12\x1c\n\tuser_info\x18\x01 \x01(\x0b\x32\t.UserInfo\x12*\n\x10\x65nvironment_info\x18\x03 \x01(\x0b\x32\x10.EnvironmentInfo\x12&\n\x0esession_status\x18\x04 \x01(\x0b\x32\x0e.SessionStatus\x12\x14\n\x0c\x63ommand_line\x18\x05 \x01(\t\x12\x12\n\nsession_id\x18\x06 \x01(\t\x12\x10\n\x08is_hello\x18\x07 \x01(\x08\"\x97\x02\n\x06\x43onfig\x12\x1a\n\x12gather_usage_stats\x18\x02 \x01(\x08\x12\x1e\n\x16max_cached_message_age\x18\x03 \x01(\x05\x12\x14\n\x0cmapbox_token\x18\x04 \x01(\t\x12\x19\n\x11\x61llow_run_on_save\x18\x05 \x01(\x08\x12\x14\n\x0chide_top_bar\x18\x06 \x01(\x08\x12\x18\n\x10hide_sidebar_nav\x18\x07 \x01(\x08\x12)\n\x0ctoolbar_mode\x18\x08 \x01(\x0e\x32\x13.Config.ToolbarMode\"?\n\x0bToolbarMode\x12\x08\n\x04\x41UTO\x10\x00\x12\r\n\tDEVELOPER\x10\x01\x12\n\n\x06VIEWER\x10\x02\x12\x0b\n\x07MINIMAL\x10\x03J\x04\x08\x01\x10\x02\"\xc2\n\n\x11\x43ustomThemeConfig\x12\x15\n\rprimary_color\x18\x01 \x01(\t\x12\"\n\x1asecondary_background_color\x18\x02 \x01(\t\x12\x18\n\x10\x62\x61\x63kground_color\x18\x03 \x01(\t\x12\x12\n\ntext_color\x18\x04 \x01(\t\x12+\n\x04\x66ont\x18\x05 \x01(\x0e\x32\x1d.CustomThemeConfig.FontFamily\x12*\n\x04\x62\x61se\x18\x06 \x01(\x0e\x32\x1c.CustomThemeConfig.BaseTheme\x12\x1f\n\x17widget_background_color\x18\x07 \x01(\t\x12\x1b\n\x13widget_border_color\x18\x08 \x01(\t\x12\x15\n\x05radii\x18\t \x01(\x0b\x32\x06.Radii\x12\x14\n\x0cheading_font\x18\x0c \x01(\t\x12\x11\n\tbody_font\x18\r \x01(\t\x12\x11\n\tcode_font\x18\x0e \x01(\t\x12\x1d\n\nfont_faces\x18\x0f \x03(\x0b\x32\t.FontFace\x12\x1e\n\nfont_sizes\x18\x10 \x01(\x0b\x32\n.FontSizes\x12!\n\x19skeleton_background_color\x18\x11 \x01(\t\x12\x18\n\x0b\x62\x61se_radius\x18\x12 \x01(\tH\x00\x88\x01\x01\x12\x1a\n\rbutton_radius\x18\x1a \x01(\tH\x01\x88\x01\x01\x12\x19\n\x0c\x62order_color\x18\x13 \x01(\tH\x02\x88\x01\x01\x12#\n\x16\x64\x61taframe_border_color\x18\x1b \x01(\tH\x03\x88\x01\x01\x12\x1f\n\x12show_widget_border\x18\x14 \x01(\x08H\x04\x88\x01\x01\x12\x17\n\nlink_color\x18\x15 \x01(\tH\x05\x88\x01\x01\x12\x1b\n\x0elink_underline\x18\x1d \x01(\x08H\x06\x88\x01\x01\x12\x1b\n\x0e\x62\x61se_font_size\x18\x16 \x01(\x05H\x07\x88\x01\x01\x12\x1d\n\x10\x62\x61se_font_weight\x18\x1e \x01(\x05H\x08\x88\x01\x01\x12\x1d\n\x10\x63ode_font_weight\x18 \x01(\x05H\t\x88\x01\x01\x12\x1b\n\x0e\x63ode_font_size\x18\x1c \x01(\tH\n\x88\x01\x01\x12 \n\x13show_sidebar_border\x18\x17 \x01(\x08H\x0b\x88\x01\x01\x12(\n\x07sidebar\x18\x18 \x01(\x0b\x32\x12.CustomThemeConfigH\x0c\x88\x01\x01\x12\"\n\x15\x63ode_background_color\x18\x19 \x01(\tH\r\x88\x01\x01\x12.\n!dataframe_header_background_color\x18\x1f \x01(\tH\x0e\x88\x01\x01\" \n\tBaseTheme\x12\t\n\x05LIGHT\x10\x00\x12\x08\n\x04\x44\x41RK\x10\x01\"6\n\nFontFamily\x12\x0e\n\nSANS_SERIF\x10\x00\x12\t\n\x05SERIF\x10\x01\x12\r\n\tMONOSPACE\x10\x02\x42\x0e\n\x0c_base_radiusB\x10\n\x0e_button_radiusB\x0f\n\r_border_colorB\x19\n\x17_dataframe_border_colorB\x15\n\x13_show_widget_borderB\r\n\x0b_link_colorB\x11\n\x0f_link_underlineB\x11\n\x0f_base_font_sizeB\x13\n\x11_base_font_weightB\x13\n\x11_code_font_weightB\x11\n\x0f_code_font_sizeB\x16\n\x14_show_sidebar_borderB\n\n\x08_sidebarB\x18\n\x16_code_background_colorB$\n\"_dataframe_header_background_color\"w\n\x08\x46ontFace\x12\x0b\n\x03url\x18\x01 \x01(\t\x12\x0e\n\x06\x66\x61mily\x18\x02 \x01(\t\x12\x12\n\x06weight\x18\x03 \x01(\x05\x42\x02\x18\x01\x12\x14\n\x0cweight_range\x18\x05 \x01(\t\x12\r\n\x05style\x18\x04 \x01(\t\x12\x15\n\runicode_range\x18\x06 \x01(\t\"<\n\x05Radii\x12\x1a\n\x12\x62\x61se_widget_radius\x18\x01 \x01(\x05\x12\x17\n\x0f\x63heckbox_radius\x18\x02 \x01(\x05\"T\n\tFontSizes\x12\x16\n\x0etiny_font_size\x18\x01 \x01(\x05\x12\x17\n\x0fsmall_font_size\x18\x02 \x01(\x05\x12\x16\n\x0e\x62\x61se_font_size\x18\x03 \x01(\x05\"a\n\x08UserInfo\x12\x17\n\x0finstallation_id\x18\x01 \x01(\t\x12\x1a\n\x12installation_id_v3\x18\x05 \x01(\t\x12\x1a\n\x12installation_id_v4\x18\x06 \x01(\tJ\x04\x08\x02\x10\x03\"l\n\x0f\x45nvironmentInfo\x12\x19\n\x11streamlit_version\x18\x01 \x01(\t\x12\x16\n\x0epython_version\x18\x02 \x01(\t\x12\x11\n\tserver_os\x18\x03 \x01(\t\x12\x13\n\x0bhas_display\x18\x04 \x01(\x08\x42/\n\x1c\x63om.snowflake.apps.streamlitB\x0fNewSessionProtob\x06proto3')
|
20
20
|
|
21
21
|
_globals = globals()
|
22
22
|
_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, _globals)
|
@@ -35,19 +35,19 @@ if not _descriptor._USE_C_DESCRIPTORS:
|
|
35
35
|
_globals['_CONFIG_TOOLBARMODE']._serialized_start=800
|
36
36
|
_globals['_CONFIG_TOOLBARMODE']._serialized_end=863
|
37
37
|
_globals['_CUSTOMTHEMECONFIG']._serialized_start=872
|
38
|
-
_globals['_CUSTOMTHEMECONFIG']._serialized_end=
|
39
|
-
_globals['_CUSTOMTHEMECONFIG_BASETHEME']._serialized_start=
|
40
|
-
_globals['_CUSTOMTHEMECONFIG_BASETHEME']._serialized_end=
|
41
|
-
_globals['_CUSTOMTHEMECONFIG_FONTFAMILY']._serialized_start=
|
42
|
-
_globals['_CUSTOMTHEMECONFIG_FONTFAMILY']._serialized_end=
|
43
|
-
_globals['_FONTFACE']._serialized_start=
|
44
|
-
_globals['_FONTFACE']._serialized_end=
|
45
|
-
_globals['_RADII']._serialized_start=
|
46
|
-
_globals['_RADII']._serialized_end=
|
47
|
-
_globals['_FONTSIZES']._serialized_start=
|
48
|
-
_globals['_FONTSIZES']._serialized_end=
|
49
|
-
_globals['_USERINFO']._serialized_start=
|
50
|
-
_globals['_USERINFO']._serialized_end=
|
51
|
-
_globals['_ENVIRONMENTINFO']._serialized_start=
|
52
|
-
_globals['_ENVIRONMENTINFO']._serialized_end=
|
38
|
+
_globals['_CUSTOMTHEMECONFIG']._serialized_end=2218
|
39
|
+
_globals['_CUSTOMTHEMECONFIG_BASETHEME']._serialized_start=1815
|
40
|
+
_globals['_CUSTOMTHEMECONFIG_BASETHEME']._serialized_end=1847
|
41
|
+
_globals['_CUSTOMTHEMECONFIG_FONTFAMILY']._serialized_start=1849
|
42
|
+
_globals['_CUSTOMTHEMECONFIG_FONTFAMILY']._serialized_end=1903
|
43
|
+
_globals['_FONTFACE']._serialized_start=2220
|
44
|
+
_globals['_FONTFACE']._serialized_end=2339
|
45
|
+
_globals['_RADII']._serialized_start=2341
|
46
|
+
_globals['_RADII']._serialized_end=2401
|
47
|
+
_globals['_FONTSIZES']._serialized_start=2403
|
48
|
+
_globals['_FONTSIZES']._serialized_end=2487
|
49
|
+
_globals['_USERINFO']._serialized_start=2489
|
50
|
+
_globals['_USERINFO']._serialized_end=2586
|
51
|
+
_globals['_ENVIRONMENTINFO']._serialized_start=2588
|
52
|
+
_globals['_ENVIRONMENTINFO']._serialized_end=2696
|
53
53
|
# @@protoc_insertion_point(module_scope)
|
@@ -293,6 +293,7 @@ class CustomThemeConfig(google.protobuf.message.Message):
|
|
293
293
|
LINK_UNDERLINE_FIELD_NUMBER: builtins.int
|
294
294
|
BASE_FONT_SIZE_FIELD_NUMBER: builtins.int
|
295
295
|
BASE_FONT_WEIGHT_FIELD_NUMBER: builtins.int
|
296
|
+
CODE_FONT_WEIGHT_FIELD_NUMBER: builtins.int
|
296
297
|
CODE_FONT_SIZE_FIELD_NUMBER: builtins.int
|
297
298
|
SHOW_SIDEBAR_BORDER_FIELD_NUMBER: builtins.int
|
298
299
|
SIDEBAR_FIELD_NUMBER: builtins.int
|
@@ -323,6 +324,7 @@ class CustomThemeConfig(google.protobuf.message.Message):
|
|
323
324
|
link_underline: builtins.bool
|
324
325
|
base_font_size: builtins.int
|
325
326
|
base_font_weight: builtins.int
|
327
|
+
code_font_weight: builtins.int
|
326
328
|
code_font_size: builtins.str
|
327
329
|
show_sidebar_border: builtins.bool
|
328
330
|
code_background_color: builtins.str
|
@@ -366,14 +368,15 @@ class CustomThemeConfig(google.protobuf.message.Message):
|
|
366
368
|
link_underline: builtins.bool | None = ...,
|
367
369
|
base_font_size: builtins.int | None = ...,
|
368
370
|
base_font_weight: builtins.int | None = ...,
|
371
|
+
code_font_weight: builtins.int | None = ...,
|
369
372
|
code_font_size: builtins.str | None = ...,
|
370
373
|
show_sidebar_border: builtins.bool | None = ...,
|
371
374
|
sidebar: global___CustomThemeConfig | None = ...,
|
372
375
|
code_background_color: builtins.str | None = ...,
|
373
376
|
dataframe_header_background_color: builtins.str | None = ...,
|
374
377
|
) -> None: ...
|
375
|
-
def HasField(self, field_name: typing.Literal["_base_font_size", b"_base_font_size", "_base_font_weight", b"_base_font_weight", "_base_radius", b"_base_radius", "_border_color", b"_border_color", "_button_radius", b"_button_radius", "_code_background_color", b"_code_background_color", "_code_font_size", b"_code_font_size", "_dataframe_border_color", b"_dataframe_border_color", "_dataframe_header_background_color", b"_dataframe_header_background_color", "_link_color", b"_link_color", "_link_underline", b"_link_underline", "_show_sidebar_border", b"_show_sidebar_border", "_show_widget_border", b"_show_widget_border", "_sidebar", b"_sidebar", "base_font_size", b"base_font_size", "base_font_weight", b"base_font_weight", "base_radius", b"base_radius", "border_color", b"border_color", "button_radius", b"button_radius", "code_background_color", b"code_background_color", "code_font_size", b"code_font_size", "dataframe_border_color", b"dataframe_border_color", "dataframe_header_background_color", b"dataframe_header_background_color", "font_sizes", b"font_sizes", "link_color", b"link_color", "link_underline", b"link_underline", "radii", b"radii", "show_sidebar_border", b"show_sidebar_border", "show_widget_border", b"show_widget_border", "sidebar", b"sidebar"]) -> builtins.bool: ...
|
376
|
-
def ClearField(self, field_name: typing.Literal["_base_font_size", b"_base_font_size", "_base_font_weight", b"_base_font_weight", "_base_radius", b"_base_radius", "_border_color", b"_border_color", "_button_radius", b"_button_radius", "_code_background_color", b"_code_background_color", "_code_font_size", b"_code_font_size", "_dataframe_border_color", b"_dataframe_border_color", "_dataframe_header_background_color", b"_dataframe_header_background_color", "_link_color", b"_link_color", "_link_underline", b"_link_underline", "_show_sidebar_border", b"_show_sidebar_border", "_show_widget_border", b"_show_widget_border", "_sidebar", b"_sidebar", "background_color", b"background_color", "base", b"base", "base_font_size", b"base_font_size", "base_font_weight", b"base_font_weight", "base_radius", b"base_radius", "body_font", b"body_font", "border_color", b"border_color", "button_radius", b"button_radius", "code_background_color", b"code_background_color", "code_font", b"code_font", "code_font_size", b"code_font_size", "dataframe_border_color", b"dataframe_border_color", "dataframe_header_background_color", b"dataframe_header_background_color", "font", b"font", "font_faces", b"font_faces", "font_sizes", b"font_sizes", "heading_font", b"heading_font", "link_color", b"link_color", "link_underline", b"link_underline", "primary_color", b"primary_color", "radii", b"radii", "secondary_background_color", b"secondary_background_color", "show_sidebar_border", b"show_sidebar_border", "show_widget_border", b"show_widget_border", "sidebar", b"sidebar", "skeleton_background_color", b"skeleton_background_color", "text_color", b"text_color", "widget_background_color", b"widget_background_color", "widget_border_color", b"widget_border_color"]) -> None: ...
|
378
|
+
def HasField(self, field_name: typing.Literal["_base_font_size", b"_base_font_size", "_base_font_weight", b"_base_font_weight", "_base_radius", b"_base_radius", "_border_color", b"_border_color", "_button_radius", b"_button_radius", "_code_background_color", b"_code_background_color", "_code_font_size", b"_code_font_size", "_code_font_weight", b"_code_font_weight", "_dataframe_border_color", b"_dataframe_border_color", "_dataframe_header_background_color", b"_dataframe_header_background_color", "_link_color", b"_link_color", "_link_underline", b"_link_underline", "_show_sidebar_border", b"_show_sidebar_border", "_show_widget_border", b"_show_widget_border", "_sidebar", b"_sidebar", "base_font_size", b"base_font_size", "base_font_weight", b"base_font_weight", "base_radius", b"base_radius", "border_color", b"border_color", "button_radius", b"button_radius", "code_background_color", b"code_background_color", "code_font_size", b"code_font_size", "code_font_weight", b"code_font_weight", "dataframe_border_color", b"dataframe_border_color", "dataframe_header_background_color", b"dataframe_header_background_color", "font_sizes", b"font_sizes", "link_color", b"link_color", "link_underline", b"link_underline", "radii", b"radii", "show_sidebar_border", b"show_sidebar_border", "show_widget_border", b"show_widget_border", "sidebar", b"sidebar"]) -> builtins.bool: ...
|
379
|
+
def ClearField(self, field_name: typing.Literal["_base_font_size", b"_base_font_size", "_base_font_weight", b"_base_font_weight", "_base_radius", b"_base_radius", "_border_color", b"_border_color", "_button_radius", b"_button_radius", "_code_background_color", b"_code_background_color", "_code_font_size", b"_code_font_size", "_code_font_weight", b"_code_font_weight", "_dataframe_border_color", b"_dataframe_border_color", "_dataframe_header_background_color", b"_dataframe_header_background_color", "_link_color", b"_link_color", "_link_underline", b"_link_underline", "_show_sidebar_border", b"_show_sidebar_border", "_show_widget_border", b"_show_widget_border", "_sidebar", b"_sidebar", "background_color", b"background_color", "base", b"base", "base_font_size", b"base_font_size", "base_font_weight", b"base_font_weight", "base_radius", b"base_radius", "body_font", b"body_font", "border_color", b"border_color", "button_radius", b"button_radius", "code_background_color", b"code_background_color", "code_font", b"code_font", "code_font_size", b"code_font_size", "code_font_weight", b"code_font_weight", "dataframe_border_color", b"dataframe_border_color", "dataframe_header_background_color", b"dataframe_header_background_color", "font", b"font", "font_faces", b"font_faces", "font_sizes", b"font_sizes", "heading_font", b"heading_font", "link_color", b"link_color", "link_underline", b"link_underline", "primary_color", b"primary_color", "radii", b"radii", "secondary_background_color", b"secondary_background_color", "show_sidebar_border", b"show_sidebar_border", "show_widget_border", b"show_widget_border", "sidebar", b"sidebar", "skeleton_background_color", b"skeleton_background_color", "text_color", b"text_color", "widget_background_color", b"widget_background_color", "widget_border_color", b"widget_border_color"]) -> None: ...
|
377
380
|
@typing.overload
|
378
381
|
def WhichOneof(self, oneof_group: typing.Literal["_base_font_size", b"_base_font_size"]) -> typing.Literal["base_font_size"] | None: ...
|
379
382
|
@typing.overload
|
@@ -389,6 +392,8 @@ class CustomThemeConfig(google.protobuf.message.Message):
|
|
389
392
|
@typing.overload
|
390
393
|
def WhichOneof(self, oneof_group: typing.Literal["_code_font_size", b"_code_font_size"]) -> typing.Literal["code_font_size"] | None: ...
|
391
394
|
@typing.overload
|
395
|
+
def WhichOneof(self, oneof_group: typing.Literal["_code_font_weight", b"_code_font_weight"]) -> typing.Literal["code_font_weight"] | None: ...
|
396
|
+
@typing.overload
|
392
397
|
def WhichOneof(self, oneof_group: typing.Literal["_dataframe_border_color", b"_dataframe_border_color"]) -> typing.Literal["dataframe_border_color"] | None: ...
|
393
398
|
@typing.overload
|
394
399
|
def WhichOneof(self, oneof_group: typing.Literal["_dataframe_header_background_color", b"_dataframe_header_background_color"]) -> typing.Literal["dataframe_header_background_color"] | None: ...
|
streamlit/static/index.html
CHANGED
@@ -37,7 +37,7 @@
|
|
37
37
|
<script>
|
38
38
|
window.prerenderReady = false
|
39
39
|
</script>
|
40
|
-
<script type="module" crossorigin src="./static/js/index.
|
40
|
+
<script type="module" crossorigin src="./static/js/index.BEHais2d.js"></script>
|
41
41
|
<link rel="stylesheet" crossorigin href="./static/css/index.CJVRHjQZ.css">
|
42
42
|
</head>
|
43
43
|
<body>
|