Skip to main content

Storybook-like development tools for starlette-html components

Project description

starlette-html-stories

starlette-html-stories provides development tools for documenting, previewing, and testing starlette-html components in Starlette apps.

It gives you a simple way to:

  • collect component examples in one place
  • document design-system usage next to the component examples
  • render stories as isolated Starlette pages during development
  • pass example data as regular Python arguments
  • add story-local routes for HTMX interactions
  • wrap previews with your app layout when you want shared styling

The goal is to make your app UI easier to discover, reuse, and keep consistent as it grows.

You might also like my other Starlette packages that I use and maintain:

Package Description
starlette-html Python-first HTML DSL.
starlette-hot-reload Hot reload for static files.
starlette-tailwindcss Tailwind CSS builds.

Installation

uv add starlette-html-stories
# or
pip install starlette-html-stories

Usage

Step 1: Mount the stories app

Mount StoriesApp only in development.

from starlette.applications import Starlette
from starlette.routing import Mount
from starlette_html_stories import StoriesApp


app = Starlette(debug=True, routes=[...])

if app.debug:
    app.routes.append(
        Mount(
            "/__stories__",
            app=StoriesApp(directory="src/app/ui/stories"),
            name="stories",
        )
    )

Then open /__stories__/ in your browser.

Step 2: Write a component story

Stories are plain Python functions.

from app.ui.components import UserCard
from starlette_html_stories import stories, story

stories(title="Design System/UserCard", component=UserCard)

# Shows the default user card state used across the app.
@story(args={"user": {"name": "Ada", "email": "ada@example.com"}})
def Default(args):
    return UserCard(user=args["user"])

The leading comment is used as story documentation. You can also use a function docstring or pass docs= explicitly.

@story(args={"user": {"name": "Grace", "email": "grace@example.com"}})
def GraceHopper(args):
    """Shows a second user fixture for documentation and visual checks."""
    return UserCard(user=args["user"])

Preview Layout

Use preview_layout when stories should use your app shell, global CSS, or design-system layout.

from functools import partial

from app.ui.layouts import BaseLayout
from starlette_html_stories import StoriesApp


stories_app = StoriesApp(
    directory="src/app/ui/stories",
    preview_layout=partial(BaseLayout, page_title="Stories"),
)

This keeps each story focused on the component:

@story(args={"user": {"name": "Ada", "email": "ada@example.com"}})
def Default(args):
    return UserCard(user=args["user"])

HTMX-Friendly Stories

Story-local routes make interactive examples possible without wiring a story to your real business logic.

Use ctx.url_for(...) to point HTMX attributes at a route owned by the current story.

@story(routes=[Route("/load-more", load_more, name="load_more")])
def WithLoadMore(ctx):
    return Feed(
        hx_get=ctx.url_for("load_more"),
        hx_target="#feed",
    )

Example App

The repository includes a basic example.

uv run uvicorn examples.basic:app --reload

Open:

  • http://127.0.0.1:8000/
  • http://127.0.0.1:8000/__stories__/

License

MIT

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

starlette_html_stories-0.1.0.tar.gz (8.8 kB view details)

Uploaded Source

Built Distribution

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

starlette_html_stories-0.1.0-py3-none-any.whl (11.4 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: starlette_html_stories-0.1.0.tar.gz
  • Upload date:
  • Size: 8.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for starlette_html_stories-0.1.0.tar.gz
Algorithm Hash digest
SHA256 bc03965f15f12c4185ea0e291201970b2a301a12e62229a2b6b54715d0da1dc0
MD5 8940f6d234a2122004c9cf654acc81a6
BLAKE2b-256 c9850917a41b4e312e1a87192517dcea93f146f9cca7b69c615bf7349fdf11ff

See more details on using hashes here.

File details

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

File metadata

  • Download URL: starlette_html_stories-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 11.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: uv/0.11.3 {"installer":{"name":"uv","version":"0.11.3","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

File hashes

Hashes for starlette_html_stories-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1752db65f7394010ba3a9d077c8b44ea9a62bb5c72050cd2d158b6e6ae935198
MD5 6aebf449e64c4aa3ea2504f440199455
BLAKE2b-256 91b89064f95cb9ab423c493b7efed0aeba2b5d7c7d38e19f03021dc5d304b03d

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