Named UI role recipes (panels, chrome, insets) for FastHTML applications — a stable abstraction layer over DaisyUI and Tailwind primitives.
Project description
cjm-fasthtml-design-system
Install
pip install cjm_fasthtml_design_system
Role in the Multi-Workflow Pipeline
This library sits between UI-bearing consumer libraries and the underlying styling primitives:
Consumers (page-centric libraries, host apps, demo apps)
↓ depend on
Layout primitives (cjm-fasthtml-app-core: page chrome, column+queue, toolbar)
↓ depend on
Design-system recipes (THIS LIBRARY: panels, chrome, insets, ...)
↓ depend on
Styling primitives (cjm-fasthtml-daisyui, cjm-fasthtml-tailwind: tokens)
Consumers import named roles (panels.dashboard_tile,
chrome.column_header) instead of reaching for styling tokens directly.
This makes coordinated styling changes a single-file edit in this
library rather than N-file edits across every consumer, and keeps the
role API stable across a potential future FastHTML-to-native port.
Design System Document
The authoritative specification of principles (P1–P12), conventions (V1–V10…), interaction archetypes, layout primitives, component primitives, gap catalog, and priority tasks lives in the living-reference Markdown document at:
claude-docs/design-system/multi-workflow-design-system.md
(hosted in the decomposition workflow repo — the doc governs UI/UX decisions across the entire multi-workflow pipeline and predates this code-side codification.)
This library is the running-code companion to that document. Each
codified convention maps to a notebook in nbs/:
| Convention | Notebook | Module | What it codifies |
|---|---|---|---|
| V10 Panel variants | nbs/panels.ipynb |
cjm_fasthtml_design_system.panels |
P1–P4 full-panel recipes |
| V10 Chrome variants | nbs/chrome.ipynb |
cjm_fasthtml_design_system.chrome |
C1–C2 column header/footer recipes |
| V10 Inset variants | nbs/insets.ipynb |
cjm_fasthtml_design_system.insets |
I1 opacity-modulated inset recipes |
Future codifications (icon-size roles, button roles, destructive-confirm composition, text-role tiers) will land as additional notebooks following the same convention-to-notebook mapping.
Usage
Every recipe module exports a module-level instance of a frozen dataclass. Consumers import the instance and use attribute access:
from fasthtml.common import Div
from cjm_fasthtml_design_system.panels import panels
from cjm_fasthtml_design_system.chrome import chrome
from cjm_fasthtml_design_system.insets import insets
from cjm_fasthtml_tailwind.core.base import combine_classes
from cjm_fasthtml_tailwind.utilities.sizing import w
from cjm_fasthtml_tailwind.utilities.spacing import m
# Stand-alone use
Div(..., cls=panels.structural_container)
# Composable with site-specific modifiers
Div(..., cls=combine_classes(w.full, m.t(4), panels.content_panel))
# Chrome sits inside a panel
Div(
Div('Header', cls=chrome.column_header),
Div('Body'),
Div('Status', cls=chrome.column_footer),
cls=panels.structural_container,
)
Why frozen dataclass: renaming a field is a breaking change announced in the type, which enforces namespace-as-public-contract discipline. Consumers can’t accidentally mutate roles at runtime. A native-platform port replaces the instantiation while keeping the class shape stable; consumer imports never move.
Why per-category modules: panels, chrome, and insets will evolve at different cadences. Keeping them separate means a change to one category doesn’t force re-export of the others.
Extending the Library
When a new convention emerges in the design-system document (e.g., G6
icon-size roles, V1 button-role codification, G8 destructive-confirm
composition), add a new notebook under nbs/ following the V10 pattern:
- Create
nbs/<category>.ipynbwith#| default_exp <category>. - Define a frozen
XVariantsdataclass enumerating the roles. - Instantiate it at module scope as a singleton (e.g.,
x_variants = XVariants(...)). - Add attribute-level tests asserting each role contains its expected primitives.
- Update this index’s convention-to-notebook table.
The recipe layer’s public contract is the set of dataclass class names and field names. Internal composition (which primitives each recipe combines) can evolve without breaking consumers as long as the field names stay stable.
Project Structure
nbs/
├── chrome.ipynb # Named chrome-role recipes for header and footer bands that accompany a content panel. Chrome uses directional borders (top or bottom) and intrinsic padding to signal its role as a structural band, with `border_radius.box` so it reads as a self-contained surface whether placed as a page-level sibling of a panel or nested inside one.
├── insets.ipynb # Named inset-role recipes for opacity-modulated low-emphasis regions *inside* a panel. Insets never stand alone — they're sub-regions that need visual grouping without adding a second panel border.
└── panels.ipynb # Named panel-role recipes for full content containers with `border_radius.box`. Each role composes a specific set of DaisyUI and Tailwind primitives and exposes a stable attribute-access API for consumers.
Total: 3 notebooks
Module Dependencies
graph LR
chrome[chrome<br/>Chrome Variants]
insets[insets<br/>Inset Variants]
panels[panels<br/>Panel Variants]
No cross-module dependencies detected.
CLI Reference
No CLI commands found in this project.
Module Overview
Detailed documentation for each module in the project:
Chrome Variants (V10) (chrome.ipynb)
Named chrome-role recipes for header and footer bands that accompany a content panel. Chrome uses directional borders (top or bottom) and intrinsic padding to signal its role as a structural band, with
border_radius.boxso it reads as a self-contained surface whether placed as a page-level sibling of a panel or nested inside one.
Import
from cjm_fasthtml_design_system.chrome import (
chrome,
ChromeVariants
)
Classes
class ChromeVariants:
"Named chrome-role recipes (V10). Header/footer bands with directional borders, rounded corners."
Inset Variants (V10) (insets.ipynb)
Named inset-role recipes for opacity-modulated low-emphasis regions inside a panel. Insets never stand alone — they’re sub-regions that need visual grouping without adding a second panel border.
Import
from cjm_fasthtml_design_system.insets import (
insets,
InsetVariants
)
Classes
class InsetVariants:
"Named inset-role recipes (V10). Opacity-modulated low-emphasis regions inside a panel."
Panel Variants (V10) (panels.ipynb)
Named panel-role recipes for full content containers with
border_radius.box. Each role composes a specific set of DaisyUI and Tailwind primitives and exposes a stable attribute-access API for consumers.
Import
from cjm_fasthtml_design_system.panels import (
panels,
PanelVariants
)
Classes
class PanelVariants:
"Named panel-role recipes (V10). Each field is a pre-composed CSS class string."
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cjm_fasthtml_design_system-0.0.2.tar.gz.
File metadata
- Download URL: cjm_fasthtml_design_system-0.0.2.tar.gz
- Upload date:
- Size: 10.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
67c1dc321090931655e01db17b8433b5ee9916b02dfbb4dcb1ea6697e80e2238
|
|
| MD5 |
a4387ac1ab45be49910f0e62d0ad58f1
|
|
| BLAKE2b-256 |
210bf5051545a020b2aca548f0dce8ab6be41f86ea17819115ba40101f53c07c
|
File details
Details for the file cjm_fasthtml_design_system-0.0.2-py3-none-any.whl.
File metadata
- Download URL: cjm_fasthtml_design_system-0.0.2-py3-none-any.whl
- Upload date:
- Size: 11.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
677e06d7868280d2d4e0f0f14ad50ce3fcc3cfc083e4261b7965d2fbd58aec8f
|
|
| MD5 |
43b29617070e87a41afc689abc12b333
|
|
| BLAKE2b-256 |
79283668cfb65491cd68fc014cdcec277a18a75ed3758ef2694719a12930fdb5
|