lexigram-ui
HTMX/htpy component library for Lexigram web applications.
Overview
lexigram-ui provides server-rendered UI primitives — components, layouts, HTMX helpers, and rendering utilities — built on htpy for plain Python templates. It ships with atoms (Button, TextInput, Badge), molecules (Card, Modal, Tabs), organisms (Form, SlideOver), and layouts, all integrated via UIModule for DI wiring and config-driven defaults.
The library ships with ShadCN-compatible CSS variable design tokens in oklch color space, a polymorphic asChild pattern for slot-based composition, and a component CLI (lexigram-ui add) for scaffolding components into your project.
Install
uv add lexigram-ui
Quick Start
from lexigram.di.module import Module, module
from lexigram.ui.module import UIModule
from lexigram.ui.config import UIConfig
from lexigram.ui.atoms import Button
from lexigram.ui.core.base import Component, el, render_to_string
@module(imports=[UIModule.configure(UIConfig(default_theme="default"))])
class AppModule(Module):
pass
class SavePanel(Component):
def render(self) -> object:
return el(
"section",
el("h2", "Profile"),
Button("Save", hx_post="/profile/save"),
class_="bg-card text-card-foreground p-6 rounded-lg shadow-sm",
)
html = render_to_string(SavePanel())
Configuration
Zero-config usage: Call
UIModule.configure()with no arguments to use all defaults.
flowchart LR
subgraph Input["Configuration Sources"]
Y["application.yaml<br/>ui: section"]
E["Environment vars<br/>LEX_UI__*"]
P["Python API<br/>UIConfig(...)"]
end
UC["UIConfig<br/>merged + validated"]
UM["UIModule.configure"]
App["Application"]
Y --> UC
E --> UC
P --> UC
UC --> UM
UM --> App
Option 1 — YAML file
# application.yaml
ui:
default_theme: "default"
auto_escape: true
htmx_version: "2.0.4"
debug_components: false
theme: light
enable_sse: false
enable_realtime: false
Option 2 — Profiles + Environment Variables (recommended)
export LEX_UI__DEFAULT_THEME=default
export LEX_UI__DEBUG_COMPONENTS=false
export LEX_UI__THEME=dark
Option 3 — Python
from lexigram.ui.module import UIModule
from lexigram.ui.config import UIConfig
UIModule.configure(
UIConfig(
default_theme="default",
theme="dark",
enable_sse=True,
)
)
Config reference
| Field | Default | Env var | Description |
|---|---|---|---|
default_theme |
"default" |
LEX_UI__DEFAULT_THEME |
Default UI theme (default, dark, light, system) |
auto_escape |
true |
LEX_UI__AUTO_ESCAPE |
HTML-escape user-supplied strings by default |
htmx_version |
"2.0.4" |
LEX_UI__HTMX_VERSION |
HTMX asset version referenced in layout helpers |
debug_components |
false |
LEX_UI__DEBUG_COMPONENTS |
Render data-component debug attributes (dev only) |
theme |
"light" |
LEX_UI__THEME |
Active theme (light, dark, system) |
enable_sse |
false |
LEX_UI__ENABLE_SSE |
Enable server-sent event support |
enable_realtime |
false |
LEX_UI__ENABLE_REALTIME |
Enable realtime-oriented UI features |
Module Factory Methods
| Method | Description |
|---|---|
UIModule.configure(config, **kwargs) |
Register UIProvider with explicit UIConfig values |
UIModule.stub() |
Default no-op module for tests |
Key Features
- Core rendering primitives —
Component,Element,RawHTML,el,raw,render_to_string - Polymorphic
asChildpattern — slot-based composition viaas_childparameter onComponent,Button,Link,Card - ShadCN design tokens — CSS variable system in oklch color space:
SHADCN_DEFAULT_COLORS,SHADCN_DARK_COLORS,shadcn_css()generator,SEMANTIC_CLASSES - Theme system —
shadcn_css()generates complete:root/.darkCSS blocks with overridableprimary,background,foreground,radius, status colors - Component CLI —
lexigram-ui add <component>scaffolds components into your project (12 components in registry: button, card, modal, input, select, tabs, toast, tooltip, skeleton, form, badge, pagination) - HTMX helpers —
hx_get,hx_post,hx_target,hx_swap, and higher-level helpers - Server-Sent Events —
SSEMessageandSSEStreamfor realtime UI - Component library — atoms, molecules, organisms, and layouts organized by usage layer
- Context and swap zones —
UIContext,Zone,Zones,SwapMode - Error and response helpers —
validation_error,render_validation_errors,htmx_error_response - Accessibility —
AriaAttrs,SkipLink,announce, ARIA role helpers - Performance —
RenderCache,ResponseOptimizer,MetricsCollector - CSP requirements —
UI_CSP_REQUIREMENTSfor Content Security Policy configuration
Testing
async with Application.boot(modules=[UIModule.stub()]) as app:
# your test code
...
Key Source Files
| File | What it contains |
|---|---|
src/lexigram/ui/module.py |
UIModule.configure(), .stub() |
src/lexigram/ui/config.py |
UIConfig, DebounceConfig, HTMLDocumentConfig, BaseLayoutConfig, HeadConfig, FooterConfig, ToastConfig |
src/lexigram/ui/core/base.py |
Component, Element, el, render_to_string |
src/lexigram/ui/core/slot.py |
Slot — pass-through renderer for asChild pattern |
src/lexigram/ui/protocols.py |
RenderableProtocol |
src/lexigram/ui/styles/design_tokens.py |
SHADCN_DEFAULT_COLORS, SHADCN_DARK_COLORS, render_all_tokens() |
src/lexigram/ui/styles/theme.py |
shadcn_css() — complete CSS variable generation |
src/lexigram/ui/styles/tokens.py |
Semantic class maps (button, alert, toast, icon colors) |
src/lexigram/ui/atoms/__init__.py |
Button, TextInput, Badge, Icon |
src/lexigram/ui/molecules/__init__.py |
Card, Modal, Tabs, Toast |
src/lexigram/ui/organisms/__init__.py |
Form, SlideOver, Chart |
src/lexigram/ui/htmx/attrs.py |
hx_get, hx_post, hx_target, hx_swap |
src/lexigram/ui/htmx/sse.py |
SSEMessage, SSEStream |
src/lexigram/ui/cli/registry.py |
COMPONENT_REGISTRY, ComponentEntry — 12 registerable components |
src/lexigram/ui/cli/add.py |
lexigram-ui add CLI command (typer) |
src/lexigram/ui/constants.py |
UITheme, Breakpoint, UI_CSP_REQUIREMENTS |
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 lexigram_ui-0.1.4.tar.gz.
File metadata
- Download URL: lexigram_ui-0.1.4.tar.gz
- Upload date:
- Size: 255.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.8.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4001c4ccd00390d104fd4bba58e8633246cc38b88b0f861e881e5db836d6793d
|
|
| MD5 |
70084df8de613c91cb4f8d78d438344f
|
|
| BLAKE2b-256 |
5eccff4a57ce8d950d2c9d7b80399921705e744c7b7fb38cbf2187fb38ae05fe
|
File details
Details for the file lexigram_ui-0.1.4-py3-none-any.whl.
File metadata
- Download URL: lexigram_ui-0.1.4-py3-none-any.whl
- Upload date:
- Size: 252.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
uv/0.8.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
063f2f8942ef145ab0d35d655cb0516c0059a4dc3351a46d1925a16239730196
|
|
| MD5 |
278e2bb95e6e86c3e356f2877a15e544
|
|
| BLAKE2b-256 |
a729758e879c7e1f527e79e3a91a3eb30a987ca33902692c50e7c39811de2ac5
|