Skip to main content

UIKitPR

O framework visual utility-first feito para PyReact.

PyPI Python PyReact License: MIT

Componentes acessíveis, temas, classes utilitárias e um motor próprio de motion em um pacote Python, sem pipeline Node obrigatório.

Site: https://wanbnn.github.io/uikitpr/

Por que UIKitPR?

Tailwind é excelente para compor layouts e Bootstrap acelera componentes comuns. O UIKitPR leva as duas ideias ao ecossistema PyReact:

  • classes utilitárias previsíveis (flex, gap-4, grid-cols-3, p-6);
  • componentes Python que retornam VNodes PyReact;
  • temas claro, escuro e customizados por CSS variables;
  • SSR, handlers e propriedades compatíveis com h() do PyReact;
  • CSS incluído no wheel e exportável pela CLI;
  • motion com spring, timelines, stagger, scroll, eventos e lifecycle;
  • cache web com fingerprint, manifesto, atualização e Service Worker;
  • loaders, skeletons e estados visuais prontos;
  • nenhuma dependência JavaScript ou etapa de compilação.

Instalação com PRPM

prpm add uikitpr

Também é possível instalar com pip install uikitpr.

Início rápido

from pyreact import h
from uikitpr import Button, Card, CardBody, Heading, Stack, UIProvider


def App(props):
    return UIProvider(
        Card(
            CardBody(
                Stack(
                    Heading("Olá, PyReact!", level=1),
                    Button("Começar", variant="primary", onClick=lambda: print("oi")),
                    gap=4,
                )
            )
        ),
        class_name="p-6",
        full_height=True,
    )

Os componentes aceitam filhos diretamente, como acima, ou através de h(Component, {"children": ...}):

h(Button, {"children": "Salvar", "variant": "outline"})

Essa forma explícita em props é importante na versão atual do PyReact, cujo renderer não transfere automaticamente os filhos de h(Component, props, *children) para componentes funcionais.

Utilitários

Use classes diretamente em className ou class_name:

from uikitpr import Box, cx

Box(
    "Conteúdo",
    class_name=cx(
        "flex items-center gap-4 p-6 rounded shadow",
        {"bg-primary-soft": destaque, "hidden": not visivel},
    ),
)

O CSS inclui layout flex/grid, espaçamento, sizing, tipografia, cores, bordas, sombras e variantes responsivas sem caracteres especiais, como md-grid-cols-3 e lg-grid-cols-4.

Componentes

Grupo Componentes
Layout Box, Container, Stack, Grid, Divider
Tipografia Heading, Text, Badge
Ações Button, IconButton
Formulários Input, Textarea, Select, Checkbox, Switch
Feedback Alert, Spinner, Progress, Modal
Dados e navegação Card, Table, Navbar, Breadcrumb, Avatar

Variantes mais usadas:

Button("Primário", variant="primary")
Button("Contorno", variant="outline", size="lg")
Badge("Ativo", tone="success", pill=True)
Alert("Confira os dados.", tone="warning", title="Atenção")
Input(label="E-mail", name="email", type="email", help_text="Seu acesso.")

Propriedades não consumidas pelo componente são encaminhadas ao VNode DOM, incluindo onClick, aria-*, data-*, style, id e name.

Temas

UIProvider inclui o CSS e configura o tema:

UIProvider(AppContent(), theme="dark", full_height=True)

Crie uma marca usando tokens:

from uikitpr import create_theme

brand = create_theme(
    "minha-marca",
    primary="#ff006e",
    primary_hover="#d9005d",
    radius="1rem",
)

UIProvider(AppContent(), theme=brand)

Motion, animações e eventos

UIProvider inclui o runtime UIKitPR Motion por padrão:

from uikitpr import Motion, Spring, Transition

Motion(
    Card(...),
    preset="fade-up",
    trigger="in-view",
    while_hover={"transform": "translateY(-6px) scale(1.02)"},
    while_tap={"transform": "scale(.97)"},
    transition=Transition(
        duration=.7,
        spring=Spring(stiffness=170, damping=18),
    ),
)

