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
  • 76 named icons — unified icon registry; use the same name in every component. Full Lucide library (1500+ icons) also 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
burgundy Deep burgundy, warm neutral

Components

Form

facade.Button("Click me", variant="default", icon="save")
facade.LinkButton("GitHub", url="https://github.com", variant="outline", icon="external-link")
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 ships a registry of 76 named icons that work everywhere — buttons, alerts, accordions, toasts. One name, consistent across all components:

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

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

# See all 76 registered icon names
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.1.tar.gz (98.5 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.1-py3-none-any.whl (104.7 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: streamlit_facade-0.1.1.tar.gz
  • Upload date:
  • Size: 98.5 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.1.tar.gz
Algorithm Hash digest
SHA256 c47f6fc0fa8bf32df156ac949667fd67962c8ca28bcc05185abcee245513ed38
MD5 9108ded7396f8315a4b5844a8fa8cc16
BLAKE2b-256 39f1a31f2fb8bc8850c7c45ba7ae929c25042a8870bcefa89d2f33cfdcd2833a

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for streamlit_facade-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 afc6649ce8238d8f849073c6fc6e86de82db0bca623fb1dd129a147ceb59a58c
MD5 36ddaa7050f0d59f9c6116bf7cdf0100
BLAKE2b-256 eb834a8f311aedc53b390f857cb52988d9215e4e892636ebde4f05adead7cfe0

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