Procedural arts
Procedural arts are Slidura’s replacement for SmartArt: structured data goes in, a native PowerPoint diagram comes out. No AI, no external render service — the geometry engine runs synchronously in pure Python.
How it works
The artdeck engine accepts a layout ID and a data payload, solves the
geometry, and emits an SVG built from theme tokens (accent1, neutral, etc.)
rather than literal colours. The svgdeck pipeline then converts that SVG into
native PowerPoint shapes, picking up the template’s actual palette at build time.
The round-trip budget is under 100 ms; failures surface as validation errors, not
silently broken slides.
Two input shapes are supported:
| Input type | Used by |
|---|---|
list — items with optional title, description, value, status, icon, image | list, process, cycle, picture, board layouts |
table — rows with source, target, value, and meta columns | relationship, data-flow, and Sankey layouts |
tree — recursive nodes (id, title, description, value, collapsed, children) | hierarchy, grouped-list, roadmap, org-chart layouts |
graph — nodes + edges with optional values and labels | network, chord layouts |
Out-of-range data (too many items, depth exceeded, invalid edge references) raises
a validation error before any geometry is produced. Capacity limits are configured
per deployment (ART_MAX_ITEMS, ART_MAX_NODES, ART_MAX_EDGES,
ART_MAX_TREE_DEPTH).
Layout catalog — 35 layouts across 9 categories
List (4): vertical basic, horizontal cards, numbered steps, grouped columns
Process (8): horizontal, vertical, chevron, staircase, zigzag timeline, milestone timeline, CI/CD pipeline (status-aware colouring), value-stream map
Cycle (3): basic, segmented, hub-and-spoke
Hierarchy (4): indented list, org chart, horizontal tree, treemap (squarify)
Relationship (5): opposing, Venn, converging, force-directed network, chord diagram
Matrix (3): quadrant (2 × 2), grid, asymmetric SWOT
Pyramid / funnel (2): basic pyramid, conversion funnel (value-proportional)
Picture (2): accent list, team grid — geometry complete; image-asset wiring is deferred
Data & domain (4): Kanban board, roadmap swimlanes, Sankey (Bézier ribbons), sunburst
The workbench
Open MediaLib → Arts → New (or GET /arts/new) to build an art
interactively. The workbench shows a live SVG preview that re-renders on every
save. Pick a layout, choose a data input type, fill in the form or paste JSON,
and the preview updates. Saved arts persist to your account and can be promoted
to library scope.
The gallery at /media/arts/gallery renders all 35 layouts against
built-in sample fixtures so you can browse the full catalog before committing
to a layout.
Placing an art in a fill
Use the @art:<id> sentinel:
{ "diagram_1": "@art:<id>" }Agents can also supply an art inline without a stored asset:
{
"diagram_1": {
"$art": {
"layout_id": "process-chevron",
"structure_type": "list",
"data": { "items": [{ "title": "Discover" }, { "title": "Define" }, { "title": "Deliver" }] },
"options": {},
"theme": "template"
}
}
}Setting "theme": "template" (the default) derives colours from the template’s
palette. A stored art’s build_ref field always contains the ready-to-use sentinel.
Stateless geometry solve
POST /api/v1/arts/geometry accepts { layout_id, data, options, canvas } and
returns a GeometryDoc without storing anything. Use this to preview geometry
programmatically or to drive a custom renderer.
API and MCP surface
| Surface | Endpoints / tools |
|---|---|
| REST | GET /arts/layouts, GET /arts, POST /arts, GET /arts/{id}, PUT /arts/{id}, DELETE /arts/{id}, GET /arts/{id}/svg?profile=deck|web, GET /arts/{id}/geometry, POST /arts/geometry |
| MCP | list_art_layouts(), create_art(name, layout_id, data, options?, theme?), get_art(art_id) |
create_art validates the data payload by running the solver before persisting —
if the data is out of range or structurally invalid the call returns an error with
the specific constraint that was violated.
The svg endpoint accepts a profile parameter: deck emits clean
presentation-attribute SVG suitable for svgdeck; web adds id, class,
data-role attributes and CSS custom properties for interactive display.