axiom-coding-agent-setup 1.0.10 → 1.0.11
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.
- package/.agents/skills/agent-browser/SKILL.md +55 -0
- package/.agents/skills/developing-with-streamlit/SKILL.md +220 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-chat-ui/SKILL.md +195 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/SKILL.md +233 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/packaged-components.md +212 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/state-sync.md +149 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/theme-css-variables.md +243 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/troubleshooting.md +121 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-dashboards/SKILL.md +147 -0
- package/.agents/skills/developing-with-streamlit/skills/building-streamlit-multipage-apps/SKILL.md +218 -0
- package/.agents/skills/developing-with-streamlit/skills/choosing-streamlit-selection-widgets/SKILL.md +139 -0
- package/.agents/skills/developing-with-streamlit/skills/connecting-streamlit-to-snowflake/SKILL.md +188 -0
- package/.agents/skills/developing-with-streamlit/skills/creating-streamlit-themes/SKILL.md +486 -0
- package/.agents/skills/developing-with-streamlit/skills/displaying-streamlit-data/SKILL.md +199 -0
- package/.agents/skills/developing-with-streamlit/skills/improving-streamlit-design/SKILL.md +191 -0
- package/.agents/skills/developing-with-streamlit/skills/optimizing-streamlit-performance/SKILL.md +323 -0
- package/.agents/skills/developing-with-streamlit/skills/organizing-streamlit-code/SKILL.md +91 -0
- package/.agents/skills/developing-with-streamlit/skills/setting-up-streamlit-environment/SKILL.md +128 -0
- package/.agents/skills/developing-with-streamlit/skills/using-streamlit-cli/SKILL.md +165 -0
- package/.agents/skills/developing-with-streamlit/skills/using-streamlit-custom-components/SKILL.md +170 -0
- package/.agents/skills/developing-with-streamlit/skills/using-streamlit-layouts/SKILL.md +229 -0
- package/.agents/skills/developing-with-streamlit/skills/using-streamlit-markdown/SKILL.md +207 -0
- package/.agents/skills/developing-with-streamlit/skills/using-streamlit-session-state/SKILL.md +144 -0
- package/.agents/skills/developing-with-streamlit/templates/.gitattributes +3 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/README.md +188 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-companies/pyproject.toml +12 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-companies/streamlit_app.py +365 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute/pyproject.toml +12 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute/streamlit_app.py +461 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/.streamlit/secrets.toml.example +20 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/pyproject.toml +11 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/snowflake.yml +18 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/streamlit_app.py +527 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-feature-usage/pyproject.toml +12 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-feature-usage/streamlit_app.py +307 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics/pyproject.toml +12 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics/streamlit_app.py +426 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/.streamlit/secrets.toml.example +20 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/pyproject.toml +11 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/snowflake.yml +18 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/streamlit_app.py +463 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-seattle-weather/pyproject.toml +12 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-seattle-weather/streamlit_app.py +252 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers/pyproject.toml +12 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers/streamlit_app.py +342 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/.streamlit/secrets.toml.example +20 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/pyproject.toml +11 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/snowflake.yml +18 -0
- package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/streamlit_app.py +384 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/README.md +128 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/dracula.toml +39 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/github.toml +37 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/minimal.toml +39 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/nord.toml +39 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/snowflake.toml +42 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/solarized-light.toml +38 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/spotify.toml +34 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_configs/stripe.toml +35 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_shared/streamlit_app.py +336 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/_templates/pyproject.toml.tmpl +12 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/dracula/.streamlit/config.toml +39 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/dracula/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/dracula/streamlit_app.py +337 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/github/.streamlit/config.toml +37 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/github/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/github/streamlit_app.py +337 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/manage.py +332 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/minimal/.streamlit/config.toml +39 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/minimal/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/minimal/streamlit_app.py +337 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/nord/.streamlit/config.toml +39 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/nord/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/nord/streamlit_app.py +337 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/snowflake/.streamlit/config.toml +42 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/snowflake/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/snowflake/streamlit_app.py +337 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/solarized-light/.streamlit/config.toml +38 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/solarized-light/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/solarized-light/streamlit_app.py +337 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/spotify/.streamlit/config.toml +34 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/spotify/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/spotify/streamlit_app.py +337 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/stripe/.streamlit/config.toml +35 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/stripe/pyproject.toml +10 -0
- package/.agents/skills/developing-with-streamlit/templates/themes/stripe/streamlit_app.py +337 -0
- package/.agents/skills/fastapi/SKILL.md +436 -0
- package/.agents/skills/fastapi/references/dependencies.md +142 -0
- package/.agents/skills/fastapi/references/other-tools.md +76 -0
- package/.agents/skills/fastapi/references/streaming.md +105 -0
- package/.agents/skills/frontend-design/LICENSE.txt +177 -0
- package/.agents/skills/frontend-design/SKILL.md +42 -0
- package/.agents/skills/gradio/SKILL.md +84 -0
- package/.agents/skills/gradio/references/api-signatures.md +115 -0
- package/.agents/skills/gradio/references/event-listeners.md +130 -0
- package/.agents/skills/gradio/references/examples.md +613 -0
- package/.agents/skills/ui-ux-pro-max/SKILL.md +659 -0
- package/.agents/skills/ui-ux-pro-max/data +1 -0
- package/.agents/skills/ui-ux-pro-max/scripts +1 -0
- package/.env.axiom +8 -0
- package/AGENTS.md +2 -1
- package/README.md +19 -3
- package/bin/cli.js +11 -1
- package/opencode.json +7 -4
- package/package.json +1 -1
- package/skills-lock.json +36 -0
- package/.agents/skills/n8n-patterns/SKILL.md +0 -272
|
@@ -0,0 +1,486 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: creating-streamlit-themes
|
|
3
|
+
description: Creating and customizing Streamlit themes. Use when changing app colors, fonts, or appearance, or aligning apps to brand guidelines. Covers config.toml configuration, design principles, and CSS avoidance.
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Creating Streamlit themes
|
|
8
|
+
|
|
9
|
+
Build professional, brand-aligned themes using `.streamlit/config.toml`. This skill covers design principles and complete configuration for polished, cohesive themes.
|
|
10
|
+
|
|
11
|
+
## Theme file setup
|
|
12
|
+
|
|
13
|
+
Theme options go in Streamlit's `config.toml` under the `[theme]` section:
|
|
14
|
+
|
|
15
|
+
## Theme inheritance
|
|
16
|
+
|
|
17
|
+
Start from a built-in theme or external file:
|
|
18
|
+
|
|
19
|
+
```toml
|
|
20
|
+
[theme]
|
|
21
|
+
base = "light" # or "dark"
|
|
22
|
+
# base = "./my-base-theme.toml" # Local file
|
|
23
|
+
# base = "https://example.com/theme.toml" # Remote URL
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
When using `base`, you only need to override the values you want to change. Theme files referenced via `base` can only contain a single `[theme]` section—`[theme.light]` and `[theme.dark]` variants are not supported in external theme files.
|
|
27
|
+
|
|
28
|
+
## Color configuration
|
|
29
|
+
|
|
30
|
+
### Theme colors
|
|
31
|
+
|
|
32
|
+
```toml
|
|
33
|
+
[theme]
|
|
34
|
+
primaryColor = "#0969da" # Buttons, links, active elements
|
|
35
|
+
backgroundColor = "#ffffff" # Main content background
|
|
36
|
+
secondaryBackgroundColor = "#f6f8fa" # Widget backgrounds, code blocks
|
|
37
|
+
textColor = "#1F2328" # Body text
|
|
38
|
+
|
|
39
|
+
# Optional refinements
|
|
40
|
+
linkColor = "#0969da" # Markdown links (defaults to primaryColor)
|
|
41
|
+
codeTextColor = "#1F2328" # Inline code text
|
|
42
|
+
codeBackgroundColor = "#f6f8fa" # Code block background
|
|
43
|
+
borderColor = "#d0d7de" # Widget borders
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
**Design principle:** Choose a `primaryColor` dark enough to contrast with white text. Streamlit renders the text of primary buttons white against the primary color.
|
|
47
|
+
|
|
48
|
+
### Color palette
|
|
49
|
+
|
|
50
|
+
Define semantic colors for status indicators, markdown text coloring, and sparklines:
|
|
51
|
+
|
|
52
|
+
```toml
|
|
53
|
+
[theme]
|
|
54
|
+
redColor = "#cf222e"
|
|
55
|
+
orangeColor = "#bf8700"
|
|
56
|
+
yellowColor = "#dbab09"
|
|
57
|
+
greenColor = "#1a7f37"
|
|
58
|
+
blueColor = "#0969da"
|
|
59
|
+
violetColor = "#8250df"
|
|
60
|
+
grayColor = "#57606a"
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Each color supports background and text variants (auto-derived if not set):
|
|
64
|
+
|
|
65
|
+
```toml
|
|
66
|
+
[theme]
|
|
67
|
+
greenColor = "#1a7f37"
|
|
68
|
+
greenBackgroundColor = "#dafbe1" # Light tint for badges
|
|
69
|
+
greenTextColor = "#116329" # Darkened for readability
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Chart colors
|
|
73
|
+
|
|
74
|
+
Define colors for Plotly, Altair, and Vega-Lite charts:
|
|
75
|
+
|
|
76
|
+
```toml
|
|
77
|
+
[theme]
|
|
78
|
+
# Categorical data (bars, pie slices, series)
|
|
79
|
+
chartCategoricalColors = ["#0969da", "#1a7f37", "#bf3989", "#8250df", "#cf222e", "#bf8700", "#57606a"]
|
|
80
|
+
|
|
81
|
+
# Sequential/gradient data (heatmaps) - exactly 10 colors required
|
|
82
|
+
chartSequentialColors = ["#f0f6fc", "#c8e1ff", "#79c0ff", "#58a6ff", "#388bfd", "#1f6feb", "#1158c7", "#0d419d", "#0a3069", "#04244a"]
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Dataframe styling
|
|
86
|
+
|
|
87
|
+
```toml
|
|
88
|
+
[theme]
|
|
89
|
+
dataframeBorderColor = "#d0d7de"
|
|
90
|
+
dataframeHeaderBackgroundColor = "#f6f8fa"
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Ensure `textColor` is readable against `dataframeHeaderBackgroundColor`—headers use the main text color.
|
|
94
|
+
|
|
95
|
+
## Typography
|
|
96
|
+
|
|
97
|
+
### Font families
|
|
98
|
+
|
|
99
|
+
Use built-in fonts, load from Google Fonts, or define custom fonts from font files (see below):
|
|
100
|
+
|
|
101
|
+
```toml
|
|
102
|
+
[theme]
|
|
103
|
+
# Built-in options
|
|
104
|
+
font = "sans-serif" # or "serif" or "monospace"
|
|
105
|
+
|
|
106
|
+
# Google Fonts
|
|
107
|
+
font = "Inter:https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
|
|
108
|
+
|
|
109
|
+
# Font with spaces in name
|
|
110
|
+
font = "'IBM Plex Sans':https://fonts.googleapis.com/css2?family=IBM+Plex+Sans:wght@400;500;600&display=swap"
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
### Self-hosting custom fonts
|
|
114
|
+
|
|
115
|
+
Use `[[theme.fontFaces]]` tables to load fonts via Streamlit's static file serving. Font files must be placed in a `static/` directory and served through the app—they cannot be arbitrary local file paths.
|
|
116
|
+
|
|
117
|
+
**Before adding fonts to config.toml:** Verify the font files exist in the static directory.
|
|
118
|
+
|
|
119
|
+
```toml
|
|
120
|
+
[[theme.fontFaces]]
|
|
121
|
+
family = "CustomFont"
|
|
122
|
+
url = "app/static/CustomFont-Regular.woff2"
|
|
123
|
+
weight = 400
|
|
124
|
+
|
|
125
|
+
[[theme.fontFaces]]
|
|
126
|
+
family = "CustomFont"
|
|
127
|
+
url = "app/static/CustomFont-Bold.woff2"
|
|
128
|
+
weight = 700
|
|
129
|
+
|
|
130
|
+
[theme]
|
|
131
|
+
font = "CustomFont"
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
**Attributes:** `family` (name), `url` (path to OTF/TTF/WOFF/WOFF2), `weight` (400, "200 800", or "bold"), `style` ("normal"/"italic"/"oblique"), `unicodeRange` (e.g., "U+0000-00FF").
|
|
135
|
+
|
|
136
|
+
Changes to `fontFaces` require a server restart.
|
|
137
|
+
|
|
138
|
+
### Heading and code fonts
|
|
139
|
+
|
|
140
|
+
```toml
|
|
141
|
+
[theme]
|
|
142
|
+
headingFont = "Inter:https://fonts.googleapis.com/css2?family=Inter:wght@600;700&display=swap"
|
|
143
|
+
codeFont = "'JetBrains Mono':https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap"
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Font sizing and weight
|
|
147
|
+
|
|
148
|
+
```toml
|
|
149
|
+
[theme]
|
|
150
|
+
baseFontSize = 14 # Root size in pixels (default: 16)
|
|
151
|
+
baseFontWeight = 400 # Normal weight
|
|
152
|
+
codeFontSize = "0.875rem" # Relative to base, or use "13px"
|
|
153
|
+
codeFontWeight = 400
|
|
154
|
+
|
|
155
|
+
# Heading hierarchy (h1 through h6), or use a single value for all
|
|
156
|
+
headingFontSizes = ["32px", "24px", "20px", "16px", "14px", "12px"]
|
|
157
|
+
headingFontWeights = [600, 600, 600, 500, 500, 500]
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Link styling
|
|
161
|
+
|
|
162
|
+
```toml
|
|
163
|
+
[theme]
|
|
164
|
+
linkUnderline = false # Remove underlines for cleaner look
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Border and radius
|
|
168
|
+
|
|
169
|
+
```toml
|
|
170
|
+
[theme]
|
|
171
|
+
baseRadius = "8px" # All components (none/small/medium/large/full/px/rem)
|
|
172
|
+
buttonRadius = "8px" # Buttons specifically (defaults to baseRadius)
|
|
173
|
+
showWidgetBorder = true # Show borders on unfocused widgets
|
|
174
|
+
showSidebarBorder = true # Show divider between sidebar and content
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**Radius keywords:** `"none"` (0), `"small"` (4px), `"medium"` (8px), `"large"` (12px), `"full"` (pill shape).
|
|
178
|
+
|
|
179
|
+
## Sidebar customization
|
|
180
|
+
|
|
181
|
+
Style the sidebar independently:
|
|
182
|
+
|
|
183
|
+
```toml
|
|
184
|
+
[theme.sidebar]
|
|
185
|
+
backgroundColor = "#f6f8fa"
|
|
186
|
+
secondaryBackgroundColor = "#eaeef2"
|
|
187
|
+
codeBackgroundColor = "#eaeef2"
|
|
188
|
+
textColor = "#1F2328"
|
|
189
|
+
borderColor = "#d0d7de"
|
|
190
|
+
primaryColor = "#0969da" # Active elements in sidebar
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Light and dark modes
|
|
194
|
+
|
|
195
|
+
Define separate themes for each mode:
|
|
196
|
+
|
|
197
|
+
```toml
|
|
198
|
+
[theme.light]
|
|
199
|
+
primaryColor = "#0969da"
|
|
200
|
+
backgroundColor = "#ffffff"
|
|
201
|
+
secondaryBackgroundColor = "#f6f8fa"
|
|
202
|
+
textColor = "#1F2328"
|
|
203
|
+
|
|
204
|
+
[theme.dark]
|
|
205
|
+
primaryColor = "#58a6ff"
|
|
206
|
+
backgroundColor = "#0d1117"
|
|
207
|
+
secondaryBackgroundColor = "#161b22"
|
|
208
|
+
textColor = "#e6edf3"
|
|
209
|
+
|
|
210
|
+
[theme.light.sidebar]
|
|
211
|
+
backgroundColor = "#f6f8fa"
|
|
212
|
+
|
|
213
|
+
[theme.dark.sidebar]
|
|
214
|
+
backgroundColor = "#010409"
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
Users can switch between modes in the app settings menu only if both `[theme.light]` and `[theme.dark]` are defined. A custom theme with just `[theme]` locks the app to a single mode.
|
|
218
|
+
|
|
219
|
+
## Detecting current theme
|
|
220
|
+
|
|
221
|
+
Use `st.context.theme.base` to adapt your app to the active theme. Useful for:
|
|
222
|
+
|
|
223
|
+
- Adjusting specific chart colors for better contrast
|
|
224
|
+
- Swapping logos or images (e.g., dark logo on light, light logo on dark)
|
|
225
|
+
- Styling third-party components that don't auto-adapt
|
|
226
|
+
- Applying conditional CSS or custom styling
|
|
227
|
+
|
|
228
|
+
```python
|
|
229
|
+
if st.context.theme.base == "dark":
|
|
230
|
+
# Do something for dark mode
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Design principles
|
|
234
|
+
|
|
235
|
+
### Color contrast
|
|
236
|
+
|
|
237
|
+
Ensure WCAG AA compliance (4.5:1 ratio for text):
|
|
238
|
+
- Light themes: Dark text (#1F2328) on light backgrounds (#ffffff)
|
|
239
|
+
- Dark themes: Light text (#e6edf3) on dark backgrounds (#0d1117)
|
|
240
|
+
- Primary colors must contrast with white button text
|
|
241
|
+
|
|
242
|
+
### Color harmony
|
|
243
|
+
|
|
244
|
+
Build cohesive palettes using these approaches:
|
|
245
|
+
|
|
246
|
+
**Monochromatic:** Single hue with varying lightness (e.g., shadcn's zinc grays)
|
|
247
|
+
```toml
|
|
248
|
+
primaryColor = "#18181B"
|
|
249
|
+
textColor = "#09090B"
|
|
250
|
+
borderColor = "#E4E4E7"
|
|
251
|
+
grayColor = "#71717A"
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
**Brand accent:** Neutral base with one brand color (e.g., Stripe's purple)
|
|
255
|
+
```toml
|
|
256
|
+
primaryColor = "#635bff" # Brand purple
|
|
257
|
+
backgroundColor = "#ffffff"
|
|
258
|
+
textColor = "#425466" # Neutral gray
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**Complementary:** Brand primary with supporting accent colors
|
|
262
|
+
```toml
|
|
263
|
+
primaryColor = "#29B5E8" # Brand blue (Snowflake)
|
|
264
|
+
textColor = "#11567F" # Darker blue for text
|
|
265
|
+
greenColor = "#36B37E" # Success states
|
|
266
|
+
redColor = "#DE350B" # Error states
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
### Typography guidelines
|
|
270
|
+
|
|
271
|
+
- **Body text:** 14-16px, weight 400
|
|
272
|
+
- **Headings:** Decreasing scale from h1 (28-40px) to h6 (12-14px)
|
|
273
|
+
- **Code:** Monospace font, slightly smaller than body (0.85-0.875rem)
|
|
274
|
+
- **Font pairing:** Use the same font for body and headings for consistency, or pair complementary fonts (e.g., serif headings with sans-serif body). Code should always use a distinct monospace font.
|
|
275
|
+
|
|
276
|
+
### Visual hierarchy
|
|
277
|
+
|
|
278
|
+
Create depth with background layers:
|
|
279
|
+
```
|
|
280
|
+
Main content: #ffffff (lightest)
|
|
281
|
+
Secondary elements: #f6f8fa (slightly darker)
|
|
282
|
+
Sidebar: #f6f8fa or contrasting brand color
|
|
283
|
+
Code blocks: #f6f8fa (matches secondary or distinct)
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
## Example: Snowflake brand theme
|
|
287
|
+
|
|
288
|
+
Clean, professional theme with brand blue accents:
|
|
289
|
+
|
|
290
|
+
```toml
|
|
291
|
+
[theme]
|
|
292
|
+
primaryColor = "#29B5E8"
|
|
293
|
+
backgroundColor = "#ffffff"
|
|
294
|
+
secondaryBackgroundColor = "#f4f9fc"
|
|
295
|
+
codeBackgroundColor = "#e8f4f8"
|
|
296
|
+
textColor = "#11567F"
|
|
297
|
+
linkColor = "#29B5E8"
|
|
298
|
+
borderColor = "#d0e8f2"
|
|
299
|
+
showWidgetBorder = true
|
|
300
|
+
showSidebarBorder = true
|
|
301
|
+
baseRadius = "8px"
|
|
302
|
+
buttonRadius = "8px"
|
|
303
|
+
|
|
304
|
+
font = "'Inter':https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap"
|
|
305
|
+
codeFont = "'JetBrains Mono':https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500&display=swap"
|
|
306
|
+
codeFontSize = "13px"
|
|
307
|
+
codeTextColor = "#11567F"
|
|
308
|
+
baseFontSize = 14
|
|
309
|
+
baseFontWeight = 400
|
|
310
|
+
headingFontSizes = ["32px", "24px", "20px", "16px", "14px", "12px"]
|
|
311
|
+
headingFontWeights = [600, 600, 600, 500, 500, 500]
|
|
312
|
+
linkUnderline = false
|
|
313
|
+
|
|
314
|
+
chartCategoricalColors = ["#29B5E8", "#11567F", "#71C8E5", "#174D6A", "#A5DDF2", "#0E4D6B", "#52B8D9"]
|
|
315
|
+
|
|
316
|
+
blueColor = "#29B5E8"
|
|
317
|
+
greenColor = "#36B37E"
|
|
318
|
+
yellowColor = "#FFAB00"
|
|
319
|
+
redColor = "#DE350B"
|
|
320
|
+
violetColor = "#6554C0"
|
|
321
|
+
|
|
322
|
+
dataframeBorderColor = "#d0e8f2"
|
|
323
|
+
dataframeHeaderBackgroundColor = "#e8f4f8"
|
|
324
|
+
|
|
325
|
+
[theme.sidebar]
|
|
326
|
+
backgroundColor = "#11567F"
|
|
327
|
+
secondaryBackgroundColor = "#174D6A"
|
|
328
|
+
codeBackgroundColor = "#0E4D6B"
|
|
329
|
+
textColor = "#ffffff"
|
|
330
|
+
borderColor = "#1E6D94"
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
## Example: VS Code dark theme
|
|
334
|
+
|
|
335
|
+
Developer-focused dark theme with syntax-inspired colors:
|
|
336
|
+
|
|
337
|
+
```toml
|
|
338
|
+
[theme]
|
|
339
|
+
base = "dark"
|
|
340
|
+
primaryColor = "#0078d4"
|
|
341
|
+
backgroundColor = "#1e1e1e"
|
|
342
|
+
secondaryBackgroundColor = "#252526"
|
|
343
|
+
codeBackgroundColor = "#1e1e1e"
|
|
344
|
+
textColor = "#cccccc"
|
|
345
|
+
linkColor = "#3794ff"
|
|
346
|
+
borderColor = "#3c3c3c"
|
|
347
|
+
showWidgetBorder = true
|
|
348
|
+
showSidebarBorder = true
|
|
349
|
+
baseRadius = "4px"
|
|
350
|
+
buttonRadius = "4px"
|
|
351
|
+
|
|
352
|
+
font = "'Segoe UI', 'Open Sans':https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;400;500;600;700&display=swap"
|
|
353
|
+
codeFont = "'Fira Code':https://fonts.googleapis.com/css2?family=Fira+Code:wght@400;500&display=swap"
|
|
354
|
+
codeFontSize = "13px"
|
|
355
|
+
codeTextColor = "#d4d4d4"
|
|
356
|
+
baseFontSize = 14
|
|
357
|
+
baseFontWeight = 400
|
|
358
|
+
headingFontSizes = ["28px", "22px", "18px", "16px", "14px", "12px"]
|
|
359
|
+
headingFontWeights = [600, 600, 600, 600, 600, 600]
|
|
360
|
+
linkUnderline = false
|
|
361
|
+
|
|
362
|
+
chartCategoricalColors = ["#0078d4", "#4ec9b0", "#dcdcaa", "#ce9178", "#c586c0", "#569cd6", "#6a9955"]
|
|
363
|
+
|
|
364
|
+
blueColor = "#569cd6"
|
|
365
|
+
greenColor = "#6a9955"
|
|
366
|
+
yellowColor = "#dcdcaa"
|
|
367
|
+
orangeColor = "#ce9178"
|
|
368
|
+
violetColor = "#c586c0"
|
|
369
|
+
|
|
370
|
+
[theme.sidebar]
|
|
371
|
+
backgroundColor = "#252526"
|
|
372
|
+
secondaryBackgroundColor = "#333333"
|
|
373
|
+
codeBackgroundColor = "#1e1e1e"
|
|
374
|
+
borderColor = "#3c3c3c"
|
|
375
|
+
```
|
|
376
|
+
|
|
377
|
+
## Common mistakes
|
|
378
|
+
|
|
379
|
+
### Primary color too light
|
|
380
|
+
|
|
381
|
+
```toml
|
|
382
|
+
# BAD: White text on yellow is unreadable
|
|
383
|
+
primaryColor = "#FFEB3B"
|
|
384
|
+
|
|
385
|
+
# GOOD: Use a darker shade
|
|
386
|
+
primaryColor = "#F59E0B"
|
|
387
|
+
```
|
|
388
|
+
|
|
389
|
+
### Insufficient contrast
|
|
390
|
+
|
|
391
|
+
```toml
|
|
392
|
+
# BAD: Light gray text on white
|
|
393
|
+
textColor = "#CCCCCC"
|
|
394
|
+
backgroundColor = "#FFFFFF"
|
|
395
|
+
|
|
396
|
+
# GOOD: Dark text on light background
|
|
397
|
+
textColor = "#1F2328"
|
|
398
|
+
backgroundColor = "#FFFFFF"
|
|
399
|
+
```
|
|
400
|
+
|
|
401
|
+
### Mismatched backgrounds
|
|
402
|
+
|
|
403
|
+
```toml
|
|
404
|
+
# BAD: Secondary lighter than primary
|
|
405
|
+
backgroundColor = "#f6f8fa"
|
|
406
|
+
secondaryBackgroundColor = "#ffffff"
|
|
407
|
+
|
|
408
|
+
# GOOD: Secondary should be darker/distinct
|
|
409
|
+
backgroundColor = "#ffffff"
|
|
410
|
+
secondaryBackgroundColor = "#f6f8fa"
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
### Forgetting sidebar contrast
|
|
414
|
+
|
|
415
|
+
When using a dark sidebar with a light main section, adjust all sidebar colors—not just `textColor`:
|
|
416
|
+
|
|
417
|
+
```toml
|
|
418
|
+
# BAD: Only changed backgroundColor
|
|
419
|
+
[theme.sidebar]
|
|
420
|
+
backgroundColor = "#11567F"
|
|
421
|
+
|
|
422
|
+
# GOOD: Adjust all colors for dark sidebar
|
|
423
|
+
[theme.sidebar]
|
|
424
|
+
backgroundColor = "#11567F"
|
|
425
|
+
secondaryBackgroundColor = "#174D6A"
|
|
426
|
+
textColor = "#ffffff"
|
|
427
|
+
borderColor = "#1E6D94"
|
|
428
|
+
...
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
## IMPORTANT: No custom CSS unless explicitly requested
|
|
432
|
+
|
|
433
|
+
**DO NOT use custom CSS or HTML for theming.** This includes:
|
|
434
|
+
- `st.markdown(..., unsafe_allow_html=True)` with `<style>` or inline styles
|
|
435
|
+
- `st.html()` with `<style>` blocks
|
|
436
|
+
- Any HTML/CSS for colors, backgrounds, fonts, or visual styling
|
|
437
|
+
|
|
438
|
+
**Only use CSS if the user explicitly asks for it** (e.g., "add custom CSS", "use st.html for styling"). For brand colors, theming, and visual identity—always use `config.toml`.
|
|
439
|
+
|
|
440
|
+
Native theming is cleaner, more maintainable, and won't break with Streamlit updates.
|
|
441
|
+
|
|
442
|
+
If the user explicitly asks for CSS, use `key=` to create targetable classes:
|
|
443
|
+
|
|
444
|
+
```python
|
|
445
|
+
st.button("Submit", key="submit")
|
|
446
|
+
# Generates: .st-key-submit
|
|
447
|
+
|
|
448
|
+
st.html("""<style>.st-key-submit button { width: 100%; }</style>""")
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
**Never use CSS for theming (colors, backgrounds, fonts) unless explicitly asked. Use config.toml instead.**
|
|
452
|
+
|
|
453
|
+
## Development workflow
|
|
454
|
+
|
|
455
|
+
Most theme options update live after saving `config.toml` and rerunning. Font-related options (`fontFaces`) require a server restart.
|
|
456
|
+
|
|
457
|
+
Test your theme with: buttons (primary contrast), forms (borders, focus), dataframes (headers), code blocks, charts, and sidebar.
|
|
458
|
+
|
|
459
|
+
## Theme templates
|
|
460
|
+
|
|
461
|
+
Ready-to-use themes with bundled fonts are available in `templates/themes/`:
|
|
462
|
+
|
|
463
|
+
| Theme | Base | Primary Color | Fonts |
|
|
464
|
+
|-------|------|---------------|-------|
|
|
465
|
+
| **snowflake** | Light | `#29B5E8` (cyan) | Inter, JetBrains Mono |
|
|
466
|
+
| **dracula** | Dark | `#BD93F9` (purple) | Fira Sans, JetBrains Mono |
|
|
467
|
+
| **nord** | Dark | `#88C0D0` (frost blue) | Inter, JetBrains Mono |
|
|
468
|
+
| **stripe** | Light | `#635BFF` (indigo) | Inter, Source Code Pro |
|
|
469
|
+
| **solarized-light** | Light | `#268BD2` (blue) | Source Sans 3, Source Code Pro |
|
|
470
|
+
| **spotify** | Dark | `#1DB954` (green) | Inter, Fira Code |
|
|
471
|
+
| **github** | Light | `#0969DA` (blue) | Inter, JetBrains Mono |
|
|
472
|
+
| **minimal** | Dark | `#6366f1` (indigo) | Inter, JetBrains Mono |
|
|
473
|
+
|
|
474
|
+
Each theme uses Google Fonts for easy setup. See `templates/themes/README.md`.
|
|
475
|
+
|
|
476
|
+
## Related skills
|
|
477
|
+
|
|
478
|
+
- [improving-streamlit-design](../improving-streamlit-design/SKILL.md) - Visual polish with icons, badges, spacing
|
|
479
|
+
|
|
480
|
+
## References
|
|
481
|
+
|
|
482
|
+
- [Theming overview](https://docs.streamlit.io/develop/concepts/configuration/theming)
|
|
483
|
+
- [Colors and borders](https://docs.streamlit.io/develop/concepts/configuration/theming-customize-colors-and-borders)
|
|
484
|
+
- [Fonts](https://docs.streamlit.io/develop/concepts/configuration/theming-customize-fonts)
|
|
485
|
+
- [config.toml reference](https://docs.streamlit.io/develop/api-reference/configuration/config.toml)
|
|
486
|
+
- [st.context](https://docs.streamlit.io/develop/api-reference/caching-and-state/st.context)
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: displaying-streamlit-data
|
|
3
|
+
description: Displaying charts, dataframes, and metrics in Streamlit. Use when visualizing data, configuring dataframe columns, or adding sparklines to metrics. Covers native charts, Altair, and column configuration.
|
|
4
|
+
license: Apache-2.0
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Streamlit charts & data
|
|
8
|
+
|
|
9
|
+
Present data clearly.
|
|
10
|
+
|
|
11
|
+
## Choosing display elements
|
|
12
|
+
|
|
13
|
+
| Element | Use Case |
|
|
14
|
+
|---------|----------|
|
|
15
|
+
| `st.dataframe` | Interactive exploration, sorting, filtering |
|
|
16
|
+
| `st.data_editor` | User-editable tables |
|
|
17
|
+
| `st.table` | Static display, no interaction needed |
|
|
18
|
+
| `st.metric` | KPIs with delta indicators |
|
|
19
|
+
| `st.json` | Structured data inspection |
|
|
20
|
+
|
|
21
|
+
## Native charts first
|
|
22
|
+
|
|
23
|
+
Prefer Streamlit's native charts for simple cases.
|
|
24
|
+
|
|
25
|
+
```python
|
|
26
|
+
st.line_chart(df, x="date", y="revenue")
|
|
27
|
+
st.bar_chart(df, x="category", y="count")
|
|
28
|
+
st.scatter_chart(df, x="age", y="salary")
|
|
29
|
+
st.area_chart(df, x="date", y="value")
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Native charts support additional parameters: `color` for series grouping, `stack` for bar/area stacking, `size` for scatter point sizing, `horizontal` for horizontal bars. See the [chart API reference](https://docs.streamlit.io/develop/api-reference/charts) for full options.
|
|
33
|
+
|
|
34
|
+
## Human-readable labels
|
|
35
|
+
|
|
36
|
+
Use clear labels—not column names or abbreviations. Skip `x_label`/`y_label` if the column names are already readable.
|
|
37
|
+
|
|
38
|
+
```python
|
|
39
|
+
# BAD: cryptic column names without labels
|
|
40
|
+
st.line_chart(df, x="dt", y="rev")
|
|
41
|
+
|
|
42
|
+
# GOOD: readable columns, no labels needed
|
|
43
|
+
st.line_chart(df, x="date", y="revenue")
|
|
44
|
+
|
|
45
|
+
# GOOD: cryptic columns, add labels
|
|
46
|
+
st.line_chart(df, x="dt", y="rev", x_label="Date", y_label="Revenue")
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Altair for complex charts
|
|
50
|
+
|
|
51
|
+
Use Altair when you need more control. Altair is bundled with Streamlit (no extra install), while Plotly requires an additional package. Pick one and stay consistent throughout your app.
|
|
52
|
+
|
|
53
|
+
```python
|
|
54
|
+
import altair as alt
|
|
55
|
+
|
|
56
|
+
chart = alt.Chart(df).mark_line().encode(
|
|
57
|
+
x=alt.X("date:T", title="Date"),
|
|
58
|
+
y=alt.Y("revenue:Q", title="Revenue ($)"),
|
|
59
|
+
color="region:N"
|
|
60
|
+
)
|
|
61
|
+
st.altair_chart(chart)
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
**When to use Altair:**
|
|
65
|
+
- Custom axis formatting
|
|
66
|
+
- Multiple series with legends
|
|
67
|
+
- Interactive tooltips
|
|
68
|
+
- Layered visualizations
|
|
69
|
+
|
|
70
|
+
## Dataframe column configuration
|
|
71
|
+
|
|
72
|
+
Use `column_config` where it adds value—formatting currencies, showing progress bars, displaying links or images. Don't add config just for labels or tooltips that don't meaningfully improve readability. Works with both `st.dataframe` and `st.data_editor`.
|
|
73
|
+
|
|
74
|
+
```python
|
|
75
|
+
st.dataframe(
|
|
76
|
+
df,
|
|
77
|
+
column_config={
|
|
78
|
+
"revenue": st.column_config.NumberColumn(
|
|
79
|
+
"Revenue",
|
|
80
|
+
format="$%.2f"
|
|
81
|
+
),
|
|
82
|
+
"completion": st.column_config.ProgressColumn(
|
|
83
|
+
"Progress",
|
|
84
|
+
min_value=0,
|
|
85
|
+
max_value=100
|
|
86
|
+
),
|
|
87
|
+
"url": st.column_config.LinkColumn("Website"),
|
|
88
|
+
"logo": st.column_config.ImageColumn("Logo"),
|
|
89
|
+
"created_at": st.column_config.DatetimeColumn(
|
|
90
|
+
"Created",
|
|
91
|
+
format="MMM DD, YYYY"
|
|
92
|
+
),
|
|
93
|
+
"internal_id": None, # Hide non-essential columns
|
|
94
|
+
},
|
|
95
|
+
hide_index=True,
|
|
96
|
+
)
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
**Note on hiding columns:** Setting a column to `None` hides it from the UI, but the data is still sent to the frontend. For truly sensitive data, pre-filter the DataFrame before displaying.
|
|
100
|
+
|
|
101
|
+
**Dataframe best practices:**
|
|
102
|
+
- **Hide useless index:** `hide_index=True`
|
|
103
|
+
- **Or make index meaningful:** `df = df.set_index("customer_name")` before displaying
|
|
104
|
+
- **Hide internal/technical columns:** Set column to `None` in config (but pre-filter for sensitive data)
|
|
105
|
+
- **Use visual column types where they help:** sparklines for trends, progress bars for completion, images for logos
|
|
106
|
+
|
|
107
|
+
**Column types:**
|
|
108
|
+
- `AreaChartColumn` → Area sparklines
|
|
109
|
+
- `BarChartColumn` → Bar sparklines
|
|
110
|
+
- `CheckboxColumn` → Boolean as checkbox
|
|
111
|
+
- `DateColumn` → Date only (no time)
|
|
112
|
+
- `DatetimeColumn` → Dates with formatting
|
|
113
|
+
- `ImageColumn` → Images
|
|
114
|
+
- `JSONColumn` → Display JSON objects
|
|
115
|
+
- `LineChartColumn` → Sparkline charts
|
|
116
|
+
- `LinkColumn` → Clickable links
|
|
117
|
+
- `ListColumn` → Display lists/arrays
|
|
118
|
+
- `MultiselectColumn` → Multi-value selection
|
|
119
|
+
- `NumberColumn` → Numbers with formatting
|
|
120
|
+
- `ProgressColumn` → Progress bars
|
|
121
|
+
- `SelectboxColumn` → Editable dropdown
|
|
122
|
+
- `TextColumn` → Text with formatting
|
|
123
|
+
- `TimeColumn` → Time only (no date)
|
|
124
|
+
|
|
125
|
+
## Pinned columns
|
|
126
|
+
|
|
127
|
+
Keep important columns visible while scrolling horizontally:
|
|
128
|
+
|
|
129
|
+
```python
|
|
130
|
+
st.dataframe(
|
|
131
|
+
df,
|
|
132
|
+
column_config={
|
|
133
|
+
"Title": st.column_config.TextColumn(pinned=True), # Always visible
|
|
134
|
+
"Rating": st.column_config.ProgressColumn(min_value=0, max_value=10),
|
|
135
|
+
},
|
|
136
|
+
hide_index=True,
|
|
137
|
+
)
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
## Data editor
|
|
141
|
+
|
|
142
|
+
Use `st.data_editor` when users need to edit data directly:
|
|
143
|
+
|
|
144
|
+
```python
|
|
145
|
+
edited_df = st.data_editor(
|
|
146
|
+
df,
|
|
147
|
+
num_rows="dynamic", # Allow adding/deleting rows
|
|
148
|
+
column_config={
|
|
149
|
+
"status": st.column_config.SelectboxColumn(
|
|
150
|
+
"Status",
|
|
151
|
+
options=["pending", "approved", "rejected"]
|
|
152
|
+
),
|
|
153
|
+
},
|
|
154
|
+
)
|
|
155
|
+
|
|
156
|
+
# React to edits
|
|
157
|
+
if not edited_df.equals(df):
|
|
158
|
+
save_changes(edited_df)
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## JSON display
|
|
162
|
+
|
|
163
|
+
For structured data inspection. Accepts dicts, lists, or any JSON-serializable object:
|
|
164
|
+
|
|
165
|
+
```python
|
|
166
|
+
st.json({"name": "John", "scores": [95, 87, 92]})
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Sparklines in metrics
|
|
170
|
+
|
|
171
|
+
Add `chart_data` and `chart_type` to metrics for visual context.
|
|
172
|
+
|
|
173
|
+
```python
|
|
174
|
+
values = [700, 720, 715, 740, 762, 755, 780]
|
|
175
|
+
|
|
176
|
+
st.metric(
|
|
177
|
+
label="Developers",
|
|
178
|
+
value="762k",
|
|
179
|
+
delta="-7.42% (MoM)",
|
|
180
|
+
delta_color="inverse",
|
|
181
|
+
chart_data=values,
|
|
182
|
+
chart_type="line" # or "bar"
|
|
183
|
+
)
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
**Note:** Sparklines only show y-values and ignore x-axis spacing. Use them for evenly-spaced data (like daily or weekly snapshots). For irregularly-spaced time series, use a proper chart instead.
|
|
187
|
+
|
|
188
|
+
See `building-streamlit-dashboards` for composing metrics into dashboard layouts.
|
|
189
|
+
|
|
190
|
+
## References
|
|
191
|
+
|
|
192
|
+
- [st.dataframe](https://docs.streamlit.io/develop/api-reference/data/st.dataframe)
|
|
193
|
+
- [st.data_editor](https://docs.streamlit.io/develop/api-reference/data/st.data_editor)
|
|
194
|
+
- [st.column_config](https://docs.streamlit.io/develop/api-reference/data/st.column_config)
|
|
195
|
+
- [st.metric](https://docs.streamlit.io/develop/api-reference/data/st.metric)
|
|
196
|
+
- [st.json](https://docs.streamlit.io/develop/api-reference/data/st.json)
|
|
197
|
+
- [st.line_chart](https://docs.streamlit.io/develop/api-reference/charts/st.line_chart)
|
|
198
|
+
- [st.bar_chart](https://docs.streamlit.io/develop/api-reference/charts/st.bar_chart)
|
|
199
|
+
- [st.altair_chart](https://docs.streamlit.io/develop/api-reference/charts/st.altair_chart)
|