Skip to main content

UI components for Python using Pydantic and Jinja2 templates

Project description

PyJinHx

Pydantic Jinja HTMX

Type-safe UI components for Python web apps. A component is a Pydantic model plus a Jinja template sitting next to it — nest them with PascalCase tags, and co-located JS/CSS is collected automatically at render.

pip install pyjinhx

Example

A Card that renders a Button — the tag's attributes become validated Pydantic fields:

# components/button.py
from pyjinhx import BaseComponent

class Button(BaseComponent):
    id: str
    text: str
    variant: str = "default"
<!-- components/button.html -->
<button id="{{ id }}" class="btn btn-{{ variant }}">{{ text }}</button>
<!-- components/card.html -->
<div id="{{ id }}" class="card">
  <h2>{{ title }}</h2>
  <Button id="cta" text="{{ button_text }}" variant="primary"/>
</div>
# components/card.py
from pyjinhx import BaseComponent, Renderer

class Card(BaseComponent):
    id: str
    title: str
    button_text: str = "Sign up"

Renderer.set_default_environment("./components")
html = Card(id="hero", title="Get Started").render()

Drop a button.css or card.js next to the component and it's included once, automatically.

Reactivity (HTMX)

Components declare what state they depend on. Return one component from a mutation route — every other mounted region that reacts to the same keys updates via out-of-band swaps, no manual wiring:

from pyjinhx import ReactiveComponent, MutationKey, mutates, setup

class Keys(MutationKey):
    TODOS = "todos"

class Counter(ReactiveComponent, react={Keys.TODOS}):
    remaining: int

    @classmethod
    def load(cls) -> "Counter":
        return cls(remaining=db.remaining())

@mutates(Keys.TODOS)
def toggle_all():
    db.toggle_all()

setup(app)  # FastAPI: lifespan + middleware, done

@app.post("/todos/toggle")
def toggle():
    toggle_all()
    return Counter.render()  # other regions reacting to TODOS update too

Learn more

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

pyjinhx-0.10.1.tar.gz (278.2 kB view details)

Uploaded Source

Built Distribution

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

pyjinhx-0.10.1-py3-none-any.whl (127.3 kB view details)

Uploaded Python 3

File details

Details for the file pyjinhx-0.10.1.tar.gz.

File metadata

  • Download URL: pyjinhx-0.10.1.tar.gz
  • Upload date:
  • Size: 278.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for pyjinhx-0.10.1.tar.gz
Algorithm Hash digest
SHA256 facd617a4117821b229aa8eb7deeac49ce0f2798b88a0e2750e313f713e0c49f
MD5 806cb8598eeb70b42a0932145aa995ae
BLAKE2b-256 a203dc3c7585955e6620ecef20d8aa63717e57abefc2748a7f92185d52301aeb

See more details on using hashes here.

File details

Details for the file pyjinhx-0.10.1-py3-none-any.whl.

File metadata

  • Download URL: pyjinhx-0.10.1-py3-none-any.whl
  • Upload date:
  • Size: 127.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.9.25

File hashes

Hashes for pyjinhx-0.10.1-py3-none-any.whl
Algorithm Hash digest
SHA256 ba591e4e543c10b4fff8aace83b2fa719492edb64844c939f7d08169f17b3083
MD5 79d9d121ddf012ad014e8135670f6a66
BLAKE2b-256 646b4b94e35cc37c9fc5ac0d0a53638a5fcb4b6510c734a38ca093306c123ef6

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