Layout tree (as in design/layout.json)
{
"pattern": "gallery.constructivist-montage",
"kind": "gallery",
"grid": {
"photo1": "1-5",
"title": "7-12",
"photo2": "4-10"
},
"slots": [
"sectionLabel",
"title",
"gallery1",
"gallery2",
"caption"
],
"notes": "Photos overlap on purpose (columns 4–5); the second photo sits on top. No frames, no rounded corners.",
"tree": {
"el": "grid",
"gap": 2,
"rowGap": 2,
"children": [
{
"el": "media",
"span": "1-5",
"rowSpan": "1-2",
"slot": "gallery1",
"aspect": "4/5",
"treatment": "grayscale"
},
{
"el": "box",
"span": "7-12",
"rowSpan": "1-1",
"alignSelf": "start",
"gap": 2,
"children": [
{
"el": "text",
"slot": "sectionLabel",
"role": "label",
"transform": "uppercase",
"tracking": "wide"
},
{
"el": "text",
"slot": "title",
"role": "h2",
"step": 5,
"transform": "uppercase",
"tracking": "tight",
"leading": "tight",
"maxCh": 14,
"rotate": -6
}
]
},
{
"el": "shape",
"span": "6-12",
"rowSpan": "2-2",
"mobile": "hide",
"alignSelf": "start",
"kind": "bar",
"size": "md",
"fill": "heading",
"rotate": -20
},
{
"el": "shape",
"span": "11-12",
"rowSpan": "2-2",
"mobile": "hide",
"alignSelf": "end",
"kind": "circle",
"size": "lg",
"fill": "accent"
},
{
"el": "media",
"span": "4-10",
"rowSpan": "2-3",
"alignSelf": "end",
"slot": "gallery2",
"aspect": "3/2",
"treatment": "duotone"
},
{
"el": "text",
"span": "12-12",
"rowSpan": "3-3",
"alignSelf": "end",
"slot": "caption",
"role": "small",
"transform": "uppercase",
"rotate": -90
}
]
}
}