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.0.tar.gz (97.7 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.0-py3-none-any.whl (103.2 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: streamlit_facade-0.1.0.tar.gz
  • Upload date:
  • Size: 97.7 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.0.tar.gz
Algorithm Hash digest
SHA256 33881a437f1c76ad8ad7ed4a8a70b1183debcd3623d2f723b02a703301ea2619
MD5 900f6f2f3ff7064fd0e18b55124e31d4
BLAKE2b-256 e9cb1bee7651d4d760fce333ccf5506bf7b812d26f7748d036819200a361a6c9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for streamlit_facade-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 e0394425648ec8e93d4df8f625e2f91218a1a837d664c5de41138b835f30fd84
MD5 89f2d30c01a341390727b4f4929adabf
BLAKE2b-256 051e5a66312a529ed25b4494d931ffd19b2eaafb28c660bd9a00c8803adb29f1

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