O motor oferece:

  • animações de mount, in-view, click, hover, tap, focus e scroll;
  • presets, keyframes customizados e spring physics;
  • MotionGroup com stagger e MotionTimeline para orchestration;
  • lifecycle via eventos uipr:motion:*;
  • API imperativa window.UIKitPRMotion;
  • MutationObserver para VNodes adicionados dinamicamente;
  • suporte a prefers-reduced-motion.

Consulte docs/MOTION.md para a API completa.

Cache web e deploy sem assets antigos

O CacheManager escreve assets com fingerprint SHA-256, um manifesto inspecionável e um Service Worker versionado. Assim, cada alteração ganha uma URL nova e versões antigas são removidas na ativação:

from pathlib import Path
from uikitpr import CacheManager, CachePolicy, cache_script, motion_script, stylesheet

cache = CacheManager(
    Path("public"),
    policy=CachePolicy(name="my-app", version="2026.07.27"),
)
css = cache.add_text("uikitpr.css", stylesheet())
motion = cache.add_text("uikitpr-motion.js", motion_script())
runtime = cache.add_text("uikitpr-cache.js", cache_script())
cache.finalize(precache=["./"])

print(css.path, motion.path, runtime.path)

Para registrar o Service Worker em uma árvore PyReact:

from uikitpr import CacheRuntime

CacheRuntime(
    src="/assets/uikitpr-cache.js",
    service_worker="/sw.js",
    manifest="/asset-manifest.json",
    version="2026.07.27",
    cache_name="my-app",
)

O cliente expõe window.UIKitPRCache.register(), refresh(), manifest(), status() e clear(). Consulte docs/CACHE.md.

Loaders e estados visuais

from uikitpr import OrbitLoader, Skeleton, SkeletonCard

OrbitLoader(size="lg")
Skeleton(lines=3)
SkeletonCard()

Também estão disponíveis DotsLoader, BarsLoader, RingLoader, PulseLoader, WaveLoader e PageLoader.

CSS externo e CSP

Por padrão, UIProvider inclui um <link> com o stylesheet em uma data: URL. Esse formato evita o escaping aplicado pelo SSR do PyReact a filhos de <style>. Para produção com CSP estrita, exporte e sirva o asset separadamente:

uikitpr css -o static/uikitpr.css
uikitpr css -o static/uikitpr.min.css --minify
uikitpr motion -o static/uikitpr-motion.js
uikitpr cache -o static/uikitpr-cache.js

Então use:

from uikitpr import Styles

Styles(href="/static/uikitpr.css")
UIProvider(AppContent(), with_styles=False)

Para renderização exclusivamente cliente, Styles(inline=True, nonce="...") também é suportado em políticas CSP baseadas em nonce.

Desenvolvimento

prpm install
prpm test
prpm pack
prpm verify dist

O exemplo completo está em examples/dashboard.py.

Site e GitHub Pages

O site oficial também é construído com PyReact e UIKitPR:

prpm run site
prpm run serve

O primeiro comando gera _site/; o segundo serve a página em http://localhost:8000. Pushes em main executam testes, geram o site estático e publicam no GitHub Pages.

Licença

MIT. Veja LICENSE.

Metadata

Release files for uikitpr 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for uikitpr 0.3.0
File Size Uploaded
uikitpr-0.3.0.tar.gz 39.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for uikitpr 0.3.0
File Interpreter ABI Platform
uikitpr-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 73.5 kB

Release files / uikitpr-0.3.0.tar.gz

Download URL uikitpr-0.3.0.tar.gz
Size 39.2 kB
Tags Source
SHA-256 checksum
How to use checksums
7181e2d3e4ac94f59c0ed096f7ebe8b5100472cc78e50f3eae29708bd6f4130c
BLAKE2b-256 checksum
How to use checksums
a51015e647f9b265808028e9eb5a5aa05b906af096911dc07ac45e26ca5144d6
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5

Release files / uikitpr-0.3.0-py3-none-any.whl

Download URL uikitpr-0.3.0-py3-none-any.whl
Size 34.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
8073875532f01670a955d311bacc56a6ae470541815a58de541fd1de6edf6aaf
BLAKE2b-256 checksum
How to use checksums
caeb1a50f97029f58bcf331465b806f0f25d87b194e6cfe5b9249d2ef4da6316
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.14.5
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page