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.3.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.3-py3-none-any.whl (105.5 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: streamlit_facade-0.1.3.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.3.tar.gz
Algorithm Hash digest
SHA256 25ade8adae2d5347655a521ac40de6a9bd5e61175e58c3cc7b684e515d112350
MD5 03fefec8f366e9e8a37e340783fc2aad
BLAKE2b-256 412d0b335c33e950fb7b1c9d36791599fef92959b99891d581c490efbbf5cdd9

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for streamlit_facade-0.1.3-py3-none-any.whl
Algorithm Hash digest
SHA256 fd599a9096e744d6fa7e34578c89f4c7dac54a598b9769c5ad5af502353ae808
MD5 defa78344a5202517adc161bc4badd6d
BLAKE2b-256 f9f6907975c6c5e179f1652e51a6e2c5c8a15ec21bd7f45ee0bb5259684af813

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