Skip to content
GitHubDiscord

UI (lexigram-ui)

HTMX/htpy component library for Lexigram web applications.


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.


Terminal window
uv add lexigram-ui
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", enable_sse=True))])
class AppModule(Module):
pass
class SavePanel(Component):
def render(self) -> object:
return el(
"section",
el("h2", "Profile"),
Button("Save", hx_post="/profile/save"),
class_="space-y-4",
)
html = render_to_string(SavePanel())

Zero-config usage: Call UIModule.configure() with no arguments to use all defaults.

application.yaml
ui:
default_theme: "default"
auto_escape: true
htmx_version: "2.0.4"
debug_components: false
Section titled “Option 2 — Profiles + Environment Variables (recommended)”
Terminal window
export LEX_UI__DEFAULT_THEME=default
export LEX_UI__DEBUG_COMPONENTS=false
from lexigram.ui.module import UIModule
from lexigram.ui.config import UIConfig
UIModule.configure(
UIConfig(
default_theme="default",
enable_sse=True,
)
)
FieldDefaultEnv varDescription
default_theme"default"LEX_UI__DEFAULT_THEMECSS theme applied to all components
auto_escapetrueLEX_UI__AUTO_ESCAPEHTML-escape user-supplied strings by default
htmx_version"2.0.4"LEX_UI__HTMX_VERSIONHTMX asset version referenced in layout helpers
debug_componentsfalseLEX_UI__DEBUG_COMPONENTSRender data-component debug attributes (dev only)
enable_ssefalseLEX_UI__ENABLE_SSEEnable server-sent event support
enable_realtimefalseLEX_UI__ENABLE_REALTIMEEnable realtime-oriented UI features
MethodDescription
UIModule.configure(config, **kwargs)Register UIProvider with explicit UIConfig values
UIModule.stub()Default no-op module for tests
  • Core rendering primitivesComponent, Element, RawHTML, el, raw, render_to_string
  • HTMX helpershx_get, hx_post, hx_target, hx_swap, and higher-level helpers
  • Server-Sent EventsSSEMessage and SSEStream for realtime UI
  • Component library — atoms, molecules, organisms, and layouts organized by usage layer
  • Context and swap zonesUIContext, Zone, Zones, SwapMode
  • Error and response helpersvalidation_error, render_validation_errors, htmx_error_response
FileWhat it contains
src/lexigram/ui/module.pyUIModule.configure(), .stub()
src/lexigram/ui/config.pyUIConfig
src/lexigram/ui/core/base.pyComponent, Element, el, render_to_string
src/lexigram/ui/protocols.pyRenderableProtocol
src/lexigram/ui/atoms/__init__.pyButton, TextInput, Badge, Icon
src/lexigram/ui/molecules/__init__.pyCard, Modal, Tabs, Toast
src/lexigram/ui/organisms/__init__.pyForm, SlideOver, Chart
src/lexigram/ui/htmx/htmx.pyhx_get, hx_post, hx_target, hx_swap
src/lexigram/ui/htmx/sse.pySSEMessage, SSEStream