Icon composition
Shapes
The four DTPR shape primitives.
Shapes
A category's
shape field picks one of four bundled primitives. Shapes are not version-pinned — they live in the worker code.The primitives
The compositor bundles four shape paths, all in a 36×36 viewBox with stroke-width="2":
| Shape | d outline | Where it's used |
|---|---|---|
circle | Circle of radius 16 centered at (18, 18). | Decorative / balanced categories. |
hexagon | Pointed-top regular hexagon inscribed in the 36×36 box. | Default category shape. |
octagon | Regular octagon. | Warning / attention categories. |
rounded-square | 30×30 square with 3-px corner radius, inset by 3 from each edge. | Utility / grid categories. |
The exact d values live in api/src/icons/shapes.ts.
How a category picks a shape
Every category in a schema declares a shape field on its manifest:
{
"id": "purpose",
"shape": "hexagon",
"context": { "values": [ { "id": "commercial", "color": "#0052CC" } ] }
}
You can read a category's shape via list_categories or GET /schemas/:version/categories. Invalid shape names are rejected at schema build time.
Serving shapes directly
GET /api/v2/shapes/:shape.svg
Returns a bare 36×36 SVG with the shape fragment (stroke #000, no fill). See REST icon routes.