Trees, by Pierre, for spaday
Overview
spaday-trees wraps Pierre's imperative FileTree in a <spaday-tree> custom element and exposes it
as the Python Tree component. The first release supports reactive path replacement, selected paths,
search, Git status, and path-based selection-change / search-change events.
Setting selected_paths reveals the selection — ancestor directories are expanded automatically and
the first selected path is scrolled into view. This reveal behaviour is a supported contract. A bare
string is coerced to a one-element list; other non-list values raise a TypeError.
The virtualized tree needs a height: give the element or an ancestor one (the quick example uses
.style(height="22rem")). Without one, the package stylesheet applies a min-height fallback of
200px, overridable through the --trees-min-height CSS variable. A tree that still measures zero
height with non-empty paths logs a one-time console warning.
The tree follows the ecosystem's page-mode convention: wa-dark on the root (e.g.
App.bind_root_class("wa-dark", …)) switches it to its dark colours and wa-light flips a nested
island back — no consumer CSS needed.
Documentation
- Build a reactive project tree — guided first application.
- Synchronize paths, selection, and search — task-focused recipes.
- API reference — props, events, and package descriptor.
- Why Trees uses an imperative wrapper — integration design and tradeoffs.
Quick example
This app filters the tree as you type. The button changes its selected path through spaday's reactive store; selecting and expanding nodes in the tree remains client-side.
from spaday import SetField, element
from spaday.backends.starlette import serve
from spaday_trees import Tree
paths = [
"README.md",
"pyproject.toml",
"src/app.py",
"src/components/tree.py",
"tests/test_app.py",
]
tree = (
Tree(paths=paths)
.bind("search", "query")
.bind("selected_paths", "selected")
.style(height="22rem")
)
page = (
element("main")
.style(max_width="42rem", margin="2rem auto", font_family="system-ui")
.child(element("h1").text("Project files"))
.child(
element("input", type="search", placeholder="Filter files…")
.bind("value", "query", mode="two-way")
.style(width="100%", padding="0.6rem", margin_bottom="0.75rem")
)
.child(element("button").text("Select README").on("click", SetField("selected", ["README.md"])))
.child(tree)
)
app = serve(page, packages=["trees"], store={"query": "", "selected": []})
Save this as app.py, then run pip install spaday-trees starlette uvicorn and
uvicorn app:app. Open http://127.0.0.1:8000.
Installing this project registers the trees entry point with spaday. The equivalent explicit forms
are packages=[spaday_trees.package] and packages=["spaday_trees:package"].
The integration pins @pierre/trees 1.0.0-beta.5. Rename, drag-and-drop persistence, custom
composition renderers, and SSR/hydration are intentionally deferred while its beta API settles.
Testing
Rows render inside the shadow root of the engine's <file-tree-container> element, so innerText
or childElementCount on the <spaday-tree> host show nothing even when rendering works. Row
labels are fragmented for truncation, so text selectors fail. Use the stable hooks instead: each
rendered row carries [data-item-path] (its path, directories with a trailing /) and
[role="treeitem"].
Run the local example
python -m pip install -e ".[examples]"
python -m spaday_trees.example
Open http://127.0.0.1:8016 to inspect the complete project-explorer example: reactive
server path updates, selection, built-in search, Git status, responsive styling, and client events logged
by Python. It passes the local package descriptor directly, so it does not install or resolve the
integration from GitHub.
[!NOTE] This library was generated using copier from the Base Python Project Template repository.
Metadata
Release files for spaday-trees 0.2.4
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| spaday_trees-0.2.4.tar.gz | 384.5 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| spaday_trees-0.2.4-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 729.2 kB
Release files / spaday_trees-0.2.4.tar.gz
| Download URL | spaday_trees-0.2.4.tar.gz |
|---|---|
| Size | 384.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
3dcd695083730058a954cd20d496e9d1dcebed8d7d9ff065a50601b9a3829a54
|
|
BLAKE2b-256 checksum How to use checksums |
874592af127fb0ac32db1f3f528b2c8dc1e68243ceb543732c1dd8a2a65d172e
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|
Release files / spaday_trees-0.2.4-py3-none-any.whl
| Download URL | spaday_trees-0.2.4-py3-none-any.whl |
|---|---|
| Size | 344.7 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
c9cbba468b86387ba9657d1ecbfe5a1c4909553bcb25aebb95f9df64a7488f9e
|
|
BLAKE2b-256 checksum How to use checksums |
0d0ffa274a9733c5fe462423e7eb5c6a4b00edb1057dff3322239688837e77f3
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.14
|