UIKitPR
O framework visual utility-first feito para PyReact.
Componentes acessíveis, temas, classes utilitárias e um motor próprio de motion em um pacote Python, sem pipeline Node obrigatório.
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;
- 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;
MotionGroupcom stagger eMotionTimelinepara 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.
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
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.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| uikitpr-0.2.0.tar.gz | 32.4 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| uikitpr-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 60.3 kB
Release files / uikitpr-0.2.0.tar.gz
| Download URL | uikitpr-0.2.0.tar.gz |
|---|---|
| Size | 32.4 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
1aec60b0af5b879661ffd24c7a798ce2ad3625c3606a00739a72da76f1c1b872
|
|
BLAKE2b-256 checksum How to use checksums |
c03058a1ac54367e0110d61f3eca47380c267ebd226b929806922c62929a0491
|
| 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.2.0-py3-none-any.whl
| Download URL | uikitpr-0.2.0-py3-none-any.whl |
|---|---|
| Size | 28.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
2d2fd65236dc06b27474d5c343c979a65a20c86916ac289311f518d8845bcb26
|
|
BLAKE2b-256 checksum How to use checksums |
25e4d80d5c99d95b4543053548659b12fcde017cb342bb2963cf4decef779f6d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.14.5
|