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.2.tar.gz (98.6 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.2-py3-none-any.whl (105.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: streamlit_facade-0.1.2.tar.gz
  • Upload date:
  • Size: 98.6 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.2.tar.gz
Algorithm Hash digest
SHA256 4d5538883b0d04ce82e18e21e31735abd4a467cab9f3b1c65345d5ea390db5e0
MD5 cf3d42d7e19ca5f186fe399d9e18ea4b
BLAKE2b-256 085467b1264962cffb23e36dcf869ee48e2ec42a4d63d344bff0ac4d2b247378

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for streamlit_facade-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 ffb7df7c272d19bee29d6188160744a1623a36c1ea26d58dd5744e033c1211c8
MD5 a47fb6bae1bfe8fd5cc2dd48eeac026b
BLAKE2b-256 ffb08a3070cc817e9913bb6104533dd97f76a41093e49006d0b5ef813ffdf4b9

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