axiom-coding-agent-setup 1.0.9 → 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.
Files changed (107) hide show
  1. package/.agents/skills/agent-browser/SKILL.md +55 -0
  2. package/.agents/skills/developing-with-streamlit/SKILL.md +220 -0
  3. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-chat-ui/SKILL.md +195 -0
  4. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/SKILL.md +233 -0
  5. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/packaged-components.md +212 -0
  6. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/state-sync.md +149 -0
  7. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/theme-css-variables.md +243 -0
  8. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-custom-components-v2/references/troubleshooting.md +121 -0
  9. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-dashboards/SKILL.md +147 -0
  10. package/.agents/skills/developing-with-streamlit/skills/building-streamlit-multipage-apps/SKILL.md +218 -0
  11. package/.agents/skills/developing-with-streamlit/skills/choosing-streamlit-selection-widgets/SKILL.md +139 -0
  12. package/.agents/skills/developing-with-streamlit/skills/connecting-streamlit-to-snowflake/SKILL.md +188 -0
  13. package/.agents/skills/developing-with-streamlit/skills/creating-streamlit-themes/SKILL.md +486 -0
  14. package/.agents/skills/developing-with-streamlit/skills/displaying-streamlit-data/SKILL.md +199 -0
  15. package/.agents/skills/developing-with-streamlit/skills/improving-streamlit-design/SKILL.md +191 -0
  16. package/.agents/skills/developing-with-streamlit/skills/optimizing-streamlit-performance/SKILL.md +323 -0
  17. package/.agents/skills/developing-with-streamlit/skills/organizing-streamlit-code/SKILL.md +91 -0
  18. package/.agents/skills/developing-with-streamlit/skills/setting-up-streamlit-environment/SKILL.md +128 -0
  19. package/.agents/skills/developing-with-streamlit/skills/using-streamlit-cli/SKILL.md +165 -0
  20. package/.agents/skills/developing-with-streamlit/skills/using-streamlit-custom-components/SKILL.md +170 -0
  21. package/.agents/skills/developing-with-streamlit/skills/using-streamlit-layouts/SKILL.md +229 -0
  22. package/.agents/skills/developing-with-streamlit/skills/using-streamlit-markdown/SKILL.md +207 -0
  23. package/.agents/skills/developing-with-streamlit/skills/using-streamlit-session-state/SKILL.md +144 -0
  24. package/.agents/skills/developing-with-streamlit/templates/.gitattributes +3 -0
  25. package/.agents/skills/developing-with-streamlit/templates/apps/README.md +188 -0
  26. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-companies/pyproject.toml +12 -0
  27. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-companies/streamlit_app.py +365 -0
  28. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute/pyproject.toml +12 -0
  29. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute/streamlit_app.py +461 -0
  30. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/.streamlit/secrets.toml.example +20 -0
  31. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/pyproject.toml +11 -0
  32. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/snowflake.yml +18 -0
  33. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-compute-snowflake/streamlit_app.py +527 -0
  34. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-feature-usage/pyproject.toml +12 -0
  35. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-feature-usage/streamlit_app.py +307 -0
  36. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics/pyproject.toml +12 -0
  37. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics/streamlit_app.py +426 -0
  38. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/.streamlit/secrets.toml.example +20 -0
  39. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/pyproject.toml +11 -0
  40. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/snowflake.yml +18 -0
  41. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-metrics-snowflake/streamlit_app.py +463 -0
  42. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-seattle-weather/pyproject.toml +12 -0
  43. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-seattle-weather/streamlit_app.py +252 -0
  44. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers/pyproject.toml +12 -0
  45. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers/streamlit_app.py +342 -0
  46. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/.streamlit/secrets.toml.example +20 -0
  47. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/pyproject.toml +11 -0
  48. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/snowflake.yml +18 -0
  49. package/.agents/skills/developing-with-streamlit/templates/apps/dashboard-stock-peers-snowflake/streamlit_app.py +384 -0
  50. package/.agents/skills/developing-with-streamlit/templates/themes/README.md +128 -0
  51. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/dracula.toml +39 -0
  52. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/github.toml +37 -0
  53. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/minimal.toml +39 -0
  54. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/nord.toml +39 -0
  55. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/snowflake.toml +42 -0
  56. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/solarized-light.toml +38 -0
  57. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/spotify.toml +34 -0
  58. package/.agents/skills/developing-with-streamlit/templates/themes/_configs/stripe.toml +35 -0
  59. package/.agents/skills/developing-with-streamlit/templates/themes/_shared/streamlit_app.py +336 -0
  60. package/.agents/skills/developing-with-streamlit/templates/themes/_templates/pyproject.toml.tmpl +12 -0
  61. package/.agents/skills/developing-with-streamlit/templates/themes/dracula/.streamlit/config.toml +39 -0
  62. package/.agents/skills/developing-with-streamlit/templates/themes/dracula/pyproject.toml +10 -0
  63. package/.agents/skills/developing-with-streamlit/templates/themes/dracula/streamlit_app.py +337 -0
  64. package/.agents/skills/developing-with-streamlit/templates/themes/github/.streamlit/config.toml +37 -0
  65. package/.agents/skills/developing-with-streamlit/templates/themes/github/pyproject.toml +10 -0
  66. package/.agents/skills/developing-with-streamlit/templates/themes/github/streamlit_app.py +337 -0
  67. package/.agents/skills/developing-with-streamlit/templates/themes/manage.py +332 -0
  68. package/.agents/skills/developing-with-streamlit/templates/themes/minimal/.streamlit/config.toml +39 -0
  69. package/.agents/skills/developing-with-streamlit/templates/themes/minimal/pyproject.toml +10 -0
  70. package/.agents/skills/developing-with-streamlit/templates/themes/minimal/streamlit_app.py +337 -0
  71. package/.agents/skills/developing-with-streamlit/templates/themes/nord/.streamlit/config.toml +39 -0
  72. package/.agents/skills/developing-with-streamlit/templates/themes/nord/pyproject.toml +10 -0
  73. package/.agents/skills/developing-with-streamlit/templates/themes/nord/streamlit_app.py +337 -0
  74. package/.agents/skills/developing-with-streamlit/templates/themes/snowflake/.streamlit/config.toml +42 -0
  75. package/.agents/skills/developing-with-streamlit/templates/themes/snowflake/pyproject.toml +10 -0
  76. package/.agents/skills/developing-with-streamlit/templates/themes/snowflake/streamlit_app.py +337 -0
  77. package/.agents/skills/developing-with-streamlit/templates/themes/solarized-light/.streamlit/config.toml +38 -0
  78. package/.agents/skills/developing-with-streamlit/templates/themes/solarized-light/pyproject.toml +10 -0
  79. package/.agents/skills/developing-with-streamlit/templates/themes/solarized-light/streamlit_app.py +337 -0
  80. package/.agents/skills/developing-with-streamlit/templates/themes/spotify/.streamlit/config.toml +34 -0
  81. package/.agents/skills/developing-with-streamlit/templates/themes/spotify/pyproject.toml +10 -0
  82. package/.agents/skills/developing-with-streamlit/templates/themes/spotify/streamlit_app.py +337 -0
  83. package/.agents/skills/developing-with-streamlit/templates/themes/stripe/.streamlit/config.toml +35 -0
  84. package/.agents/skills/developing-with-streamlit/templates/themes/stripe/pyproject.toml +10 -0
  85. package/.agents/skills/developing-with-streamlit/templates/themes/stripe/streamlit_app.py +337 -0
  86. package/.agents/skills/fastapi/SKILL.md +436 -0
  87. package/.agents/skills/fastapi/references/dependencies.md +142 -0
  88. package/.agents/skills/fastapi/references/other-tools.md +76 -0
  89. package/.agents/skills/fastapi/references/streaming.md +105 -0
  90. package/.agents/skills/frontend-design/LICENSE.txt +177 -0
  91. package/.agents/skills/frontend-design/SKILL.md +42 -0
  92. package/.agents/skills/gradio/SKILL.md +84 -0
  93. package/.agents/skills/gradio/references/api-signatures.md +115 -0
  94. package/.agents/skills/gradio/references/event-listeners.md +130 -0
  95. package/.agents/skills/gradio/references/examples.md +613 -0
  96. package/.agents/skills/ui-ux-pro-max/SKILL.md +659 -0
  97. package/.agents/skills/ui-ux-pro-max/data +1 -0
  98. package/.agents/skills/ui-ux-pro-max/scripts +1 -0
  99. package/.agents/stack.md +187 -187
  100. package/.env.axiom +8 -0
  101. package/AGENTS.md +2 -1
  102. package/README.md +19 -3
  103. package/bin/cli.js +11 -1
  104. package/opencode.json +12 -4
  105. package/package.json +1 -1
  106. package/skills-lock.json +36 -0
  107. 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)