This release is a pre-release and may not be stable for production use.
wA PyTincture Widgetset (wapyt)
wapyt is a lightweight widgetset for pyTincture that avoids the commercial DHTMLX dependency used by the legacy package. It focuses on a DOM-driven layout engine and a set of first-class widgets that can be composed entirely from Python when running inside Pyodide.
Highlights
- Theme-aware layout: Flexbox-based layout manager that mirrors the familiar
LayoutConfig/CellConfigAPI, supports nested rows/columns, and exposes helper methods such asattach_html,collapse,toggle,hide, etc. - Widgets that don’t require DHTMLX: Native Chat, CardPanel, TabWidget, Sidebar, ModalWindow, and ResourceBoard implementations with the streaming/events helpers the PyTincture samples expect.
MainWindowwrapper: Thin helper built on top ofLayoutso existing apps can continue to expose aMainWindowclass with no additional boilerplate.- PyTincture metadata: Exposes
__widgetset__ = "wapyt"so the platform can auto-discover the package name/version during***WIDGETSET***substitution. - Test/demo apps: Located under
tests/to show how to embed the widgets inside PyTincture applications.
Widget Catalog
Layout/MainWindow: Flexbox-driven layout primitives plus a drop-inMainWindowhelper that mirrors the legacy PyTincture entrypoint.Chat: Streaming chat surface with agent metadata, artifact events, and helpers for incremental responses.CardPanel: Searchable, template-driven card grid with add/view/action callbacks and custom renderers.TabWidget: Lightweight tab host that supports badges, closable tabs, and attaching HTML or PyTincture components per tab.Sidebar: Collapsible navigation rail with icons, badges, nested groups (a flyout when collapsed), headings, separators and a spacer for bottom-pinned items; keyboard navigable.ModalWindow: Simple modal shell that can host arbitrary Layout instances or HTML snippets.ResourceBoard: Master/detail resource explorer with selectable rows, action hooks, and optional add button wiring.message: Toasts plus awaitablealert/confirm/promptdialogs, styled and themed, in place ofwindow.confirm().Toolbar: Buttons, toggles, one-of-several groups, text, separators and spacers, dropping to icons when space runs out.ContextMenu: Right-click menus with icons, shortcut hints, danger and disabled items, checkable and radio items, separators and submenus; keyboard accessible.MenuBar: A File / Edit / View application menu whose titles open ContextMenu dropdowns; full menubar keyboard model.Kanban: A board of Listbox columns with counts, WIP limits (optionally strict), add-card buttons, collapsible and reorderable columns, a board-wide filter and selection.Listbox: Rich list items (fields or an escaped template) that can host live widgets, with actions, selection, a filter, and pointer and keyboard drag-and-drop within and between lists; the base for Kanban.Popupand tooltips: An anchored popover for pickers, help and small forms; styled, keyboard-reachable tooltips that replace nativetitletext across the widgets.ProgressBar/progress_html: Determinate or indeterminate bars with active/done/error/paused states, as a live widget or static markup.Pagination: First/previous/next/last, a page box or numbered buttons, a page-size selector and a "1–50 of 1,234" summary; copes with totals the server could not count.
Runtime Architecture
- Layouts and widgets are declared in Python but render as DOM nodes through the JavaScript bundles under
wapyt/assets/. Each helper (e.g.,Layout.add_chat) forwards config dictionaries directly to the matching JS constructor. - The
wapyt/_runtime.pybridge exposesrequire_jsto lazily inject JS/CSS exactly once per interpreter andcreate_proxyto keep Pyodide callback proxies alive for event handlers. - Layout cells are plain flexbox containers (
wapyt/assets/layout.js+wapyt/assets/wapyt.css), so attaching raw HTML or third-party widgets is as simple as callinglayout.attach_html(cell_id, markup). - Because everything routes through
window.wapyt, you can add new widgets by dropping a JS file intowapyt/assets/, exporting a constructor, and callingrequire_js("MyWidget")before instantiating it from Python.
Getting Started
cd wapyt
uv venv --python 3.13 && source .venv/bin/activate
uv pip install -e .
Then run a PyTincture example pointing at this widgetset:
cd ../pytincture
uv run pytincture launch_service --modules_folder ../wA_pytincture_widgetset/tests --port 8070
Open http://localhost:8070/layout_demo in your browser to see the native layout, and swap in chat_demo / cardpanel_demo / tabs_demo to explore the specialized widgets.
Package Layout
wapyt/
├── chat/ # Chat widget config + wrapper
├── cardpanel/ # CardPanel widget config + wrapper
├── layout/ # Layout/MainWindow helpers
├── modal/ # ModalWindow + config
├── resourceboard/ # ResourceBoard widget + config
├── sidebar/ # Sidebar widget config + wrapper
├── tabwidget/ # Tab widget config + wrapper
└── assets/ # JS + CSS evaluated automatically by PyTincture
Development Notes
- The JavaScript bundles define the
window.wapytnamespace and are evaluated automatically by PyTincture’s loader (seepytincture/frontend/pytincture.js). - Layout styles live in
assets/wapyt.css; adjust tokens there to integrate with your design system. - Message content is rendered by the escaping markdown renderer in
assets/chat.js. If a page also loadsmarked, the widget uses it only whenDOMPurifyis present as well —markedpasses raw HTML through, so without a sanitizer the widget falls back to its own renderer. - Artifact previews run in
<iframe sandbox="allow-scripts">with noallow-same-origin: artifact code is treated as untrusted and cannot reach the host page. tests/holds two different things: the*_demo.pyfiles are small, framework-free PyTincture apps you can copy/paste into your own projects, andtest_*.pyare CPython unit tests for the pure-Python half of the widgetset. Run the latter withuv run --group dev pytest tests/(orpytest tests/in an activated venv); they need no browser and no demo dependencies, andtests/conftest.pyputs the repo root onsys.pathso they work from a fresh clone.
License
MIT – see pyproject.toml for details.
Metadata
Release files for wapyt 0.2.0.dev1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| wapyt-0.2.0.dev1.tar.gz | 385.9 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| wapyt-0.2.0.dev1-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 795.7 kB
Release files / wapyt-0.2.0.dev1.tar.gz
| Download URL | wapyt-0.2.0.dev1.tar.gz |
|---|---|
| Size | 385.9 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
4ee4d2c9b06dec8d6f56b9e770f2d42f8763aff24100db38b51ceb64eb2aa1b3
|
|
BLAKE2b-256 checksum How to use checksums |
7aec335ea1e52b3afd10c80cd7b7d99cb4cbc65986b10d2565ff86204236743d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency logRelease files / wapyt-0.2.0.dev1-py3-none-any.whl
| Download URL | wapyt-0.2.0.dev1-py3-none-any.whl |
|---|---|
| Size | 409.8 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c04e107fec8adef24c905fcad5d7c51fd7c393ac59b189279304c672d5741832
|
|
BLAKE2b-256 checksum How to use checksums |
64cca950ce5664aa2d5d00167cd919143d26626a5ec06ee4e00ed47aad4c4a0d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 8, 2026.
Transparency log