Skip to main content

streamlit but different

Project description

facade

streamlit but different

facade is a shadcn-inspired, themeable UI component library for Streamlit. Define your colors, fonts, and radius once every component picks it up automatically.

pip install streamlit-facade

Quick start

import streamlit as st
import facade

facade.theme.apply(
    preset="carbon-sage",
    font_sans="DM Sans",
    font_link="https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;600;700&display=swap",
    radius="md",
)

facade.Alert("Welcome to facade!", variant="success", title="Hello")
facade.Button("Get started", icon="arrow-right", icon_position="right")
facade.Card(title="facade", description="streamlit but different")

Why facade?

Streamlit is powerful but opinionated about looks. facade gives you a proper design token system one theme.apply() call and your entire app gets a consistent, professional look without touching CSS.

  • No build pipeline — pure Python, no Node, no npm, no React
  • shadcn-inspired — clean, minimal components modeled after the best design system in the React ecosystem
  • Token system — define colors once, every component inherits automatically
  • Dark mode — every preset ships with a light and dark variant
  • Lucide icons — 1500+ icons available via facade.Icon()

Theme system

facade.theme.apply(
    preset="carbon-sage",      # built-in preset
    base="light",              # "light" | "dark"
    primary="#8FAF3D",         # override any token
    background="#F7F7F5",
    font_sans="DM Sans",
    font_link="https://fonts.googleapis.com/...",
    radius="md",               # xxs | sm | md | lg | xl
)

Built-in presets

Preset Style
default Classic blue, professional
default-dark Deep navy dark mode
minimal Near-black, tight radius
warm Amber accent, warm cream
dark Blue accent, dark slate
carbon-sage Sage green, warm chalk
carbon-sage-dark Sage green, warm carbon dark
carbon-light Electric lime, warm white
carbon-dark Electric lime, pure dark
carbon-amber Amber accent, warm carbon
daniyal Navy brand theme

Components

Form

facade.Button("Click me", variant="default", icon="save")
facade.Input(label="Email", placeholder="you@example.com")
facade.Select(options=["A", "B", "C"], placeholder="Pick one")
facade.Textarea(label="Message", placeholder="Write something...")
facade.Checkbox("Accept terms", key="chk1")
facade.Radio(options=["Free", "Pro"], label="Plan", key="radio1")
facade.Toggle("Dark mode", key="tog1")
facade.Slider("Volume", min_value=0, max_value=100, value=50)
facade.DatePicker(label="Select date")

Display

facade.Card(title="Title", description="Supporting text")
facade.Alert("Something happened", variant="success", title="Done!")
facade.Badge("New", variant="success")
facade.Badge("Pro", bg_color="#7C3AED", text_color="#fff")
facade.Metric(label="Revenue", value="$24,500", delta="12%")
facade.Separator()
facade.Separator(label="or")
with facade.Spinner("Loading..."):
    time.sleep(2)

Layout

tab1, tab2 = facade.Tabs(["Overview", "Settings"])
with tab1:
    st.write("Overview content")

with facade.Accordion("Details", icon="info"):
    st.write("Hidden content")

facade.Toast("Saved!", icon="check")

with facade.Sidebar(logo="logo.png", footer="v0.1.0"):
    if st.button("Home", key="nav_home"):
        st.session_state.page = "Home"
        st.rerun()

Data

facade.Progress(value=75, label="Uploading...")
st.dataframe(df, use_container_width=True)  # themed automatically

Icons

facade uses a unified icon system one name works everywhere:

# In components
facade.Button("Save", icon="save")
facade.Alert("Done", variant="success")  # icon auto-selected

# Standalone SVG (for custom HTML)
from facade.lucide import icon_html
svg = icon_html("circle-check", size=16, color="var(--primary)")

# See all available icons
facade.icon_names()

Button icons use Material Symbols (native Streamlit). HTML component icons use Lucide SVGs. facade handles the translation you always use the same name.


Sidebar

with facade.Sidebar(
    logo="assets/logo.png",
    logo_width=200,
    title="My App",
    footer="v1.0.0",
    active=st.session_state.page,
    nav_keys={"Home": "nav_home", "Dashboard": "nav_dash"},
):
    if st.button("Home", key="nav_home"):
        st.session_state.page = "Home"
        st.rerun()
    if st.button("Dashboard", key="nav_dash"):
        st.session_state.page = "Dashboard"
        st.rerun()

Token reference

facade.theme.apply(
    preset="default",
    base="light",                    # "light" | "dark"
    primary="#1059A0",
    primary_foreground="#FFFFFF",
    background="#FFFFFF",
    foreground="#0F172A",
    muted="#F1F5F9",
    muted_foreground="#64748B",
    border="#E2E8F0",
    destructive="#EF4444",
    chrome_background="#1059A0",     # sidebar + topbar background
    chrome_foreground="#E8EDF2",     # sidebar + topbar text
    chrome_border="#1E6FBE",         # sidebar + topbar border
    font_sans="Inter",
    font_mono="JetBrains Mono",
    font_link="https://fonts.googleapis.com/...",
    radius="md",                     # xxs | sm | md | lg | xl
)

Requirements

  • Python 3.8+
  • Streamlit 1.35.0+

License

MIT © Daniyal M


Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

streamlit_facade-0.1.6.tar.gz (99.3 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

streamlit_facade-0.1.6-py3-none-any.whl (106.3 kB view details)

Uploaded Python 3

File details

Details for the file streamlit_facade-0.1.6.tar.gz.

File metadata

  • Download URL: streamlit_facade-0.1.6.tar.gz
  • Upload date:
  • Size: 99.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.3

File hashes

Hashes for streamlit_facade-0.1.6.tar.gz
Algorithm Hash digest
SHA256 52e480f21916958acce57e5ae8d5472600732639fe572de0438fa3f48dafbeae
MD5 d47f3f303637a66e46749a34a95ba379
BLAKE2b-256 a7afce42c067b1022f002e8c9538ec3b72ce1d7240194fb471ed2d12341f7cc8

See more details on using hashes here.

File details

Details for the file streamlit_facade-0.1.6-py3-none-any.whl.

File metadata

File hashes

Hashes for streamlit_facade-0.1.6-py3-none-any.whl
Algorithm Hash digest
SHA256 d868beba2a8af03af0c779c969d09c6f2127613806f13e19dd588fe4a609b2c3
MD5 112b4d8af7623cff88858ad489286840
BLAKE2b-256 a9811f888ec80560acfbf4bf12d5caf2733eacee423d1f33a4f3e85c836980f7

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page