Skip to main content

UI components for Python using Pydantic and Jinja2 templates

Project description

PyJinHx

Build reusable, type-safe UI components for template-based web apps in Python. PyJinHx combines Pydantic models with Jinja2 templates to give you template discovery, component composition, and JavaScript bundling.

  • Automatic Template Discovery: Place templates next to component files—no manual paths
  • JavaScript Bundling: Automatically collects and bundles .js files from component directories
  • Composability: Nest components easily—works with single components, lists, and dictionaries
  • Flexible: Use Python classes for reusable components, HTML syntax for quick page composition
  • Type Safety: Pydantic models provide validation and IDE support

Installation

pip install pyjinhx

Example

This single example shows the full setup (Python classes + templates) and both ways to render:

  • Python-side: instantiate a component class and call .render().
  • Template-side: render an HTML-like string with custom tags via Renderer.

Step 1: Define component classes

# components/ui/button.py
from pyjinhx import BaseComponent


class Button(BaseComponent):
    id: str
    text: str
    variant: str = "default"
# components/ui/card.py
from pyjinhx import BaseComponent
from components.ui.button import Button


class Card(BaseComponent):
    id: str
    title: str
    action_button: Button
# components/ui/page.py
from pyjinhx import BaseComponent
from components.ui.card import Card


class Page(BaseComponent):
    id: str
    title: str
    main_card: Card

Step 2: Create templates (auto-discovered next to the class files)

<!-- components/ui/button.html -->
<button id="{{ id }}" class="btn btn-{{ variant }}">{{ text }}</button>
<!-- components/ui/card.html -->
<div id="{{ id }}" class="card">
  <h2>{{ title }}</h2>
  <div class="action">{{ action_button }}</div>
</div>
<!-- components/ui/page.html -->
<main id="{{ id }}">
  <h1>{{ title }}</h1>
  {{ main_card }}
</main>

Step 3A: Python-side rendering (BaseComponent.render())

from components.ui.button import Button
from components.ui.card import Card
from components.ui.page import Page

page = Page(
    id="home",
    title="Welcome",
    main_card=Card(
        id="hero",
        title="Get Started",
        action_button=Button(id="cta", text="Sign up", variant="primary"),
    ),
)

html = page.render()

Step 3B: Template-side rendering (Renderer(...).render(source))

from pyjinhx import Renderer

renderer = Renderer("./components", auto_id=True)

html = renderer.render(
    """
    <Page title="Welcome">
      <Card title="Get Started">
        <Button text="Sign up" variant="primary"/>
      </Card>
    </Page>
    """
)

Template-side rendering supports:

  • Type safety for registered classes: if Button(BaseComponent) exists, its fields are validated when <Button .../> is instantiated.
  • Generic tags: if there is no registered class, a generic BaseComponent is used as long as the template file can be found.

JavaScript & extra assets

  • Component-local JS: if a component class MyWidget has a sibling file my-widget.js, it is auto-collected and injected once at the root render level.
  • Extra JS: pass js=[...] with file paths; missing files are ignored.
  • Extra HTML files: pass html=[...] with file paths; they are rendered and exposed in the template context by filename stem (e.g. extra_content.htmlextra_content.html wrapper). Missing files raise FileNotFoundError.

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.2.1.tar.gz (32.4 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.2.1-py3-none-any.whl (13.6 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for pyjinhx-0.2.1.tar.gz
Algorithm Hash digest
SHA256 560220c7ab2b2fe4ece01a0f0b6a05f3383999d08409f8c1b30788d59f96ddd3
MD5 d23728e0b17ee71f915ba656789c5d01
BLAKE2b-256 dce8b9a1d3e4fdbe9354cc7c7f3c0a960fd8e350ce6a2c53c5e4725cf4436ed0

See more details on using hashes here.

File details

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

File metadata

  • Download URL: pyjinhx-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 13.6 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.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 c798fed8316a6e35d92b09844fd6a17831504b63c26329fe8fdc4eee5eafa480
MD5 e5311cb865f4fb531cc5ce740843ea11
BLAKE2b-256 d44843dbfe3ba12a94c204b8c373fe96fd55ab67bad8e7f97e01a19a3e9543bd

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